117Sdinak /* 217Sdinak * CDDL HEADER START 317Sdinak * 417Sdinak * The contents of this file are subject to the terms of the 53089Swyllys * Common Development and Distribution License (the "License"). 63089Swyllys * You may not use this file except in compliance with the License. 717Sdinak * 817Sdinak * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 917Sdinak * or http://www.opensolaris.org/os/licensing. 1017Sdinak * See the License for the specific language governing permissions 1117Sdinak * and limitations under the License. 1217Sdinak * 1317Sdinak * When distributing Covered Code, include this CDDL HEADER in each 1417Sdinak * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1517Sdinak * If applicable, add the following below this CDDL HEADER, with the 1617Sdinak * fields enclosed by brackets "[]" replaced with your own identifying 1717Sdinak * information: Portions Copyright [yyyy] [name of copyright owner] 1817Sdinak * 1917Sdinak * CDDL HEADER END 2017Sdinak */ 2117Sdinak /* 223408Swyllys * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 2317Sdinak * Use is subject to license terms. 2417Sdinak */ 2517Sdinak 2617Sdinak #pragma ident "%Z%%M% %I% %E% SMI" 2717Sdinak 2817Sdinak /* 2917Sdinak * This file implements the token object list operation for this tool. 3017Sdinak * It loads the PKCS#11 modules, finds the object to list, lists it, 3117Sdinak * and cleans up. User must be logged into the token to list private 3217Sdinak * objects. 3317Sdinak */ 3417Sdinak 3517Sdinak #include <stdio.h> 3617Sdinak #include <errno.h> 3717Sdinak #include <string.h> 3817Sdinak #include <cryptoutil.h> 3917Sdinak #include <security/cryptoki.h> 4017Sdinak #include "common.h" 413089Swyllys 423089Swyllys #include <kmfapi.h> 4317Sdinak 443089Swyllys static void 453089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs) 4617Sdinak { 473089Swyllys int i; 483089Swyllys char *subject, *issuer, *serial, *id, *altname; 495051Swyllys char *start, *end, *keyusage, *extkeyusage; 5017Sdinak 513089Swyllys for (i = 0; i < num_certs; i++) { 523089Swyllys subject = NULL; 533089Swyllys issuer = NULL; 543089Swyllys serial = NULL; 553089Swyllys id = NULL; 563089Swyllys altname = NULL; 575051Swyllys start = end = NULL; 585051Swyllys keyusage = extkeyusage = NULL; 5917Sdinak 603089Swyllys (void) fprintf(stdout, 615051Swyllys gettext("%d. (X.509 certificate)\n"), i + 1); 623089Swyllys if (certs[i].kmf_private.label != NULL) 633089Swyllys (void) fprintf(stdout, gettext("\t%s: %s\n"), 645051Swyllys (certs[i].kmf_private.keystore_type == 655051Swyllys KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"), 665051Swyllys certs[i].kmf_private.label); 675051Swyllys if (kmf_get_cert_id_str(&certs[i].certificate, 685051Swyllys &id) == KMF_OK) 693089Swyllys (void) fprintf(stdout, gettext("\tID: %s\n"), id); 705051Swyllys if (kmf_get_cert_subject_str(kmfhandle, 715051Swyllys &certs[i].certificate, &subject) == KMF_OK) 723089Swyllys (void) fprintf(stdout, gettext("\tSubject: %s\n"), 735051Swyllys subject); 745051Swyllys if (kmf_get_cert_issuer_str(kmfhandle, 755051Swyllys &certs[i].certificate, &issuer) == KMF_OK) 763089Swyllys (void) fprintf(stdout, gettext("\tIssuer: %s\n"), 775051Swyllys issuer); 785051Swyllys if (kmf_get_cert_start_date_str(kmfhandle, 795051Swyllys &certs[i].certificate, &start) == KMF_OK) 805051Swyllys (void) fprintf(stdout, gettext("\tNot Before: %s\n"), 815051Swyllys start); 825051Swyllys if (kmf_get_cert_end_date_str(kmfhandle, 835051Swyllys &certs[i].certificate, &end) == KMF_OK) 845051Swyllys (void) fprintf(stdout, gettext("\tNot After: %s\n"), 855051Swyllys end); 865051Swyllys if (kmf_get_cert_serial_str(kmfhandle, 875051Swyllys &certs[i].certificate, &serial) == KMF_OK) 883089Swyllys (void) fprintf(stdout, gettext("\tSerial: %s\n"), 895051Swyllys serial); 905051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 915051Swyllys &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME, 925051Swyllys &altname) == KMF_OK) { 935051Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 945051Swyllys altname); 955051Swyllys } 965051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 975051Swyllys &certs[i].certificate, KMF_X509_EXT_KEY_USAGE, 985051Swyllys &keyusage) == KMF_OK) { 993089Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 1005051Swyllys keyusage); 1015051Swyllys } 1025051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 1035051Swyllys &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE, 1045051Swyllys &extkeyusage) == KMF_OK) { 1055051Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 1065051Swyllys extkeyusage); 1073089Swyllys } 1085051Swyllys kmf_free_str(subject); 1095051Swyllys kmf_free_str(issuer); 1105051Swyllys kmf_free_str(serial); 1115051Swyllys kmf_free_str(id); 1125051Swyllys kmf_free_str(altname); 1135051Swyllys kmf_free_str(keyusage); 1145051Swyllys kmf_free_str(extkeyusage); 1155051Swyllys kmf_free_str(start); 1165051Swyllys kmf_free_str(end); 1173089Swyllys (void) fprintf(stdout, "\n"); 11817Sdinak } 11917Sdinak } 12017Sdinak 1213089Swyllys static char * 1223089Swyllys describeKey(KMF_KEY_HANDLE *key) 12317Sdinak { 1243089Swyllys if (key->keyclass == KMF_ASYM_PUB) { 1253089Swyllys if (key->keyalg == KMF_RSA) 1263089Swyllys return (gettext("RSA public key")); 1273089Swyllys if (key->keyalg == KMF_DSA) 1283089Swyllys return (gettext("DSA public key")); 12917Sdinak } 1303089Swyllys if (key->keyclass == KMF_ASYM_PRI) { 1313089Swyllys if (key->keyalg == KMF_RSA) 1323089Swyllys return ("RSA private key"); 1333089Swyllys if (key->keyalg == KMF_DSA) 1343089Swyllys return ("DSA private key"); 13517Sdinak } 1363089Swyllys if (key->keyclass == KMF_SYMMETRIC) { 1373089Swyllys switch (key->keyalg) { 1383089Swyllys case KMF_AES: 1393089Swyllys return (gettext("AES")); 1403089Swyllys break; 1413089Swyllys case KMF_RC4: 1423089Swyllys return (gettext("ARCFOUR")); 1433089Swyllys break; 1443089Swyllys case KMF_DES: 1453089Swyllys return (gettext("DES")); 1463089Swyllys break; 1473089Swyllys case KMF_DES3: 1483089Swyllys return (gettext("Triple-DES")); 1493089Swyllys break; 1503089Swyllys default: 1513089Swyllys return (gettext("symmetric")); 1523089Swyllys break; 15317Sdinak } 15417Sdinak } 15517Sdinak 1563089Swyllys return (gettext("unrecognized key object")); 1573089Swyllys 1583089Swyllys } 15917Sdinak 1603089Swyllys 1613089Swyllys static void 1623089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys) 1633089Swyllys { 1643089Swyllys int i; 1653089Swyllys 1663089Swyllys for (i = 0; i < numkeys; i++) { 1674006Shylee (void) fprintf(stdout, gettext("Key #%d - %s: %s"), 1685051Swyllys i+1, describeKey(&keys[i]), 1695051Swyllys keys[i].keylabel ? keys[i].keylabel : 1705051Swyllys gettext("No label")); 1713089Swyllys 1723089Swyllys if (keys[i].keyclass == KMF_SYMMETRIC) { 1733089Swyllys KMF_RETURN rv; 1743089Swyllys KMF_RAW_SYM_KEY rkey; 1754006Shylee 1765051Swyllys (void) memset(&rkey, 0, sizeof (rkey)); 1775051Swyllys rv = kmf_get_sym_key_value(handle, &keys[i], 1785051Swyllys &rkey); 1793089Swyllys if (rv == KMF_OK) { 1804006Shylee (void) fprintf(stdout, " (%d bits)", 1815051Swyllys rkey.keydata.len * 8); 1825051Swyllys kmf_free_bigint(&rkey.keydata); 1835051Swyllys } else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) { 1845051Swyllys if (rv == KMF_ERR_SENSITIVE_KEY) { 1855051Swyllys (void) fprintf(stdout, " (sensitive)"); 1865051Swyllys } else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) { 1875051Swyllys (void) fprintf(stdout, 1885051Swyllys " (non-extractable)"); 1895051Swyllys } else { 1905051Swyllys char *err = NULL; 1915051Swyllys if (kmf_get_kmf_error_str(rv, &err) == 1925051Swyllys KMF_OK) 1935051Swyllys (void) fprintf(stdout, 1945051Swyllys " (error: %s)", err); 1955051Swyllys if (err != NULL) 1965051Swyllys free(err); 1975051Swyllys } 1983089Swyllys } 19917Sdinak } 2003089Swyllys (void) fprintf(stdout, "\n"); 20117Sdinak } 2023089Swyllys } 20317Sdinak 2043089Swyllys /* 2053089Swyllys * Generic routine used by all "list cert" operations to find 2063089Swyllys * all matching certificates. 2073089Swyllys */ 2083089Swyllys static KMF_RETURN 2095051Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr) 2103089Swyllys { 2113089Swyllys KMF_RETURN rv = KMF_OK; 2123089Swyllys KMF_X509_DER_CERT *certlist = NULL; 2133089Swyllys uint32_t numcerts = 0; 2145051Swyllys KMF_KEYSTORE_TYPE kstype; 21517Sdinak 2165051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 2175051Swyllys &kstype, NULL); 2185051Swyllys if (rv != KMF_OK) 2195051Swyllys return (rv); 2205051Swyllys 2215051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR, 2225051Swyllys &numcerts, sizeof (uint32_t)); 2235051Swyllys numattr++; 2245051Swyllys 2255051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist); 2263089Swyllys if (rv == KMF_OK && numcerts > 0) { 2273089Swyllys (void) printf(gettext("Found %d certificates.\n"), 2285051Swyllys numcerts); 2293089Swyllys certlist = (KMF_X509_DER_CERT *)malloc(numcerts * 2305051Swyllys sizeof (KMF_X509_DER_CERT)); 2313089Swyllys if (certlist == NULL) 2323089Swyllys return (KMF_ERR_MEMORY); 2333089Swyllys (void) memset(certlist, 0, numcerts * 2345051Swyllys sizeof (KMF_X509_DER_CERT)); 2353089Swyllys 2365051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2375051Swyllys KMF_X509_DER_CERT_ATTR, certlist, 2385051Swyllys sizeof (KMF_X509_DER_CERT)); 2395051Swyllys numattr++; 2405051Swyllys 2415051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist); 2423089Swyllys if (rv == KMF_OK) { 2433089Swyllys int i; 2443089Swyllys (void) pk_show_certs(kmfhandle, certlist, 2455051Swyllys numcerts); 2463089Swyllys for (i = 0; i < numcerts; i++) 2475051Swyllys kmf_free_kmf_cert(kmfhandle, &certlist[i]); 2483089Swyllys } 2493089Swyllys free(certlist); 25017Sdinak } 2513089Swyllys if (rv == KMF_ERR_CERT_NOT_FOUND && 2525051Swyllys kstype != KMF_KEYSTORE_OPENSSL) 2533089Swyllys rv = KMF_OK; 25417Sdinak 25517Sdinak return (rv); 25617Sdinak } 25717Sdinak 2583089Swyllys static KMF_RETURN 2595051Swyllys pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr) 26017Sdinak { 2613089Swyllys KMF_RETURN rv; 2623089Swyllys KMF_KEY_HANDLE *keys; 2633089Swyllys uint32_t numkeys = 0; 2645051Swyllys KMF_KEYSTORE_TYPE kstype; 2653089Swyllys 2665051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 2675051Swyllys &kstype, NULL); 2685051Swyllys if (rv != KMF_OK) 2695051Swyllys return (rv); 2705051Swyllys 2715051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR, 2725051Swyllys &numkeys, sizeof (uint32_t)); 2735051Swyllys numattr++; 2745051Swyllys 2755051Swyllys rv = kmf_find_key(handle, numattr, attrlist); 2763089Swyllys if (rv == KMF_OK && numkeys > 0) { 2773089Swyllys int i; 2783089Swyllys (void) printf(gettext("Found %d keys.\n"), numkeys); 2793089Swyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 2805051Swyllys sizeof (KMF_KEY_HANDLE)); 2813089Swyllys if (keys == NULL) 2823089Swyllys return (KMF_ERR_MEMORY); 2833089Swyllys (void) memset(keys, 0, numkeys * 2845051Swyllys sizeof (KMF_KEY_HANDLE)); 28517Sdinak 2865051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2875051Swyllys KMF_KEY_HANDLE_ATTR, 2885051Swyllys keys, sizeof (KMF_KEY_HANDLE)); 2895051Swyllys numattr++; 2905051Swyllys 2915051Swyllys rv = kmf_find_key(handle, numattr, attrlist); 2923089Swyllys if (rv == KMF_OK) 2933089Swyllys pk_show_keys(handle, keys, numkeys); 2943089Swyllys for (i = 0; i < numkeys; i++) 2955051Swyllys kmf_free_kmf_key(handle, &keys[i]); 2963089Swyllys free(keys); 2973089Swyllys } 2983089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND && 2995051Swyllys kstype != KMF_KEYSTORE_OPENSSL) 3003089Swyllys rv = KMF_OK; 3013089Swyllys return (rv); 3023089Swyllys } 30317Sdinak 3043089Swyllys static KMF_RETURN 3053089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass, 3063089Swyllys char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject, 3073089Swyllys char *dir, char *filename, KMF_CREDENTIAL *tokencred, 3083089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 3093089Swyllys { 3103089Swyllys KMF_RETURN rv; 3115051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 3125051Swyllys int numattr = 0; 3135051Swyllys KMF_ATTRIBUTE attrlist[16]; 3145051Swyllys boolean_t token_bool = B_TRUE; 3155051Swyllys boolean_t private = B_FALSE; 3165051Swyllys KMF_KEY_CLASS keyclass; 3175051Swyllys KMF_ENCODE_FORMAT format; 3183089Swyllys 3193089Swyllys /* 3203089Swyllys * Symmetric keys and RSA/DSA private keys are always 3213089Swyllys * created with the "CKA_PRIVATE" field == TRUE, so 3223089Swyllys * make sure we search for them with it also set. 3233089Swyllys */ 3243089Swyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 3253089Swyllys oclass |= PK_PRIVATE_OBJ; 3263089Swyllys 3273089Swyllys rv = select_token(kmfhandle, token, 3285051Swyllys !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ))); 3293089Swyllys 3303089Swyllys if (rv != KMF_OK) { 33117Sdinak return (rv); 33217Sdinak } 33317Sdinak 3343089Swyllys if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) { 3355051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 3365051Swyllys &kstype, sizeof (kstype)); 3375051Swyllys numattr++; 3385051Swyllys 3395051Swyllys if (objlabel != NULL) { 3405051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3415051Swyllys KMF_KEYLABEL_ATTR, objlabel, 3425051Swyllys strlen(objlabel)); 3435051Swyllys numattr++; 3445051Swyllys } 3453089Swyllys 3465051Swyllys private = ((oclass & PK_PRIVATE_OBJ) > 0); 3475051Swyllys 3485051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3495051Swyllys KMF_PRIVATE_BOOL_ATTR, &private, 3505051Swyllys sizeof (private)); 3515051Swyllys numattr++; 3525051Swyllys 3535051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3545051Swyllys KMF_TOKEN_BOOL_ATTR, &token_bool, 3555051Swyllys sizeof (token_bool)); 3565051Swyllys numattr++; 3573089Swyllys 3583089Swyllys if (oclass & PK_PRIKEY_OBJ) { 3595051Swyllys int num = numattr; 3605051Swyllys 3615051Swyllys keyclass = KMF_ASYM_PRI; 3625051Swyllys kmf_set_attr_at_index(attrlist, num, 3635051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 3645051Swyllys sizeof (keyclass)); 3655051Swyllys num++; 3665051Swyllys 3675051Swyllys if (tokencred != NULL && 3685051Swyllys tokencred->credlen > 0) { 3695051Swyllys kmf_set_attr_at_index(attrlist, num, 3705051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 3715051Swyllys sizeof (KMF_CREDENTIAL)); 3725051Swyllys num++; 3735051Swyllys } 3743089Swyllys 3753089Swyllys /* list asymmetric private keys */ 3765051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 3773089Swyllys } 3783089Swyllys 3793089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 3805051Swyllys int num = numattr; 3815051Swyllys 3825051Swyllys keyclass = KMF_SYMMETRIC; 3835051Swyllys kmf_set_attr_at_index(attrlist, num, 3845051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 3855051Swyllys sizeof (keyclass)); 3865051Swyllys num++; 3875051Swyllys 3885051Swyllys if (tokencred != NULL && 3895051Swyllys tokencred->credlen > 0) { 3905051Swyllys kmf_set_attr_at_index(attrlist, num, 3915051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 3925051Swyllys sizeof (KMF_CREDENTIAL)); 3935051Swyllys num++; 3945051Swyllys } 3955051Swyllys 3965051Swyllys format = KMF_FORMAT_RAWKEY; 3975051Swyllys kmf_set_attr_at_index(attrlist, num, 3985051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 3995051Swyllys sizeof (format)); 4005051Swyllys num++; 4013089Swyllys 4023089Swyllys /* list symmetric keys */ 4035051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 40417Sdinak } 4053089Swyllys 4063089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 4075051Swyllys int num = numattr; 4085051Swyllys 409*5128Swyllys private = B_FALSE; 4105051Swyllys keyclass = KMF_ASYM_PUB; 4115051Swyllys kmf_set_attr_at_index(attrlist, num, 4125051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 4135051Swyllys sizeof (keyclass)); 4145051Swyllys num++; 4153089Swyllys 4163089Swyllys /* list asymmetric public keys (if any) */ 4175051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 4183089Swyllys } 4193089Swyllys 4203089Swyllys if (rv != KMF_OK) 4213089Swyllys return (rv); 4223089Swyllys } 4233089Swyllys 4245051Swyllys numattr = 0; 4253089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 4265051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 4275051Swyllys &kstype, sizeof (kstype)); 4285051Swyllys numattr++; 4295051Swyllys 4305051Swyllys if (objlabel != NULL) { 4315051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4325051Swyllys KMF_CERT_LABEL_ATTR, objlabel, 4335051Swyllys strlen(objlabel)); 4345051Swyllys numattr++; 4355051Swyllys } 4365051Swyllys 4375051Swyllys if (issuer != NULL) { 4385051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4395051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 4405051Swyllys strlen(issuer)); 4415051Swyllys numattr++; 4425051Swyllys } 4433089Swyllys 4445051Swyllys if (subject != NULL) { 4455051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4465051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 4475051Swyllys strlen(subject)); 4485051Swyllys numattr++; 4495051Swyllys } 4503089Swyllys 4515051Swyllys if (serial != NULL) { 4525051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4535051Swyllys KMF_BIGINT_ATTR, serial, 4545051Swyllys sizeof (KMF_BIGINT)); 4555051Swyllys numattr++; 4565051Swyllys } 4575051Swyllys 4585051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4595051Swyllys KMF_PRIVATE_BOOL_ATTR, &private, 4605051Swyllys sizeof (private)); 4615051Swyllys numattr++; 4625051Swyllys 4635051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4645051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 4655051Swyllys sizeof (KMF_CERT_VALIDITY)); 4665051Swyllys numattr++; 4675051Swyllys 4685051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 4693089Swyllys if (rv != KMF_OK) 4703089Swyllys return (rv); 4713089Swyllys } 4723089Swyllys 4735051Swyllys numattr = 0; 4745051Swyllys kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */ 4753089Swyllys if (oclass & PK_CRL_OBJ) { 4765051Swyllys char *crldata = NULL; 4775051Swyllys 4785051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 4795051Swyllys &kstype, sizeof (kstype)); 4805051Swyllys numattr++; 4813089Swyllys 4825051Swyllys if (dir != NULL) { 4835051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4845051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir)); 4855051Swyllys numattr++; 4865051Swyllys } 4875051Swyllys if (filename != NULL) { 4885051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4895051Swyllys KMF_CRL_FILENAME_ATTR, 4905051Swyllys filename, strlen(filename)); 4915051Swyllys numattr++; 4925051Swyllys } 4935051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR, 4945051Swyllys &crldata, sizeof (char *)); 4955051Swyllys numattr++; 4963089Swyllys 4975051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist); 4985051Swyllys if (rv == KMF_OK && crldata != NULL) { 4993089Swyllys (void) printf("%s\n", crldata); 5003089Swyllys free(crldata); 50117Sdinak } 50217Sdinak } 50317Sdinak 5043089Swyllys return (rv); 5053089Swyllys } 5063089Swyllys 5073089Swyllys static int 5083089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass, 5093089Swyllys char *dir, char *filename, KMF_BIGINT *serial, 5103089Swyllys char *issuer, char *subject, 5113089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 5123089Swyllys { 5133089Swyllys int rv; 5145051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 5155051Swyllys int numattr = 0; 5165051Swyllys KMF_ATTRIBUTE attrlist[16]; 5175051Swyllys KMF_KEY_CLASS keyclass; 5185051Swyllys KMF_ENCODE_FORMAT format; 5195051Swyllys char *defaultdir = "."; 5203089Swyllys 5213089Swyllys if (oclass & PK_KEY_OBJ) { 5225051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 5235051Swyllys &kstype, sizeof (kstype)); 5245051Swyllys numattr++; 5255051Swyllys 5265051Swyllys if (dir == NULL && filename == NULL) 5275051Swyllys dir = defaultdir; 5285051Swyllys 5295051Swyllys if (dir != NULL) { 5305051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5315051Swyllys KMF_DIRPATH_ATTR, dir, 5325051Swyllys strlen(dir)); 5335051Swyllys numattr++; 5345051Swyllys } 5355051Swyllys 5365051Swyllys if (filename != NULL) { 5375051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5385051Swyllys KMF_KEY_FILENAME_ATTR, filename, 5395051Swyllys strlen(filename)); 5405051Swyllys numattr++; 5415051Swyllys } 5425051Swyllys 5433089Swyllys if (oclass & PK_PRIKEY_OBJ) { 5445051Swyllys int num = numattr; 5453089Swyllys 5465051Swyllys keyclass = KMF_ASYM_PRI; 5475051Swyllys kmf_set_attr_at_index(attrlist, num, 5485051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 5495051Swyllys sizeof (keyclass)); 5505051Swyllys num++; 5515051Swyllys 5525051Swyllys /* list asymmetric private keys */ 5535051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 5543089Swyllys } 5553089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 5563089Swyllys rv = KMF_OK; 5573089Swyllys 5583089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 5595051Swyllys int num = numattr; 5605051Swyllys 5615051Swyllys keyclass = KMF_SYMMETRIC; 5625051Swyllys kmf_set_attr_at_index(attrlist, num, 5635051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 5645051Swyllys sizeof (keyclass)); 5655051Swyllys num++; 5663089Swyllys 5675051Swyllys format = KMF_FORMAT_RAWKEY; 5685051Swyllys kmf_set_attr_at_index(attrlist, num, 5695051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 5705051Swyllys sizeof (format)); 5715051Swyllys num++; 5725051Swyllys 5735051Swyllys /* list symmetric keys */ 5745051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 5753089Swyllys } 5763089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 5773089Swyllys rv = KMF_OK; 5783089Swyllys if (rv != KMF_OK) 5793089Swyllys return (rv); 58017Sdinak } 58117Sdinak 5825051Swyllys numattr = 0; 5833089Swyllys if (oclass & PK_CERT_OBJ) { 5845051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5855051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 5865051Swyllys sizeof (kstype)); 5875051Swyllys numattr++; 5885051Swyllys 5895051Swyllys if (issuer != NULL) { 5905051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5915051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 5925051Swyllys strlen(issuer)); 5935051Swyllys numattr++; 5945051Swyllys } 5955051Swyllys 5965051Swyllys if (subject != NULL) { 5975051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5985051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 5995051Swyllys strlen(subject)); 6005051Swyllys numattr++; 6015051Swyllys } 60217Sdinak 6035051Swyllys if (serial != NULL) { 6045051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6055051Swyllys KMF_BIGINT_ATTR, serial, 6065051Swyllys sizeof (KMF_BIGINT)); 6075051Swyllys numattr++; 6085051Swyllys } 6095051Swyllys 6105051Swyllys if (filename != NULL) { 6115051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6125051Swyllys KMF_CERT_FILENAME_ATTR, filename, 6135051Swyllys strlen(filename)); 6145051Swyllys numattr++; 6155051Swyllys } 6165051Swyllys 6175051Swyllys if (dir != NULL) { 6185051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6195051Swyllys KMF_DIRPATH_ATTR, dir, 6205051Swyllys strlen(dir)); 6215051Swyllys numattr++; 6225051Swyllys } 6235051Swyllys 6245051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6255051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 6265051Swyllys sizeof (KMF_CERT_VALIDITY)); 6275051Swyllys numattr++; 6285051Swyllys 6295051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 6303089Swyllys if (rv != KMF_OK) 6313089Swyllys return (rv); 63217Sdinak } 63317Sdinak 6345051Swyllys numattr = 0; 6353089Swyllys if (oclass & PK_CRL_OBJ) { 6365051Swyllys char *crldata = NULL; 6375051Swyllys 6385051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 6395051Swyllys &kstype, sizeof (kstype)); 6405051Swyllys numattr++; 64117Sdinak 6425051Swyllys if (dir != NULL) { 6435051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6445051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir)); 6455051Swyllys numattr++; 6465051Swyllys } 6475051Swyllys if (filename != NULL) { 6485051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6495051Swyllys KMF_CRL_FILENAME_ATTR, 6505051Swyllys filename, strlen(filename)); 6515051Swyllys numattr++; 6525051Swyllys } 6535051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR, 6545051Swyllys &crldata, sizeof (char *)); 6555051Swyllys numattr++; 65617Sdinak 6575051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist); 6585051Swyllys if (rv == KMF_OK && crldata != NULL) { 6593089Swyllys (void) printf("%s\n", crldata); 6603089Swyllys free(crldata); 6613089Swyllys } 66217Sdinak } 66317Sdinak 66417Sdinak return (rv); 66517Sdinak } 66617Sdinak 6673089Swyllys static int 6683089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle, 6693089Swyllys int oclass, char *token_spec, char *dir, char *prefix, 6703089Swyllys char *nickname, KMF_BIGINT *serial, char *issuer, char *subject, 6713089Swyllys KMF_CREDENTIAL *tokencred, 6723089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 67317Sdinak { 6743089Swyllys KMF_RETURN rv = KMF_OK; 6755051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 6765051Swyllys int numattr = 0; 6775051Swyllys KMF_ATTRIBUTE attrlist[16]; 6785051Swyllys KMF_KEY_CLASS keyclass; 6795051Swyllys KMF_ENCODE_FORMAT format; 6803089Swyllys 6813089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 6823089Swyllys if (rv != KMF_OK) 6833089Swyllys return (rv); 68417Sdinak 6855051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 6865051Swyllys &kstype, sizeof (kstype)); 6875051Swyllys numattr++; 6885051Swyllys 6893089Swyllys if (oclass & PK_KEY_OBJ) { 6905051Swyllys if (tokencred != NULL && tokencred->credlen > 0) { 6915051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6925051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 6935051Swyllys sizeof (KMF_CREDENTIAL)); 6945051Swyllys numattr++; 6955051Swyllys } 6965051Swyllys 6975051Swyllys if (token_spec && strlen(token_spec)) { 6985051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6995051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 7005051Swyllys strlen(token_spec)); 7015051Swyllys numattr++; 7025051Swyllys } 7035051Swyllys 7045051Swyllys if (nickname != NULL) { 7055051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7065051Swyllys KMF_KEYLABEL_ATTR, nickname, 7075051Swyllys strlen(nickname)); 7085051Swyllys numattr++; 7095051Swyllys } 71017Sdinak } 71117Sdinak 7123089Swyllys if (oclass & PK_PRIKEY_OBJ) { 7135051Swyllys int num = numattr; 7145051Swyllys 7155051Swyllys keyclass = KMF_ASYM_PRI; 7165051Swyllys kmf_set_attr_at_index(attrlist, num, 7175051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 7185051Swyllys sizeof (keyclass)); 7195051Swyllys num++; 7205051Swyllys 7215051Swyllys /* list asymmetric private keys */ 7225051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 72317Sdinak } 7245051Swyllys 7253089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 7265051Swyllys int num = numattr; 7275051Swyllys 7285051Swyllys keyclass = KMF_SYMMETRIC; 7295051Swyllys kmf_set_attr_at_index(attrlist, num, 7305051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 7315051Swyllys sizeof (keyclass)); 7325051Swyllys num++; 7335051Swyllys 7345051Swyllys format = KMF_FORMAT_RAWKEY; 7355051Swyllys kmf_set_attr_at_index(attrlist, num, 7365051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 7375051Swyllys sizeof (format)); 7385051Swyllys num++; 7395051Swyllys 7405051Swyllys /* list symmetric keys */ 7415051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 7423089Swyllys } 7435051Swyllys 7443089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 7455051Swyllys int num = numattr; 7465051Swyllys 7475051Swyllys keyclass = KMF_ASYM_PUB; 7485051Swyllys kmf_set_attr_at_index(attrlist, num, 7495051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 7505051Swyllys sizeof (keyclass)); 7515051Swyllys num++; 7525051Swyllys 7535051Swyllys /* list asymmetric public keys */ 7545051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 75517Sdinak } 75617Sdinak 7573089Swyllys /* If searching for public objects or certificates, find certs now */ 7585051Swyllys numattr = 0; 7593089Swyllys if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) { 7605051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7615051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 7625051Swyllys sizeof (kstype)); 7635051Swyllys numattr++; 7645051Swyllys 7655051Swyllys if (nickname != NULL) { 7665051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7675051Swyllys KMF_CERT_LABEL_ATTR, nickname, 7685051Swyllys strlen(nickname)); 7695051Swyllys numattr++; 7705051Swyllys } 7715051Swyllys 7725051Swyllys if (issuer != NULL) { 7735051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7745051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 7755051Swyllys strlen(issuer)); 7765051Swyllys numattr++; 7775051Swyllys } 77817Sdinak 7795051Swyllys if (subject != NULL) { 7805051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7815051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 7825051Swyllys strlen(subject)); 7835051Swyllys numattr++; 7845051Swyllys } 7855051Swyllys 7865051Swyllys if (serial != NULL) { 7875051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7885051Swyllys KMF_BIGINT_ATTR, serial, 7895051Swyllys sizeof (KMF_BIGINT)); 7905051Swyllys numattr++; 7915051Swyllys } 79217Sdinak 7935051Swyllys if (token_spec != NULL) { 7945051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7955051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 7965051Swyllys strlen(token_spec)); 7975051Swyllys numattr++; 7985051Swyllys } 7995051Swyllys 8005051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8015051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 8025051Swyllys sizeof (KMF_CERT_VALIDITY)); 8035051Swyllys numattr++; 8045051Swyllys 8055051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 80617Sdinak } 80717Sdinak 8085051Swyllys numattr = 0; 8093089Swyllys if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) { 8103089Swyllys int numcrls; 8115051Swyllys 8125051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 8135051Swyllys &kstype, sizeof (kstype)); 8145051Swyllys numattr++; 8153089Swyllys 8165051Swyllys if (token_spec != NULL) { 8175051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8185051Swyllys KMF_TOKEN_LABEL_ATTR, 8195051Swyllys token_spec, strlen(token_spec)); 8205051Swyllys numattr++; 8215051Swyllys } 8225051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR, 8235051Swyllys &numcrls, sizeof (int)); 8245051Swyllys numattr++; 8253089Swyllys 8265051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist); 8273089Swyllys if (rv == KMF_OK) { 8283089Swyllys char **p; 8293089Swyllys if (numcrls == 0) { 8303089Swyllys (void) printf(gettext("No CRLs found in " 8315051Swyllys "NSS keystore.\n")); 83217Sdinak 8333089Swyllys return (KMF_OK); 8343089Swyllys } 8353089Swyllys p = malloc(numcrls * sizeof (char *)); 8363089Swyllys if (p == NULL) { 8373089Swyllys return (KMF_ERR_MEMORY); 8383089Swyllys } 8393089Swyllys (void) memset(p, 0, numcrls * sizeof (char *)); 8405051Swyllys 8415051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8425051Swyllys KMF_CRL_NAMELIST_ATTR, p, sizeof (char *)); 8435051Swyllys numattr++; 8445051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist); 8453089Swyllys if (rv == KMF_OK) { 8463089Swyllys int i; 8473089Swyllys for (i = 0; i < numcrls; i++) { 8483089Swyllys (void) printf("%d. Name = %s\n", 8495051Swyllys i + 1, p[i]); 8503089Swyllys free(p[i]); 8513089Swyllys } 8523089Swyllys } 8533089Swyllys free(p); 85417Sdinak } 85517Sdinak } 85617Sdinak return (rv); 85717Sdinak } 85817Sdinak 85917Sdinak /* 86017Sdinak * List token object. 86117Sdinak */ 86217Sdinak int 86317Sdinak pk_list(int argc, char *argv[]) 86417Sdinak { 86517Sdinak int opt; 866864Sdinak extern int optind_av; 867864Sdinak extern char *optarg_av; 868864Sdinak char *token_spec = NULL; 8693089Swyllys char *subject = NULL; 8703089Swyllys char *issuer = NULL; 8713089Swyllys char *dir = NULL; 8723089Swyllys char *prefix = NULL; 8733089Swyllys char *filename = NULL; 8743089Swyllys char *serstr = NULL; 8753089Swyllys KMF_BIGINT serial = { NULL, 0 }; 87617Sdinak 8773089Swyllys char *list_label = NULL; 8783089Swyllys int oclass = 0; 8793089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 8803089Swyllys KMF_RETURN rv = KMF_OK; 8813089Swyllys KMF_HANDLE_T kmfhandle = NULL; 8823089Swyllys char *find_criteria = NULL; 8833089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 8843089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 88517Sdinak 88617Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 887864Sdinak while ((opt = getopt_av(argc, argv, 8885051Swyllys "k:(keystore)t:(objtype)T:(token)d:(dir)" 8895051Swyllys "p:(prefix)n:(nickname)S:(serial)s:(subject)" 8905051Swyllys "c:(criteria)" 8915051Swyllys "i:(issuer)l:(label)f:(infile)")) != EOF) { 8923089Swyllys if (EMPTYSTRING(optarg_av)) 8933089Swyllys return (PK_ERR_USAGE); 89417Sdinak switch (opt) { 8953089Swyllys case 'k': 8963089Swyllys if (kstype != 0) 8973089Swyllys return (PK_ERR_USAGE); 8983089Swyllys kstype = KS2Int(optarg_av); 8993089Swyllys if (kstype == 0) 9003089Swyllys return (PK_ERR_USAGE); 9013089Swyllys break; 9023089Swyllys case 't': 9033089Swyllys if (oclass != 0) 9043089Swyllys return (PK_ERR_USAGE); 9053089Swyllys oclass = OT2Int(optarg_av); 9063089Swyllys if (oclass == -1) 9073089Swyllys return (PK_ERR_USAGE); 9083089Swyllys break; 9093089Swyllys case 's': 9103089Swyllys if (subject) 9113089Swyllys return (PK_ERR_USAGE); 9123089Swyllys subject = optarg_av; 9133089Swyllys break; 9143089Swyllys case 'i': 9153089Swyllys if (issuer) 9163089Swyllys return (PK_ERR_USAGE); 9173089Swyllys issuer = optarg_av; 9183089Swyllys break; 9193089Swyllys case 'd': 9203089Swyllys if (dir) 9213089Swyllys return (PK_ERR_USAGE); 9223089Swyllys dir = optarg_av; 9233089Swyllys break; 9243089Swyllys case 'p': 9253089Swyllys if (prefix) 9263089Swyllys return (PK_ERR_USAGE); 9273089Swyllys prefix = optarg_av; 9283089Swyllys break; 9293089Swyllys case 'S': 9303089Swyllys serstr = optarg_av; 9313089Swyllys break; 9323089Swyllys case 'f': 9333089Swyllys if (filename) 9343089Swyllys return (PK_ERR_USAGE); 9353089Swyllys filename = optarg_av; 9363089Swyllys break; 9373089Swyllys case 'T': /* token specifier */ 9383089Swyllys if (token_spec) 9393089Swyllys return (PK_ERR_USAGE); 9403089Swyllys token_spec = optarg_av; 9413089Swyllys break; 9423089Swyllys case 'n': 9433089Swyllys case 'l': /* object with specific label */ 9443089Swyllys if (list_label) 9453089Swyllys return (PK_ERR_USAGE); 9463089Swyllys list_label = optarg_av; 9473089Swyllys break; 9483089Swyllys case 'c': 9493089Swyllys find_criteria = optarg_av; 9503089Swyllys if (!strcasecmp(find_criteria, "valid")) 9513089Swyllys find_criteria_flag = 9523089Swyllys KMF_NONEXPIRED_CERTS; 9533089Swyllys else if (!strcasecmp(find_criteria, "expired")) 9543089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS; 9553089Swyllys else if (!strcasecmp(find_criteria, "both")) 9563089Swyllys find_criteria_flag = KMF_ALL_CERTS; 9573089Swyllys else 9583089Swyllys return (PK_ERR_USAGE); 9593089Swyllys break; 9603089Swyllys default: 961864Sdinak return (PK_ERR_USAGE); 96217Sdinak } 96317Sdinak } 96417Sdinak /* No additional args allowed. */ 965864Sdinak argc -= optind_av; 966864Sdinak argv += optind_av; 96717Sdinak if (argc) 96817Sdinak return (PK_ERR_USAGE); 96917Sdinak 9705051Swyllys if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) { 9713089Swyllys /* Error message ? */ 9723089Swyllys return (rv); 97317Sdinak } 97417Sdinak 9753089Swyllys /* Assume keystore = PKCS#11 if not specified. */ 9763089Swyllys if (kstype == 0) 9773089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 97817Sdinak 9793089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 9803089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 9815051Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 9823089Swyllys 9833089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 9845051Swyllys "is only relevant if keystore=pkcs11\n")); 9853089Swyllys return (PK_ERR_USAGE); 98617Sdinak } 98717Sdinak 9883089Swyllys /* If no object class specified, list certificate objects. */ 9893089Swyllys if (oclass == 0) 9903089Swyllys oclass = PK_CERT_OBJ; 9913089Swyllys 9923089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) { 9933089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 9943089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) { 9953089Swyllys token_spec = DEFAULT_NSS_TOKEN; 99617Sdinak } 99717Sdinak 9983089Swyllys if (serstr != NULL) { 9993089Swyllys uchar_t *bytes = NULL; 10003089Swyllys size_t bytelen; 10013089Swyllys 10025051Swyllys rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen); 10033089Swyllys if (rv != KMF_OK || bytes == NULL) { 10043089Swyllys (void) fprintf(stderr, gettext("serial number " 10055051Swyllys "must be specified as a hex number " 10065051Swyllys "(ex: 0x0102030405ffeeddee)\n")); 10073089Swyllys return (PK_ERR_USAGE); 10083089Swyllys } 10093089Swyllys serial.val = bytes; 10103089Swyllys serial.len = bytelen; 101117Sdinak } 101217Sdinak 10133089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 10145051Swyllys kstype == KMF_KEYSTORE_NSS) && 10155051Swyllys (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) { 10163089Swyllys 10173089Swyllys (void) get_token_password(kstype, token_spec, 10185051Swyllys &tokencred); 10193089Swyllys } 10203089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) { 10213089Swyllys rv = list_pk11_objects(kmfhandle, token_spec, 10225051Swyllys oclass, list_label, &serial, 10235051Swyllys issuer, subject, dir, filename, 10245051Swyllys &tokencred, find_criteria_flag); 102517Sdinak 10263089Swyllys } else if (kstype == KMF_KEYSTORE_NSS) { 10273089Swyllys if (dir == NULL) 10283089Swyllys dir = PK_DEFAULT_DIRECTORY; 10293089Swyllys rv = list_nss_objects(kmfhandle, 10305051Swyllys oclass, token_spec, dir, prefix, 10315051Swyllys list_label, &serial, issuer, subject, 10325051Swyllys &tokencred, find_criteria_flag); 10333089Swyllys 10343089Swyllys } else if (kstype == KMF_KEYSTORE_OPENSSL) { 10353089Swyllys 10363089Swyllys rv = list_file_objects(kmfhandle, 10375051Swyllys oclass, dir, filename, 10385051Swyllys &serial, issuer, subject, find_criteria_flag); 103917Sdinak } 104017Sdinak 10413089Swyllys if (rv != KMF_OK) { 10423089Swyllys display_error(kmfhandle, rv, 10435051Swyllys gettext("Error listing objects")); 10443089Swyllys } 10453089Swyllys 10463089Swyllys if (serial.val != NULL) 10473089Swyllys free(serial.val); 10483089Swyllys 10493089Swyllys if (tokencred.cred != NULL) 10503089Swyllys free(tokencred.cred); 10513089Swyllys 10525051Swyllys (void) kmf_finalize(kmfhandle); 10533089Swyllys return (rv); 105417Sdinak } 1055