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; 49*5051Swyllys 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; 57*5051Swyllys start = end = NULL; 58*5051Swyllys keyusage = extkeyusage = NULL; 5917Sdinak 603089Swyllys (void) fprintf(stdout, 61*5051Swyllys 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"), 64*5051Swyllys (certs[i].kmf_private.keystore_type == 65*5051Swyllys KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"), 66*5051Swyllys certs[i].kmf_private.label); 67*5051Swyllys if (kmf_get_cert_id_str(&certs[i].certificate, 68*5051Swyllys &id) == KMF_OK) 693089Swyllys (void) fprintf(stdout, gettext("\tID: %s\n"), id); 70*5051Swyllys if (kmf_get_cert_subject_str(kmfhandle, 71*5051Swyllys &certs[i].certificate, &subject) == KMF_OK) 723089Swyllys (void) fprintf(stdout, gettext("\tSubject: %s\n"), 73*5051Swyllys subject); 74*5051Swyllys if (kmf_get_cert_issuer_str(kmfhandle, 75*5051Swyllys &certs[i].certificate, &issuer) == KMF_OK) 763089Swyllys (void) fprintf(stdout, gettext("\tIssuer: %s\n"), 77*5051Swyllys issuer); 78*5051Swyllys if (kmf_get_cert_start_date_str(kmfhandle, 79*5051Swyllys &certs[i].certificate, &start) == KMF_OK) 80*5051Swyllys (void) fprintf(stdout, gettext("\tNot Before: %s\n"), 81*5051Swyllys start); 82*5051Swyllys if (kmf_get_cert_end_date_str(kmfhandle, 83*5051Swyllys &certs[i].certificate, &end) == KMF_OK) 84*5051Swyllys (void) fprintf(stdout, gettext("\tNot After: %s\n"), 85*5051Swyllys end); 86*5051Swyllys if (kmf_get_cert_serial_str(kmfhandle, 87*5051Swyllys &certs[i].certificate, &serial) == KMF_OK) 883089Swyllys (void) fprintf(stdout, gettext("\tSerial: %s\n"), 89*5051Swyllys serial); 90*5051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 91*5051Swyllys &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME, 92*5051Swyllys &altname) == KMF_OK) { 93*5051Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 94*5051Swyllys altname); 95*5051Swyllys } 96*5051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 97*5051Swyllys &certs[i].certificate, KMF_X509_EXT_KEY_USAGE, 98*5051Swyllys &keyusage) == KMF_OK) { 993089Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 100*5051Swyllys keyusage); 101*5051Swyllys } 102*5051Swyllys if (kmf_get_cert_extn_str(kmfhandle, 103*5051Swyllys &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE, 104*5051Swyllys &extkeyusage) == KMF_OK) { 105*5051Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 106*5051Swyllys extkeyusage); 1073089Swyllys } 108*5051Swyllys kmf_free_str(subject); 109*5051Swyllys kmf_free_str(issuer); 110*5051Swyllys kmf_free_str(serial); 111*5051Swyllys kmf_free_str(id); 112*5051Swyllys kmf_free_str(altname); 113*5051Swyllys kmf_free_str(keyusage); 114*5051Swyllys kmf_free_str(extkeyusage); 115*5051Swyllys kmf_free_str(start); 116*5051Swyllys 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"), 168*5051Swyllys i+1, describeKey(&keys[i]), 169*5051Swyllys keys[i].keylabel ? keys[i].keylabel : 170*5051Swyllys gettext("No label")); 1713089Swyllys 1723089Swyllys if (keys[i].keyclass == KMF_SYMMETRIC) { 1733089Swyllys KMF_RETURN rv; 1743089Swyllys KMF_RAW_SYM_KEY rkey; 1754006Shylee 176*5051Swyllys (void) memset(&rkey, 0, sizeof (rkey)); 177*5051Swyllys rv = kmf_get_sym_key_value(handle, &keys[i], 178*5051Swyllys &rkey); 1793089Swyllys if (rv == KMF_OK) { 1804006Shylee (void) fprintf(stdout, " (%d bits)", 181*5051Swyllys rkey.keydata.len * 8); 182*5051Swyllys kmf_free_bigint(&rkey.keydata); 183*5051Swyllys } else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) { 184*5051Swyllys if (rv == KMF_ERR_SENSITIVE_KEY) { 185*5051Swyllys (void) fprintf(stdout, " (sensitive)"); 186*5051Swyllys } else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) { 187*5051Swyllys (void) fprintf(stdout, 188*5051Swyllys " (non-extractable)"); 189*5051Swyllys } else { 190*5051Swyllys char *err = NULL; 191*5051Swyllys if (kmf_get_kmf_error_str(rv, &err) == 192*5051Swyllys KMF_OK) 193*5051Swyllys (void) fprintf(stdout, 194*5051Swyllys " (error: %s)", err); 195*5051Swyllys if (err != NULL) 196*5051Swyllys free(err); 197*5051Swyllys } 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 209*5051Swyllys 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; 214*5051Swyllys KMF_KEYSTORE_TYPE kstype; 21517Sdinak 216*5051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 217*5051Swyllys &kstype, NULL); 218*5051Swyllys if (rv != KMF_OK) 219*5051Swyllys return (rv); 220*5051Swyllys 221*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR, 222*5051Swyllys &numcerts, sizeof (uint32_t)); 223*5051Swyllys numattr++; 224*5051Swyllys 225*5051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist); 2263089Swyllys if (rv == KMF_OK && numcerts > 0) { 2273089Swyllys (void) printf(gettext("Found %d certificates.\n"), 228*5051Swyllys numcerts); 2293089Swyllys certlist = (KMF_X509_DER_CERT *)malloc(numcerts * 230*5051Swyllys sizeof (KMF_X509_DER_CERT)); 2313089Swyllys if (certlist == NULL) 2323089Swyllys return (KMF_ERR_MEMORY); 2333089Swyllys (void) memset(certlist, 0, numcerts * 234*5051Swyllys sizeof (KMF_X509_DER_CERT)); 2353089Swyllys 236*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 237*5051Swyllys KMF_X509_DER_CERT_ATTR, certlist, 238*5051Swyllys sizeof (KMF_X509_DER_CERT)); 239*5051Swyllys numattr++; 240*5051Swyllys 241*5051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist); 2423089Swyllys if (rv == KMF_OK) { 2433089Swyllys int i; 2443089Swyllys (void) pk_show_certs(kmfhandle, certlist, 245*5051Swyllys numcerts); 2463089Swyllys for (i = 0; i < numcerts; i++) 247*5051Swyllys kmf_free_kmf_cert(kmfhandle, &certlist[i]); 2483089Swyllys } 2493089Swyllys free(certlist); 25017Sdinak } 2513089Swyllys if (rv == KMF_ERR_CERT_NOT_FOUND && 252*5051Swyllys kstype != KMF_KEYSTORE_OPENSSL) 2533089Swyllys rv = KMF_OK; 25417Sdinak 25517Sdinak return (rv); 25617Sdinak } 25717Sdinak 2583089Swyllys static KMF_RETURN 259*5051Swyllys 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; 264*5051Swyllys KMF_KEYSTORE_TYPE kstype; 2653089Swyllys 266*5051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 267*5051Swyllys &kstype, NULL); 268*5051Swyllys if (rv != KMF_OK) 269*5051Swyllys return (rv); 270*5051Swyllys 271*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR, 272*5051Swyllys &numkeys, sizeof (uint32_t)); 273*5051Swyllys numattr++; 274*5051Swyllys 275*5051Swyllys 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 * 280*5051Swyllys sizeof (KMF_KEY_HANDLE)); 2813089Swyllys if (keys == NULL) 2823089Swyllys return (KMF_ERR_MEMORY); 2833089Swyllys (void) memset(keys, 0, numkeys * 284*5051Swyllys sizeof (KMF_KEY_HANDLE)); 28517Sdinak 286*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 287*5051Swyllys KMF_KEY_HANDLE_ATTR, 288*5051Swyllys keys, sizeof (KMF_KEY_HANDLE)); 289*5051Swyllys numattr++; 290*5051Swyllys 291*5051Swyllys 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++) 295*5051Swyllys kmf_free_kmf_key(handle, &keys[i]); 2963089Swyllys free(keys); 2973089Swyllys } 2983089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND && 299*5051Swyllys 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; 311*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 312*5051Swyllys int numattr = 0; 313*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 314*5051Swyllys boolean_t token_bool = B_TRUE; 315*5051Swyllys boolean_t private = B_FALSE; 316*5051Swyllys KMF_KEY_CLASS keyclass; 317*5051Swyllys 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, 328*5051Swyllys !(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)) { 335*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 336*5051Swyllys &kstype, sizeof (kstype)); 337*5051Swyllys numattr++; 338*5051Swyllys 339*5051Swyllys if (objlabel != NULL) { 340*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 341*5051Swyllys KMF_KEYLABEL_ATTR, objlabel, 342*5051Swyllys strlen(objlabel)); 343*5051Swyllys numattr++; 344*5051Swyllys } 3453089Swyllys 346*5051Swyllys private = ((oclass & PK_PRIVATE_OBJ) > 0); 347*5051Swyllys 348*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 349*5051Swyllys KMF_PRIVATE_BOOL_ATTR, &private, 350*5051Swyllys sizeof (private)); 351*5051Swyllys numattr++; 352*5051Swyllys 353*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 354*5051Swyllys KMF_TOKEN_BOOL_ATTR, &token_bool, 355*5051Swyllys sizeof (token_bool)); 356*5051Swyllys numattr++; 3573089Swyllys 3583089Swyllys if (oclass & PK_PRIKEY_OBJ) { 359*5051Swyllys int num = numattr; 360*5051Swyllys 361*5051Swyllys keyclass = KMF_ASYM_PRI; 362*5051Swyllys kmf_set_attr_at_index(attrlist, num, 363*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 364*5051Swyllys sizeof (keyclass)); 365*5051Swyllys num++; 366*5051Swyllys 367*5051Swyllys if (tokencred != NULL && 368*5051Swyllys tokencred->credlen > 0) { 369*5051Swyllys kmf_set_attr_at_index(attrlist, num, 370*5051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 371*5051Swyllys sizeof (KMF_CREDENTIAL)); 372*5051Swyllys num++; 373*5051Swyllys } 3743089Swyllys 3753089Swyllys /* list asymmetric private keys */ 376*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 3773089Swyllys } 3783089Swyllys 3793089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 380*5051Swyllys int num = numattr; 381*5051Swyllys 382*5051Swyllys keyclass = KMF_SYMMETRIC; 383*5051Swyllys kmf_set_attr_at_index(attrlist, num, 384*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 385*5051Swyllys sizeof (keyclass)); 386*5051Swyllys num++; 387*5051Swyllys 388*5051Swyllys if (tokencred != NULL && 389*5051Swyllys tokencred->credlen > 0) { 390*5051Swyllys kmf_set_attr_at_index(attrlist, num, 391*5051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 392*5051Swyllys sizeof (KMF_CREDENTIAL)); 393*5051Swyllys num++; 394*5051Swyllys } 395*5051Swyllys 396*5051Swyllys format = KMF_FORMAT_RAWKEY; 397*5051Swyllys kmf_set_attr_at_index(attrlist, num, 398*5051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 399*5051Swyllys sizeof (format)); 400*5051Swyllys num++; 4013089Swyllys 4023089Swyllys /* list symmetric keys */ 403*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 40417Sdinak } 4053089Swyllys 4063089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 407*5051Swyllys int num = numattr; 408*5051Swyllys 409*5051Swyllys keyclass = KMF_ASYM_PUB; 410*5051Swyllys kmf_set_attr_at_index(attrlist, num, 411*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 412*5051Swyllys sizeof (keyclass)); 413*5051Swyllys num++; 4143089Swyllys 4153089Swyllys /* list asymmetric public keys (if any) */ 416*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 4173089Swyllys } 4183089Swyllys 4193089Swyllys if (rv != KMF_OK) 4203089Swyllys return (rv); 4213089Swyllys } 4223089Swyllys 423*5051Swyllys numattr = 0; 4243089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 425*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 426*5051Swyllys &kstype, sizeof (kstype)); 427*5051Swyllys numattr++; 428*5051Swyllys 429*5051Swyllys if (objlabel != NULL) { 430*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 431*5051Swyllys KMF_CERT_LABEL_ATTR, objlabel, 432*5051Swyllys strlen(objlabel)); 433*5051Swyllys numattr++; 434*5051Swyllys } 435*5051Swyllys 436*5051Swyllys if (issuer != NULL) { 437*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 438*5051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 439*5051Swyllys strlen(issuer)); 440*5051Swyllys numattr++; 441*5051Swyllys } 4423089Swyllys 443*5051Swyllys if (subject != NULL) { 444*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 445*5051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 446*5051Swyllys strlen(subject)); 447*5051Swyllys numattr++; 448*5051Swyllys } 4493089Swyllys 450*5051Swyllys if (serial != NULL) { 451*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 452*5051Swyllys KMF_BIGINT_ATTR, serial, 453*5051Swyllys sizeof (KMF_BIGINT)); 454*5051Swyllys numattr++; 455*5051Swyllys } 456*5051Swyllys 457*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 458*5051Swyllys KMF_PRIVATE_BOOL_ATTR, &private, 459*5051Swyllys sizeof (private)); 460*5051Swyllys numattr++; 461*5051Swyllys 462*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 463*5051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 464*5051Swyllys sizeof (KMF_CERT_VALIDITY)); 465*5051Swyllys numattr++; 466*5051Swyllys 467*5051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 4683089Swyllys if (rv != KMF_OK) 4693089Swyllys return (rv); 4703089Swyllys } 4713089Swyllys 472*5051Swyllys numattr = 0; 473*5051Swyllys kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */ 4743089Swyllys if (oclass & PK_CRL_OBJ) { 475*5051Swyllys char *crldata = NULL; 476*5051Swyllys 477*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 478*5051Swyllys &kstype, sizeof (kstype)); 479*5051Swyllys numattr++; 4803089Swyllys 481*5051Swyllys if (dir != NULL) { 482*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 483*5051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir)); 484*5051Swyllys numattr++; 485*5051Swyllys } 486*5051Swyllys if (filename != NULL) { 487*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 488*5051Swyllys KMF_CRL_FILENAME_ATTR, 489*5051Swyllys filename, strlen(filename)); 490*5051Swyllys numattr++; 491*5051Swyllys } 492*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR, 493*5051Swyllys &crldata, sizeof (char *)); 494*5051Swyllys numattr++; 4953089Swyllys 496*5051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist); 497*5051Swyllys if (rv == KMF_OK && crldata != NULL) { 4983089Swyllys (void) printf("%s\n", crldata); 4993089Swyllys free(crldata); 50017Sdinak } 50117Sdinak } 50217Sdinak 5033089Swyllys return (rv); 5043089Swyllys } 5053089Swyllys 5063089Swyllys static int 5073089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass, 5083089Swyllys char *dir, char *filename, KMF_BIGINT *serial, 5093089Swyllys char *issuer, char *subject, 5103089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 5113089Swyllys { 5123089Swyllys int rv; 513*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 514*5051Swyllys int numattr = 0; 515*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 516*5051Swyllys KMF_KEY_CLASS keyclass; 517*5051Swyllys KMF_ENCODE_FORMAT format; 518*5051Swyllys char *defaultdir = "."; 5193089Swyllys 5203089Swyllys if (oclass & PK_KEY_OBJ) { 521*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 522*5051Swyllys &kstype, sizeof (kstype)); 523*5051Swyllys numattr++; 524*5051Swyllys 525*5051Swyllys if (dir == NULL && filename == NULL) 526*5051Swyllys dir = defaultdir; 527*5051Swyllys 528*5051Swyllys if (dir != NULL) { 529*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 530*5051Swyllys KMF_DIRPATH_ATTR, dir, 531*5051Swyllys strlen(dir)); 532*5051Swyllys numattr++; 533*5051Swyllys } 534*5051Swyllys 535*5051Swyllys if (filename != NULL) { 536*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 537*5051Swyllys KMF_KEY_FILENAME_ATTR, filename, 538*5051Swyllys strlen(filename)); 539*5051Swyllys numattr++; 540*5051Swyllys } 541*5051Swyllys 5423089Swyllys if (oclass & PK_PRIKEY_OBJ) { 543*5051Swyllys int num = numattr; 5443089Swyllys 545*5051Swyllys keyclass = KMF_ASYM_PRI; 546*5051Swyllys kmf_set_attr_at_index(attrlist, num, 547*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 548*5051Swyllys sizeof (keyclass)); 549*5051Swyllys num++; 550*5051Swyllys 551*5051Swyllys /* list asymmetric private keys */ 552*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 5533089Swyllys } 5543089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 5553089Swyllys rv = KMF_OK; 5563089Swyllys 5573089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 558*5051Swyllys int num = numattr; 559*5051Swyllys 560*5051Swyllys keyclass = KMF_SYMMETRIC; 561*5051Swyllys kmf_set_attr_at_index(attrlist, num, 562*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 563*5051Swyllys sizeof (keyclass)); 564*5051Swyllys num++; 5653089Swyllys 566*5051Swyllys format = KMF_FORMAT_RAWKEY; 567*5051Swyllys kmf_set_attr_at_index(attrlist, num, 568*5051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 569*5051Swyllys sizeof (format)); 570*5051Swyllys num++; 571*5051Swyllys 572*5051Swyllys /* list symmetric keys */ 573*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 5743089Swyllys } 5753089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 5763089Swyllys rv = KMF_OK; 5773089Swyllys if (rv != KMF_OK) 5783089Swyllys return (rv); 57917Sdinak } 58017Sdinak 581*5051Swyllys numattr = 0; 5823089Swyllys if (oclass & PK_CERT_OBJ) { 583*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 584*5051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 585*5051Swyllys sizeof (kstype)); 586*5051Swyllys numattr++; 587*5051Swyllys 588*5051Swyllys if (issuer != NULL) { 589*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 590*5051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 591*5051Swyllys strlen(issuer)); 592*5051Swyllys numattr++; 593*5051Swyllys } 594*5051Swyllys 595*5051Swyllys if (subject != NULL) { 596*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 597*5051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 598*5051Swyllys strlen(subject)); 599*5051Swyllys numattr++; 600*5051Swyllys } 60117Sdinak 602*5051Swyllys if (serial != NULL) { 603*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 604*5051Swyllys KMF_BIGINT_ATTR, serial, 605*5051Swyllys sizeof (KMF_BIGINT)); 606*5051Swyllys numattr++; 607*5051Swyllys } 608*5051Swyllys 609*5051Swyllys if (filename != NULL) { 610*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 611*5051Swyllys KMF_CERT_FILENAME_ATTR, filename, 612*5051Swyllys strlen(filename)); 613*5051Swyllys numattr++; 614*5051Swyllys } 615*5051Swyllys 616*5051Swyllys if (dir != NULL) { 617*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 618*5051Swyllys KMF_DIRPATH_ATTR, dir, 619*5051Swyllys strlen(dir)); 620*5051Swyllys numattr++; 621*5051Swyllys } 622*5051Swyllys 623*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 624*5051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 625*5051Swyllys sizeof (KMF_CERT_VALIDITY)); 626*5051Swyllys numattr++; 627*5051Swyllys 628*5051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 6293089Swyllys if (rv != KMF_OK) 6303089Swyllys return (rv); 63117Sdinak } 63217Sdinak 633*5051Swyllys numattr = 0; 6343089Swyllys if (oclass & PK_CRL_OBJ) { 635*5051Swyllys char *crldata = NULL; 636*5051Swyllys 637*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 638*5051Swyllys &kstype, sizeof (kstype)); 639*5051Swyllys numattr++; 64017Sdinak 641*5051Swyllys if (dir != NULL) { 642*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 643*5051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir)); 644*5051Swyllys numattr++; 645*5051Swyllys } 646*5051Swyllys if (filename != NULL) { 647*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 648*5051Swyllys KMF_CRL_FILENAME_ATTR, 649*5051Swyllys filename, strlen(filename)); 650*5051Swyllys numattr++; 651*5051Swyllys } 652*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR, 653*5051Swyllys &crldata, sizeof (char *)); 654*5051Swyllys numattr++; 65517Sdinak 656*5051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist); 657*5051Swyllys if (rv == KMF_OK && crldata != NULL) { 6583089Swyllys (void) printf("%s\n", crldata); 6593089Swyllys free(crldata); 6603089Swyllys } 66117Sdinak } 66217Sdinak 66317Sdinak return (rv); 66417Sdinak } 66517Sdinak 6663089Swyllys static int 6673089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle, 6683089Swyllys int oclass, char *token_spec, char *dir, char *prefix, 6693089Swyllys char *nickname, KMF_BIGINT *serial, char *issuer, char *subject, 6703089Swyllys KMF_CREDENTIAL *tokencred, 6713089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 67217Sdinak { 6733089Swyllys KMF_RETURN rv = KMF_OK; 674*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 675*5051Swyllys int numattr = 0; 676*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 677*5051Swyllys KMF_KEY_CLASS keyclass; 678*5051Swyllys KMF_ENCODE_FORMAT format; 6793089Swyllys 6803089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 6813089Swyllys if (rv != KMF_OK) 6823089Swyllys return (rv); 68317Sdinak 684*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 685*5051Swyllys &kstype, sizeof (kstype)); 686*5051Swyllys numattr++; 687*5051Swyllys 6883089Swyllys if (oclass & PK_KEY_OBJ) { 689*5051Swyllys if (tokencred != NULL && tokencred->credlen > 0) { 690*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 691*5051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 692*5051Swyllys sizeof (KMF_CREDENTIAL)); 693*5051Swyllys numattr++; 694*5051Swyllys } 695*5051Swyllys 696*5051Swyllys if (token_spec && strlen(token_spec)) { 697*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 698*5051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 699*5051Swyllys strlen(token_spec)); 700*5051Swyllys numattr++; 701*5051Swyllys } 702*5051Swyllys 703*5051Swyllys if (nickname != NULL) { 704*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 705*5051Swyllys KMF_KEYLABEL_ATTR, nickname, 706*5051Swyllys strlen(nickname)); 707*5051Swyllys numattr++; 708*5051Swyllys } 70917Sdinak } 71017Sdinak 7113089Swyllys if (oclass & PK_PRIKEY_OBJ) { 712*5051Swyllys int num = numattr; 713*5051Swyllys 714*5051Swyllys keyclass = KMF_ASYM_PRI; 715*5051Swyllys kmf_set_attr_at_index(attrlist, num, 716*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 717*5051Swyllys sizeof (keyclass)); 718*5051Swyllys num++; 719*5051Swyllys 720*5051Swyllys /* list asymmetric private keys */ 721*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 72217Sdinak } 723*5051Swyllys 7243089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 725*5051Swyllys int num = numattr; 726*5051Swyllys 727*5051Swyllys keyclass = KMF_SYMMETRIC; 728*5051Swyllys kmf_set_attr_at_index(attrlist, num, 729*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 730*5051Swyllys sizeof (keyclass)); 731*5051Swyllys num++; 732*5051Swyllys 733*5051Swyllys format = KMF_FORMAT_RAWKEY; 734*5051Swyllys kmf_set_attr_at_index(attrlist, num, 735*5051Swyllys KMF_ENCODE_FORMAT_ATTR, &format, 736*5051Swyllys sizeof (format)); 737*5051Swyllys num++; 738*5051Swyllys 739*5051Swyllys /* list symmetric keys */ 740*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 7413089Swyllys } 742*5051Swyllys 7433089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 744*5051Swyllys int num = numattr; 745*5051Swyllys 746*5051Swyllys keyclass = KMF_ASYM_PUB; 747*5051Swyllys kmf_set_attr_at_index(attrlist, num, 748*5051Swyllys KMF_KEYCLASS_ATTR, &keyclass, 749*5051Swyllys sizeof (keyclass)); 750*5051Swyllys num++; 751*5051Swyllys 752*5051Swyllys /* list asymmetric public keys */ 753*5051Swyllys rv = pk_list_keys(kmfhandle, attrlist, num); 75417Sdinak } 75517Sdinak 7563089Swyllys /* If searching for public objects or certificates, find certs now */ 757*5051Swyllys numattr = 0; 7583089Swyllys if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) { 759*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 760*5051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 761*5051Swyllys sizeof (kstype)); 762*5051Swyllys numattr++; 763*5051Swyllys 764*5051Swyllys if (nickname != NULL) { 765*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 766*5051Swyllys KMF_CERT_LABEL_ATTR, nickname, 767*5051Swyllys strlen(nickname)); 768*5051Swyllys numattr++; 769*5051Swyllys } 770*5051Swyllys 771*5051Swyllys if (issuer != NULL) { 772*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 773*5051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 774*5051Swyllys strlen(issuer)); 775*5051Swyllys numattr++; 776*5051Swyllys } 77717Sdinak 778*5051Swyllys if (subject != NULL) { 779*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 780*5051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 781*5051Swyllys strlen(subject)); 782*5051Swyllys numattr++; 783*5051Swyllys } 784*5051Swyllys 785*5051Swyllys if (serial != NULL) { 786*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 787*5051Swyllys KMF_BIGINT_ATTR, serial, 788*5051Swyllys sizeof (KMF_BIGINT)); 789*5051Swyllys numattr++; 790*5051Swyllys } 79117Sdinak 792*5051Swyllys if (token_spec != NULL) { 793*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 794*5051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 795*5051Swyllys strlen(token_spec)); 796*5051Swyllys numattr++; 797*5051Swyllys } 798*5051Swyllys 799*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 800*5051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 801*5051Swyllys sizeof (KMF_CERT_VALIDITY)); 802*5051Swyllys numattr++; 803*5051Swyllys 804*5051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr); 80517Sdinak } 80617Sdinak 807*5051Swyllys numattr = 0; 8083089Swyllys if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) { 8093089Swyllys int numcrls; 810*5051Swyllys 811*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 812*5051Swyllys &kstype, sizeof (kstype)); 813*5051Swyllys numattr++; 8143089Swyllys 815*5051Swyllys if (token_spec != NULL) { 816*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 817*5051Swyllys KMF_TOKEN_LABEL_ATTR, 818*5051Swyllys token_spec, strlen(token_spec)); 819*5051Swyllys numattr++; 820*5051Swyllys } 821*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR, 822*5051Swyllys &numcrls, sizeof (int)); 823*5051Swyllys numattr++; 8243089Swyllys 825*5051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist); 8263089Swyllys if (rv == KMF_OK) { 8273089Swyllys char **p; 8283089Swyllys if (numcrls == 0) { 8293089Swyllys (void) printf(gettext("No CRLs found in " 830*5051Swyllys "NSS keystore.\n")); 83117Sdinak 8323089Swyllys return (KMF_OK); 8333089Swyllys } 8343089Swyllys p = malloc(numcrls * sizeof (char *)); 8353089Swyllys if (p == NULL) { 8363089Swyllys return (KMF_ERR_MEMORY); 8373089Swyllys } 8383089Swyllys (void) memset(p, 0, numcrls * sizeof (char *)); 839*5051Swyllys 840*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 841*5051Swyllys KMF_CRL_NAMELIST_ATTR, p, sizeof (char *)); 842*5051Swyllys numattr++; 843*5051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist); 8443089Swyllys if (rv == KMF_OK) { 8453089Swyllys int i; 8463089Swyllys for (i = 0; i < numcrls; i++) { 8473089Swyllys (void) printf("%d. Name = %s\n", 848*5051Swyllys i + 1, p[i]); 8493089Swyllys free(p[i]); 8503089Swyllys } 8513089Swyllys } 8523089Swyllys free(p); 85317Sdinak } 85417Sdinak } 85517Sdinak return (rv); 85617Sdinak } 85717Sdinak 85817Sdinak /* 85917Sdinak * List token object. 86017Sdinak */ 86117Sdinak int 86217Sdinak pk_list(int argc, char *argv[]) 86317Sdinak { 86417Sdinak int opt; 865864Sdinak extern int optind_av; 866864Sdinak extern char *optarg_av; 867864Sdinak char *token_spec = NULL; 8683089Swyllys char *subject = NULL; 8693089Swyllys char *issuer = NULL; 8703089Swyllys char *dir = NULL; 8713089Swyllys char *prefix = NULL; 8723089Swyllys char *filename = NULL; 8733089Swyllys char *serstr = NULL; 8743089Swyllys KMF_BIGINT serial = { NULL, 0 }; 87517Sdinak 8763089Swyllys char *list_label = NULL; 8773089Swyllys int oclass = 0; 8783089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 8793089Swyllys KMF_RETURN rv = KMF_OK; 8803089Swyllys KMF_HANDLE_T kmfhandle = NULL; 8813089Swyllys char *find_criteria = NULL; 8823089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 8833089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 88417Sdinak 88517Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 886864Sdinak while ((opt = getopt_av(argc, argv, 887*5051Swyllys "k:(keystore)t:(objtype)T:(token)d:(dir)" 888*5051Swyllys "p:(prefix)n:(nickname)S:(serial)s:(subject)" 889*5051Swyllys "c:(criteria)" 890*5051Swyllys "i:(issuer)l:(label)f:(infile)")) != EOF) { 8913089Swyllys if (EMPTYSTRING(optarg_av)) 8923089Swyllys return (PK_ERR_USAGE); 89317Sdinak switch (opt) { 8943089Swyllys case 'k': 8953089Swyllys if (kstype != 0) 8963089Swyllys return (PK_ERR_USAGE); 8973089Swyllys kstype = KS2Int(optarg_av); 8983089Swyllys if (kstype == 0) 8993089Swyllys return (PK_ERR_USAGE); 9003089Swyllys break; 9013089Swyllys case 't': 9023089Swyllys if (oclass != 0) 9033089Swyllys return (PK_ERR_USAGE); 9043089Swyllys oclass = OT2Int(optarg_av); 9053089Swyllys if (oclass == -1) 9063089Swyllys return (PK_ERR_USAGE); 9073089Swyllys break; 9083089Swyllys case 's': 9093089Swyllys if (subject) 9103089Swyllys return (PK_ERR_USAGE); 9113089Swyllys subject = optarg_av; 9123089Swyllys break; 9133089Swyllys case 'i': 9143089Swyllys if (issuer) 9153089Swyllys return (PK_ERR_USAGE); 9163089Swyllys issuer = optarg_av; 9173089Swyllys break; 9183089Swyllys case 'd': 9193089Swyllys if (dir) 9203089Swyllys return (PK_ERR_USAGE); 9213089Swyllys dir = optarg_av; 9223089Swyllys break; 9233089Swyllys case 'p': 9243089Swyllys if (prefix) 9253089Swyllys return (PK_ERR_USAGE); 9263089Swyllys prefix = optarg_av; 9273089Swyllys break; 9283089Swyllys case 'S': 9293089Swyllys serstr = optarg_av; 9303089Swyllys break; 9313089Swyllys case 'f': 9323089Swyllys if (filename) 9333089Swyllys return (PK_ERR_USAGE); 9343089Swyllys filename = optarg_av; 9353089Swyllys break; 9363089Swyllys case 'T': /* token specifier */ 9373089Swyllys if (token_spec) 9383089Swyllys return (PK_ERR_USAGE); 9393089Swyllys token_spec = optarg_av; 9403089Swyllys break; 9413089Swyllys case 'n': 9423089Swyllys case 'l': /* object with specific label */ 9433089Swyllys if (list_label) 9443089Swyllys return (PK_ERR_USAGE); 9453089Swyllys list_label = optarg_av; 9463089Swyllys break; 9473089Swyllys case 'c': 9483089Swyllys find_criteria = optarg_av; 9493089Swyllys if (!strcasecmp(find_criteria, "valid")) 9503089Swyllys find_criteria_flag = 9513089Swyllys KMF_NONEXPIRED_CERTS; 9523089Swyllys else if (!strcasecmp(find_criteria, "expired")) 9533089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS; 9543089Swyllys else if (!strcasecmp(find_criteria, "both")) 9553089Swyllys find_criteria_flag = KMF_ALL_CERTS; 9563089Swyllys else 9573089Swyllys return (PK_ERR_USAGE); 9583089Swyllys break; 9593089Swyllys default: 960864Sdinak return (PK_ERR_USAGE); 96117Sdinak } 96217Sdinak } 96317Sdinak /* No additional args allowed. */ 964864Sdinak argc -= optind_av; 965864Sdinak argv += optind_av; 96617Sdinak if (argc) 96717Sdinak return (PK_ERR_USAGE); 96817Sdinak 969*5051Swyllys if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) { 9703089Swyllys /* Error message ? */ 9713089Swyllys return (rv); 97217Sdinak } 97317Sdinak 9743089Swyllys /* Assume keystore = PKCS#11 if not specified. */ 9753089Swyllys if (kstype == 0) 9763089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 97717Sdinak 9783089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 9793089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 980*5051Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 9813089Swyllys 9823089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 983*5051Swyllys "is only relevant if keystore=pkcs11\n")); 9843089Swyllys return (PK_ERR_USAGE); 98517Sdinak } 98617Sdinak 9873089Swyllys /* If no object class specified, list certificate objects. */ 9883089Swyllys if (oclass == 0) 9893089Swyllys oclass = PK_CERT_OBJ; 9903089Swyllys 9913089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) { 9923089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 9933089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) { 9943089Swyllys token_spec = DEFAULT_NSS_TOKEN; 99517Sdinak } 99617Sdinak 9973089Swyllys if (serstr != NULL) { 9983089Swyllys uchar_t *bytes = NULL; 9993089Swyllys size_t bytelen; 10003089Swyllys 1001*5051Swyllys rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen); 10023089Swyllys if (rv != KMF_OK || bytes == NULL) { 10033089Swyllys (void) fprintf(stderr, gettext("serial number " 1004*5051Swyllys "must be specified as a hex number " 1005*5051Swyllys "(ex: 0x0102030405ffeeddee)\n")); 10063089Swyllys return (PK_ERR_USAGE); 10073089Swyllys } 10083089Swyllys serial.val = bytes; 10093089Swyllys serial.len = bytelen; 101017Sdinak } 101117Sdinak 10123089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 1013*5051Swyllys kstype == KMF_KEYSTORE_NSS) && 1014*5051Swyllys (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) { 10153089Swyllys 10163089Swyllys (void) get_token_password(kstype, token_spec, 1017*5051Swyllys &tokencred); 10183089Swyllys } 10193089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) { 10203089Swyllys rv = list_pk11_objects(kmfhandle, token_spec, 1021*5051Swyllys oclass, list_label, &serial, 1022*5051Swyllys issuer, subject, dir, filename, 1023*5051Swyllys &tokencred, find_criteria_flag); 102417Sdinak 10253089Swyllys } else if (kstype == KMF_KEYSTORE_NSS) { 10263089Swyllys if (dir == NULL) 10273089Swyllys dir = PK_DEFAULT_DIRECTORY; 10283089Swyllys rv = list_nss_objects(kmfhandle, 1029*5051Swyllys oclass, token_spec, dir, prefix, 1030*5051Swyllys list_label, &serial, issuer, subject, 1031*5051Swyllys &tokencred, find_criteria_flag); 10323089Swyllys 10333089Swyllys } else if (kstype == KMF_KEYSTORE_OPENSSL) { 10343089Swyllys 10353089Swyllys rv = list_file_objects(kmfhandle, 1036*5051Swyllys oclass, dir, filename, 1037*5051Swyllys &serial, issuer, subject, find_criteria_flag); 103817Sdinak } 103917Sdinak 10403089Swyllys if (rv != KMF_OK) { 10413089Swyllys display_error(kmfhandle, rv, 1042*5051Swyllys gettext("Error listing objects")); 10433089Swyllys } 10443089Swyllys 10453089Swyllys if (serial.val != NULL) 10463089Swyllys free(serial.val); 10473089Swyllys 10483089Swyllys if (tokencred.cred != NULL) 10493089Swyllys free(tokencred.cred); 10503089Swyllys 1051*5051Swyllys (void) kmf_finalize(kmfhandle); 10523089Swyllys return (rv); 105317Sdinak } 1054