xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/list.c (revision 3089:8ddeb2ace8aa)
117Sdinak /*
217Sdinak  * CDDL HEADER START
317Sdinak  *
417Sdinak  * The contents of this file are subject to the terms of the
5*3089Swyllys  * Common Development and Distribution License (the "License").
6*3089Swyllys  * 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*3089Swyllys  * Copyright 2006 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"
41*3089Swyllys 
42*3089Swyllys #include <kmfapi.h>
4317Sdinak 
44*3089Swyllys static void
45*3089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
4617Sdinak {
47*3089Swyllys 	int i;
48*3089Swyllys 	char *subject, *issuer, *serial, *id, *altname;
4917Sdinak 
50*3089Swyllys 	for (i = 0; i < num_certs; i++) {
51*3089Swyllys 		subject = NULL;
52*3089Swyllys 		issuer = NULL;
53*3089Swyllys 		serial = NULL;
54*3089Swyllys 		id = NULL;
55*3089Swyllys 		altname = NULL;
5617Sdinak 
57*3089Swyllys 		(void) fprintf(stdout,
58*3089Swyllys 			gettext("%d. (X.509 certificate)\n"), i + 1);
59*3089Swyllys 		if (certs[i].kmf_private.label != NULL)
60*3089Swyllys 			(void) fprintf(stdout, gettext("\t%s: %s\n"),
61*3089Swyllys 				(certs[i].kmf_private.keystore_type ==
62*3089Swyllys 				KMF_KEYSTORE_OPENSSL ?  "Filename" : "Label"),
63*3089Swyllys 				certs[i].kmf_private.label);
64*3089Swyllys 		if (KMF_GetCertIDString(&certs[i].certificate,
65*3089Swyllys 				&id) == KMF_OK)
66*3089Swyllys 			(void) fprintf(stdout, gettext("\tID: %s\n"), id);
67*3089Swyllys 		if (KMF_GetCertSubjectNameString(kmfhandle,
68*3089Swyllys 			&certs[i].certificate, &subject) == KMF_OK)
69*3089Swyllys 			(void) fprintf(stdout, gettext("\tSubject: %s\n"),
70*3089Swyllys 				subject);
71*3089Swyllys 		if (KMF_GetCertIssuerNameString(kmfhandle,
72*3089Swyllys 			&certs[i].certificate, &issuer) == KMF_OK)
73*3089Swyllys 			(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
74*3089Swyllys 				issuer);
75*3089Swyllys 		if (KMF_GetCertSerialNumberString(kmfhandle,
76*3089Swyllys 			&certs[i].certificate, &serial) == KMF_OK)
77*3089Swyllys 			(void) fprintf(stdout, gettext("\tSerial: %s\n"),
78*3089Swyllys 				serial);
79*3089Swyllys 
80*3089Swyllys 		if (KMF_GetCertExtensionString(kmfhandle,
81*3089Swyllys 			&certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
82*3089Swyllys 			&altname) == KMF_OK)  {
83*3089Swyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
84*3089Swyllys 				altname);
85*3089Swyllys 		}
86*3089Swyllys 
87*3089Swyllys 		KMF_FreeString(subject);
88*3089Swyllys 		KMF_FreeString(issuer);
89*3089Swyllys 		KMF_FreeString(serial);
90*3089Swyllys 		KMF_FreeString(id);
91*3089Swyllys 		KMF_FreeString(altname);
92*3089Swyllys 		(void) fprintf(stdout, "\n");
9317Sdinak 	}
9417Sdinak }
9517Sdinak 
96*3089Swyllys static char *
97*3089Swyllys describeKey(KMF_KEY_HANDLE *key)
9817Sdinak {
99*3089Swyllys 	if (key->keyclass == KMF_ASYM_PUB) {
100*3089Swyllys 		if (key->keyalg == KMF_RSA)
101*3089Swyllys 			return (gettext("RSA public key"));
102*3089Swyllys 		if (key->keyalg == KMF_DSA)
103*3089Swyllys 			return (gettext("DSA public key"));
10417Sdinak 	}
105*3089Swyllys 	if (key->keyclass == KMF_ASYM_PRI) {
106*3089Swyllys 		if (key->keyalg == KMF_RSA)
107*3089Swyllys 			return ("RSA private key");
108*3089Swyllys 		if (key->keyalg == KMF_DSA)
109*3089Swyllys 			return ("DSA private key");
11017Sdinak 	}
111*3089Swyllys 	if (key->keyclass == KMF_SYMMETRIC) {
112*3089Swyllys 		switch (key->keyalg) {
113*3089Swyllys 			case KMF_AES:
114*3089Swyllys 				return (gettext("AES"));
115*3089Swyllys 				break;
116*3089Swyllys 			case KMF_RC4:
117*3089Swyllys 				return (gettext("ARCFOUR"));
118*3089Swyllys 				break;
119*3089Swyllys 			case KMF_DES:
120*3089Swyllys 				return (gettext("DES"));
121*3089Swyllys 				break;
122*3089Swyllys 			case KMF_DES3:
123*3089Swyllys 				return (gettext("Triple-DES"));
124*3089Swyllys 				break;
125*3089Swyllys 			default:
126*3089Swyllys 				return (gettext("symmetric"));
127*3089Swyllys 				break;
12817Sdinak 		}
12917Sdinak 	}
13017Sdinak 
131*3089Swyllys 	return (gettext("unrecognized key object"));
132*3089Swyllys 
133*3089Swyllys }
13417Sdinak 
135*3089Swyllys static char *
136*3089Swyllys keybitstr(KMF_KEY_HANDLE *key)
137*3089Swyllys {
138*3089Swyllys 	KMF_RAW_SYM_KEY *rkey;
139*3089Swyllys 	char keystr[256];
140*3089Swyllys 	char *p;
14117Sdinak 
142*3089Swyllys 	if (key == NULL || (key->keyclass != KMF_SYMMETRIC))
143*3089Swyllys 		return ("");
14417Sdinak 
145*3089Swyllys 	rkey = (KMF_RAW_SYM_KEY *)key->keyp;
146*3089Swyllys 	(void) memset(keystr, 0, sizeof (keystr));
147*3089Swyllys 	if (rkey != NULL) {
148*3089Swyllys 		(void) snprintf(keystr, sizeof (keystr),
149*3089Swyllys 			" (%d bits)", rkey->keydata.len * 8);
150*3089Swyllys 		p = keystr;
151*3089Swyllys 	} else {
152*3089Swyllys 		return ("");
15317Sdinak 	}
15417Sdinak 
155*3089Swyllys 	return (p);
156*3089Swyllys }
157*3089Swyllys 
158*3089Swyllys static void
159*3089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
160*3089Swyllys {
161*3089Swyllys 	int i;
162*3089Swyllys 
163*3089Swyllys 	for (i = 0; i < numkeys; i++) {
164*3089Swyllys 		(void) fprintf(stdout, gettext("Key #%d - %s:  %s%s"),
165*3089Swyllys 			i+1, describeKey(&keys[i]),
166*3089Swyllys 			keys[i].keylabel ? keys[i].keylabel :
167*3089Swyllys 			gettext("No label"),
168*3089Swyllys 			(keys[i].keyclass == KMF_SYMMETRIC ?
169*3089Swyllys 			keybitstr(&keys[i]) : ""));
170*3089Swyllys 
171*3089Swyllys 		if (keys[i].keyclass == KMF_SYMMETRIC) {
172*3089Swyllys 			KMF_RETURN rv;
173*3089Swyllys 			KMF_RAW_SYM_KEY rkey;
174*3089Swyllys 			rv = KMF_GetSymKeyValue(handle, &keys[i],
175*3089Swyllys 				&rkey);
176*3089Swyllys 			if (rv == KMF_OK) {
177*3089Swyllys 				(void) fprintf(stdout, "\t %d bits",
178*3089Swyllys 					rkey.keydata.len * 8);
179*3089Swyllys 				KMF_FreeRawSymKey(&rkey);
180*3089Swyllys 			}
18117Sdinak 		}
182*3089Swyllys 		(void) fprintf(stdout, "\n");
18317Sdinak 	}
184*3089Swyllys }
18517Sdinak 
186*3089Swyllys /*
187*3089Swyllys  * Generic routine used by all "list cert" operations to find
188*3089Swyllys  * all matching certificates.
189*3089Swyllys  */
190*3089Swyllys static KMF_RETURN
191*3089Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *params)
192*3089Swyllys {
193*3089Swyllys 	KMF_RETURN rv = KMF_OK;
194*3089Swyllys 	KMF_X509_DER_CERT *certlist = NULL;
195*3089Swyllys 	uint32_t numcerts = 0;
19617Sdinak 
197*3089Swyllys 	numcerts = 0;
198*3089Swyllys 	rv = KMF_FindCert(kmfhandle, params, NULL, &numcerts);
199*3089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
200*3089Swyllys 		(void) printf(gettext("Found %d certificates.\n"),
201*3089Swyllys 			numcerts);
202*3089Swyllys 		certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
203*3089Swyllys 				sizeof (KMF_X509_DER_CERT));
204*3089Swyllys 		if (certlist == NULL)
205*3089Swyllys 			return (KMF_ERR_MEMORY);
206*3089Swyllys 		(void) memset(certlist, 0, numcerts *
207*3089Swyllys 			sizeof (KMF_X509_DER_CERT));
208*3089Swyllys 
209*3089Swyllys 		rv = KMF_FindCert(kmfhandle, params, certlist, &numcerts);
210*3089Swyllys 		if (rv == KMF_OK) {
211*3089Swyllys 			int i;
212*3089Swyllys 			(void) pk_show_certs(kmfhandle, certlist,
213*3089Swyllys 				numcerts);
214*3089Swyllys 			for (i = 0; i < numcerts; i++)
215*3089Swyllys 				KMF_FreeKMFCert(kmfhandle, &certlist[i]);
216*3089Swyllys 		}
217*3089Swyllys 		free(certlist);
21817Sdinak 	}
219*3089Swyllys 	if (rv == KMF_ERR_CERT_NOT_FOUND &&
220*3089Swyllys 		params->kstype != KMF_KEYSTORE_OPENSSL)
221*3089Swyllys 		rv = KMF_OK;
22217Sdinak 
22317Sdinak 	return (rv);
22417Sdinak }
22517Sdinak 
226*3089Swyllys static KMF_RETURN
227*3089Swyllys pk_list_keys(void *handle, KMF_FINDKEY_PARAMS *parms)
22817Sdinak {
229*3089Swyllys 	KMF_RETURN rv;
230*3089Swyllys 	KMF_KEY_HANDLE *keys;
231*3089Swyllys 	uint32_t numkeys = 0;
232*3089Swyllys 
233*3089Swyllys 	numkeys = 0;
234*3089Swyllys 	rv = KMF_FindKey(handle, parms, NULL, &numkeys);
235*3089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
236*3089Swyllys 		int i;
237*3089Swyllys 		(void) printf(gettext("Found %d keys.\n"), numkeys);
238*3089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
239*3089Swyllys 				sizeof (KMF_KEY_HANDLE));
240*3089Swyllys 		if (keys == NULL)
241*3089Swyllys 			return (KMF_ERR_MEMORY);
242*3089Swyllys 		(void) memset(keys, 0, numkeys *
243*3089Swyllys 			sizeof (KMF_KEY_HANDLE));
24417Sdinak 
245*3089Swyllys 		rv = KMF_FindKey(handle, parms, keys, &numkeys);
246*3089Swyllys 		if (rv == KMF_OK)
247*3089Swyllys 			pk_show_keys(handle, keys, numkeys);
248*3089Swyllys 		for (i = 0; i < numkeys; i++)
249*3089Swyllys 			KMF_FreeKMFKey(handle, &keys[i]);
250*3089Swyllys 		free(keys);
251*3089Swyllys 	}
252*3089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND &&
253*3089Swyllys 		parms->kstype != KMF_KEYSTORE_OPENSSL)
254*3089Swyllys 		rv = KMF_OK;
255*3089Swyllys 	return (rv);
256*3089Swyllys }
25717Sdinak 
258*3089Swyllys static KMF_RETURN
259*3089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
260*3089Swyllys 	char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject,
261*3089Swyllys 	char *dir, char *filename, KMF_CREDENTIAL *tokencred,
262*3089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
263*3089Swyllys {
264*3089Swyllys 	KMF_RETURN rv;
265*3089Swyllys 	KMF_LISTCRL_PARAMS lcrlargs;
266*3089Swyllys 
267*3089Swyllys 	/*
268*3089Swyllys 	 * Symmetric keys and RSA/DSA private keys are always
269*3089Swyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
270*3089Swyllys 	 * make sure we search for them with it also set.
271*3089Swyllys 	 */
272*3089Swyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
273*3089Swyllys 		oclass |= PK_PRIVATE_OBJ;
274*3089Swyllys 
275*3089Swyllys 	rv = select_token(kmfhandle, token,
276*3089Swyllys 		!(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
277*3089Swyllys 
278*3089Swyllys 	if (rv != KMF_OK) {
27917Sdinak 		return (rv);
28017Sdinak 	}
28117Sdinak 
282*3089Swyllys 	if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
283*3089Swyllys 		KMF_FINDKEY_PARAMS parms;
284*3089Swyllys 
285*3089Swyllys 		(void) memset(&parms, 0, sizeof (parms));
286*3089Swyllys 		parms.kstype = KMF_KEYSTORE_PK11TOKEN;
287*3089Swyllys 
288*3089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
289*3089Swyllys 			parms.keyclass = KMF_ASYM_PRI;
290*3089Swyllys 			parms.findLabel = objlabel;
291*3089Swyllys 			parms.cred = *tokencred;
292*3089Swyllys 			parms.pkcs11parms.private =
293*3089Swyllys 				((oclass & PK_PRIVATE_OBJ) > 0);
294*3089Swyllys 
295*3089Swyllys 			/* list asymmetric private keys */
296*3089Swyllys 			rv = pk_list_keys(kmfhandle, &parms);
297*3089Swyllys 		}
298*3089Swyllys 
299*3089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
300*3089Swyllys 			parms.keyclass = KMF_SYMMETRIC;
301*3089Swyllys 			parms.findLabel = objlabel;
302*3089Swyllys 			parms.cred = *tokencred;
303*3089Swyllys 			parms.format = KMF_FORMAT_RAWKEY;
304*3089Swyllys 			parms.pkcs11parms.private =
305*3089Swyllys 				((oclass & PK_PRIVATE_OBJ) > 0);
306*3089Swyllys 
307*3089Swyllys 			/* list symmetric keys */
308*3089Swyllys 			rv = pk_list_keys(kmfhandle, &parms);
30917Sdinak 		}
310*3089Swyllys 
311*3089Swyllys 		if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
312*3089Swyllys 			parms.keyclass = KMF_ASYM_PUB;
313*3089Swyllys 			parms.findLabel = objlabel;
314*3089Swyllys 			parms.pkcs11parms.private =
315*3089Swyllys 				((oclass & PK_PRIVATE_OBJ) > 0);
316*3089Swyllys 
317*3089Swyllys 			/* list asymmetric public keys (if any) */
318*3089Swyllys 			rv = pk_list_keys(kmfhandle, &parms);
319*3089Swyllys 		}
320*3089Swyllys 
321*3089Swyllys 		if (rv != KMF_OK)
322*3089Swyllys 			return (rv);
323*3089Swyllys 	}
324*3089Swyllys 
325*3089Swyllys 	if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
326*3089Swyllys 		KMF_FINDCERT_PARAMS parms;
327*3089Swyllys 
328*3089Swyllys 		(void) memset(&parms, 0, sizeof (parms));
329*3089Swyllys 		parms.kstype = KMF_KEYSTORE_PK11TOKEN;
330*3089Swyllys 		parms.certLabel = objlabel;
331*3089Swyllys 		parms.issuer = issuer;
332*3089Swyllys 		parms.subject = subject;
333*3089Swyllys 		parms.serial = serial;
334*3089Swyllys 		parms.pkcs11parms.private = FALSE;
335*3089Swyllys 		parms.find_cert_validity = find_criteria_flag;
336*3089Swyllys 
337*3089Swyllys 		rv = pk_find_certs(kmfhandle, &parms);
338*3089Swyllys 		if (rv != KMF_OK)
339*3089Swyllys 			return (rv);
340*3089Swyllys 	}
341*3089Swyllys 
342*3089Swyllys 	if (oclass & PK_CRL_OBJ) {
343*3089Swyllys 		char *crldata;
344*3089Swyllys 
345*3089Swyllys 		(void) memset(&lcrlargs, 0, sizeof (lcrlargs));
346*3089Swyllys 		lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
347*3089Swyllys 		lcrlargs.sslparms.dirpath = dir;
348*3089Swyllys 		lcrlargs.sslparms.crlfile = filename;
349*3089Swyllys 
350*3089Swyllys 		rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
351*3089Swyllys 		if (rv == KMF_OK) {
352*3089Swyllys 			(void) printf("%s\n", crldata);
353*3089Swyllys 			free(crldata);
35417Sdinak 		}
35517Sdinak 	}
35617Sdinak 
357*3089Swyllys 	return (rv);
358*3089Swyllys }
359*3089Swyllys 
360*3089Swyllys static int
361*3089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
362*3089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial,
363*3089Swyllys 	char *issuer, char *subject,
364*3089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
365*3089Swyllys {
366*3089Swyllys 	int rv;
367*3089Swyllys 	KMF_FINDCERT_PARAMS fcargs;
368*3089Swyllys 	KMF_FINDKEY_PARAMS fkargs;
369*3089Swyllys 	KMF_LISTCRL_PARAMS lcrlargs;
370*3089Swyllys 
371*3089Swyllys 	if (oclass & PK_KEY_OBJ) {
372*3089Swyllys 		(void) memset(&fkargs, 0, sizeof (fkargs));
373*3089Swyllys 		fkargs.kstype = KMF_KEYSTORE_OPENSSL;
374*3089Swyllys 		fkargs.sslparms.dirpath = dir;
375*3089Swyllys 		fkargs.sslparms.keyfile = filename;
376*3089Swyllys 		if (oclass & PK_PRIKEY_OBJ) {
377*3089Swyllys 			fkargs.keyclass = KMF_ASYM_PRI;
378*3089Swyllys 
379*3089Swyllys 			rv = pk_list_keys(kmfhandle, &fkargs);
380*3089Swyllys 		}
381*3089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
382*3089Swyllys 			rv = KMF_OK;
383*3089Swyllys 
384*3089Swyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
385*3089Swyllys 			fkargs.keyclass = KMF_SYMMETRIC;
386*3089Swyllys 			fkargs.format = KMF_FORMAT_RAWKEY;
387*3089Swyllys 
388*3089Swyllys 			rv = pk_list_keys(kmfhandle, &fkargs);
389*3089Swyllys 		}
390*3089Swyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
391*3089Swyllys 			rv = KMF_OK;
392*3089Swyllys 		if (rv != KMF_OK)
393*3089Swyllys 			return (rv);
39417Sdinak 	}
39517Sdinak 
396*3089Swyllys 	if (oclass & PK_CERT_OBJ) {
397*3089Swyllys 		(void) memset(&fcargs, 0, sizeof (fcargs));
398*3089Swyllys 		fcargs.kstype = KMF_KEYSTORE_OPENSSL;
399*3089Swyllys 		fcargs.certLabel = NULL;
400*3089Swyllys 		fcargs.issuer = issuer;
401*3089Swyllys 		fcargs.subject = subject;
402*3089Swyllys 		fcargs.serial = serial;
403*3089Swyllys 		fcargs.sslparms.dirpath = dir;
404*3089Swyllys 		fcargs.sslparms.certfile = filename;
405*3089Swyllys 		fcargs.find_cert_validity = find_criteria_flag;
40617Sdinak 
407*3089Swyllys 		rv = pk_find_certs(kmfhandle, &fcargs);
408*3089Swyllys 		if (rv != KMF_OK)
409*3089Swyllys 			return (rv);
41017Sdinak 	}
41117Sdinak 
412*3089Swyllys 	if (oclass & PK_CRL_OBJ) {
413*3089Swyllys 		char *crldata;
41417Sdinak 
415*3089Swyllys 		(void) memset(&lcrlargs, 0, sizeof (lcrlargs));
416*3089Swyllys 		lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
417*3089Swyllys 		lcrlargs.sslparms.dirpath = dir;
418*3089Swyllys 		lcrlargs.sslparms.crlfile = filename;
41917Sdinak 
420*3089Swyllys 		rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
421*3089Swyllys 		if (rv == KMF_OK) {
422*3089Swyllys 			(void) printf("%s\n", crldata);
423*3089Swyllys 			free(crldata);
424*3089Swyllys 		}
42517Sdinak 	}
42617Sdinak 
42717Sdinak 	return (rv);
42817Sdinak }
42917Sdinak 
430*3089Swyllys static int
431*3089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
432*3089Swyllys 	int oclass, char *token_spec, char *dir, char *prefix,
433*3089Swyllys 	char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
434*3089Swyllys 	KMF_CREDENTIAL *tokencred,
435*3089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
43617Sdinak {
437*3089Swyllys 	KMF_RETURN rv = KMF_OK;
438*3089Swyllys 	KMF_FINDKEY_PARAMS fkargs;
439*3089Swyllys 
440*3089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
441*3089Swyllys 	if (rv != KMF_OK)
442*3089Swyllys 		return (rv);
44317Sdinak 
444*3089Swyllys 	if (oclass & PK_KEY_OBJ) {
445*3089Swyllys 		(void) memset(&fkargs, 0, sizeof (fkargs));
446*3089Swyllys 		fkargs.kstype = KMF_KEYSTORE_NSS;
447*3089Swyllys 		fkargs.findLabel = nickname;
448*3089Swyllys 		fkargs.cred = *tokencred;
449*3089Swyllys 		fkargs.nssparms.slotlabel = token_spec;
45017Sdinak 	}
45117Sdinak 
452*3089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
453*3089Swyllys 		fkargs.keyclass = KMF_ASYM_PRI;
454*3089Swyllys 		rv = pk_list_keys(kmfhandle, &fkargs);
45517Sdinak 	}
456*3089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
457*3089Swyllys 		fkargs.keyclass = KMF_SYMMETRIC;
458*3089Swyllys 		fkargs.format = KMF_FORMAT_RAWKEY;
459*3089Swyllys 		rv = pk_list_keys(kmfhandle, &fkargs);
460*3089Swyllys 	}
461*3089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
462*3089Swyllys 		fkargs.keyclass = KMF_ASYM_PUB;
463*3089Swyllys 		rv = pk_list_keys(kmfhandle, &fkargs);
46417Sdinak 	}
46517Sdinak 
466*3089Swyllys 	/* If searching for public objects or certificates, find certs now */
467*3089Swyllys 	if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
468*3089Swyllys 		KMF_FINDCERT_PARAMS fcargs;
46917Sdinak 
470*3089Swyllys 		(void) memset(&fcargs, 0, sizeof (fcargs));
471*3089Swyllys 		fcargs.kstype = KMF_KEYSTORE_NSS;
472*3089Swyllys 		fcargs.certLabel = nickname;
473*3089Swyllys 		fcargs.issuer = issuer;
474*3089Swyllys 		fcargs.subject = subject;
475*3089Swyllys 		fcargs.serial = serial;
476*3089Swyllys 		fcargs.nssparms.slotlabel = token_spec;
477*3089Swyllys 		fcargs.find_cert_validity = find_criteria_flag;
47817Sdinak 
479*3089Swyllys 		rv = pk_find_certs(kmfhandle, &fcargs);
48017Sdinak 	}
48117Sdinak 
482*3089Swyllys 	if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
483*3089Swyllys 		int numcrls;
484*3089Swyllys 		KMF_FINDCRL_PARAMS fcrlargs;
485*3089Swyllys 
486*3089Swyllys 		(void) memset(&fcrlargs, 0, sizeof (fcrlargs));
487*3089Swyllys 		fcrlargs.kstype = KMF_KEYSTORE_NSS;
488*3089Swyllys 		fcrlargs.nssparms.slotlabel = token_spec;
489*3089Swyllys 
490*3089Swyllys 		rv = KMF_FindCRL(kmfhandle, &fcrlargs, NULL, &numcrls);
491*3089Swyllys 		if (rv == KMF_OK) {
492*3089Swyllys 			char **p;
493*3089Swyllys 			if (numcrls == 0) {
494*3089Swyllys 				(void) printf(gettext("No CRLs found in "
495*3089Swyllys 					"NSS keystore.\n"));
49617Sdinak 
497*3089Swyllys 				return (KMF_OK);
498*3089Swyllys 			}
499*3089Swyllys 			p = malloc(numcrls * sizeof (char *));
500*3089Swyllys 			if (p == NULL) {
501*3089Swyllys 				return (KMF_ERR_MEMORY);
502*3089Swyllys 			}
503*3089Swyllys 			(void) memset(p, 0, numcrls * sizeof (char *));
504*3089Swyllys 			rv = KMF_FindCRL(kmfhandle, &fcrlargs,
505*3089Swyllys 				p, &numcrls);
506*3089Swyllys 			if (rv == KMF_OK) {
507*3089Swyllys 				int i;
508*3089Swyllys 				for (i = 0; i < numcrls; i++) {
509*3089Swyllys 					(void) printf("%d. Name = %s\n",
510*3089Swyllys 						i + 1, p[i]);
511*3089Swyllys 					free(p[i]);
512*3089Swyllys 				}
513*3089Swyllys 			}
514*3089Swyllys 			free(p);
51517Sdinak 		}
51617Sdinak 	}
51717Sdinak 	return (rv);
51817Sdinak }
51917Sdinak 
52017Sdinak /*
52117Sdinak  * List token object.
52217Sdinak  */
52317Sdinak int
52417Sdinak pk_list(int argc, char *argv[])
52517Sdinak {
52617Sdinak 	int			opt;
527864Sdinak 	extern int		optind_av;
528864Sdinak 	extern char		*optarg_av;
529864Sdinak 	char			*token_spec = NULL;
530*3089Swyllys 	char			*subject = NULL;
531*3089Swyllys 	char			*issuer = NULL;
532*3089Swyllys 	char			*dir = NULL;
533*3089Swyllys 	char			*prefix = NULL;
534*3089Swyllys 	char			*filename = NULL;
535*3089Swyllys 	char			*serstr = NULL;
536*3089Swyllys 	KMF_BIGINT		serial = { NULL, 0 };
53717Sdinak 
538*3089Swyllys 	char			*list_label = NULL;
539*3089Swyllys 	int			oclass = 0;
540*3089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
541*3089Swyllys 	KMF_RETURN		rv = KMF_OK;
542*3089Swyllys 	KMF_HANDLE_T		kmfhandle = NULL;
543*3089Swyllys 	char			*find_criteria = NULL;
544*3089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
545*3089Swyllys 	KMF_CREDENTIAL		tokencred = {NULL, 0};
54617Sdinak 
54717Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
548864Sdinak 	while ((opt = getopt_av(argc, argv,
549*3089Swyllys 		"k:(keystore)t:(objtype)T:(token)d:(dir)"
550*3089Swyllys 		"p:(prefix)n:(nickname)S:(serial)s:(subject)"
551*3089Swyllys 		"c:(criteria)"
552*3089Swyllys 		"i:(issuer)l:(label)f:(infile)")) != EOF) {
553*3089Swyllys 		if (EMPTYSTRING(optarg_av))
554*3089Swyllys 			return (PK_ERR_USAGE);
55517Sdinak 		switch (opt) {
556*3089Swyllys 			case 'k':
557*3089Swyllys 				if (kstype != 0)
558*3089Swyllys 					return (PK_ERR_USAGE);
559*3089Swyllys 				kstype = KS2Int(optarg_av);
560*3089Swyllys 				if (kstype == 0)
561*3089Swyllys 					return (PK_ERR_USAGE);
562*3089Swyllys 				break;
563*3089Swyllys 			case 't':
564*3089Swyllys 				if (oclass != 0)
565*3089Swyllys 					return (PK_ERR_USAGE);
566*3089Swyllys 				oclass = OT2Int(optarg_av);
567*3089Swyllys 				if (oclass == -1)
568*3089Swyllys 					return (PK_ERR_USAGE);
569*3089Swyllys 				break;
570*3089Swyllys 			case 's':
571*3089Swyllys 				if (subject)
572*3089Swyllys 					return (PK_ERR_USAGE);
573*3089Swyllys 				subject = optarg_av;
574*3089Swyllys 				break;
575*3089Swyllys 			case 'i':
576*3089Swyllys 				if (issuer)
577*3089Swyllys 					return (PK_ERR_USAGE);
578*3089Swyllys 				issuer = optarg_av;
579*3089Swyllys 				break;
580*3089Swyllys 			case 'd':
581*3089Swyllys 				if (dir)
582*3089Swyllys 					return (PK_ERR_USAGE);
583*3089Swyllys 				dir = optarg_av;
584*3089Swyllys 				break;
585*3089Swyllys 			case 'p':
586*3089Swyllys 				if (prefix)
587*3089Swyllys 					return (PK_ERR_USAGE);
588*3089Swyllys 				prefix = optarg_av;
589*3089Swyllys 				break;
590*3089Swyllys 			case 'S':
591*3089Swyllys 				serstr = optarg_av;
592*3089Swyllys 				break;
593*3089Swyllys 			case 'f':
594*3089Swyllys 				if (filename)
595*3089Swyllys 					return (PK_ERR_USAGE);
596*3089Swyllys 				filename = optarg_av;
597*3089Swyllys 				break;
598*3089Swyllys 			case 'T':	/* token specifier */
599*3089Swyllys 				if (token_spec)
600*3089Swyllys 					return (PK_ERR_USAGE);
601*3089Swyllys 				token_spec = optarg_av;
602*3089Swyllys 				break;
603*3089Swyllys 			case 'n':
604*3089Swyllys 			case 'l':	/* object with specific label */
605*3089Swyllys 				if (list_label)
606*3089Swyllys 					return (PK_ERR_USAGE);
607*3089Swyllys 				list_label = optarg_av;
608*3089Swyllys 				break;
609*3089Swyllys 			case 'c':
610*3089Swyllys 				find_criteria = optarg_av;
611*3089Swyllys 				if (!strcasecmp(find_criteria, "valid"))
612*3089Swyllys 					find_criteria_flag =
613*3089Swyllys 					    KMF_NONEXPIRED_CERTS;
614*3089Swyllys 				else if (!strcasecmp(find_criteria, "expired"))
615*3089Swyllys 					find_criteria_flag = KMF_EXPIRED_CERTS;
616*3089Swyllys 				else if (!strcasecmp(find_criteria, "both"))
617*3089Swyllys 					find_criteria_flag = KMF_ALL_CERTS;
618*3089Swyllys 				else
619*3089Swyllys 					return (PK_ERR_USAGE);
620*3089Swyllys 				break;
621*3089Swyllys 			default:
622864Sdinak 				return (PK_ERR_USAGE);
62317Sdinak 		}
62417Sdinak 	}
62517Sdinak 	/* No additional args allowed. */
626864Sdinak 	argc -= optind_av;
627864Sdinak 	argv += optind_av;
62817Sdinak 	if (argc)
62917Sdinak 		return (PK_ERR_USAGE);
63017Sdinak 
631*3089Swyllys 	if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
632*3089Swyllys 		/* Error message ? */
633*3089Swyllys 		return (rv);
63417Sdinak 	}
63517Sdinak 
636*3089Swyllys 	/* Assume keystore = PKCS#11 if not specified. */
637*3089Swyllys 	if (kstype == 0)
638*3089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
63917Sdinak 
640*3089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
641*3089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
642*3089Swyllys 		kstype != KMF_KEYSTORE_PK11TOKEN) {
643*3089Swyllys 
644*3089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
645*3089Swyllys 			"is only relevant if keystore=pkcs11\n"));
646*3089Swyllys 		return (PK_ERR_USAGE);
64717Sdinak 	}
64817Sdinak 
649*3089Swyllys 	/* If no object class specified, list certificate objects. */
650*3089Swyllys 	if (oclass == 0)
651*3089Swyllys 		oclass = PK_CERT_OBJ;
652*3089Swyllys 
653*3089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
654*3089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
655*3089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
656*3089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
65717Sdinak 	}
65817Sdinak 
659*3089Swyllys 	if (serstr != NULL) {
660*3089Swyllys 		uchar_t *bytes = NULL;
661*3089Swyllys 		size_t bytelen;
662*3089Swyllys 
663*3089Swyllys 		rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
664*3089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
665*3089Swyllys 			(void) fprintf(stderr, gettext("serial number "
666*3089Swyllys 				"must be specified as a hex number "
667*3089Swyllys 				"(ex: 0x0102030405ffeeddee)\n"));
668*3089Swyllys 			return (PK_ERR_USAGE);
669*3089Swyllys 		}
670*3089Swyllys 		serial.val = bytes;
671*3089Swyllys 		serial.len = bytelen;
67217Sdinak 	}
67317Sdinak 
674*3089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
675*3089Swyllys 		kstype == KMF_KEYSTORE_NSS) &&
676*3089Swyllys 		(oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
677*3089Swyllys 
678*3089Swyllys 		(void) get_token_password(kstype, token_spec,
679*3089Swyllys 			&tokencred);
680*3089Swyllys 	}
681*3089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN) {
682*3089Swyllys 		rv = list_pk11_objects(kmfhandle, token_spec,
683*3089Swyllys 			oclass, list_label, &serial,
684*3089Swyllys 			issuer, subject, dir, filename,
685*3089Swyllys 			&tokencred, find_criteria_flag);
68617Sdinak 
687*3089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS) {
688*3089Swyllys 		if (dir == NULL)
689*3089Swyllys 			dir = PK_DEFAULT_DIRECTORY;
690*3089Swyllys 		rv = list_nss_objects(kmfhandle,
691*3089Swyllys 			oclass, token_spec, dir, prefix,
692*3089Swyllys 			list_label, &serial, issuer, subject,
693*3089Swyllys 			&tokencred, find_criteria_flag);
694*3089Swyllys 
695*3089Swyllys 	} else if (kstype == KMF_KEYSTORE_OPENSSL) {
696*3089Swyllys 
697*3089Swyllys 		rv = list_file_objects(kmfhandle,
698*3089Swyllys 			oclass, dir, filename,
699*3089Swyllys 			&serial, issuer, subject, find_criteria_flag);
70017Sdinak 	}
70117Sdinak 
702*3089Swyllys 	if (rv != KMF_OK) {
703*3089Swyllys 		display_error(kmfhandle, rv,
704*3089Swyllys 			gettext("Error listing objects"));
705*3089Swyllys 	}
706*3089Swyllys 
707*3089Swyllys 	if (serial.val != NULL)
708*3089Swyllys 		free(serial.val);
709*3089Swyllys 
710*3089Swyllys 	if (tokencred.cred != NULL)
711*3089Swyllys 		free(tokencred.cred);
712*3089Swyllys 
713*3089Swyllys 	(void) KMF_Finalize(kmfhandle);
714*3089Swyllys 	return (rv);
71517Sdinak }
716