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