xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/list.c (revision 12585:f47e37e9e164)
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*12585Swyllys.ingersoll@sun.com  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
2317Sdinak  */
2417Sdinak 
2517Sdinak /*
2617Sdinak  * This file implements the token object list operation for this tool.
2717Sdinak  * It loads the PKCS#11 modules, finds the object to list, lists it,
2817Sdinak  * and cleans up.  User must be logged into the token to list private
2917Sdinak  * objects.
3017Sdinak  */
3117Sdinak 
3217Sdinak #include <stdio.h>
3317Sdinak #include <errno.h>
3417Sdinak #include <string.h>
3517Sdinak #include <cryptoutil.h>
3617Sdinak #include <security/cryptoki.h>
3717Sdinak #include "common.h"
383089Swyllys 
393089Swyllys #include <kmfapi.h>
4017Sdinak 
413089Swyllys static void
pk_show_certs(KMF_HANDLE_T kmfhandle,KMF_X509_DER_CERT * certs,int num_certs)423089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
4317Sdinak {
443089Swyllys 	int i;
453089Swyllys 	char *subject, *issuer, *serial, *id, *altname;
465051Swyllys 	char *start, *end, *keyusage, *extkeyusage;
4717Sdinak 
483089Swyllys 	for (i = 0; i < num_certs; i++) {
493089Swyllys 		subject = NULL;
503089Swyllys 		issuer = NULL;
513089Swyllys 		serial = NULL;
523089Swyllys 		id = NULL;
533089Swyllys 		altname = NULL;
545051Swyllys 		start = end = NULL;
555051Swyllys 		keyusage = extkeyusage = NULL;
5617Sdinak 
573089Swyllys 		(void) fprintf(stdout,
585051Swyllys 		    gettext("%d. (X.509 certificate)\n"), i + 1);
593089Swyllys 		if (certs[i].kmf_private.label != NULL)
603089Swyllys 			(void) fprintf(stdout, gettext("\t%s: %s\n"),
615051Swyllys 			    (certs[i].kmf_private.keystore_type ==
625051Swyllys 			    KMF_KEYSTORE_OPENSSL ?  "Filename" : "Label"),
635051Swyllys 			    certs[i].kmf_private.label);
645051Swyllys 		if (kmf_get_cert_id_str(&certs[i].certificate,
655051Swyllys 		    &id) == KMF_OK)
663089Swyllys 			(void) fprintf(stdout, gettext("\tID: %s\n"), id);
675051Swyllys 		if (kmf_get_cert_subject_str(kmfhandle,
685051Swyllys 		    &certs[i].certificate, &subject) == KMF_OK)
693089Swyllys 			(void) fprintf(stdout, gettext("\tSubject: %s\n"),
705051Swyllys 			    subject);
715051Swyllys 		if (kmf_get_cert_issuer_str(kmfhandle,
725051Swyllys 		    &certs[i].certificate, &issuer) == KMF_OK)
733089Swyllys 			(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
745051Swyllys 			    issuer);
755051Swyllys 		if (kmf_get_cert_start_date_str(kmfhandle,
765051Swyllys 		    &certs[i].certificate, &start) == KMF_OK)
775051Swyllys 			(void) fprintf(stdout, gettext("\tNot Before: %s\n"),
785051Swyllys 			    start);
795051Swyllys 		if (kmf_get_cert_end_date_str(kmfhandle,
805051Swyllys 		    &certs[i].certificate, &end) == KMF_OK)
815051Swyllys 			(void) fprintf(stdout, gettext("\tNot After: %s\n"),
825051Swyllys 			    end);
835051Swyllys 		if (kmf_get_cert_serial_str(kmfhandle,
845051Swyllys 		    &certs[i].certificate, &serial) == KMF_OK)
853089Swyllys 			(void) fprintf(stdout, gettext("\tSerial: %s\n"),
865051Swyllys 			    serial);
875051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
885051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
895051Swyllys 		    &altname) == KMF_OK)  {
905051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
915051Swyllys 			    altname);
925051Swyllys 		}
935051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
945051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_KEY_USAGE,
955051Swyllys 		    &keyusage) == KMF_OK)  {
963089Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
975051Swyllys 			    keyusage);
985051Swyllys 		}
995051Swyllys 		if (kmf_get_cert_extn_str(kmfhandle,
1005051Swyllys 		    &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE,
1015051Swyllys 		    &extkeyusage) == KMF_OK)  {
1025051Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
1035051Swyllys 			    extkeyusage);
1043089Swyllys 		}
1055051Swyllys 		kmf_free_str(subject);
1065051Swyllys 		kmf_free_str(issuer);
1075051Swyllys 		kmf_free_str(serial);
1085051Swyllys 		kmf_free_str(id);
1095051Swyllys 		kmf_free_str(altname);
1105051Swyllys 		kmf_free_str(keyusage);
1115051Swyllys 		kmf_free_str(extkeyusage);
1125051Swyllys 		kmf_free_str(start);
1135051Swyllys 		kmf_free_str(end);
1143089Swyllys 		(void) fprintf(stdout, "\n");
11517Sdinak 	}
11617Sdinak }
11717Sdinak 
1183089Swyllys static char *
describeKey(KMF_KEY_HANDLE * key)1193089Swyllys describeKey(KMF_KEY_HANDLE *key)
12017Sdinak {
1213089Swyllys 	if (key->keyclass == KMF_ASYM_PUB) {
1223089Swyllys 		if (key->keyalg == KMF_RSA)
1233089Swyllys 			return (gettext("RSA public key"));
1243089Swyllys 		if (key->keyalg == KMF_DSA)
1253089Swyllys 			return (gettext("DSA public key"));
12611973Swyllys.ingersoll@sun.com 		if (key->keyalg == KMF_ECDSA)
12711973Swyllys.ingersoll@sun.com 			return (gettext("ECDSA public key"));
12817Sdinak 	}
1293089Swyllys 	if (key->keyclass == KMF_ASYM_PRI) {
1303089Swyllys 		if (key->keyalg == KMF_RSA)
13111973Swyllys.ingersoll@sun.com 			return (gettext("RSA private key"));
1323089Swyllys 		if (key->keyalg == KMF_DSA)
13311973Swyllys.ingersoll@sun.com 			return (gettext("DSA private key"));
13411973Swyllys.ingersoll@sun.com 		if (key->keyalg == KMF_ECDSA)
13511973Swyllys.ingersoll@sun.com 			return (gettext("ECDSA private key"));
13617Sdinak 	}
1373089Swyllys 	if (key->keyclass == KMF_SYMMETRIC) {
1383089Swyllys 		switch (key->keyalg) {
1393089Swyllys 			case KMF_AES:
1403089Swyllys 				return (gettext("AES"));
1413089Swyllys 				break;
1423089Swyllys 			case KMF_RC4:
1433089Swyllys 				return (gettext("ARCFOUR"));
1443089Swyllys 				break;
1453089Swyllys 			case KMF_DES:
1463089Swyllys 				return (gettext("DES"));
1473089Swyllys 				break;
1483089Swyllys 			case KMF_DES3:
1493089Swyllys 				return (gettext("Triple-DES"));
1503089Swyllys 				break;
1513089Swyllys 			default:
1523089Swyllys 				return (gettext("symmetric"));
1533089Swyllys 				break;
15417Sdinak 		}
15517Sdinak 	}
15617Sdinak 
1573089Swyllys 	return (gettext("unrecognized key object"));
1583089Swyllys 
1593089Swyllys }
16017Sdinak 
1613089Swyllys 
1623089Swyllys static void
pk_show_keys(void * handle,KMF_KEY_HANDLE * keys,int numkeys)1633089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
1643089Swyllys {
1653089Swyllys 	int i;
1663089Swyllys 
1673089Swyllys 	for (i = 0; i < numkeys; i++) {
1684006Shylee 		(void) fprintf(stdout, gettext("Key #%d - %s:  %s"),
1695051Swyllys 		    i+1, describeKey(&keys[i]),
1705051Swyllys 		    keys[i].keylabel ? keys[i].keylabel :
1715051Swyllys 		    gettext("No label"));
1723089Swyllys 
1733089Swyllys 		if (keys[i].keyclass == KMF_SYMMETRIC) {
1743089Swyllys 			KMF_RETURN rv;
1753089Swyllys 			KMF_RAW_SYM_KEY rkey;
1764006Shylee 
1775051Swyllys 			(void) memset(&rkey, 0, sizeof (rkey));
1785051Swyllys 			rv = kmf_get_sym_key_value(handle, &keys[i],
1795051Swyllys 			    &rkey);
1803089Swyllys 			if (rv == KMF_OK) {
1814006Shylee 				(void) fprintf(stdout, " (%d bits)",
1825051Swyllys 				    rkey.keydata.len * 8);
1835051Swyllys 				kmf_free_bigint(&rkey.keydata);
1845051Swyllys 			} else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) {
1855051Swyllys 				if (rv == KMF_ERR_SENSITIVE_KEY) {
1865051Swyllys 					(void) fprintf(stdout, " (sensitive)");
1875051Swyllys 				} else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
1885051Swyllys 					(void) fprintf(stdout,
1895051Swyllys 					    " (non-extractable)");
1905051Swyllys 				} else {
1915051Swyllys 					char *err = NULL;
1925051Swyllys 					if (kmf_get_kmf_error_str(rv, &err) ==
1935051Swyllys 					    KMF_OK)
1945051Swyllys 						(void) fprintf(stdout,
1955051Swyllys 						    " (error: %s)", err);
1965051Swyllys 					if (err != NULL)
1975051Swyllys 						free(err);
1985051Swyllys 				}
1993089Swyllys 			}
20017Sdinak 		}
2013089Swyllys 		(void) fprintf(stdout, "\n");
20217Sdinak 	}
2033089Swyllys }
20417Sdinak 
2053089Swyllys /*
2063089Swyllys  * Generic routine used by all "list cert" operations to find
2073089Swyllys  * all matching certificates.
2083089Swyllys  */
2093089Swyllys static KMF_RETURN
pk_find_certs(KMF_HANDLE_T kmfhandle,KMF_ATTRIBUTE * attrlist,int numattr)2105051Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr)
2113089Swyllys {
2123089Swyllys 	KMF_RETURN rv = KMF_OK;
2133089Swyllys 	KMF_X509_DER_CERT *certlist = NULL;
2143089Swyllys 	uint32_t numcerts = 0;
2155051Swyllys 	KMF_KEYSTORE_TYPE kstype;
21617Sdinak 
2175051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2185051Swyllys 	    &kstype, NULL);
2195051Swyllys 	if (rv != KMF_OK)
2205051Swyllys 		return (rv);
2215051Swyllys 
2225051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2235051Swyllys 	    &numcerts, sizeof (uint32_t));
2245051Swyllys 	numattr++;
2255051Swyllys 
2265051Swyllys 	rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2273089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
2283089Swyllys 		(void) printf(gettext("Found %d certificates.\n"),
2295051Swyllys 		    numcerts);
2303089Swyllys 		certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
2315051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2323089Swyllys 		if (certlist == NULL)
2333089Swyllys 			return (KMF_ERR_MEMORY);
2343089Swyllys 		(void) memset(certlist, 0, numcerts *
2355051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2363089Swyllys 
2375051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
2385051Swyllys 		    KMF_X509_DER_CERT_ATTR, certlist,
2395051Swyllys 		    sizeof (KMF_X509_DER_CERT));
2405051Swyllys 		numattr++;
2415051Swyllys 
2425051Swyllys 		rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2433089Swyllys 		if (rv == KMF_OK) {
2443089Swyllys 			int i;
2453089Swyllys 			(void) pk_show_certs(kmfhandle, certlist,
2465051Swyllys 			    numcerts);
2473089Swyllys 			for (i = 0; i < numcerts; i++)
2485051Swyllys 				kmf_free_kmf_cert(kmfhandle, &certlist[i]);
2493089Swyllys 		}
2503089Swyllys 		free(certlist);
25117Sdinak 	}
2523089Swyllys 	if (rv == KMF_ERR_CERT_NOT_FOUND &&
2535051Swyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
2543089Swyllys 		rv = KMF_OK;
25517Sdinak 
25617Sdinak 	return (rv);
25717Sdinak }
25817Sdinak 
2593089Swyllys static KMF_RETURN
pk_list_keys(void * handle,KMF_ATTRIBUTE * attrlist,int numattr,char * label)2605221Swyllys pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr, char *label)
26117Sdinak {
2623089Swyllys 	KMF_RETURN rv;
2633089Swyllys 	KMF_KEY_HANDLE *keys;
2643089Swyllys 	uint32_t numkeys = 0;
2655051Swyllys 	KMF_KEYSTORE_TYPE kstype;
2663089Swyllys 
2675051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2685051Swyllys 	    &kstype, NULL);
2695051Swyllys 	if (rv != KMF_OK)
2705051Swyllys 		return (rv);
2715051Swyllys 
2725051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2735051Swyllys 	    &numkeys, sizeof (uint32_t));
2745051Swyllys 	numattr++;
2755051Swyllys 
2765051Swyllys 	rv = kmf_find_key(handle, numattr, attrlist);
2773089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
2783089Swyllys 		int i;
2795221Swyllys 		(void) printf(gettext("Found %d %s keys.\n"),
2805221Swyllys 		    numkeys, label);
2813089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
2825051Swyllys 		    sizeof (KMF_KEY_HANDLE));
2833089Swyllys 		if (keys == NULL)
2843089Swyllys 			return (KMF_ERR_MEMORY);
2853089Swyllys 		(void) memset(keys, 0, numkeys *
2865051Swyllys 		    sizeof (KMF_KEY_HANDLE));
28717Sdinak 
2885051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
2895051Swyllys 		    KMF_KEY_HANDLE_ATTR,
2905051Swyllys 		    keys, sizeof (KMF_KEY_HANDLE));
2915051Swyllys 		numattr++;
2925051Swyllys 
2935051Swyllys 		rv = kmf_find_key(handle, numattr, attrlist);
2943089Swyllys 		if (rv == KMF_OK)
2953089Swyllys 			pk_show_keys(handle, keys, numkeys);
2963089Swyllys 		for (i = 0; i < numkeys; i++)
2975051Swyllys 			kmf_free_kmf_key(handle, &keys[i]);
2983089Swyllys 		free(keys);
2993089Swyllys 	}
3003089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND &&
3015051Swyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
3023089Swyllys 		rv = KMF_OK;
3033089Swyllys 	return (rv);
3043089Swyllys }
30517Sdinak 
3063089Swyllys static KMF_RETURN
list_pk11_objects(KMF_HANDLE_T kmfhandle,char * token,int oclass,char * objlabel,KMF_BIGINT * serial,char * issuer,char * subject,char * dir,char * filename,KMF_CREDENTIAL * tokencred,KMF_CERT_VALIDITY find_criteria_flag)3073089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
3083089Swyllys 	char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject,
3093089Swyllys 	char *dir, char *filename, KMF_CREDENTIAL *tokencred,
3103089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
3113089Swyllys {
3123089Swyllys 	KMF_RETURN rv;
3135051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
3145051Swyllys 	int numattr = 0;
3156354Swyllys 	KMF_ATTRIBUTE attrlist[18];
3165051Swyllys 	boolean_t token_bool = B_TRUE;
3175051Swyllys 	boolean_t private = B_FALSE;
3185051Swyllys 	KMF_KEY_CLASS keyclass;
3195051Swyllys 	KMF_ENCODE_FORMAT format;
3206354Swyllys 	int auth = 0;
3216354Swyllys 	KMF_CREDENTIAL cred = {NULL, 0};
3223089Swyllys 
3233089Swyllys 	/*
32411973Swyllys.ingersoll@sun.com 	 * Symmetric keys and RSA/DSA/ECDSA private keys are always
3253089Swyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
3263089Swyllys 	 * make sure we search for them with it also set.
3273089Swyllys 	 */
3283089Swyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
3293089Swyllys 		oclass |= PK_PRIVATE_OBJ;
3303089Swyllys 
3313089Swyllys 	rv = select_token(kmfhandle, token,
3325051Swyllys 	    !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
3333089Swyllys 
3343089Swyllys 	if (rv != KMF_OK) {
33517Sdinak 		return (rv);
33617Sdinak 	}
33717Sdinak 
3386354Swyllys 	rv = token_auth_needed(kmfhandle, token, &auth);
3396354Swyllys 	if (rv != KMF_OK)
3406354Swyllys 		return (rv);
3416354Swyllys 
3426354Swyllys 	if (tokencred != NULL)
3436354Swyllys 		cred = *tokencred;
3446354Swyllys 
3453089Swyllys 	if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
3465051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
3475051Swyllys 		    &kstype, sizeof (kstype));
3485051Swyllys 		numattr++;
3495051Swyllys 
3505051Swyllys 		if (objlabel != NULL) {
3515051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3525051Swyllys 			    KMF_KEYLABEL_ATTR, objlabel,
3535051Swyllys 			    strlen(objlabel));
3545051Swyllys 			numattr++;
3555051Swyllys 		}
3563089Swyllys 
3575051Swyllys 		private = ((oclass & PK_PRIVATE_OBJ) > 0);
3585051Swyllys 
3595051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
3605051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
3615051Swyllys 		    sizeof (private));
3625051Swyllys 		numattr++;
3635051Swyllys 
3645051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
3655051Swyllys 		    KMF_TOKEN_BOOL_ATTR, &token_bool,
3665051Swyllys 		    sizeof (token_bool));
3675051Swyllys 		numattr++;
3683089Swyllys 
3693089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
3705051Swyllys 			int num = numattr;
3715051Swyllys 
3725051Swyllys 			keyclass = KMF_ASYM_PRI;
3735051Swyllys 			kmf_set_attr_at_index(attrlist, num,
3745051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
3755051Swyllys 			    sizeof (keyclass));
3765051Swyllys 			num++;
3775051Swyllys 
3785051Swyllys 			if (tokencred != NULL &&
3795051Swyllys 			    tokencred->credlen > 0) {
3805051Swyllys 				kmf_set_attr_at_index(attrlist, num,
3815051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
3825051Swyllys 				    sizeof (KMF_CREDENTIAL));
3835051Swyllys 				num++;
3845051Swyllys 			}
3853089Swyllys 
3863089Swyllys 			/* list asymmetric private keys */
3875221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
3885221Swyllys 			    "asymmetric private");
3893089Swyllys 		}
3903089Swyllys 
3913089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
3925051Swyllys 			int num = numattr;
3935051Swyllys 
3945051Swyllys 			keyclass = KMF_SYMMETRIC;
3955051Swyllys 			kmf_set_attr_at_index(attrlist, num,
3965051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
3975051Swyllys 			    sizeof (keyclass));
3985051Swyllys 			num++;
3995051Swyllys 
4005051Swyllys 			if (tokencred != NULL &&
4015051Swyllys 			    tokencred->credlen > 0) {
4025051Swyllys 				kmf_set_attr_at_index(attrlist, num,
4035051Swyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
4045051Swyllys 				    sizeof (KMF_CREDENTIAL));
4055051Swyllys 				num++;
4065051Swyllys 			}
4075051Swyllys 
4085051Swyllys 			format = KMF_FORMAT_RAWKEY;
4095051Swyllys 			kmf_set_attr_at_index(attrlist, num,
4105051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
4115051Swyllys 			    sizeof (format));
4125051Swyllys 			num++;
4133089Swyllys 
4143089Swyllys 			/* list symmetric keys */
4155221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
4165221Swyllys 			    "symmetric");
41717Sdinak 		}
4183089Swyllys 
4193089Swyllys 		if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
4205051Swyllys 			int num = numattr;
4215051Swyllys 
4226354Swyllys 			if (auth > 0 && (tokencred == NULL ||
4236354Swyllys 			    tokencred->cred == NULL) &&
4246354Swyllys 			    (cred.cred == NULL)) {
4256354Swyllys 				(void) get_token_password(kstype, token, &cred);
426*12585Swyllys.ingersoll@sun.com 				kmf_set_attr_at_index(attrlist, num,
4276354Swyllys 				    KMF_CREDENTIAL_ATTR,
4286354Swyllys 				    &cred, sizeof (KMF_CREDENTIAL));
429*12585Swyllys.ingersoll@sun.com 				num++;
4306354Swyllys 			}
4316354Swyllys 
4325128Swyllys 			private = B_FALSE;
4335051Swyllys 			keyclass = KMF_ASYM_PUB;
4345051Swyllys 			kmf_set_attr_at_index(attrlist, num,
4355051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
4365051Swyllys 			    sizeof (keyclass));
4375051Swyllys 			num++;
4383089Swyllys 
4393089Swyllys 			/* list asymmetric public keys (if any) */
4405221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
4415221Swyllys 			    "asymmetric public");
4423089Swyllys 		}
4433089Swyllys 
4443089Swyllys 		if (rv != KMF_OK)
4453089Swyllys 			return (rv);
4463089Swyllys 	}
4473089Swyllys 
4485051Swyllys 	numattr = 0;
4493089Swyllys 	if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
4505051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
4515051Swyllys 		    &kstype, sizeof (kstype));
4526354Swyllys 
4535051Swyllys 		numattr++;
4546354Swyllys 		if (auth > 0 && (cred.cred == NULL)) {
4556354Swyllys 			(void) get_token_password(kstype, token, &cred);
4566354Swyllys 		}
4576354Swyllys 
4586354Swyllys 		if (cred.cred != NULL) {
4596354Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4606354Swyllys 			    KMF_CREDENTIAL_ATTR,
4616354Swyllys 			    &cred, sizeof (KMF_CREDENTIAL));
4626354Swyllys 			numattr++;
4636354Swyllys 		}
4645051Swyllys 
4655051Swyllys 		if (objlabel != NULL) {
4665051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4675051Swyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
4685051Swyllys 			    strlen(objlabel));
4695051Swyllys 			numattr++;
4705051Swyllys 		}
4715051Swyllys 
4725051Swyllys 		if (issuer != NULL) {
4735051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4745051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
4755051Swyllys 			    strlen(issuer));
4765051Swyllys 			numattr++;
4775051Swyllys 		}
4783089Swyllys 
4795051Swyllys 		if (subject != NULL) {
4805051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4815051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
4825051Swyllys 			    strlen(subject));
4835051Swyllys 			numattr++;
4845051Swyllys 		}
4853089Swyllys 
4866354Swyllys 		if (serial != NULL && serial->val != NULL) {
4875051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
4885051Swyllys 			    KMF_BIGINT_ATTR, serial,
4895051Swyllys 			    sizeof (KMF_BIGINT));
4905051Swyllys 			numattr++;
4915051Swyllys 		}
4925051Swyllys 
4935051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
4945051Swyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
4955051Swyllys 		    sizeof (private));
4965051Swyllys 		numattr++;
4975051Swyllys 
4985051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
4995051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
5005051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
5015051Swyllys 		numattr++;
5025051Swyllys 
5035051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
5043089Swyllys 		if (rv != KMF_OK)
5053089Swyllys 			return (rv);
5063089Swyllys 	}
5073089Swyllys 
5085051Swyllys 	numattr = 0;
5095051Swyllys 	kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */
5103089Swyllys 	if (oclass & PK_CRL_OBJ) {
5115051Swyllys 		char *crldata = NULL;
5125051Swyllys 
5135051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5145051Swyllys 		    &kstype, sizeof (kstype));
5155051Swyllys 		numattr++;
5163089Swyllys 
5175051Swyllys 		if (dir != NULL) {
5185051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5195051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
5205051Swyllys 			numattr++;
5215051Swyllys 		}
5225051Swyllys 		if (filename != NULL) {
5235051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5245051Swyllys 			    KMF_CRL_FILENAME_ATTR,
5255051Swyllys 			    filename, strlen(filename));
5265051Swyllys 			numattr++;
5275051Swyllys 		}
5285051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
5295051Swyllys 		    &crldata, sizeof (char *));
5305051Swyllys 		numattr++;
5313089Swyllys 
5325051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
5335051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
5343089Swyllys 			(void) printf("%s\n", crldata);
5353089Swyllys 			free(crldata);
53617Sdinak 		}
53717Sdinak 	}
53817Sdinak 
5393089Swyllys 	return (rv);
5403089Swyllys }
5413089Swyllys 
5423089Swyllys static int
list_file_objects(KMF_HANDLE_T kmfhandle,int oclass,char * dir,char * filename,KMF_BIGINT * serial,char * issuer,char * subject,KMF_CERT_VALIDITY find_criteria_flag)5433089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
5443089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial,
5453089Swyllys 	char *issuer, char *subject,
5463089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
5473089Swyllys {
5485626Shylee 	KMF_RETURN rv = KMF_OK;
5495051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
5505051Swyllys 	int numattr = 0;
5515051Swyllys 	KMF_ATTRIBUTE attrlist[16];
5525051Swyllys 	KMF_KEY_CLASS keyclass;
5535051Swyllys 	KMF_ENCODE_FORMAT format;
5545051Swyllys 	char *defaultdir = ".";
5553089Swyllys 
5563089Swyllys 	if (oclass & PK_KEY_OBJ) {
5575051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5585051Swyllys 		    &kstype, sizeof (kstype));
5595051Swyllys 		numattr++;
5605051Swyllys 
5615051Swyllys 		if (dir == NULL && filename == NULL)
5625051Swyllys 			dir = defaultdir;
5635051Swyllys 
5645051Swyllys 		if (dir != NULL) {
5655051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5665051Swyllys 			    KMF_DIRPATH_ATTR, dir,
5675051Swyllys 			    strlen(dir));
5685051Swyllys 			numattr++;
5695051Swyllys 		}
5705051Swyllys 
5715051Swyllys 		if (filename != NULL) {
5725051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
5735051Swyllys 			    KMF_KEY_FILENAME_ATTR, filename,
5745051Swyllys 			    strlen(filename));
5755051Swyllys 			numattr++;
5765051Swyllys 		}
5775051Swyllys 
5783089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
5795051Swyllys 			int num = numattr;
5803089Swyllys 
5815051Swyllys 			keyclass = KMF_ASYM_PRI;
5825051Swyllys 			kmf_set_attr_at_index(attrlist, num,
5835051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
5845051Swyllys 			    sizeof (keyclass));
5855051Swyllys 			num++;
5865051Swyllys 
5875051Swyllys 			/* list asymmetric private keys */
5885221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
5895221Swyllys 			    "asymmetric private");
5903089Swyllys 		}
5913089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
5923089Swyllys 			rv = KMF_OK;
5933089Swyllys 
5943089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
5955051Swyllys 			int num = numattr;
5965051Swyllys 
5975051Swyllys 			keyclass = KMF_SYMMETRIC;
5985051Swyllys 			kmf_set_attr_at_index(attrlist, num,
5995051Swyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
6005051Swyllys 			    sizeof (keyclass));
6015051Swyllys 			num++;
6023089Swyllys 
6035051Swyllys 			format = KMF_FORMAT_RAWKEY;
6045051Swyllys 			kmf_set_attr_at_index(attrlist, num,
6055051Swyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
6065051Swyllys 			    sizeof (format));
6075051Swyllys 			num++;
6085051Swyllys 
6095051Swyllys 			/* list symmetric keys */
6105221Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
6115221Swyllys 			    "symmetric");
6123089Swyllys 		}
6133089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
6143089Swyllys 			rv = KMF_OK;
6153089Swyllys 		if (rv != KMF_OK)
6163089Swyllys 			return (rv);
61717Sdinak 	}
61817Sdinak 
6195051Swyllys 	numattr = 0;
6203089Swyllys 	if (oclass & PK_CERT_OBJ) {
6215051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
6225051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
6235051Swyllys 		    sizeof (kstype));
6245051Swyllys 		numattr++;
6255051Swyllys 
6265051Swyllys 		if (issuer != NULL) {
6275051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6285051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
6295051Swyllys 			    strlen(issuer));
6305051Swyllys 			numattr++;
6315051Swyllys 		}
6325051Swyllys 
6335051Swyllys 		if (subject != NULL) {
6345051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6355051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
6365051Swyllys 			    strlen(subject));
6375051Swyllys 			numattr++;
6385051Swyllys 		}
63917Sdinak 
6406051Swyllys 		if (serial != NULL && serial->val != NULL) {
6415051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6425051Swyllys 			    KMF_BIGINT_ATTR, serial,
6435051Swyllys 			    sizeof (KMF_BIGINT));
6445051Swyllys 			numattr++;
6455051Swyllys 		}
6465051Swyllys 
6475051Swyllys 		if (filename != NULL) {
6485051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6495051Swyllys 			    KMF_CERT_FILENAME_ATTR, filename,
6505051Swyllys 			    strlen(filename));
6515051Swyllys 			numattr++;
6525051Swyllys 		}
6535051Swyllys 
6545051Swyllys 		if (dir != NULL) {
6555051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6565051Swyllys 			    KMF_DIRPATH_ATTR, dir,
6575051Swyllys 			    strlen(dir));
6585051Swyllys 			numattr++;
6595051Swyllys 		}
6605051Swyllys 
6615051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
6625051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
6635051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
6645051Swyllys 		numattr++;
6655051Swyllys 
6665051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
6673089Swyllys 		if (rv != KMF_OK)
6683089Swyllys 			return (rv);
66917Sdinak 	}
67017Sdinak 
6715051Swyllys 	numattr = 0;
6723089Swyllys 	if (oclass & PK_CRL_OBJ) {
6735051Swyllys 		char *crldata = NULL;
6745051Swyllys 
6755051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
6765051Swyllys 		    &kstype, sizeof (kstype));
6775051Swyllys 		numattr++;
67817Sdinak 
6795051Swyllys 		if (dir != NULL) {
6805051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6815051Swyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
6825051Swyllys 			numattr++;
6835051Swyllys 		}
6845051Swyllys 		if (filename != NULL) {
6855051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
6865051Swyllys 			    KMF_CRL_FILENAME_ATTR,
6875051Swyllys 			    filename, strlen(filename));
6885051Swyllys 			numattr++;
6895051Swyllys 		}
6905051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
6915051Swyllys 		    &crldata, sizeof (char *));
6925051Swyllys 		numattr++;
69317Sdinak 
6945051Swyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
6955051Swyllys 		if (rv == KMF_OK && crldata != NULL) {
6963089Swyllys 			(void) printf("%s\n", crldata);
6973089Swyllys 			free(crldata);
6983089Swyllys 		}
69917Sdinak 	}
70017Sdinak 
70117Sdinak 	return (rv);
70217Sdinak }
70317Sdinak 
7043089Swyllys static int
list_nss_objects(KMF_HANDLE_T kmfhandle,int oclass,char * token_spec,char * dir,char * prefix,char * nickname,KMF_BIGINT * serial,char * issuer,char * subject,KMF_CREDENTIAL * tokencred,KMF_CERT_VALIDITY find_criteria_flag)7053089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
7063089Swyllys 	int oclass, char *token_spec, char *dir, char *prefix,
7073089Swyllys 	char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
7083089Swyllys 	KMF_CREDENTIAL *tokencred,
7093089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
71017Sdinak {
7113089Swyllys 	KMF_RETURN rv = KMF_OK;
7125051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
7135051Swyllys 	int numattr = 0;
7145051Swyllys 	KMF_ATTRIBUTE attrlist[16];
7155051Swyllys 	KMF_KEY_CLASS keyclass;
7165051Swyllys 	KMF_ENCODE_FORMAT format;
7173089Swyllys 
7183089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
7193089Swyllys 	if (rv != KMF_OK)
7203089Swyllys 		return (rv);
72117Sdinak 
7225051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
7235051Swyllys 	    &kstype, sizeof (kstype));
7245051Swyllys 	numattr++;
7255051Swyllys 
7263089Swyllys 	if (oclass & PK_KEY_OBJ) {
7275051Swyllys 		if (tokencred != NULL && tokencred->credlen > 0) {
7285051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7295051Swyllys 			    KMF_CREDENTIAL_ATTR, tokencred,
7305051Swyllys 			    sizeof (KMF_CREDENTIAL));
7315051Swyllys 			numattr++;
7325051Swyllys 		}
7335051Swyllys 
7345051Swyllys 		if (token_spec && strlen(token_spec)) {
7355051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7365051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
7375051Swyllys 			    strlen(token_spec));
7385051Swyllys 			numattr++;
7395051Swyllys 		}
7405051Swyllys 
7415051Swyllys 		if (nickname != NULL) {
7425051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
7435051Swyllys 			    KMF_KEYLABEL_ATTR, nickname,
7445051Swyllys 			    strlen(nickname));
7455051Swyllys 			numattr++;
7465051Swyllys 		}
74717Sdinak 	}
74817Sdinak 
7493089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
7505051Swyllys 		int num = numattr;
7515051Swyllys 
7525051Swyllys 		keyclass = KMF_ASYM_PRI;
7535051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7545051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7555051Swyllys 		    sizeof (keyclass));
7565051Swyllys 		num++;
7575051Swyllys 
7585051Swyllys 		/* list asymmetric private keys */
7595221Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num,
7605221Swyllys 		    "asymmetric private");
76117Sdinak 	}
7625051Swyllys 
7633089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
7645051Swyllys 		int num = numattr;
7655051Swyllys 
7665051Swyllys 		keyclass = KMF_SYMMETRIC;
7675051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7685051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7695051Swyllys 		    sizeof (keyclass));
7705051Swyllys 		num++;
7715051Swyllys 
7725051Swyllys 		format = KMF_FORMAT_RAWKEY;
7735051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7745051Swyllys 		    KMF_ENCODE_FORMAT_ATTR, &format,
7755051Swyllys 		    sizeof (format));
7765051Swyllys 		num++;
7775051Swyllys 
7785051Swyllys 		/* list symmetric keys */
7795221Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num, "symmetric");
7803089Swyllys 	}
7815051Swyllys 
7823089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
7835051Swyllys 		int num = numattr;
7845051Swyllys 
7855051Swyllys 		keyclass = KMF_ASYM_PUB;
7865051Swyllys 		kmf_set_attr_at_index(attrlist, num,
7875051Swyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
7885051Swyllys 		    sizeof (keyclass));
7895051Swyllys 		num++;
7905051Swyllys 
7915051Swyllys 		/* list asymmetric public keys */
7925221Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num,
7935221Swyllys 		    "asymmetric public");
79417Sdinak 	}
79517Sdinak 
7963089Swyllys 	/* If searching for public objects or certificates, find certs now */
7975051Swyllys 	numattr = 0;
7983089Swyllys 	if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
7995051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
8005051Swyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
8015051Swyllys 		    sizeof (kstype));
8025051Swyllys 		numattr++;
8035051Swyllys 
8045051Swyllys 		if (nickname != NULL) {
8055051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8065051Swyllys 			    KMF_CERT_LABEL_ATTR, nickname,
8075051Swyllys 			    strlen(nickname));
8085051Swyllys 			numattr++;
8095051Swyllys 		}
8105051Swyllys 
8115051Swyllys 		if (issuer != NULL) {
8125051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8135051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
8145051Swyllys 			    strlen(issuer));
8155051Swyllys 			numattr++;
8165051Swyllys 		}
81717Sdinak 
8185051Swyllys 		if (subject != NULL) {
8195051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8205051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
8215051Swyllys 			    strlen(subject));
8225051Swyllys 			numattr++;
8235051Swyllys 		}
8245051Swyllys 
8255051Swyllys 		if (serial != NULL) {
8265051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8275051Swyllys 			    KMF_BIGINT_ATTR, serial,
8285051Swyllys 			    sizeof (KMF_BIGINT));
8295051Swyllys 			numattr++;
8305051Swyllys 		}
83117Sdinak 
8325051Swyllys 		if (token_spec != NULL) {
8335051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8345051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
8355051Swyllys 			    strlen(token_spec));
8365051Swyllys 			numattr++;
8375051Swyllys 		}
8385051Swyllys 
8395051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
8405051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
8415051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
8425051Swyllys 		numattr++;
8435051Swyllys 
8445051Swyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
84517Sdinak 	}
84617Sdinak 
8475051Swyllys 	numattr = 0;
8483089Swyllys 	if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
8493089Swyllys 		int numcrls;
8505051Swyllys 
8515051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
8525051Swyllys 		    &kstype, sizeof (kstype));
8535051Swyllys 		numattr++;
8543089Swyllys 
8555051Swyllys 		if (token_spec != NULL) {
8565051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8575051Swyllys 			    KMF_TOKEN_LABEL_ATTR,
8585051Swyllys 			    token_spec, strlen(token_spec));
8595051Swyllys 			numattr++;
8605051Swyllys 		}
8615051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR,
8625051Swyllys 		    &numcrls, sizeof (int));
8635051Swyllys 		numattr++;
8643089Swyllys 
8655051Swyllys 		rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8663089Swyllys 		if (rv == KMF_OK) {
8673089Swyllys 			char **p;
8683089Swyllys 			if (numcrls == 0) {
8693089Swyllys 				(void) printf(gettext("No CRLs found in "
8705051Swyllys 				    "NSS keystore.\n"));
87117Sdinak 
8723089Swyllys 				return (KMF_OK);
8733089Swyllys 			}
8743089Swyllys 			p = malloc(numcrls * sizeof (char *));
8753089Swyllys 			if (p == NULL) {
8763089Swyllys 				return (KMF_ERR_MEMORY);
8773089Swyllys 			}
8783089Swyllys 			(void) memset(p, 0, numcrls * sizeof (char *));
8795051Swyllys 
8805051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
8815051Swyllys 			    KMF_CRL_NAMELIST_ATTR, p, sizeof (char *));
8825051Swyllys 			numattr++;
8835051Swyllys 			rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8843089Swyllys 			if (rv == KMF_OK) {
8853089Swyllys 				int i;
8863089Swyllys 				for (i = 0; i < numcrls; i++) {
8873089Swyllys 					(void) printf("%d. Name = %s\n",
8885051Swyllys 					    i + 1, p[i]);
8893089Swyllys 					free(p[i]);
8903089Swyllys 				}
8913089Swyllys 			}
8923089Swyllys 			free(p);
89317Sdinak 		}
89417Sdinak 	}
89517Sdinak 	return (rv);
89617Sdinak }
89717Sdinak 
89817Sdinak /*
89917Sdinak  * List token object.
90017Sdinak  */
90117Sdinak int
pk_list(int argc,char * argv[])90217Sdinak pk_list(int argc, char *argv[])
90317Sdinak {
90417Sdinak 	int			opt;
905864Sdinak 	extern int		optind_av;
906864Sdinak 	extern char		*optarg_av;
907864Sdinak 	char			*token_spec = NULL;
9083089Swyllys 	char			*subject = NULL;
9093089Swyllys 	char			*issuer = NULL;
9103089Swyllys 	char			*dir = NULL;
9113089Swyllys 	char			*prefix = NULL;
9123089Swyllys 	char			*filename = NULL;
9133089Swyllys 	char			*serstr = NULL;
9143089Swyllys 	KMF_BIGINT		serial = { NULL, 0 };
91517Sdinak 
9163089Swyllys 	char			*list_label = NULL;
9173089Swyllys 	int			oclass = 0;
9183089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
9193089Swyllys 	KMF_RETURN		rv = KMF_OK;
9203089Swyllys 	KMF_HANDLE_T		kmfhandle = NULL;
9213089Swyllys 	char			*find_criteria = NULL;
9223089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
9233089Swyllys 	KMF_CREDENTIAL		tokencred = {NULL, 0};
92417Sdinak 
92517Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
926864Sdinak 	while ((opt = getopt_av(argc, argv,
9275051Swyllys 	    "k:(keystore)t:(objtype)T:(token)d:(dir)"
9285051Swyllys 	    "p:(prefix)n:(nickname)S:(serial)s:(subject)"
9295051Swyllys 	    "c:(criteria)"
9305051Swyllys 	    "i:(issuer)l:(label)f:(infile)")) != EOF) {
9313089Swyllys 		if (EMPTYSTRING(optarg_av))
9323089Swyllys 			return (PK_ERR_USAGE);
93317Sdinak 		switch (opt) {
9343089Swyllys 			case 'k':
9353089Swyllys 				if (kstype != 0)
9363089Swyllys 					return (PK_ERR_USAGE);
9373089Swyllys 				kstype = KS2Int(optarg_av);
9383089Swyllys 				if (kstype == 0)
9393089Swyllys 					return (PK_ERR_USAGE);
9403089Swyllys 				break;
9413089Swyllys 			case 't':
9423089Swyllys 				if (oclass != 0)
9433089Swyllys 					return (PK_ERR_USAGE);
9443089Swyllys 				oclass = OT2Int(optarg_av);
9453089Swyllys 				if (oclass == -1)
9463089Swyllys 					return (PK_ERR_USAGE);
9473089Swyllys 				break;
9483089Swyllys 			case 's':
9493089Swyllys 				if (subject)
9503089Swyllys 					return (PK_ERR_USAGE);
9513089Swyllys 				subject = optarg_av;
9523089Swyllys 				break;
9533089Swyllys 			case 'i':
9543089Swyllys 				if (issuer)
9553089Swyllys 					return (PK_ERR_USAGE);
9563089Swyllys 				issuer = optarg_av;
9573089Swyllys 				break;
9583089Swyllys 			case 'd':
9593089Swyllys 				if (dir)
9603089Swyllys 					return (PK_ERR_USAGE);
9613089Swyllys 				dir = optarg_av;
9623089Swyllys 				break;
9633089Swyllys 			case 'p':
9643089Swyllys 				if (prefix)
9653089Swyllys 					return (PK_ERR_USAGE);
9663089Swyllys 				prefix = optarg_av;
9673089Swyllys 				break;
9683089Swyllys 			case 'S':
9693089Swyllys 				serstr = optarg_av;
9703089Swyllys 				break;
9713089Swyllys 			case 'f':
9723089Swyllys 				if (filename)
9733089Swyllys 					return (PK_ERR_USAGE);
9743089Swyllys 				filename = optarg_av;
9753089Swyllys 				break;
9763089Swyllys 			case 'T':	/* token specifier */
9773089Swyllys 				if (token_spec)
9783089Swyllys 					return (PK_ERR_USAGE);
9793089Swyllys 				token_spec = optarg_av;
9803089Swyllys 				break;
9813089Swyllys 			case 'n':
9823089Swyllys 			case 'l':	/* object with specific label */
9833089Swyllys 				if (list_label)
9843089Swyllys 					return (PK_ERR_USAGE);
9853089Swyllys 				list_label = optarg_av;
9863089Swyllys 				break;
9873089Swyllys 			case 'c':
9883089Swyllys 				find_criteria = optarg_av;
9893089Swyllys 				if (!strcasecmp(find_criteria, "valid"))
9903089Swyllys 					find_criteria_flag =
9913089Swyllys 					    KMF_NONEXPIRED_CERTS;
9923089Swyllys 				else if (!strcasecmp(find_criteria, "expired"))
9933089Swyllys 					find_criteria_flag = KMF_EXPIRED_CERTS;
9943089Swyllys 				else if (!strcasecmp(find_criteria, "both"))
9953089Swyllys 					find_criteria_flag = KMF_ALL_CERTS;
9963089Swyllys 				else
9973089Swyllys 					return (PK_ERR_USAGE);
9983089Swyllys 				break;
9993089Swyllys 			default:
1000864Sdinak 				return (PK_ERR_USAGE);
100117Sdinak 		}
100217Sdinak 	}
100317Sdinak 	/* No additional args allowed. */
1004864Sdinak 	argc -= optind_av;
1005864Sdinak 	argv += optind_av;
100617Sdinak 	if (argc)
100717Sdinak 		return (PK_ERR_USAGE);
100817Sdinak 
10095051Swyllys 	if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
10103089Swyllys 		/* Error message ? */
10113089Swyllys 		return (rv);
101217Sdinak 	}
101317Sdinak 
10143089Swyllys 	/* Assume keystore = PKCS#11 if not specified. */
10153089Swyllys 	if (kstype == 0)
10163089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
101717Sdinak 
10183089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
10193089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
10205051Swyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
10213089Swyllys 
10223089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
10235051Swyllys 		    "is only relevant if keystore=pkcs11\n"));
10243089Swyllys 		return (PK_ERR_USAGE);
102517Sdinak 	}
102617Sdinak 
10273089Swyllys 
10283089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
10293089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
10303089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
10313089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
103217Sdinak 	}
103317Sdinak 
10343089Swyllys 	if (serstr != NULL) {
10353089Swyllys 		uchar_t *bytes = NULL;
10363089Swyllys 		size_t bytelen;
10373089Swyllys 
10385051Swyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
10393089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
10403089Swyllys 			(void) fprintf(stderr, gettext("serial number "
10415051Swyllys 			    "must be specified as a hex number "
10425051Swyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
10433089Swyllys 			return (PK_ERR_USAGE);
10443089Swyllys 		}
10453089Swyllys 		serial.val = bytes;
10463089Swyllys 		serial.len = bytelen;
10475221Swyllys 		/* if objtype was not given, it must be for certs */
10485221Swyllys 		if (oclass == 0)
10495221Swyllys 			oclass = PK_CERT_OBJ;
105017Sdinak 	}
10515221Swyllys 	if (oclass == 0 && (issuer != NULL || subject != NULL))
10525221Swyllys 		oclass = PK_CERT_OBJ;
10535221Swyllys 
10545221Swyllys 	/* If no object class specified, list public objects. */
10555221Swyllys 	if (oclass == 0)
10565221Swyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ;
105717Sdinak 
10583089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
10595051Swyllys 	    kstype == KMF_KEYSTORE_NSS) &&
10605051Swyllys 	    (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
10613089Swyllys 
10623089Swyllys 		(void) get_token_password(kstype, token_spec,
10635051Swyllys 		    &tokencred);
10643089Swyllys 	}
10653089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN) {
10663089Swyllys 		rv = list_pk11_objects(kmfhandle, token_spec,
10675051Swyllys 		    oclass, list_label, &serial,
10685051Swyllys 		    issuer, subject, dir, filename,
10695051Swyllys 		    &tokencred, find_criteria_flag);
107017Sdinak 
10713089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS) {
10723089Swyllys 		if (dir == NULL)
10733089Swyllys 			dir = PK_DEFAULT_DIRECTORY;
10743089Swyllys 		rv = list_nss_objects(kmfhandle,
10755051Swyllys 		    oclass, token_spec, dir, prefix,
10765051Swyllys 		    list_label, &serial, issuer, subject,
10775051Swyllys 		    &tokencred, find_criteria_flag);
10783089Swyllys 
10793089Swyllys 	} else if (kstype == KMF_KEYSTORE_OPENSSL) {
10803089Swyllys 
10813089Swyllys 		rv = list_file_objects(kmfhandle,
10825051Swyllys 		    oclass, dir, filename,
10835051Swyllys 		    &serial, issuer, subject, find_criteria_flag);
108417Sdinak 	}
108517Sdinak 
10863089Swyllys 	if (rv != KMF_OK) {
10873089Swyllys 		display_error(kmfhandle, rv,
10885051Swyllys 		    gettext("Error listing objects"));
10893089Swyllys 	}
10903089Swyllys 
10913089Swyllys 	if (serial.val != NULL)
10923089Swyllys 		free(serial.val);
10933089Swyllys 
10943089Swyllys 	if (tokencred.cred != NULL)
10953089Swyllys 		free(tokencred.cred);
10963089Swyllys 
10975051Swyllys 	(void) kmf_finalize(kmfhandle);
10983089Swyllys 	return (rv);
109917Sdinak }
1100