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*3408Swyllys * 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; 4917Sdinak 503089Swyllys for (i = 0; i < num_certs; i++) { 513089Swyllys subject = NULL; 523089Swyllys issuer = NULL; 533089Swyllys serial = NULL; 543089Swyllys id = NULL; 553089Swyllys altname = NULL; 5617Sdinak 573089Swyllys (void) fprintf(stdout, 583089Swyllys gettext("%d. (X.509 certificate)\n"), i + 1); 593089Swyllys if (certs[i].kmf_private.label != NULL) 603089Swyllys (void) fprintf(stdout, gettext("\t%s: %s\n"), 613089Swyllys (certs[i].kmf_private.keystore_type == 623089Swyllys KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"), 633089Swyllys certs[i].kmf_private.label); 643089Swyllys if (KMF_GetCertIDString(&certs[i].certificate, 653089Swyllys &id) == KMF_OK) 663089Swyllys (void) fprintf(stdout, gettext("\tID: %s\n"), id); 673089Swyllys if (KMF_GetCertSubjectNameString(kmfhandle, 683089Swyllys &certs[i].certificate, &subject) == KMF_OK) 693089Swyllys (void) fprintf(stdout, gettext("\tSubject: %s\n"), 703089Swyllys subject); 713089Swyllys if (KMF_GetCertIssuerNameString(kmfhandle, 723089Swyllys &certs[i].certificate, &issuer) == KMF_OK) 733089Swyllys (void) fprintf(stdout, gettext("\tIssuer: %s\n"), 743089Swyllys issuer); 753089Swyllys if (KMF_GetCertSerialNumberString(kmfhandle, 763089Swyllys &certs[i].certificate, &serial) == KMF_OK) 773089Swyllys (void) fprintf(stdout, gettext("\tSerial: %s\n"), 783089Swyllys serial); 793089Swyllys 803089Swyllys if (KMF_GetCertExtensionString(kmfhandle, 813089Swyllys &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME, 823089Swyllys &altname) == KMF_OK) { 833089Swyllys (void) fprintf(stdout, gettext("\t%s\n"), 843089Swyllys altname); 853089Swyllys } 863089Swyllys 873089Swyllys KMF_FreeString(subject); 883089Swyllys KMF_FreeString(issuer); 893089Swyllys KMF_FreeString(serial); 903089Swyllys KMF_FreeString(id); 913089Swyllys KMF_FreeString(altname); 923089Swyllys (void) fprintf(stdout, "\n"); 9317Sdinak } 9417Sdinak } 9517Sdinak 963089Swyllys static char * 973089Swyllys describeKey(KMF_KEY_HANDLE *key) 9817Sdinak { 993089Swyllys if (key->keyclass == KMF_ASYM_PUB) { 1003089Swyllys if (key->keyalg == KMF_RSA) 1013089Swyllys return (gettext("RSA public key")); 1023089Swyllys if (key->keyalg == KMF_DSA) 1033089Swyllys return (gettext("DSA public key")); 10417Sdinak } 1053089Swyllys if (key->keyclass == KMF_ASYM_PRI) { 1063089Swyllys if (key->keyalg == KMF_RSA) 1073089Swyllys return ("RSA private key"); 1083089Swyllys if (key->keyalg == KMF_DSA) 1093089Swyllys return ("DSA private key"); 11017Sdinak } 1113089Swyllys if (key->keyclass == KMF_SYMMETRIC) { 1123089Swyllys switch (key->keyalg) { 1133089Swyllys case KMF_AES: 1143089Swyllys return (gettext("AES")); 1153089Swyllys break; 1163089Swyllys case KMF_RC4: 1173089Swyllys return (gettext("ARCFOUR")); 1183089Swyllys break; 1193089Swyllys case KMF_DES: 1203089Swyllys return (gettext("DES")); 1213089Swyllys break; 1223089Swyllys case KMF_DES3: 1233089Swyllys return (gettext("Triple-DES")); 1243089Swyllys break; 1253089Swyllys default: 1263089Swyllys return (gettext("symmetric")); 1273089Swyllys break; 12817Sdinak } 12917Sdinak } 13017Sdinak 1313089Swyllys return (gettext("unrecognized key object")); 1323089Swyllys 1333089Swyllys } 13417Sdinak 1353089Swyllys static char * 1363089Swyllys keybitstr(KMF_KEY_HANDLE *key) 1373089Swyllys { 1383089Swyllys KMF_RAW_SYM_KEY *rkey; 1393089Swyllys char keystr[256]; 1403089Swyllys char *p; 14117Sdinak 1423089Swyllys if (key == NULL || (key->keyclass != KMF_SYMMETRIC)) 1433089Swyllys return (""); 14417Sdinak 1453089Swyllys rkey = (KMF_RAW_SYM_KEY *)key->keyp; 1463089Swyllys (void) memset(keystr, 0, sizeof (keystr)); 1473089Swyllys if (rkey != NULL) { 1483089Swyllys (void) snprintf(keystr, sizeof (keystr), 1493089Swyllys " (%d bits)", rkey->keydata.len * 8); 1503089Swyllys p = keystr; 1513089Swyllys } else { 1523089Swyllys return (""); 15317Sdinak } 15417Sdinak 1553089Swyllys return (p); 1563089Swyllys } 1573089Swyllys 1583089Swyllys static void 1593089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys) 1603089Swyllys { 1613089Swyllys int i; 1623089Swyllys 1633089Swyllys for (i = 0; i < numkeys; i++) { 1643089Swyllys (void) fprintf(stdout, gettext("Key #%d - %s: %s%s"), 1653089Swyllys i+1, describeKey(&keys[i]), 1663089Swyllys keys[i].keylabel ? keys[i].keylabel : 1673089Swyllys gettext("No label"), 1683089Swyllys (keys[i].keyclass == KMF_SYMMETRIC ? 1693089Swyllys keybitstr(&keys[i]) : "")); 1703089Swyllys 1713089Swyllys if (keys[i].keyclass == KMF_SYMMETRIC) { 1723089Swyllys KMF_RETURN rv; 1733089Swyllys KMF_RAW_SYM_KEY rkey; 1743089Swyllys rv = KMF_GetSymKeyValue(handle, &keys[i], 1753089Swyllys &rkey); 1763089Swyllys if (rv == KMF_OK) { 1773089Swyllys (void) fprintf(stdout, "\t %d bits", 1783089Swyllys rkey.keydata.len * 8); 1793089Swyllys KMF_FreeRawSymKey(&rkey); 1803089Swyllys } 18117Sdinak } 1823089Swyllys (void) fprintf(stdout, "\n"); 18317Sdinak } 1843089Swyllys } 18517Sdinak 1863089Swyllys /* 1873089Swyllys * Generic routine used by all "list cert" operations to find 1883089Swyllys * all matching certificates. 1893089Swyllys */ 1903089Swyllys static KMF_RETURN 1913089Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *params) 1923089Swyllys { 1933089Swyllys KMF_RETURN rv = KMF_OK; 1943089Swyllys KMF_X509_DER_CERT *certlist = NULL; 1953089Swyllys uint32_t numcerts = 0; 19617Sdinak 1973089Swyllys numcerts = 0; 1983089Swyllys rv = KMF_FindCert(kmfhandle, params, NULL, &numcerts); 1993089Swyllys if (rv == KMF_OK && numcerts > 0) { 2003089Swyllys (void) printf(gettext("Found %d certificates.\n"), 2013089Swyllys numcerts); 2023089Swyllys certlist = (KMF_X509_DER_CERT *)malloc(numcerts * 2033089Swyllys sizeof (KMF_X509_DER_CERT)); 2043089Swyllys if (certlist == NULL) 2053089Swyllys return (KMF_ERR_MEMORY); 2063089Swyllys (void) memset(certlist, 0, numcerts * 2073089Swyllys sizeof (KMF_X509_DER_CERT)); 2083089Swyllys 2093089Swyllys rv = KMF_FindCert(kmfhandle, params, certlist, &numcerts); 2103089Swyllys if (rv == KMF_OK) { 2113089Swyllys int i; 2123089Swyllys (void) pk_show_certs(kmfhandle, certlist, 2133089Swyllys numcerts); 2143089Swyllys for (i = 0; i < numcerts; i++) 2153089Swyllys KMF_FreeKMFCert(kmfhandle, &certlist[i]); 2163089Swyllys } 2173089Swyllys free(certlist); 21817Sdinak } 2193089Swyllys if (rv == KMF_ERR_CERT_NOT_FOUND && 2203089Swyllys params->kstype != KMF_KEYSTORE_OPENSSL) 2213089Swyllys rv = KMF_OK; 22217Sdinak 22317Sdinak return (rv); 22417Sdinak } 22517Sdinak 2263089Swyllys static KMF_RETURN 2273089Swyllys pk_list_keys(void *handle, KMF_FINDKEY_PARAMS *parms) 22817Sdinak { 2293089Swyllys KMF_RETURN rv; 2303089Swyllys KMF_KEY_HANDLE *keys; 2313089Swyllys uint32_t numkeys = 0; 2323089Swyllys 2333089Swyllys numkeys = 0; 2343089Swyllys rv = KMF_FindKey(handle, parms, NULL, &numkeys); 2353089Swyllys if (rv == KMF_OK && numkeys > 0) { 2363089Swyllys int i; 2373089Swyllys (void) printf(gettext("Found %d keys.\n"), numkeys); 2383089Swyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 2393089Swyllys sizeof (KMF_KEY_HANDLE)); 2403089Swyllys if (keys == NULL) 2413089Swyllys return (KMF_ERR_MEMORY); 2423089Swyllys (void) memset(keys, 0, numkeys * 2433089Swyllys sizeof (KMF_KEY_HANDLE)); 24417Sdinak 2453089Swyllys rv = KMF_FindKey(handle, parms, keys, &numkeys); 2463089Swyllys if (rv == KMF_OK) 2473089Swyllys pk_show_keys(handle, keys, numkeys); 2483089Swyllys for (i = 0; i < numkeys; i++) 2493089Swyllys KMF_FreeKMFKey(handle, &keys[i]); 2503089Swyllys free(keys); 2513089Swyllys } 2523089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND && 2533089Swyllys parms->kstype != KMF_KEYSTORE_OPENSSL) 2543089Swyllys rv = KMF_OK; 2553089Swyllys return (rv); 2563089Swyllys } 25717Sdinak 2583089Swyllys static KMF_RETURN 2593089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass, 2603089Swyllys char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject, 2613089Swyllys char *dir, char *filename, KMF_CREDENTIAL *tokencred, 2623089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 2633089Swyllys { 2643089Swyllys KMF_RETURN rv; 2653089Swyllys KMF_LISTCRL_PARAMS lcrlargs; 2663089Swyllys 2673089Swyllys /* 2683089Swyllys * Symmetric keys and RSA/DSA private keys are always 2693089Swyllys * created with the "CKA_PRIVATE" field == TRUE, so 2703089Swyllys * make sure we search for them with it also set. 2713089Swyllys */ 2723089Swyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 2733089Swyllys oclass |= PK_PRIVATE_OBJ; 2743089Swyllys 2753089Swyllys rv = select_token(kmfhandle, token, 2763089Swyllys !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ))); 2773089Swyllys 2783089Swyllys if (rv != KMF_OK) { 27917Sdinak return (rv); 28017Sdinak } 28117Sdinak 2823089Swyllys if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) { 2833089Swyllys KMF_FINDKEY_PARAMS parms; 2843089Swyllys 2853089Swyllys (void) memset(&parms, 0, sizeof (parms)); 2863089Swyllys parms.kstype = KMF_KEYSTORE_PK11TOKEN; 2873089Swyllys 2883089Swyllys if (oclass & PK_PRIKEY_OBJ) { 2893089Swyllys parms.keyclass = KMF_ASYM_PRI; 2903089Swyllys parms.findLabel = objlabel; 2913089Swyllys parms.cred = *tokencred; 2923089Swyllys parms.pkcs11parms.private = 2933089Swyllys ((oclass & PK_PRIVATE_OBJ) > 0); 294*3408Swyllys parms.pkcs11parms.token = 1; 2953089Swyllys 2963089Swyllys /* list asymmetric private keys */ 2973089Swyllys rv = pk_list_keys(kmfhandle, &parms); 2983089Swyllys } 2993089Swyllys 3003089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 3013089Swyllys parms.keyclass = KMF_SYMMETRIC; 3023089Swyllys parms.findLabel = objlabel; 3033089Swyllys parms.cred = *tokencred; 3043089Swyllys parms.format = KMF_FORMAT_RAWKEY; 3053089Swyllys parms.pkcs11parms.private = 3063089Swyllys ((oclass & PK_PRIVATE_OBJ) > 0); 307*3408Swyllys parms.pkcs11parms.token = 1; 3083089Swyllys 3093089Swyllys /* list symmetric keys */ 3103089Swyllys rv = pk_list_keys(kmfhandle, &parms); 31117Sdinak } 3123089Swyllys 3133089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 3143089Swyllys parms.keyclass = KMF_ASYM_PUB; 3153089Swyllys parms.findLabel = objlabel; 3163089Swyllys parms.pkcs11parms.private = 3173089Swyllys ((oclass & PK_PRIVATE_OBJ) > 0); 318*3408Swyllys parms.pkcs11parms.token = 1; 3193089Swyllys 3203089Swyllys /* list asymmetric public keys (if any) */ 3213089Swyllys rv = pk_list_keys(kmfhandle, &parms); 3223089Swyllys } 3233089Swyllys 3243089Swyllys if (rv != KMF_OK) 3253089Swyllys return (rv); 3263089Swyllys } 3273089Swyllys 3283089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 3293089Swyllys KMF_FINDCERT_PARAMS parms; 3303089Swyllys 3313089Swyllys (void) memset(&parms, 0, sizeof (parms)); 3323089Swyllys parms.kstype = KMF_KEYSTORE_PK11TOKEN; 3333089Swyllys parms.certLabel = objlabel; 3343089Swyllys parms.issuer = issuer; 3353089Swyllys parms.subject = subject; 3363089Swyllys parms.serial = serial; 3373089Swyllys parms.pkcs11parms.private = FALSE; 3383089Swyllys parms.find_cert_validity = find_criteria_flag; 3393089Swyllys 3403089Swyllys rv = pk_find_certs(kmfhandle, &parms); 3413089Swyllys if (rv != KMF_OK) 3423089Swyllys return (rv); 3433089Swyllys } 3443089Swyllys 3453089Swyllys if (oclass & PK_CRL_OBJ) { 3463089Swyllys char *crldata; 3473089Swyllys 3483089Swyllys (void) memset(&lcrlargs, 0, sizeof (lcrlargs)); 3493089Swyllys lcrlargs.kstype = KMF_KEYSTORE_OPENSSL; 3503089Swyllys lcrlargs.sslparms.dirpath = dir; 3513089Swyllys lcrlargs.sslparms.crlfile = filename; 3523089Swyllys 3533089Swyllys rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata); 3543089Swyllys if (rv == KMF_OK) { 3553089Swyllys (void) printf("%s\n", crldata); 3563089Swyllys free(crldata); 35717Sdinak } 35817Sdinak } 35917Sdinak 3603089Swyllys return (rv); 3613089Swyllys } 3623089Swyllys 3633089Swyllys static int 3643089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass, 3653089Swyllys char *dir, char *filename, KMF_BIGINT *serial, 3663089Swyllys char *issuer, char *subject, 3673089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 3683089Swyllys { 3693089Swyllys int rv; 3703089Swyllys KMF_FINDCERT_PARAMS fcargs; 3713089Swyllys KMF_FINDKEY_PARAMS fkargs; 3723089Swyllys KMF_LISTCRL_PARAMS lcrlargs; 3733089Swyllys 3743089Swyllys if (oclass & PK_KEY_OBJ) { 3753089Swyllys (void) memset(&fkargs, 0, sizeof (fkargs)); 3763089Swyllys fkargs.kstype = KMF_KEYSTORE_OPENSSL; 3773089Swyllys fkargs.sslparms.dirpath = dir; 3783089Swyllys fkargs.sslparms.keyfile = filename; 3793089Swyllys if (oclass & PK_PRIKEY_OBJ) { 3803089Swyllys fkargs.keyclass = KMF_ASYM_PRI; 3813089Swyllys 3823089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 3833089Swyllys } 3843089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 3853089Swyllys rv = KMF_OK; 3863089Swyllys 3873089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 3883089Swyllys fkargs.keyclass = KMF_SYMMETRIC; 3893089Swyllys fkargs.format = KMF_FORMAT_RAWKEY; 3903089Swyllys 3913089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 3923089Swyllys } 3933089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) 3943089Swyllys rv = KMF_OK; 3953089Swyllys if (rv != KMF_OK) 3963089Swyllys return (rv); 39717Sdinak } 39817Sdinak 3993089Swyllys if (oclass & PK_CERT_OBJ) { 4003089Swyllys (void) memset(&fcargs, 0, sizeof (fcargs)); 4013089Swyllys fcargs.kstype = KMF_KEYSTORE_OPENSSL; 4023089Swyllys fcargs.certLabel = NULL; 4033089Swyllys fcargs.issuer = issuer; 4043089Swyllys fcargs.subject = subject; 4053089Swyllys fcargs.serial = serial; 4063089Swyllys fcargs.sslparms.dirpath = dir; 4073089Swyllys fcargs.sslparms.certfile = filename; 4083089Swyllys fcargs.find_cert_validity = find_criteria_flag; 40917Sdinak 4103089Swyllys rv = pk_find_certs(kmfhandle, &fcargs); 4113089Swyllys if (rv != KMF_OK) 4123089Swyllys return (rv); 41317Sdinak } 41417Sdinak 4153089Swyllys if (oclass & PK_CRL_OBJ) { 4163089Swyllys char *crldata; 41717Sdinak 4183089Swyllys (void) memset(&lcrlargs, 0, sizeof (lcrlargs)); 4193089Swyllys lcrlargs.kstype = KMF_KEYSTORE_OPENSSL; 4203089Swyllys lcrlargs.sslparms.dirpath = dir; 4213089Swyllys lcrlargs.sslparms.crlfile = filename; 42217Sdinak 4233089Swyllys rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata); 4243089Swyllys if (rv == KMF_OK) { 4253089Swyllys (void) printf("%s\n", crldata); 4263089Swyllys free(crldata); 4273089Swyllys } 42817Sdinak } 42917Sdinak 43017Sdinak return (rv); 43117Sdinak } 43217Sdinak 4333089Swyllys static int 4343089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle, 4353089Swyllys int oclass, char *token_spec, char *dir, char *prefix, 4363089Swyllys char *nickname, KMF_BIGINT *serial, char *issuer, char *subject, 4373089Swyllys KMF_CREDENTIAL *tokencred, 4383089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 43917Sdinak { 4403089Swyllys KMF_RETURN rv = KMF_OK; 4413089Swyllys KMF_FINDKEY_PARAMS fkargs; 4423089Swyllys 4433089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 4443089Swyllys if (rv != KMF_OK) 4453089Swyllys return (rv); 44617Sdinak 4473089Swyllys if (oclass & PK_KEY_OBJ) { 4483089Swyllys (void) memset(&fkargs, 0, sizeof (fkargs)); 4493089Swyllys fkargs.kstype = KMF_KEYSTORE_NSS; 4503089Swyllys fkargs.findLabel = nickname; 4513089Swyllys fkargs.cred = *tokencred; 4523089Swyllys fkargs.nssparms.slotlabel = token_spec; 45317Sdinak } 45417Sdinak 4553089Swyllys if (oclass & PK_PRIKEY_OBJ) { 4563089Swyllys fkargs.keyclass = KMF_ASYM_PRI; 4573089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 45817Sdinak } 4593089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 4603089Swyllys fkargs.keyclass = KMF_SYMMETRIC; 4613089Swyllys fkargs.format = KMF_FORMAT_RAWKEY; 4623089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 4633089Swyllys } 4643089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 4653089Swyllys fkargs.keyclass = KMF_ASYM_PUB; 4663089Swyllys rv = pk_list_keys(kmfhandle, &fkargs); 46717Sdinak } 46817Sdinak 4693089Swyllys /* If searching for public objects or certificates, find certs now */ 4703089Swyllys if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) { 4713089Swyllys KMF_FINDCERT_PARAMS fcargs; 47217Sdinak 4733089Swyllys (void) memset(&fcargs, 0, sizeof (fcargs)); 4743089Swyllys fcargs.kstype = KMF_KEYSTORE_NSS; 4753089Swyllys fcargs.certLabel = nickname; 4763089Swyllys fcargs.issuer = issuer; 4773089Swyllys fcargs.subject = subject; 4783089Swyllys fcargs.serial = serial; 4793089Swyllys fcargs.nssparms.slotlabel = token_spec; 4803089Swyllys fcargs.find_cert_validity = find_criteria_flag; 48117Sdinak 4823089Swyllys rv = pk_find_certs(kmfhandle, &fcargs); 48317Sdinak } 48417Sdinak 4853089Swyllys if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) { 4863089Swyllys int numcrls; 4873089Swyllys KMF_FINDCRL_PARAMS fcrlargs; 4883089Swyllys 4893089Swyllys (void) memset(&fcrlargs, 0, sizeof (fcrlargs)); 4903089Swyllys fcrlargs.kstype = KMF_KEYSTORE_NSS; 4913089Swyllys fcrlargs.nssparms.slotlabel = token_spec; 4923089Swyllys 4933089Swyllys rv = KMF_FindCRL(kmfhandle, &fcrlargs, NULL, &numcrls); 4943089Swyllys if (rv == KMF_OK) { 4953089Swyllys char **p; 4963089Swyllys if (numcrls == 0) { 4973089Swyllys (void) printf(gettext("No CRLs found in " 4983089Swyllys "NSS keystore.\n")); 49917Sdinak 5003089Swyllys return (KMF_OK); 5013089Swyllys } 5023089Swyllys p = malloc(numcrls * sizeof (char *)); 5033089Swyllys if (p == NULL) { 5043089Swyllys return (KMF_ERR_MEMORY); 5053089Swyllys } 5063089Swyllys (void) memset(p, 0, numcrls * sizeof (char *)); 5073089Swyllys rv = KMF_FindCRL(kmfhandle, &fcrlargs, 5083089Swyllys p, &numcrls); 5093089Swyllys if (rv == KMF_OK) { 5103089Swyllys int i; 5113089Swyllys for (i = 0; i < numcrls; i++) { 5123089Swyllys (void) printf("%d. Name = %s\n", 5133089Swyllys i + 1, p[i]); 5143089Swyllys free(p[i]); 5153089Swyllys } 5163089Swyllys } 5173089Swyllys free(p); 51817Sdinak } 51917Sdinak } 52017Sdinak return (rv); 52117Sdinak } 52217Sdinak 52317Sdinak /* 52417Sdinak * List token object. 52517Sdinak */ 52617Sdinak int 52717Sdinak pk_list(int argc, char *argv[]) 52817Sdinak { 52917Sdinak int opt; 530864Sdinak extern int optind_av; 531864Sdinak extern char *optarg_av; 532864Sdinak char *token_spec = NULL; 5333089Swyllys char *subject = NULL; 5343089Swyllys char *issuer = NULL; 5353089Swyllys char *dir = NULL; 5363089Swyllys char *prefix = NULL; 5373089Swyllys char *filename = NULL; 5383089Swyllys char *serstr = NULL; 5393089Swyllys KMF_BIGINT serial = { NULL, 0 }; 54017Sdinak 5413089Swyllys char *list_label = NULL; 5423089Swyllys int oclass = 0; 5433089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 5443089Swyllys KMF_RETURN rv = KMF_OK; 5453089Swyllys KMF_HANDLE_T kmfhandle = NULL; 5463089Swyllys char *find_criteria = NULL; 5473089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 5483089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 54917Sdinak 55017Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 551864Sdinak while ((opt = getopt_av(argc, argv, 5523089Swyllys "k:(keystore)t:(objtype)T:(token)d:(dir)" 5533089Swyllys "p:(prefix)n:(nickname)S:(serial)s:(subject)" 5543089Swyllys "c:(criteria)" 5553089Swyllys "i:(issuer)l:(label)f:(infile)")) != EOF) { 5563089Swyllys if (EMPTYSTRING(optarg_av)) 5573089Swyllys return (PK_ERR_USAGE); 55817Sdinak switch (opt) { 5593089Swyllys case 'k': 5603089Swyllys if (kstype != 0) 5613089Swyllys return (PK_ERR_USAGE); 5623089Swyllys kstype = KS2Int(optarg_av); 5633089Swyllys if (kstype == 0) 5643089Swyllys return (PK_ERR_USAGE); 5653089Swyllys break; 5663089Swyllys case 't': 5673089Swyllys if (oclass != 0) 5683089Swyllys return (PK_ERR_USAGE); 5693089Swyllys oclass = OT2Int(optarg_av); 5703089Swyllys if (oclass == -1) 5713089Swyllys return (PK_ERR_USAGE); 5723089Swyllys break; 5733089Swyllys case 's': 5743089Swyllys if (subject) 5753089Swyllys return (PK_ERR_USAGE); 5763089Swyllys subject = optarg_av; 5773089Swyllys break; 5783089Swyllys case 'i': 5793089Swyllys if (issuer) 5803089Swyllys return (PK_ERR_USAGE); 5813089Swyllys issuer = optarg_av; 5823089Swyllys break; 5833089Swyllys case 'd': 5843089Swyllys if (dir) 5853089Swyllys return (PK_ERR_USAGE); 5863089Swyllys dir = optarg_av; 5873089Swyllys break; 5883089Swyllys case 'p': 5893089Swyllys if (prefix) 5903089Swyllys return (PK_ERR_USAGE); 5913089Swyllys prefix = optarg_av; 5923089Swyllys break; 5933089Swyllys case 'S': 5943089Swyllys serstr = optarg_av; 5953089Swyllys break; 5963089Swyllys case 'f': 5973089Swyllys if (filename) 5983089Swyllys return (PK_ERR_USAGE); 5993089Swyllys filename = optarg_av; 6003089Swyllys break; 6013089Swyllys case 'T': /* token specifier */ 6023089Swyllys if (token_spec) 6033089Swyllys return (PK_ERR_USAGE); 6043089Swyllys token_spec = optarg_av; 6053089Swyllys break; 6063089Swyllys case 'n': 6073089Swyllys case 'l': /* object with specific label */ 6083089Swyllys if (list_label) 6093089Swyllys return (PK_ERR_USAGE); 6103089Swyllys list_label = optarg_av; 6113089Swyllys break; 6123089Swyllys case 'c': 6133089Swyllys find_criteria = optarg_av; 6143089Swyllys if (!strcasecmp(find_criteria, "valid")) 6153089Swyllys find_criteria_flag = 6163089Swyllys KMF_NONEXPIRED_CERTS; 6173089Swyllys else if (!strcasecmp(find_criteria, "expired")) 6183089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS; 6193089Swyllys else if (!strcasecmp(find_criteria, "both")) 6203089Swyllys find_criteria_flag = KMF_ALL_CERTS; 6213089Swyllys else 6223089Swyllys return (PK_ERR_USAGE); 6233089Swyllys break; 6243089Swyllys default: 625864Sdinak return (PK_ERR_USAGE); 62617Sdinak } 62717Sdinak } 62817Sdinak /* No additional args allowed. */ 629864Sdinak argc -= optind_av; 630864Sdinak argv += optind_av; 63117Sdinak if (argc) 63217Sdinak return (PK_ERR_USAGE); 63317Sdinak 6343089Swyllys if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) { 6353089Swyllys /* Error message ? */ 6363089Swyllys return (rv); 63717Sdinak } 63817Sdinak 6393089Swyllys /* Assume keystore = PKCS#11 if not specified. */ 6403089Swyllys if (kstype == 0) 6413089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 64217Sdinak 6433089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 6443089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 6453089Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 6463089Swyllys 6473089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 6483089Swyllys "is only relevant if keystore=pkcs11\n")); 6493089Swyllys return (PK_ERR_USAGE); 65017Sdinak } 65117Sdinak 6523089Swyllys /* If no object class specified, list certificate objects. */ 6533089Swyllys if (oclass == 0) 6543089Swyllys oclass = PK_CERT_OBJ; 6553089Swyllys 6563089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) { 6573089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 6583089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) { 6593089Swyllys token_spec = DEFAULT_NSS_TOKEN; 66017Sdinak } 66117Sdinak 6623089Swyllys if (serstr != NULL) { 6633089Swyllys uchar_t *bytes = NULL; 6643089Swyllys size_t bytelen; 6653089Swyllys 6663089Swyllys rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen); 6673089Swyllys if (rv != KMF_OK || bytes == NULL) { 6683089Swyllys (void) fprintf(stderr, gettext("serial number " 6693089Swyllys "must be specified as a hex number " 6703089Swyllys "(ex: 0x0102030405ffeeddee)\n")); 6713089Swyllys return (PK_ERR_USAGE); 6723089Swyllys } 6733089Swyllys serial.val = bytes; 6743089Swyllys serial.len = bytelen; 67517Sdinak } 67617Sdinak 6773089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 6783089Swyllys kstype == KMF_KEYSTORE_NSS) && 6793089Swyllys (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) { 6803089Swyllys 6813089Swyllys (void) get_token_password(kstype, token_spec, 6823089Swyllys &tokencred); 6833089Swyllys } 6843089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) { 6853089Swyllys rv = list_pk11_objects(kmfhandle, token_spec, 6863089Swyllys oclass, list_label, &serial, 6873089Swyllys issuer, subject, dir, filename, 6883089Swyllys &tokencred, find_criteria_flag); 68917Sdinak 6903089Swyllys } else if (kstype == KMF_KEYSTORE_NSS) { 6913089Swyllys if (dir == NULL) 6923089Swyllys dir = PK_DEFAULT_DIRECTORY; 6933089Swyllys rv = list_nss_objects(kmfhandle, 6943089Swyllys oclass, token_spec, dir, prefix, 6953089Swyllys list_label, &serial, issuer, subject, 6963089Swyllys &tokencred, find_criteria_flag); 6973089Swyllys 6983089Swyllys } else if (kstype == KMF_KEYSTORE_OPENSSL) { 6993089Swyllys 7003089Swyllys rv = list_file_objects(kmfhandle, 7013089Swyllys oclass, dir, filename, 7023089Swyllys &serial, issuer, subject, find_criteria_flag); 70317Sdinak } 70417Sdinak 7053089Swyllys if (rv != KMF_OK) { 7063089Swyllys display_error(kmfhandle, rv, 7073089Swyllys gettext("Error listing objects")); 7083089Swyllys } 7093089Swyllys 7103089Swyllys if (serial.val != NULL) 7113089Swyllys free(serial.val); 7123089Swyllys 7133089Swyllys if (tokencred.cred != NULL) 7143089Swyllys free(tokencred.cred); 7153089Swyllys 7163089Swyllys (void) KMF_Finalize(kmfhandle); 7173089Swyllys return (rv); 71817Sdinak } 719