xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/list.c (revision 3408:67ca9373b99e)
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*3408Swyllys  * 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;
4917Sdinak 
503089Swyllys 	for (i = 0; i < num_certs; i++) {
513089Swyllys 		subject = NULL;
523089Swyllys 		issuer = NULL;
533089Swyllys 		serial = NULL;
543089Swyllys 		id = NULL;
553089Swyllys 		altname = NULL;
5617Sdinak 
573089Swyllys 		(void) fprintf(stdout,
583089Swyllys 			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"),
613089Swyllys 				(certs[i].kmf_private.keystore_type ==
623089Swyllys 				KMF_KEYSTORE_OPENSSL ?  "Filename" : "Label"),
633089Swyllys 				certs[i].kmf_private.label);
643089Swyllys 		if (KMF_GetCertIDString(&certs[i].certificate,
653089Swyllys 				&id) == KMF_OK)
663089Swyllys 			(void) fprintf(stdout, gettext("\tID: %s\n"), id);
673089Swyllys 		if (KMF_GetCertSubjectNameString(kmfhandle,
683089Swyllys 			&certs[i].certificate, &subject) == KMF_OK)
693089Swyllys 			(void) fprintf(stdout, gettext("\tSubject: %s\n"),
703089Swyllys 				subject);
713089Swyllys 		if (KMF_GetCertIssuerNameString(kmfhandle,
723089Swyllys 			&certs[i].certificate, &issuer) == KMF_OK)
733089Swyllys 			(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
743089Swyllys 				issuer);
753089Swyllys 		if (KMF_GetCertSerialNumberString(kmfhandle,
763089Swyllys 			&certs[i].certificate, &serial) == KMF_OK)
773089Swyllys 			(void) fprintf(stdout, gettext("\tSerial: %s\n"),
783089Swyllys 				serial);
793089Swyllys 
803089Swyllys 		if (KMF_GetCertExtensionString(kmfhandle,
813089Swyllys 			&certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
823089Swyllys 			&altname) == KMF_OK)  {
833089Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
843089Swyllys 				altname);
853089Swyllys 		}
863089Swyllys 
873089Swyllys 		KMF_FreeString(subject);
883089Swyllys 		KMF_FreeString(issuer);
893089Swyllys 		KMF_FreeString(serial);
903089Swyllys 		KMF_FreeString(id);
913089Swyllys 		KMF_FreeString(altname);
923089Swyllys 		(void) fprintf(stdout, "\n");
9317Sdinak 	}
9417Sdinak }
9517Sdinak 
963089Swyllys static char *
973089Swyllys describeKey(KMF_KEY_HANDLE *key)
9817Sdinak {
993089Swyllys 	if (key->keyclass == KMF_ASYM_PUB) {
1003089Swyllys 		if (key->keyalg == KMF_RSA)
1013089Swyllys 			return (gettext("RSA public key"));
1023089Swyllys 		if (key->keyalg == KMF_DSA)
1033089Swyllys 			return (gettext("DSA public key"));
10417Sdinak 	}
1053089Swyllys 	if (key->keyclass == KMF_ASYM_PRI) {
1063089Swyllys 		if (key->keyalg == KMF_RSA)
1073089Swyllys 			return ("RSA private key");
1083089Swyllys 		if (key->keyalg == KMF_DSA)
1093089Swyllys 			return ("DSA private key");
11017Sdinak 	}
1113089Swyllys 	if (key->keyclass == KMF_SYMMETRIC) {
1123089Swyllys 		switch (key->keyalg) {
1133089Swyllys 			case KMF_AES:
1143089Swyllys 				return (gettext("AES"));
1153089Swyllys 				break;
1163089Swyllys 			case KMF_RC4:
1173089Swyllys 				return (gettext("ARCFOUR"));
1183089Swyllys 				break;
1193089Swyllys 			case KMF_DES:
1203089Swyllys 				return (gettext("DES"));
1213089Swyllys 				break;
1223089Swyllys 			case KMF_DES3:
1233089Swyllys 				return (gettext("Triple-DES"));
1243089Swyllys 				break;
1253089Swyllys 			default:
1263089Swyllys 				return (gettext("symmetric"));
1273089Swyllys 				break;
12817Sdinak 		}
12917Sdinak 	}
13017Sdinak 
1313089Swyllys 	return (gettext("unrecognized key object"));
1323089Swyllys 
1333089Swyllys }
13417Sdinak 
1353089Swyllys static char *
1363089Swyllys keybitstr(KMF_KEY_HANDLE *key)
1373089Swyllys {
1383089Swyllys 	KMF_RAW_SYM_KEY *rkey;
1393089Swyllys 	char keystr[256];
1403089Swyllys 	char *p;
14117Sdinak 
1423089Swyllys 	if (key == NULL || (key->keyclass != KMF_SYMMETRIC))
1433089Swyllys 		return ("");
14417Sdinak 
1453089Swyllys 	rkey = (KMF_RAW_SYM_KEY *)key->keyp;
1463089Swyllys 	(void) memset(keystr, 0, sizeof (keystr));
1473089Swyllys 	if (rkey != NULL) {
1483089Swyllys 		(void) snprintf(keystr, sizeof (keystr),
1493089Swyllys 			" (%d bits)", rkey->keydata.len * 8);
1503089Swyllys 		p = keystr;
1513089Swyllys 	} else {
1523089Swyllys 		return ("");
15317Sdinak 	}
15417Sdinak 
1553089Swyllys 	return (p);
1563089Swyllys }
1573089Swyllys 
1583089Swyllys static void
1593089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
1603089Swyllys {
1613089Swyllys 	int i;
1623089Swyllys 
1633089Swyllys 	for (i = 0; i < numkeys; i++) {
1643089Swyllys 		(void) fprintf(stdout, gettext("Key #%d - %s:  %s%s"),
1653089Swyllys 			i+1, describeKey(&keys[i]),
1663089Swyllys 			keys[i].keylabel ? keys[i].keylabel :
1673089Swyllys 			gettext("No label"),
1683089Swyllys 			(keys[i].keyclass == KMF_SYMMETRIC ?
1693089Swyllys 			keybitstr(&keys[i]) : ""));
1703089Swyllys 
1713089Swyllys 		if (keys[i].keyclass == KMF_SYMMETRIC) {
1723089Swyllys 			KMF_RETURN rv;
1733089Swyllys 			KMF_RAW_SYM_KEY rkey;
1743089Swyllys 			rv = KMF_GetSymKeyValue(handle, &keys[i],
1753089Swyllys 				&rkey);
1763089Swyllys 			if (rv == KMF_OK) {
1773089Swyllys 				(void) fprintf(stdout, "\t %d bits",
1783089Swyllys 					rkey.keydata.len * 8);
1793089Swyllys 				KMF_FreeRawSymKey(&rkey);
1803089Swyllys 			}
18117Sdinak 		}
1823089Swyllys 		(void) fprintf(stdout, "\n");
18317Sdinak 	}
1843089Swyllys }
18517Sdinak 
1863089Swyllys /*
1873089Swyllys  * Generic routine used by all "list cert" operations to find
1883089Swyllys  * all matching certificates.
1893089Swyllys  */
1903089Swyllys static KMF_RETURN
1913089Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *params)
1923089Swyllys {
1933089Swyllys 	KMF_RETURN rv = KMF_OK;
1943089Swyllys 	KMF_X509_DER_CERT *certlist = NULL;
1953089Swyllys 	uint32_t numcerts = 0;
19617Sdinak 
1973089Swyllys 	numcerts = 0;
1983089Swyllys 	rv = KMF_FindCert(kmfhandle, params, NULL, &numcerts);
1993089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
2003089Swyllys 		(void) printf(gettext("Found %d certificates.\n"),
2013089Swyllys 			numcerts);
2023089Swyllys 		certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
2033089Swyllys 				sizeof (KMF_X509_DER_CERT));
2043089Swyllys 		if (certlist == NULL)
2053089Swyllys 			return (KMF_ERR_MEMORY);
2063089Swyllys 		(void) memset(certlist, 0, numcerts *
2073089Swyllys 			sizeof (KMF_X509_DER_CERT));
2083089Swyllys 
2093089Swyllys 		rv = KMF_FindCert(kmfhandle, params, certlist, &numcerts);
2103089Swyllys 		if (rv == KMF_OK) {
2113089Swyllys 			int i;
2123089Swyllys 			(void) pk_show_certs(kmfhandle, certlist,
2133089Swyllys 				numcerts);
2143089Swyllys 			for (i = 0; i < numcerts; i++)
2153089Swyllys 				KMF_FreeKMFCert(kmfhandle, &certlist[i]);
2163089Swyllys 		}
2173089Swyllys 		free(certlist);
21817Sdinak 	}
2193089Swyllys 	if (rv == KMF_ERR_CERT_NOT_FOUND &&
2203089Swyllys 		params->kstype != KMF_KEYSTORE_OPENSSL)
2213089Swyllys 		rv = KMF_OK;
22217Sdinak 
22317Sdinak 	return (rv);
22417Sdinak }
22517Sdinak 
2263089Swyllys static KMF_RETURN
2273089Swyllys pk_list_keys(void *handle, KMF_FINDKEY_PARAMS *parms)
22817Sdinak {
2293089Swyllys 	KMF_RETURN rv;
2303089Swyllys 	KMF_KEY_HANDLE *keys;
2313089Swyllys 	uint32_t numkeys = 0;
2323089Swyllys 
2333089Swyllys 	numkeys = 0;
2343089Swyllys 	rv = KMF_FindKey(handle, parms, NULL, &numkeys);
2353089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
2363089Swyllys 		int i;
2373089Swyllys 		(void) printf(gettext("Found %d keys.\n"), numkeys);
2383089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
2393089Swyllys 				sizeof (KMF_KEY_HANDLE));
2403089Swyllys 		if (keys == NULL)
2413089Swyllys 			return (KMF_ERR_MEMORY);
2423089Swyllys 		(void) memset(keys, 0, numkeys *
2433089Swyllys 			sizeof (KMF_KEY_HANDLE));
24417Sdinak 
2453089Swyllys 		rv = KMF_FindKey(handle, parms, keys, &numkeys);
2463089Swyllys 		if (rv == KMF_OK)
2473089Swyllys 			pk_show_keys(handle, keys, numkeys);
2483089Swyllys 		for (i = 0; i < numkeys; i++)
2493089Swyllys 			KMF_FreeKMFKey(handle, &keys[i]);
2503089Swyllys 		free(keys);
2513089Swyllys 	}
2523089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND &&
2533089Swyllys 		parms->kstype != KMF_KEYSTORE_OPENSSL)
2543089Swyllys 		rv = KMF_OK;
2553089Swyllys 	return (rv);
2563089Swyllys }
25717Sdinak 
2583089Swyllys static KMF_RETURN
2593089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
2603089Swyllys 	char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject,
2613089Swyllys 	char *dir, char *filename, KMF_CREDENTIAL *tokencred,
2623089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
2633089Swyllys {
2643089Swyllys 	KMF_RETURN rv;
2653089Swyllys 	KMF_LISTCRL_PARAMS lcrlargs;
2663089Swyllys 
2673089Swyllys 	/*
2683089Swyllys 	 * Symmetric keys and RSA/DSA private keys are always
2693089Swyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
2703089Swyllys 	 * make sure we search for them with it also set.
2713089Swyllys 	 */
2723089Swyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
2733089Swyllys 		oclass |= PK_PRIVATE_OBJ;
2743089Swyllys 
2753089Swyllys 	rv = select_token(kmfhandle, token,
2763089Swyllys 		!(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
2773089Swyllys 
2783089Swyllys 	if (rv != KMF_OK) {
27917Sdinak 		return (rv);
28017Sdinak 	}
28117Sdinak 
2823089Swyllys 	if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
2833089Swyllys 		KMF_FINDKEY_PARAMS parms;
2843089Swyllys 
2853089Swyllys 		(void) memset(&parms, 0, sizeof (parms));
2863089Swyllys 		parms.kstype = KMF_KEYSTORE_PK11TOKEN;
2873089Swyllys 
2883089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
2893089Swyllys 			parms.keyclass = KMF_ASYM_PRI;
2903089Swyllys 			parms.findLabel = objlabel;
2913089Swyllys 			parms.cred = *tokencred;
2923089Swyllys 			parms.pkcs11parms.private =
2933089Swyllys 				((oclass & PK_PRIVATE_OBJ) > 0);
294*3408Swyllys 			parms.pkcs11parms.token = 1;
2953089Swyllys 
2963089Swyllys 			/* list asymmetric private keys */
2973089Swyllys 			rv = pk_list_keys(kmfhandle, &parms);
2983089Swyllys 		}
2993089Swyllys 
3003089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
3013089Swyllys 			parms.keyclass = KMF_SYMMETRIC;
3023089Swyllys 			parms.findLabel = objlabel;
3033089Swyllys 			parms.cred = *tokencred;
3043089Swyllys 			parms.format = KMF_FORMAT_RAWKEY;
3053089Swyllys 			parms.pkcs11parms.private =
3063089Swyllys 				((oclass & PK_PRIVATE_OBJ) > 0);
307*3408Swyllys 			parms.pkcs11parms.token = 1;
3083089Swyllys 
3093089Swyllys 			/* list symmetric keys */
3103089Swyllys 			rv = pk_list_keys(kmfhandle, &parms);
31117Sdinak 		}
3123089Swyllys 
3133089Swyllys 		if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
3143089Swyllys 			parms.keyclass = KMF_ASYM_PUB;
3153089Swyllys 			parms.findLabel = objlabel;
3163089Swyllys 			parms.pkcs11parms.private =
3173089Swyllys 				((oclass & PK_PRIVATE_OBJ) > 0);
318*3408Swyllys 			parms.pkcs11parms.token = 1;
3193089Swyllys 
3203089Swyllys 			/* list asymmetric public keys (if any) */
3213089Swyllys 			rv = pk_list_keys(kmfhandle, &parms);
3223089Swyllys 		}
3233089Swyllys 
3243089Swyllys 		if (rv != KMF_OK)
3253089Swyllys 			return (rv);
3263089Swyllys 	}
3273089Swyllys 
3283089Swyllys 	if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
3293089Swyllys 		KMF_FINDCERT_PARAMS parms;
3303089Swyllys 
3313089Swyllys 		(void) memset(&parms, 0, sizeof (parms));
3323089Swyllys 		parms.kstype = KMF_KEYSTORE_PK11TOKEN;
3333089Swyllys 		parms.certLabel = objlabel;
3343089Swyllys 		parms.issuer = issuer;
3353089Swyllys 		parms.subject = subject;
3363089Swyllys 		parms.serial = serial;
3373089Swyllys 		parms.pkcs11parms.private = FALSE;
3383089Swyllys 		parms.find_cert_validity = find_criteria_flag;
3393089Swyllys 
3403089Swyllys 		rv = pk_find_certs(kmfhandle, &parms);
3413089Swyllys 		if (rv != KMF_OK)
3423089Swyllys 			return (rv);
3433089Swyllys 	}
3443089Swyllys 
3453089Swyllys 	if (oclass & PK_CRL_OBJ) {
3463089Swyllys 		char *crldata;
3473089Swyllys 
3483089Swyllys 		(void) memset(&lcrlargs, 0, sizeof (lcrlargs));
3493089Swyllys 		lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
3503089Swyllys 		lcrlargs.sslparms.dirpath = dir;
3513089Swyllys 		lcrlargs.sslparms.crlfile = filename;
3523089Swyllys 
3533089Swyllys 		rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
3543089Swyllys 		if (rv == KMF_OK) {
3553089Swyllys 			(void) printf("%s\n", crldata);
3563089Swyllys 			free(crldata);
35717Sdinak 		}
35817Sdinak 	}
35917Sdinak 
3603089Swyllys 	return (rv);
3613089Swyllys }
3623089Swyllys 
3633089Swyllys static int
3643089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
3653089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial,
3663089Swyllys 	char *issuer, char *subject,
3673089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
3683089Swyllys {
3693089Swyllys 	int rv;
3703089Swyllys 	KMF_FINDCERT_PARAMS fcargs;
3713089Swyllys 	KMF_FINDKEY_PARAMS fkargs;
3723089Swyllys 	KMF_LISTCRL_PARAMS lcrlargs;
3733089Swyllys 
3743089Swyllys 	if (oclass & PK_KEY_OBJ) {
3753089Swyllys 		(void) memset(&fkargs, 0, sizeof (fkargs));
3763089Swyllys 		fkargs.kstype = KMF_KEYSTORE_OPENSSL;
3773089Swyllys 		fkargs.sslparms.dirpath = dir;
3783089Swyllys 		fkargs.sslparms.keyfile = filename;
3793089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
3803089Swyllys 			fkargs.keyclass = KMF_ASYM_PRI;
3813089Swyllys 
3823089Swyllys 			rv = pk_list_keys(kmfhandle, &fkargs);
3833089Swyllys 		}
3843089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
3853089Swyllys 			rv = KMF_OK;
3863089Swyllys 
3873089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
3883089Swyllys 			fkargs.keyclass = KMF_SYMMETRIC;
3893089Swyllys 			fkargs.format = KMF_FORMAT_RAWKEY;
3903089Swyllys 
3913089Swyllys 			rv = pk_list_keys(kmfhandle, &fkargs);
3923089Swyllys 		}
3933089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
3943089Swyllys 			rv = KMF_OK;
3953089Swyllys 		if (rv != KMF_OK)
3963089Swyllys 			return (rv);
39717Sdinak 	}
39817Sdinak 
3993089Swyllys 	if (oclass & PK_CERT_OBJ) {
4003089Swyllys 		(void) memset(&fcargs, 0, sizeof (fcargs));
4013089Swyllys 		fcargs.kstype = KMF_KEYSTORE_OPENSSL;
4023089Swyllys 		fcargs.certLabel = NULL;
4033089Swyllys 		fcargs.issuer = issuer;
4043089Swyllys 		fcargs.subject = subject;
4053089Swyllys 		fcargs.serial = serial;
4063089Swyllys 		fcargs.sslparms.dirpath = dir;
4073089Swyllys 		fcargs.sslparms.certfile = filename;
4083089Swyllys 		fcargs.find_cert_validity = find_criteria_flag;
40917Sdinak 
4103089Swyllys 		rv = pk_find_certs(kmfhandle, &fcargs);
4113089Swyllys 		if (rv != KMF_OK)
4123089Swyllys 			return (rv);
41317Sdinak 	}
41417Sdinak 
4153089Swyllys 	if (oclass & PK_CRL_OBJ) {
4163089Swyllys 		char *crldata;
41717Sdinak 
4183089Swyllys 		(void) memset(&lcrlargs, 0, sizeof (lcrlargs));
4193089Swyllys 		lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
4203089Swyllys 		lcrlargs.sslparms.dirpath = dir;
4213089Swyllys 		lcrlargs.sslparms.crlfile = filename;
42217Sdinak 
4233089Swyllys 		rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
4243089Swyllys 		if (rv == KMF_OK) {
4253089Swyllys 			(void) printf("%s\n", crldata);
4263089Swyllys 			free(crldata);
4273089Swyllys 		}
42817Sdinak 	}
42917Sdinak 
43017Sdinak 	return (rv);
43117Sdinak }
43217Sdinak 
4333089Swyllys static int
4343089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
4353089Swyllys 	int oclass, char *token_spec, char *dir, char *prefix,
4363089Swyllys 	char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
4373089Swyllys 	KMF_CREDENTIAL *tokencred,
4383089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
43917Sdinak {
4403089Swyllys 	KMF_RETURN rv = KMF_OK;
4413089Swyllys 	KMF_FINDKEY_PARAMS fkargs;
4423089Swyllys 
4433089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
4443089Swyllys 	if (rv != KMF_OK)
4453089Swyllys 		return (rv);
44617Sdinak 
4473089Swyllys 	if (oclass & PK_KEY_OBJ) {
4483089Swyllys 		(void) memset(&fkargs, 0, sizeof (fkargs));
4493089Swyllys 		fkargs.kstype = KMF_KEYSTORE_NSS;
4503089Swyllys 		fkargs.findLabel = nickname;
4513089Swyllys 		fkargs.cred = *tokencred;
4523089Swyllys 		fkargs.nssparms.slotlabel = token_spec;
45317Sdinak 	}
45417Sdinak 
4553089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
4563089Swyllys 		fkargs.keyclass = KMF_ASYM_PRI;
4573089Swyllys 		rv = pk_list_keys(kmfhandle, &fkargs);
45817Sdinak 	}
4593089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
4603089Swyllys 		fkargs.keyclass = KMF_SYMMETRIC;
4613089Swyllys 		fkargs.format = KMF_FORMAT_RAWKEY;
4623089Swyllys 		rv = pk_list_keys(kmfhandle, &fkargs);
4633089Swyllys 	}
4643089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
4653089Swyllys 		fkargs.keyclass = KMF_ASYM_PUB;
4663089Swyllys 		rv = pk_list_keys(kmfhandle, &fkargs);
46717Sdinak 	}
46817Sdinak 
4693089Swyllys 	/* If searching for public objects or certificates, find certs now */
4703089Swyllys 	if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
4713089Swyllys 		KMF_FINDCERT_PARAMS fcargs;
47217Sdinak 
4733089Swyllys 		(void) memset(&fcargs, 0, sizeof (fcargs));
4743089Swyllys 		fcargs.kstype = KMF_KEYSTORE_NSS;
4753089Swyllys 		fcargs.certLabel = nickname;
4763089Swyllys 		fcargs.issuer = issuer;
4773089Swyllys 		fcargs.subject = subject;
4783089Swyllys 		fcargs.serial = serial;
4793089Swyllys 		fcargs.nssparms.slotlabel = token_spec;
4803089Swyllys 		fcargs.find_cert_validity = find_criteria_flag;
48117Sdinak 
4823089Swyllys 		rv = pk_find_certs(kmfhandle, &fcargs);
48317Sdinak 	}
48417Sdinak 
4853089Swyllys 	if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
4863089Swyllys 		int numcrls;
4873089Swyllys 		KMF_FINDCRL_PARAMS fcrlargs;
4883089Swyllys 
4893089Swyllys 		(void) memset(&fcrlargs, 0, sizeof (fcrlargs));
4903089Swyllys 		fcrlargs.kstype = KMF_KEYSTORE_NSS;
4913089Swyllys 		fcrlargs.nssparms.slotlabel = token_spec;
4923089Swyllys 
4933089Swyllys 		rv = KMF_FindCRL(kmfhandle, &fcrlargs, NULL, &numcrls);
4943089Swyllys 		if (rv == KMF_OK) {
4953089Swyllys 			char **p;
4963089Swyllys 			if (numcrls == 0) {
4973089Swyllys 				(void) printf(gettext("No CRLs found in "
4983089Swyllys 					"NSS keystore.\n"));
49917Sdinak 
5003089Swyllys 				return (KMF_OK);
5013089Swyllys 			}
5023089Swyllys 			p = malloc(numcrls * sizeof (char *));
5033089Swyllys 			if (p == NULL) {
5043089Swyllys 				return (KMF_ERR_MEMORY);
5053089Swyllys 			}
5063089Swyllys 			(void) memset(p, 0, numcrls * sizeof (char *));
5073089Swyllys 			rv = KMF_FindCRL(kmfhandle, &fcrlargs,
5083089Swyllys 				p, &numcrls);
5093089Swyllys 			if (rv == KMF_OK) {
5103089Swyllys 				int i;
5113089Swyllys 				for (i = 0; i < numcrls; i++) {
5123089Swyllys 					(void) printf("%d. Name = %s\n",
5133089Swyllys 						i + 1, p[i]);
5143089Swyllys 					free(p[i]);
5153089Swyllys 				}
5163089Swyllys 			}
5173089Swyllys 			free(p);
51817Sdinak 		}
51917Sdinak 	}
52017Sdinak 	return (rv);
52117Sdinak }
52217Sdinak 
52317Sdinak /*
52417Sdinak  * List token object.
52517Sdinak  */
52617Sdinak int
52717Sdinak pk_list(int argc, char *argv[])
52817Sdinak {
52917Sdinak 	int			opt;
530864Sdinak 	extern int		optind_av;
531864Sdinak 	extern char		*optarg_av;
532864Sdinak 	char			*token_spec = NULL;
5333089Swyllys 	char			*subject = NULL;
5343089Swyllys 	char			*issuer = NULL;
5353089Swyllys 	char			*dir = NULL;
5363089Swyllys 	char			*prefix = NULL;
5373089Swyllys 	char			*filename = NULL;
5383089Swyllys 	char			*serstr = NULL;
5393089Swyllys 	KMF_BIGINT		serial = { NULL, 0 };
54017Sdinak 
5413089Swyllys 	char			*list_label = NULL;
5423089Swyllys 	int			oclass = 0;
5433089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
5443089Swyllys 	KMF_RETURN		rv = KMF_OK;
5453089Swyllys 	KMF_HANDLE_T		kmfhandle = NULL;
5463089Swyllys 	char			*find_criteria = NULL;
5473089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
5483089Swyllys 	KMF_CREDENTIAL		tokencred = {NULL, 0};
54917Sdinak 
55017Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
551864Sdinak 	while ((opt = getopt_av(argc, argv,
5523089Swyllys 		"k:(keystore)t:(objtype)T:(token)d:(dir)"
5533089Swyllys 		"p:(prefix)n:(nickname)S:(serial)s:(subject)"
5543089Swyllys 		"c:(criteria)"
5553089Swyllys 		"i:(issuer)l:(label)f:(infile)")) != EOF) {
5563089Swyllys 		if (EMPTYSTRING(optarg_av))
5573089Swyllys 			return (PK_ERR_USAGE);
55817Sdinak 		switch (opt) {
5593089Swyllys 			case 'k':
5603089Swyllys 				if (kstype != 0)
5613089Swyllys 					return (PK_ERR_USAGE);
5623089Swyllys 				kstype = KS2Int(optarg_av);
5633089Swyllys 				if (kstype == 0)
5643089Swyllys 					return (PK_ERR_USAGE);
5653089Swyllys 				break;
5663089Swyllys 			case 't':
5673089Swyllys 				if (oclass != 0)
5683089Swyllys 					return (PK_ERR_USAGE);
5693089Swyllys 				oclass = OT2Int(optarg_av);
5703089Swyllys 				if (oclass == -1)
5713089Swyllys 					return (PK_ERR_USAGE);
5723089Swyllys 				break;
5733089Swyllys 			case 's':
5743089Swyllys 				if (subject)
5753089Swyllys 					return (PK_ERR_USAGE);
5763089Swyllys 				subject = optarg_av;
5773089Swyllys 				break;
5783089Swyllys 			case 'i':
5793089Swyllys 				if (issuer)
5803089Swyllys 					return (PK_ERR_USAGE);
5813089Swyllys 				issuer = optarg_av;
5823089Swyllys 				break;
5833089Swyllys 			case 'd':
5843089Swyllys 				if (dir)
5853089Swyllys 					return (PK_ERR_USAGE);
5863089Swyllys 				dir = optarg_av;
5873089Swyllys 				break;
5883089Swyllys 			case 'p':
5893089Swyllys 				if (prefix)
5903089Swyllys 					return (PK_ERR_USAGE);
5913089Swyllys 				prefix = optarg_av;
5923089Swyllys 				break;
5933089Swyllys 			case 'S':
5943089Swyllys 				serstr = optarg_av;
5953089Swyllys 				break;
5963089Swyllys 			case 'f':
5973089Swyllys 				if (filename)
5983089Swyllys 					return (PK_ERR_USAGE);
5993089Swyllys 				filename = optarg_av;
6003089Swyllys 				break;
6013089Swyllys 			case 'T':	/* token specifier */
6023089Swyllys 				if (token_spec)
6033089Swyllys 					return (PK_ERR_USAGE);
6043089Swyllys 				token_spec = optarg_av;
6053089Swyllys 				break;
6063089Swyllys 			case 'n':
6073089Swyllys 			case 'l':	/* object with specific label */
6083089Swyllys 				if (list_label)
6093089Swyllys 					return (PK_ERR_USAGE);
6103089Swyllys 				list_label = optarg_av;
6113089Swyllys 				break;
6123089Swyllys 			case 'c':
6133089Swyllys 				find_criteria = optarg_av;
6143089Swyllys 				if (!strcasecmp(find_criteria, "valid"))
6153089Swyllys 					find_criteria_flag =
6163089Swyllys 					    KMF_NONEXPIRED_CERTS;
6173089Swyllys 				else if (!strcasecmp(find_criteria, "expired"))
6183089Swyllys 					find_criteria_flag = KMF_EXPIRED_CERTS;
6193089Swyllys 				else if (!strcasecmp(find_criteria, "both"))
6203089Swyllys 					find_criteria_flag = KMF_ALL_CERTS;
6213089Swyllys 				else
6223089Swyllys 					return (PK_ERR_USAGE);
6233089Swyllys 				break;
6243089Swyllys 			default:
625864Sdinak 				return (PK_ERR_USAGE);
62617Sdinak 		}
62717Sdinak 	}
62817Sdinak 	/* No additional args allowed. */
629864Sdinak 	argc -= optind_av;
630864Sdinak 	argv += optind_av;
63117Sdinak 	if (argc)
63217Sdinak 		return (PK_ERR_USAGE);
63317Sdinak 
6343089Swyllys 	if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
6353089Swyllys 		/* Error message ? */
6363089Swyllys 		return (rv);
63717Sdinak 	}
63817Sdinak 
6393089Swyllys 	/* Assume keystore = PKCS#11 if not specified. */
6403089Swyllys 	if (kstype == 0)
6413089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
64217Sdinak 
6433089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
6443089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
6453089Swyllys 		kstype != KMF_KEYSTORE_PK11TOKEN) {
6463089Swyllys 
6473089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
6483089Swyllys 			"is only relevant if keystore=pkcs11\n"));
6493089Swyllys 		return (PK_ERR_USAGE);
65017Sdinak 	}
65117Sdinak 
6523089Swyllys 	/* If no object class specified, list certificate objects. */
6533089Swyllys 	if (oclass == 0)
6543089Swyllys 		oclass = PK_CERT_OBJ;
6553089Swyllys 
6563089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
6573089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
6583089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
6593089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
66017Sdinak 	}
66117Sdinak 
6623089Swyllys 	if (serstr != NULL) {
6633089Swyllys 		uchar_t *bytes = NULL;
6643089Swyllys 		size_t bytelen;
6653089Swyllys 
6663089Swyllys 		rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
6673089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
6683089Swyllys 			(void) fprintf(stderr, gettext("serial number "
6693089Swyllys 				"must be specified as a hex number "
6703089Swyllys 				"(ex: 0x0102030405ffeeddee)\n"));
6713089Swyllys 			return (PK_ERR_USAGE);
6723089Swyllys 		}
6733089Swyllys 		serial.val = bytes;
6743089Swyllys 		serial.len = bytelen;
67517Sdinak 	}
67617Sdinak 
6773089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
6783089Swyllys 		kstype == KMF_KEYSTORE_NSS) &&
6793089Swyllys 		(oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
6803089Swyllys 
6813089Swyllys 		(void) get_token_password(kstype, token_spec,
6823089Swyllys 			&tokencred);
6833089Swyllys 	}
6843089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN) {
6853089Swyllys 		rv = list_pk11_objects(kmfhandle, token_spec,
6863089Swyllys 			oclass, list_label, &serial,
6873089Swyllys 			issuer, subject, dir, filename,
6883089Swyllys 			&tokencred, find_criteria_flag);
68917Sdinak 
6903089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS) {
6913089Swyllys 		if (dir == NULL)
6923089Swyllys 			dir = PK_DEFAULT_DIRECTORY;
6933089Swyllys 		rv = list_nss_objects(kmfhandle,
6943089Swyllys 			oclass, token_spec, dir, prefix,
6953089Swyllys 			list_label, &serial, issuer, subject,
6963089Swyllys 			&tokencred, find_criteria_flag);
6973089Swyllys 
6983089Swyllys 	} else if (kstype == KMF_KEYSTORE_OPENSSL) {
6993089Swyllys 
7003089Swyllys 		rv = list_file_objects(kmfhandle,
7013089Swyllys 			oclass, dir, filename,
7023089Swyllys 			&serial, issuer, subject, find_criteria_flag);
70317Sdinak 	}
70417Sdinak 
7053089Swyllys 	if (rv != KMF_OK) {
7063089Swyllys 		display_error(kmfhandle, rv,
7073089Swyllys 			gettext("Error listing objects"));
7083089Swyllys 	}
7093089Swyllys 
7103089Swyllys 	if (serial.val != NULL)
7113089Swyllys 		free(serial.val);
7123089Swyllys 
7133089Swyllys 	if (tokencred.cred != NULL)
7143089Swyllys 		free(tokencred.cred);
7153089Swyllys 
7163089Swyllys 	(void) KMF_Finalize(kmfhandle);
7173089Swyllys 	return (rv);
71817Sdinak }
719