xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/list.c (revision 5051:cbbb7c8b40a9)
117Sdinak /*
217Sdinak  * CDDL HEADER START
317Sdinak  *
417Sdinak  * The contents of this file are subject to the terms of the
53089Swyllys  * Common Development and Distribution License (the "License").
63089Swyllys  * You may not use this file except in compliance with the License.
717Sdinak  *
817Sdinak  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
917Sdinak  * or http://www.opensolaris.org/os/licensing.
1017Sdinak  * See the License for the specific language governing permissions
1117Sdinak  * and limitations under the License.
1217Sdinak  *
1317Sdinak  * When distributing Covered Code, include this CDDL HEADER in each
1417Sdinak  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1517Sdinak  * If applicable, add the following below this CDDL HEADER, with the
1617Sdinak  * fields enclosed by brackets "[]" replaced with your own identifying
1717Sdinak  * information: Portions Copyright [yyyy] [name of copyright owner]
1817Sdinak  *
1917Sdinak  * CDDL HEADER END
2017Sdinak  */
2117Sdinak /*
223408Swyllys  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
2317Sdinak  * Use is subject to license terms.
2417Sdinak  */
2517Sdinak 
2617Sdinak #pragma ident	"%Z%%M%	%I%	%E% SMI"
2717Sdinak 
2817Sdinak /*
2917Sdinak  * This file implements the token object list operation for this tool.
3017Sdinak  * It loads the PKCS#11 modules, finds the object to list, lists it,
3117Sdinak  * and cleans up.  User must be logged into the token to list private
3217Sdinak  * objects.
3317Sdinak  */
3417Sdinak 
3517Sdinak #include <stdio.h>
3617Sdinak #include <errno.h>
3717Sdinak #include <string.h>
3817Sdinak #include <cryptoutil.h>
3917Sdinak #include <security/cryptoki.h>
4017Sdinak #include "common.h"
413089Swyllys 
423089Swyllys #include <kmfapi.h>
4317Sdinak 
443089Swyllys static void
453089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
4617Sdinak {
473089Swyllys 	int i;
483089Swyllys 	char *subject, *issuer, *serial, *id, *altname;
49*5051Swyllys 	char *start, *end, *keyusage, *extkeyusage;
5017Sdinak 
513089Swyllys 	for (i = 0; i < num_certs; i++) {
523089Swyllys 		subject = NULL;
533089Swyllys 		issuer = NULL;
543089Swyllys 		serial = NULL;
553089Swyllys 		id = NULL;
563089Swyllys 		altname = NULL;
57*5051Swyllys 		start = end = NULL;
58*5051Swyllys 		keyusage = extkeyusage = NULL;
5917Sdinak 
603089Swyllys 		(void) fprintf(stdout,
61*5051Swyllys 		    gettext("%d. (X.509 certificate)\n"), i + 1);
623089Swyllys 		if (certs[i].kmf_private.label != NULL)
633089Swyllys 			(void) fprintf(stdout, gettext("\t%s: %s\n"),
64*5051Swyllys 			    (certs[i].kmf_private.keystore_type ==
65*5051Swyllys 			    KMF_KEYSTORE_OPENSSL ?  "Filename" : "Label"),
66*5051Swyllys 			    certs[i].kmf_private.label);
67*5051Swyllys 		if (kmf_get_cert_id_str(&certs[i].certificate,
68*5051Swyllys 		    &id) == KMF_OK)
693089Swyllys 			(void) fprintf(stdout, gettext("\tID: %s\n"), id);
70*5051Swyllys 		if (kmf_get_cert_subject_str(kmfhandle,
71*5051Swyllys 		    &certs[i].certificate, &subject) == KMF_OK)
723089Swyllys 			(void) fprintf(stdout, gettext("\tSubject: %s\n"),
73*5051Swyllys 			    subject);
74*5051Swyllys 		if (kmf_get_cert_issuer_str(kmfhandle,
75*5051Swyllys 		    &certs[i].certificate, &issuer) == KMF_OK)
763089Swyllys 			(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
77*5051Swyllys 			    issuer);
78*5051Swyllys 		if (kmf_get_cert_start_date_str(kmfhandle,
79*5051Swyllys 		    &certs[i].certificate, &start) == KMF_OK)
80*5051Swyllys 			(void) fprintf(stdout, gettext("\tNot Before: %s\n"),
81*5051Swyllys 			    start);
82*5051Swyllys 		if (kmf_get_cert_end_date_str(kmfhandle,
83*5051Swyllys 		    &certs[i].certificate, &end) == KMF_OK)
84*5051Swyllys 			(void) fprintf(stdout, gettext("\tNot After: %s\n"),
85*5051Swyllys 			    end);
86*5051Swyllys 		if (kmf_get_cert_serial_str(kmfhandle,
87*5051Swyllys 		    &certs[i].certificate, &serial) == KMF_OK)
883089Swyllys 			(void) fprintf(stdout, gettext("\tSerial: %s\n"),
89*5051Swyllys 			    serial);
90*5051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
91*5051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
92*5051Swyllys 		    &altname) == KMF_OK)  {
93*5051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
94*5051Swyllys 			    altname);
95*5051Swyllys 		}
96*5051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
97*5051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_KEY_USAGE,
98*5051Swyllys 		    &keyusage) == KMF_OK)  {
993089Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
100*5051Swyllys 			    keyusage);
101*5051Swyllys 		}
102*5051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
103*5051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE,
104*5051Swyllys 		    &extkeyusage) == KMF_OK)  {
105*5051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
106*5051Swyllys 			    extkeyusage);
1073089Swyllys 		}
108*5051Swyllys 		kmf_free_str(subject);
109*5051Swyllys 		kmf_free_str(issuer);
110*5051Swyllys 		kmf_free_str(serial);
111*5051Swyllys 		kmf_free_str(id);
112*5051Swyllys 		kmf_free_str(altname);
113*5051Swyllys 		kmf_free_str(keyusage);
114*5051Swyllys 		kmf_free_str(extkeyusage);
115*5051Swyllys 		kmf_free_str(start);
116*5051Swyllys 		kmf_free_str(end);
1173089Swyllys 		(void) fprintf(stdout, "\n");
11817Sdinak 	}
11917Sdinak }
12017Sdinak 
1213089Swyllys static char *
1223089Swyllys describeKey(KMF_KEY_HANDLE *key)
12317Sdinak {
1243089Swyllys 	if (key->keyclass == KMF_ASYM_PUB) {
1253089Swyllys 		if (key->keyalg == KMF_RSA)
1263089Swyllys 			return (gettext("RSA public key"));
1273089Swyllys 		if (key->keyalg == KMF_DSA)
1283089Swyllys 			return (gettext("DSA public key"));
12917Sdinak 	}
1303089Swyllys 	if (key->keyclass == KMF_ASYM_PRI) {
1313089Swyllys 		if (key->keyalg == KMF_RSA)
1323089Swyllys 			return ("RSA private key");
1333089Swyllys 		if (key->keyalg == KMF_DSA)
1343089Swyllys 			return ("DSA private key");
13517Sdinak 	}
1363089Swyllys 	if (key->keyclass == KMF_SYMMETRIC) {
1373089Swyllys 		switch (key->keyalg) {
1383089Swyllys 			case KMF_AES:
1393089Swyllys 				return (gettext("AES"));
1403089Swyllys 				break;
1413089Swyllys 			case KMF_RC4:
1423089Swyllys 				return (gettext("ARCFOUR"));
1433089Swyllys 				break;
1443089Swyllys 			case KMF_DES:
1453089Swyllys 				return (gettext("DES"));
1463089Swyllys 				break;
1473089Swyllys 			case KMF_DES3:
1483089Swyllys 				return (gettext("Triple-DES"));
1493089Swyllys 				break;
1503089Swyllys 			default:
1513089Swyllys 				return (gettext("symmetric"));
1523089Swyllys 				break;
15317Sdinak 		}
15417Sdinak 	}
15517Sdinak 
1563089Swyllys 	return (gettext("unrecognized key object"));
1573089Swyllys 
1583089Swyllys }
15917Sdinak 
1603089Swyllys 
1613089Swyllys static void
1623089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
1633089Swyllys {
1643089Swyllys 	int i;
1653089Swyllys 
1663089Swyllys 	for (i = 0; i < numkeys; i++) {
1674006Shylee 		(void) fprintf(stdout, gettext("Key #%d - %s:  %s"),
168*5051Swyllys 		    i+1, describeKey(&keys[i]),
169*5051Swyllys 		    keys[i].keylabel ? keys[i].keylabel :
170*5051Swyllys 		    gettext("No label"));
1713089Swyllys 
1723089Swyllys 		if (keys[i].keyclass == KMF_SYMMETRIC) {
1733089Swyllys 			KMF_RETURN rv;
1743089Swyllys 			KMF_RAW_SYM_KEY rkey;
1754006Shylee 
176*5051Swyllys 			(void) memset(&rkey, 0, sizeof (rkey));
177*5051Swyllys 			rv = kmf_get_sym_key_value(handle, &keys[i],
178*5051Swyllys 			    &rkey);
1793089Swyllys 			if (rv == KMF_OK) {
1804006Shylee 				(void) fprintf(stdout, " (%d bits)",
181*5051Swyllys 				    rkey.keydata.len * 8);
182*5051Swyllys 				kmf_free_bigint(&rkey.keydata);
183*5051Swyllys 			} else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) {
184*5051Swyllys 				if (rv == KMF_ERR_SENSITIVE_KEY) {
185*5051Swyllys 					(void) fprintf(stdout, " (sensitive)");
186*5051Swyllys 				} else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
187*5051Swyllys 					(void) fprintf(stdout,
188*5051Swyllys 					    " (non-extractable)");
189*5051Swyllys 				} else {
190*5051Swyllys 					char *err = NULL;
191*5051Swyllys 					if (kmf_get_kmf_error_str(rv, &err) ==
192*5051Swyllys 					    KMF_OK)
193*5051Swyllys 						(void) fprintf(stdout,
194*5051Swyllys 						    " (error: %s)", err);
195*5051Swyllys 					if (err != NULL)
196*5051Swyllys 						free(err);
197*5051Swyllys 				}
1983089Swyllys 			}
19917Sdinak 		}
2003089Swyllys 		(void) fprintf(stdout, "\n");
20117Sdinak 	}
2023089Swyllys }
20317Sdinak 
2043089Swyllys /*
2053089Swyllys  * Generic routine used by all "list cert" operations to find
2063089Swyllys  * all matching certificates.
2073089Swyllys  */
2083089Swyllys static KMF_RETURN
209*5051Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr)
2103089Swyllys {
2113089Swyllys 	KMF_RETURN rv = KMF_OK;
2123089Swyllys 	KMF_X509_DER_CERT *certlist = NULL;
2133089Swyllys 	uint32_t numcerts = 0;
214*5051Swyllys 	KMF_KEYSTORE_TYPE kstype;
21517Sdinak 
216*5051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
217*5051Swyllys 	    &kstype, NULL);
218*5051Swyllys 	if (rv != KMF_OK)
219*5051Swyllys 		return (rv);
220*5051Swyllys 
221*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
222*5051Swyllys 	    &numcerts, sizeof (uint32_t));
223*5051Swyllys 	numattr++;
224*5051Swyllys 
225*5051Swyllys 	rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2263089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
2273089Swyllys 		(void) printf(gettext("Found %d certificates.\n"),
228*5051Swyllys 		    numcerts);
2293089Swyllys 		certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
230*5051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2313089Swyllys 		if (certlist == NULL)
2323089Swyllys 			return (KMF_ERR_MEMORY);
2333089Swyllys 		(void) memset(certlist, 0, numcerts *
234*5051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2353089Swyllys 
236*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
237*5051Swyllys 		    KMF_X509_DER_CERT_ATTR, certlist,
238*5051Swyllys 		    sizeof (KMF_X509_DER_CERT));
239*5051Swyllys 		numattr++;
240*5051Swyllys 
241*5051Swyllys 		rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2423089Swyllys 		if (rv == KMF_OK) {
2433089Swyllys 			int i;
2443089Swyllys 			(void) pk_show_certs(kmfhandle, certlist,
245*5051Swyllys 			    numcerts);
2463089Swyllys 			for (i = 0; i < numcerts; i++)
247*5051Swyllys 				kmf_free_kmf_cert(kmfhandle, &certlist[i]);
2483089Swyllys 		}
2493089Swyllys 		free(certlist);
25017Sdinak 	}
2513089Swyllys 	if (rv == KMF_ERR_CERT_NOT_FOUND &&
252*5051Swyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
2533089Swyllys 		rv = KMF_OK;
25417Sdinak 
25517Sdinak 	return (rv);
25617Sdinak }
25717Sdinak 
2583089Swyllys static KMF_RETURN
259*5051Swyllys pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr)
26017Sdinak {
2613089Swyllys 	KMF_RETURN rv;
2623089Swyllys 	KMF_KEY_HANDLE *keys;
2633089Swyllys 	uint32_t numkeys = 0;
264*5051Swyllys 	KMF_KEYSTORE_TYPE kstype;
2653089Swyllys 
266*5051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
267*5051Swyllys 	    &kstype, NULL);
268*5051Swyllys 	if (rv != KMF_OK)
269*5051Swyllys 		return (rv);
270*5051Swyllys 
271*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
272*5051Swyllys 	    &numkeys, sizeof (uint32_t));
273*5051Swyllys 	numattr++;
274*5051Swyllys 
275*5051Swyllys 	rv = kmf_find_key(handle, numattr, attrlist);
2763089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
2773089Swyllys 		int i;
2783089Swyllys 		(void) printf(gettext("Found %d keys.\n"), numkeys);
2793089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
280*5051Swyllys 		    sizeof (KMF_KEY_HANDLE));
2813089Swyllys 		if (keys == NULL)
2823089Swyllys 			return (KMF_ERR_MEMORY);
2833089Swyllys 		(void) memset(keys, 0, numkeys *
284*5051Swyllys 		    sizeof (KMF_KEY_HANDLE));
28517Sdinak 
286*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
287*5051Swyllys 		    KMF_KEY_HANDLE_ATTR,
288*5051Swyllys 		    keys, sizeof (KMF_KEY_HANDLE));
289*5051Swyllys 		numattr++;
290*5051Swyllys 
291*5051Swyllys 		rv = kmf_find_key(handle, numattr, attrlist);
2923089Swyllys 		if (rv == KMF_OK)
2933089Swyllys 			pk_show_keys(handle, keys, numkeys);
2943089Swyllys 		for (i = 0; i < numkeys; i++)
295*5051Swyllys 			kmf_free_kmf_key(handle, &keys[i]);
2963089Swyllys 		free(keys);
2973089Swyllys 	}
2983089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND &&
299*5051Swyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
3003089Swyllys 		rv = KMF_OK;
3013089Swyllys 	return (rv);
3023089Swyllys }
30317Sdinak 
3043089Swyllys static KMF_RETURN
3053089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
3063089Swyllys 	char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject,
3073089Swyllys 	char *dir, char *filename, KMF_CREDENTIAL *tokencred,
3083089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
3093089Swyllys {
3103089Swyllys 	KMF_RETURN rv;
311*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
312*5051Swyllys 	int numattr = 0;
313*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
314*5051Swyllys 	boolean_t token_bool = B_TRUE;
315*5051Swyllys 	boolean_t private = B_FALSE;
316*5051Swyllys 	KMF_KEY_CLASS keyclass;
317*5051Swyllys 	KMF_ENCODE_FORMAT format;
3183089Swyllys 
3193089Swyllys 	/*
3203089Swyllys 	 * Symmetric keys and RSA/DSA private keys are always
3213089Swyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
3223089Swyllys 	 * make sure we search for them with it also set.
3233089Swyllys 	 */
3243089Swyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
3253089Swyllys 		oclass |= PK_PRIVATE_OBJ;
3263089Swyllys 
3273089Swyllys 	rv = select_token(kmfhandle, token,
328*5051Swyllys 	    !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
3293089Swyllys 
3303089Swyllys 	if (rv != KMF_OK) {
33117Sdinak 		return (rv);
33217Sdinak 	}
33317Sdinak 
3343089Swyllys 	if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
335*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
336*5051Swyllys 		    &kstype, sizeof (kstype));
337*5051Swyllys 		numattr++;
338*5051Swyllys 
339*5051Swyllys 		if (objlabel != NULL) {
340*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
341*5051Swyllys 			    KMF_KEYLABEL_ATTR, objlabel,
342*5051Swyllys 			    strlen(objlabel));
343*5051Swyllys 			numattr++;
344*5051Swyllys 		}
3453089Swyllys 
346*5051Swyllys 		private = ((oclass & PK_PRIVATE_OBJ) > 0);
347*5051Swyllys 
348*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
349*5051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
350*5051Swyllys 		    sizeof (private));
351*5051Swyllys 		numattr++;
352*5051Swyllys 
353*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
354*5051Swyllys 		    KMF_TOKEN_BOOL_ATTR, &token_bool,
355*5051Swyllys 		    sizeof (token_bool));
356*5051Swyllys 		numattr++;
3573089Swyllys 
3583089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
359*5051Swyllys 			int num = numattr;
360*5051Swyllys 
361*5051Swyllys 			keyclass = KMF_ASYM_PRI;
362*5051Swyllys 			kmf_set_attr_at_index(attrlist, num,
363*5051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
364*5051Swyllys 			    sizeof (keyclass));
365*5051Swyllys 			num++;
366*5051Swyllys 
367*5051Swyllys 			if (tokencred != NULL &&
368*5051Swyllys 			    tokencred->credlen > 0) {
369*5051Swyllys 				kmf_set_attr_at_index(attrlist, num,
370*5051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
371*5051Swyllys 				    sizeof (KMF_CREDENTIAL));
372*5051Swyllys 				num++;
373*5051Swyllys 			}
3743089Swyllys 
3753089Swyllys 			/* list asymmetric private keys */
376*5051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
3773089Swyllys 		}
3783089Swyllys 
3793089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
380*5051Swyllys 			int num = numattr;
381*5051Swyllys 
382*5051Swyllys 			keyclass = KMF_SYMMETRIC;
383*5051Swyllys 			kmf_set_attr_at_index(attrlist, num,
384*5051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
385*5051Swyllys 			    sizeof (keyclass));
386*5051Swyllys 			num++;
387*5051Swyllys 
388*5051Swyllys 			if (tokencred != NULL &&
389*5051Swyllys 			    tokencred->credlen > 0) {
390*5051Swyllys 				kmf_set_attr_at_index(attrlist, num,
391*5051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
392*5051Swyllys 				    sizeof (KMF_CREDENTIAL));
393*5051Swyllys 				num++;
394*5051Swyllys 			}
395*5051Swyllys 
396*5051Swyllys 			format = KMF_FORMAT_RAWKEY;
397*5051Swyllys 			kmf_set_attr_at_index(attrlist, num,
398*5051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
399*5051Swyllys 			    sizeof (format));
400*5051Swyllys 			num++;
4013089Swyllys 
4023089Swyllys 			/* list symmetric keys */
403*5051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
40417Sdinak 		}
4053089Swyllys 
4063089Swyllys 		if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
407*5051Swyllys 			int num = numattr;
408*5051Swyllys 
409*5051Swyllys 			keyclass = KMF_ASYM_PUB;
410*5051Swyllys 			kmf_set_attr_at_index(attrlist, num,
411*5051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
412*5051Swyllys 			    sizeof (keyclass));
413*5051Swyllys 			num++;
4143089Swyllys 
4153089Swyllys 			/* list asymmetric public keys (if any) */
416*5051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
4173089Swyllys 		}
4183089Swyllys 
4193089Swyllys 		if (rv != KMF_OK)
4203089Swyllys 			return (rv);
4213089Swyllys 	}
4223089Swyllys 
423*5051Swyllys 	numattr = 0;
4243089Swyllys 	if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
425*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
426*5051Swyllys 		    &kstype, sizeof (kstype));
427*5051Swyllys 		numattr++;
428*5051Swyllys 
429*5051Swyllys 		if (objlabel != NULL) {
430*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
431*5051Swyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
432*5051Swyllys 			    strlen(objlabel));
433*5051Swyllys 			numattr++;
434*5051Swyllys 		}
435*5051Swyllys 
436*5051Swyllys 		if (issuer != NULL) {
437*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
438*5051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
439*5051Swyllys 			    strlen(issuer));
440*5051Swyllys 			numattr++;
441*5051Swyllys 		}
4423089Swyllys 
443*5051Swyllys 		if (subject != NULL) {
444*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
445*5051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
446*5051Swyllys 			    strlen(subject));
447*5051Swyllys 			numattr++;
448*5051Swyllys 		}
4493089Swyllys 
450*5051Swyllys 		if (serial != NULL) {
451*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
452*5051Swyllys 			    KMF_BIGINT_ATTR, serial,
453*5051Swyllys 			    sizeof (KMF_BIGINT));
454*5051Swyllys 			numattr++;
455*5051Swyllys 		}
456*5051Swyllys 
457*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
458*5051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
459*5051Swyllys 		    sizeof (private));
460*5051Swyllys 		numattr++;
461*5051Swyllys 
462*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
463*5051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
464*5051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
465*5051Swyllys 		numattr++;
466*5051Swyllys 
467*5051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
4683089Swyllys 		if (rv != KMF_OK)
4693089Swyllys 			return (rv);
4703089Swyllys 	}
4713089Swyllys 
472*5051Swyllys 	numattr = 0;
473*5051Swyllys 	kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */
4743089Swyllys 	if (oclass & PK_CRL_OBJ) {
475*5051Swyllys 		char *crldata = NULL;
476*5051Swyllys 
477*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
478*5051Swyllys 		    &kstype, sizeof (kstype));
479*5051Swyllys 		numattr++;
4803089Swyllys 
481*5051Swyllys 		if (dir != NULL) {
482*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
483*5051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
484*5051Swyllys 			numattr++;
485*5051Swyllys 		}
486*5051Swyllys 		if (filename != NULL) {
487*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
488*5051Swyllys 			    KMF_CRL_FILENAME_ATTR,
489*5051Swyllys 			    filename, strlen(filename));
490*5051Swyllys 			numattr++;
491*5051Swyllys 		}
492*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
493*5051Swyllys 		    &crldata, sizeof (char *));
494*5051Swyllys 		numattr++;
4953089Swyllys 
496*5051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
497*5051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
4983089Swyllys 			(void) printf("%s\n", crldata);
4993089Swyllys 			free(crldata);
50017Sdinak 		}
50117Sdinak 	}
50217Sdinak 
5033089Swyllys 	return (rv);
5043089Swyllys }
5053089Swyllys 
5063089Swyllys static int
5073089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
5083089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial,
5093089Swyllys 	char *issuer, char *subject,
5103089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
5113089Swyllys {
5123089Swyllys 	int rv;
513*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
514*5051Swyllys 	int numattr = 0;
515*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
516*5051Swyllys 	KMF_KEY_CLASS keyclass;
517*5051Swyllys 	KMF_ENCODE_FORMAT format;
518*5051Swyllys 	char *defaultdir = ".";
5193089Swyllys 
5203089Swyllys 	if (oclass & PK_KEY_OBJ) {
521*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
522*5051Swyllys 		    &kstype, sizeof (kstype));
523*5051Swyllys 		numattr++;
524*5051Swyllys 
525*5051Swyllys 		if (dir == NULL && filename == NULL)
526*5051Swyllys 			dir = defaultdir;
527*5051Swyllys 
528*5051Swyllys 		if (dir != NULL) {
529*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
530*5051Swyllys 			    KMF_DIRPATH_ATTR, dir,
531*5051Swyllys 			    strlen(dir));
532*5051Swyllys 			numattr++;
533*5051Swyllys 		}
534*5051Swyllys 
535*5051Swyllys 		if (filename != NULL) {
536*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
537*5051Swyllys 			    KMF_KEY_FILENAME_ATTR, filename,
538*5051Swyllys 			    strlen(filename));
539*5051Swyllys 			numattr++;
540*5051Swyllys 		}
541*5051Swyllys 
5423089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
543*5051Swyllys 			int num = numattr;
5443089Swyllys 
545*5051Swyllys 			keyclass = KMF_ASYM_PRI;
546*5051Swyllys 			kmf_set_attr_at_index(attrlist, num,
547*5051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
548*5051Swyllys 			    sizeof (keyclass));
549*5051Swyllys 			num++;
550*5051Swyllys 
551*5051Swyllys 			/* list asymmetric private keys */
552*5051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
5533089Swyllys 		}
5543089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
5553089Swyllys 			rv = KMF_OK;
5563089Swyllys 
5573089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
558*5051Swyllys 			int num = numattr;
559*5051Swyllys 
560*5051Swyllys 			keyclass = KMF_SYMMETRIC;
561*5051Swyllys 			kmf_set_attr_at_index(attrlist, num,
562*5051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
563*5051Swyllys 			    sizeof (keyclass));
564*5051Swyllys 			num++;
5653089Swyllys 
566*5051Swyllys 			format = KMF_FORMAT_RAWKEY;
567*5051Swyllys 			kmf_set_attr_at_index(attrlist, num,
568*5051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
569*5051Swyllys 			    sizeof (format));
570*5051Swyllys 			num++;
571*5051Swyllys 
572*5051Swyllys 			/* list symmetric keys */
573*5051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
5743089Swyllys 		}
5753089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
5763089Swyllys 			rv = KMF_OK;
5773089Swyllys 		if (rv != KMF_OK)
5783089Swyllys 			return (rv);
57917Sdinak 	}
58017Sdinak 
581*5051Swyllys 	numattr = 0;
5823089Swyllys 	if (oclass & PK_CERT_OBJ) {
583*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
584*5051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
585*5051Swyllys 		    sizeof (kstype));
586*5051Swyllys 		numattr++;
587*5051Swyllys 
588*5051Swyllys 		if (issuer != NULL) {
589*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
590*5051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
591*5051Swyllys 			    strlen(issuer));
592*5051Swyllys 			numattr++;
593*5051Swyllys 		}
594*5051Swyllys 
595*5051Swyllys 		if (subject != NULL) {
596*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
597*5051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
598*5051Swyllys 			    strlen(subject));
599*5051Swyllys 			numattr++;
600*5051Swyllys 		}
60117Sdinak 
602*5051Swyllys 		if (serial != NULL) {
603*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
604*5051Swyllys 			    KMF_BIGINT_ATTR, serial,
605*5051Swyllys 			    sizeof (KMF_BIGINT));
606*5051Swyllys 			numattr++;
607*5051Swyllys 		}
608*5051Swyllys 
609*5051Swyllys 		if (filename != NULL) {
610*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
611*5051Swyllys 			    KMF_CERT_FILENAME_ATTR, filename,
612*5051Swyllys 			    strlen(filename));
613*5051Swyllys 			numattr++;
614*5051Swyllys 		}
615*5051Swyllys 
616*5051Swyllys 		if (dir != NULL) {
617*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
618*5051Swyllys 			    KMF_DIRPATH_ATTR, dir,
619*5051Swyllys 			    strlen(dir));
620*5051Swyllys 			numattr++;
621*5051Swyllys 		}
622*5051Swyllys 
623*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
624*5051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
625*5051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
626*5051Swyllys 		numattr++;
627*5051Swyllys 
628*5051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
6293089Swyllys 		if (rv != KMF_OK)
6303089Swyllys 			return (rv);
63117Sdinak 	}
63217Sdinak 
633*5051Swyllys 	numattr = 0;
6343089Swyllys 	if (oclass & PK_CRL_OBJ) {
635*5051Swyllys 		char *crldata = NULL;
636*5051Swyllys 
637*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
638*5051Swyllys 		    &kstype, sizeof (kstype));
639*5051Swyllys 		numattr++;
64017Sdinak 
641*5051Swyllys 		if (dir != NULL) {
642*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
643*5051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
644*5051Swyllys 			numattr++;
645*5051Swyllys 		}
646*5051Swyllys 		if (filename != NULL) {
647*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
648*5051Swyllys 			    KMF_CRL_FILENAME_ATTR,
649*5051Swyllys 			    filename, strlen(filename));
650*5051Swyllys 			numattr++;
651*5051Swyllys 		}
652*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
653*5051Swyllys 		    &crldata, sizeof (char *));
654*5051Swyllys 		numattr++;
65517Sdinak 
656*5051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
657*5051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
6583089Swyllys 			(void) printf("%s\n", crldata);
6593089Swyllys 			free(crldata);
6603089Swyllys 		}
66117Sdinak 	}
66217Sdinak 
66317Sdinak 	return (rv);
66417Sdinak }
66517Sdinak 
6663089Swyllys static int
6673089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
6683089Swyllys 	int oclass, char *token_spec, char *dir, char *prefix,
6693089Swyllys 	char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
6703089Swyllys 	KMF_CREDENTIAL *tokencred,
6713089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
67217Sdinak {
6733089Swyllys 	KMF_RETURN rv = KMF_OK;
674*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
675*5051Swyllys 	int numattr = 0;
676*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
677*5051Swyllys 	KMF_KEY_CLASS keyclass;
678*5051Swyllys 	KMF_ENCODE_FORMAT format;
6793089Swyllys 
6803089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
6813089Swyllys 	if (rv != KMF_OK)
6823089Swyllys 		return (rv);
68317Sdinak 
684*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
685*5051Swyllys 	    &kstype, sizeof (kstype));
686*5051Swyllys 	numattr++;
687*5051Swyllys 
6883089Swyllys 	if (oclass & PK_KEY_OBJ) {
689*5051Swyllys 		if (tokencred != NULL && tokencred->credlen > 0) {
690*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
691*5051Swyllys 			    KMF_CREDENTIAL_ATTR, tokencred,
692*5051Swyllys 			    sizeof (KMF_CREDENTIAL));
693*5051Swyllys 			numattr++;
694*5051Swyllys 		}
695*5051Swyllys 
696*5051Swyllys 		if (token_spec && strlen(token_spec)) {
697*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
698*5051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
699*5051Swyllys 			    strlen(token_spec));
700*5051Swyllys 			numattr++;
701*5051Swyllys 		}
702*5051Swyllys 
703*5051Swyllys 		if (nickname != NULL) {
704*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
705*5051Swyllys 			    KMF_KEYLABEL_ATTR, nickname,
706*5051Swyllys 			    strlen(nickname));
707*5051Swyllys 			numattr++;
708*5051Swyllys 		}
70917Sdinak 	}
71017Sdinak 
7113089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
712*5051Swyllys 		int num = numattr;
713*5051Swyllys 
714*5051Swyllys 		keyclass = KMF_ASYM_PRI;
715*5051Swyllys 		kmf_set_attr_at_index(attrlist, num,
716*5051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
717*5051Swyllys 		    sizeof (keyclass));
718*5051Swyllys 		num++;
719*5051Swyllys 
720*5051Swyllys 		/* list asymmetric private keys */
721*5051Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num);
72217Sdinak 	}
723*5051Swyllys 
7243089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
725*5051Swyllys 		int num = numattr;
726*5051Swyllys 
727*5051Swyllys 		keyclass = KMF_SYMMETRIC;
728*5051Swyllys 		kmf_set_attr_at_index(attrlist, num,
729*5051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
730*5051Swyllys 		    sizeof (keyclass));
731*5051Swyllys 		num++;
732*5051Swyllys 
733*5051Swyllys 		format = KMF_FORMAT_RAWKEY;
734*5051Swyllys 		kmf_set_attr_at_index(attrlist, num,
735*5051Swyllys 		    KMF_ENCODE_FORMAT_ATTR, &format,
736*5051Swyllys 		    sizeof (format));
737*5051Swyllys 		num++;
738*5051Swyllys 
739*5051Swyllys 		/* list symmetric keys */
740*5051Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num);
7413089Swyllys 	}
742*5051Swyllys 
7433089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
744*5051Swyllys 		int num = numattr;
745*5051Swyllys 
746*5051Swyllys 		keyclass = KMF_ASYM_PUB;
747*5051Swyllys 		kmf_set_attr_at_index(attrlist, num,
748*5051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
749*5051Swyllys 		    sizeof (keyclass));
750*5051Swyllys 		num++;
751*5051Swyllys 
752*5051Swyllys 		/* list asymmetric public keys */
753*5051Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num);
75417Sdinak 	}
75517Sdinak 
7563089Swyllys 	/* If searching for public objects or certificates, find certs now */
757*5051Swyllys 	numattr = 0;
7583089Swyllys 	if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
759*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
760*5051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
761*5051Swyllys 		    sizeof (kstype));
762*5051Swyllys 		numattr++;
763*5051Swyllys 
764*5051Swyllys 		if (nickname != NULL) {
765*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
766*5051Swyllys 			    KMF_CERT_LABEL_ATTR, nickname,
767*5051Swyllys 			    strlen(nickname));
768*5051Swyllys 			numattr++;
769*5051Swyllys 		}
770*5051Swyllys 
771*5051Swyllys 		if (issuer != NULL) {
772*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
773*5051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
774*5051Swyllys 			    strlen(issuer));
775*5051Swyllys 			numattr++;
776*5051Swyllys 		}
77717Sdinak 
778*5051Swyllys 		if (subject != NULL) {
779*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
780*5051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
781*5051Swyllys 			    strlen(subject));
782*5051Swyllys 			numattr++;
783*5051Swyllys 		}
784*5051Swyllys 
785*5051Swyllys 		if (serial != NULL) {
786*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
787*5051Swyllys 			    KMF_BIGINT_ATTR, serial,
788*5051Swyllys 			    sizeof (KMF_BIGINT));
789*5051Swyllys 			numattr++;
790*5051Swyllys 		}
79117Sdinak 
792*5051Swyllys 		if (token_spec != NULL) {
793*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
794*5051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
795*5051Swyllys 			    strlen(token_spec));
796*5051Swyllys 			numattr++;
797*5051Swyllys 		}
798*5051Swyllys 
799*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
800*5051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
801*5051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
802*5051Swyllys 		numattr++;
803*5051Swyllys 
804*5051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
80517Sdinak 	}
80617Sdinak 
807*5051Swyllys 	numattr = 0;
8083089Swyllys 	if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
8093089Swyllys 		int numcrls;
810*5051Swyllys 
811*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
812*5051Swyllys 		    &kstype, sizeof (kstype));
813*5051Swyllys 		numattr++;
8143089Swyllys 
815*5051Swyllys 		if (token_spec != NULL) {
816*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
817*5051Swyllys 			    KMF_TOKEN_LABEL_ATTR,
818*5051Swyllys 			    token_spec, strlen(token_spec));
819*5051Swyllys 			numattr++;
820*5051Swyllys 		}
821*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR,
822*5051Swyllys 		    &numcrls, sizeof (int));
823*5051Swyllys 		numattr++;
8243089Swyllys 
825*5051Swyllys 		rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8263089Swyllys 		if (rv == KMF_OK) {
8273089Swyllys 			char **p;
8283089Swyllys 			if (numcrls == 0) {
8293089Swyllys 				(void) printf(gettext("No CRLs found in "
830*5051Swyllys 				    "NSS keystore.\n"));
83117Sdinak 
8323089Swyllys 				return (KMF_OK);
8333089Swyllys 			}
8343089Swyllys 			p = malloc(numcrls * sizeof (char *));
8353089Swyllys 			if (p == NULL) {
8363089Swyllys 				return (KMF_ERR_MEMORY);
8373089Swyllys 			}
8383089Swyllys 			(void) memset(p, 0, numcrls * sizeof (char *));
839*5051Swyllys 
840*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
841*5051Swyllys 			    KMF_CRL_NAMELIST_ATTR, p, sizeof (char *));
842*5051Swyllys 			numattr++;
843*5051Swyllys 			rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8443089Swyllys 			if (rv == KMF_OK) {
8453089Swyllys 				int i;
8463089Swyllys 				for (i = 0; i < numcrls; i++) {
8473089Swyllys 					(void) printf("%d. Name = %s\n",
848*5051Swyllys 					    i + 1, p[i]);
8493089Swyllys 					free(p[i]);
8503089Swyllys 				}
8513089Swyllys 			}
8523089Swyllys 			free(p);
85317Sdinak 		}
85417Sdinak 	}
85517Sdinak 	return (rv);
85617Sdinak }
85717Sdinak 
85817Sdinak /*
85917Sdinak  * List token object.
86017Sdinak  */
86117Sdinak int
86217Sdinak pk_list(int argc, char *argv[])
86317Sdinak {
86417Sdinak 	int			opt;
865864Sdinak 	extern int		optind_av;
866864Sdinak 	extern char		*optarg_av;
867864Sdinak 	char			*token_spec = NULL;
8683089Swyllys 	char			*subject = NULL;
8693089Swyllys 	char			*issuer = NULL;
8703089Swyllys 	char			*dir = NULL;
8713089Swyllys 	char			*prefix = NULL;
8723089Swyllys 	char			*filename = NULL;
8733089Swyllys 	char			*serstr = NULL;
8743089Swyllys 	KMF_BIGINT		serial = { NULL, 0 };
87517Sdinak 
8763089Swyllys 	char			*list_label = NULL;
8773089Swyllys 	int			oclass = 0;
8783089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
8793089Swyllys 	KMF_RETURN		rv = KMF_OK;
8803089Swyllys 	KMF_HANDLE_T		kmfhandle = NULL;
8813089Swyllys 	char			*find_criteria = NULL;
8823089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
8833089Swyllys 	KMF_CREDENTIAL		tokencred = {NULL, 0};
88417Sdinak 
88517Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
886864Sdinak 	while ((opt = getopt_av(argc, argv,
887*5051Swyllys 	    "k:(keystore)t:(objtype)T:(token)d:(dir)"
888*5051Swyllys 	    "p:(prefix)n:(nickname)S:(serial)s:(subject)"
889*5051Swyllys 	    "c:(criteria)"
890*5051Swyllys 	    "i:(issuer)l:(label)f:(infile)")) != EOF) {
8913089Swyllys 		if (EMPTYSTRING(optarg_av))
8923089Swyllys 			return (PK_ERR_USAGE);
89317Sdinak 		switch (opt) {
8943089Swyllys 			case 'k':
8953089Swyllys 				if (kstype != 0)
8963089Swyllys 					return (PK_ERR_USAGE);
8973089Swyllys 				kstype = KS2Int(optarg_av);
8983089Swyllys 				if (kstype == 0)
8993089Swyllys 					return (PK_ERR_USAGE);
9003089Swyllys 				break;
9013089Swyllys 			case 't':
9023089Swyllys 				if (oclass != 0)
9033089Swyllys 					return (PK_ERR_USAGE);
9043089Swyllys 				oclass = OT2Int(optarg_av);
9053089Swyllys 				if (oclass == -1)
9063089Swyllys 					return (PK_ERR_USAGE);
9073089Swyllys 				break;
9083089Swyllys 			case 's':
9093089Swyllys 				if (subject)
9103089Swyllys 					return (PK_ERR_USAGE);
9113089Swyllys 				subject = optarg_av;
9123089Swyllys 				break;
9133089Swyllys 			case 'i':
9143089Swyllys 				if (issuer)
9153089Swyllys 					return (PK_ERR_USAGE);
9163089Swyllys 				issuer = optarg_av;
9173089Swyllys 				break;
9183089Swyllys 			case 'd':
9193089Swyllys 				if (dir)
9203089Swyllys 					return (PK_ERR_USAGE);
9213089Swyllys 				dir = optarg_av;
9223089Swyllys 				break;
9233089Swyllys 			case 'p':
9243089Swyllys 				if (prefix)
9253089Swyllys 					return (PK_ERR_USAGE);
9263089Swyllys 				prefix = optarg_av;
9273089Swyllys 				break;
9283089Swyllys 			case 'S':
9293089Swyllys 				serstr = optarg_av;
9303089Swyllys 				break;
9313089Swyllys 			case 'f':
9323089Swyllys 				if (filename)
9333089Swyllys 					return (PK_ERR_USAGE);
9343089Swyllys 				filename = optarg_av;
9353089Swyllys 				break;
9363089Swyllys 			case 'T':	/* token specifier */
9373089Swyllys 				if (token_spec)
9383089Swyllys 					return (PK_ERR_USAGE);
9393089Swyllys 				token_spec = optarg_av;
9403089Swyllys 				break;
9413089Swyllys 			case 'n':
9423089Swyllys 			case 'l':	/* object with specific label */
9433089Swyllys 				if (list_label)
9443089Swyllys 					return (PK_ERR_USAGE);
9453089Swyllys 				list_label = optarg_av;
9463089Swyllys 				break;
9473089Swyllys 			case 'c':
9483089Swyllys 				find_criteria = optarg_av;
9493089Swyllys 				if (!strcasecmp(find_criteria, "valid"))
9503089Swyllys 					find_criteria_flag =
9513089Swyllys 					    KMF_NONEXPIRED_CERTS;
9523089Swyllys 				else if (!strcasecmp(find_criteria, "expired"))
9533089Swyllys 					find_criteria_flag = KMF_EXPIRED_CERTS;
9543089Swyllys 				else if (!strcasecmp(find_criteria, "both"))
9553089Swyllys 					find_criteria_flag = KMF_ALL_CERTS;
9563089Swyllys 				else
9573089Swyllys 					return (PK_ERR_USAGE);
9583089Swyllys 				break;
9593089Swyllys 			default:
960864Sdinak 				return (PK_ERR_USAGE);
96117Sdinak 		}
96217Sdinak 	}
96317Sdinak 	/* No additional args allowed. */
964864Sdinak 	argc -= optind_av;
965864Sdinak 	argv += optind_av;
96617Sdinak 	if (argc)
96717Sdinak 		return (PK_ERR_USAGE);
96817Sdinak 
969*5051Swyllys 	if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
9703089Swyllys 		/* Error message ? */
9713089Swyllys 		return (rv);
97217Sdinak 	}
97317Sdinak 
9743089Swyllys 	/* Assume keystore = PKCS#11 if not specified. */
9753089Swyllys 	if (kstype == 0)
9763089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
97717Sdinak 
9783089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
9793089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
980*5051Swyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
9813089Swyllys 
9823089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
983*5051Swyllys 		    "is only relevant if keystore=pkcs11\n"));
9843089Swyllys 		return (PK_ERR_USAGE);
98517Sdinak 	}
98617Sdinak 
9873089Swyllys 	/* If no object class specified, list certificate objects. */
9883089Swyllys 	if (oclass == 0)
9893089Swyllys 		oclass = PK_CERT_OBJ;
9903089Swyllys 
9913089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
9923089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
9933089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
9943089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
99517Sdinak 	}
99617Sdinak 
9973089Swyllys 	if (serstr != NULL) {
9983089Swyllys 		uchar_t *bytes = NULL;
9993089Swyllys 		size_t bytelen;
10003089Swyllys 
1001*5051Swyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
10023089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
10033089Swyllys 			(void) fprintf(stderr, gettext("serial number "
1004*5051Swyllys 			    "must be specified as a hex number "
1005*5051Swyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
10063089Swyllys 			return (PK_ERR_USAGE);
10073089Swyllys 		}
10083089Swyllys 		serial.val = bytes;
10093089Swyllys 		serial.len = bytelen;
101017Sdinak 	}
101117Sdinak 
10123089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
1013*5051Swyllys 	    kstype == KMF_KEYSTORE_NSS) &&
1014*5051Swyllys 	    (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
10153089Swyllys 
10163089Swyllys 		(void) get_token_password(kstype, token_spec,
1017*5051Swyllys 		    &tokencred);
10183089Swyllys 	}
10193089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN) {
10203089Swyllys 		rv = list_pk11_objects(kmfhandle, token_spec,
1021*5051Swyllys 		    oclass, list_label, &serial,
1022*5051Swyllys 		    issuer, subject, dir, filename,
1023*5051Swyllys 		    &tokencred, find_criteria_flag);
102417Sdinak 
10253089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS) {
10263089Swyllys 		if (dir == NULL)
10273089Swyllys 			dir = PK_DEFAULT_DIRECTORY;
10283089Swyllys 		rv = list_nss_objects(kmfhandle,
1029*5051Swyllys 		    oclass, token_spec, dir, prefix,
1030*5051Swyllys 		    list_label, &serial, issuer, subject,
1031*5051Swyllys 		    &tokencred, find_criteria_flag);
10323089Swyllys 
10333089Swyllys 	} else if (kstype == KMF_KEYSTORE_OPENSSL) {
10343089Swyllys 
10353089Swyllys 		rv = list_file_objects(kmfhandle,
1036*5051Swyllys 		    oclass, dir, filename,
1037*5051Swyllys 		    &serial, issuer, subject, find_criteria_flag);
103817Sdinak 	}
103917Sdinak 
10403089Swyllys 	if (rv != KMF_OK) {
10413089Swyllys 		display_error(kmfhandle, rv,
1042*5051Swyllys 		    gettext("Error listing objects"));
10433089Swyllys 	}
10443089Swyllys 
10453089Swyllys 	if (serial.val != NULL)
10463089Swyllys 		free(serial.val);
10473089Swyllys 
10483089Swyllys 	if (tokencred.cred != NULL)
10493089Swyllys 		free(tokencred.cred);
10503089Swyllys 
1051*5051Swyllys 	(void) kmf_finalize(kmfhandle);
10523089Swyllys 	return (rv);
105317Sdinak }
1054