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*12585Swyllys.ingersoll@sun.com * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
2317Sdinak */
2417Sdinak
2517Sdinak /*
2617Sdinak * This file implements the token object list operation for this tool.
2717Sdinak * It loads the PKCS#11 modules, finds the object to list, lists it,
2817Sdinak * and cleans up. User must be logged into the token to list private
2917Sdinak * objects.
3017Sdinak */
3117Sdinak
3217Sdinak #include <stdio.h>
3317Sdinak #include <errno.h>
3417Sdinak #include <string.h>
3517Sdinak #include <cryptoutil.h>
3617Sdinak #include <security/cryptoki.h>
3717Sdinak #include "common.h"
383089Swyllys
393089Swyllys #include <kmfapi.h>
4017Sdinak
413089Swyllys static void
pk_show_certs(KMF_HANDLE_T kmfhandle,KMF_X509_DER_CERT * certs,int num_certs)423089Swyllys pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
4317Sdinak {
443089Swyllys int i;
453089Swyllys char *subject, *issuer, *serial, *id, *altname;
465051Swyllys char *start, *end, *keyusage, *extkeyusage;
4717Sdinak
483089Swyllys for (i = 0; i < num_certs; i++) {
493089Swyllys subject = NULL;
503089Swyllys issuer = NULL;
513089Swyllys serial = NULL;
523089Swyllys id = NULL;
533089Swyllys altname = NULL;
545051Swyllys start = end = NULL;
555051Swyllys keyusage = extkeyusage = NULL;
5617Sdinak
573089Swyllys (void) fprintf(stdout,
585051Swyllys 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"),
615051Swyllys (certs[i].kmf_private.keystore_type ==
625051Swyllys KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"),
635051Swyllys certs[i].kmf_private.label);
645051Swyllys if (kmf_get_cert_id_str(&certs[i].certificate,
655051Swyllys &id) == KMF_OK)
663089Swyllys (void) fprintf(stdout, gettext("\tID: %s\n"), id);
675051Swyllys if (kmf_get_cert_subject_str(kmfhandle,
685051Swyllys &certs[i].certificate, &subject) == KMF_OK)
693089Swyllys (void) fprintf(stdout, gettext("\tSubject: %s\n"),
705051Swyllys subject);
715051Swyllys if (kmf_get_cert_issuer_str(kmfhandle,
725051Swyllys &certs[i].certificate, &issuer) == KMF_OK)
733089Swyllys (void) fprintf(stdout, gettext("\tIssuer: %s\n"),
745051Swyllys issuer);
755051Swyllys if (kmf_get_cert_start_date_str(kmfhandle,
765051Swyllys &certs[i].certificate, &start) == KMF_OK)
775051Swyllys (void) fprintf(stdout, gettext("\tNot Before: %s\n"),
785051Swyllys start);
795051Swyllys if (kmf_get_cert_end_date_str(kmfhandle,
805051Swyllys &certs[i].certificate, &end) == KMF_OK)
815051Swyllys (void) fprintf(stdout, gettext("\tNot After: %s\n"),
825051Swyllys end);
835051Swyllys if (kmf_get_cert_serial_str(kmfhandle,
845051Swyllys &certs[i].certificate, &serial) == KMF_OK)
853089Swyllys (void) fprintf(stdout, gettext("\tSerial: %s\n"),
865051Swyllys serial);
875051Swyllys if (kmf_get_cert_extn_str(kmfhandle,
885051Swyllys &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
895051Swyllys &altname) == KMF_OK) {
905051Swyllys (void) fprintf(stdout, gettext("\t%s\n"),
915051Swyllys altname);
925051Swyllys }
935051Swyllys if (kmf_get_cert_extn_str(kmfhandle,
945051Swyllys &certs[i].certificate, KMF_X509_EXT_KEY_USAGE,
955051Swyllys &keyusage) == KMF_OK) {
963089Swyllys (void) fprintf(stdout, gettext("\t%s\n"),
975051Swyllys keyusage);
985051Swyllys }
995051Swyllys if (kmf_get_cert_extn_str(kmfhandle,
1005051Swyllys &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE,
1015051Swyllys &extkeyusage) == KMF_OK) {
1025051Swyllys (void) fprintf(stdout, gettext("\t%s\n"),
1035051Swyllys extkeyusage);
1043089Swyllys }
1055051Swyllys kmf_free_str(subject);
1065051Swyllys kmf_free_str(issuer);
1075051Swyllys kmf_free_str(serial);
1085051Swyllys kmf_free_str(id);
1095051Swyllys kmf_free_str(altname);
1105051Swyllys kmf_free_str(keyusage);
1115051Swyllys kmf_free_str(extkeyusage);
1125051Swyllys kmf_free_str(start);
1135051Swyllys kmf_free_str(end);
1143089Swyllys (void) fprintf(stdout, "\n");
11517Sdinak }
11617Sdinak }
11717Sdinak
1183089Swyllys static char *
describeKey(KMF_KEY_HANDLE * key)1193089Swyllys describeKey(KMF_KEY_HANDLE *key)
12017Sdinak {
1213089Swyllys if (key->keyclass == KMF_ASYM_PUB) {
1223089Swyllys if (key->keyalg == KMF_RSA)
1233089Swyllys return (gettext("RSA public key"));
1243089Swyllys if (key->keyalg == KMF_DSA)
1253089Swyllys return (gettext("DSA public key"));
12611973Swyllys.ingersoll@sun.com if (key->keyalg == KMF_ECDSA)
12711973Swyllys.ingersoll@sun.com return (gettext("ECDSA public key"));
12817Sdinak }
1293089Swyllys if (key->keyclass == KMF_ASYM_PRI) {
1303089Swyllys if (key->keyalg == KMF_RSA)
13111973Swyllys.ingersoll@sun.com return (gettext("RSA private key"));
1323089Swyllys if (key->keyalg == KMF_DSA)
13311973Swyllys.ingersoll@sun.com return (gettext("DSA private key"));
13411973Swyllys.ingersoll@sun.com if (key->keyalg == KMF_ECDSA)
13511973Swyllys.ingersoll@sun.com return (gettext("ECDSA private key"));
13617Sdinak }
1373089Swyllys if (key->keyclass == KMF_SYMMETRIC) {
1383089Swyllys switch (key->keyalg) {
1393089Swyllys case KMF_AES:
1403089Swyllys return (gettext("AES"));
1413089Swyllys break;
1423089Swyllys case KMF_RC4:
1433089Swyllys return (gettext("ARCFOUR"));
1443089Swyllys break;
1453089Swyllys case KMF_DES:
1463089Swyllys return (gettext("DES"));
1473089Swyllys break;
1483089Swyllys case KMF_DES3:
1493089Swyllys return (gettext("Triple-DES"));
1503089Swyllys break;
1513089Swyllys default:
1523089Swyllys return (gettext("symmetric"));
1533089Swyllys break;
15417Sdinak }
15517Sdinak }
15617Sdinak
1573089Swyllys return (gettext("unrecognized key object"));
1583089Swyllys
1593089Swyllys }
16017Sdinak
1613089Swyllys
1623089Swyllys static void
pk_show_keys(void * handle,KMF_KEY_HANDLE * keys,int numkeys)1633089Swyllys pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
1643089Swyllys {
1653089Swyllys int i;
1663089Swyllys
1673089Swyllys for (i = 0; i < numkeys; i++) {
1684006Shylee (void) fprintf(stdout, gettext("Key #%d - %s: %s"),
1695051Swyllys i+1, describeKey(&keys[i]),
1705051Swyllys keys[i].keylabel ? keys[i].keylabel :
1715051Swyllys gettext("No label"));
1723089Swyllys
1733089Swyllys if (keys[i].keyclass == KMF_SYMMETRIC) {
1743089Swyllys KMF_RETURN rv;
1753089Swyllys KMF_RAW_SYM_KEY rkey;
1764006Shylee
1775051Swyllys (void) memset(&rkey, 0, sizeof (rkey));
1785051Swyllys rv = kmf_get_sym_key_value(handle, &keys[i],
1795051Swyllys &rkey);
1803089Swyllys if (rv == KMF_OK) {
1814006Shylee (void) fprintf(stdout, " (%d bits)",
1825051Swyllys rkey.keydata.len * 8);
1835051Swyllys kmf_free_bigint(&rkey.keydata);
1845051Swyllys } else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) {
1855051Swyllys if (rv == KMF_ERR_SENSITIVE_KEY) {
1865051Swyllys (void) fprintf(stdout, " (sensitive)");
1875051Swyllys } else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
1885051Swyllys (void) fprintf(stdout,
1895051Swyllys " (non-extractable)");
1905051Swyllys } else {
1915051Swyllys char *err = NULL;
1925051Swyllys if (kmf_get_kmf_error_str(rv, &err) ==
1935051Swyllys KMF_OK)
1945051Swyllys (void) fprintf(stdout,
1955051Swyllys " (error: %s)", err);
1965051Swyllys if (err != NULL)
1975051Swyllys free(err);
1985051Swyllys }
1993089Swyllys }
20017Sdinak }
2013089Swyllys (void) fprintf(stdout, "\n");
20217Sdinak }
2033089Swyllys }
20417Sdinak
2053089Swyllys /*
2063089Swyllys * Generic routine used by all "list cert" operations to find
2073089Swyllys * all matching certificates.
2083089Swyllys */
2093089Swyllys static KMF_RETURN
pk_find_certs(KMF_HANDLE_T kmfhandle,KMF_ATTRIBUTE * attrlist,int numattr)2105051Swyllys pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr)
2113089Swyllys {
2123089Swyllys KMF_RETURN rv = KMF_OK;
2133089Swyllys KMF_X509_DER_CERT *certlist = NULL;
2143089Swyllys uint32_t numcerts = 0;
2155051Swyllys KMF_KEYSTORE_TYPE kstype;
21617Sdinak
2175051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2185051Swyllys &kstype, NULL);
2195051Swyllys if (rv != KMF_OK)
2205051Swyllys return (rv);
2215051Swyllys
2225051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2235051Swyllys &numcerts, sizeof (uint32_t));
2245051Swyllys numattr++;
2255051Swyllys
2265051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2273089Swyllys if (rv == KMF_OK && numcerts > 0) {
2283089Swyllys (void) printf(gettext("Found %d certificates.\n"),
2295051Swyllys numcerts);
2303089Swyllys certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
2315051Swyllys sizeof (KMF_X509_DER_CERT));
2323089Swyllys if (certlist == NULL)
2333089Swyllys return (KMF_ERR_MEMORY);
2343089Swyllys (void) memset(certlist, 0, numcerts *
2355051Swyllys sizeof (KMF_X509_DER_CERT));
2363089Swyllys
2375051Swyllys kmf_set_attr_at_index(attrlist, numattr,
2385051Swyllys KMF_X509_DER_CERT_ATTR, certlist,
2395051Swyllys sizeof (KMF_X509_DER_CERT));
2405051Swyllys numattr++;
2415051Swyllys
2425051Swyllys rv = kmf_find_cert(kmfhandle, numattr, attrlist);
2433089Swyllys if (rv == KMF_OK) {
2443089Swyllys int i;
2453089Swyllys (void) pk_show_certs(kmfhandle, certlist,
2465051Swyllys numcerts);
2473089Swyllys for (i = 0; i < numcerts; i++)
2485051Swyllys kmf_free_kmf_cert(kmfhandle, &certlist[i]);
2493089Swyllys }
2503089Swyllys free(certlist);
25117Sdinak }
2523089Swyllys if (rv == KMF_ERR_CERT_NOT_FOUND &&
2535051Swyllys kstype != KMF_KEYSTORE_OPENSSL)
2543089Swyllys rv = KMF_OK;
25517Sdinak
25617Sdinak return (rv);
25717Sdinak }
25817Sdinak
2593089Swyllys static KMF_RETURN
pk_list_keys(void * handle,KMF_ATTRIBUTE * attrlist,int numattr,char * label)2605221Swyllys pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr, char *label)
26117Sdinak {
2623089Swyllys KMF_RETURN rv;
2633089Swyllys KMF_KEY_HANDLE *keys;
2643089Swyllys uint32_t numkeys = 0;
2655051Swyllys KMF_KEYSTORE_TYPE kstype;
2663089Swyllys
2675051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
2685051Swyllys &kstype, NULL);
2695051Swyllys if (rv != KMF_OK)
2705051Swyllys return (rv);
2715051Swyllys
2725051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
2735051Swyllys &numkeys, sizeof (uint32_t));
2745051Swyllys numattr++;
2755051Swyllys
2765051Swyllys rv = kmf_find_key(handle, numattr, attrlist);
2773089Swyllys if (rv == KMF_OK && numkeys > 0) {
2783089Swyllys int i;
2795221Swyllys (void) printf(gettext("Found %d %s keys.\n"),
2805221Swyllys numkeys, label);
2813089Swyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys *
2825051Swyllys sizeof (KMF_KEY_HANDLE));
2833089Swyllys if (keys == NULL)
2843089Swyllys return (KMF_ERR_MEMORY);
2853089Swyllys (void) memset(keys, 0, numkeys *
2865051Swyllys sizeof (KMF_KEY_HANDLE));
28717Sdinak
2885051Swyllys kmf_set_attr_at_index(attrlist, numattr,
2895051Swyllys KMF_KEY_HANDLE_ATTR,
2905051Swyllys keys, sizeof (KMF_KEY_HANDLE));
2915051Swyllys numattr++;
2925051Swyllys
2935051Swyllys rv = kmf_find_key(handle, numattr, attrlist);
2943089Swyllys if (rv == KMF_OK)
2953089Swyllys pk_show_keys(handle, keys, numkeys);
2963089Swyllys for (i = 0; i < numkeys; i++)
2975051Swyllys kmf_free_kmf_key(handle, &keys[i]);
2983089Swyllys free(keys);
2993089Swyllys }
3003089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND &&
3015051Swyllys kstype != KMF_KEYSTORE_OPENSSL)
3023089Swyllys rv = KMF_OK;
3033089Swyllys return (rv);
3043089Swyllys }
30517Sdinak
3063089Swyllys static KMF_RETURN
list_pk11_objects(KMF_HANDLE_T kmfhandle,char * token,int oclass,char * objlabel,KMF_BIGINT * serial,char * issuer,char * subject,char * dir,char * filename,KMF_CREDENTIAL * tokencred,KMF_CERT_VALIDITY find_criteria_flag)3073089Swyllys list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
3083089Swyllys char *objlabel, KMF_BIGINT *serial, char *issuer, char *subject,
3093089Swyllys char *dir, char *filename, KMF_CREDENTIAL *tokencred,
3103089Swyllys KMF_CERT_VALIDITY find_criteria_flag)
3113089Swyllys {
3123089Swyllys KMF_RETURN rv;
3135051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
3145051Swyllys int numattr = 0;
3156354Swyllys KMF_ATTRIBUTE attrlist[18];
3165051Swyllys boolean_t token_bool = B_TRUE;
3175051Swyllys boolean_t private = B_FALSE;
3185051Swyllys KMF_KEY_CLASS keyclass;
3195051Swyllys KMF_ENCODE_FORMAT format;
3206354Swyllys int auth = 0;
3216354Swyllys KMF_CREDENTIAL cred = {NULL, 0};
3223089Swyllys
3233089Swyllys /*
32411973Swyllys.ingersoll@sun.com * Symmetric keys and RSA/DSA/ECDSA private keys are always
3253089Swyllys * created with the "CKA_PRIVATE" field == TRUE, so
3263089Swyllys * make sure we search for them with it also set.
3273089Swyllys */
3283089Swyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
3293089Swyllys oclass |= PK_PRIVATE_OBJ;
3303089Swyllys
3313089Swyllys rv = select_token(kmfhandle, token,
3325051Swyllys !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
3333089Swyllys
3343089Swyllys if (rv != KMF_OK) {
33517Sdinak return (rv);
33617Sdinak }
33717Sdinak
3386354Swyllys rv = token_auth_needed(kmfhandle, token, &auth);
3396354Swyllys if (rv != KMF_OK)
3406354Swyllys return (rv);
3416354Swyllys
3426354Swyllys if (tokencred != NULL)
3436354Swyllys cred = *tokencred;
3446354Swyllys
3453089Swyllys if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
3465051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
3475051Swyllys &kstype, sizeof (kstype));
3485051Swyllys numattr++;
3495051Swyllys
3505051Swyllys if (objlabel != NULL) {
3515051Swyllys kmf_set_attr_at_index(attrlist, numattr,
3525051Swyllys KMF_KEYLABEL_ATTR, objlabel,
3535051Swyllys strlen(objlabel));
3545051Swyllys numattr++;
3555051Swyllys }
3563089Swyllys
3575051Swyllys private = ((oclass & PK_PRIVATE_OBJ) > 0);
3585051Swyllys
3595051Swyllys kmf_set_attr_at_index(attrlist, numattr,
3605051Swyllys KMF_PRIVATE_BOOL_ATTR, &private,
3615051Swyllys sizeof (private));
3625051Swyllys numattr++;
3635051Swyllys
3645051Swyllys kmf_set_attr_at_index(attrlist, numattr,
3655051Swyllys KMF_TOKEN_BOOL_ATTR, &token_bool,
3665051Swyllys sizeof (token_bool));
3675051Swyllys numattr++;
3683089Swyllys
3693089Swyllys if (oclass & PK_PRIKEY_OBJ) {
3705051Swyllys int num = numattr;
3715051Swyllys
3725051Swyllys keyclass = KMF_ASYM_PRI;
3735051Swyllys kmf_set_attr_at_index(attrlist, num,
3745051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
3755051Swyllys sizeof (keyclass));
3765051Swyllys num++;
3775051Swyllys
3785051Swyllys if (tokencred != NULL &&
3795051Swyllys tokencred->credlen > 0) {
3805051Swyllys kmf_set_attr_at_index(attrlist, num,
3815051Swyllys KMF_CREDENTIAL_ATTR, tokencred,
3825051Swyllys sizeof (KMF_CREDENTIAL));
3835051Swyllys num++;
3845051Swyllys }
3853089Swyllys
3863089Swyllys /* list asymmetric private keys */
3875221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num,
3885221Swyllys "asymmetric private");
3893089Swyllys }
3903089Swyllys
3913089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
3925051Swyllys int num = numattr;
3935051Swyllys
3945051Swyllys keyclass = KMF_SYMMETRIC;
3955051Swyllys kmf_set_attr_at_index(attrlist, num,
3965051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
3975051Swyllys sizeof (keyclass));
3985051Swyllys num++;
3995051Swyllys
4005051Swyllys if (tokencred != NULL &&
4015051Swyllys tokencred->credlen > 0) {
4025051Swyllys kmf_set_attr_at_index(attrlist, num,
4035051Swyllys KMF_CREDENTIAL_ATTR, tokencred,
4045051Swyllys sizeof (KMF_CREDENTIAL));
4055051Swyllys num++;
4065051Swyllys }
4075051Swyllys
4085051Swyllys format = KMF_FORMAT_RAWKEY;
4095051Swyllys kmf_set_attr_at_index(attrlist, num,
4105051Swyllys KMF_ENCODE_FORMAT_ATTR, &format,
4115051Swyllys sizeof (format));
4125051Swyllys num++;
4133089Swyllys
4143089Swyllys /* list symmetric keys */
4155221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num,
4165221Swyllys "symmetric");
41717Sdinak }
4183089Swyllys
4193089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
4205051Swyllys int num = numattr;
4215051Swyllys
4226354Swyllys if (auth > 0 && (tokencred == NULL ||
4236354Swyllys tokencred->cred == NULL) &&
4246354Swyllys (cred.cred == NULL)) {
4256354Swyllys (void) get_token_password(kstype, token, &cred);
426*12585Swyllys.ingersoll@sun.com kmf_set_attr_at_index(attrlist, num,
4276354Swyllys KMF_CREDENTIAL_ATTR,
4286354Swyllys &cred, sizeof (KMF_CREDENTIAL));
429*12585Swyllys.ingersoll@sun.com num++;
4306354Swyllys }
4316354Swyllys
4325128Swyllys private = B_FALSE;
4335051Swyllys keyclass = KMF_ASYM_PUB;
4345051Swyllys kmf_set_attr_at_index(attrlist, num,
4355051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
4365051Swyllys sizeof (keyclass));
4375051Swyllys num++;
4383089Swyllys
4393089Swyllys /* list asymmetric public keys (if any) */
4405221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num,
4415221Swyllys "asymmetric public");
4423089Swyllys }
4433089Swyllys
4443089Swyllys if (rv != KMF_OK)
4453089Swyllys return (rv);
4463089Swyllys }
4473089Swyllys
4485051Swyllys numattr = 0;
4493089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
4505051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
4515051Swyllys &kstype, sizeof (kstype));
4526354Swyllys
4535051Swyllys numattr++;
4546354Swyllys if (auth > 0 && (cred.cred == NULL)) {
4556354Swyllys (void) get_token_password(kstype, token, &cred);
4566354Swyllys }
4576354Swyllys
4586354Swyllys if (cred.cred != NULL) {
4596354Swyllys kmf_set_attr_at_index(attrlist, numattr,
4606354Swyllys KMF_CREDENTIAL_ATTR,
4616354Swyllys &cred, sizeof (KMF_CREDENTIAL));
4626354Swyllys numattr++;
4636354Swyllys }
4645051Swyllys
4655051Swyllys if (objlabel != NULL) {
4665051Swyllys kmf_set_attr_at_index(attrlist, numattr,
4675051Swyllys KMF_CERT_LABEL_ATTR, objlabel,
4685051Swyllys strlen(objlabel));
4695051Swyllys numattr++;
4705051Swyllys }
4715051Swyllys
4725051Swyllys if (issuer != NULL) {
4735051Swyllys kmf_set_attr_at_index(attrlist, numattr,
4745051Swyllys KMF_ISSUER_NAME_ATTR, issuer,
4755051Swyllys strlen(issuer));
4765051Swyllys numattr++;
4775051Swyllys }
4783089Swyllys
4795051Swyllys if (subject != NULL) {
4805051Swyllys kmf_set_attr_at_index(attrlist, numattr,
4815051Swyllys KMF_SUBJECT_NAME_ATTR, subject,
4825051Swyllys strlen(subject));
4835051Swyllys numattr++;
4845051Swyllys }
4853089Swyllys
4866354Swyllys if (serial != NULL && serial->val != NULL) {
4875051Swyllys kmf_set_attr_at_index(attrlist, numattr,
4885051Swyllys KMF_BIGINT_ATTR, serial,
4895051Swyllys sizeof (KMF_BIGINT));
4905051Swyllys numattr++;
4915051Swyllys }
4925051Swyllys
4935051Swyllys kmf_set_attr_at_index(attrlist, numattr,
4945051Swyllys KMF_PRIVATE_BOOL_ATTR, &private,
4955051Swyllys sizeof (private));
4965051Swyllys numattr++;
4975051Swyllys
4985051Swyllys kmf_set_attr_at_index(attrlist, numattr,
4995051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
5005051Swyllys sizeof (KMF_CERT_VALIDITY));
5015051Swyllys numattr++;
5025051Swyllys
5035051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr);
5043089Swyllys if (rv != KMF_OK)
5053089Swyllys return (rv);
5063089Swyllys }
5073089Swyllys
5085051Swyllys numattr = 0;
5095051Swyllys kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */
5103089Swyllys if (oclass & PK_CRL_OBJ) {
5115051Swyllys char *crldata = NULL;
5125051Swyllys
5135051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5145051Swyllys &kstype, sizeof (kstype));
5155051Swyllys numattr++;
5163089Swyllys
5175051Swyllys if (dir != NULL) {
5185051Swyllys kmf_set_attr_at_index(attrlist, numattr,
5195051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir));
5205051Swyllys numattr++;
5215051Swyllys }
5225051Swyllys if (filename != NULL) {
5235051Swyllys kmf_set_attr_at_index(attrlist, numattr,
5245051Swyllys KMF_CRL_FILENAME_ATTR,
5255051Swyllys filename, strlen(filename));
5265051Swyllys numattr++;
5275051Swyllys }
5285051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
5295051Swyllys &crldata, sizeof (char *));
5305051Swyllys numattr++;
5313089Swyllys
5325051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist);
5335051Swyllys if (rv == KMF_OK && crldata != NULL) {
5343089Swyllys (void) printf("%s\n", crldata);
5353089Swyllys free(crldata);
53617Sdinak }
53717Sdinak }
53817Sdinak
5393089Swyllys return (rv);
5403089Swyllys }
5413089Swyllys
5423089Swyllys static int
list_file_objects(KMF_HANDLE_T kmfhandle,int oclass,char * dir,char * filename,KMF_BIGINT * serial,char * issuer,char * subject,KMF_CERT_VALIDITY find_criteria_flag)5433089Swyllys list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
5443089Swyllys char *dir, char *filename, KMF_BIGINT *serial,
5453089Swyllys char *issuer, char *subject,
5463089Swyllys KMF_CERT_VALIDITY find_criteria_flag)
5473089Swyllys {
5485626Shylee KMF_RETURN rv = KMF_OK;
5495051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
5505051Swyllys int numattr = 0;
5515051Swyllys KMF_ATTRIBUTE attrlist[16];
5525051Swyllys KMF_KEY_CLASS keyclass;
5535051Swyllys KMF_ENCODE_FORMAT format;
5545051Swyllys char *defaultdir = ".";
5553089Swyllys
5563089Swyllys if (oclass & PK_KEY_OBJ) {
5575051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5585051Swyllys &kstype, sizeof (kstype));
5595051Swyllys numattr++;
5605051Swyllys
5615051Swyllys if (dir == NULL && filename == NULL)
5625051Swyllys dir = defaultdir;
5635051Swyllys
5645051Swyllys if (dir != NULL) {
5655051Swyllys kmf_set_attr_at_index(attrlist, numattr,
5665051Swyllys KMF_DIRPATH_ATTR, dir,
5675051Swyllys strlen(dir));
5685051Swyllys numattr++;
5695051Swyllys }
5705051Swyllys
5715051Swyllys if (filename != NULL) {
5725051Swyllys kmf_set_attr_at_index(attrlist, numattr,
5735051Swyllys KMF_KEY_FILENAME_ATTR, filename,
5745051Swyllys strlen(filename));
5755051Swyllys numattr++;
5765051Swyllys }
5775051Swyllys
5783089Swyllys if (oclass & PK_PRIKEY_OBJ) {
5795051Swyllys int num = numattr;
5803089Swyllys
5815051Swyllys keyclass = KMF_ASYM_PRI;
5825051Swyllys kmf_set_attr_at_index(attrlist, num,
5835051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
5845051Swyllys sizeof (keyclass));
5855051Swyllys num++;
5865051Swyllys
5875051Swyllys /* list asymmetric private keys */
5885221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num,
5895221Swyllys "asymmetric private");
5903089Swyllys }
5913089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND)
5923089Swyllys rv = KMF_OK;
5933089Swyllys
5943089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
5955051Swyllys int num = numattr;
5965051Swyllys
5975051Swyllys keyclass = KMF_SYMMETRIC;
5985051Swyllys kmf_set_attr_at_index(attrlist, num,
5995051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
6005051Swyllys sizeof (keyclass));
6015051Swyllys num++;
6023089Swyllys
6035051Swyllys format = KMF_FORMAT_RAWKEY;
6045051Swyllys kmf_set_attr_at_index(attrlist, num,
6055051Swyllys KMF_ENCODE_FORMAT_ATTR, &format,
6065051Swyllys sizeof (format));
6075051Swyllys num++;
6085051Swyllys
6095051Swyllys /* list symmetric keys */
6105221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num,
6115221Swyllys "symmetric");
6123089Swyllys }
6133089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND)
6143089Swyllys rv = KMF_OK;
6153089Swyllys if (rv != KMF_OK)
6163089Swyllys return (rv);
61717Sdinak }
61817Sdinak
6195051Swyllys numattr = 0;
6203089Swyllys if (oclass & PK_CERT_OBJ) {
6215051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6225051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype,
6235051Swyllys sizeof (kstype));
6245051Swyllys numattr++;
6255051Swyllys
6265051Swyllys if (issuer != NULL) {
6275051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6285051Swyllys KMF_ISSUER_NAME_ATTR, issuer,
6295051Swyllys strlen(issuer));
6305051Swyllys numattr++;
6315051Swyllys }
6325051Swyllys
6335051Swyllys if (subject != NULL) {
6345051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6355051Swyllys KMF_SUBJECT_NAME_ATTR, subject,
6365051Swyllys strlen(subject));
6375051Swyllys numattr++;
6385051Swyllys }
63917Sdinak
6406051Swyllys if (serial != NULL && serial->val != NULL) {
6415051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6425051Swyllys KMF_BIGINT_ATTR, serial,
6435051Swyllys sizeof (KMF_BIGINT));
6445051Swyllys numattr++;
6455051Swyllys }
6465051Swyllys
6475051Swyllys if (filename != NULL) {
6485051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6495051Swyllys KMF_CERT_FILENAME_ATTR, filename,
6505051Swyllys strlen(filename));
6515051Swyllys numattr++;
6525051Swyllys }
6535051Swyllys
6545051Swyllys if (dir != NULL) {
6555051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6565051Swyllys KMF_DIRPATH_ATTR, dir,
6575051Swyllys strlen(dir));
6585051Swyllys numattr++;
6595051Swyllys }
6605051Swyllys
6615051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6625051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
6635051Swyllys sizeof (KMF_CERT_VALIDITY));
6645051Swyllys numattr++;
6655051Swyllys
6665051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr);
6673089Swyllys if (rv != KMF_OK)
6683089Swyllys return (rv);
66917Sdinak }
67017Sdinak
6715051Swyllys numattr = 0;
6723089Swyllys if (oclass & PK_CRL_OBJ) {
6735051Swyllys char *crldata = NULL;
6745051Swyllys
6755051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
6765051Swyllys &kstype, sizeof (kstype));
6775051Swyllys numattr++;
67817Sdinak
6795051Swyllys if (dir != NULL) {
6805051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6815051Swyllys KMF_DIRPATH_ATTR, dir, strlen(dir));
6825051Swyllys numattr++;
6835051Swyllys }
6845051Swyllys if (filename != NULL) {
6855051Swyllys kmf_set_attr_at_index(attrlist, numattr,
6865051Swyllys KMF_CRL_FILENAME_ATTR,
6875051Swyllys filename, strlen(filename));
6885051Swyllys numattr++;
6895051Swyllys }
6905051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
6915051Swyllys &crldata, sizeof (char *));
6925051Swyllys numattr++;
69317Sdinak
6945051Swyllys rv = kmf_list_crl(kmfhandle, numattr, attrlist);
6955051Swyllys if (rv == KMF_OK && crldata != NULL) {
6963089Swyllys (void) printf("%s\n", crldata);
6973089Swyllys free(crldata);
6983089Swyllys }
69917Sdinak }
70017Sdinak
70117Sdinak return (rv);
70217Sdinak }
70317Sdinak
7043089Swyllys static int
list_nss_objects(KMF_HANDLE_T kmfhandle,int oclass,char * token_spec,char * dir,char * prefix,char * nickname,KMF_BIGINT * serial,char * issuer,char * subject,KMF_CREDENTIAL * tokencred,KMF_CERT_VALIDITY find_criteria_flag)7053089Swyllys list_nss_objects(KMF_HANDLE_T kmfhandle,
7063089Swyllys int oclass, char *token_spec, char *dir, char *prefix,
7073089Swyllys char *nickname, KMF_BIGINT *serial, char *issuer, char *subject,
7083089Swyllys KMF_CREDENTIAL *tokencred,
7093089Swyllys KMF_CERT_VALIDITY find_criteria_flag)
71017Sdinak {
7113089Swyllys KMF_RETURN rv = KMF_OK;
7125051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
7135051Swyllys int numattr = 0;
7145051Swyllys KMF_ATTRIBUTE attrlist[16];
7155051Swyllys KMF_KEY_CLASS keyclass;
7165051Swyllys KMF_ENCODE_FORMAT format;
7173089Swyllys
7183089Swyllys rv = configure_nss(kmfhandle, dir, prefix);
7193089Swyllys if (rv != KMF_OK)
7203089Swyllys return (rv);
72117Sdinak
7225051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
7235051Swyllys &kstype, sizeof (kstype));
7245051Swyllys numattr++;
7255051Swyllys
7263089Swyllys if (oclass & PK_KEY_OBJ) {
7275051Swyllys if (tokencred != NULL && tokencred->credlen > 0) {
7285051Swyllys kmf_set_attr_at_index(attrlist, numattr,
7295051Swyllys KMF_CREDENTIAL_ATTR, tokencred,
7305051Swyllys sizeof (KMF_CREDENTIAL));
7315051Swyllys numattr++;
7325051Swyllys }
7335051Swyllys
7345051Swyllys if (token_spec && strlen(token_spec)) {
7355051Swyllys kmf_set_attr_at_index(attrlist, numattr,
7365051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec,
7375051Swyllys strlen(token_spec));
7385051Swyllys numattr++;
7395051Swyllys }
7405051Swyllys
7415051Swyllys if (nickname != NULL) {
7425051Swyllys kmf_set_attr_at_index(attrlist, numattr,
7435051Swyllys KMF_KEYLABEL_ATTR, nickname,
7445051Swyllys strlen(nickname));
7455051Swyllys numattr++;
7465051Swyllys }
74717Sdinak }
74817Sdinak
7493089Swyllys if (oclass & PK_PRIKEY_OBJ) {
7505051Swyllys int num = numattr;
7515051Swyllys
7525051Swyllys keyclass = KMF_ASYM_PRI;
7535051Swyllys kmf_set_attr_at_index(attrlist, num,
7545051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
7555051Swyllys sizeof (keyclass));
7565051Swyllys num++;
7575051Swyllys
7585051Swyllys /* list asymmetric private keys */
7595221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num,
7605221Swyllys "asymmetric private");
76117Sdinak }
7625051Swyllys
7633089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
7645051Swyllys int num = numattr;
7655051Swyllys
7665051Swyllys keyclass = KMF_SYMMETRIC;
7675051Swyllys kmf_set_attr_at_index(attrlist, num,
7685051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
7695051Swyllys sizeof (keyclass));
7705051Swyllys num++;
7715051Swyllys
7725051Swyllys format = KMF_FORMAT_RAWKEY;
7735051Swyllys kmf_set_attr_at_index(attrlist, num,
7745051Swyllys KMF_ENCODE_FORMAT_ATTR, &format,
7755051Swyllys sizeof (format));
7765051Swyllys num++;
7775051Swyllys
7785051Swyllys /* list symmetric keys */
7795221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num, "symmetric");
7803089Swyllys }
7815051Swyllys
7823089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
7835051Swyllys int num = numattr;
7845051Swyllys
7855051Swyllys keyclass = KMF_ASYM_PUB;
7865051Swyllys kmf_set_attr_at_index(attrlist, num,
7875051Swyllys KMF_KEYCLASS_ATTR, &keyclass,
7885051Swyllys sizeof (keyclass));
7895051Swyllys num++;
7905051Swyllys
7915051Swyllys /* list asymmetric public keys */
7925221Swyllys rv = pk_list_keys(kmfhandle, attrlist, num,
7935221Swyllys "asymmetric public");
79417Sdinak }
79517Sdinak
7963089Swyllys /* If searching for public objects or certificates, find certs now */
7975051Swyllys numattr = 0;
7983089Swyllys if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
7995051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8005051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype,
8015051Swyllys sizeof (kstype));
8025051Swyllys numattr++;
8035051Swyllys
8045051Swyllys if (nickname != NULL) {
8055051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8065051Swyllys KMF_CERT_LABEL_ATTR, nickname,
8075051Swyllys strlen(nickname));
8085051Swyllys numattr++;
8095051Swyllys }
8105051Swyllys
8115051Swyllys if (issuer != NULL) {
8125051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8135051Swyllys KMF_ISSUER_NAME_ATTR, issuer,
8145051Swyllys strlen(issuer));
8155051Swyllys numattr++;
8165051Swyllys }
81717Sdinak
8185051Swyllys if (subject != NULL) {
8195051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8205051Swyllys KMF_SUBJECT_NAME_ATTR, subject,
8215051Swyllys strlen(subject));
8225051Swyllys numattr++;
8235051Swyllys }
8245051Swyllys
8255051Swyllys if (serial != NULL) {
8265051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8275051Swyllys KMF_BIGINT_ATTR, serial,
8285051Swyllys sizeof (KMF_BIGINT));
8295051Swyllys numattr++;
8305051Swyllys }
83117Sdinak
8325051Swyllys if (token_spec != NULL) {
8335051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8345051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec,
8355051Swyllys strlen(token_spec));
8365051Swyllys numattr++;
8375051Swyllys }
8385051Swyllys
8395051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8405051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
8415051Swyllys sizeof (KMF_CERT_VALIDITY));
8425051Swyllys numattr++;
8435051Swyllys
8445051Swyllys rv = pk_find_certs(kmfhandle, attrlist, numattr);
84517Sdinak }
84617Sdinak
8475051Swyllys numattr = 0;
8483089Swyllys if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
8493089Swyllys int numcrls;
8505051Swyllys
8515051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
8525051Swyllys &kstype, sizeof (kstype));
8535051Swyllys numattr++;
8543089Swyllys
8555051Swyllys if (token_spec != NULL) {
8565051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8575051Swyllys KMF_TOKEN_LABEL_ATTR,
8585051Swyllys token_spec, strlen(token_spec));
8595051Swyllys numattr++;
8605051Swyllys }
8615051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR,
8625051Swyllys &numcrls, sizeof (int));
8635051Swyllys numattr++;
8643089Swyllys
8655051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8663089Swyllys if (rv == KMF_OK) {
8673089Swyllys char **p;
8683089Swyllys if (numcrls == 0) {
8693089Swyllys (void) printf(gettext("No CRLs found in "
8705051Swyllys "NSS keystore.\n"));
87117Sdinak
8723089Swyllys return (KMF_OK);
8733089Swyllys }
8743089Swyllys p = malloc(numcrls * sizeof (char *));
8753089Swyllys if (p == NULL) {
8763089Swyllys return (KMF_ERR_MEMORY);
8773089Swyllys }
8783089Swyllys (void) memset(p, 0, numcrls * sizeof (char *));
8795051Swyllys
8805051Swyllys kmf_set_attr_at_index(attrlist, numattr,
8815051Swyllys KMF_CRL_NAMELIST_ATTR, p, sizeof (char *));
8825051Swyllys numattr++;
8835051Swyllys rv = kmf_find_crl(kmfhandle, numattr, attrlist);
8843089Swyllys if (rv == KMF_OK) {
8853089Swyllys int i;
8863089Swyllys for (i = 0; i < numcrls; i++) {
8873089Swyllys (void) printf("%d. Name = %s\n",
8885051Swyllys i + 1, p[i]);
8893089Swyllys free(p[i]);
8903089Swyllys }
8913089Swyllys }
8923089Swyllys free(p);
89317Sdinak }
89417Sdinak }
89517Sdinak return (rv);
89617Sdinak }
89717Sdinak
89817Sdinak /*
89917Sdinak * List token object.
90017Sdinak */
90117Sdinak int
pk_list(int argc,char * argv[])90217Sdinak pk_list(int argc, char *argv[])
90317Sdinak {
90417Sdinak int opt;
905864Sdinak extern int optind_av;
906864Sdinak extern char *optarg_av;
907864Sdinak char *token_spec = NULL;
9083089Swyllys char *subject = NULL;
9093089Swyllys char *issuer = NULL;
9103089Swyllys char *dir = NULL;
9113089Swyllys char *prefix = NULL;
9123089Swyllys char *filename = NULL;
9133089Swyllys char *serstr = NULL;
9143089Swyllys KMF_BIGINT serial = { NULL, 0 };
91517Sdinak
9163089Swyllys char *list_label = NULL;
9173089Swyllys int oclass = 0;
9183089Swyllys KMF_KEYSTORE_TYPE kstype = 0;
9193089Swyllys KMF_RETURN rv = KMF_OK;
9203089Swyllys KMF_HANDLE_T kmfhandle = NULL;
9213089Swyllys char *find_criteria = NULL;
9223089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS;
9233089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0};
92417Sdinak
92517Sdinak /* Parse command line options. Do NOT i18n/l10n. */
926864Sdinak while ((opt = getopt_av(argc, argv,
9275051Swyllys "k:(keystore)t:(objtype)T:(token)d:(dir)"
9285051Swyllys "p:(prefix)n:(nickname)S:(serial)s:(subject)"
9295051Swyllys "c:(criteria)"
9305051Swyllys "i:(issuer)l:(label)f:(infile)")) != EOF) {
9313089Swyllys if (EMPTYSTRING(optarg_av))
9323089Swyllys return (PK_ERR_USAGE);
93317Sdinak switch (opt) {
9343089Swyllys case 'k':
9353089Swyllys if (kstype != 0)
9363089Swyllys return (PK_ERR_USAGE);
9373089Swyllys kstype = KS2Int(optarg_av);
9383089Swyllys if (kstype == 0)
9393089Swyllys return (PK_ERR_USAGE);
9403089Swyllys break;
9413089Swyllys case 't':
9423089Swyllys if (oclass != 0)
9433089Swyllys return (PK_ERR_USAGE);
9443089Swyllys oclass = OT2Int(optarg_av);
9453089Swyllys if (oclass == -1)
9463089Swyllys return (PK_ERR_USAGE);
9473089Swyllys break;
9483089Swyllys case 's':
9493089Swyllys if (subject)
9503089Swyllys return (PK_ERR_USAGE);
9513089Swyllys subject = optarg_av;
9523089Swyllys break;
9533089Swyllys case 'i':
9543089Swyllys if (issuer)
9553089Swyllys return (PK_ERR_USAGE);
9563089Swyllys issuer = optarg_av;
9573089Swyllys break;
9583089Swyllys case 'd':
9593089Swyllys if (dir)
9603089Swyllys return (PK_ERR_USAGE);
9613089Swyllys dir = optarg_av;
9623089Swyllys break;
9633089Swyllys case 'p':
9643089Swyllys if (prefix)
9653089Swyllys return (PK_ERR_USAGE);
9663089Swyllys prefix = optarg_av;
9673089Swyllys break;
9683089Swyllys case 'S':
9693089Swyllys serstr = optarg_av;
9703089Swyllys break;
9713089Swyllys case 'f':
9723089Swyllys if (filename)
9733089Swyllys return (PK_ERR_USAGE);
9743089Swyllys filename = optarg_av;
9753089Swyllys break;
9763089Swyllys case 'T': /* token specifier */
9773089Swyllys if (token_spec)
9783089Swyllys return (PK_ERR_USAGE);
9793089Swyllys token_spec = optarg_av;
9803089Swyllys break;
9813089Swyllys case 'n':
9823089Swyllys case 'l': /* object with specific label */
9833089Swyllys if (list_label)
9843089Swyllys return (PK_ERR_USAGE);
9853089Swyllys list_label = optarg_av;
9863089Swyllys break;
9873089Swyllys case 'c':
9883089Swyllys find_criteria = optarg_av;
9893089Swyllys if (!strcasecmp(find_criteria, "valid"))
9903089Swyllys find_criteria_flag =
9913089Swyllys KMF_NONEXPIRED_CERTS;
9923089Swyllys else if (!strcasecmp(find_criteria, "expired"))
9933089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS;
9943089Swyllys else if (!strcasecmp(find_criteria, "both"))
9953089Swyllys find_criteria_flag = KMF_ALL_CERTS;
9963089Swyllys else
9973089Swyllys return (PK_ERR_USAGE);
9983089Swyllys break;
9993089Swyllys default:
1000864Sdinak return (PK_ERR_USAGE);
100117Sdinak }
100217Sdinak }
100317Sdinak /* No additional args allowed. */
1004864Sdinak argc -= optind_av;
1005864Sdinak argv += optind_av;
100617Sdinak if (argc)
100717Sdinak return (PK_ERR_USAGE);
100817Sdinak
10095051Swyllys if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
10103089Swyllys /* Error message ? */
10113089Swyllys return (rv);
101217Sdinak }
101317Sdinak
10143089Swyllys /* Assume keystore = PKCS#11 if not specified. */
10153089Swyllys if (kstype == 0)
10163089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN;
101717Sdinak
10183089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
10193089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
10205051Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) {
10213089Swyllys
10223089Swyllys (void) fprintf(stderr, gettext("The objtype parameter "
10235051Swyllys "is only relevant if keystore=pkcs11\n"));
10243089Swyllys return (PK_ERR_USAGE);
102517Sdinak }
102617Sdinak
10273089Swyllys
10283089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
10293089Swyllys token_spec = PK_DEFAULT_PK11TOKEN;
10303089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
10313089Swyllys token_spec = DEFAULT_NSS_TOKEN;
103217Sdinak }
103317Sdinak
10343089Swyllys if (serstr != NULL) {
10353089Swyllys uchar_t *bytes = NULL;
10363089Swyllys size_t bytelen;
10373089Swyllys
10385051Swyllys rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
10393089Swyllys if (rv != KMF_OK || bytes == NULL) {
10403089Swyllys (void) fprintf(stderr, gettext("serial number "
10415051Swyllys "must be specified as a hex number "
10425051Swyllys "(ex: 0x0102030405ffeeddee)\n"));
10433089Swyllys return (PK_ERR_USAGE);
10443089Swyllys }
10453089Swyllys serial.val = bytes;
10463089Swyllys serial.len = bytelen;
10475221Swyllys /* if objtype was not given, it must be for certs */
10485221Swyllys if (oclass == 0)
10495221Swyllys oclass = PK_CERT_OBJ;
105017Sdinak }
10515221Swyllys if (oclass == 0 && (issuer != NULL || subject != NULL))
10525221Swyllys oclass = PK_CERT_OBJ;
10535221Swyllys
10545221Swyllys /* If no object class specified, list public objects. */
10555221Swyllys if (oclass == 0)
10565221Swyllys oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ;
105717Sdinak
10583089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
10595051Swyllys kstype == KMF_KEYSTORE_NSS) &&
10605051Swyllys (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
10613089Swyllys
10623089Swyllys (void) get_token_password(kstype, token_spec,
10635051Swyllys &tokencred);
10643089Swyllys }
10653089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) {
10663089Swyllys rv = list_pk11_objects(kmfhandle, token_spec,
10675051Swyllys oclass, list_label, &serial,
10685051Swyllys issuer, subject, dir, filename,
10695051Swyllys &tokencred, find_criteria_flag);
107017Sdinak
10713089Swyllys } else if (kstype == KMF_KEYSTORE_NSS) {
10723089Swyllys if (dir == NULL)
10733089Swyllys dir = PK_DEFAULT_DIRECTORY;
10743089Swyllys rv = list_nss_objects(kmfhandle,
10755051Swyllys oclass, token_spec, dir, prefix,
10765051Swyllys list_label, &serial, issuer, subject,
10775051Swyllys &tokencred, find_criteria_flag);
10783089Swyllys
10793089Swyllys } else if (kstype == KMF_KEYSTORE_OPENSSL) {
10803089Swyllys
10813089Swyllys rv = list_file_objects(kmfhandle,
10825051Swyllys oclass, dir, filename,
10835051Swyllys &serial, issuer, subject, find_criteria_flag);
108417Sdinak }
108517Sdinak
10863089Swyllys if (rv != KMF_OK) {
10873089Swyllys display_error(kmfhandle, rv,
10885051Swyllys gettext("Error listing objects"));
10893089Swyllys }
10903089Swyllys
10913089Swyllys if (serial.val != NULL)
10923089Swyllys free(serial.val);
10933089Swyllys
10943089Swyllys if (tokencred.cred != NULL)
10953089Swyllys free(tokencred.cred);
10963089Swyllys
10975051Swyllys (void) kmf_finalize(kmfhandle);
10983089Swyllys return (rv);
109917Sdinak }
1100