xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/list.c (revision 11973:480f5412d630)
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 /*
22*11973Swyllys.ingersoll@sun.com  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2317Sdinak  * Use is subject to license terms.
2417Sdinak  */
2517Sdinak 
2617Sdinak /*
2717Sdinak  * This file implements the token object list operation for this tool.
2817Sdinak  * It loads the PKCS#11 modules, finds the object to list, lists it,
2917Sdinak  * and cleans up.  User must be logged into the token to list private
3017Sdinak  * objects.
3117Sdinak  */
3217Sdinak 
3317Sdinak #include <stdio.h>
3417Sdinak #include <errno.h>
3517Sdinak #include <string.h>
3617Sdinak #include <cryptoutil.h>
3717Sdinak #include <security/cryptoki.h>
3817Sdinak #include "common.h"
393089Swyllys 
403089Swyllys #include <kmfapi.h>
4117Sdinak 
423089Swyllys static void
433089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
4417Sdinak {
453089Swyllys 	int i;
463089Swyllys 	char *subject, *issuer, *serial, *id, *altname;
475051Swyllys 	char *start, *end, *keyusage, *extkeyusage;
4817Sdinak 
493089Swyllys 	for (i = 0; i < num_certs; i++) {
503089Swyllys 		subject = NULL;
513089Swyllys 		issuer = NULL;
523089Swyllys 		serial = NULL;
533089Swyllys 		id = NULL;
543089Swyllys 		altname = NULL;
555051Swyllys 		start = end = NULL;
565051Swyllys 		keyusage = extkeyusage = NULL;
5717Sdinak 
583089Swyllys 		(void) fprintf(stdout,
595051Swyllys 		    gettext("%d. (X.509 certificate)\n"), i + 1);
603089Swyllys 		if (certs[i].kmf_private.label != NULL)
613089Swyllys 			(void) fprintf(stdout, gettext("\t%s: %s\n"),
625051Swyllys 			    (certs[i].kmf_private.keystore_type ==
635051Swyllys 			    KMF_KEYSTORE_OPENSSL ?  "Filename" : "Label"),
645051Swyllys 			    certs[i].kmf_private.label);
655051Swyllys 		if (kmf_get_cert_id_str(&certs[i].certificate,
665051Swyllys 		    &id) == KMF_OK)
673089Swyllys 			(void) fprintf(stdout, gettext("\tID: %s\n"), id);
685051Swyllys 		if (kmf_get_cert_subject_str(kmfhandle,
695051Swyllys 		    &certs[i].certificate, &subject) == KMF_OK)
703089Swyllys 			(void) fprintf(stdout, gettext("\tSubject: %s\n"),
715051Swyllys 			    subject);
725051Swyllys 		if (kmf_get_cert_issuer_str(kmfhandle,
735051Swyllys 		    &certs[i].certificate, &issuer) == KMF_OK)
743089Swyllys 			(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
755051Swyllys 			    issuer);
765051Swyllys 		if (kmf_get_cert_start_date_str(kmfhandle,
775051Swyllys 		    &certs[i].certificate, &start) == KMF_OK)
785051Swyllys 			(void) fprintf(stdout, gettext("\tNot Before: %s\n"),
795051Swyllys 			    start);
805051Swyllys 		if (kmf_get_cert_end_date_str(kmfhandle,
815051Swyllys 		    &certs[i].certificate, &end) == KMF_OK)
825051Swyllys 			(void) fprintf(stdout, gettext("\tNot After: %s\n"),
835051Swyllys 			    end);
845051Swyllys 		if (kmf_get_cert_serial_str(kmfhandle,
855051Swyllys 		    &certs[i].certificate, &serial) == KMF_OK)
863089Swyllys 			(void) fprintf(stdout, gettext("\tSerial: %s\n"),
875051Swyllys 			    serial);
885051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
895051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
905051Swyllys 		    &altname) == KMF_OK)  {
915051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
925051Swyllys 			    altname);
935051Swyllys 		}
945051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
955051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_KEY_USAGE,
965051Swyllys 		    &keyusage) == KMF_OK)  {
973089Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
985051Swyllys 			    keyusage);
995051Swyllys 		}
1005051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
1015051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE,
1025051Swyllys 		    &extkeyusage) == KMF_OK)  {
1035051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
1045051Swyllys 			    extkeyusage);
1053089Swyllys 		}
1065051Swyllys 		kmf_free_str(subject);
1075051Swyllys 		kmf_free_str(issuer);
1085051Swyllys 		kmf_free_str(serial);
1095051Swyllys 		kmf_free_str(id);
1105051Swyllys 		kmf_free_str(altname);
1115051Swyllys 		kmf_free_str(keyusage);
1125051Swyllys 		kmf_free_str(extkeyusage);
1135051Swyllys 		kmf_free_str(start);
1145051Swyllys 		kmf_free_str(end);
1153089Swyllys 		(void) fprintf(stdout, "\n");
11617Sdinak 	}
11717Sdinak }
11817Sdinak 
1193089Swyllys static char *
1203089Swyllys describeKey(KMF_KEY_HANDLE *key)
12117Sdinak {
1223089Swyllys 	if (key->keyclass == KMF_ASYM_PUB) {
1233089Swyllys 		if (key->keyalg == KMF_RSA)
1243089Swyllys 			return (gettext("RSA public key"));
1253089Swyllys 		if (key->keyalg == KMF_DSA)
1263089Swyllys 			return (gettext("DSA public key"));
127*11973Swyllys.ingersoll@sun.com 		if (key->keyalg == KMF_ECDSA)
128*11973Swyllys.ingersoll@sun.com 			return (gettext("ECDSA public key"));
12917Sdinak 	}
1303089Swyllys 	if (key->keyclass == KMF_ASYM_PRI) {
1313089Swyllys 		if (key->keyalg == KMF_RSA)
132*11973Swyllys.ingersoll@sun.com 			return (gettext("RSA private key"));
1333089Swyllys 		if (key->keyalg == KMF_DSA)
134*11973Swyllys.ingersoll@sun.com 			return (gettext("DSA private key"));
135*11973Swyllys.ingersoll@sun.com 		if (key->keyalg == KMF_ECDSA)
136*11973Swyllys.ingersoll@sun.com 			return (gettext("ECDSA private key"));
13717Sdinak 	}
1383089Swyllys 	if (key->keyclass == KMF_SYMMETRIC) {
1393089Swyllys 		switch (key->keyalg) {
1403089Swyllys 			case KMF_AES:
1413089Swyllys 				return (gettext("AES"));
1423089Swyllys 				break;
1433089Swyllys 			case KMF_RC4:
1443089Swyllys 				return (gettext("ARCFOUR"));
1453089Swyllys 				break;
1463089Swyllys 			case KMF_DES:
1473089Swyllys 				return (gettext("DES"));
1483089Swyllys 				break;
1493089Swyllys 			case KMF_DES3:
1503089Swyllys 				return (gettext("Triple-DES"));
1513089Swyllys 				break;
1523089Swyllys 			default:
1533089Swyllys 				return (gettext("symmetric"));
1543089Swyllys 				break;
15517Sdinak 		}
15617Sdinak 	}
15717Sdinak 
1583089Swyllys 	return (gettext("unrecognized key object"));
1593089Swyllys 
1603089Swyllys }
16117Sdinak 
1623089Swyllys 
1633089Swyllys static void
1643089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
1653089Swyllys {
1663089Swyllys 	int i;
1673089Swyllys 
1683089Swyllys 	for (i = 0; i < numkeys; i++) {
1694006Shylee 		(void) fprintf(stdout, gettext("Key #%d - %s:  %s"),
1705051Swyllys 		    i+1, describeKey(&keys[i]),
1715051Swyllys 		    keys[i].keylabel ? keys[i].keylabel :
1725051Swyllys 		    gettext("No label"));
1733089Swyllys 
1743089Swyllys 		if (keys[i].keyclass == KMF_SYMMETRIC) {
1753089Swyllys 			KMF_RETURN rv;
1763089Swyllys 			KMF_RAW_SYM_KEY rkey;
1774006Shylee 
1785051Swyllys 			(void) memset(&rkey, 0, sizeof (rkey));
1795051Swyllys 			rv = kmf_get_sym_key_value(handle, &keys[i],
1805051Swyllys 			    &rkey);
1813089Swyllys 			if (rv == KMF_OK) {
1824006Shylee 				(void) fprintf(stdout, " (%d bits)",
1835051Swyllys 				    rkey.keydata.len * 8);
1845051Swyllys 				kmf_free_bigint(&rkey.keydata);
1855051Swyllys 			} else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) {
1865051Swyllys 				if (rv == KMF_ERR_SENSITIVE_KEY) {
1875051Swyllys 					(void) fprintf(stdout, " (sensitive)");
1885051Swyllys 				} else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
1895051Swyllys 					(void) fprintf(stdout,
1905051Swyllys 					    " (non-extractable)");
1915051Swyllys 				} else {
1925051Swyllys 					char *err = NULL;
1935051Swyllys 					if (kmf_get_kmf_error_str(rv, &err) ==
1945051Swyllys 					    KMF_OK)
1955051Swyllys 						(void) fprintf(stdout,
1965051Swyllys 						    " (error: %s)", err);
1975051Swyllys 					if (err != NULL)
1985051Swyllys 						free(err);
1995051Swyllys 				}
2003089Swyllys 			}
20117Sdinak 		}
2023089Swyllys 		(void) fprintf(stdout, "\n");
20317Sdinak 	}
2043089Swyllys }
20517Sdinak 
2063089Swyllys /*
2073089Swyllys  * Generic routine used by all "list cert" operations to find
2083089Swyllys  * all matching certificates.
2093089Swyllys  */
2103089Swyllys static KMF_RETURN
2115051Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr)
2123089Swyllys {
2133089Swyllys 	KMF_RETURN rv = KMF_OK;
2143089Swyllys 	KMF_X509_DER_CERT *certlist = NULL;
2153089Swyllys 	uint32_t numcerts = 0;
2165051Swyllys 	KMF_KEYSTORE_TYPE kstype;
21717Sdinak 
2185051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2195051Swyllys 	    &kstype, NULL);
2205051Swyllys 	if (rv != KMF_OK)
2215051Swyllys 		return (rv);
2225051Swyllys 
2235051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2245051Swyllys 	    &numcerts, sizeof (uint32_t));
2255051Swyllys 	numattr++;
2265051Swyllys 
2275051Swyllys 	rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2283089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
2293089Swyllys 		(void) printf(gettext("Found %d certificates.\n"),
2305051Swyllys 		    numcerts);
2313089Swyllys 		certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
2325051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2333089Swyllys 		if (certlist == NULL)
2343089Swyllys 			return (KMF_ERR_MEMORY);
2353089Swyllys 		(void) memset(certlist, 0, numcerts *
2365051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2373089Swyllys 
2385051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
2395051Swyllys 		    KMF_X509_DER_CERT_ATTR, certlist,
2405051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2415051Swyllys 		numattr++;
2425051Swyllys 
2435051Swyllys 		rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2443089Swyllys 		if (rv == KMF_OK) {
2453089Swyllys 			int i;
2463089Swyllys 			(void) pk_show_certs(kmfhandle, certlist,
2475051Swyllys 			    numcerts);
2483089Swyllys 			for (i = 0; i < numcerts; i++)
2495051Swyllys 				kmf_free_kmf_cert(kmfhandle, &certlist[i]);
2503089Swyllys 		}
2513089Swyllys 		free(certlist);
25217Sdinak 	}
2533089Swyllys 	if (rv == KMF_ERR_CERT_NOT_FOUND &&
2545051Swyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
2553089Swyllys 		rv = KMF_OK;
25617Sdinak 
25717Sdinak 	return (rv);
25817Sdinak }
25917Sdinak 
2603089Swyllys static KMF_RETURN
2615221Swyllys pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr, char *label)
26217Sdinak {
2633089Swyllys 	KMF_RETURN rv;
2643089Swyllys 	KMF_KEY_HANDLE *keys;
2653089Swyllys 	uint32_t numkeys = 0;
2665051Swyllys 	KMF_KEYSTORE_TYPE kstype;
2673089Swyllys 
2685051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2695051Swyllys 	    &kstype, NULL);
2705051Swyllys 	if (rv != KMF_OK)
2715051Swyllys 		return (rv);
2725051Swyllys 
2735051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2745051Swyllys 	    &numkeys, sizeof (uint32_t));
2755051Swyllys 	numattr++;
2765051Swyllys 
2775051Swyllys 	rv = kmf_find_key(handle, numattr, attrlist);
2783089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
2793089Swyllys 		int i;
2805221Swyllys 		(void) printf(gettext("Found %d %s keys.\n"),
2815221Swyllys 		    numkeys, label);
2823089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
2835051Swyllys 		    sizeof (KMF_KEY_HANDLE));
2843089Swyllys 		if (keys == NULL)
2853089Swyllys 			return (KMF_ERR_MEMORY);
2863089Swyllys 		(void) memset(keys, 0, numkeys *
2875051Swyllys 		    sizeof (KMF_KEY_HANDLE));
28817Sdinak 
2895051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
2905051Swyllys 		    KMF_KEY_HANDLE_ATTR,
2915051Swyllys 		    keys, sizeof (KMF_KEY_HANDLE));
2925051Swyllys 		numattr++;
2935051Swyllys 
2945051Swyllys 		rv = kmf_find_key(handle, numattr, attrlist);
2953089Swyllys 		if (rv == KMF_OK)
2963089Swyllys 			pk_show_keys(handle, keys, numkeys);
2973089Swyllys 		for (i = 0; i < numkeys; i++)
2985051Swyllys 			kmf_free_kmf_key(handle, &keys[i]);
2993089Swyllys 		free(keys);
3003089Swyllys 	}
3013089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND &&
3025051Swyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
3033089Swyllys 		rv = KMF_OK;
3043089Swyllys 	return (rv);
3053089Swyllys }
30617Sdinak 
3073089Swyllys static KMF_RETURN
3083089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
3093089Swyllys 	char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject,
3103089Swyllys 	char *dir, char *filename, KMF_CREDENTIAL *tokencred,
3113089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
3123089Swyllys {
3133089Swyllys 	KMF_RETURN rv;
3145051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
3155051Swyllys 	int numattr = 0;
3166354Swyllys 	KMF_ATTRIBUTE attrlist[18];
3175051Swyllys 	boolean_t token_bool = B_TRUE;
3185051Swyllys 	boolean_t private = B_FALSE;
3195051Swyllys 	KMF_KEY_CLASS keyclass;
3205051Swyllys 	KMF_ENCODE_FORMAT format;
3216354Swyllys 	int auth = 0;
3226354Swyllys 	KMF_CREDENTIAL cred = {NULL, 0};
3233089Swyllys 
3243089Swyllys 	/*
325*11973Swyllys.ingersoll@sun.com 	 * Symmetric keys and RSA/DSA/ECDSA private keys are always
3263089Swyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
3273089Swyllys 	 * make sure we search for them with it also set.
3283089Swyllys 	 */
3293089Swyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
3303089Swyllys 		oclass |= PK_PRIVATE_OBJ;
3313089Swyllys 
3323089Swyllys 	rv = select_token(kmfhandle, token,
3335051Swyllys 	    !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
3343089Swyllys 
3353089Swyllys 	if (rv != KMF_OK) {
33617Sdinak 		return (rv);
33717Sdinak 	}
33817Sdinak 
3396354Swyllys 	rv = token_auth_needed(kmfhandle, token, &auth);
3406354Swyllys 	if (rv != KMF_OK)
3416354Swyllys 		return (rv);
3426354Swyllys 
3436354Swyllys 	if (tokencred != NULL)
3446354Swyllys 		cred = *tokencred;
3456354Swyllys 
3463089Swyllys 	if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
3475051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
3485051Swyllys 		    &kstype, sizeof (kstype));
3495051Swyllys 		numattr++;
3505051Swyllys 
3515051Swyllys 		if (objlabel != NULL) {
3525051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3535051Swyllys 			    KMF_KEYLABEL_ATTR, objlabel,
3545051Swyllys 			    strlen(objlabel));
3555051Swyllys 			numattr++;
3565051Swyllys 		}
3573089Swyllys 
3585051Swyllys 		private = ((oclass & PK_PRIVATE_OBJ) > 0);
3595051Swyllys 
3605051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
3615051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
3625051Swyllys 		    sizeof (private));
3635051Swyllys 		numattr++;
3645051Swyllys 
3655051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
3665051Swyllys 		    KMF_TOKEN_BOOL_ATTR, &token_bool,
3675051Swyllys 		    sizeof (token_bool));
3685051Swyllys 		numattr++;
3693089Swyllys 
3703089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
3715051Swyllys 			int num = numattr;
3725051Swyllys 
3735051Swyllys 			keyclass = KMF_ASYM_PRI;
3745051Swyllys 			kmf_set_attr_at_index(attrlist, num,
3755051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
3765051Swyllys 			    sizeof (keyclass));
3775051Swyllys 			num++;
3785051Swyllys 
3795051Swyllys 			if (tokencred != NULL &&
3805051Swyllys 			    tokencred->credlen > 0) {
3815051Swyllys 				kmf_set_attr_at_index(attrlist, num,
3825051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
3835051Swyllys 				    sizeof (KMF_CREDENTIAL));
3845051Swyllys 				num++;
3855051Swyllys 			}
3863089Swyllys 
3873089Swyllys 			/* list asymmetric private keys */
3885221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
3895221Swyllys 			    "asymmetric private");
3903089Swyllys 		}
3913089Swyllys 
3923089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
3935051Swyllys 			int num = numattr;
3945051Swyllys 
3955051Swyllys 			keyclass = KMF_SYMMETRIC;
3965051Swyllys 			kmf_set_attr_at_index(attrlist, num,
3975051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
3985051Swyllys 			    sizeof (keyclass));
3995051Swyllys 			num++;
4005051Swyllys 
4015051Swyllys 			if (tokencred != NULL &&
4025051Swyllys 			    tokencred->credlen > 0) {
4035051Swyllys 				kmf_set_attr_at_index(attrlist, num,
4045051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
4055051Swyllys 				    sizeof (KMF_CREDENTIAL));
4065051Swyllys 				num++;
4075051Swyllys 			}
4085051Swyllys 
4095051Swyllys 			format = KMF_FORMAT_RAWKEY;
4105051Swyllys 			kmf_set_attr_at_index(attrlist, num,
4115051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
4125051Swyllys 			    sizeof (format));
4135051Swyllys 			num++;
4143089Swyllys 
4153089Swyllys 			/* list symmetric keys */
4165221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
4175221Swyllys 			    "symmetric");
41817Sdinak 		}
4193089Swyllys 
4203089Swyllys 		if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
4215051Swyllys 			int num = numattr;
4225051Swyllys 
4236354Swyllys 			if (auth > 0 && (tokencred == NULL ||
4246354Swyllys 			    tokencred->cred == NULL) &&
4256354Swyllys 			    (cred.cred == NULL)) {
4266354Swyllys 				(void) get_token_password(kstype, token, &cred);
4276354Swyllys 				kmf_set_attr_at_index(attrlist, numattr,
4286354Swyllys 				    KMF_CREDENTIAL_ATTR,
4296354Swyllys 				    &cred, sizeof (KMF_CREDENTIAL));
4306354Swyllys 				numattr++;
4316354Swyllys 			}
4326354Swyllys 
4335128Swyllys 			private = B_FALSE;
4345051Swyllys 			keyclass = KMF_ASYM_PUB;
4355051Swyllys 			kmf_set_attr_at_index(attrlist, num,
4365051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
4375051Swyllys 			    sizeof (keyclass));
4385051Swyllys 			num++;
4393089Swyllys 
4403089Swyllys 			/* list asymmetric public keys (if any) */
4415221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
4425221Swyllys 			    "asymmetric public");
4433089Swyllys 		}
4443089Swyllys 
4453089Swyllys 		if (rv != KMF_OK)
4463089Swyllys 			return (rv);
4473089Swyllys 	}
4483089Swyllys 
4495051Swyllys 	numattr = 0;
4503089Swyllys 	if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
4515051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
4525051Swyllys 		    &kstype, sizeof (kstype));
4536354Swyllys 
4545051Swyllys 		numattr++;
4556354Swyllys 		if (auth > 0 && (cred.cred == NULL)) {
4566354Swyllys 			(void) get_token_password(kstype, token, &cred);
4576354Swyllys 		}
4586354Swyllys 
4596354Swyllys 		if (cred.cred != NULL) {
4606354Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4616354Swyllys 			    KMF_CREDENTIAL_ATTR,
4626354Swyllys 			    &cred, sizeof (KMF_CREDENTIAL));
4636354Swyllys 			numattr++;
4646354Swyllys 		}
4655051Swyllys 
4665051Swyllys 		if (objlabel != NULL) {
4675051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4685051Swyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
4695051Swyllys 			    strlen(objlabel));
4705051Swyllys 			numattr++;
4715051Swyllys 		}
4725051Swyllys 
4735051Swyllys 		if (issuer != NULL) {
4745051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4755051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
4765051Swyllys 			    strlen(issuer));
4775051Swyllys 			numattr++;
4785051Swyllys 		}
4793089Swyllys 
4805051Swyllys 		if (subject != NULL) {
4815051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4825051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
4835051Swyllys 			    strlen(subject));
4845051Swyllys 			numattr++;
4855051Swyllys 		}
4863089Swyllys 
4876354Swyllys 		if (serial != NULL && serial->val != NULL) {
4885051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4895051Swyllys 			    KMF_BIGINT_ATTR, serial,
4905051Swyllys 			    sizeof (KMF_BIGINT));
4915051Swyllys 			numattr++;
4925051Swyllys 		}
4935051Swyllys 
4945051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
4955051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
4965051Swyllys 		    sizeof (private));
4975051Swyllys 		numattr++;
4985051Swyllys 
4995051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
5005051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
5015051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
5025051Swyllys 		numattr++;
5035051Swyllys 
5045051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
5053089Swyllys 		if (rv != KMF_OK)
5063089Swyllys 			return (rv);
5073089Swyllys 	}
5083089Swyllys 
5095051Swyllys 	numattr = 0;
5105051Swyllys 	kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */
5113089Swyllys 	if (oclass & PK_CRL_OBJ) {
5125051Swyllys 		char *crldata = NULL;
5135051Swyllys 
5145051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5155051Swyllys 		    &kstype, sizeof (kstype));
5165051Swyllys 		numattr++;
5173089Swyllys 
5185051Swyllys 		if (dir != NULL) {
5195051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5205051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
5215051Swyllys 			numattr++;
5225051Swyllys 		}
5235051Swyllys 		if (filename != NULL) {
5245051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5255051Swyllys 			    KMF_CRL_FILENAME_ATTR,
5265051Swyllys 			    filename, strlen(filename));
5275051Swyllys 			numattr++;
5285051Swyllys 		}
5295051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
5305051Swyllys 		    &crldata, sizeof (char *));
5315051Swyllys 		numattr++;
5323089Swyllys 
5335051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
5345051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
5353089Swyllys 			(void) printf("%s\n", crldata);
5363089Swyllys 			free(crldata);
53717Sdinak 		}
53817Sdinak 	}
53917Sdinak 
5403089Swyllys 	return (rv);
5413089Swyllys }
5423089Swyllys 
5433089Swyllys static int
5443089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
5453089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial,
5463089Swyllys 	char *issuer, char *subject,
5473089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
5483089Swyllys {
5495626Shylee 	KMF_RETURN rv = KMF_OK;
5505051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
5515051Swyllys 	int numattr = 0;
5525051Swyllys 	KMF_ATTRIBUTE attrlist[16];
5535051Swyllys 	KMF_KEY_CLASS keyclass;
5545051Swyllys 	KMF_ENCODE_FORMAT format;
5555051Swyllys 	char *defaultdir = ".";
5563089Swyllys 
5573089Swyllys 	if (oclass & PK_KEY_OBJ) {
5585051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5595051Swyllys 		    &kstype, sizeof (kstype));
5605051Swyllys 		numattr++;
5615051Swyllys 
5625051Swyllys 		if (dir == NULL && filename == NULL)
5635051Swyllys 			dir = defaultdir;
5645051Swyllys 
5655051Swyllys 		if (dir != NULL) {
5665051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5675051Swyllys 			    KMF_DIRPATH_ATTR, dir,
5685051Swyllys 			    strlen(dir));
5695051Swyllys 			numattr++;
5705051Swyllys 		}
5715051Swyllys 
5725051Swyllys 		if (filename != NULL) {
5735051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5745051Swyllys 			    KMF_KEY_FILENAME_ATTR, filename,
5755051Swyllys 			    strlen(filename));
5765051Swyllys 			numattr++;
5775051Swyllys 		}
5785051Swyllys 
5793089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
5805051Swyllys 			int num = numattr;
5813089Swyllys 
5825051Swyllys 			keyclass = KMF_ASYM_PRI;
5835051Swyllys 			kmf_set_attr_at_index(attrlist, num,
5845051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
5855051Swyllys 			    sizeof (keyclass));
5865051Swyllys 			num++;
5875051Swyllys 
5885051Swyllys 			/* list asymmetric private keys */
5895221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
5905221Swyllys 			    "asymmetric private");
5913089Swyllys 		}
5923089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
5933089Swyllys 			rv = KMF_OK;
5943089Swyllys 
5953089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
5965051Swyllys 			int num = numattr;
5975051Swyllys 
5985051Swyllys 			keyclass = KMF_SYMMETRIC;
5995051Swyllys 			kmf_set_attr_at_index(attrlist, num,
6005051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
6015051Swyllys 			    sizeof (keyclass));
6025051Swyllys 			num++;
6033089Swyllys 
6045051Swyllys 			format = KMF_FORMAT_RAWKEY;
6055051Swyllys 			kmf_set_attr_at_index(attrlist, num,
6065051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
6075051Swyllys 			    sizeof (format));
6085051Swyllys 			num++;
6095051Swyllys 
6105051Swyllys 			/* list symmetric keys */
6115221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
6125221Swyllys 			    "symmetric");
6133089Swyllys 		}
6143089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
6153089Swyllys 			rv = KMF_OK;
6163089Swyllys 		if (rv != KMF_OK)
6173089Swyllys 			return (rv);
61817Sdinak 	}
61917Sdinak 
6205051Swyllys 	numattr = 0;
6213089Swyllys 	if (oclass & PK_CERT_OBJ) {
6225051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
6235051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
6245051Swyllys 		    sizeof (kstype));
6255051Swyllys 		numattr++;
6265051Swyllys 
6275051Swyllys 		if (issuer != NULL) {
6285051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6295051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
6305051Swyllys 			    strlen(issuer));
6315051Swyllys 			numattr++;
6325051Swyllys 		}
6335051Swyllys 
6345051Swyllys 		if (subject != NULL) {
6355051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6365051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
6375051Swyllys 			    strlen(subject));
6385051Swyllys 			numattr++;
6395051Swyllys 		}
64017Sdinak 
6416051Swyllys 		if (serial != NULL && serial->val != NULL) {
6425051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6435051Swyllys 			    KMF_BIGINT_ATTR, serial,
6445051Swyllys 			    sizeof (KMF_BIGINT));
6455051Swyllys 			numattr++;
6465051Swyllys 		}
6475051Swyllys 
6485051Swyllys 		if (filename != NULL) {
6495051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6505051Swyllys 			    KMF_CERT_FILENAME_ATTR, filename,
6515051Swyllys 			    strlen(filename));
6525051Swyllys 			numattr++;
6535051Swyllys 		}
6545051Swyllys 
6555051Swyllys 		if (dir != NULL) {
6565051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6575051Swyllys 			    KMF_DIRPATH_ATTR, dir,
6585051Swyllys 			    strlen(dir));
6595051Swyllys 			numattr++;
6605051Swyllys 		}
6615051Swyllys 
6625051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
6635051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
6645051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
6655051Swyllys 		numattr++;
6665051Swyllys 
6675051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
6683089Swyllys 		if (rv != KMF_OK)
6693089Swyllys 			return (rv);
67017Sdinak 	}
67117Sdinak 
6725051Swyllys 	numattr = 0;
6733089Swyllys 	if (oclass & PK_CRL_OBJ) {
6745051Swyllys 		char *crldata = NULL;
6755051Swyllys 
6765051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
6775051Swyllys 		    &kstype, sizeof (kstype));
6785051Swyllys 		numattr++;
67917Sdinak 
6805051Swyllys 		if (dir != NULL) {
6815051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6825051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
6835051Swyllys 			numattr++;
6845051Swyllys 		}
6855051Swyllys 		if (filename != NULL) {
6865051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6875051Swyllys 			    KMF_CRL_FILENAME_ATTR,
6885051Swyllys 			    filename, strlen(filename));
6895051Swyllys 			numattr++;
6905051Swyllys 		}
6915051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
6925051Swyllys 		    &crldata, sizeof (char *));
6935051Swyllys 		numattr++;
69417Sdinak 
6955051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
6965051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
6973089Swyllys 			(void) printf("%s\n", crldata);
6983089Swyllys 			free(crldata);
6993089Swyllys 		}
70017Sdinak 	}
70117Sdinak 
70217Sdinak 	return (rv);
70317Sdinak }
70417Sdinak 
7053089Swyllys static int
7063089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
7073089Swyllys 	int oclass, char *token_spec, char *dir, char *prefix,
7083089Swyllys 	char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
7093089Swyllys 	KMF_CREDENTIAL *tokencred,
7103089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
71117Sdinak {
7123089Swyllys 	KMF_RETURN rv = KMF_OK;
7135051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
7145051Swyllys 	int numattr = 0;
7155051Swyllys 	KMF_ATTRIBUTE attrlist[16];
7165051Swyllys 	KMF_KEY_CLASS keyclass;
7175051Swyllys 	KMF_ENCODE_FORMAT format;
7183089Swyllys 
7193089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
7203089Swyllys 	if (rv != KMF_OK)
7213089Swyllys 		return (rv);
72217Sdinak 
7235051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
7245051Swyllys 	    &kstype, sizeof (kstype));
7255051Swyllys 	numattr++;
7265051Swyllys 
7273089Swyllys 	if (oclass & PK_KEY_OBJ) {
7285051Swyllys 		if (tokencred != NULL && tokencred->credlen > 0) {
7295051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7305051Swyllys 			    KMF_CREDENTIAL_ATTR, tokencred,
7315051Swyllys 			    sizeof (KMF_CREDENTIAL));
7325051Swyllys 			numattr++;
7335051Swyllys 		}
7345051Swyllys 
7355051Swyllys 		if (token_spec && strlen(token_spec)) {
7365051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7375051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
7385051Swyllys 			    strlen(token_spec));
7395051Swyllys 			numattr++;
7405051Swyllys 		}
7415051Swyllys 
7425051Swyllys 		if (nickname != NULL) {
7435051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7445051Swyllys 			    KMF_KEYLABEL_ATTR, nickname,
7455051Swyllys 			    strlen(nickname));
7465051Swyllys 			numattr++;
7475051Swyllys 		}
74817Sdinak 	}
74917Sdinak 
7503089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
7515051Swyllys 		int num = numattr;
7525051Swyllys 
7535051Swyllys 		keyclass = KMF_ASYM_PRI;
7545051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7555051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7565051Swyllys 		    sizeof (keyclass));
7575051Swyllys 		num++;
7585051Swyllys 
7595051Swyllys 		/* list asymmetric private keys */
7605221Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num,
7615221Swyllys 		    "asymmetric private");
76217Sdinak 	}
7635051Swyllys 
7643089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
7655051Swyllys 		int num = numattr;
7665051Swyllys 
7675051Swyllys 		keyclass = KMF_SYMMETRIC;
7685051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7695051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7705051Swyllys 		    sizeof (keyclass));
7715051Swyllys 		num++;
7725051Swyllys 
7735051Swyllys 		format = KMF_FORMAT_RAWKEY;
7745051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7755051Swyllys 		    KMF_ENCODE_FORMAT_ATTR, &format,
7765051Swyllys 		    sizeof (format));
7775051Swyllys 		num++;
7785051Swyllys 
7795051Swyllys 		/* list symmetric keys */
7805221Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num, "symmetric");
7813089Swyllys 	}
7825051Swyllys 
7833089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
7845051Swyllys 		int num = numattr;
7855051Swyllys 
7865051Swyllys 		keyclass = KMF_ASYM_PUB;
7875051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7885051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7895051Swyllys 		    sizeof (keyclass));
7905051Swyllys 		num++;
7915051Swyllys 
7925051Swyllys 		/* list asymmetric public keys */
7935221Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num,
7945221Swyllys 		    "asymmetric public");
79517Sdinak 	}
79617Sdinak 
7973089Swyllys 	/* If searching for public objects or certificates, find certs now */
7985051Swyllys 	numattr = 0;
7993089Swyllys 	if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
8005051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
8015051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
8025051Swyllys 		    sizeof (kstype));
8035051Swyllys 		numattr++;
8045051Swyllys 
8055051Swyllys 		if (nickname != NULL) {
8065051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8075051Swyllys 			    KMF_CERT_LABEL_ATTR, nickname,
8085051Swyllys 			    strlen(nickname));
8095051Swyllys 			numattr++;
8105051Swyllys 		}
8115051Swyllys 
8125051Swyllys 		if (issuer != NULL) {
8135051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8145051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
8155051Swyllys 			    strlen(issuer));
8165051Swyllys 			numattr++;
8175051Swyllys 		}
81817Sdinak 
8195051Swyllys 		if (subject != NULL) {
8205051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8215051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
8225051Swyllys 			    strlen(subject));
8235051Swyllys 			numattr++;
8245051Swyllys 		}
8255051Swyllys 
8265051Swyllys 		if (serial != NULL) {
8275051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8285051Swyllys 			    KMF_BIGINT_ATTR, serial,
8295051Swyllys 			    sizeof (KMF_BIGINT));
8305051Swyllys 			numattr++;
8315051Swyllys 		}
83217Sdinak 
8335051Swyllys 		if (token_spec != NULL) {
8345051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8355051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
8365051Swyllys 			    strlen(token_spec));
8375051Swyllys 			numattr++;
8385051Swyllys 		}
8395051Swyllys 
8405051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
8415051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
8425051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
8435051Swyllys 		numattr++;
8445051Swyllys 
8455051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
84617Sdinak 	}
84717Sdinak 
8485051Swyllys 	numattr = 0;
8493089Swyllys 	if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
8503089Swyllys 		int numcrls;
8515051Swyllys 
8525051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
8535051Swyllys 		    &kstype, sizeof (kstype));
8545051Swyllys 		numattr++;
8553089Swyllys 
8565051Swyllys 		if (token_spec != NULL) {
8575051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8585051Swyllys 			    KMF_TOKEN_LABEL_ATTR,
8595051Swyllys 			    token_spec, strlen(token_spec));
8605051Swyllys 			numattr++;
8615051Swyllys 		}
8625051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR,
8635051Swyllys 		    &numcrls, sizeof (int));
8645051Swyllys 		numattr++;
8653089Swyllys 
8665051Swyllys 		rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8673089Swyllys 		if (rv == KMF_OK) {
8683089Swyllys 			char **p;
8693089Swyllys 			if (numcrls == 0) {
8703089Swyllys 				(void) printf(gettext("No CRLs found in "
8715051Swyllys 				    "NSS keystore.\n"));
87217Sdinak 
8733089Swyllys 				return (KMF_OK);
8743089Swyllys 			}
8753089Swyllys 			p = malloc(numcrls * sizeof (char *));
8763089Swyllys 			if (p == NULL) {
8773089Swyllys 				return (KMF_ERR_MEMORY);
8783089Swyllys 			}
8793089Swyllys 			(void) memset(p, 0, numcrls * sizeof (char *));
8805051Swyllys 
8815051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8825051Swyllys 			    KMF_CRL_NAMELIST_ATTR, p, sizeof (char *));
8835051Swyllys 			numattr++;
8845051Swyllys 			rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8853089Swyllys 			if (rv == KMF_OK) {
8863089Swyllys 				int i;
8873089Swyllys 				for (i = 0; i < numcrls; i++) {
8883089Swyllys 					(void) printf("%d. Name = %s\n",
8895051Swyllys 					    i + 1, p[i]);
8903089Swyllys 					free(p[i]);
8913089Swyllys 				}
8923089Swyllys 			}
8933089Swyllys 			free(p);
89417Sdinak 		}
89517Sdinak 	}
89617Sdinak 	return (rv);
89717Sdinak }
89817Sdinak 
89917Sdinak /*
90017Sdinak  * List token object.
90117Sdinak  */
90217Sdinak int
90317Sdinak pk_list(int argc, char *argv[])
90417Sdinak {
90517Sdinak 	int			opt;
906864Sdinak 	extern int		optind_av;
907864Sdinak 	extern char		*optarg_av;
908864Sdinak 	char			*token_spec = NULL;
9093089Swyllys 	char			*subject = NULL;
9103089Swyllys 	char			*issuer = NULL;
9113089Swyllys 	char			*dir = NULL;
9123089Swyllys 	char			*prefix = NULL;
9133089Swyllys 	char			*filename = NULL;
9143089Swyllys 	char			*serstr = NULL;
9153089Swyllys 	KMF_BIGINT		serial = { NULL, 0 };
91617Sdinak 
9173089Swyllys 	char			*list_label = NULL;
9183089Swyllys 	int			oclass = 0;
9193089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
9203089Swyllys 	KMF_RETURN		rv = KMF_OK;
9213089Swyllys 	KMF_HANDLE_T		kmfhandle = NULL;
9223089Swyllys 	char			*find_criteria = NULL;
9233089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
9243089Swyllys 	KMF_CREDENTIAL		tokencred = {NULL, 0};
92517Sdinak 
92617Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
927864Sdinak 	while ((opt = getopt_av(argc, argv,
9285051Swyllys 	    "k:(keystore)t:(objtype)T:(token)d:(dir)"
9295051Swyllys 	    "p:(prefix)n:(nickname)S:(serial)s:(subject)"
9305051Swyllys 	    "c:(criteria)"
9315051Swyllys 	    "i:(issuer)l:(label)f:(infile)")) != EOF) {
9323089Swyllys 		if (EMPTYSTRING(optarg_av))
9333089Swyllys 			return (PK_ERR_USAGE);
93417Sdinak 		switch (opt) {
9353089Swyllys 			case 'k':
9363089Swyllys 				if (kstype != 0)
9373089Swyllys 					return (PK_ERR_USAGE);
9383089Swyllys 				kstype = KS2Int(optarg_av);
9393089Swyllys 				if (kstype == 0)
9403089Swyllys 					return (PK_ERR_USAGE);
9413089Swyllys 				break;
9423089Swyllys 			case 't':
9433089Swyllys 				if (oclass != 0)
9443089Swyllys 					return (PK_ERR_USAGE);
9453089Swyllys 				oclass = OT2Int(optarg_av);
9463089Swyllys 				if (oclass == -1)
9473089Swyllys 					return (PK_ERR_USAGE);
9483089Swyllys 				break;
9493089Swyllys 			case 's':
9503089Swyllys 				if (subject)
9513089Swyllys 					return (PK_ERR_USAGE);
9523089Swyllys 				subject = optarg_av;
9533089Swyllys 				break;
9543089Swyllys 			case 'i':
9553089Swyllys 				if (issuer)
9563089Swyllys 					return (PK_ERR_USAGE);
9573089Swyllys 				issuer = optarg_av;
9583089Swyllys 				break;
9593089Swyllys 			case 'd':
9603089Swyllys 				if (dir)
9613089Swyllys 					return (PK_ERR_USAGE);
9623089Swyllys 				dir = optarg_av;
9633089Swyllys 				break;
9643089Swyllys 			case 'p':
9653089Swyllys 				if (prefix)
9663089Swyllys 					return (PK_ERR_USAGE);
9673089Swyllys 				prefix = optarg_av;
9683089Swyllys 				break;
9693089Swyllys 			case 'S':
9703089Swyllys 				serstr = optarg_av;
9713089Swyllys 				break;
9723089Swyllys 			case 'f':
9733089Swyllys 				if (filename)
9743089Swyllys 					return (PK_ERR_USAGE);
9753089Swyllys 				filename = optarg_av;
9763089Swyllys 				break;
9773089Swyllys 			case 'T':	/* token specifier */
9783089Swyllys 				if (token_spec)
9793089Swyllys 					return (PK_ERR_USAGE);
9803089Swyllys 				token_spec = optarg_av;
9813089Swyllys 				break;
9823089Swyllys 			case 'n':
9833089Swyllys 			case 'l':	/* object with specific label */
9843089Swyllys 				if (list_label)
9853089Swyllys 					return (PK_ERR_USAGE);
9863089Swyllys 				list_label = optarg_av;
9873089Swyllys 				break;
9883089Swyllys 			case 'c':
9893089Swyllys 				find_criteria = optarg_av;
9903089Swyllys 				if (!strcasecmp(find_criteria, "valid"))
9913089Swyllys 					find_criteria_flag =
9923089Swyllys 					    KMF_NONEXPIRED_CERTS;
9933089Swyllys 				else if (!strcasecmp(find_criteria, "expired"))
9943089Swyllys 					find_criteria_flag = KMF_EXPIRED_CERTS;
9953089Swyllys 				else if (!strcasecmp(find_criteria, "both"))
9963089Swyllys 					find_criteria_flag = KMF_ALL_CERTS;
9973089Swyllys 				else
9983089Swyllys 					return (PK_ERR_USAGE);
9993089Swyllys 				break;
10003089Swyllys 			default:
1001864Sdinak 				return (PK_ERR_USAGE);
100217Sdinak 		}
100317Sdinak 	}
100417Sdinak 	/* No additional args allowed. */
1005864Sdinak 	argc -= optind_av;
1006864Sdinak 	argv += optind_av;
100717Sdinak 	if (argc)
100817Sdinak 		return (PK_ERR_USAGE);
100917Sdinak 
10105051Swyllys 	if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
10113089Swyllys 		/* Error message ? */
10123089Swyllys 		return (rv);
101317Sdinak 	}
101417Sdinak 
10153089Swyllys 	/* Assume keystore = PKCS#11 if not specified. */
10163089Swyllys 	if (kstype == 0)
10173089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
101817Sdinak 
10193089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
10203089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
10215051Swyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
10223089Swyllys 
10233089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
10245051Swyllys 		    "is only relevant if keystore=pkcs11\n"));
10253089Swyllys 		return (PK_ERR_USAGE);
102617Sdinak 	}
102717Sdinak 
10283089Swyllys 
10293089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
10303089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
10313089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
10323089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
103317Sdinak 	}
103417Sdinak 
10353089Swyllys 	if (serstr != NULL) {
10363089Swyllys 		uchar_t *bytes = NULL;
10373089Swyllys 		size_t bytelen;
10383089Swyllys 
10395051Swyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
10403089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
10413089Swyllys 			(void) fprintf(stderr, gettext("serial number "
10425051Swyllys 			    "must be specified as a hex number "
10435051Swyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
10443089Swyllys 			return (PK_ERR_USAGE);
10453089Swyllys 		}
10463089Swyllys 		serial.val = bytes;
10473089Swyllys 		serial.len = bytelen;
10485221Swyllys 		/* if objtype was not given, it must be for certs */
10495221Swyllys 		if (oclass == 0)
10505221Swyllys 			oclass = PK_CERT_OBJ;
105117Sdinak 	}
10525221Swyllys 	if (oclass == 0 && (issuer != NULL || subject != NULL))
10535221Swyllys 		oclass = PK_CERT_OBJ;
10545221Swyllys 
10555221Swyllys 	/* If no object class specified, list public objects. */
10565221Swyllys 	if (oclass == 0)
10575221Swyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ;
105817Sdinak 
10593089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
10605051Swyllys 	    kstype == KMF_KEYSTORE_NSS) &&
10615051Swyllys 	    (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
10623089Swyllys 
10633089Swyllys 		(void) get_token_password(kstype, token_spec,
10645051Swyllys 		    &tokencred);
10653089Swyllys 	}
10663089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN) {
10673089Swyllys 		rv = list_pk11_objects(kmfhandle, token_spec,
10685051Swyllys 		    oclass, list_label, &serial,
10695051Swyllys 		    issuer, subject, dir, filename,
10705051Swyllys 		    &tokencred, find_criteria_flag);
107117Sdinak 
10723089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS) {
10733089Swyllys 		if (dir == NULL)
10743089Swyllys 			dir = PK_DEFAULT_DIRECTORY;
10753089Swyllys 		rv = list_nss_objects(kmfhandle,
10765051Swyllys 		    oclass, token_spec, dir, prefix,
10775051Swyllys 		    list_label, &serial, issuer, subject,
10785051Swyllys 		    &tokencred, find_criteria_flag);
10793089Swyllys 
10803089Swyllys 	} else if (kstype == KMF_KEYSTORE_OPENSSL) {
10813089Swyllys 
10823089Swyllys 		rv = list_file_objects(kmfhandle,
10835051Swyllys 		    oclass, dir, filename,
10845051Swyllys 		    &serial, issuer, subject, find_criteria_flag);
108517Sdinak 	}
108617Sdinak 
10873089Swyllys 	if (rv != KMF_OK) {
10883089Swyllys 		display_error(kmfhandle, rv,
10895051Swyllys 		    gettext("Error listing objects"));
10903089Swyllys 	}
10913089Swyllys 
10923089Swyllys 	if (serial.val != NULL)
10933089Swyllys 		free(serial.val);
10943089Swyllys 
10953089Swyllys 	if (tokencred.cred != NULL)
10963089Swyllys 		free(tokencred.cred);
10973089Swyllys 
10985051Swyllys 	(void) kmf_finalize(kmfhandle);
10993089Swyllys 	return (rv);
110017Sdinak }
1101