xref: /titanic_50/usr/src/cmd/cmd-crypto/pktool/list.c (revision 6b35cb3cf158584a9408d44b9b6796564e8e1882)
17711facfSdinak /*
27711facfSdinak  * CDDL HEADER START
37711facfSdinak  *
47711facfSdinak  * The contents of this file are subject to the terms of the
599ebb4caSwyllys  * Common Development and Distribution License (the "License").
699ebb4caSwyllys  * You may not use this file except in compliance with the License.
77711facfSdinak  *
87711facfSdinak  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97711facfSdinak  * or http://www.opensolaris.org/os/licensing.
107711facfSdinak  * See the License for the specific language governing permissions
117711facfSdinak  * and limitations under the License.
127711facfSdinak  *
137711facfSdinak  * When distributing Covered Code, include this CDDL HEADER in each
147711facfSdinak  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157711facfSdinak  * If applicable, add the following below this CDDL HEADER, with the
167711facfSdinak  * fields enclosed by brackets "[]" replaced with your own identifying
177711facfSdinak  * information: Portions Copyright [yyyy] [name of copyright owner]
187711facfSdinak  *
197711facfSdinak  * CDDL HEADER END
207711facfSdinak  */
217711facfSdinak /*
22f2e5cf43SWyllys Ingersoll  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23*33f5ff17SMilan Jurik  * Copyright 2012 Milan Jurik. All rights reserved.
247711facfSdinak  */
257711facfSdinak 
267711facfSdinak /*
277711facfSdinak  * This file implements the token object list operation for this tool.
287711facfSdinak  * It loads the PKCS#11 modules, finds the object to list, lists it,
297711facfSdinak  * and cleans up.  User must be logged into the token to list private
307711facfSdinak  * objects.
317711facfSdinak  */
327711facfSdinak 
337711facfSdinak #include <stdio.h>
347711facfSdinak #include <errno.h>
357711facfSdinak #include <string.h>
367711facfSdinak #include <cryptoutil.h>
377711facfSdinak #include <security/cryptoki.h>
387711facfSdinak #include "common.h"
397711facfSdinak 
4099ebb4caSwyllys #include <kmfapi.h>
4199ebb4caSwyllys 
4299ebb4caSwyllys static void
pk_show_certs(KMF_HANDLE_T kmfhandle,KMF_X509_DER_CERT * certs,int num_certs)4399ebb4caSwyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
447711facfSdinak {
4599ebb4caSwyllys 	int i;
4699ebb4caSwyllys 	char *subject, *issuer, *serial, *id, *altname;
4730a5e8faSwyllys 	char *start, *end, *keyusage, *extkeyusage;
487711facfSdinak 
4999ebb4caSwyllys 	for (i = 0; i < num_certs; i++) {
5099ebb4caSwyllys 		subject = NULL;
5199ebb4caSwyllys 		issuer = NULL;
5299ebb4caSwyllys 		serial = NULL;
5399ebb4caSwyllys 		id = NULL;
5499ebb4caSwyllys 		altname = NULL;
5530a5e8faSwyllys 		start = end = NULL;
5630a5e8faSwyllys 		keyusage = extkeyusage = NULL;
577711facfSdinak 
5899ebb4caSwyllys 		(void) fprintf(stdout,
5999ebb4caSwyllys 		    gettext("%d. (X.509 certificate)\n"), i + 1);
6099ebb4caSwyllys 		if (certs[i].kmf_private.label != NULL)
6199ebb4caSwyllys 			(void) fprintf(stdout, gettext("\t%s: %s\n"),
6299ebb4caSwyllys 			    (certs[i].kmf_private.keystore_type ==
6399ebb4caSwyllys 			    KMF_KEYSTORE_OPENSSL ?  "Filename" : "Label"),
6499ebb4caSwyllys 			    certs[i].kmf_private.label);
6530a5e8faSwyllys 		if (kmf_get_cert_id_str(&certs[i].certificate,
6699ebb4caSwyllys 		    &id) == KMF_OK)
6799ebb4caSwyllys 			(void) fprintf(stdout, gettext("\tID: %s\n"), id);
6830a5e8faSwyllys 		if (kmf_get_cert_subject_str(kmfhandle,
6999ebb4caSwyllys 		    &certs[i].certificate, &subject) == KMF_OK)
7099ebb4caSwyllys 			(void) fprintf(stdout, gettext("\tSubject: %s\n"),
7199ebb4caSwyllys 			    subject);
7230a5e8faSwyllys 		if (kmf_get_cert_issuer_str(kmfhandle,
7399ebb4caSwyllys 		    &certs[i].certificate, &issuer) == KMF_OK)
7499ebb4caSwyllys 			(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
7599ebb4caSwyllys 			    issuer);
7630a5e8faSwyllys 		if (kmf_get_cert_start_date_str(kmfhandle,
7730a5e8faSwyllys 		    &certs[i].certificate, &start) == KMF_OK)
7830a5e8faSwyllys 			(void) fprintf(stdout, gettext("\tNot Before: %s\n"),
7930a5e8faSwyllys 			    start);
8030a5e8faSwyllys 		if (kmf_get_cert_end_date_str(kmfhandle,
8130a5e8faSwyllys 		    &certs[i].certificate, &end) == KMF_OK)
8230a5e8faSwyllys 			(void) fprintf(stdout, gettext("\tNot After: %s\n"),
8330a5e8faSwyllys 			    end);
8430a5e8faSwyllys 		if (kmf_get_cert_serial_str(kmfhandle,
8599ebb4caSwyllys 		    &certs[i].certificate, &serial) == KMF_OK)
8699ebb4caSwyllys 			(void) fprintf(stdout, gettext("\tSerial: %s\n"),
8799ebb4caSwyllys 			    serial);
8830a5e8faSwyllys 		if (kmf_get_cert_extn_str(kmfhandle,
8999ebb4caSwyllys 		    &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
9099ebb4caSwyllys 		    &altname) == KMF_OK)  {
9199ebb4caSwyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
9299ebb4caSwyllys 			    altname);
9399ebb4caSwyllys 		}
9430a5e8faSwyllys 		if (kmf_get_cert_extn_str(kmfhandle,
9530a5e8faSwyllys 		    &certs[i].certificate, KMF_X509_EXT_KEY_USAGE,
9630a5e8faSwyllys 		    &keyusage) == KMF_OK)  {
9730a5e8faSwyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
9830a5e8faSwyllys 			    keyusage);
9930a5e8faSwyllys 		}
10030a5e8faSwyllys 		if (kmf_get_cert_extn_str(kmfhandle,
10130a5e8faSwyllys 		    &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE,
10230a5e8faSwyllys 		    &extkeyusage) == KMF_OK)  {
10330a5e8faSwyllys 			(void) fprintf(stdout, gettext("\t%s\n"),
10430a5e8faSwyllys 			    extkeyusage);
10530a5e8faSwyllys 		}
10630a5e8faSwyllys 		kmf_free_str(subject);
10730a5e8faSwyllys 		kmf_free_str(issuer);
10830a5e8faSwyllys 		kmf_free_str(serial);
10930a5e8faSwyllys 		kmf_free_str(id);
11030a5e8faSwyllys 		kmf_free_str(altname);
11130a5e8faSwyllys 		kmf_free_str(keyusage);
11230a5e8faSwyllys 		kmf_free_str(extkeyusage);
11330a5e8faSwyllys 		kmf_free_str(start);
11430a5e8faSwyllys 		kmf_free_str(end);
11599ebb4caSwyllys 		(void) fprintf(stdout, "\n");
11699ebb4caSwyllys 	}
11799ebb4caSwyllys }
11899ebb4caSwyllys 
11999ebb4caSwyllys static char *
describeKey(KMF_KEY_HANDLE * key)12099ebb4caSwyllys describeKey(KMF_KEY_HANDLE *key)
12199ebb4caSwyllys {
12299ebb4caSwyllys 	if (key->keyclass == KMF_ASYM_PUB) {
12399ebb4caSwyllys 		if (key->keyalg == KMF_RSA)
12499ebb4caSwyllys 			return (gettext("RSA public key"));
12599ebb4caSwyllys 		if (key->keyalg == KMF_DSA)
12699ebb4caSwyllys 			return (gettext("DSA public key"));
127e65e5c2dSWyllys Ingersoll 		if (key->keyalg == KMF_ECDSA)
128e65e5c2dSWyllys Ingersoll 			return (gettext("ECDSA public key"));
12999ebb4caSwyllys 	}
13099ebb4caSwyllys 	if (key->keyclass == KMF_ASYM_PRI) {
13199ebb4caSwyllys 		if (key->keyalg == KMF_RSA)
132e65e5c2dSWyllys Ingersoll 			return (gettext("RSA private key"));
13399ebb4caSwyllys 		if (key->keyalg == KMF_DSA)
134e65e5c2dSWyllys Ingersoll 			return (gettext("DSA private key"));
135e65e5c2dSWyllys Ingersoll 		if (key->keyalg == KMF_ECDSA)
136e65e5c2dSWyllys Ingersoll 			return (gettext("ECDSA private key"));
13799ebb4caSwyllys 	}
13899ebb4caSwyllys 	if (key->keyclass == KMF_SYMMETRIC) {
13999ebb4caSwyllys 		switch (key->keyalg) {
14099ebb4caSwyllys 			case KMF_AES:
14199ebb4caSwyllys 				return (gettext("AES"));
14299ebb4caSwyllys 			case KMF_RC4:
14399ebb4caSwyllys 				return (gettext("ARCFOUR"));
14499ebb4caSwyllys 			case KMF_DES:
14599ebb4caSwyllys 				return (gettext("DES"));
14699ebb4caSwyllys 			case KMF_DES3:
14799ebb4caSwyllys 				return (gettext("Triple-DES"));
1487711facfSdinak 			default:
14999ebb4caSwyllys 				return (gettext("symmetric"));
1507711facfSdinak 		}
1517711facfSdinak 	}
1527711facfSdinak 
15399ebb4caSwyllys 	return (gettext("unrecognized key object"));
15499ebb4caSwyllys 
15599ebb4caSwyllys }
15699ebb4caSwyllys 
1577711facfSdinak 
15899ebb4caSwyllys static void
pk_show_keys(void * handle,KMF_KEY_HANDLE * keys,int numkeys)15999ebb4caSwyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
1607711facfSdinak {
1617711facfSdinak 	int i;
1627711facfSdinak 
16399ebb4caSwyllys 	for (i = 0; i < numkeys; i++) {
16469648175Shylee 		(void) fprintf(stdout, gettext("Key #%d - %s:  %s"),
16599ebb4caSwyllys 		    i+1, describeKey(&keys[i]),
16699ebb4caSwyllys 		    keys[i].keylabel ? keys[i].keylabel :
16769648175Shylee 		    gettext("No label"));
1687711facfSdinak 
16999ebb4caSwyllys 		if (keys[i].keyclass == KMF_SYMMETRIC) {
17099ebb4caSwyllys 			KMF_RETURN rv;
17199ebb4caSwyllys 			KMF_RAW_SYM_KEY rkey;
17269648175Shylee 
17330a5e8faSwyllys 			(void) memset(&rkey, 0, sizeof (rkey));
17430a5e8faSwyllys 			rv = kmf_get_sym_key_value(handle, &keys[i],
17599ebb4caSwyllys 			    &rkey);
17699ebb4caSwyllys 			if (rv == KMF_OK) {
17769648175Shylee 				(void) fprintf(stdout, " (%d bits)",
17899ebb4caSwyllys 				    rkey.keydata.len * 8);
17930a5e8faSwyllys 				kmf_free_bigint(&rkey.keydata);
18030a5e8faSwyllys 			} else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) {
18130a5e8faSwyllys 				if (rv == KMF_ERR_SENSITIVE_KEY) {
18230a5e8faSwyllys 					(void) fprintf(stdout, " (sensitive)");
18330a5e8faSwyllys 				} else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
18430a5e8faSwyllys 					(void) fprintf(stdout,
18530a5e8faSwyllys 					    " (non-extractable)");
18630a5e8faSwyllys 				} else {
18730a5e8faSwyllys 					char *err = NULL;
18830a5e8faSwyllys 					if (kmf_get_kmf_error_str(rv, &err) ==
18930a5e8faSwyllys 					    KMF_OK)
19030a5e8faSwyllys 						(void) fprintf(stdout,
19130a5e8faSwyllys 						    " (error: %s)", err);
19230a5e8faSwyllys 					if (err != NULL)
19330a5e8faSwyllys 						free(err);
19430a5e8faSwyllys 				}
1957711facfSdinak 			}
1967711facfSdinak 		}
19799ebb4caSwyllys 		(void) fprintf(stdout, "\n");
1987711facfSdinak 	}
1997711facfSdinak }
2007711facfSdinak 
2017711facfSdinak /*
20299ebb4caSwyllys  * Generic routine used by all "list cert" operations to find
20399ebb4caSwyllys  * all matching certificates.
2047711facfSdinak  */
20599ebb4caSwyllys static KMF_RETURN
pk_find_certs(KMF_HANDLE_T kmfhandle,KMF_ATTRIBUTE * attrlist,int numattr)20630a5e8faSwyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr)
2077711facfSdinak {
20899ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
20999ebb4caSwyllys 	KMF_X509_DER_CERT *certlist = NULL;
21099ebb4caSwyllys 	uint32_t numcerts = 0;
21130a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype;
21299ebb4caSwyllys 
21330a5e8faSwyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
21430a5e8faSwyllys 	    &kstype, NULL);
21530a5e8faSwyllys 	if (rv != KMF_OK)
21630a5e8faSwyllys 		return (rv);
21730a5e8faSwyllys 
21830a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
21930a5e8faSwyllys 	    &numcerts, sizeof (uint32_t));
22030a5e8faSwyllys 	numattr++;
22130a5e8faSwyllys 
22230a5e8faSwyllys 	rv = kmf_find_cert(kmfhandle, numattr, attrlist);
22399ebb4caSwyllys 	if (rv == KMF_OK && numcerts > 0) {
22499ebb4caSwyllys 		(void) printf(gettext("Found %d certificates.\n"),
22599ebb4caSwyllys 		    numcerts);
22699ebb4caSwyllys 		certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
22799ebb4caSwyllys 		    sizeof (KMF_X509_DER_CERT));
22899ebb4caSwyllys 		if (certlist == NULL)
22999ebb4caSwyllys 			return (KMF_ERR_MEMORY);
23099ebb4caSwyllys 		(void) memset(certlist, 0, numcerts *
23199ebb4caSwyllys 		    sizeof (KMF_X509_DER_CERT));
23299ebb4caSwyllys 
23330a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
23430a5e8faSwyllys 		    KMF_X509_DER_CERT_ATTR, certlist,
23530a5e8faSwyllys 		    sizeof (KMF_X509_DER_CERT));
23630a5e8faSwyllys 		numattr++;
23730a5e8faSwyllys 
23830a5e8faSwyllys 		rv = kmf_find_cert(kmfhandle, numattr, attrlist);
23999ebb4caSwyllys 		if (rv == KMF_OK) {
2407711facfSdinak 			int i;
24199ebb4caSwyllys 			(void) pk_show_certs(kmfhandle, certlist,
24299ebb4caSwyllys 			    numcerts);
24399ebb4caSwyllys 			for (i = 0; i < numcerts; i++)
24430a5e8faSwyllys 				kmf_free_kmf_cert(kmfhandle, &certlist[i]);
24599ebb4caSwyllys 		}
24699ebb4caSwyllys 		free(certlist);
24799ebb4caSwyllys 	}
24899ebb4caSwyllys 	if (rv == KMF_ERR_CERT_NOT_FOUND &&
24930a5e8faSwyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
25099ebb4caSwyllys 		rv = KMF_OK;
2517711facfSdinak 
2527711facfSdinak 	return (rv);
2537711facfSdinak }
2547711facfSdinak 
25599ebb4caSwyllys static KMF_RETURN
pk_list_keys(void * handle,KMF_ATTRIBUTE * attrlist,int numattr,char * label)2562cbed729Swyllys pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr, char *label)
2577711facfSdinak {
25899ebb4caSwyllys 	KMF_RETURN rv;
25999ebb4caSwyllys 	KMF_KEY_HANDLE *keys;
26099ebb4caSwyllys 	uint32_t numkeys = 0;
26130a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype;
26299ebb4caSwyllys 
26330a5e8faSwyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
26430a5e8faSwyllys 	    &kstype, NULL);
26530a5e8faSwyllys 	if (rv != KMF_OK)
26630a5e8faSwyllys 		return (rv);
26730a5e8faSwyllys 
26830a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
26930a5e8faSwyllys 	    &numkeys, sizeof (uint32_t));
27030a5e8faSwyllys 	numattr++;
27130a5e8faSwyllys 
27230a5e8faSwyllys 	rv = kmf_find_key(handle, numattr, attrlist);
27399ebb4caSwyllys 	if (rv == KMF_OK && numkeys > 0) {
2747711facfSdinak 		int i;
2752cbed729Swyllys 		(void) printf(gettext("Found %d %s keys.\n"),
2762cbed729Swyllys 		    numkeys, label);
27799ebb4caSwyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
27899ebb4caSwyllys 		    sizeof (KMF_KEY_HANDLE));
27999ebb4caSwyllys 		if (keys == NULL)
28099ebb4caSwyllys 			return (KMF_ERR_MEMORY);
28199ebb4caSwyllys 		(void) memset(keys, 0, numkeys *
28299ebb4caSwyllys 		    sizeof (KMF_KEY_HANDLE));
2837711facfSdinak 
28430a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
28530a5e8faSwyllys 		    KMF_KEY_HANDLE_ATTR,
28630a5e8faSwyllys 		    keys, sizeof (KMF_KEY_HANDLE));
28730a5e8faSwyllys 		numattr++;
28830a5e8faSwyllys 
28930a5e8faSwyllys 		rv = kmf_find_key(handle, numattr, attrlist);
29099ebb4caSwyllys 		if (rv == KMF_OK)
29199ebb4caSwyllys 			pk_show_keys(handle, keys, numkeys);
29299ebb4caSwyllys 		for (i = 0; i < numkeys; i++)
29330a5e8faSwyllys 			kmf_free_kmf_key(handle, &keys[i]);
29499ebb4caSwyllys 		free(keys);
29599ebb4caSwyllys 	}
29699ebb4caSwyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND &&
29730a5e8faSwyllys 	    kstype != KMF_KEYSTORE_OPENSSL)
29899ebb4caSwyllys 		rv = KMF_OK;
2997711facfSdinak 	return (rv);
3007711facfSdinak }
3017711facfSdinak 
30299ebb4caSwyllys 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)30399ebb4caSwyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
30499ebb4caSwyllys 	char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject,
30599ebb4caSwyllys 	char *dir, char *filename, KMF_CREDENTIAL *tokencred,
30699ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
30799ebb4caSwyllys {
30899ebb4caSwyllys 	KMF_RETURN rv;
30930a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
31030a5e8faSwyllys 	int numattr = 0;
311fa60c371Swyllys 	KMF_ATTRIBUTE attrlist[18];
31230a5e8faSwyllys 	boolean_t token_bool = B_TRUE;
31330a5e8faSwyllys 	boolean_t private = B_FALSE;
31430a5e8faSwyllys 	KMF_KEY_CLASS keyclass;
31530a5e8faSwyllys 	KMF_ENCODE_FORMAT format;
316fa60c371Swyllys 	int auth = 0;
317fa60c371Swyllys 	KMF_CREDENTIAL cred = { NULL, 0 };
3187711facfSdinak 
3197711facfSdinak 	/*
320e65e5c2dSWyllys Ingersoll 	 * Symmetric keys and RSA/DSA/ECDSA private keys are always
32199ebb4caSwyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
32299ebb4caSwyllys 	 * make sure we search for them with it also set.
3237711facfSdinak 	 */
32499ebb4caSwyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
32599ebb4caSwyllys 		oclass |= PK_PRIVATE_OBJ;
3267711facfSdinak 
32799ebb4caSwyllys 	rv = select_token(kmfhandle, token,
32899ebb4caSwyllys 	    !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
3297711facfSdinak 
33099ebb4caSwyllys 	if (rv != KMF_OK) {
33199ebb4caSwyllys 		return (rv);
3327711facfSdinak 	}
3337711facfSdinak 
334fa60c371Swyllys 	rv = token_auth_needed(kmfhandle, token, &auth);
335fa60c371Swyllys 	if (rv != KMF_OK)
336fa60c371Swyllys 		return (rv);
337fa60c371Swyllys 
338fa60c371Swyllys 	if (tokencred != NULL)
339fa60c371Swyllys 		cred = *tokencred;
340fa60c371Swyllys 
34199ebb4caSwyllys 	if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
34230a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
34330a5e8faSwyllys 		    &kstype, sizeof (kstype));
34430a5e8faSwyllys 		numattr++;
34599ebb4caSwyllys 
34630a5e8faSwyllys 		if (objlabel != NULL) {
34730a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
34830a5e8faSwyllys 			    KMF_KEYLABEL_ATTR, objlabel,
34930a5e8faSwyllys 			    strlen(objlabel));
35030a5e8faSwyllys 			numattr++;
35130a5e8faSwyllys 		}
35230a5e8faSwyllys 
35330a5e8faSwyllys 		private = ((oclass & PK_PRIVATE_OBJ) > 0);
35430a5e8faSwyllys 
35530a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
35630a5e8faSwyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
35730a5e8faSwyllys 		    sizeof (private));
35830a5e8faSwyllys 		numattr++;
35930a5e8faSwyllys 
36030a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
36130a5e8faSwyllys 		    KMF_TOKEN_BOOL_ATTR, &token_bool,
36230a5e8faSwyllys 		    sizeof (token_bool));
36330a5e8faSwyllys 		numattr++;
36499ebb4caSwyllys 
36599ebb4caSwyllys 		if (oclass & PK_PRIKEY_OBJ) {
36630a5e8faSwyllys 			int num = numattr;
36730a5e8faSwyllys 
36830a5e8faSwyllys 			keyclass = KMF_ASYM_PRI;
36930a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, num,
37030a5e8faSwyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
37130a5e8faSwyllys 			    sizeof (keyclass));
37230a5e8faSwyllys 			num++;
37330a5e8faSwyllys 
37430a5e8faSwyllys 			if (tokencred != NULL &&
37530a5e8faSwyllys 			    tokencred->credlen > 0) {
37630a5e8faSwyllys 				kmf_set_attr_at_index(attrlist, num,
37730a5e8faSwyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
37830a5e8faSwyllys 				    sizeof (KMF_CREDENTIAL));
37930a5e8faSwyllys 				num++;
38030a5e8faSwyllys 			}
38199ebb4caSwyllys 
38299ebb4caSwyllys 			/* list asymmetric private keys */
3832cbed729Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
3842cbed729Swyllys 			    "asymmetric private");
3857711facfSdinak 		}
3867711facfSdinak 
38799ebb4caSwyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
38830a5e8faSwyllys 			int num = numattr;
38930a5e8faSwyllys 
39030a5e8faSwyllys 			keyclass = KMF_SYMMETRIC;
39130a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, num,
39230a5e8faSwyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
39330a5e8faSwyllys 			    sizeof (keyclass));
39430a5e8faSwyllys 			num++;
39530a5e8faSwyllys 
39630a5e8faSwyllys 			if (tokencred != NULL &&
39730a5e8faSwyllys 			    tokencred->credlen > 0) {
39830a5e8faSwyllys 				kmf_set_attr_at_index(attrlist, num,
39930a5e8faSwyllys 				    KMF_CREDENTIAL_ATTR, tokencred,
40030a5e8faSwyllys 				    sizeof (KMF_CREDENTIAL));
40130a5e8faSwyllys 				num++;
40230a5e8faSwyllys 			}
40330a5e8faSwyllys 
40430a5e8faSwyllys 			format = KMF_FORMAT_RAWKEY;
40530a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, num,
40630a5e8faSwyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
40730a5e8faSwyllys 			    sizeof (format));
40830a5e8faSwyllys 			num++;
40999ebb4caSwyllys 
41099ebb4caSwyllys 			/* list symmetric keys */
4112cbed729Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
4122cbed729Swyllys 			    "symmetric");
4137711facfSdinak 		}
4147711facfSdinak 
41599ebb4caSwyllys 		if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
41630a5e8faSwyllys 			int num = numattr;
41730a5e8faSwyllys 
418fa60c371Swyllys 			if (auth > 0 && (tokencred == NULL ||
419fa60c371Swyllys 			    tokencred->cred == NULL) &&
420fa60c371Swyllys 			    (cred.cred == NULL)) {
421fa60c371Swyllys 				(void) get_token_password(kstype, token, &cred);
422f2e5cf43SWyllys Ingersoll 				kmf_set_attr_at_index(attrlist, num,
423fa60c371Swyllys 				    KMF_CREDENTIAL_ATTR,
424fa60c371Swyllys 				    &cred, sizeof (KMF_CREDENTIAL));
425f2e5cf43SWyllys Ingersoll 				num++;
426fa60c371Swyllys 			}
427fa60c371Swyllys 
4284ba70ed0Swyllys 			private = B_FALSE;
42930a5e8faSwyllys 			keyclass = KMF_ASYM_PUB;
43030a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, num,
43130a5e8faSwyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
43230a5e8faSwyllys 			    sizeof (keyclass));
43330a5e8faSwyllys 			num++;
43499ebb4caSwyllys 
43599ebb4caSwyllys 			/* list asymmetric public keys (if any) */
4362cbed729Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
4372cbed729Swyllys 			    "asymmetric public");
4387711facfSdinak 		}
4397711facfSdinak 
44099ebb4caSwyllys 		if (rv != KMF_OK)
44199ebb4caSwyllys 			return (rv);
4427711facfSdinak 	}
4437711facfSdinak 
44430a5e8faSwyllys 	numattr = 0;
44599ebb4caSwyllys 	if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
44630a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
44730a5e8faSwyllys 		    &kstype, sizeof (kstype));
448fa60c371Swyllys 
44930a5e8faSwyllys 		numattr++;
450fa60c371Swyllys 		if (auth > 0 && (cred.cred == NULL)) {
451fa60c371Swyllys 			(void) get_token_password(kstype, token, &cred);
452fa60c371Swyllys 		}
453fa60c371Swyllys 
454fa60c371Swyllys 		if (cred.cred != NULL) {
455fa60c371Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
456fa60c371Swyllys 			    KMF_CREDENTIAL_ATTR,
457fa60c371Swyllys 			    &cred, sizeof (KMF_CREDENTIAL));
458fa60c371Swyllys 			numattr++;
459fa60c371Swyllys 		}
46099ebb4caSwyllys 
46130a5e8faSwyllys 		if (objlabel != NULL) {
46230a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
46330a5e8faSwyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
46430a5e8faSwyllys 			    strlen(objlabel));
46530a5e8faSwyllys 			numattr++;
46630a5e8faSwyllys 		}
46799ebb4caSwyllys 
46830a5e8faSwyllys 		if (issuer != NULL) {
46930a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
47030a5e8faSwyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
47130a5e8faSwyllys 			    strlen(issuer));
47230a5e8faSwyllys 			numattr++;
47330a5e8faSwyllys 		}
47430a5e8faSwyllys 
47530a5e8faSwyllys 		if (subject != NULL) {
47630a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
47730a5e8faSwyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
47830a5e8faSwyllys 			    strlen(subject));
47930a5e8faSwyllys 			numattr++;
48030a5e8faSwyllys 		}
48130a5e8faSwyllys 
482fa60c371Swyllys 		if (serial != NULL && serial->val != NULL) {
48330a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
48430a5e8faSwyllys 			    KMF_BIGINT_ATTR, serial,
48530a5e8faSwyllys 			    sizeof (KMF_BIGINT));
48630a5e8faSwyllys 			numattr++;
48730a5e8faSwyllys 		}
48830a5e8faSwyllys 
48930a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
49030a5e8faSwyllys 		    KMF_PRIVATE_BOOL_ATTR, &private,
49130a5e8faSwyllys 		    sizeof (private));
49230a5e8faSwyllys 		numattr++;
49330a5e8faSwyllys 
49430a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
49530a5e8faSwyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
49630a5e8faSwyllys 		    sizeof (KMF_CERT_VALIDITY));
49730a5e8faSwyllys 		numattr++;
49830a5e8faSwyllys 
49930a5e8faSwyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
50099ebb4caSwyllys 		if (rv != KMF_OK)
50199ebb4caSwyllys 			return (rv);
50299ebb4caSwyllys 	}
50399ebb4caSwyllys 
50430a5e8faSwyllys 	numattr = 0;
50530a5e8faSwyllys 	kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */
50699ebb4caSwyllys 	if (oclass & PK_CRL_OBJ) {
50730a5e8faSwyllys 		char *crldata = NULL;
50899ebb4caSwyllys 
50930a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
51030a5e8faSwyllys 		    &kstype, sizeof (kstype));
51130a5e8faSwyllys 		numattr++;
51299ebb4caSwyllys 
51330a5e8faSwyllys 		if (dir != NULL) {
51430a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
51530a5e8faSwyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
51630a5e8faSwyllys 			numattr++;
51730a5e8faSwyllys 		}
51830a5e8faSwyllys 		if (filename != NULL) {
51930a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
52030a5e8faSwyllys 			    KMF_CRL_FILENAME_ATTR,
52130a5e8faSwyllys 			    filename, strlen(filename));
52230a5e8faSwyllys 			numattr++;
52330a5e8faSwyllys 		}
52430a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
52530a5e8faSwyllys 		    &crldata, sizeof (char *));
52630a5e8faSwyllys 		numattr++;
52730a5e8faSwyllys 
52830a5e8faSwyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
52930a5e8faSwyllys 		if (rv == KMF_OK && crldata != NULL) {
53099ebb4caSwyllys 			(void) printf("%s\n", crldata);
53199ebb4caSwyllys 			free(crldata);
53299ebb4caSwyllys 		}
53399ebb4caSwyllys 	}
53499ebb4caSwyllys 
53599ebb4caSwyllys 	return (rv);
53699ebb4caSwyllys }
53799ebb4caSwyllys 
53899ebb4caSwyllys 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)53999ebb4caSwyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
54099ebb4caSwyllys 	char *dir, char *filename, KMF_BIGINT *serial,
54199ebb4caSwyllys 	char *issuer, char *subject,
54299ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
54399ebb4caSwyllys {
544431deaa0Shylee 	KMF_RETURN rv = KMF_OK;
54530a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
54630a5e8faSwyllys 	int numattr = 0;
54730a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
54830a5e8faSwyllys 	KMF_KEY_CLASS keyclass;
54930a5e8faSwyllys 	KMF_ENCODE_FORMAT format;
55030a5e8faSwyllys 	char *defaultdir = ".";
55199ebb4caSwyllys 
55299ebb4caSwyllys 	if (oclass & PK_KEY_OBJ) {
55330a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
55430a5e8faSwyllys 		    &kstype, sizeof (kstype));
55530a5e8faSwyllys 		numattr++;
55699ebb4caSwyllys 
55730a5e8faSwyllys 		if (dir == NULL && filename == NULL)
55830a5e8faSwyllys 			dir = defaultdir;
55930a5e8faSwyllys 
56030a5e8faSwyllys 		if (dir != NULL) {
56130a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
56230a5e8faSwyllys 			    KMF_DIRPATH_ATTR, dir,
56330a5e8faSwyllys 			    strlen(dir));
56430a5e8faSwyllys 			numattr++;
56530a5e8faSwyllys 		}
56630a5e8faSwyllys 
56730a5e8faSwyllys 		if (filename != NULL) {
56830a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
56930a5e8faSwyllys 			    KMF_KEY_FILENAME_ATTR, filename,
57030a5e8faSwyllys 			    strlen(filename));
57130a5e8faSwyllys 			numattr++;
57230a5e8faSwyllys 		}
57330a5e8faSwyllys 
57430a5e8faSwyllys 		if (oclass & PK_PRIKEY_OBJ) {
57530a5e8faSwyllys 			int num = numattr;
57630a5e8faSwyllys 
57730a5e8faSwyllys 			keyclass = KMF_ASYM_PRI;
57830a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, num,
57930a5e8faSwyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
58030a5e8faSwyllys 			    sizeof (keyclass));
58130a5e8faSwyllys 			num++;
58230a5e8faSwyllys 
58330a5e8faSwyllys 			/* list asymmetric private keys */
5842cbed729Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
5852cbed729Swyllys 			    "asymmetric private");
58699ebb4caSwyllys 		}
58799ebb4caSwyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
58899ebb4caSwyllys 			rv = KMF_OK;
58999ebb4caSwyllys 
59099ebb4caSwyllys 		if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
59130a5e8faSwyllys 			int num = numattr;
59299ebb4caSwyllys 
59330a5e8faSwyllys 			keyclass = KMF_SYMMETRIC;
59430a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, num,
59530a5e8faSwyllys 			    KMF_KEYCLASS_ATTR, &keyclass,
59630a5e8faSwyllys 			    sizeof (keyclass));
59730a5e8faSwyllys 			num++;
59830a5e8faSwyllys 
59930a5e8faSwyllys 			format = KMF_FORMAT_RAWKEY;
60030a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, num,
60130a5e8faSwyllys 			    KMF_ENCODE_FORMAT_ATTR, &format,
60230a5e8faSwyllys 			    sizeof (format));
60330a5e8faSwyllys 			num++;
60430a5e8faSwyllys 
60530a5e8faSwyllys 			/* list symmetric keys */
6062cbed729Swyllys 			rv = pk_list_keys(kmfhandle, attrlist, num,
6072cbed729Swyllys 			    "symmetric");
60899ebb4caSwyllys 		}
60999ebb4caSwyllys 		if (rv == KMF_ERR_KEY_NOT_FOUND)
61099ebb4caSwyllys 			rv = KMF_OK;
61199ebb4caSwyllys 		if (rv != KMF_OK)
61299ebb4caSwyllys 			return (rv);
61399ebb4caSwyllys 	}
61499ebb4caSwyllys 
61530a5e8faSwyllys 	numattr = 0;
61699ebb4caSwyllys 	if (oclass & PK_CERT_OBJ) {
61730a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
61830a5e8faSwyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
61930a5e8faSwyllys 		    sizeof (kstype));
62030a5e8faSwyllys 		numattr++;
62199ebb4caSwyllys 
62230a5e8faSwyllys 		if (issuer != NULL) {
62330a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
62430a5e8faSwyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
62530a5e8faSwyllys 			    strlen(issuer));
62630a5e8faSwyllys 			numattr++;
62730a5e8faSwyllys 		}
62830a5e8faSwyllys 
62930a5e8faSwyllys 		if (subject != NULL) {
63030a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
63130a5e8faSwyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
63230a5e8faSwyllys 			    strlen(subject));
63330a5e8faSwyllys 			numattr++;
63430a5e8faSwyllys 		}
63530a5e8faSwyllys 
636d00756ccSwyllys 		if (serial != NULL && serial->val != NULL) {
63730a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
63830a5e8faSwyllys 			    KMF_BIGINT_ATTR, serial,
63930a5e8faSwyllys 			    sizeof (KMF_BIGINT));
64030a5e8faSwyllys 			numattr++;
64130a5e8faSwyllys 		}
64230a5e8faSwyllys 
64330a5e8faSwyllys 		if (filename != NULL) {
64430a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
64530a5e8faSwyllys 			    KMF_CERT_FILENAME_ATTR, filename,
64630a5e8faSwyllys 			    strlen(filename));
64730a5e8faSwyllys 			numattr++;
64830a5e8faSwyllys 		}
64930a5e8faSwyllys 
65030a5e8faSwyllys 		if (dir != NULL) {
65130a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
65230a5e8faSwyllys 			    KMF_DIRPATH_ATTR, dir,
65330a5e8faSwyllys 			    strlen(dir));
65430a5e8faSwyllys 			numattr++;
65530a5e8faSwyllys 		}
65630a5e8faSwyllys 
65730a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
65830a5e8faSwyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
65930a5e8faSwyllys 		    sizeof (KMF_CERT_VALIDITY));
66030a5e8faSwyllys 		numattr++;
66130a5e8faSwyllys 
66230a5e8faSwyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
66399ebb4caSwyllys 		if (rv != KMF_OK)
66499ebb4caSwyllys 			return (rv);
66599ebb4caSwyllys 	}
66699ebb4caSwyllys 
66730a5e8faSwyllys 	numattr = 0;
66899ebb4caSwyllys 	if (oclass & PK_CRL_OBJ) {
66930a5e8faSwyllys 		char *crldata = NULL;
67099ebb4caSwyllys 
67130a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
67230a5e8faSwyllys 		    &kstype, sizeof (kstype));
67330a5e8faSwyllys 		numattr++;
67499ebb4caSwyllys 
67530a5e8faSwyllys 		if (dir != NULL) {
67630a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
67730a5e8faSwyllys 			    KMF_DIRPATH_ATTR, dir, strlen(dir));
67830a5e8faSwyllys 			numattr++;
67930a5e8faSwyllys 		}
68030a5e8faSwyllys 		if (filename != NULL) {
68130a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
68230a5e8faSwyllys 			    KMF_CRL_FILENAME_ATTR,
68330a5e8faSwyllys 			    filename, strlen(filename));
68430a5e8faSwyllys 			numattr++;
68530a5e8faSwyllys 		}
68630a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
68730a5e8faSwyllys 		    &crldata, sizeof (char *));
68830a5e8faSwyllys 		numattr++;
68930a5e8faSwyllys 
69030a5e8faSwyllys 		rv = kmf_list_crl(kmfhandle, numattr, attrlist);
69130a5e8faSwyllys 		if (rv == KMF_OK && crldata != NULL) {
69299ebb4caSwyllys 			(void) printf("%s\n", crldata);
69399ebb4caSwyllys 			free(crldata);
69499ebb4caSwyllys 		}
69599ebb4caSwyllys 	}
69699ebb4caSwyllys 
69799ebb4caSwyllys 	return (rv);
69899ebb4caSwyllys }
69999ebb4caSwyllys 
70099ebb4caSwyllys 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)70199ebb4caSwyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
70299ebb4caSwyllys 	int oclass, char *token_spec, char *dir, char *prefix,
70399ebb4caSwyllys 	char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
70499ebb4caSwyllys 	KMF_CREDENTIAL *tokencred,
70599ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
70699ebb4caSwyllys {
70799ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
70830a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
70930a5e8faSwyllys 	int numattr = 0;
71030a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
71130a5e8faSwyllys 	KMF_KEY_CLASS keyclass;
71230a5e8faSwyllys 	KMF_ENCODE_FORMAT format;
71399ebb4caSwyllys 
71499ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
71599ebb4caSwyllys 	if (rv != KMF_OK)
71699ebb4caSwyllys 		return (rv);
71799ebb4caSwyllys 
71830a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
71930a5e8faSwyllys 	    &kstype, sizeof (kstype));
72030a5e8faSwyllys 	numattr++;
72130a5e8faSwyllys 
72299ebb4caSwyllys 	if (oclass & PK_KEY_OBJ) {
72330a5e8faSwyllys 		if (tokencred != NULL && tokencred->credlen > 0) {
72430a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
72530a5e8faSwyllys 			    KMF_CREDENTIAL_ATTR, tokencred,
72630a5e8faSwyllys 			    sizeof (KMF_CREDENTIAL));
72730a5e8faSwyllys 			numattr++;
72830a5e8faSwyllys 		}
72930a5e8faSwyllys 
73030a5e8faSwyllys 		if (token_spec && strlen(token_spec)) {
73130a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
73230a5e8faSwyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
73330a5e8faSwyllys 			    strlen(token_spec));
73430a5e8faSwyllys 			numattr++;
73530a5e8faSwyllys 		}
73630a5e8faSwyllys 
73730a5e8faSwyllys 		if (nickname != NULL) {
73830a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
73930a5e8faSwyllys 			    KMF_KEYLABEL_ATTR, nickname,
74030a5e8faSwyllys 			    strlen(nickname));
74130a5e8faSwyllys 			numattr++;
74230a5e8faSwyllys 		}
74399ebb4caSwyllys 	}
74499ebb4caSwyllys 
74599ebb4caSwyllys 	if (oclass & PK_PRIKEY_OBJ) {
74630a5e8faSwyllys 		int num = numattr;
74730a5e8faSwyllys 
74830a5e8faSwyllys 		keyclass = KMF_ASYM_PRI;
74930a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num,
75030a5e8faSwyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
75130a5e8faSwyllys 		    sizeof (keyclass));
75230a5e8faSwyllys 		num++;
75330a5e8faSwyllys 
75430a5e8faSwyllys 		/* list asymmetric private keys */
7552cbed729Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num,
7562cbed729Swyllys 		    "asymmetric private");
75799ebb4caSwyllys 	}
75830a5e8faSwyllys 
75999ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
76030a5e8faSwyllys 		int num = numattr;
76130a5e8faSwyllys 
76230a5e8faSwyllys 		keyclass = KMF_SYMMETRIC;
76330a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num,
76430a5e8faSwyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
76530a5e8faSwyllys 		    sizeof (keyclass));
76630a5e8faSwyllys 		num++;
76730a5e8faSwyllys 
76830a5e8faSwyllys 		format = KMF_FORMAT_RAWKEY;
76930a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num,
77030a5e8faSwyllys 		    KMF_ENCODE_FORMAT_ATTR, &format,
77130a5e8faSwyllys 		    sizeof (format));
77230a5e8faSwyllys 		num++;
77330a5e8faSwyllys 
77430a5e8faSwyllys 		/* list symmetric keys */
7752cbed729Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num, "symmetric");
77699ebb4caSwyllys 	}
77730a5e8faSwyllys 
77899ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
77930a5e8faSwyllys 		int num = numattr;
78030a5e8faSwyllys 
78130a5e8faSwyllys 		keyclass = KMF_ASYM_PUB;
78230a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num,
78330a5e8faSwyllys 		    KMF_KEYCLASS_ATTR, &keyclass,
78430a5e8faSwyllys 		    sizeof (keyclass));
78530a5e8faSwyllys 		num++;
78630a5e8faSwyllys 
78730a5e8faSwyllys 		/* list asymmetric public keys */
7882cbed729Swyllys 		rv = pk_list_keys(kmfhandle, attrlist, num,
7892cbed729Swyllys 		    "asymmetric public");
79099ebb4caSwyllys 	}
79199ebb4caSwyllys 
79299ebb4caSwyllys 	/* If searching for public objects or certificates, find certs now */
79330a5e8faSwyllys 	numattr = 0;
79499ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
79530a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
79630a5e8faSwyllys 		    KMF_KEYSTORE_TYPE_ATTR, &kstype,
79730a5e8faSwyllys 		    sizeof (kstype));
79830a5e8faSwyllys 		numattr++;
79999ebb4caSwyllys 
80030a5e8faSwyllys 		if (nickname != NULL) {
80130a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
80230a5e8faSwyllys 			    KMF_CERT_LABEL_ATTR, nickname,
80330a5e8faSwyllys 			    strlen(nickname));
80430a5e8faSwyllys 			numattr++;
80599ebb4caSwyllys 		}
80699ebb4caSwyllys 
80730a5e8faSwyllys 		if (issuer != NULL) {
80830a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
80930a5e8faSwyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
81030a5e8faSwyllys 			    strlen(issuer));
81130a5e8faSwyllys 			numattr++;
81230a5e8faSwyllys 		}
81330a5e8faSwyllys 
81430a5e8faSwyllys 		if (subject != NULL) {
81530a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
81630a5e8faSwyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
81730a5e8faSwyllys 			    strlen(subject));
81830a5e8faSwyllys 			numattr++;
81930a5e8faSwyllys 		}
82030a5e8faSwyllys 
82130a5e8faSwyllys 		if (serial != NULL) {
82230a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
82330a5e8faSwyllys 			    KMF_BIGINT_ATTR, serial,
82430a5e8faSwyllys 			    sizeof (KMF_BIGINT));
82530a5e8faSwyllys 			numattr++;
82630a5e8faSwyllys 		}
82730a5e8faSwyllys 
82830a5e8faSwyllys 		if (token_spec != NULL) {
82930a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
83030a5e8faSwyllys 			    KMF_TOKEN_LABEL_ATTR, token_spec,
83130a5e8faSwyllys 			    strlen(token_spec));
83230a5e8faSwyllys 			numattr++;
83330a5e8faSwyllys 		}
83430a5e8faSwyllys 
83530a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
83630a5e8faSwyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
83730a5e8faSwyllys 		    sizeof (KMF_CERT_VALIDITY));
83830a5e8faSwyllys 		numattr++;
83930a5e8faSwyllys 
84030a5e8faSwyllys 		rv = pk_find_certs(kmfhandle, attrlist, numattr);
84130a5e8faSwyllys 	}
84230a5e8faSwyllys 
84330a5e8faSwyllys 	numattr = 0;
84499ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
84599ebb4caSwyllys 		int numcrls;
84699ebb4caSwyllys 
84730a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
84830a5e8faSwyllys 		    &kstype, sizeof (kstype));
84930a5e8faSwyllys 		numattr++;
85099ebb4caSwyllys 
85130a5e8faSwyllys 		if (token_spec != NULL) {
85230a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
85330a5e8faSwyllys 			    KMF_TOKEN_LABEL_ATTR,
85430a5e8faSwyllys 			    token_spec, strlen(token_spec));
85530a5e8faSwyllys 			numattr++;
85630a5e8faSwyllys 		}
85730a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR,
85830a5e8faSwyllys 		    &numcrls, sizeof (int));
85930a5e8faSwyllys 		numattr++;
86030a5e8faSwyllys 
86130a5e8faSwyllys 		rv = kmf_find_crl(kmfhandle, numattr, attrlist);
86299ebb4caSwyllys 		if (rv == KMF_OK) {
86399ebb4caSwyllys 			char **p;
86499ebb4caSwyllys 			if (numcrls == 0) {
86599ebb4caSwyllys 				(void) printf(gettext("No CRLs found in "
86699ebb4caSwyllys 				    "NSS keystore.\n"));
86799ebb4caSwyllys 
86899ebb4caSwyllys 				return (KMF_OK);
86999ebb4caSwyllys 			}
87099ebb4caSwyllys 			p = malloc(numcrls * sizeof (char *));
87199ebb4caSwyllys 			if (p == NULL) {
87299ebb4caSwyllys 				return (KMF_ERR_MEMORY);
87399ebb4caSwyllys 			}
87499ebb4caSwyllys 			(void) memset(p, 0, numcrls * sizeof (char *));
87530a5e8faSwyllys 
87630a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
87730a5e8faSwyllys 			    KMF_CRL_NAMELIST_ATTR, p, sizeof (char *));
87830a5e8faSwyllys 			numattr++;
87930a5e8faSwyllys 			rv = kmf_find_crl(kmfhandle, numattr, attrlist);
88099ebb4caSwyllys 			if (rv == KMF_OK) {
88199ebb4caSwyllys 				int i;
88299ebb4caSwyllys 				for (i = 0; i < numcrls; i++) {
88399ebb4caSwyllys 					(void) printf("%d. Name = %s\n",
88499ebb4caSwyllys 					    i + 1, p[i]);
88599ebb4caSwyllys 					free(p[i]);
88699ebb4caSwyllys 				}
88799ebb4caSwyllys 			}
88899ebb4caSwyllys 			free(p);
88999ebb4caSwyllys 		}
89099ebb4caSwyllys 	}
8917711facfSdinak 	return (rv);
8927711facfSdinak }
8937711facfSdinak 
8947711facfSdinak /*
8957711facfSdinak  * List token object.
8967711facfSdinak  */
8977711facfSdinak int
pk_list(int argc,char * argv[])8987711facfSdinak pk_list(int argc, char *argv[])
8997711facfSdinak {
9007711facfSdinak 	int			opt;
90149e21299Sdinak 	extern int		optind_av;
90249e21299Sdinak 	extern char		*optarg_av;
90349e21299Sdinak 	char			*token_spec = NULL;
90499ebb4caSwyllys 	char			*subject = NULL;
90599ebb4caSwyllys 	char			*issuer = NULL;
90699ebb4caSwyllys 	char			*dir = NULL;
90799ebb4caSwyllys 	char			*prefix = NULL;
90899ebb4caSwyllys 	char			*filename = NULL;
90999ebb4caSwyllys 	char			*serstr = NULL;
91099ebb4caSwyllys 	KMF_BIGINT		serial = { NULL, 0 };
9117711facfSdinak 
91299ebb4caSwyllys 	char			*list_label = NULL;
91399ebb4caSwyllys 	int			oclass = 0;
91499ebb4caSwyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
91599ebb4caSwyllys 	KMF_RETURN		rv = KMF_OK;
91699ebb4caSwyllys 	KMF_HANDLE_T		kmfhandle = NULL;
91799ebb4caSwyllys 	char			*find_criteria = NULL;
91899ebb4caSwyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
91999ebb4caSwyllys 	KMF_CREDENTIAL		tokencred = { NULL, 0 };
9207711facfSdinak 
9217711facfSdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
92249e21299Sdinak 	while ((opt = getopt_av(argc, argv,
92399ebb4caSwyllys 	    "k:(keystore)t:(objtype)T:(token)d:(dir)"
92499ebb4caSwyllys 	    "p:(prefix)n:(nickname)S:(serial)s:(subject)"
92599ebb4caSwyllys 	    "c:(criteria)"
92699ebb4caSwyllys 	    "i:(issuer)l:(label)f:(infile)")) != EOF) {
92799ebb4caSwyllys 		if (EMPTYSTRING(optarg_av))
92899ebb4caSwyllys 			return (PK_ERR_USAGE);
9297711facfSdinak 		switch (opt) {
93099ebb4caSwyllys 			case 'k':
93199ebb4caSwyllys 				if (kstype != 0)
93299ebb4caSwyllys 					return (PK_ERR_USAGE);
93399ebb4caSwyllys 				kstype = KS2Int(optarg_av);
93499ebb4caSwyllys 				if (kstype == 0)
93599ebb4caSwyllys 					return (PK_ERR_USAGE);
93699ebb4caSwyllys 				break;
93799ebb4caSwyllys 			case 't':
93899ebb4caSwyllys 				if (oclass != 0)
93999ebb4caSwyllys 					return (PK_ERR_USAGE);
94099ebb4caSwyllys 				oclass = OT2Int(optarg_av);
94199ebb4caSwyllys 				if (oclass == -1)
94299ebb4caSwyllys 					return (PK_ERR_USAGE);
94399ebb4caSwyllys 				break;
94499ebb4caSwyllys 			case 's':
94599ebb4caSwyllys 				if (subject)
94699ebb4caSwyllys 					return (PK_ERR_USAGE);
94799ebb4caSwyllys 				subject = optarg_av;
94899ebb4caSwyllys 				break;
94999ebb4caSwyllys 			case 'i':
95099ebb4caSwyllys 				if (issuer)
95199ebb4caSwyllys 					return (PK_ERR_USAGE);
95299ebb4caSwyllys 				issuer = optarg_av;
95399ebb4caSwyllys 				break;
95499ebb4caSwyllys 			case 'd':
95599ebb4caSwyllys 				if (dir)
95699ebb4caSwyllys 					return (PK_ERR_USAGE);
95799ebb4caSwyllys 				dir = optarg_av;
95899ebb4caSwyllys 				break;
95999ebb4caSwyllys 			case 'p':
96099ebb4caSwyllys 				if (prefix)
96199ebb4caSwyllys 					return (PK_ERR_USAGE);
96299ebb4caSwyllys 				prefix = optarg_av;
96399ebb4caSwyllys 				break;
96499ebb4caSwyllys 			case 'S':
96599ebb4caSwyllys 				serstr = optarg_av;
96699ebb4caSwyllys 				break;
96799ebb4caSwyllys 			case 'f':
96899ebb4caSwyllys 				if (filename)
96999ebb4caSwyllys 					return (PK_ERR_USAGE);
97099ebb4caSwyllys 				filename = optarg_av;
97199ebb4caSwyllys 				break;
97249e21299Sdinak 			case 'T':	/* token specifier */
97349e21299Sdinak 				if (token_spec)
97449e21299Sdinak 					return (PK_ERR_USAGE);
97549e21299Sdinak 				token_spec = optarg_av;
9767711facfSdinak 				break;
97799ebb4caSwyllys 			case 'n':
9787711facfSdinak 			case 'l':	/* object with specific label */
9797711facfSdinak 				if (list_label)
9807711facfSdinak 					return (PK_ERR_USAGE);
98199ebb4caSwyllys 				list_label = optarg_av;
98299ebb4caSwyllys 				break;
98399ebb4caSwyllys 			case 'c':
98499ebb4caSwyllys 				find_criteria = optarg_av;
98599ebb4caSwyllys 				if (!strcasecmp(find_criteria, "valid"))
98699ebb4caSwyllys 					find_criteria_flag =
98799ebb4caSwyllys 					    KMF_NONEXPIRED_CERTS;
98899ebb4caSwyllys 				else if (!strcasecmp(find_criteria, "expired"))
98999ebb4caSwyllys 					find_criteria_flag = KMF_EXPIRED_CERTS;
99099ebb4caSwyllys 				else if (!strcasecmp(find_criteria, "both"))
99199ebb4caSwyllys 					find_criteria_flag = KMF_ALL_CERTS;
99299ebb4caSwyllys 				else
99399ebb4caSwyllys 					return (PK_ERR_USAGE);
9947711facfSdinak 				break;
9957711facfSdinak 			default:
9967711facfSdinak 				return (PK_ERR_USAGE);
9977711facfSdinak 		}
9987711facfSdinak 	}
9997711facfSdinak 	/* No additional args allowed. */
100049e21299Sdinak 	argc -= optind_av;
100149e21299Sdinak 	argv += optind_av;
10027711facfSdinak 	if (argc)
10037711facfSdinak 		return (PK_ERR_USAGE);
10047711facfSdinak 
100530a5e8faSwyllys 	if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
100699ebb4caSwyllys 		/* Error message ? */
100799ebb4caSwyllys 		return (rv);
10087711facfSdinak 	}
10097711facfSdinak 
101099ebb4caSwyllys 	/* Assume keystore = PKCS#11 if not specified. */
101199ebb4caSwyllys 	if (kstype == 0)
101299ebb4caSwyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
101399ebb4caSwyllys 
101499ebb4caSwyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
101599ebb4caSwyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
101699ebb4caSwyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
101799ebb4caSwyllys 
101899ebb4caSwyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
101999ebb4caSwyllys 		    "is only relevant if keystore=pkcs11\n"));
102099ebb4caSwyllys 		return (PK_ERR_USAGE);
10217711facfSdinak 	}
10227711facfSdinak 
102399ebb4caSwyllys 
102499ebb4caSwyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
102599ebb4caSwyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
102699ebb4caSwyllys 	} else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
102799ebb4caSwyllys 		token_spec = DEFAULT_NSS_TOKEN;
10287711facfSdinak 	}
10297711facfSdinak 
103099ebb4caSwyllys 	if (serstr != NULL) {
103199ebb4caSwyllys 		uchar_t *bytes = NULL;
103299ebb4caSwyllys 		size_t bytelen;
103399ebb4caSwyllys 
103430a5e8faSwyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
103599ebb4caSwyllys 		if (rv != KMF_OK || bytes == NULL) {
103699ebb4caSwyllys 			(void) fprintf(stderr, gettext("serial number "
103799ebb4caSwyllys 			    "must be specified as a hex number "
103899ebb4caSwyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
103999ebb4caSwyllys 			return (PK_ERR_USAGE);
104099ebb4caSwyllys 		}
104199ebb4caSwyllys 		serial.val = bytes;
104299ebb4caSwyllys 		serial.len = bytelen;
10432cbed729Swyllys 		/* if objtype was not given, it must be for certs */
10442cbed729Swyllys 		if (oclass == 0)
10452cbed729Swyllys 			oclass = PK_CERT_OBJ;
10467711facfSdinak 	}
10472cbed729Swyllys 	if (oclass == 0 && (issuer != NULL || subject != NULL))
10482cbed729Swyllys 		oclass = PK_CERT_OBJ;
10492cbed729Swyllys 
10502cbed729Swyllys 	/* If no object class specified, list public objects. */
10512cbed729Swyllys 	if (oclass == 0)
10522cbed729Swyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ;
10537711facfSdinak 
105499ebb4caSwyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
105599ebb4caSwyllys 	    kstype == KMF_KEYSTORE_NSS) &&
105699ebb4caSwyllys 	    (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
105799ebb4caSwyllys 
105899ebb4caSwyllys 		(void) get_token_password(kstype, token_spec,
105999ebb4caSwyllys 		    &tokencred);
106099ebb4caSwyllys 	}
106199ebb4caSwyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN) {
106299ebb4caSwyllys 		rv = list_pk11_objects(kmfhandle, token_spec,
106399ebb4caSwyllys 		    oclass, list_label, &serial,
106499ebb4caSwyllys 		    issuer, subject, dir, filename,
106599ebb4caSwyllys 		    &tokencred, find_criteria_flag);
106699ebb4caSwyllys 
106799ebb4caSwyllys 	} else if (kstype == KMF_KEYSTORE_NSS) {
106899ebb4caSwyllys 		if (dir == NULL)
106999ebb4caSwyllys 			dir = PK_DEFAULT_DIRECTORY;
107099ebb4caSwyllys 		rv = list_nss_objects(kmfhandle,
107199ebb4caSwyllys 		    oclass, token_spec, dir, prefix,
107299ebb4caSwyllys 		    list_label, &serial, issuer, subject,
107399ebb4caSwyllys 		    &tokencred, find_criteria_flag);
107499ebb4caSwyllys 
107599ebb4caSwyllys 	} else if (kstype == KMF_KEYSTORE_OPENSSL) {
107699ebb4caSwyllys 
107799ebb4caSwyllys 		rv = list_file_objects(kmfhandle,
107899ebb4caSwyllys 		    oclass, dir, filename,
107999ebb4caSwyllys 		    &serial, issuer, subject, find_criteria_flag);
10807711facfSdinak 	}
10817711facfSdinak 
108299ebb4caSwyllys 	if (rv != KMF_OK) {
108399ebb4caSwyllys 		display_error(kmfhandle, rv,
108499ebb4caSwyllys 		    gettext("Error listing objects"));
10857711facfSdinak 	}
10867711facfSdinak 
108799ebb4caSwyllys 	if (serial.val != NULL)
108899ebb4caSwyllys 		free(serial.val);
10897711facfSdinak 
109099ebb4caSwyllys 	if (tokencred.cred != NULL)
109199ebb4caSwyllys 		free(tokencred.cred);
109299ebb4caSwyllys 
109330a5e8faSwyllys 	(void) kmf_finalize(kmfhandle);
109499ebb4caSwyllys 	return (rv);
10957711facfSdinak }
1096