117Sdinak /* 217Sdinak * CDDL HEADER START 317Sdinak * 417Sdinak * The contents of this file are subject to the terms of the 53089Swyllys * Common Development and Distribution License (the "License"). 63089Swyllys * You may not use this file except in compliance with the License. 717Sdinak * 817Sdinak * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 917Sdinak * or http://www.opensolaris.org/os/licensing. 1017Sdinak * See the License for the specific language governing permissions 1117Sdinak * and limitations under the License. 1217Sdinak * 1317Sdinak * When distributing Covered Code, include this CDDL HEADER in each 1417Sdinak * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1517Sdinak * If applicable, add the following below this CDDL HEADER, with the 1617Sdinak * fields enclosed by brackets "[]" replaced with your own identifying 1717Sdinak * information: Portions Copyright [yyyy] [name of copyright owner] 1817Sdinak * 1917Sdinak * CDDL HEADER END 2017Sdinak */ 2117Sdinak /* 22*11973Swyllys.ingersoll@sun.com * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2317Sdinak * Use is subject to license terms. 2417Sdinak */ 2517Sdinak 2617Sdinak /* 2717Sdinak * This file implements the token object list operation for this tool. 2817Sdinak * It loads the PKCS#11 modules, finds the object to list, lists it, 2917Sdinak * and cleans up. User must be logged into the token to list private 3017Sdinak * objects. 3117Sdinak */ 3217Sdinak 3317Sdinak #include <stdio.h> 3417Sdinak #include <errno.h> 3517Sdinak #include <string.h> 3617Sdinak #include <cryptoutil.h> 3717Sdinak #include <security/cryptoki.h> 3817Sdinak #include "common.h" 393089Swyllys 403089Swyllys #include <kmfapi.h> 4117Sdinak 423089Swyllys static void 433089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs) 4417Sdinak { 453089Swyllys int i; 463089Swyllys char *subject, *issuer, *serial, *id, *altname; 475051Swyllys char *start, *end, *keyusage, *extkeyusage; 4817Sdinak 493089Swyllys for (i = 0; i < num_certs; i++) { 503089Swyllys subject = NULL; 513089Swyllys issuer = NULL; 523089Swyllys serial = NULL; 533089Swyllys id = NULL; 543089Swyllys altname = NULL; 555051Swyllys start = end = NULL; 565051Swyllys keyusage = extkeyusage = NULL; 5717Sdinak 583089Swyllys (void) fprintf(stdout, 595051Swyllys gettext("%d. (X.509 certificate)\n"), i + 1); 603089Swyllys if (certs[i].kmf_private.label != NULL) 613089Swyllys (void) fprintf(stdout, gettext("\t%s: %s\n"), 625051Swyllys (certs[i].kmf_private.keystore_type == 635051Swyllys KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"), 645051Swyllys certs[i].kmf_private.label); 655051Swyllys if (kmf_get_cert_id_str(&certs[i].certificate, 665051Swyllys &id) == KMF_OK) 673089Swyllys (void) fprintf(stdout, gettext("\tID: %s\n"), id); 685051Swyllys if (kmf_get_cert_subject_str(kmfhandle, 695051Swyllys &certs[i].certificate, &subject) == KMF_OK) 703089Swyllys (void) fprintf(stdout, gettext("\tSubject: %s\n"), 715051Swyllys subject); 725051Swyllys if (kmf_get_cert_issuer_str(kmfhandle, 735051Swyllys &certs[i].certificate, &issuer) == KMF_OK) 743089Swyllys (void) fprintf(stdout, gettext("\tIssuer: %s\n"), 755051Swyllys issuer); 765051Swyllys if (kmf_get_cert_start_date_str(kmfhandle, 775051Swyllys &certs[i].certificate, &start) == KMF_OK) 785051Swyllys (void) fprintf(stdout, gettext("\tNot Before: %s\n"), 795051Swyllys start); 805051Swyllys if (kmf_get_cert_end_date_str(kmfhandle, 815051Swyllys &certs[i].certificate, &end) == KMF_OK) 825051Swyllys (void) fprintf(stdout, gettext("\tNot After: %s\n"), 835051Swyllys end); 845051Swyllys if (kmf_get_cert_serial_str(kmfhandle, 855051Swyllys &certs[i].certificate, &serial) == KMF_OK) 863089Swyllys (void) fprintf(stdout, gettext("\tSerial: %s\n"), 875051Swyllys serial); 885051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 895051Swyllys &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME, 905051Swyllys &altname) == KMF_OK) { 915051Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 925051Swyllys altname); 935051Swyllys } 945051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 955051Swyllys &certs[i].certificate, KMF_X509_EXT_KEY_USAGE, 965051Swyllys &keyusage) == KMF_OK) { 973089Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 985051Swyllys keyusage); 995051Swyllys } 1005051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 1015051Swyllys &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE, 1025051Swyllys &extkeyusage) == KMF_OK) { 1035051Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 1045051Swyllys extkeyusage); 1053089Swyllys } 1065051Swyllys kmf_free_str(subject); 1075051Swyllys kmf_free_str(issuer); 1085051Swyllys kmf_free_str(serial); 1095051Swyllys kmf_free_str(id); 1105051Swyllys kmf_free_str(altname); 1115051Swyllys kmf_free_str(keyusage); 1125051Swyllys kmf_free_str(extkeyusage); 1135051Swyllys kmf_free_str(start); 1145051Swyllys kmf_free_str(end); 1153089Swyllys (void) fprintf(stdout, "\n"); 11617Sdinak } 11717Sdinak } 11817Sdinak 1193089Swyllys static char * 1203089Swyllys describeKey(KMF_KEY_HANDLE *key) 12117Sdinak { 1223089Swyllys if (key->keyclass == KMF_ASYM_PUB) { 1233089Swyllys if (key->keyalg == KMF_RSA) 1243089Swyllys return (gettext("RSA public key")); 1253089Swyllys if (key->keyalg == KMF_DSA) 1263089Swyllys return (gettext("DSA public key")); 127*11973Swyllys.ingersoll@sun.com if (key->keyalg == KMF_ECDSA) 128*11973Swyllys.ingersoll@sun.com return (gettext("ECDSA public key")); 12917Sdinak } 1303089Swyllys if (key->keyclass == KMF_ASYM_PRI) { 1313089Swyllys if (key->keyalg == KMF_RSA) 132*11973Swyllys.ingersoll@sun.com return (gettext("RSA private key")); 1333089Swyllys if (key->keyalg == KMF_DSA) 134*11973Swyllys.ingersoll@sun.com return (gettext("DSA private key")); 135*11973Swyllys.ingersoll@sun.com if (key->keyalg == KMF_ECDSA) 136*11973Swyllys.ingersoll@sun.com return (gettext("ECDSA private key")); 13717Sdinak } 1383089Swyllys if (key->keyclass == KMF_SYMMETRIC) { 1393089Swyllys switch (key->keyalg) { 1403089Swyllys case KMF_AES: 1413089Swyllys return (gettext("AES")); 1423089Swyllys break; 1433089Swyllys case KMF_RC4: 1443089Swyllys return (gettext("ARCFOUR")); 1453089Swyllys break; 1463089Swyllys case KMF_DES: 1473089Swyllys return (gettext("DES")); 1483089Swyllys break; 1493089Swyllys case KMF_DES3: 1503089Swyllys return (gettext("Triple-DES")); 1513089Swyllys break; 1523089Swyllys default: 1533089Swyllys return (gettext("symmetric")); 1543089Swyllys break; 15517Sdinak } 15617Sdinak } 15717Sdinak 1583089Swyllys return (gettext("unrecognized key object")); 1593089Swyllys 1603089Swyllys } 16117Sdinak 1623089Swyllys 1633089Swyllys static void 1643089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys) 1653089Swyllys { 1663089Swyllys int i; 1673089Swyllys 1683089Swyllys for (i = 0; i < numkeys; i++) { 1694006Shylee (void) fprintf(stdout, gettext("Key #%d - %s: %s"), 1705051Swyllys i+1, describeKey(&keys[i]), 1715051Swyllys keys[i].keylabel ? keys[i].keylabel : 1725051Swyllys gettext("No label")); 1733089Swyllys 1743089Swyllys if (keys[i].keyclass == KMF_SYMMETRIC) { 1753089Swyllys KMF_RETURN rv; 1763089Swyllys KMF_RAW_SYM_KEY rkey; 1774006Shylee 1785051Swyllys (void) memset(&rkey, 0, sizeof (rkey)); 1795051Swyllys rv = kmf_get_sym_key_value(handle, &keys[i], 1805051Swyllys &rkey); 1813089Swyllys if (rv == KMF_OK) { 1824006Shylee (void) fprintf(stdout, " (%d bits)", 1835051Swyllys rkey.keydata.len * 8); 1845051Swyllys kmf_free_bigint(&rkey.keydata); 1855051Swyllys } else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) { 1865051Swyllys if (rv == KMF_ERR_SENSITIVE_KEY) { 1875051Swyllys (void) fprintf(stdout, " (sensitive)"); 1885051Swyllys } else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) { 1895051Swyllys (void) fprintf(stdout, 1905051Swyllys " (non-extractable)"); 1915051Swyllys } else { 1925051Swyllys char *err = NULL; 1935051Swyllys if (kmf_get_kmf_error_str(rv, &err) == 1945051Swyllys KMF_OK) 1955051Swyllys (void) fprintf(stdout, 1965051Swyllys " (error: %s)", err); 1975051Swyllys if (err != NULL) 1985051Swyllys free(err); 1995051Swyllys } 2003089Swyllys } 20117Sdinak } 2023089Swyllys (void) fprintf(stdout, "\n"); 20317Sdinak } 2043089Swyllys } 20517Sdinak 2063089Swyllys /* 2073089Swyllys * Generic routine used by all "list cert" operations to find 2083089Swyllys * all matching certificates. 2093089Swyllys */ 2103089Swyllys static KMF_RETURN 2115051Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr) 2123089Swyllys { 2133089Swyllys KMF_RETURN rv = KMF_OK; 2143089Swyllys KMF_X509_DER_CERT *certlist = NULL; 2153089Swyllys uint32_t numcerts = 0; 2165051Swyllys KMF_KEYSTORE_TYPE kstype; 21717Sdinak 2185051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 2195051Swyllys &kstype, NULL); 2205051Swyllys if (rv != KMF_OK) 2215051Swyllys return (rv); 2225051Swyllys 2235051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR, 2245051Swyllys &numcerts, sizeof (uint32_t)); 2255051Swyllys numattr++; 2265051Swyllys 2275051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist); 2283089Swyllys if (rv == KMF_OK && numcerts > 0) { 2293089Swyllys (void) printf(gettext("Found %d certificates.\n"), 2305051Swyllys numcerts); 2313089Swyllys certlist = (KMF_X509_DER_CERT *)malloc(numcerts * 2325051Swyllys sizeof (KMF_X509_DER_CERT)); 2333089Swyllys if (certlist == NULL) 2343089Swyllys return (KMF_ERR_MEMORY); 2353089Swyllys (void) memset(certlist, 0, numcerts * 2365051Swyllys sizeof (KMF_X509_DER_CERT)); 2373089Swyllys 2385051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2395051Swyllys KMF_X509_DER_CERT_ATTR, certlist, 2405051Swyllys sizeof (KMF_X509_DER_CERT)); 2415051Swyllys numattr++; 2425051Swyllys 2435051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist); 2443089Swyllys if (rv == KMF_OK) { 2453089Swyllys int i; 2463089Swyllys (void) pk_show_certs(kmfhandle, certlist, 2475051Swyllys numcerts); 2483089Swyllys for (i = 0; i < numcerts; i++) 2495051Swyllys kmf_free_kmf_cert(kmfhandle, &certlist[i]); 2503089Swyllys } 2513089Swyllys free(certlist); 25217Sdinak } 2533089Swyllys if (rv == KMF_ERR_CERT_NOT_FOUND && 2545051Swyllys kstype != KMF_KEYSTORE_OPENSSL) 2553089Swyllys rv = KMF_OK; 25617Sdinak 25717Sdinak return (rv); 25817Sdinak } 25917Sdinak 2603089Swyllys static KMF_RETURN 2615221Swyllys pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr, char *label) 26217Sdinak { 2633089Swyllys KMF_RETURN rv; 2643089Swyllys KMF_KEY_HANDLE *keys; 2653089Swyllys uint32_t numkeys = 0; 2665051Swyllys KMF_KEYSTORE_TYPE kstype; 2673089Swyllys 2685051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 2695051Swyllys &kstype, NULL); 2705051Swyllys if (rv != KMF_OK) 2715051Swyllys return (rv); 2725051Swyllys 2735051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR, 2745051Swyllys &numkeys, sizeof (uint32_t)); 2755051Swyllys numattr++; 2765051Swyllys 2775051Swyllys rv = kmf_find_key(handle, numattr, attrlist); 2783089Swyllys if (rv == KMF_OK && numkeys > 0) { 2793089Swyllys int i; 2805221Swyllys (void) printf(gettext("Found %d %s keys.\n"), 2815221Swyllys numkeys, label); 2823089Swyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 2835051Swyllys sizeof (KMF_KEY_HANDLE)); 2843089Swyllys if (keys == NULL) 2853089Swyllys return (KMF_ERR_MEMORY); 2863089Swyllys (void) memset(keys, 0, numkeys * 2875051Swyllys sizeof (KMF_KEY_HANDLE)); 28817Sdinak 2895051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2905051Swyllys KMF_KEY_HANDLE_ATTR, 2915051Swyllys keys, sizeof (KMF_KEY_HANDLE)); 2925051Swyllys numattr++; 2935051Swyllys 2945051Swyllys rv = kmf_find_key(handle, numattr, attrlist); 2953089Swyllys if (rv == KMF_OK) 2963089Swyllys pk_show_keys(handle, keys, numkeys); 2973089Swyllys for (i = 0; i < numkeys; i++) 2985051Swyllys kmf_free_kmf_key(handle, &keys[i]); 2993089Swyllys free(keys); 3003089Swyllys } 3013089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND && 3025051Swyllys kstype != KMF_KEYSTORE_OPENSSL) 3033089Swyllys rv = KMF_OK; 3043089Swyllys return (rv); 3053089Swyllys } 30617Sdinak 3073089Swyllys static KMF_RETURN 3083089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass, 3093089Swyllys char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject, 3103089Swyllys char *dir, char *filename, KMF_CREDENTIAL *tokencred, 3113089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 3123089Swyllys { 3133089Swyllys KMF_RETURN rv; 3145051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 3155051Swyllys int numattr = 0; 3166354Swyllys KMF_ATTRIBUTE attrlist[18]; 3175051Swyllys boolean_t token_bool = B_TRUE; 3185051Swyllys boolean_t private = B_FALSE; 3195051Swyllys KMF_KEY_CLASS keyclass; 3205051Swyllys KMF_ENCODE_FORMAT format; 3216354Swyllys int auth = 0; 3226354Swyllys KMF_CREDENTIAL cred = {NULL, 0}; 3233089Swyllys 3243089Swyllys /* 325*11973Swyllys.ingersoll@sun.com * Symmetric keys and RSA/DSA/ECDSA private keys are always 3263089Swyllys * created with the "CKA_PRIVATE" field == TRUE, so 3273089Swyllys * make sure we search for them with it also set. 3283089Swyllys */ 3293089Swyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 3303089Swyllys oclass |= PK_PRIVATE_OBJ; 3313089Swyllys 3323089Swyllys rv = select_token(kmfhandle, token, 3335051Swyllys !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ))); 3343089Swyllys 3353089Swyllys if (rv != KMF_OK) { 33617Sdinak return (rv); 33717Sdinak } 33817Sdinak 3396354Swyllys rv = token_auth_needed(kmfhandle, token, &auth); 3406354Swyllys if (rv != KMF_OK) 3416354Swyllys return (rv); 3426354Swyllys 3436354Swyllys if (tokencred != NULL) 3446354Swyllys cred = *tokencred; 3456354Swyllys 3463089Swyllys if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) { 3475051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 3485051Swyllys &kstype, sizeof (kstype)); 3495051Swyllys numattr++; 3505051Swyllys 3515051Swyllys if (objlabel != NULL) { 3525051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3535051Swyllys KMF_KEYLABEL_ATTR, objlabel, 3545051Swyllys strlen(objlabel)); 3555051Swyllys numattr++; 3565051Swyllys } 3573089Swyllys 3585051Swyllys private = ((oclass & PK_PRIVATE_OBJ) > 0); 3595051Swyllys 3605051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3615051Swyllys KMF_PRIVATE_BOOL_ATTR, &private, 3625051Swyllys sizeof (private)); 3635051Swyllys numattr++; 3645051Swyllys 3655051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3665051Swyllys KMF_TOKEN_BOOL_ATTR, &token_bool, 3675051Swyllys sizeof (token_bool)); 3685051Swyllys numattr++; 3693089Swyllys 3703089Swyllys if (oclass & PK_PRIKEY_OBJ) { 3715051Swyllys int num = numattr; 3725051Swyllys 3735051Swyllys keyclass = KMF_ASYM_PRI; 3745051Swyllys kmf_set_attr_at_index(attrlist, num, 3755051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 3765051Swyllys sizeof (keyclass)); 3775051Swyllys num++; 3785051Swyllys 3795051Swyllys if (tokencred != NULL && 3805051Swyllys tokencred->credlen > 0) { 3815051Swyllys kmf_set_attr_at_index(attrlist, num, 3825051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 3835051Swyllys sizeof (KMF_CREDENTIAL)); 3845051Swyllys num++; 3855051Swyllys } 3863089Swyllys 3873089Swyllys /* list asymmetric private keys */ 3885221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, 3895221Swyllys "asymmetric private"); 3903089Swyllys } 3913089Swyllys 3923089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 3935051Swyllys int num = numattr; 3945051Swyllys 3955051Swyllys keyclass = KMF_SYMMETRIC; 3965051Swyllys kmf_set_attr_at_index(attrlist, num, 3975051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 3985051Swyllys sizeof (keyclass)); 3995051Swyllys num++; 4005051Swyllys 4015051Swyllys if (tokencred != NULL && 4025051Swyllys tokencred->credlen > 0) { 4035051Swyllys kmf_set_attr_at_index(attrlist, num, 4045051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 4055051Swyllys sizeof (KMF_CREDENTIAL)); 4065051Swyllys num++; 4075051Swyllys } 4085051Swyllys 4095051Swyllys format = KMF_FORMAT_RAWKEY; 4105051Swyllys kmf_set_attr_at_index(attrlist, num, 4115051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 4125051Swyllys sizeof (format)); 4135051Swyllys num++; 4143089Swyllys 4153089Swyllys /* list symmetric keys */ 4165221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, 4175221Swyllys "symmetric"); 41817Sdinak } 4193089Swyllys 4203089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 4215051Swyllys int num = numattr; 4225051Swyllys 4236354Swyllys if (auth > 0 && (tokencred == NULL || 4246354Swyllys tokencred->cred == NULL) && 4256354Swyllys (cred.cred == NULL)) { 4266354Swyllys (void) get_token_password(kstype, token, &cred); 4276354Swyllys kmf_set_attr_at_index(attrlist, numattr, 4286354Swyllys KMF_CREDENTIAL_ATTR, 4296354Swyllys &cred, sizeof (KMF_CREDENTIAL)); 4306354Swyllys numattr++; 4316354Swyllys } 4326354Swyllys 4335128Swyllys private = B_FALSE; 4345051Swyllys keyclass = KMF_ASYM_PUB; 4355051Swyllys kmf_set_attr_at_index(attrlist, num, 4365051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 4375051Swyllys sizeof (keyclass)); 4385051Swyllys num++; 4393089Swyllys 4403089Swyllys /* list asymmetric public keys (if any) */ 4415221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, 4425221Swyllys "asymmetric public"); 4433089Swyllys } 4443089Swyllys 4453089Swyllys if (rv != KMF_OK) 4463089Swyllys return (rv); 4473089Swyllys } 4483089Swyllys 4495051Swyllys numattr = 0; 4503089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 4515051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 4525051Swyllys &kstype, sizeof (kstype)); 4536354Swyllys 4545051Swyllys numattr++; 4556354Swyllys if (auth > 0 && (cred.cred == NULL)) { 4566354Swyllys (void) get_token_password(kstype, token, &cred); 4576354Swyllys } 4586354Swyllys 4596354Swyllys if (cred.cred != NULL) { 4606354Swyllys kmf_set_attr_at_index(attrlist, numattr, 4616354Swyllys KMF_CREDENTIAL_ATTR, 4626354Swyllys &cred, sizeof (KMF_CREDENTIAL)); 4636354Swyllys numattr++; 4646354Swyllys } 4655051Swyllys 4665051Swyllys if (objlabel != NULL) { 4675051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4685051Swyllys KMF_CERT_LABEL_ATTR, objlabel, 4695051Swyllys strlen(objlabel)); 4705051Swyllys numattr++; 4715051Swyllys } 4725051Swyllys 4735051Swyllys if (issuer != NULL) { 4745051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4755051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 4765051Swyllys strlen(issuer)); 4775051Swyllys numattr++; 4785051Swyllys } 4793089Swyllys 4805051Swyllys if (subject != NULL) { 4815051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4825051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 4835051Swyllys strlen(subject)); 4845051Swyllys numattr++; 4855051Swyllys } 4863089Swyllys 4876354Swyllys if (serial != NULL && serial->val != NULL) { 4885051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4895051Swyllys KMF_BIGINT_ATTR, serial, 4905051Swyllys sizeof (KMF_BIGINT)); 4915051Swyllys numattr++; 4925051Swyllys } 4935051Swyllys 4945051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4955051Swyllys KMF_PRIVATE_BOOL_ATTR, &private, 4965051Swyllys sizeof (private)); 4975051Swyllys numattr++; 4985051Swyllys 4995051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5005051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 5015051Swyllys sizeof (KMF_CERT_VALIDITY)); 5025051Swyllys numattr++; 5035051Swyllys 5045051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 5053089Swyllys if (rv != KMF_OK) 5063089Swyllys return (rv); 5073089Swyllys } 5083089Swyllys 5095051Swyllys numattr = 0; 5105051Swyllys kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */ 5113089Swyllys if (oclass & PK_CRL_OBJ) { 5125051Swyllys char *crldata = NULL; 5135051Swyllys 5145051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 5155051Swyllys &kstype, sizeof (kstype)); 5165051Swyllys numattr++; 5173089Swyllys 5185051Swyllys if (dir != NULL) { 5195051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5205051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir)); 5215051Swyllys numattr++; 5225051Swyllys } 5235051Swyllys if (filename != NULL) { 5245051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5255051Swyllys KMF_CRL_FILENAME_ATTR, 5265051Swyllys filename, strlen(filename)); 5275051Swyllys numattr++; 5285051Swyllys } 5295051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR, 5305051Swyllys &crldata, sizeof (char *)); 5315051Swyllys numattr++; 5323089Swyllys 5335051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist); 5345051Swyllys if (rv == KMF_OK && crldata != NULL) { 5353089Swyllys (void) printf("%s\n", crldata); 5363089Swyllys free(crldata); 53717Sdinak } 53817Sdinak } 53917Sdinak 5403089Swyllys return (rv); 5413089Swyllys } 5423089Swyllys 5433089Swyllys static int 5443089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass, 5453089Swyllys char *dir, char *filename, KMF_BIGINT *serial, 5463089Swyllys char *issuer, char *subject, 5473089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 5483089Swyllys { 5495626Shylee KMF_RETURN rv = KMF_OK; 5505051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 5515051Swyllys int numattr = 0; 5525051Swyllys KMF_ATTRIBUTE attrlist[16]; 5535051Swyllys KMF_KEY_CLASS keyclass; 5545051Swyllys KMF_ENCODE_FORMAT format; 5555051Swyllys char *defaultdir = "."; 5563089Swyllys 5573089Swyllys if (oclass & PK_KEY_OBJ) { 5585051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 5595051Swyllys &kstype, sizeof (kstype)); 5605051Swyllys numattr++; 5615051Swyllys 5625051Swyllys if (dir == NULL && filename == NULL) 5635051Swyllys dir = defaultdir; 5645051Swyllys 5655051Swyllys if (dir != NULL) { 5665051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5675051Swyllys KMF_DIRPATH_ATTR, dir, 5685051Swyllys strlen(dir)); 5695051Swyllys numattr++; 5705051Swyllys } 5715051Swyllys 5725051Swyllys if (filename != NULL) { 5735051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5745051Swyllys KMF_KEY_FILENAME_ATTR, filename, 5755051Swyllys strlen(filename)); 5765051Swyllys numattr++; 5775051Swyllys } 5785051Swyllys 5793089Swyllys if (oclass & PK_PRIKEY_OBJ) { 5805051Swyllys int num = numattr; 5813089Swyllys 5825051Swyllys keyclass = KMF_ASYM_PRI; 5835051Swyllys kmf_set_attr_at_index(attrlist, num, 5845051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 5855051Swyllys sizeof (keyclass)); 5865051Swyllys num++; 5875051Swyllys 5885051Swyllys /* list asymmetric private keys */ 5895221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, 5905221Swyllys "asymmetric private"); 5913089Swyllys } 5923089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 5933089Swyllys rv = KMF_OK; 5943089Swyllys 5953089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 5965051Swyllys int num = numattr; 5975051Swyllys 5985051Swyllys keyclass = KMF_SYMMETRIC; 5995051Swyllys kmf_set_attr_at_index(attrlist, num, 6005051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 6015051Swyllys sizeof (keyclass)); 6025051Swyllys num++; 6033089Swyllys 6045051Swyllys format = KMF_FORMAT_RAWKEY; 6055051Swyllys kmf_set_attr_at_index(attrlist, num, 6065051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 6075051Swyllys sizeof (format)); 6085051Swyllys num++; 6095051Swyllys 6105051Swyllys /* list symmetric keys */ 6115221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, 6125221Swyllys "symmetric"); 6133089Swyllys } 6143089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 6153089Swyllys rv = KMF_OK; 6163089Swyllys if (rv != KMF_OK) 6173089Swyllys return (rv); 61817Sdinak } 61917Sdinak 6205051Swyllys numattr = 0; 6213089Swyllys if (oclass & PK_CERT_OBJ) { 6225051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6235051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 6245051Swyllys sizeof (kstype)); 6255051Swyllys numattr++; 6265051Swyllys 6275051Swyllys if (issuer != NULL) { 6285051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6295051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 6305051Swyllys strlen(issuer)); 6315051Swyllys numattr++; 6325051Swyllys } 6335051Swyllys 6345051Swyllys if (subject != NULL) { 6355051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6365051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 6375051Swyllys strlen(subject)); 6385051Swyllys numattr++; 6395051Swyllys } 64017Sdinak 6416051Swyllys if (serial != NULL && serial->val != NULL) { 6425051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6435051Swyllys KMF_BIGINT_ATTR, serial, 6445051Swyllys sizeof (KMF_BIGINT)); 6455051Swyllys numattr++; 6465051Swyllys } 6475051Swyllys 6485051Swyllys if (filename != NULL) { 6495051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6505051Swyllys KMF_CERT_FILENAME_ATTR, filename, 6515051Swyllys strlen(filename)); 6525051Swyllys numattr++; 6535051Swyllys } 6545051Swyllys 6555051Swyllys if (dir != NULL) { 6565051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6575051Swyllys KMF_DIRPATH_ATTR, dir, 6585051Swyllys strlen(dir)); 6595051Swyllys numattr++; 6605051Swyllys } 6615051Swyllys 6625051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6635051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 6645051Swyllys sizeof (KMF_CERT_VALIDITY)); 6655051Swyllys numattr++; 6665051Swyllys 6675051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 6683089Swyllys if (rv != KMF_OK) 6693089Swyllys return (rv); 67017Sdinak } 67117Sdinak 6725051Swyllys numattr = 0; 6733089Swyllys if (oclass & PK_CRL_OBJ) { 6745051Swyllys char *crldata = NULL; 6755051Swyllys 6765051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 6775051Swyllys &kstype, sizeof (kstype)); 6785051Swyllys numattr++; 67917Sdinak 6805051Swyllys if (dir != NULL) { 6815051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6825051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir)); 6835051Swyllys numattr++; 6845051Swyllys } 6855051Swyllys if (filename != NULL) { 6865051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6875051Swyllys KMF_CRL_FILENAME_ATTR, 6885051Swyllys filename, strlen(filename)); 6895051Swyllys numattr++; 6905051Swyllys } 6915051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR, 6925051Swyllys &crldata, sizeof (char *)); 6935051Swyllys numattr++; 69417Sdinak 6955051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist); 6965051Swyllys if (rv == KMF_OK && crldata != NULL) { 6973089Swyllys (void) printf("%s\n", crldata); 6983089Swyllys free(crldata); 6993089Swyllys } 70017Sdinak } 70117Sdinak 70217Sdinak return (rv); 70317Sdinak } 70417Sdinak 7053089Swyllys static int 7063089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle, 7073089Swyllys int oclass, char *token_spec, char *dir, char *prefix, 7083089Swyllys char *nickname, KMF_BIGINT *serial, char *issuer, char *subject, 7093089Swyllys KMF_CREDENTIAL *tokencred, 7103089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 71117Sdinak { 7123089Swyllys KMF_RETURN rv = KMF_OK; 7135051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 7145051Swyllys int numattr = 0; 7155051Swyllys KMF_ATTRIBUTE attrlist[16]; 7165051Swyllys KMF_KEY_CLASS keyclass; 7175051Swyllys KMF_ENCODE_FORMAT format; 7183089Swyllys 7193089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 7203089Swyllys if (rv != KMF_OK) 7213089Swyllys return (rv); 72217Sdinak 7235051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 7245051Swyllys &kstype, sizeof (kstype)); 7255051Swyllys numattr++; 7265051Swyllys 7273089Swyllys if (oclass & PK_KEY_OBJ) { 7285051Swyllys if (tokencred != NULL && tokencred->credlen > 0) { 7295051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7305051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 7315051Swyllys sizeof (KMF_CREDENTIAL)); 7325051Swyllys numattr++; 7335051Swyllys } 7345051Swyllys 7355051Swyllys if (token_spec && strlen(token_spec)) { 7365051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7375051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 7385051Swyllys strlen(token_spec)); 7395051Swyllys numattr++; 7405051Swyllys } 7415051Swyllys 7425051Swyllys if (nickname != NULL) { 7435051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7445051Swyllys KMF_KEYLABEL_ATTR, nickname, 7455051Swyllys strlen(nickname)); 7465051Swyllys numattr++; 7475051Swyllys } 74817Sdinak } 74917Sdinak 7503089Swyllys if (oclass & PK_PRIKEY_OBJ) { 7515051Swyllys int num = numattr; 7525051Swyllys 7535051Swyllys keyclass = KMF_ASYM_PRI; 7545051Swyllys kmf_set_attr_at_index(attrlist, num, 7555051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 7565051Swyllys sizeof (keyclass)); 7575051Swyllys num++; 7585051Swyllys 7595051Swyllys /* list asymmetric private keys */ 7605221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, 7615221Swyllys "asymmetric private"); 76217Sdinak } 7635051Swyllys 7643089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 7655051Swyllys int num = numattr; 7665051Swyllys 7675051Swyllys keyclass = KMF_SYMMETRIC; 7685051Swyllys kmf_set_attr_at_index(attrlist, num, 7695051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 7705051Swyllys sizeof (keyclass)); 7715051Swyllys num++; 7725051Swyllys 7735051Swyllys format = KMF_FORMAT_RAWKEY; 7745051Swyllys kmf_set_attr_at_index(attrlist, num, 7755051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 7765051Swyllys sizeof (format)); 7775051Swyllys num++; 7785051Swyllys 7795051Swyllys /* list symmetric keys */ 7805221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, "symmetric"); 7813089Swyllys } 7825051Swyllys 7833089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 7845051Swyllys int num = numattr; 7855051Swyllys 7865051Swyllys keyclass = KMF_ASYM_PUB; 7875051Swyllys kmf_set_attr_at_index(attrlist, num, 7885051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 7895051Swyllys sizeof (keyclass)); 7905051Swyllys num++; 7915051Swyllys 7925051Swyllys /* list asymmetric public keys */ 7935221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, 7945221Swyllys "asymmetric public"); 79517Sdinak } 79617Sdinak 7973089Swyllys /* If searching for public objects or certificates, find certs now */ 7985051Swyllys numattr = 0; 7993089Swyllys if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) { 8005051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8015051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 8025051Swyllys sizeof (kstype)); 8035051Swyllys numattr++; 8045051Swyllys 8055051Swyllys if (nickname != NULL) { 8065051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8075051Swyllys KMF_CERT_LABEL_ATTR, nickname, 8085051Swyllys strlen(nickname)); 8095051Swyllys numattr++; 8105051Swyllys } 8115051Swyllys 8125051Swyllys if (issuer != NULL) { 8135051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8145051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 8155051Swyllys strlen(issuer)); 8165051Swyllys numattr++; 8175051Swyllys } 81817Sdinak 8195051Swyllys if (subject != NULL) { 8205051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8215051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 8225051Swyllys strlen(subject)); 8235051Swyllys numattr++; 8245051Swyllys } 8255051Swyllys 8265051Swyllys if (serial != NULL) { 8275051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8285051Swyllys KMF_BIGINT_ATTR, serial, 8295051Swyllys sizeof (KMF_BIGINT)); 8305051Swyllys numattr++; 8315051Swyllys } 83217Sdinak 8335051Swyllys if (token_spec != NULL) { 8345051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8355051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 8365051Swyllys strlen(token_spec)); 8375051Swyllys numattr++; 8385051Swyllys } 8395051Swyllys 8405051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8415051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 8425051Swyllys sizeof (KMF_CERT_VALIDITY)); 8435051Swyllys numattr++; 8445051Swyllys 8455051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 84617Sdinak } 84717Sdinak 8485051Swyllys numattr = 0; 8493089Swyllys if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) { 8503089Swyllys int numcrls; 8515051Swyllys 8525051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 8535051Swyllys &kstype, sizeof (kstype)); 8545051Swyllys numattr++; 8553089Swyllys 8565051Swyllys if (token_spec != NULL) { 8575051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8585051Swyllys KMF_TOKEN_LABEL_ATTR, 8595051Swyllys token_spec, strlen(token_spec)); 8605051Swyllys numattr++; 8615051Swyllys } 8625051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR, 8635051Swyllys &numcrls, sizeof (int)); 8645051Swyllys numattr++; 8653089Swyllys 8665051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist); 8673089Swyllys if (rv == KMF_OK) { 8683089Swyllys char **p; 8693089Swyllys if (numcrls == 0) { 8703089Swyllys (void) printf(gettext("No CRLs found in " 8715051Swyllys "NSS keystore.\n")); 87217Sdinak 8733089Swyllys return (KMF_OK); 8743089Swyllys } 8753089Swyllys p = malloc(numcrls * sizeof (char *)); 8763089Swyllys if (p == NULL) { 8773089Swyllys return (KMF_ERR_MEMORY); 8783089Swyllys } 8793089Swyllys (void) memset(p, 0, numcrls * sizeof (char *)); 8805051Swyllys 8815051Swyllys kmf_set_attr_at_index(attrlist, numattr, 8825051Swyllys KMF_CRL_NAMELIST_ATTR, p, sizeof (char *)); 8835051Swyllys numattr++; 8845051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist); 8853089Swyllys if (rv == KMF_OK) { 8863089Swyllys int i; 8873089Swyllys for (i = 0; i < numcrls; i++) { 8883089Swyllys (void) printf("%d. Name = %s\n", 8895051Swyllys i + 1, p[i]); 8903089Swyllys free(p[i]); 8913089Swyllys } 8923089Swyllys } 8933089Swyllys free(p); 89417Sdinak } 89517Sdinak } 89617Sdinak return (rv); 89717Sdinak } 89817Sdinak 89917Sdinak /* 90017Sdinak * List token object. 90117Sdinak */ 90217Sdinak int 90317Sdinak pk_list(int argc, char *argv[]) 90417Sdinak { 90517Sdinak int opt; 906864Sdinak extern int optind_av; 907864Sdinak extern char *optarg_av; 908864Sdinak char *token_spec = NULL; 9093089Swyllys char *subject = NULL; 9103089Swyllys char *issuer = NULL; 9113089Swyllys char *dir = NULL; 9123089Swyllys char *prefix = NULL; 9133089Swyllys char *filename = NULL; 9143089Swyllys char *serstr = NULL; 9153089Swyllys KMF_BIGINT serial = { NULL, 0 }; 91617Sdinak 9173089Swyllys char *list_label = NULL; 9183089Swyllys int oclass = 0; 9193089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 9203089Swyllys KMF_RETURN rv = KMF_OK; 9213089Swyllys KMF_HANDLE_T kmfhandle = NULL; 9223089Swyllys char *find_criteria = NULL; 9233089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 9243089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 92517Sdinak 92617Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 927864Sdinak while ((opt = getopt_av(argc, argv, 9285051Swyllys "k:(keystore)t:(objtype)T:(token)d:(dir)" 9295051Swyllys "p:(prefix)n:(nickname)S:(serial)s:(subject)" 9305051Swyllys "c:(criteria)" 9315051Swyllys "i:(issuer)l:(label)f:(infile)")) != EOF) { 9323089Swyllys if (EMPTYSTRING(optarg_av)) 9333089Swyllys return (PK_ERR_USAGE); 93417Sdinak switch (opt) { 9353089Swyllys case 'k': 9363089Swyllys if (kstype != 0) 9373089Swyllys return (PK_ERR_USAGE); 9383089Swyllys kstype = KS2Int(optarg_av); 9393089Swyllys if (kstype == 0) 9403089Swyllys return (PK_ERR_USAGE); 9413089Swyllys break; 9423089Swyllys case 't': 9433089Swyllys if (oclass != 0) 9443089Swyllys return (PK_ERR_USAGE); 9453089Swyllys oclass = OT2Int(optarg_av); 9463089Swyllys if (oclass == -1) 9473089Swyllys return (PK_ERR_USAGE); 9483089Swyllys break; 9493089Swyllys case 's': 9503089Swyllys if (subject) 9513089Swyllys return (PK_ERR_USAGE); 9523089Swyllys subject = optarg_av; 9533089Swyllys break; 9543089Swyllys case 'i': 9553089Swyllys if (issuer) 9563089Swyllys return (PK_ERR_USAGE); 9573089Swyllys issuer = optarg_av; 9583089Swyllys break; 9593089Swyllys case 'd': 9603089Swyllys if (dir) 9613089Swyllys return (PK_ERR_USAGE); 9623089Swyllys dir = optarg_av; 9633089Swyllys break; 9643089Swyllys case 'p': 9653089Swyllys if (prefix) 9663089Swyllys return (PK_ERR_USAGE); 9673089Swyllys prefix = optarg_av; 9683089Swyllys break; 9693089Swyllys case 'S': 9703089Swyllys serstr = optarg_av; 9713089Swyllys break; 9723089Swyllys case 'f': 9733089Swyllys if (filename) 9743089Swyllys return (PK_ERR_USAGE); 9753089Swyllys filename = optarg_av; 9763089Swyllys break; 9773089Swyllys case 'T': /* token specifier */ 9783089Swyllys if (token_spec) 9793089Swyllys return (PK_ERR_USAGE); 9803089Swyllys token_spec = optarg_av; 9813089Swyllys break; 9823089Swyllys case 'n': 9833089Swyllys case 'l': /* object with specific label */ 9843089Swyllys if (list_label) 9853089Swyllys return (PK_ERR_USAGE); 9863089Swyllys list_label = optarg_av; 9873089Swyllys break; 9883089Swyllys case 'c': 9893089Swyllys find_criteria = optarg_av; 9903089Swyllys if (!strcasecmp(find_criteria, "valid")) 9913089Swyllys find_criteria_flag = 9923089Swyllys KMF_NONEXPIRED_CERTS; 9933089Swyllys else if (!strcasecmp(find_criteria, "expired")) 9943089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS; 9953089Swyllys else if (!strcasecmp(find_criteria, "both")) 9963089Swyllys find_criteria_flag = KMF_ALL_CERTS; 9973089Swyllys else 9983089Swyllys return (PK_ERR_USAGE); 9993089Swyllys break; 10003089Swyllys default: 1001864Sdinak return (PK_ERR_USAGE); 100217Sdinak } 100317Sdinak } 100417Sdinak /* No additional args allowed. */ 1005864Sdinak argc -= optind_av; 1006864Sdinak argv += optind_av; 100717Sdinak if (argc) 100817Sdinak return (PK_ERR_USAGE); 100917Sdinak 10105051Swyllys if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) { 10113089Swyllys /* Error message ? */ 10123089Swyllys return (rv); 101317Sdinak } 101417Sdinak 10153089Swyllys /* Assume keystore = PKCS#11 if not specified. */ 10163089Swyllys if (kstype == 0) 10173089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 101817Sdinak 10193089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 10203089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 10215051Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 10223089Swyllys 10233089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 10245051Swyllys "is only relevant if keystore=pkcs11\n")); 10253089Swyllys return (PK_ERR_USAGE); 102617Sdinak } 102717Sdinak 10283089Swyllys 10293089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) { 10303089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 10313089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) { 10323089Swyllys token_spec = DEFAULT_NSS_TOKEN; 103317Sdinak } 103417Sdinak 10353089Swyllys if (serstr != NULL) { 10363089Swyllys uchar_t *bytes = NULL; 10373089Swyllys size_t bytelen; 10383089Swyllys 10395051Swyllys rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen); 10403089Swyllys if (rv != KMF_OK || bytes == NULL) { 10413089Swyllys (void) fprintf(stderr, gettext("serial number " 10425051Swyllys "must be specified as a hex number " 10435051Swyllys "(ex: 0x0102030405ffeeddee)\n")); 10443089Swyllys return (PK_ERR_USAGE); 10453089Swyllys } 10463089Swyllys serial.val = bytes; 10473089Swyllys serial.len = bytelen; 10485221Swyllys /* if objtype was not given, it must be for certs */ 10495221Swyllys if (oclass == 0) 10505221Swyllys oclass = PK_CERT_OBJ; 105117Sdinak } 10525221Swyllys if (oclass == 0 && (issuer != NULL || subject != NULL)) 10535221Swyllys oclass = PK_CERT_OBJ; 10545221Swyllys 10555221Swyllys /* If no object class specified, list public objects. */ 10565221Swyllys if (oclass == 0) 10575221Swyllys oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ; 105817Sdinak 10593089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 10605051Swyllys kstype == KMF_KEYSTORE_NSS) && 10615051Swyllys (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) { 10623089Swyllys 10633089Swyllys (void) get_token_password(kstype, token_spec, 10645051Swyllys &tokencred); 10653089Swyllys } 10663089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) { 10673089Swyllys rv = list_pk11_objects(kmfhandle, token_spec, 10685051Swyllys oclass, list_label, &serial, 10695051Swyllys issuer, subject, dir, filename, 10705051Swyllys &tokencred, find_criteria_flag); 107117Sdinak 10723089Swyllys } else if (kstype == KMF_KEYSTORE_NSS) { 10733089Swyllys if (dir == NULL) 10743089Swyllys dir = PK_DEFAULT_DIRECTORY; 10753089Swyllys rv = list_nss_objects(kmfhandle, 10765051Swyllys oclass, token_spec, dir, prefix, 10775051Swyllys list_label, &serial, issuer, subject, 10785051Swyllys &tokencred, find_criteria_flag); 10793089Swyllys 10803089Swyllys } else if (kstype == KMF_KEYSTORE_OPENSSL) { 10813089Swyllys 10823089Swyllys rv = list_file_objects(kmfhandle, 10835051Swyllys oclass, dir, filename, 10845051Swyllys &serial, issuer, subject, find_criteria_flag); 108517Sdinak } 108617Sdinak 10873089Swyllys if (rv != KMF_OK) { 10883089Swyllys display_error(kmfhandle, rv, 10895051Swyllys gettext("Error listing objects")); 10903089Swyllys } 10913089Swyllys 10923089Swyllys if (serial.val != NULL) 10933089Swyllys free(serial.val); 10943089Swyllys 10953089Swyllys if (tokencred.cred != NULL) 10963089Swyllys free(tokencred.cred); 10973089Swyllys 10985051Swyllys (void) kmf_finalize(kmfhandle); 10993089Swyllys return (rv); 110017Sdinak } 1101