117Sdinak /* 217Sdinak * CDDL HEADER START 317Sdinak * 417Sdinak * The contents of this file are subject to the terms of the 5*3089Swyllys * Common Development and Distribution License (the "License"). 6*3089Swyllys * 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*3089Swyllys * Copyright 2006 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" 41*3089Swyllys 42*3089Swyllys #include <kmfapi.h> 4317Sdinak 44*3089Swyllys static void 45*3089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs) 4617Sdinak { 47*3089Swyllys int i; 48*3089Swyllys char *subject, *issuer, *serial, *id, *altname; 4917Sdinak 50*3089Swyllys for (i = 0; i < num_certs; i++) { 51*3089Swyllys subject = NULL; 52*3089Swyllys issuer = NULL; 53*3089Swyllys serial = NULL; 54*3089Swyllys id = NULL; 55*3089Swyllys altname = NULL; 5617Sdinak 57*3089Swyllys (void) fprintf(stdout, 58*3089Swyllys gettext("%d. (X.509 certificate)\n"), i + 1); 59*3089Swyllys if (certs[i].kmf_private.label != NULL) 60*3089Swyllys (void) fprintf(stdout, gettext("\t%s: %s\n"), 61*3089Swyllys (certs[i].kmf_private.keystore_type == 62*3089Swyllys KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"), 63*3089Swyllys certs[i].kmf_private.label); 64*3089Swyllys if (KMF_GetCertIDString(&certs[i].certificate, 65*3089Swyllys &id) == KMF_OK) 66*3089Swyllys (void) fprintf(stdout, gettext("\tID: %s\n"), id); 67*3089Swyllys if (KMF_GetCertSubjectNameString(kmfhandle, 68*3089Swyllys &certs[i].certificate, &subject) == KMF_OK) 69*3089Swyllys (void) fprintf(stdout, gettext("\tSubject: %s\n"), 70*3089Swyllys subject); 71*3089Swyllys if (KMF_GetCertIssuerNameString(kmfhandle, 72*3089Swyllys &certs[i].certificate, &issuer) == KMF_OK) 73*3089Swyllys (void) fprintf(stdout, gettext("\tIssuer: %s\n"), 74*3089Swyllys issuer); 75*3089Swyllys if (KMF_GetCertSerialNumberString(kmfhandle, 76*3089Swyllys &certs[i].certificate, &serial) == KMF_OK) 77*3089Swyllys (void) fprintf(stdout, gettext("\tSerial: %s\n"), 78*3089Swyllys serial); 79*3089Swyllys 80*3089Swyllys if (KMF_GetCertExtensionString(kmfhandle, 81*3089Swyllys &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME, 82*3089Swyllys &altname) == KMF_OK) { 83*3089Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 84*3089Swyllys altname); 85*3089Swyllys } 86*3089Swyllys 87*3089Swyllys KMF_FreeString(subject); 88*3089Swyllys KMF_FreeString(issuer); 89*3089Swyllys KMF_FreeString(serial); 90*3089Swyllys KMF_FreeString(id); 91*3089Swyllys KMF_FreeString(altname); 92*3089Swyllys (void) fprintf(stdout, "\n"); 9317Sdinak } 9417Sdinak } 9517Sdinak 96*3089Swyllys static char * 97*3089Swyllys describeKey(KMF_KEY_HANDLE *key) 9817Sdinak { 99*3089Swyllys if (key->keyclass == KMF_ASYM_PUB) { 100*3089Swyllys if (key->keyalg == KMF_RSA) 101*3089Swyllys return (gettext("RSA public key")); 102*3089Swyllys if (key->keyalg == KMF_DSA) 103*3089Swyllys return (gettext("DSA public key")); 10417Sdinak } 105*3089Swyllys if (key->keyclass == KMF_ASYM_PRI) { 106*3089Swyllys if (key->keyalg == KMF_RSA) 107*3089Swyllys return ("RSA private key"); 108*3089Swyllys if (key->keyalg == KMF_DSA) 109*3089Swyllys return ("DSA private key"); 11017Sdinak } 111*3089Swyllys if (key->keyclass == KMF_SYMMETRIC) { 112*3089Swyllys switch (key->keyalg) { 113*3089Swyllys case KMF_AES: 114*3089Swyllys return (gettext("AES")); 115*3089Swyllys break; 116*3089Swyllys case KMF_RC4: 117*3089Swyllys return (gettext("ARCFOUR")); 118*3089Swyllys break; 119*3089Swyllys case KMF_DES: 120*3089Swyllys return (gettext("DES")); 121*3089Swyllys break; 122*3089Swyllys case KMF_DES3: 123*3089Swyllys return (gettext("Triple-DES")); 124*3089Swyllys break; 125*3089Swyllys default: 126*3089Swyllys return (gettext("symmetric")); 127*3089Swyllys break; 12817Sdinak } 12917Sdinak } 13017Sdinak 131*3089Swyllys return (gettext("unrecognized key object")); 132*3089Swyllys 133*3089Swyllys } 13417Sdinak 135*3089Swyllys static char * 136*3089Swyllys keybitstr(KMF_KEY_HANDLE *key) 137*3089Swyllys { 138*3089Swyllys KMF_RAW_SYM_KEY *rkey; 139*3089Swyllys char keystr[256]; 140*3089Swyllys char *p; 14117Sdinak 142*3089Swyllys if (key == NULL || (key->keyclass != KMF_SYMMETRIC)) 143*3089Swyllys return (""); 14417Sdinak 145*3089Swyllys rkey = (KMF_RAW_SYM_KEY *)key->keyp; 146*3089Swyllys (void) memset(keystr, 0, sizeof (keystr)); 147*3089Swyllys if (rkey != NULL) { 148*3089Swyllys (void) snprintf(keystr, sizeof (keystr), 149*3089Swyllys " (%d bits)", rkey->keydata.len * 8); 150*3089Swyllys p = keystr; 151*3089Swyllys } else { 152*3089Swyllys return (""); 15317Sdinak } 15417Sdinak 155*3089Swyllys return (p); 156*3089Swyllys } 157*3089Swyllys 158*3089Swyllys static void 159*3089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys) 160*3089Swyllys { 161*3089Swyllys int i; 162*3089Swyllys 163*3089Swyllys for (i = 0; i < numkeys; i++) { 164*3089Swyllys (void) fprintf(stdout, gettext("Key #%d - %s: %s%s"), 165*3089Swyllys i+1, describeKey(&keys[i]), 166*3089Swyllys keys[i].keylabel ? keys[i].keylabel : 167*3089Swyllys gettext("No label"), 168*3089Swyllys (keys[i].keyclass == KMF_SYMMETRIC ? 169*3089Swyllys keybitstr(&keys[i]) : "")); 170*3089Swyllys 171*3089Swyllys if (keys[i].keyclass == KMF_SYMMETRIC) { 172*3089Swyllys KMF_RETURN rv; 173*3089Swyllys KMF_RAW_SYM_KEY rkey; 174*3089Swyllys rv = KMF_GetSymKeyValue(handle, &keys[i], 175*3089Swyllys &rkey); 176*3089Swyllys if (rv == KMF_OK) { 177*3089Swyllys (void) fprintf(stdout, "\t %d bits", 178*3089Swyllys rkey.keydata.len * 8); 179*3089Swyllys KMF_FreeRawSymKey(&rkey); 180*3089Swyllys } 18117Sdinak } 182*3089Swyllys (void) fprintf(stdout, "\n"); 18317Sdinak } 184*3089Swyllys } 18517Sdinak 186*3089Swyllys /* 187*3089Swyllys * Generic routine used by all "list cert" operations to find 188*3089Swyllys * all matching certificates. 189*3089Swyllys */ 190*3089Swyllys static KMF_RETURN 191*3089Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *params) 192*3089Swyllys { 193*3089Swyllys KMF_RETURN rv = KMF_OK; 194*3089Swyllys KMF_X509_DER_CERT *certlist = NULL; 195*3089Swyllys uint32_t numcerts = 0; 19617Sdinak 197*3089Swyllys numcerts = 0; 198*3089Swyllys rv = KMF_FindCert(kmfhandle, params, NULL, &numcerts); 199*3089Swyllys if (rv == KMF_OK && numcerts > 0) { 200*3089Swyllys (void) printf(gettext("Found %d certificates.\n"), 201*3089Swyllys numcerts); 202*3089Swyllys certlist = (KMF_X509_DER_CERT *)malloc(numcerts * 203*3089Swyllys sizeof (KMF_X509_DER_CERT)); 204*3089Swyllys if (certlist == NULL) 205*3089Swyllys return (KMF_ERR_MEMORY); 206*3089Swyllys (void) memset(certlist, 0, numcerts * 207*3089Swyllys sizeof (KMF_X509_DER_CERT)); 208*3089Swyllys 209*3089Swyllys rv = KMF_FindCert(kmfhandle, params, certlist, &numcerts); 210*3089Swyllys if (rv == KMF_OK) { 211*3089Swyllys int i; 212*3089Swyllys (void) pk_show_certs(kmfhandle, certlist, 213*3089Swyllys numcerts); 214*3089Swyllys for (i = 0; i < numcerts; i++) 215*3089Swyllys KMF_FreeKMFCert(kmfhandle, &certlist[i]); 216*3089Swyllys } 217*3089Swyllys free(certlist); 21817Sdinak } 219*3089Swyllys if (rv == KMF_ERR_CERT_NOT_FOUND && 220*3089Swyllys params->kstype != KMF_KEYSTORE_OPENSSL) 221*3089Swyllys rv = KMF_OK; 22217Sdinak 22317Sdinak return (rv); 22417Sdinak } 22517Sdinak 226*3089Swyllys static KMF_RETURN 227*3089Swyllys pk_list_keys(void *handle, KMF_FINDKEY_PARAMS *parms) 22817Sdinak { 229*3089Swyllys KMF_RETURN rv; 230*3089Swyllys KMF_KEY_HANDLE *keys; 231*3089Swyllys uint32_t numkeys = 0; 232*3089Swyllys 233*3089Swyllys numkeys = 0; 234*3089Swyllys rv = KMF_FindKey(handle, parms, NULL, &numkeys); 235*3089Swyllys if (rv == KMF_OK && numkeys > 0) { 236*3089Swyllys int i; 237*3089Swyllys (void) printf(gettext("Found %d keys.\n"), numkeys); 238*3089Swyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 239*3089Swyllys sizeof (KMF_KEY_HANDLE)); 240*3089Swyllys if (keys == NULL) 241*3089Swyllys return (KMF_ERR_MEMORY); 242*3089Swyllys (void) memset(keys, 0, numkeys * 243*3089Swyllys sizeof (KMF_KEY_HANDLE)); 24417Sdinak 245*3089Swyllys rv = KMF_FindKey(handle, parms, keys, &numkeys); 246*3089Swyllys if (rv == KMF_OK) 247*3089Swyllys pk_show_keys(handle, keys, numkeys); 248*3089Swyllys for (i = 0; i < numkeys; i++) 249*3089Swyllys KMF_FreeKMFKey(handle, &keys[i]); 250*3089Swyllys free(keys); 251*3089Swyllys } 252*3089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND && 253*3089Swyllys parms->kstype != KMF_KEYSTORE_OPENSSL) 254*3089Swyllys rv = KMF_OK; 255*3089Swyllys return (rv); 256*3089Swyllys } 25717Sdinak 258*3089Swyllys static KMF_RETURN 259*3089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass, 260*3089Swyllys char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject, 261*3089Swyllys char *dir, char *filename, KMF_CREDENTIAL *tokencred, 262*3089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 263*3089Swyllys { 264*3089Swyllys KMF_RETURN rv; 265*3089Swyllys KMF_LISTCRL_PARAMS lcrlargs; 266*3089Swyllys 267*3089Swyllys /* 268*3089Swyllys * Symmetric keys and RSA/DSA private keys are always 269*3089Swyllys * created with the "CKA_PRIVATE" field == TRUE, so 270*3089Swyllys * make sure we search for them with it also set. 271*3089Swyllys */ 272*3089Swyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 273*3089Swyllys oclass |= PK_PRIVATE_OBJ; 274*3089Swyllys 275*3089Swyllys rv = select_token(kmfhandle, token, 276*3089Swyllys !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ))); 277*3089Swyllys 278*3089Swyllys if (rv != KMF_OK) { 27917Sdinak return (rv); 28017Sdinak } 28117Sdinak 282*3089Swyllys if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) { 283*3089Swyllys KMF_FINDKEY_PARAMS parms; 284*3089Swyllys 285*3089Swyllys (void) memset(&parms, 0, sizeof (parms)); 286*3089Swyllys parms.kstype = KMF_KEYSTORE_PK11TOKEN; 287*3089Swyllys 288*3089Swyllys if (oclass & PK_PRIKEY_OBJ) { 289*3089Swyllys parms.keyclass = KMF_ASYM_PRI; 290*3089Swyllys parms.findLabel = objlabel; 291*3089Swyllys parms.cred = *tokencred; 292*3089Swyllys parms.pkcs11parms.private = 293*3089Swyllys ((oclass & PK_PRIVATE_OBJ) > 0); 294*3089Swyllys 295*3089Swyllys /* list asymmetric private keys */ 296*3089Swyllys rv = pk_list_keys(kmfhandle, &parms); 297*3089Swyllys } 298*3089Swyllys 299*3089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 300*3089Swyllys parms.keyclass = KMF_SYMMETRIC; 301*3089Swyllys parms.findLabel = objlabel; 302*3089Swyllys parms.cred = *tokencred; 303*3089Swyllys parms.format = KMF_FORMAT_RAWKEY; 304*3089Swyllys parms.pkcs11parms.private = 305*3089Swyllys ((oclass & PK_PRIVATE_OBJ) > 0); 306*3089Swyllys 307*3089Swyllys /* list symmetric keys */ 308*3089Swyllys rv = pk_list_keys(kmfhandle, &parms); 30917Sdinak } 310*3089Swyllys 311*3089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 312*3089Swyllys parms.keyclass = KMF_ASYM_PUB; 313*3089Swyllys parms.findLabel = objlabel; 314*3089Swyllys parms.pkcs11parms.private = 315*3089Swyllys ((oclass & PK_PRIVATE_OBJ) > 0); 316*3089Swyllys 317*3089Swyllys /* list asymmetric public keys (if any) */ 318*3089Swyllys rv = pk_list_keys(kmfhandle, &parms); 319*3089Swyllys } 320*3089Swyllys 321*3089Swyllys if (rv != KMF_OK) 322*3089Swyllys return (rv); 323*3089Swyllys } 324*3089Swyllys 325*3089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 326*3089Swyllys KMF_FINDCERT_PARAMS parms; 327*3089Swyllys 328*3089Swyllys (void) memset(&parms, 0, sizeof (parms)); 329*3089Swyllys parms.kstype = KMF_KEYSTORE_PK11TOKEN; 330*3089Swyllys parms.certLabel = objlabel; 331*3089Swyllys parms.issuer = issuer; 332*3089Swyllys parms.subject = subject; 333*3089Swyllys parms.serial = serial; 334*3089Swyllys parms.pkcs11parms.private = FALSE; 335*3089Swyllys parms.find_cert_validity = find_criteria_flag; 336*3089Swyllys 337*3089Swyllys rv = pk_find_certs(kmfhandle, &parms); 338*3089Swyllys if (rv != KMF_OK) 339*3089Swyllys return (rv); 340*3089Swyllys } 341*3089Swyllys 342*3089Swyllys if (oclass & PK_CRL_OBJ) { 343*3089Swyllys char *crldata; 344*3089Swyllys 345*3089Swyllys (void) memset(&lcrlargs, 0, sizeof (lcrlargs)); 346*3089Swyllys lcrlargs.kstype = KMF_KEYSTORE_OPENSSL; 347*3089Swyllys lcrlargs.sslparms.dirpath = dir; 348*3089Swyllys lcrlargs.sslparms.crlfile = filename; 349*3089Swyllys 350*3089Swyllys rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata); 351*3089Swyllys if (rv == KMF_OK) { 352*3089Swyllys (void) printf("%s\n", crldata); 353*3089Swyllys free(crldata); 35417Sdinak } 35517Sdinak } 35617Sdinak 357*3089Swyllys return (rv); 358*3089Swyllys } 359*3089Swyllys 360*3089Swyllys static int 361*3089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass, 362*3089Swyllys char *dir, char *filename, KMF_BIGINT *serial, 363*3089Swyllys char *issuer, char *subject, 364*3089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 365*3089Swyllys { 366*3089Swyllys int rv; 367*3089Swyllys KMF_FINDCERT_PARAMS fcargs; 368*3089Swyllys KMF_FINDKEY_PARAMS fkargs; 369*3089Swyllys KMF_LISTCRL_PARAMS lcrlargs; 370*3089Swyllys 371*3089Swyllys if (oclass & PK_KEY_OBJ) { 372*3089Swyllys (void) memset(&fkargs, 0, sizeof (fkargs)); 373*3089Swyllys fkargs.kstype = KMF_KEYSTORE_OPENSSL; 374*3089Swyllys fkargs.sslparms.dirpath = dir; 375*3089Swyllys fkargs.sslparms.keyfile = filename; 376*3089Swyllys if (oclass & PK_PRIKEY_OBJ) { 377*3089Swyllys fkargs.keyclass = KMF_ASYM_PRI; 378*3089Swyllys 379*3089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 380*3089Swyllys } 381*3089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 382*3089Swyllys rv = KMF_OK; 383*3089Swyllys 384*3089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 385*3089Swyllys fkargs.keyclass = KMF_SYMMETRIC; 386*3089Swyllys fkargs.format = KMF_FORMAT_RAWKEY; 387*3089Swyllys 388*3089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 389*3089Swyllys } 390*3089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 391*3089Swyllys rv = KMF_OK; 392*3089Swyllys if (rv != KMF_OK) 393*3089Swyllys return (rv); 39417Sdinak } 39517Sdinak 396*3089Swyllys if (oclass & PK_CERT_OBJ) { 397*3089Swyllys (void) memset(&fcargs, 0, sizeof (fcargs)); 398*3089Swyllys fcargs.kstype = KMF_KEYSTORE_OPENSSL; 399*3089Swyllys fcargs.certLabel = NULL; 400*3089Swyllys fcargs.issuer = issuer; 401*3089Swyllys fcargs.subject = subject; 402*3089Swyllys fcargs.serial = serial; 403*3089Swyllys fcargs.sslparms.dirpath = dir; 404*3089Swyllys fcargs.sslparms.certfile = filename; 405*3089Swyllys fcargs.find_cert_validity = find_criteria_flag; 40617Sdinak 407*3089Swyllys rv = pk_find_certs(kmfhandle, &fcargs); 408*3089Swyllys if (rv != KMF_OK) 409*3089Swyllys return (rv); 41017Sdinak } 41117Sdinak 412*3089Swyllys if (oclass & PK_CRL_OBJ) { 413*3089Swyllys char *crldata; 41417Sdinak 415*3089Swyllys (void) memset(&lcrlargs, 0, sizeof (lcrlargs)); 416*3089Swyllys lcrlargs.kstype = KMF_KEYSTORE_OPENSSL; 417*3089Swyllys lcrlargs.sslparms.dirpath = dir; 418*3089Swyllys lcrlargs.sslparms.crlfile = filename; 41917Sdinak 420*3089Swyllys rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata); 421*3089Swyllys if (rv == KMF_OK) { 422*3089Swyllys (void) printf("%s\n", crldata); 423*3089Swyllys free(crldata); 424*3089Swyllys } 42517Sdinak } 42617Sdinak 42717Sdinak return (rv); 42817Sdinak } 42917Sdinak 430*3089Swyllys static int 431*3089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle, 432*3089Swyllys int oclass, char *token_spec, char *dir, char *prefix, 433*3089Swyllys char *nickname, KMF_BIGINT *serial, char *issuer, char *subject, 434*3089Swyllys KMF_CREDENTIAL *tokencred, 435*3089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 43617Sdinak { 437*3089Swyllys KMF_RETURN rv = KMF_OK; 438*3089Swyllys KMF_FINDKEY_PARAMS fkargs; 439*3089Swyllys 440*3089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 441*3089Swyllys if (rv != KMF_OK) 442*3089Swyllys return (rv); 44317Sdinak 444*3089Swyllys if (oclass & PK_KEY_OBJ) { 445*3089Swyllys (void) memset(&fkargs, 0, sizeof (fkargs)); 446*3089Swyllys fkargs.kstype = KMF_KEYSTORE_NSS; 447*3089Swyllys fkargs.findLabel = nickname; 448*3089Swyllys fkargs.cred = *tokencred; 449*3089Swyllys fkargs.nssparms.slotlabel = token_spec; 45017Sdinak } 45117Sdinak 452*3089Swyllys if (oclass & PK_PRIKEY_OBJ) { 453*3089Swyllys fkargs.keyclass = KMF_ASYM_PRI; 454*3089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 45517Sdinak } 456*3089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 457*3089Swyllys fkargs.keyclass = KMF_SYMMETRIC; 458*3089Swyllys fkargs.format = KMF_FORMAT_RAWKEY; 459*3089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 460*3089Swyllys } 461*3089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 462*3089Swyllys fkargs.keyclass = KMF_ASYM_PUB; 463*3089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 46417Sdinak } 46517Sdinak 466*3089Swyllys /* If searching for public objects or certificates, find certs now */ 467*3089Swyllys if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) { 468*3089Swyllys KMF_FINDCERT_PARAMS fcargs; 46917Sdinak 470*3089Swyllys (void) memset(&fcargs, 0, sizeof (fcargs)); 471*3089Swyllys fcargs.kstype = KMF_KEYSTORE_NSS; 472*3089Swyllys fcargs.certLabel = nickname; 473*3089Swyllys fcargs.issuer = issuer; 474*3089Swyllys fcargs.subject = subject; 475*3089Swyllys fcargs.serial = serial; 476*3089Swyllys fcargs.nssparms.slotlabel = token_spec; 477*3089Swyllys fcargs.find_cert_validity = find_criteria_flag; 47817Sdinak 479*3089Swyllys rv = pk_find_certs(kmfhandle, &fcargs); 48017Sdinak } 48117Sdinak 482*3089Swyllys if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) { 483*3089Swyllys int numcrls; 484*3089Swyllys KMF_FINDCRL_PARAMS fcrlargs; 485*3089Swyllys 486*3089Swyllys (void) memset(&fcrlargs, 0, sizeof (fcrlargs)); 487*3089Swyllys fcrlargs.kstype = KMF_KEYSTORE_NSS; 488*3089Swyllys fcrlargs.nssparms.slotlabel = token_spec; 489*3089Swyllys 490*3089Swyllys rv = KMF_FindCRL(kmfhandle, &fcrlargs, NULL, &numcrls); 491*3089Swyllys if (rv == KMF_OK) { 492*3089Swyllys char **p; 493*3089Swyllys if (numcrls == 0) { 494*3089Swyllys (void) printf(gettext("No CRLs found in " 495*3089Swyllys "NSS keystore.\n")); 49617Sdinak 497*3089Swyllys return (KMF_OK); 498*3089Swyllys } 499*3089Swyllys p = malloc(numcrls * sizeof (char *)); 500*3089Swyllys if (p == NULL) { 501*3089Swyllys return (KMF_ERR_MEMORY); 502*3089Swyllys } 503*3089Swyllys (void) memset(p, 0, numcrls * sizeof (char *)); 504*3089Swyllys rv = KMF_FindCRL(kmfhandle, &fcrlargs, 505*3089Swyllys p, &numcrls); 506*3089Swyllys if (rv == KMF_OK) { 507*3089Swyllys int i; 508*3089Swyllys for (i = 0; i < numcrls; i++) { 509*3089Swyllys (void) printf("%d. Name = %s\n", 510*3089Swyllys i + 1, p[i]); 511*3089Swyllys free(p[i]); 512*3089Swyllys } 513*3089Swyllys } 514*3089Swyllys free(p); 51517Sdinak } 51617Sdinak } 51717Sdinak return (rv); 51817Sdinak } 51917Sdinak 52017Sdinak /* 52117Sdinak * List token object. 52217Sdinak */ 52317Sdinak int 52417Sdinak pk_list(int argc, char *argv[]) 52517Sdinak { 52617Sdinak int opt; 527864Sdinak extern int optind_av; 528864Sdinak extern char *optarg_av; 529864Sdinak char *token_spec = NULL; 530*3089Swyllys char *subject = NULL; 531*3089Swyllys char *issuer = NULL; 532*3089Swyllys char *dir = NULL; 533*3089Swyllys char *prefix = NULL; 534*3089Swyllys char *filename = NULL; 535*3089Swyllys char *serstr = NULL; 536*3089Swyllys KMF_BIGINT serial = { NULL, 0 }; 53717Sdinak 538*3089Swyllys char *list_label = NULL; 539*3089Swyllys int oclass = 0; 540*3089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 541*3089Swyllys KMF_RETURN rv = KMF_OK; 542*3089Swyllys KMF_HANDLE_T kmfhandle = NULL; 543*3089Swyllys char *find_criteria = NULL; 544*3089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 545*3089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 54617Sdinak 54717Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 548864Sdinak while ((opt = getopt_av(argc, argv, 549*3089Swyllys "k:(keystore)t:(objtype)T:(token)d:(dir)" 550*3089Swyllys "p:(prefix)n:(nickname)S:(serial)s:(subject)" 551*3089Swyllys "c:(criteria)" 552*3089Swyllys "i:(issuer)l:(label)f:(infile)")) != EOF) { 553*3089Swyllys if (EMPTYSTRING(optarg_av)) 554*3089Swyllys return (PK_ERR_USAGE); 55517Sdinak switch (opt) { 556*3089Swyllys case 'k': 557*3089Swyllys if (kstype != 0) 558*3089Swyllys return (PK_ERR_USAGE); 559*3089Swyllys kstype = KS2Int(optarg_av); 560*3089Swyllys if (kstype == 0) 561*3089Swyllys return (PK_ERR_USAGE); 562*3089Swyllys break; 563*3089Swyllys case 't': 564*3089Swyllys if (oclass != 0) 565*3089Swyllys return (PK_ERR_USAGE); 566*3089Swyllys oclass = OT2Int(optarg_av); 567*3089Swyllys if (oclass == -1) 568*3089Swyllys return (PK_ERR_USAGE); 569*3089Swyllys break; 570*3089Swyllys case 's': 571*3089Swyllys if (subject) 572*3089Swyllys return (PK_ERR_USAGE); 573*3089Swyllys subject = optarg_av; 574*3089Swyllys break; 575*3089Swyllys case 'i': 576*3089Swyllys if (issuer) 577*3089Swyllys return (PK_ERR_USAGE); 578*3089Swyllys issuer = optarg_av; 579*3089Swyllys break; 580*3089Swyllys case 'd': 581*3089Swyllys if (dir) 582*3089Swyllys return (PK_ERR_USAGE); 583*3089Swyllys dir = optarg_av; 584*3089Swyllys break; 585*3089Swyllys case 'p': 586*3089Swyllys if (prefix) 587*3089Swyllys return (PK_ERR_USAGE); 588*3089Swyllys prefix = optarg_av; 589*3089Swyllys break; 590*3089Swyllys case 'S': 591*3089Swyllys serstr = optarg_av; 592*3089Swyllys break; 593*3089Swyllys case 'f': 594*3089Swyllys if (filename) 595*3089Swyllys return (PK_ERR_USAGE); 596*3089Swyllys filename = optarg_av; 597*3089Swyllys break; 598*3089Swyllys case 'T': /* token specifier */ 599*3089Swyllys if (token_spec) 600*3089Swyllys return (PK_ERR_USAGE); 601*3089Swyllys token_spec = optarg_av; 602*3089Swyllys break; 603*3089Swyllys case 'n': 604*3089Swyllys case 'l': /* object with specific label */ 605*3089Swyllys if (list_label) 606*3089Swyllys return (PK_ERR_USAGE); 607*3089Swyllys list_label = optarg_av; 608*3089Swyllys break; 609*3089Swyllys case 'c': 610*3089Swyllys find_criteria = optarg_av; 611*3089Swyllys if (!strcasecmp(find_criteria, "valid")) 612*3089Swyllys find_criteria_flag = 613*3089Swyllys KMF_NONEXPIRED_CERTS; 614*3089Swyllys else if (!strcasecmp(find_criteria, "expired")) 615*3089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS; 616*3089Swyllys else if (!strcasecmp(find_criteria, "both")) 617*3089Swyllys find_criteria_flag = KMF_ALL_CERTS; 618*3089Swyllys else 619*3089Swyllys return (PK_ERR_USAGE); 620*3089Swyllys break; 621*3089Swyllys default: 622864Sdinak return (PK_ERR_USAGE); 62317Sdinak } 62417Sdinak } 62517Sdinak /* No additional args allowed. */ 626864Sdinak argc -= optind_av; 627864Sdinak argv += optind_av; 62817Sdinak if (argc) 62917Sdinak return (PK_ERR_USAGE); 63017Sdinak 631*3089Swyllys if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) { 632*3089Swyllys /* Error message ? */ 633*3089Swyllys return (rv); 63417Sdinak } 63517Sdinak 636*3089Swyllys /* Assume keystore = PKCS#11 if not specified. */ 637*3089Swyllys if (kstype == 0) 638*3089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 63917Sdinak 640*3089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 641*3089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 642*3089Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 643*3089Swyllys 644*3089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 645*3089Swyllys "is only relevant if keystore=pkcs11\n")); 646*3089Swyllys return (PK_ERR_USAGE); 64717Sdinak } 64817Sdinak 649*3089Swyllys /* If no object class specified, list certificate objects. */ 650*3089Swyllys if (oclass == 0) 651*3089Swyllys oclass = PK_CERT_OBJ; 652*3089Swyllys 653*3089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) { 654*3089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 655*3089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) { 656*3089Swyllys token_spec = DEFAULT_NSS_TOKEN; 65717Sdinak } 65817Sdinak 659*3089Swyllys if (serstr != NULL) { 660*3089Swyllys uchar_t *bytes = NULL; 661*3089Swyllys size_t bytelen; 662*3089Swyllys 663*3089Swyllys rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen); 664*3089Swyllys if (rv != KMF_OK || bytes == NULL) { 665*3089Swyllys (void) fprintf(stderr, gettext("serial number " 666*3089Swyllys "must be specified as a hex number " 667*3089Swyllys "(ex: 0x0102030405ffeeddee)\n")); 668*3089Swyllys return (PK_ERR_USAGE); 669*3089Swyllys } 670*3089Swyllys serial.val = bytes; 671*3089Swyllys serial.len = bytelen; 67217Sdinak } 67317Sdinak 674*3089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 675*3089Swyllys kstype == KMF_KEYSTORE_NSS) && 676*3089Swyllys (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) { 677*3089Swyllys 678*3089Swyllys (void) get_token_password(kstype, token_spec, 679*3089Swyllys &tokencred); 680*3089Swyllys } 681*3089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) { 682*3089Swyllys rv = list_pk11_objects(kmfhandle, token_spec, 683*3089Swyllys oclass, list_label, &serial, 684*3089Swyllys issuer, subject, dir, filename, 685*3089Swyllys &tokencred, find_criteria_flag); 68617Sdinak 687*3089Swyllys } else if (kstype == KMF_KEYSTORE_NSS) { 688*3089Swyllys if (dir == NULL) 689*3089Swyllys dir = PK_DEFAULT_DIRECTORY; 690*3089Swyllys rv = list_nss_objects(kmfhandle, 691*3089Swyllys oclass, token_spec, dir, prefix, 692*3089Swyllys list_label, &serial, issuer, subject, 693*3089Swyllys &tokencred, find_criteria_flag); 694*3089Swyllys 695*3089Swyllys } else if (kstype == KMF_KEYSTORE_OPENSSL) { 696*3089Swyllys 697*3089Swyllys rv = list_file_objects(kmfhandle, 698*3089Swyllys oclass, dir, filename, 699*3089Swyllys &serial, issuer, subject, find_criteria_flag); 70017Sdinak } 70117Sdinak 702*3089Swyllys if (rv != KMF_OK) { 703*3089Swyllys display_error(kmfhandle, rv, 704*3089Swyllys gettext("Error listing objects")); 705*3089Swyllys } 706*3089Swyllys 707*3089Swyllys if (serial.val != NULL) 708*3089Swyllys free(serial.val); 709*3089Swyllys 710*3089Swyllys if (tokencred.cred != NULL) 711*3089Swyllys free(tokencred.cred); 712*3089Swyllys 713*3089Swyllys (void) KMF_Finalize(kmfhandle); 714*3089Swyllys return (rv); 71517Sdinak } 716