xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/list.c (revision 5128:b0f2e9abb0f4)
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;
495051Swyllys 	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;
575051Swyllys 		start = end = NULL;
585051Swyllys 		keyusage = extkeyusage = NULL;
5917Sdinak 
603089Swyllys 		(void) fprintf(stdout,
615051Swyllys 		    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"),
645051Swyllys 			    (certs[i].kmf_private.keystore_type ==
655051Swyllys 			    KMF_KEYSTORE_OPENSSL ?  "Filename" : "Label"),
665051Swyllys 			    certs[i].kmf_private.label);
675051Swyllys 		if (kmf_get_cert_id_str(&certs[i].certificate,
685051Swyllys 		    &id) == KMF_OK)
693089Swyllys 			(void) fprintf(stdout, gettext("\tID: %s\n"), id);
705051Swyllys 		if (kmf_get_cert_subject_str(kmfhandle,
715051Swyllys 		    &certs[i].certificate, &subject) == KMF_OK)
723089Swyllys 			(void) fprintf(stdout, gettext("\tSubject: %s\n"),
735051Swyllys 			    subject);
745051Swyllys 		if (kmf_get_cert_issuer_str(kmfhandle,
755051Swyllys 		    &certs[i].certificate, &issuer) == KMF_OK)
763089Swyllys 			(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
775051Swyllys 			    issuer);
785051Swyllys 		if (kmf_get_cert_start_date_str(kmfhandle,
795051Swyllys 		    &certs[i].certificate, &start) == KMF_OK)
805051Swyllys 			(void) fprintf(stdout, gettext("\tNot Before: %s\n"),
815051Swyllys 			    start);
825051Swyllys 		if (kmf_get_cert_end_date_str(kmfhandle,
835051Swyllys 		    &certs[i].certificate, &end) == KMF_OK)
845051Swyllys 			(void) fprintf(stdout, gettext("\tNot After: %s\n"),
855051Swyllys 			    end);
865051Swyllys 		if (kmf_get_cert_serial_str(kmfhandle,
875051Swyllys 		    &certs[i].certificate, &serial) == KMF_OK)
883089Swyllys 			(void) fprintf(stdout, gettext("\tSerial: %s\n"),
895051Swyllys 			    serial);
905051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
915051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
925051Swyllys 		    &altname) == KMF_OK)  {
935051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
945051Swyllys 			    altname);
955051Swyllys 		}
965051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
975051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_KEY_USAGE,
985051Swyllys 		    &keyusage) == KMF_OK)  {
993089Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
1005051Swyllys 			    keyusage);
1015051Swyllys 		}
1025051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
1035051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE,
1045051Swyllys 		    &extkeyusage) == KMF_OK)  {
1055051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
1065051Swyllys 			    extkeyusage);
1073089Swyllys 		}
1085051Swyllys 		kmf_free_str(subject);
1095051Swyllys 		kmf_free_str(issuer);
1105051Swyllys 		kmf_free_str(serial);
1115051Swyllys 		kmf_free_str(id);
1125051Swyllys 		kmf_free_str(altname);
1135051Swyllys 		kmf_free_str(keyusage);
1145051Swyllys 		kmf_free_str(extkeyusage);
1155051Swyllys 		kmf_free_str(start);
1165051Swyllys 		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"),
1685051Swyllys 		    i+1, describeKey(&keys[i]),
1695051Swyllys 		    keys[i].keylabel ? keys[i].keylabel :
1705051Swyllys 		    gettext("No label"));
1713089Swyllys 
1723089Swyllys 		if (keys[i].keyclass == KMF_SYMMETRIC) {
1733089Swyllys 			KMF_RETURN rv;
1743089Swyllys 			KMF_RAW_SYM_KEY rkey;
1754006Shylee 
1765051Swyllys 			(void) memset(&rkey, 0, sizeof (rkey));
1775051Swyllys 			rv = kmf_get_sym_key_value(handle, &keys[i],
1785051Swyllys 			    &rkey);
1793089Swyllys 			if (rv == KMF_OK) {
1804006Shylee 				(void) fprintf(stdout, " (%d bits)",
1815051Swyllys 				    rkey.keydata.len * 8);
1825051Swyllys 				kmf_free_bigint(&rkey.keydata);
1835051Swyllys 			} else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) {
1845051Swyllys 				if (rv == KMF_ERR_SENSITIVE_KEY) {
1855051Swyllys 					(void) fprintf(stdout, " (sensitive)");
1865051Swyllys 				} else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
1875051Swyllys 					(void) fprintf(stdout,
1885051Swyllys 					    " (non-extractable)");
1895051Swyllys 				} else {
1905051Swyllys 					char *err = NULL;
1915051Swyllys 					if (kmf_get_kmf_error_str(rv, &err) ==
1925051Swyllys 					    KMF_OK)
1935051Swyllys 						(void) fprintf(stdout,
1945051Swyllys 						    " (error: %s)", err);
1955051Swyllys 					if (err != NULL)
1965051Swyllys 						free(err);
1975051Swyllys 				}
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
2095051Swyllys 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;
2145051Swyllys 	KMF_KEYSTORE_TYPE kstype;
21517Sdinak 
2165051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2175051Swyllys 	    &kstype, NULL);
2185051Swyllys 	if (rv != KMF_OK)
2195051Swyllys 		return (rv);
2205051Swyllys 
2215051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2225051Swyllys 	    &numcerts, sizeof (uint32_t));
2235051Swyllys 	numattr++;
2245051Swyllys 
2255051Swyllys 	rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2263089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
2273089Swyllys 		(void) printf(gettext("Found %d certificates.\n"),
2285051Swyllys 		    numcerts);
2293089Swyllys 		certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
2305051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2313089Swyllys 		if (certlist == NULL)
2323089Swyllys 			return (KMF_ERR_MEMORY);
2333089Swyllys 		(void) memset(certlist, 0, numcerts *
2345051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2353089Swyllys 
2365051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
2375051Swyllys 		    KMF_X509_DER_CERT_ATTR, certlist,
2385051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2395051Swyllys 		numattr++;
2405051Swyllys 
2415051Swyllys 		rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2423089Swyllys 		if (rv == KMF_OK) {
2433089Swyllys 			int i;
2443089Swyllys 			(void) pk_show_certs(kmfhandle, certlist,
2455051Swyllys 			    numcerts);
2463089Swyllys 			for (i = 0; i < numcerts; i++)
2475051Swyllys 				kmf_free_kmf_cert(kmfhandle, &certlist[i]);
2483089Swyllys 		}
2493089Swyllys 		free(certlist);
25017Sdinak 	}
2513089Swyllys 	if (rv == KMF_ERR_CERT_NOT_FOUND &&
2525051Swyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
2533089Swyllys 		rv = KMF_OK;
25417Sdinak 
25517Sdinak 	return (rv);
25617Sdinak }
25717Sdinak 
2583089Swyllys static KMF_RETURN
2595051Swyllys 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;
2645051Swyllys 	KMF_KEYSTORE_TYPE kstype;
2653089Swyllys 
2665051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2675051Swyllys 	    &kstype, NULL);
2685051Swyllys 	if (rv != KMF_OK)
2695051Swyllys 		return (rv);
2705051Swyllys 
2715051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2725051Swyllys 	    &numkeys, sizeof (uint32_t));
2735051Swyllys 	numattr++;
2745051Swyllys 
2755051Swyllys 	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 *
2805051Swyllys 		    sizeof (KMF_KEY_HANDLE));
2813089Swyllys 		if (keys == NULL)
2823089Swyllys 			return (KMF_ERR_MEMORY);
2833089Swyllys 		(void) memset(keys, 0, numkeys *
2845051Swyllys 		    sizeof (KMF_KEY_HANDLE));
28517Sdinak 
2865051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
2875051Swyllys 		    KMF_KEY_HANDLE_ATTR,
2885051Swyllys 		    keys, sizeof (KMF_KEY_HANDLE));
2895051Swyllys 		numattr++;
2905051Swyllys 
2915051Swyllys 		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++)
2955051Swyllys 			kmf_free_kmf_key(handle, &keys[i]);
2963089Swyllys 		free(keys);
2973089Swyllys 	}
2983089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND &&
2995051Swyllys 	    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;
3115051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
3125051Swyllys 	int numattr = 0;
3135051Swyllys 	KMF_ATTRIBUTE attrlist[16];
3145051Swyllys 	boolean_t token_bool = B_TRUE;
3155051Swyllys 	boolean_t private = B_FALSE;
3165051Swyllys 	KMF_KEY_CLASS keyclass;
3175051Swyllys 	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,
3285051Swyllys 	    !(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)) {
3355051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
3365051Swyllys 		    &kstype, sizeof (kstype));
3375051Swyllys 		numattr++;
3385051Swyllys 
3395051Swyllys 		if (objlabel != NULL) {
3405051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3415051Swyllys 			    KMF_KEYLABEL_ATTR, objlabel,
3425051Swyllys 			    strlen(objlabel));
3435051Swyllys 			numattr++;
3445051Swyllys 		}
3453089Swyllys 
3465051Swyllys 		private = ((oclass & PK_PRIVATE_OBJ) > 0);
3475051Swyllys 
3485051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
3495051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
3505051Swyllys 		    sizeof (private));
3515051Swyllys 		numattr++;
3525051Swyllys 
3535051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
3545051Swyllys 		    KMF_TOKEN_BOOL_ATTR, &token_bool,
3555051Swyllys 		    sizeof (token_bool));
3565051Swyllys 		numattr++;
3573089Swyllys 
3583089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
3595051Swyllys 			int num = numattr;
3605051Swyllys 
3615051Swyllys 			keyclass = KMF_ASYM_PRI;
3625051Swyllys 			kmf_set_attr_at_index(attrlist, num,
3635051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
3645051Swyllys 			    sizeof (keyclass));
3655051Swyllys 			num++;
3665051Swyllys 
3675051Swyllys 			if (tokencred != NULL &&
3685051Swyllys 			    tokencred->credlen > 0) {
3695051Swyllys 				kmf_set_attr_at_index(attrlist, num,
3705051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
3715051Swyllys 				    sizeof (KMF_CREDENTIAL));
3725051Swyllys 				num++;
3735051Swyllys 			}
3743089Swyllys 
3753089Swyllys 			/* list asymmetric private keys */
3765051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
3773089Swyllys 		}
3783089Swyllys 
3793089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
3805051Swyllys 			int num = numattr;
3815051Swyllys 
3825051Swyllys 			keyclass = KMF_SYMMETRIC;
3835051Swyllys 			kmf_set_attr_at_index(attrlist, num,
3845051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
3855051Swyllys 			    sizeof (keyclass));
3865051Swyllys 			num++;
3875051Swyllys 
3885051Swyllys 			if (tokencred != NULL &&
3895051Swyllys 			    tokencred->credlen > 0) {
3905051Swyllys 				kmf_set_attr_at_index(attrlist, num,
3915051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
3925051Swyllys 				    sizeof (KMF_CREDENTIAL));
3935051Swyllys 				num++;
3945051Swyllys 			}
3955051Swyllys 
3965051Swyllys 			format = KMF_FORMAT_RAWKEY;
3975051Swyllys 			kmf_set_attr_at_index(attrlist, num,
3985051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
3995051Swyllys 			    sizeof (format));
4005051Swyllys 			num++;
4013089Swyllys 
4023089Swyllys 			/* list symmetric keys */
4035051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
40417Sdinak 		}
4053089Swyllys 
4063089Swyllys 		if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
4075051Swyllys 			int num = numattr;
4085051Swyllys 
409*5128Swyllys 			private = B_FALSE;
4105051Swyllys 			keyclass = KMF_ASYM_PUB;
4115051Swyllys 			kmf_set_attr_at_index(attrlist, num,
4125051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
4135051Swyllys 			    sizeof (keyclass));
4145051Swyllys 			num++;
4153089Swyllys 
4163089Swyllys 			/* list asymmetric public keys (if any) */
4175051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
4183089Swyllys 		}
4193089Swyllys 
4203089Swyllys 		if (rv != KMF_OK)
4213089Swyllys 			return (rv);
4223089Swyllys 	}
4233089Swyllys 
4245051Swyllys 	numattr = 0;
4253089Swyllys 	if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
4265051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
4275051Swyllys 		    &kstype, sizeof (kstype));
4285051Swyllys 		numattr++;
4295051Swyllys 
4305051Swyllys 		if (objlabel != NULL) {
4315051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4325051Swyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
4335051Swyllys 			    strlen(objlabel));
4345051Swyllys 			numattr++;
4355051Swyllys 		}
4365051Swyllys 
4375051Swyllys 		if (issuer != NULL) {
4385051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4395051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
4405051Swyllys 			    strlen(issuer));
4415051Swyllys 			numattr++;
4425051Swyllys 		}
4433089Swyllys 
4445051Swyllys 		if (subject != NULL) {
4455051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4465051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
4475051Swyllys 			    strlen(subject));
4485051Swyllys 			numattr++;
4495051Swyllys 		}
4503089Swyllys 
4515051Swyllys 		if (serial != NULL) {
4525051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4535051Swyllys 			    KMF_BIGINT_ATTR, serial,
4545051Swyllys 			    sizeof (KMF_BIGINT));
4555051Swyllys 			numattr++;
4565051Swyllys 		}
4575051Swyllys 
4585051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
4595051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
4605051Swyllys 		    sizeof (private));
4615051Swyllys 		numattr++;
4625051Swyllys 
4635051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
4645051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
4655051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
4665051Swyllys 		numattr++;
4675051Swyllys 
4685051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
4693089Swyllys 		if (rv != KMF_OK)
4703089Swyllys 			return (rv);
4713089Swyllys 	}
4723089Swyllys 
4735051Swyllys 	numattr = 0;
4745051Swyllys 	kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */
4753089Swyllys 	if (oclass & PK_CRL_OBJ) {
4765051Swyllys 		char *crldata = NULL;
4775051Swyllys 
4785051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
4795051Swyllys 		    &kstype, sizeof (kstype));
4805051Swyllys 		numattr++;
4813089Swyllys 
4825051Swyllys 		if (dir != NULL) {
4835051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4845051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
4855051Swyllys 			numattr++;
4865051Swyllys 		}
4875051Swyllys 		if (filename != NULL) {
4885051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4895051Swyllys 			    KMF_CRL_FILENAME_ATTR,
4905051Swyllys 			    filename, strlen(filename));
4915051Swyllys 			numattr++;
4925051Swyllys 		}
4935051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
4945051Swyllys 		    &crldata, sizeof (char *));
4955051Swyllys 		numattr++;
4963089Swyllys 
4975051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
4985051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
4993089Swyllys 			(void) printf("%s\n", crldata);
5003089Swyllys 			free(crldata);
50117Sdinak 		}
50217Sdinak 	}
50317Sdinak 
5043089Swyllys 	return (rv);
5053089Swyllys }
5063089Swyllys 
5073089Swyllys static int
5083089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
5093089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial,
5103089Swyllys 	char *issuer, char *subject,
5113089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
5123089Swyllys {
5133089Swyllys 	int rv;
5145051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
5155051Swyllys 	int numattr = 0;
5165051Swyllys 	KMF_ATTRIBUTE attrlist[16];
5175051Swyllys 	KMF_KEY_CLASS keyclass;
5185051Swyllys 	KMF_ENCODE_FORMAT format;
5195051Swyllys 	char *defaultdir = ".";
5203089Swyllys 
5213089Swyllys 	if (oclass & PK_KEY_OBJ) {
5225051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5235051Swyllys 		    &kstype, sizeof (kstype));
5245051Swyllys 		numattr++;
5255051Swyllys 
5265051Swyllys 		if (dir == NULL && filename == NULL)
5275051Swyllys 			dir = defaultdir;
5285051Swyllys 
5295051Swyllys 		if (dir != NULL) {
5305051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5315051Swyllys 			    KMF_DIRPATH_ATTR, dir,
5325051Swyllys 			    strlen(dir));
5335051Swyllys 			numattr++;
5345051Swyllys 		}
5355051Swyllys 
5365051Swyllys 		if (filename != NULL) {
5375051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5385051Swyllys 			    KMF_KEY_FILENAME_ATTR, filename,
5395051Swyllys 			    strlen(filename));
5405051Swyllys 			numattr++;
5415051Swyllys 		}
5425051Swyllys 
5433089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
5445051Swyllys 			int num = numattr;
5453089Swyllys 
5465051Swyllys 			keyclass = KMF_ASYM_PRI;
5475051Swyllys 			kmf_set_attr_at_index(attrlist, num,
5485051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
5495051Swyllys 			    sizeof (keyclass));
5505051Swyllys 			num++;
5515051Swyllys 
5525051Swyllys 			/* list asymmetric private keys */
5535051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
5543089Swyllys 		}
5553089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
5563089Swyllys 			rv = KMF_OK;
5573089Swyllys 
5583089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
5595051Swyllys 			int num = numattr;
5605051Swyllys 
5615051Swyllys 			keyclass = KMF_SYMMETRIC;
5625051Swyllys 			kmf_set_attr_at_index(attrlist, num,
5635051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
5645051Swyllys 			    sizeof (keyclass));
5655051Swyllys 			num++;
5663089Swyllys 
5675051Swyllys 			format = KMF_FORMAT_RAWKEY;
5685051Swyllys 			kmf_set_attr_at_index(attrlist, num,
5695051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
5705051Swyllys 			    sizeof (format));
5715051Swyllys 			num++;
5725051Swyllys 
5735051Swyllys 			/* list symmetric keys */
5745051Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num);
5753089Swyllys 		}
5763089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
5773089Swyllys 			rv = KMF_OK;
5783089Swyllys 		if (rv != KMF_OK)
5793089Swyllys 			return (rv);
58017Sdinak 	}
58117Sdinak 
5825051Swyllys 	numattr = 0;
5833089Swyllys 	if (oclass & PK_CERT_OBJ) {
5845051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
5855051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
5865051Swyllys 		    sizeof (kstype));
5875051Swyllys 		numattr++;
5885051Swyllys 
5895051Swyllys 		if (issuer != NULL) {
5905051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5915051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
5925051Swyllys 			    strlen(issuer));
5935051Swyllys 			numattr++;
5945051Swyllys 		}
5955051Swyllys 
5965051Swyllys 		if (subject != NULL) {
5975051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5985051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
5995051Swyllys 			    strlen(subject));
6005051Swyllys 			numattr++;
6015051Swyllys 		}
60217Sdinak 
6035051Swyllys 		if (serial != NULL) {
6045051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6055051Swyllys 			    KMF_BIGINT_ATTR, serial,
6065051Swyllys 			    sizeof (KMF_BIGINT));
6075051Swyllys 			numattr++;
6085051Swyllys 		}
6095051Swyllys 
6105051Swyllys 		if (filename != NULL) {
6115051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6125051Swyllys 			    KMF_CERT_FILENAME_ATTR, filename,
6135051Swyllys 			    strlen(filename));
6145051Swyllys 			numattr++;
6155051Swyllys 		}
6165051Swyllys 
6175051Swyllys 		if (dir != NULL) {
6185051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6195051Swyllys 			    KMF_DIRPATH_ATTR, dir,
6205051Swyllys 			    strlen(dir));
6215051Swyllys 			numattr++;
6225051Swyllys 		}
6235051Swyllys 
6245051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
6255051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
6265051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
6275051Swyllys 		numattr++;
6285051Swyllys 
6295051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
6303089Swyllys 		if (rv != KMF_OK)
6313089Swyllys 			return (rv);
63217Sdinak 	}
63317Sdinak 
6345051Swyllys 	numattr = 0;
6353089Swyllys 	if (oclass & PK_CRL_OBJ) {
6365051Swyllys 		char *crldata = NULL;
6375051Swyllys 
6385051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
6395051Swyllys 		    &kstype, sizeof (kstype));
6405051Swyllys 		numattr++;
64117Sdinak 
6425051Swyllys 		if (dir != NULL) {
6435051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6445051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
6455051Swyllys 			numattr++;
6465051Swyllys 		}
6475051Swyllys 		if (filename != NULL) {
6485051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6495051Swyllys 			    KMF_CRL_FILENAME_ATTR,
6505051Swyllys 			    filename, strlen(filename));
6515051Swyllys 			numattr++;
6525051Swyllys 		}
6535051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
6545051Swyllys 		    &crldata, sizeof (char *));
6555051Swyllys 		numattr++;
65617Sdinak 
6575051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
6585051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
6593089Swyllys 			(void) printf("%s\n", crldata);
6603089Swyllys 			free(crldata);
6613089Swyllys 		}
66217Sdinak 	}
66317Sdinak 
66417Sdinak 	return (rv);
66517Sdinak }
66617Sdinak 
6673089Swyllys static int
6683089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
6693089Swyllys 	int oclass, char *token_spec, char *dir, char *prefix,
6703089Swyllys 	char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
6713089Swyllys 	KMF_CREDENTIAL *tokencred,
6723089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
67317Sdinak {
6743089Swyllys 	KMF_RETURN rv = KMF_OK;
6755051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
6765051Swyllys 	int numattr = 0;
6775051Swyllys 	KMF_ATTRIBUTE attrlist[16];
6785051Swyllys 	KMF_KEY_CLASS keyclass;
6795051Swyllys 	KMF_ENCODE_FORMAT format;
6803089Swyllys 
6813089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
6823089Swyllys 	if (rv != KMF_OK)
6833089Swyllys 		return (rv);
68417Sdinak 
6855051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
6865051Swyllys 	    &kstype, sizeof (kstype));
6875051Swyllys 	numattr++;
6885051Swyllys 
6893089Swyllys 	if (oclass & PK_KEY_OBJ) {
6905051Swyllys 		if (tokencred != NULL && tokencred->credlen > 0) {
6915051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6925051Swyllys 			    KMF_CREDENTIAL_ATTR, tokencred,
6935051Swyllys 			    sizeof (KMF_CREDENTIAL));
6945051Swyllys 			numattr++;
6955051Swyllys 		}
6965051Swyllys 
6975051Swyllys 		if (token_spec && strlen(token_spec)) {
6985051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6995051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
7005051Swyllys 			    strlen(token_spec));
7015051Swyllys 			numattr++;
7025051Swyllys 		}
7035051Swyllys 
7045051Swyllys 		if (nickname != NULL) {
7055051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7065051Swyllys 			    KMF_KEYLABEL_ATTR, nickname,
7075051Swyllys 			    strlen(nickname));
7085051Swyllys 			numattr++;
7095051Swyllys 		}
71017Sdinak 	}
71117Sdinak 
7123089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
7135051Swyllys 		int num = numattr;
7145051Swyllys 
7155051Swyllys 		keyclass = KMF_ASYM_PRI;
7165051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7175051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7185051Swyllys 		    sizeof (keyclass));
7195051Swyllys 		num++;
7205051Swyllys 
7215051Swyllys 		/* list asymmetric private keys */
7225051Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num);
72317Sdinak 	}
7245051Swyllys 
7253089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
7265051Swyllys 		int num = numattr;
7275051Swyllys 
7285051Swyllys 		keyclass = KMF_SYMMETRIC;
7295051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7305051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7315051Swyllys 		    sizeof (keyclass));
7325051Swyllys 		num++;
7335051Swyllys 
7345051Swyllys 		format = KMF_FORMAT_RAWKEY;
7355051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7365051Swyllys 		    KMF_ENCODE_FORMAT_ATTR, &format,
7375051Swyllys 		    sizeof (format));
7385051Swyllys 		num++;
7395051Swyllys 
7405051Swyllys 		/* list symmetric keys */
7415051Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num);
7423089Swyllys 	}
7435051Swyllys 
7443089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
7455051Swyllys 		int num = numattr;
7465051Swyllys 
7475051Swyllys 		keyclass = KMF_ASYM_PUB;
7485051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7495051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7505051Swyllys 		    sizeof (keyclass));
7515051Swyllys 		num++;
7525051Swyllys 
7535051Swyllys 		/* list asymmetric public keys */
7545051Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num);
75517Sdinak 	}
75617Sdinak 
7573089Swyllys 	/* If searching for public objects or certificates, find certs now */
7585051Swyllys 	numattr = 0;
7593089Swyllys 	if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
7605051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
7615051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
7625051Swyllys 		    sizeof (kstype));
7635051Swyllys 		numattr++;
7645051Swyllys 
7655051Swyllys 		if (nickname != NULL) {
7665051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7675051Swyllys 			    KMF_CERT_LABEL_ATTR, nickname,
7685051Swyllys 			    strlen(nickname));
7695051Swyllys 			numattr++;
7705051Swyllys 		}
7715051Swyllys 
7725051Swyllys 		if (issuer != NULL) {
7735051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7745051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
7755051Swyllys 			    strlen(issuer));
7765051Swyllys 			numattr++;
7775051Swyllys 		}
77817Sdinak 
7795051Swyllys 		if (subject != NULL) {
7805051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7815051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
7825051Swyllys 			    strlen(subject));
7835051Swyllys 			numattr++;
7845051Swyllys 		}
7855051Swyllys 
7865051Swyllys 		if (serial != NULL) {
7875051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7885051Swyllys 			    KMF_BIGINT_ATTR, serial,
7895051Swyllys 			    sizeof (KMF_BIGINT));
7905051Swyllys 			numattr++;
7915051Swyllys 		}
79217Sdinak 
7935051Swyllys 		if (token_spec != NULL) {
7945051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7955051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
7965051Swyllys 			    strlen(token_spec));
7975051Swyllys 			numattr++;
7985051Swyllys 		}
7995051Swyllys 
8005051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
8015051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
8025051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
8035051Swyllys 		numattr++;
8045051Swyllys 
8055051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
80617Sdinak 	}
80717Sdinak 
8085051Swyllys 	numattr = 0;
8093089Swyllys 	if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
8103089Swyllys 		int numcrls;
8115051Swyllys 
8125051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
8135051Swyllys 		    &kstype, sizeof (kstype));
8145051Swyllys 		numattr++;
8153089Swyllys 
8165051Swyllys 		if (token_spec != NULL) {
8175051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8185051Swyllys 			    KMF_TOKEN_LABEL_ATTR,
8195051Swyllys 			    token_spec, strlen(token_spec));
8205051Swyllys 			numattr++;
8215051Swyllys 		}
8225051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR,
8235051Swyllys 		    &numcrls, sizeof (int));
8245051Swyllys 		numattr++;
8253089Swyllys 
8265051Swyllys 		rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8273089Swyllys 		if (rv == KMF_OK) {
8283089Swyllys 			char **p;
8293089Swyllys 			if (numcrls == 0) {
8303089Swyllys 				(void) printf(gettext("No CRLs found in "
8315051Swyllys 				    "NSS keystore.\n"));
83217Sdinak 
8333089Swyllys 				return (KMF_OK);
8343089Swyllys 			}
8353089Swyllys 			p = malloc(numcrls * sizeof (char *));
8363089Swyllys 			if (p == NULL) {
8373089Swyllys 				return (KMF_ERR_MEMORY);
8383089Swyllys 			}
8393089Swyllys 			(void) memset(p, 0, numcrls * sizeof (char *));
8405051Swyllys 
8415051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8425051Swyllys 			    KMF_CRL_NAMELIST_ATTR, p, sizeof (char *));
8435051Swyllys 			numattr++;
8445051Swyllys 			rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8453089Swyllys 			if (rv == KMF_OK) {
8463089Swyllys 				int i;
8473089Swyllys 				for (i = 0; i < numcrls; i++) {
8483089Swyllys 					(void) printf("%d. Name = %s\n",
8495051Swyllys 					    i + 1, p[i]);
8503089Swyllys 					free(p[i]);
8513089Swyllys 				}
8523089Swyllys 			}
8533089Swyllys 			free(p);
85417Sdinak 		}
85517Sdinak 	}
85617Sdinak 	return (rv);
85717Sdinak }
85817Sdinak 
85917Sdinak /*
86017Sdinak  * List token object.
86117Sdinak  */
86217Sdinak int
86317Sdinak pk_list(int argc, char *argv[])
86417Sdinak {
86517Sdinak 	int			opt;
866864Sdinak 	extern int		optind_av;
867864Sdinak 	extern char		*optarg_av;
868864Sdinak 	char			*token_spec = NULL;
8693089Swyllys 	char			*subject = NULL;
8703089Swyllys 	char			*issuer = NULL;
8713089Swyllys 	char			*dir = NULL;
8723089Swyllys 	char			*prefix = NULL;
8733089Swyllys 	char			*filename = NULL;
8743089Swyllys 	char			*serstr = NULL;
8753089Swyllys 	KMF_BIGINT		serial = { NULL, 0 };
87617Sdinak 
8773089Swyllys 	char			*list_label = NULL;
8783089Swyllys 	int			oclass = 0;
8793089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
8803089Swyllys 	KMF_RETURN		rv = KMF_OK;
8813089Swyllys 	KMF_HANDLE_T		kmfhandle = NULL;
8823089Swyllys 	char			*find_criteria = NULL;
8833089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
8843089Swyllys 	KMF_CREDENTIAL		tokencred = {NULL, 0};
88517Sdinak 
88617Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
887864Sdinak 	while ((opt = getopt_av(argc, argv,
8885051Swyllys 	    "k:(keystore)t:(objtype)T:(token)d:(dir)"
8895051Swyllys 	    "p:(prefix)n:(nickname)S:(serial)s:(subject)"
8905051Swyllys 	    "c:(criteria)"
8915051Swyllys 	    "i:(issuer)l:(label)f:(infile)")) != EOF) {
8923089Swyllys 		if (EMPTYSTRING(optarg_av))
8933089Swyllys 			return (PK_ERR_USAGE);
89417Sdinak 		switch (opt) {
8953089Swyllys 			case 'k':
8963089Swyllys 				if (kstype != 0)
8973089Swyllys 					return (PK_ERR_USAGE);
8983089Swyllys 				kstype = KS2Int(optarg_av);
8993089Swyllys 				if (kstype == 0)
9003089Swyllys 					return (PK_ERR_USAGE);
9013089Swyllys 				break;
9023089Swyllys 			case 't':
9033089Swyllys 				if (oclass != 0)
9043089Swyllys 					return (PK_ERR_USAGE);
9053089Swyllys 				oclass = OT2Int(optarg_av);
9063089Swyllys 				if (oclass == -1)
9073089Swyllys 					return (PK_ERR_USAGE);
9083089Swyllys 				break;
9093089Swyllys 			case 's':
9103089Swyllys 				if (subject)
9113089Swyllys 					return (PK_ERR_USAGE);
9123089Swyllys 				subject = optarg_av;
9133089Swyllys 				break;
9143089Swyllys 			case 'i':
9153089Swyllys 				if (issuer)
9163089Swyllys 					return (PK_ERR_USAGE);
9173089Swyllys 				issuer = optarg_av;
9183089Swyllys 				break;
9193089Swyllys 			case 'd':
9203089Swyllys 				if (dir)
9213089Swyllys 					return (PK_ERR_USAGE);
9223089Swyllys 				dir = optarg_av;
9233089Swyllys 				break;
9243089Swyllys 			case 'p':
9253089Swyllys 				if (prefix)
9263089Swyllys 					return (PK_ERR_USAGE);
9273089Swyllys 				prefix = optarg_av;
9283089Swyllys 				break;
9293089Swyllys 			case 'S':
9303089Swyllys 				serstr = optarg_av;
9313089Swyllys 				break;
9323089Swyllys 			case 'f':
9333089Swyllys 				if (filename)
9343089Swyllys 					return (PK_ERR_USAGE);
9353089Swyllys 				filename = optarg_av;
9363089Swyllys 				break;
9373089Swyllys 			case 'T':	/* token specifier */
9383089Swyllys 				if (token_spec)
9393089Swyllys 					return (PK_ERR_USAGE);
9403089Swyllys 				token_spec = optarg_av;
9413089Swyllys 				break;
9423089Swyllys 			case 'n':
9433089Swyllys 			case 'l':	/* object with specific label */
9443089Swyllys 				if (list_label)
9453089Swyllys 					return (PK_ERR_USAGE);
9463089Swyllys 				list_label = optarg_av;
9473089Swyllys 				break;
9483089Swyllys 			case 'c':
9493089Swyllys 				find_criteria = optarg_av;
9503089Swyllys 				if (!strcasecmp(find_criteria, "valid"))
9513089Swyllys 					find_criteria_flag =
9523089Swyllys 					    KMF_NONEXPIRED_CERTS;
9533089Swyllys 				else if (!strcasecmp(find_criteria, "expired"))
9543089Swyllys 					find_criteria_flag = KMF_EXPIRED_CERTS;
9553089Swyllys 				else if (!strcasecmp(find_criteria, "both"))
9563089Swyllys 					find_criteria_flag = KMF_ALL_CERTS;
9573089Swyllys 				else
9583089Swyllys 					return (PK_ERR_USAGE);
9593089Swyllys 				break;
9603089Swyllys 			default:
961864Sdinak 				return (PK_ERR_USAGE);
96217Sdinak 		}
96317Sdinak 	}
96417Sdinak 	/* No additional args allowed. */
965864Sdinak 	argc -= optind_av;
966864Sdinak 	argv += optind_av;
96717Sdinak 	if (argc)
96817Sdinak 		return (PK_ERR_USAGE);
96917Sdinak 
9705051Swyllys 	if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
9713089Swyllys 		/* Error message ? */
9723089Swyllys 		return (rv);
97317Sdinak 	}
97417Sdinak 
9753089Swyllys 	/* Assume keystore = PKCS#11 if not specified. */
9763089Swyllys 	if (kstype == 0)
9773089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
97817Sdinak 
9793089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
9803089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
9815051Swyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
9823089Swyllys 
9833089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
9845051Swyllys 		    "is only relevant if keystore=pkcs11\n"));
9853089Swyllys 		return (PK_ERR_USAGE);
98617Sdinak 	}
98717Sdinak 
9883089Swyllys 	/* If no object class specified, list certificate objects. */
9893089Swyllys 	if (oclass == 0)
9903089Swyllys 		oclass = PK_CERT_OBJ;
9913089Swyllys 
9923089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
9933089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
9943089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
9953089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
99617Sdinak 	}
99717Sdinak 
9983089Swyllys 	if (serstr != NULL) {
9993089Swyllys 		uchar_t *bytes = NULL;
10003089Swyllys 		size_t bytelen;
10013089Swyllys 
10025051Swyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
10033089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
10043089Swyllys 			(void) fprintf(stderr, gettext("serial number "
10055051Swyllys 			    "must be specified as a hex number "
10065051Swyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
10073089Swyllys 			return (PK_ERR_USAGE);
10083089Swyllys 		}
10093089Swyllys 		serial.val = bytes;
10103089Swyllys 		serial.len = bytelen;
101117Sdinak 	}
101217Sdinak 
10133089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
10145051Swyllys 	    kstype == KMF_KEYSTORE_NSS) &&
10155051Swyllys 	    (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
10163089Swyllys 
10173089Swyllys 		(void) get_token_password(kstype, token_spec,
10185051Swyllys 		    &tokencred);
10193089Swyllys 	}
10203089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN) {
10213089Swyllys 		rv = list_pk11_objects(kmfhandle, token_spec,
10225051Swyllys 		    oclass, list_label, &serial,
10235051Swyllys 		    issuer, subject, dir, filename,
10245051Swyllys 		    &tokencred, find_criteria_flag);
102517Sdinak 
10263089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS) {
10273089Swyllys 		if (dir == NULL)
10283089Swyllys 			dir = PK_DEFAULT_DIRECTORY;
10293089Swyllys 		rv = list_nss_objects(kmfhandle,
10305051Swyllys 		    oclass, token_spec, dir, prefix,
10315051Swyllys 		    list_label, &serial, issuer, subject,
10325051Swyllys 		    &tokencred, find_criteria_flag);
10333089Swyllys 
10343089Swyllys 	} else if (kstype == KMF_KEYSTORE_OPENSSL) {
10353089Swyllys 
10363089Swyllys 		rv = list_file_objects(kmfhandle,
10375051Swyllys 		    oclass, dir, filename,
10385051Swyllys 		    &serial, issuer, subject, find_criteria_flag);
103917Sdinak 	}
104017Sdinak 
10413089Swyllys 	if (rv != KMF_OK) {
10423089Swyllys 		display_error(kmfhandle, rv,
10435051Swyllys 		    gettext("Error listing objects"));
10443089Swyllys 	}
10453089Swyllys 
10463089Swyllys 	if (serial.val != NULL)
10473089Swyllys 		free(serial.val);
10483089Swyllys 
10493089Swyllys 	if (tokencred.cred != NULL)
10503089Swyllys 		free(tokencred.cred);
10513089Swyllys 
10525051Swyllys 	(void) kmf_finalize(kmfhandle);
10533089Swyllys 	return (rv);
105417Sdinak }
1055