summaryrefslogtreecommitdiff
path: root/usr/src/cmd/cmd-crypto/pktool/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/cmd-crypto/pktool/list.c')
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/list.c1479
1 files changed, 574 insertions, 905 deletions
diff --git a/usr/src/cmd/cmd-crypto/pktool/list.c b/usr/src/cmd/cmd-crypto/pktool/list.c
index 496642c8da..2a427dfc36 100644
--- a/usr/src/cmd/cmd-crypto/pktool/list.c
+++ b/usr/src/cmd/cmd-crypto/pktool/list.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -39,794 +38,482 @@
#include <cryptoutil.h>
#include <security/cryptoki.h>
#include "common.h"
-#include "derparse.h"
-/*
- * Get key size based on the key type.
- */
-static CK_ULONG
-get_key_size(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, CK_KEY_TYPE key_type)
+#include <kmfapi.h>
+
+static void
+pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
{
- CK_RV rv = CKR_OK;
- CK_ULONG key_size;
- CK_ATTRIBUTE modulus_sz =
- { CKA_MODULUS, NULL, 0 }; /* RSA */
- CK_ATTRIBUTE prime_sz =
- { CKA_PRIME, NULL, 0 }; /* DSA, DH X9.42 */
- CK_ATTRIBUTE value_sz =
- { CKA_VALUE, NULL_PTR, 0 }; /* DH, DES/DES3, AES, GENERIC */
-
- cryptodebug("inside get_key_size");
-
- switch (key_type) {
- case CKK_RSA:
- if ((rv = C_GetAttributeValue(sess, obj, &modulus_sz, 1)) !=
- CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get modulus attribute size (%s)."),
- pkcs11_strerror(rv));
- } else
- /* Convert key size to bits. */
- key_size = modulus_sz.ulValueLen * 8;
- break;
- case CKK_DH:
- if ((rv = C_GetAttributeValue(sess, obj, &value_sz, 1)) !=
- CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get value attribute size (%s)."),
- pkcs11_strerror(rv));
- } else
- /* Convert key size to bits. */
- key_size = value_sz.ulValueLen * 8;
- break;
- case CKK_X9_42_DH:
- case CKK_DSA:
- if ((rv = C_GetAttributeValue(sess, obj, &prime_sz, 1)) !=
- CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get prime attribute size (%s)."),
- pkcs11_strerror(rv));
- } else
- /* Convert key size to bits. */
- key_size = prime_sz.ulValueLen * 8;
- break;
- case CKK_DES:
- case CKK_DES3:
- if ((rv = C_GetAttributeValue(sess, obj, &value_sz, 1)) !=
- CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get value attribute size (%s)."),
- pkcs11_strerror(rv));
- } else
- /* Convert key size to bits -- omitting parity bit. */
- key_size = value_sz.ulValueLen * 7;
- break;
- case CKK_AES:
- case CKK_GENERIC_SECRET:
- if ((rv = C_GetAttributeValue(sess, obj, &value_sz, 1)) !=
- CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get value attribute size (%s)."),
- pkcs11_strerror(rv));
- } else
- /* Convert key size to bits. */
- key_size = value_sz.ulValueLen * 8;
- break;
- default:
- cryptoerror(LOG_STDERR, gettext(
- "Unknown object key type (0x%02x)."), key_type);
- break;
- }
+ int i;
+ char *subject, *issuer, *serial, *id, *altname;
+
+ for (i = 0; i < num_certs; i++) {
+ subject = NULL;
+ issuer = NULL;
+ serial = NULL;
+ id = NULL;
+ altname = NULL;
+
+ (void) fprintf(stdout,
+ gettext("%d. (X.509 certificate)\n"), i + 1);
+ if (certs[i].kmf_private.label != NULL)
+ (void) fprintf(stdout, gettext("\t%s: %s\n"),
+ (certs[i].kmf_private.keystore_type ==
+ KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"),
+ certs[i].kmf_private.label);
+ if (KMF_GetCertIDString(&certs[i].certificate,
+ &id) == KMF_OK)
+ (void) fprintf(stdout, gettext("\tID: %s\n"), id);
+ if (KMF_GetCertSubjectNameString(kmfhandle,
+ &certs[i].certificate, &subject) == KMF_OK)
+ (void) fprintf(stdout, gettext("\tSubject: %s\n"),
+ subject);
+ if (KMF_GetCertIssuerNameString(kmfhandle,
+ &certs[i].certificate, &issuer) == KMF_OK)
+ (void) fprintf(stdout, gettext("\tIssuer: %s\n"),
+ issuer);
+ if (KMF_GetCertSerialNumberString(kmfhandle,
+ &certs[i].certificate, &serial) == KMF_OK)
+ (void) fprintf(stdout, gettext("\tSerial: %s\n"),
+ serial);
+
+ if (KMF_GetCertExtensionString(kmfhandle,
+ &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
+ &altname) == KMF_OK) {
+ (void) fprintf(stdout, gettext("\t%s\n"),
+ altname);
+ }
- return (key_size);
+ KMF_FreeString(subject);
+ KMF_FreeString(issuer);
+ KMF_FreeString(serial);
+ KMF_FreeString(id);
+ KMF_FreeString(altname);
+ (void) fprintf(stdout, "\n");
+ }
}
-/*
- * Display private key.
- */
-static CK_RV
-display_prikey(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
+static char *
+describeKey(KMF_KEY_HANDLE *key)
{
- CK_RV rv = CKR_OK;
- static CK_BBOOL private;
- static CK_BBOOL modifiable;
- static CK_KEY_TYPE key_type;
- CK_ULONG key_size;
- CK_BYTE *label = NULL;
- CK_ULONG label_len = 0;
- CK_BYTE *id = NULL;
- CK_ULONG id_len = 0;
- CK_BYTE *subject = NULL;
- CK_ULONG subject_len = 0;
- CK_DATE *start_date = NULL;
- CK_ULONG start_date_len = 0;
- CK_DATE *end_date = NULL;
- CK_ULONG end_date_len = 0;
- CK_ATTRIBUTE attrs[18] = {
- /* 0 to 2 */
- { CKA_PRIVATE, &private, sizeof (private) },
- { CKA_MODIFIABLE, &modifiable, sizeof (modifiable) },
- { CKA_KEY_TYPE, &key_type, sizeof (key_type) },
- /* 3 to 12 */
- { CKA_DERIVE, NULL, 0 },
- { CKA_LOCAL, NULL, 0 },
- { CKA_DECRYPT, NULL, 0 },
- { CKA_SIGN, NULL, 0 },
- { CKA_SIGN_RECOVER, NULL, 0 },
- { CKA_UNWRAP, NULL, 0 },
- { CKA_SENSITIVE, NULL, 0 },
- { CKA_ALWAYS_SENSITIVE, NULL, 0 },
- { CKA_EXTRACTABLE, NULL, 0 },
- { CKA_NEVER_EXTRACTABLE, NULL, 0 },
- /* 13 to 17 */
- { CKA_LABEL, NULL, 0 }, /* optional */
- { CKA_ID, NULL, 0 }, /* optional */
- { CKA_SUBJECT, NULL, 0 }, /* optional */
- { CKA_START_DATE, NULL, 0 }, /* optional */
- { CKA_END_DATE, NULL, 0 } /* optional */
- /* not displaying CKA_KEY_GEN_MECHANISM */
- };
- CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
- int i;
- char *hex_id = NULL;
- int hex_id_len = 0;
- char *hex_subject = NULL;
- int hex_subject_len = 0;
-
- cryptodebug("inside display_prikey");
-
- /* Get the sizes of the attributes we need. */
- cryptodebug("calling C_GetAttributeValue for size info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get private key attribute sizes (%s)."),
- pkcs11_strerror(rv));
- return (rv);
- }
-
- /* Allocate memory for each variable-length attribute. */
- for (i = 3; i < n_attrs; i++) {
- if (attrs[i].ulValueLen == (CK_ULONG)-1 ||
- attrs[i].ulValueLen == 0) {
- cryptodebug("display_prikey: *** should not happen");
- attrs[i].ulValueLen = 0;
- continue;
- }
- if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_prikey;
+ if (key->keyclass == KMF_ASYM_PUB) {
+ if (key->keyalg == KMF_RSA)
+ return (gettext("RSA public key"));
+ if (key->keyalg == KMF_DSA)
+ return (gettext("DSA public key"));
+ }
+ if (key->keyclass == KMF_ASYM_PRI) {
+ if (key->keyalg == KMF_RSA)
+ return ("RSA private key");
+ if (key->keyalg == KMF_DSA)
+ return ("DSA private key");
+ }
+ if (key->keyclass == KMF_SYMMETRIC) {
+ switch (key->keyalg) {
+ case KMF_AES:
+ return (gettext("AES"));
+ break;
+ case KMF_RC4:
+ return (gettext("ARCFOUR"));
+ break;
+ case KMF_DES:
+ return (gettext("DES"));
+ break;
+ case KMF_DES3:
+ return (gettext("Triple-DES"));
+ break;
+ default:
+ return (gettext("symmetric"));
+ break;
}
}
- /* Now really get the attributes. */
- cryptodebug("calling C_GetAttributeValue for attribute info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get private key attributes (%s)."),
- pkcs11_strerror(rv));
- goto free_display_prikey;
+ return (gettext("unrecognized key object"));
+
+}
+
+static char *
+keybitstr(KMF_KEY_HANDLE *key)
+{
+ KMF_RAW_SYM_KEY *rkey;
+ char keystr[256];
+ char *p;
+
+ if (key == NULL || (key->keyclass != KMF_SYMMETRIC))
+ return ("");
+
+ rkey = (KMF_RAW_SYM_KEY *)key->keyp;
+ (void) memset(keystr, 0, sizeof (keystr));
+ if (rkey != NULL) {
+ (void) snprintf(keystr, sizeof (keystr),
+ " (%d bits)", rkey->keydata.len * 8);
+ p = keystr;
+ } else {
+ return ("");
}
- /* Fill in all the optional temp variables. */
- i = 13;
- copy_attr_to_string(&(attrs[i++]), &label, &label_len);
- copy_attr_to_string(&(attrs[i++]), &id, &id_len);
- copy_attr_to_string(&(attrs[i++]), &subject, &subject_len);
- copy_attr_to_date(&(attrs[i++]), &start_date, &start_date_len);
- copy_attr_to_date(&(attrs[i++]), &end_date, &end_date_len);
-
- /* Get the key size for the object. */
- key_size = get_key_size(sess, obj, key_type);
-
- /* Display the object ... */
- /* ... the label and what it is (and key size in bits) ... */
- (void) fprintf(stdout, gettext("%d. \"%.*s\" (%d-bit %s %s)\n"),
- counter, label_len, label_len > 0 ? (char *)label :
- gettext("<no label>"), key_size, keytype_str(key_type),
- class_str(CKO_PRIVATE_KEY));
-
- /* ... the id ... */
- if (id_len == (CK_ULONG)-1 || id_len == 0)
- (void) fprintf(stdout, gettext("\tId: --\n"));
- else {
- hex_id_len = 3 * id_len + 1;
- if ((hex_id = malloc(hex_id_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_prikey;
+ return (p);
+}
+
+static void
+pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
+{
+ int i;
+
+ for (i = 0; i < numkeys; i++) {
+ (void) fprintf(stdout, gettext("Key #%d - %s: %s%s"),
+ i+1, describeKey(&keys[i]),
+ keys[i].keylabel ? keys[i].keylabel :
+ gettext("No label"),
+ (keys[i].keyclass == KMF_SYMMETRIC ?
+ keybitstr(&keys[i]) : ""));
+
+ if (keys[i].keyclass == KMF_SYMMETRIC) {
+ KMF_RETURN rv;
+ KMF_RAW_SYM_KEY rkey;
+ rv = KMF_GetSymKeyValue(handle, &keys[i],
+ &rkey);
+ if (rv == KMF_OK) {
+ (void) fprintf(stdout, "\t %d bits",
+ rkey.keydata.len * 8);
+ KMF_FreeRawSymKey(&rkey);
+ }
}
- octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
- "\n\t\t", "");
- (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
- free(hex_id);
+ (void) fprintf(stdout, "\n");
}
+}
- /* ... the subject name ... */
- if (subject_len == (CK_ULONG)-1 || subject_len == 0)
- (void) fprintf(stdout, gettext("\tSubject: --\n"));
- else {
- hex_subject_len = 2 * subject_len + 1; /* best guesstimate */
- if ((hex_subject = malloc(hex_subject_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_prikey;
+/*
+ * Generic routine used by all "list cert" operations to find
+ * all matching certificates.
+ */
+static KMF_RETURN
+pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *params)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_X509_DER_CERT *certlist = NULL;
+ uint32_t numcerts = 0;
+
+ numcerts = 0;
+ rv = KMF_FindCert(kmfhandle, params, NULL, &numcerts);
+ if (rv == KMF_OK && numcerts > 0) {
+ (void) printf(gettext("Found %d certificates.\n"),
+ numcerts);
+ certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
+ sizeof (KMF_X509_DER_CERT));
+ if (certlist == NULL)
+ return (KMF_ERR_MEMORY);
+ (void) memset(certlist, 0, numcerts *
+ sizeof (KMF_X509_DER_CERT));
+
+ rv = KMF_FindCert(kmfhandle, params, certlist, &numcerts);
+ if (rv == KMF_OK) {
+ int i;
+ (void) pk_show_certs(kmfhandle, certlist,
+ numcerts);
+ for (i = 0; i < numcerts; i++)
+ KMF_FreeKMFCert(kmfhandle, &certlist[i]);
}
- rdnseq_to_str(subject, subject_len, hex_subject,
- hex_subject_len);
- (void) fprintf(stdout, gettext("\tSubject: %.*s\n"),
- hex_subject_len, hex_subject);
- free(hex_subject);
+ free(certlist);
}
+ if (rv == KMF_ERR_CERT_NOT_FOUND &&
+ params->kstype != KMF_KEYSTORE_OPENSSL)
+ rv = KMF_OK;
- /* ... the start date ... */
- if (start_date_len == (CK_ULONG)-1 || start_date_len == 0)
- (void) fprintf(stdout, gettext("\tStart Date: --\n"));
- else
- (void) fprintf(stdout, gettext(
- "\tStart Date: %02.2s/%02.2s/%04.4s\n"),
- start_date->month, start_date->day, start_date->year);
-
- /* ... the end date ... */
- if (end_date_len == (CK_ULONG)-1 || end_date_len == 0)
- (void) fprintf(stdout, gettext("\tEnd Date: --\n"));
- else
- (void) fprintf(stdout, gettext(
- "\tEnd Date: %02.2s/%02.2s/%04.4s\n"),
- end_date->month, end_date->day, end_date->year);
-
- /* ... and its capabilities */
- (void) fprintf(stdout, "\t(%s, %s",
- private != pk_false ? gettext("private") : gettext("public"),
- modifiable == B_TRUE ? gettext("modifiable") :
- gettext("not modifiable"));
- for (i = 3; i <= 12; i++) {
- if (attrs[i].ulValueLen != (CK_ULONG)-1 &&
- attrs[i].ulValueLen != 0 &&
- *((CK_BBOOL *)(attrs[i].pValue)) == B_TRUE)
- (void) fprintf(stdout, ", %s", attr_str(attrs[i].type));
- }
- (void) fprintf(stdout, ")\n");
+ return (rv);
+}
-free_display_prikey:
- for (i = 3; i < n_attrs; i++)
- if (attrs[i].ulValueLen != (CK_ULONG)-1 &&
- attrs[i].ulValueLen != 0)
- free(attrs[i].pValue);
+static KMF_RETURN
+pk_list_keys(void *handle, KMF_FINDKEY_PARAMS *parms)
+{
+ KMF_RETURN rv;
+ KMF_KEY_HANDLE *keys;
+ uint32_t numkeys = 0;
+
+ numkeys = 0;
+ rv = KMF_FindKey(handle, parms, NULL, &numkeys);
+ if (rv == KMF_OK && numkeys > 0) {
+ int i;
+ (void) printf(gettext("Found %d keys.\n"), numkeys);
+ keys = (KMF_KEY_HANDLE *)malloc(numkeys *
+ sizeof (KMF_KEY_HANDLE));
+ if (keys == NULL)
+ return (KMF_ERR_MEMORY);
+ (void) memset(keys, 0, numkeys *
+ sizeof (KMF_KEY_HANDLE));
+
+ rv = KMF_FindKey(handle, parms, keys, &numkeys);
+ if (rv == KMF_OK)
+ pk_show_keys(handle, keys, numkeys);
+ for (i = 0; i < numkeys; i++)
+ KMF_FreeKMFKey(handle, &keys[i]);
+ free(keys);
+ }
+ if (rv == KMF_ERR_KEY_NOT_FOUND &&
+ parms->kstype != KMF_KEYSTORE_OPENSSL)
+ rv = KMF_OK;
return (rv);
}
-/*
- * Display public key.
- */
-static CK_RV
-display_pubkey(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
+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)
{
- CK_RV rv = CKR_OK;
- static CK_BBOOL private;
- static CK_BBOOL modifiable;
- static CK_BBOOL trusted;
- static CK_KEY_TYPE key_type;
- CK_ULONG key_size;
- CK_BYTE *label = NULL;
- CK_ULONG label_len = 0;
- CK_BYTE *id = NULL;
- CK_ULONG id_len = 0;
- CK_BYTE *subject = NULL;
- CK_ULONG subject_len = 0;
- CK_DATE *start_date = NULL;
- CK_ULONG start_date_len = 0;
- CK_DATE *end_date = NULL;
- CK_ULONG end_date_len = 0;
- CK_ATTRIBUTE attrs[15] = {
- /* 0 to 3 */
- { CKA_PRIVATE, &private, sizeof (private) },
- { CKA_MODIFIABLE, &modifiable, sizeof (modifiable) },
- { CKA_TRUSTED, &trusted, sizeof (trusted) },
- { CKA_KEY_TYPE, &key_type, sizeof (key_type) },
- /* 4 to 9 */
- { CKA_DERIVE, NULL, 0 },
- { CKA_LOCAL, NULL, 0 },
- { CKA_ENCRYPT, NULL, 0 },
- { CKA_VERIFY, NULL, 0 },
- { CKA_VERIFY_RECOVER, NULL, 0 },
- { CKA_WRAP, NULL, 0 },
- /* 10 to 14 */
- { CKA_LABEL, NULL, 0 }, /* optional */
- { CKA_ID, NULL, 0 }, /* optional */
- { CKA_SUBJECT, NULL, 0 }, /* optional */
- { CKA_START_DATE, NULL, 0 }, /* optional */
- { CKA_END_DATE, NULL, 0 } /* optional */
- /* not displaying CKA_KEY_GEN_MECHANISM */
- };
- CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
- int i;
- char *hex_id = NULL;
- int hex_id_len = 0;
- char *hex_subject = NULL;
- int hex_subject_len = 0;
-
- cryptodebug("inside display_pubkey");
-
- /* Get the sizes of the attributes we need. */
- cryptodebug("calling C_GetAttributeValue for size info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get public key attribute sizes (%s)."),
- pkcs11_strerror(rv));
+ KMF_RETURN rv;
+ KMF_LISTCRL_PARAMS lcrlargs;
+
+ /*
+ * Symmetric keys and RSA/DSA private keys are always
+ * created with the "CKA_PRIVATE" field == TRUE, so
+ * make sure we search for them with it also set.
+ */
+ if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
+ oclass |= PK_PRIVATE_OBJ;
+
+ rv = select_token(kmfhandle, token,
+ !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
+
+ if (rv != KMF_OK) {
return (rv);
}
- /* Allocate memory for each variable-length attribute. */
- for (i = 4; i < n_attrs; i++) {
- if (attrs[i].ulValueLen == (CK_ULONG)-1 ||
- attrs[i].ulValueLen == 0) {
- cryptodebug("display_pubkey: *** should not happen");
- attrs[i].ulValueLen = 0;
- continue;
+ if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
+ KMF_FINDKEY_PARAMS parms;
+
+ (void) memset(&parms, 0, sizeof (parms));
+ parms.kstype = KMF_KEYSTORE_PK11TOKEN;
+
+ if (oclass & PK_PRIKEY_OBJ) {
+ parms.keyclass = KMF_ASYM_PRI;
+ parms.findLabel = objlabel;
+ parms.cred = *tokencred;
+ parms.pkcs11parms.private =
+ ((oclass & PK_PRIVATE_OBJ) > 0);
+
+ /* list asymmetric private keys */
+ rv = pk_list_keys(kmfhandle, &parms);
}
- if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_pubkey;
+
+ if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
+ parms.keyclass = KMF_SYMMETRIC;
+ parms.findLabel = objlabel;
+ parms.cred = *tokencred;
+ parms.format = KMF_FORMAT_RAWKEY;
+ parms.pkcs11parms.private =
+ ((oclass & PK_PRIVATE_OBJ) > 0);
+
+ /* list symmetric keys */
+ rv = pk_list_keys(kmfhandle, &parms);
}
- }
- /* Now really get the attributes. */
- cryptodebug("calling C_GetAttributeValue for attribute info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get public key attributes (%s)."),
- pkcs11_strerror(rv));
- goto free_display_pubkey;
- }
+ if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
+ parms.keyclass = KMF_ASYM_PUB;
+ parms.findLabel = objlabel;
+ parms.pkcs11parms.private =
+ ((oclass & PK_PRIVATE_OBJ) > 0);
- /* Fill in all the optional temp variables. */
- i = 10;
- copy_attr_to_string(&(attrs[i++]), &label, &label_len);
- copy_attr_to_string(&(attrs[i++]), &id, &id_len);
- copy_attr_to_string(&(attrs[i++]), &subject, &subject_len);
- copy_attr_to_date(&(attrs[i++]), &start_date, &start_date_len);
- copy_attr_to_date(&(attrs[i++]), &end_date, &end_date_len);
-
- /* Get the key size for the object. */
- key_size = get_key_size(sess, obj, key_type);
-
- /* Display the object ... */
- /* ... the label and what it is (and key size in bits) ... */
- (void) fprintf(stdout, gettext("%d. \"%.*s\" (%d-bit %s %s)\n"),
- counter, label_len, label_len > 0 ? (char *)label :
- gettext("<no label>"), key_size, keytype_str(key_type),
- class_str(CKO_PUBLIC_KEY));
-
- /* ... the id ... */
- if (id_len == (CK_ULONG)-1 || id_len == 0)
- (void) fprintf(stdout, gettext("\tId: --\n"));
- else {
- hex_id_len = 3 * id_len + 1;
- if ((hex_id = malloc(hex_id_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_pubkey;
+ /* list asymmetric public keys (if any) */
+ rv = pk_list_keys(kmfhandle, &parms);
}
- octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
- "\n\t\t", "");
- (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
- free(hex_id);
+
+ if (rv != KMF_OK)
+ return (rv);
}
- /* ... the subject name ... */
- if (subject_len == (CK_ULONG)-1 || subject_len == 0)
- (void) fprintf(stdout, gettext("\tSubject: --\n"));
- else {
- hex_subject_len = 2 * subject_len + 1; /* best guesstimate */
- if ((hex_subject = malloc(hex_subject_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_pubkey;
- }
- rdnseq_to_str(subject, subject_len, hex_subject,
- hex_subject_len);
- (void) fprintf(stdout, gettext("\tSubject: %.*s\n"),
- hex_subject_len, hex_subject);
- free(hex_subject);
+ if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
+ KMF_FINDCERT_PARAMS parms;
+
+ (void) memset(&parms, 0, sizeof (parms));
+ parms.kstype = KMF_KEYSTORE_PK11TOKEN;
+ parms.certLabel = objlabel;
+ parms.issuer = issuer;
+ parms.subject = subject;
+ parms.serial = serial;
+ parms.pkcs11parms.private = FALSE;
+ parms.find_cert_validity = find_criteria_flag;
+
+ rv = pk_find_certs(kmfhandle, &parms);
+ if (rv != KMF_OK)
+ return (rv);
}
- /* ... the start date ... */
- if (start_date_len == (CK_ULONG)-1 || start_date_len == 0)
- (void) fprintf(stdout, gettext("\tStart Date: --\n"));
- else
- (void) fprintf(stdout, gettext(
- "\tStart Date: %02.2s/%02.2s/%04.4s\n"),
- start_date->month, start_date->day, start_date->year);
-
- /* ... the end date ... */
- if (end_date_len == (CK_ULONG)-1 || end_date_len == 0)
- (void) fprintf(stdout, gettext("\tEnd Date: --\n"));
- else
- (void) fprintf(stdout, gettext(
- "\tEnd Date: %02.2s/%02.2s/%04.4s\n"),
- end_date->month, end_date->day, end_date->year);
-
- /* ... and its capabilities */
- (void) fprintf(stdout, "\t(%s, %s, %s",
- private == B_TRUE ? gettext("private") : gettext("public"),
- modifiable == B_TRUE ? gettext("modifiable") :
- gettext("not modifiable"),
- trusted == B_TRUE ? gettext("trusted") : gettext("untrusted"));
- for (i = 4; i <= 9; i++) {
- if (attrs[i].ulValueLen != (CK_ULONG)-1 &&
- attrs[i].ulValueLen != 0 &&
- *((CK_BBOOL *)(attrs[i].pValue)) == B_TRUE)
- (void) fprintf(stdout, ", %s", attr_str(attrs[i].type));
+ if (oclass & PK_CRL_OBJ) {
+ char *crldata;
+
+ (void) memset(&lcrlargs, 0, sizeof (lcrlargs));
+ lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
+ lcrlargs.sslparms.dirpath = dir;
+ lcrlargs.sslparms.crlfile = filename;
+
+ rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
+ if (rv == KMF_OK) {
+ (void) printf("%s\n", crldata);
+ free(crldata);
+ }
}
- (void) fprintf(stdout, ")\n");
-free_display_pubkey:
- for (i = 4; i < n_attrs; i++)
- if (attrs[i].ulValueLen != (CK_ULONG)-1 &&
- attrs[i].ulValueLen != 0)
- free(attrs[i].pValue);
return (rv);
}
-/*
- * Display secret key.
- */
-static CK_RV
-display_seckey(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
+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)
{
- CK_RV rv = CKR_OK;
- static CK_BBOOL private;
- static CK_BBOOL modifiable;
- static CK_KEY_TYPE key_type;
- static CK_ULONG key_size;
- CK_BYTE *label = NULL;
- CK_ULONG label_len = 0;
- CK_BYTE *id = NULL;
- CK_ULONG id_len = 0;
- CK_DATE *start_date = NULL;
- CK_ULONG start_date_len = 0;
- CK_DATE *end_date = NULL;
- CK_ULONG end_date_len = 0;
- CK_ATTRIBUTE attrs[19] = {
- /* 0 to 2 */
- { CKA_PRIVATE, &private, sizeof (private) },
- { CKA_MODIFIABLE, &modifiable, sizeof (modifiable) },
- { CKA_KEY_TYPE, &key_type, sizeof (key_type) },
- /* 3 to 14 */
- { CKA_DERIVE, NULL, 0 },
- { CKA_LOCAL, NULL, 0 },
- { CKA_ENCRYPT, NULL, 0 },
- { CKA_DECRYPT, NULL, 0 },
- { CKA_SIGN, NULL, 0 },
- { CKA_VERIFY, NULL, 0 },
- { CKA_WRAP, NULL, 0 },
- { CKA_UNWRAP, NULL, 0 },
- { CKA_SENSITIVE, NULL, 0 },
- { CKA_ALWAYS_SENSITIVE, NULL, 0 },
- { CKA_EXTRACTABLE, NULL, 0 },
- { CKA_NEVER_EXTRACTABLE, 0 },
- /* 15 to 18 */
- { CKA_LABEL, NULL, 0 }, /* optional */
- { CKA_ID, NULL, 0 }, /* optional */
- { CKA_START_DATE, NULL, 0 }, /* optional */
- { CKA_END_DATE, NULL, 0 } /* optional */
- /* not displaying CKA_KEY_GEN_MECHANISM */
- };
- CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
- int i;
- char *hex_id = NULL;
- int hex_id_len = 0;
-
- cryptodebug("inside display_seckey");
-
- /* Get the sizes of the attributes we need. */
- cryptodebug("calling C_GetAttributeValue for size info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get secret key attribute sizes (%s)."),
- pkcs11_strerror(rv));
- return (rv);
- }
-
- /* Allocate memory for each variable-length attribute. */
- for (i = 3; i < n_attrs; i++) {
- if (attrs[i].ulValueLen == (CK_ULONG)-1 ||
- attrs[i].ulValueLen == 0) {
- cryptodebug("display_seckey: *** should not happen");
- attrs[i].ulValueLen = 0;
- continue;
+ int rv;
+ KMF_FINDCERT_PARAMS fcargs;
+ KMF_FINDKEY_PARAMS fkargs;
+ KMF_LISTCRL_PARAMS lcrlargs;
+
+ if (oclass & PK_KEY_OBJ) {
+ (void) memset(&fkargs, 0, sizeof (fkargs));
+ fkargs.kstype = KMF_KEYSTORE_OPENSSL;
+ fkargs.sslparms.dirpath = dir;
+ fkargs.sslparms.keyfile = filename;
+ if (oclass & PK_PRIKEY_OBJ) {
+ fkargs.keyclass = KMF_ASYM_PRI;
+
+ rv = pk_list_keys(kmfhandle, &fkargs);
}
- if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_seckey;
- }
- }
+ if (rv == KMF_ERR_KEY_NOT_FOUND)
+ rv = KMF_OK;
- /* Now really get the attributes. */
- cryptodebug("calling C_GetAttributeValue for attribute info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get secret key attributes (%s)."),
- pkcs11_strerror(rv));
- goto free_display_seckey;
- }
+ if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
+ fkargs.keyclass = KMF_SYMMETRIC;
+ fkargs.format = KMF_FORMAT_RAWKEY;
- /* Fill in all the optional temp variables. */
- i = 15;
- copy_attr_to_string(&(attrs[i++]), &label, &label_len);
- copy_attr_to_string(&(attrs[i++]), &id, &id_len);
- copy_attr_to_date(&(attrs[i++]), &start_date, &start_date_len);
- copy_attr_to_date(&(attrs[i++]), &end_date, &end_date_len);
-
- /* Get the key size for the object. */
- key_size = get_key_size(sess, obj, key_type);
-
- /* Display the object ... */
- /* ... the label and what it is (and key size in bytes) ... */
- (void) fprintf(stdout, gettext("%d. \"%.*s\" (%d-bit %s %s)\n"),
- counter, label_len, label_len > 0 ? (char *)label :
- gettext("<no label>"), key_size, keytype_str(key_type),
- class_str(CKO_SECRET_KEY));
-
- /* ... the id ... */
- if (id_len == (CK_ULONG)-1 || id_len == 0)
- (void) fprintf(stdout, gettext("\tId: --\n"));
- else {
- hex_id_len = 3 * id_len + 1;
- if ((hex_id = malloc(hex_id_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_seckey;
+ rv = pk_list_keys(kmfhandle, &fkargs);
+ }
+ if (rv == KMF_ERR_KEY_NOT_FOUND)
+ rv = KMF_OK;
+ if (rv != KMF_OK)
+ return (rv);
+ }
+
+ if (oclass & PK_CERT_OBJ) {
+ (void) memset(&fcargs, 0, sizeof (fcargs));
+ fcargs.kstype = KMF_KEYSTORE_OPENSSL;
+ fcargs.certLabel = NULL;
+ fcargs.issuer = issuer;
+ fcargs.subject = subject;
+ fcargs.serial = serial;
+ fcargs.sslparms.dirpath = dir;
+ fcargs.sslparms.certfile = filename;
+ fcargs.find_cert_validity = find_criteria_flag;
+
+ rv = pk_find_certs(kmfhandle, &fcargs);
+ if (rv != KMF_OK)
+ return (rv);
+ }
+
+ if (oclass & PK_CRL_OBJ) {
+ char *crldata;
+
+ (void) memset(&lcrlargs, 0, sizeof (lcrlargs));
+ lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
+ lcrlargs.sslparms.dirpath = dir;
+ lcrlargs.sslparms.crlfile = filename;
+
+ rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
+ if (rv == KMF_OK) {
+ (void) printf("%s\n", crldata);
+ free(crldata);
}
- octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
- "\n\t\t", "");
- (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
- free(hex_id);
- }
-
- /* ... the start date ... */
- if (start_date_len == (CK_ULONG)-1 || start_date_len == 0)
- (void) fprintf(stdout, gettext("\tStart Date: --\n"));
- else
- (void) fprintf(stdout, gettext(
- "\tStart Date: %02.2s/%02.2s/%04.4s\n"),
- start_date->month, start_date->day, start_date->year);
-
- /* ... the end date ... */
- if (end_date_len == (CK_ULONG)-1 || end_date_len == 0)
- (void) fprintf(stdout, gettext("\tEnd Date: --\n"));
- else
- (void) fprintf(stdout, gettext(
- "\tEnd Date: %02.2s/%02.2s/%04.4s\n"),
- end_date->month, end_date->day, end_date->year);
-
- /* ... and its capabilities */
- (void) fprintf(stdout, "\t(%s, %s",
- private == B_TRUE ? gettext("private") : gettext("public"),
- modifiable == B_TRUE ? gettext("modifiable") :
- gettext("not modifiable"));
- for (i = 3; i <= 14; i++) {
- if (attrs[i].ulValueLen != (CK_ULONG)-1 &&
- attrs[i].ulValueLen != 0 &&
- *((CK_BBOOL *)(attrs[i].pValue)) == B_TRUE)
- (void) fprintf(stdout, ", %s", attr_str(attrs[i].type));
}
- (void) fprintf(stdout, ")\n");
-free_display_seckey:
- for (i = 3; i < n_attrs; i++)
- if (attrs[i].ulValueLen != (CK_ULONG)-1 &&
- attrs[i].ulValueLen != 0)
- free(attrs[i].pValue);
return (rv);
}
-/*
- * Display certificate.
- */
-static CK_RV
-display_cert(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
+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)
{
- CK_RV rv = CKR_OK;
- static CK_BBOOL private;
- static CK_BBOOL modifiable;
- static CK_BBOOL trusted;
- CK_BYTE *subject = NULL;
- CK_ULONG subject_len = 0;
- CK_BYTE *value = NULL;
- CK_ULONG value_len = 0;
- CK_BYTE *label = NULL;
- CK_ULONG label_len = 0;
- CK_BYTE *id = NULL;
- CK_ULONG id_len = 0;
- CK_BYTE *issuer = NULL;
- CK_ULONG issuer_len = 0;
- CK_BYTE *serial = NULL;
- CK_ULONG serial_len = 0;
- CK_ATTRIBUTE attrs[9] = {
- { CKA_PRIVATE, &private, sizeof (private) },
- { CKA_MODIFIABLE, &modifiable, sizeof (modifiable) },
- { CKA_TRUSTED, &trusted, sizeof (trusted) },
- { CKA_SUBJECT, NULL, 0 }, /* required */
- { CKA_VALUE, NULL, 0 }, /* required */
- { CKA_LABEL, NULL, 0 }, /* optional */
- { CKA_ID, NULL, 0 }, /* optional */
- { CKA_ISSUER, NULL, 0 }, /* optional */
- { CKA_SERIAL_NUMBER, NULL, 0 } /* optional */
- };
- CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
- int i;
- char *hex_id = NULL;
- int hex_id_len = 0;
- char *hex_subject = NULL;
- int hex_subject_len = 0;
- char *hex_issuer = NULL;
- int hex_issuer_len = 0;
- char *hex_serial = NULL;
- int hex_serial_len = NULL;
- uint32_t serial_value = 0;
- char *hex_value = NULL;
- int hex_value_len = 0;
-
- cryptodebug("inside display_cert");
-
- /* Get the sizes of the attributes we need. */
- cryptodebug("calling C_GetAttributeValue for size info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get certificate attribute sizes (%s)."),
- pkcs11_strerror(rv));
+ KMF_RETURN rv = KMF_OK;
+ KMF_FINDKEY_PARAMS fkargs;
+
+ rv = configure_nss(kmfhandle, dir, prefix);
+ if (rv != KMF_OK)
return (rv);
- }
- /* Allocate memory for each variable-length attribute. */
- for (i = 3; i < n_attrs; i++) {
- if (attrs[i].ulValueLen == (CK_ULONG)-1 ||
- attrs[i].ulValueLen == 0) {
- cryptodebug("display_cert: *** should not happen");
- attrs[i].ulValueLen = 0;
- continue;
- }
- if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_cert;
- }
+ if (oclass & PK_KEY_OBJ) {
+ (void) memset(&fkargs, 0, sizeof (fkargs));
+ fkargs.kstype = KMF_KEYSTORE_NSS;
+ fkargs.findLabel = nickname;
+ fkargs.cred = *tokencred;
+ fkargs.nssparms.slotlabel = token_spec;
}
- /* Now really get the attributes. */
- cryptodebug("calling C_GetAttributeValue for attribute info");
- if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get certificate attributes (%s)."),
- pkcs11_strerror(rv));
- goto free_display_cert;
+ if (oclass & PK_PRIKEY_OBJ) {
+ fkargs.keyclass = KMF_ASYM_PRI;
+ rv = pk_list_keys(kmfhandle, &fkargs);
}
-
- /*
- * Fill in all the temp variables. Subject and value are required.
- * The rest are optional.
- */
- i = 3;
- copy_attr_to_string(&(attrs[i++]), &subject, &subject_len);
- copy_attr_to_string(&(attrs[i++]), &value, &value_len);
- copy_attr_to_string(&(attrs[i++]), &label, &label_len);
- copy_attr_to_string(&(attrs[i++]), &id, &id_len);
- copy_attr_to_string(&(attrs[i++]), &issuer, &issuer_len);
- copy_attr_to_string(&(attrs[i++]), &serial, &serial_len);
-
- /* Display the object ... */
- /* ... the label and what it is ... */
- (void) fprintf(stdout, gettext("%d. \"%.*s\" (%s %s)\n"),
- counter, label_len, label_len > 0 ? (char *)label :
- gettext("<no label>"), "X.509", class_str(CKO_CERTIFICATE));
-
- /* ... its capabilities ... */
- (void) fprintf(stdout, gettext("\t(%s, %s, %s)\n"),
- private == B_TRUE ? gettext("private") : gettext("public"),
- modifiable == B_TRUE ? gettext("modifiable") :
- gettext("not modifiable"),
- trusted == B_TRUE ? gettext("trusted") : gettext("untrusted"));
-
- /* ... the id ... */
- if (id_len == (CK_ULONG)-1 || id_len == 0)
- (void) fprintf(stdout, gettext("\tId: --\n"));
- else {
- hex_id_len = 3 * id_len + 1;
- if ((hex_id = malloc(hex_id_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_cert;
- }
- octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
- "\n\t\t", "");
- (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
- free(hex_id);
+ if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
+ fkargs.keyclass = KMF_SYMMETRIC;
+ fkargs.format = KMF_FORMAT_RAWKEY;
+ rv = pk_list_keys(kmfhandle, &fkargs);
}
-
- /* ... the subject name ... */
- if (subject_len == (CK_ULONG)-1 || subject_len == 0)
- (void) fprintf(stdout, gettext("\tSubject: --\n"));
- else {
- hex_subject_len = 2 * subject_len + 1; /* best guesstimate */
- if ((hex_subject = malloc(hex_subject_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_cert;
- }
- rdnseq_to_str(subject, subject_len, hex_subject,
- hex_subject_len);
- (void) fprintf(stdout, gettext("\tSubject: %.*s\n"),
- hex_subject_len, hex_subject);
- free(hex_subject);
+ if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
+ fkargs.keyclass = KMF_ASYM_PUB;
+ rv = pk_list_keys(kmfhandle, &fkargs);
}
- /* ... the issuer name ... */
- if (issuer_len == (CK_ULONG)-1 || issuer_len == 0)
- (void) fprintf(stdout, gettext("\tIssuer: --\n"));
- else {
- hex_issuer_len = 2 * issuer_len + 1; /* best guesstimate */
- if ((hex_issuer = malloc(hex_issuer_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_cert;
- }
- rdnseq_to_str(issuer, issuer_len, hex_issuer, hex_issuer_len);
- (void) fprintf(stdout, gettext("\tIssuer: %.*s\n"),
- hex_issuer_len, hex_issuer);
- free(hex_issuer);
- }
+ /* If searching for public objects or certificates, find certs now */
+ if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
+ KMF_FINDCERT_PARAMS fcargs;
- /* ... the serial number ... */
- if (serial_len == (CK_ULONG)-1 || serial_len == 0)
- (void) fprintf(stdout, gettext("\tSerial: --\n"));
- else {
- hex_serial_len = 3 * serial_len + 1;
- if ((hex_serial = malloc(hex_serial_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_cert;
- }
- octetify(serial, serial_len, hex_serial, hex_serial_len,
- B_FALSE, B_FALSE, 60, "\n\t\t", "");
- if (serial_len > 4)
- (void) fprintf(stdout, gettext("\tSerial: %s\n"),
- hex_serial);
- else {
- for (i = 0; i < serial_len; i++) {
- serial_value <<= 8;
- serial_value |= (serial[i] & 0xff);
- }
- (void) fprintf(stdout, gettext("\tSerial: %s (%d)\n"),
- hex_serial, serial_value);
- }
- free(hex_serial);
+ (void) memset(&fcargs, 0, sizeof (fcargs));
+ fcargs.kstype = KMF_KEYSTORE_NSS;
+ fcargs.certLabel = nickname;
+ fcargs.issuer = issuer;
+ fcargs.subject = subject;
+ fcargs.serial = serial;
+ fcargs.nssparms.slotlabel = token_spec;
+ fcargs.find_cert_validity = find_criteria_flag;
+
+ rv = pk_find_certs(kmfhandle, &fcargs);
}
- /* ... and the value */
- if (value_len == (CK_ULONG)-1 || value_len == 0)
- (void) fprintf(stdout, gettext("\tValue: --\n"));
- else {
- hex_value_len = 3 * value_len + 1;
- if ((hex_value = malloc(hex_value_len)) == NULL) {
- cryptoerror(LOG_STDERR, "%s.", strerror(errno));
- rv = CKR_HOST_MEMORY;
- goto free_display_cert;
+ if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
+ int numcrls;
+ KMF_FINDCRL_PARAMS fcrlargs;
+
+ (void) memset(&fcrlargs, 0, sizeof (fcrlargs));
+ fcrlargs.kstype = KMF_KEYSTORE_NSS;
+ fcrlargs.nssparms.slotlabel = token_spec;
+
+ rv = KMF_FindCRL(kmfhandle, &fcrlargs, NULL, &numcrls);
+ if (rv == KMF_OK) {
+ char **p;
+ if (numcrls == 0) {
+ (void) printf(gettext("No CRLs found in "
+ "NSS keystore.\n"));
+
+ return (KMF_OK);
+ }
+ p = malloc(numcrls * sizeof (char *));
+ if (p == NULL) {
+ return (KMF_ERR_MEMORY);
+ }
+ (void) memset(p, 0, numcrls * sizeof (char *));
+ rv = KMF_FindCRL(kmfhandle, &fcrlargs,
+ p, &numcrls);
+ if (rv == KMF_OK) {
+ int i;
+ for (i = 0; i < numcrls; i++) {
+ (void) printf("%d. Name = %s\n",
+ i + 1, p[i]);
+ free(p[i]);
+ }
+ }
+ free(p);
}
- octetify(value, value_len, hex_value, hex_value_len,
- B_FALSE, B_FALSE, 60, "\n\t\t", "");
- (void) fprintf(stdout, gettext("\tValue: %s\n"), hex_value);
- free(hex_value);
}
-
-free_display_cert:
- for (i = 3; i < n_attrs; i++)
- if (attrs[i].ulValueLen != (CK_ULONG)-1 &&
- attrs[i].ulValueLen != 0)
- free(attrs[i].pValue);
return (rv);
}
@@ -840,207 +527,189 @@ pk_list(int argc, char *argv[])
extern int optind_av;
extern char *optarg_av;
char *token_spec = NULL;
- char *token_name = NULL;
- char *manuf_id = NULL;
- char *serial_no = NULL;
- char *type_spec = NULL;
- char full_name[FULL_NAME_LEN];
- boolean_t public_objs = B_FALSE;
- boolean_t private_objs = B_FALSE;
- CK_BYTE *list_label = NULL;
- int obj_type = 0x00;
- CK_SLOT_ID slot_id;
- CK_FLAGS pin_state;
- CK_UTF8CHAR_PTR pin = NULL;
- CK_ULONG pinlen = 0;
- CK_SESSION_HANDLE sess;
- CK_OBJECT_HANDLE *objs;
- CK_ULONG num_objs;
- CK_RV rv = CKR_OK;
- int i;
- static CK_OBJECT_CLASS objclass;
- CK_ATTRIBUTE class_attr =
- { CKA_CLASS, &objclass, sizeof (objclass) };
-
- cryptodebug("inside pk_list");
+ char *subject = NULL;
+ char *issuer = NULL;
+ char *dir = NULL;
+ char *prefix = NULL;
+ char *filename = NULL;
+ char *serstr = NULL;
+ KMF_BIGINT serial = { NULL, 0 };
+
+ char *list_label = NULL;
+ int oclass = 0;
+ KMF_KEYSTORE_TYPE kstype = 0;
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE_T kmfhandle = NULL;
+ char *find_criteria = NULL;
+ KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS;
+ KMF_CREDENTIAL tokencred = {NULL, 0};
/* Parse command line options. Do NOT i18n/l10n. */
while ((opt = getopt_av(argc, argv,
- "T:(token)y:(objtype)l:(label)")) != EOF) {
+ "k:(keystore)t:(objtype)T:(token)d:(dir)"
+ "p:(prefix)n:(nickname)S:(serial)s:(subject)"
+ "c:(criteria)"
+ "i:(issuer)l:(label)f:(infile)")) != EOF) {
+ if (EMPTYSTRING(optarg_av))
+ return (PK_ERR_USAGE);
switch (opt) {
- case 'T': /* token specifier */
- if (token_spec)
+ case 'k':
+ if (kstype != 0)
+ return (PK_ERR_USAGE);
+ kstype = KS2Int(optarg_av);
+ if (kstype == 0)
+ return (PK_ERR_USAGE);
+ break;
+ case 't':
+ if (oclass != 0)
+ return (PK_ERR_USAGE);
+ oclass = OT2Int(optarg_av);
+ if (oclass == -1)
+ return (PK_ERR_USAGE);
+ break;
+ case 's':
+ if (subject)
+ return (PK_ERR_USAGE);
+ subject = optarg_av;
+ break;
+ case 'i':
+ if (issuer)
+ return (PK_ERR_USAGE);
+ issuer = optarg_av;
+ break;
+ case 'd':
+ if (dir)
+ return (PK_ERR_USAGE);
+ dir = optarg_av;
+ break;
+ case 'p':
+ if (prefix)
+ return (PK_ERR_USAGE);
+ prefix = optarg_av;
+ break;
+ case 'S':
+ serstr = optarg_av;
+ break;
+ case 'f':
+ if (filename)
+ return (PK_ERR_USAGE);
+ filename = optarg_av;
+ break;
+ case 'T': /* token specifier */
+ if (token_spec)
+ return (PK_ERR_USAGE);
+ token_spec = optarg_av;
+ break;
+ case 'n':
+ case 'l': /* object with specific label */
+ if (list_label)
+ return (PK_ERR_USAGE);
+ list_label = optarg_av;
+ break;
+ case 'c':
+ find_criteria = optarg_av;
+ if (!strcasecmp(find_criteria, "valid"))
+ find_criteria_flag =
+ KMF_NONEXPIRED_CERTS;
+ else if (!strcasecmp(find_criteria, "expired"))
+ find_criteria_flag = KMF_EXPIRED_CERTS;
+ else if (!strcasecmp(find_criteria, "both"))
+ find_criteria_flag = KMF_ALL_CERTS;
+ else
+ return (PK_ERR_USAGE);
+ break;
+ default:
return (PK_ERR_USAGE);
- token_spec = optarg_av;
- break;
- case 'y': /* object type: public, private, both */
- if (type_spec)
- return (PK_ERR_USAGE);
- type_spec = optarg_av;
- break;
- case 'l': /* object with specific label */
- if (list_label)
- return (PK_ERR_USAGE);
- list_label = (CK_BYTE *)optarg_av;
- break;
- default:
- return (PK_ERR_USAGE);
- break;
}
}
+ /* No additional args allowed. */
+ argc -= optind_av;
+ argv += optind_av;
+ if (argc)
+ return (PK_ERR_USAGE);
- /* If no token is specified, default is to use softtoken. */
- if (token_spec == NULL) {
- token_name = SOFT_TOKEN_LABEL;
- manuf_id = SOFT_MANUFACTURER_ID;
- serial_no = SOFT_TOKEN_SERIAL;
- } else {
- /*
- * Parse token specifier into token_name, manuf_id, serial_no.
- * Token_name is required; manuf_id and serial_no are optional.
- */
- if (parse_token_spec(token_spec, &token_name, &manuf_id,
- &serial_no) < 0)
- return (PK_ERR_USAGE);
+ if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ /* Error message ? */
+ return (rv);
}
- /* If no object type specified, default is public objects. */
- if (!type_spec) {
- public_objs = B_TRUE;
- } else {
- /*
- * Otherwise, the object type must be "public", "private",
- * or "both".
- */
- if (strcmp(type_spec, "private") == 0) {
- private_objs = B_TRUE;
- } else if (strcmp(type_spec, "public") == 0) {
- public_objs = B_TRUE;
- } else if (strcmp(type_spec, "both") == 0) {
- private_objs = B_TRUE;
- public_objs = B_TRUE;
- } else
- return (PK_ERR_USAGE);
- }
+ /* Assume keystore = PKCS#11 if not specified. */
+ if (kstype == 0)
+ kstype = KMF_KEYSTORE_PK11TOKEN;
- if (private_objs)
- obj_type |= PK_PRIVATE_OBJ;
- if (public_objs)
- obj_type |= PK_PUBLIC_OBJ;
+ /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
+ if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
+ kstype != KMF_KEYSTORE_PK11TOKEN) {
- /* No additional args allowed. */
- argc -= optind_av;
- argv += optind_av;
- if (argc)
+ (void) fprintf(stderr, gettext("The objtype parameter "
+ "is only relevant if keystore=pkcs11\n"));
return (PK_ERR_USAGE);
- /* Done parsing command line options. */
+ }
- full_token_name(token_name, manuf_id, serial_no, full_name);
+ /* If no object class specified, list certificate objects. */
+ if (oclass == 0)
+ oclass = PK_CERT_OBJ;
- /* Find the slot with token. */
- if ((rv = find_token_slot(token_name, manuf_id, serial_no, &slot_id,
- &pin_state)) != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to find token %s (%s)."), full_name,
- pkcs11_strerror(rv));
- return (PK_ERR_PK11);
+ if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) {
+ token_spec = PK_DEFAULT_PK11TOKEN;
+ } else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) {
+ token_spec = DEFAULT_NSS_TOKEN;
}
- /* If private objects are to be listed, user must be logged in. */
- if (private_objs) {
- /* Get the user's PIN. */
- if ((rv = get_pin(gettext("Enter token passphrase:"), NULL,
- &pin, &pinlen)) != CKR_OK) {
- cryptoerror(LOG_STDERR,
- gettext("Unable to get token passphrase (%s)."),
- pkcs11_strerror(rv));
- quick_finish(NULL);
- return (PK_ERR_PK11);
- }
+ if (serstr != NULL) {
+ uchar_t *bytes = NULL;
+ size_t bytelen;
- /* Logging in user R/O into the token is sufficient. */
- cryptodebug("logging in with readonly session");
- if ((rv = quick_start(slot_id, 0, pin, pinlen, &sess)) !=
- CKR_OK) {
- cryptoerror(LOG_STDERR,
- gettext("Unable to log into token (%s)."),
- pkcs11_strerror(rv));
- quick_finish(sess);
- return (PK_ERR_PK11);
- }
- /* Otherwise, just create a session. */
- } else {
- cryptodebug("opening a readonly session");
- if ((rv = open_sess(slot_id, 0, &sess)) != CKR_OK) {
- cryptoerror(LOG_STDERR,
- gettext("Unable to open token session (%s)."),
- pkcs11_strerror(rv));
- quick_finish(sess);
- return (PK_ERR_PK11);
+ rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
+ if (rv != KMF_OK || bytes == NULL) {
+ (void) fprintf(stderr, gettext("serial number "
+ "must be specified as a hex number "
+ "(ex: 0x0102030405ffeeddee)\n"));
+ return (PK_ERR_USAGE);
}
+ serial.val = bytes;
+ serial.len = bytelen;
}
- /* Find the object(s) with the given label and/or type. */
- if ((rv = find_objs(sess, obj_type, list_label, &objs, &num_objs)) !=
- CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to find token objects (%s)."), pkcs11_strerror(rv));
- quick_finish(sess);
- return (PK_ERR_PK11);
- }
+ if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
+ kstype == KMF_KEYSTORE_NSS) &&
+ (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
- if (num_objs == 0) {
- cryptoerror(LOG_STDERR, gettext("No objects found."));
- quick_finish(sess);
- return (0);
+ (void) get_token_password(kstype, token_spec,
+ &tokencred);
}
+ if (kstype == KMF_KEYSTORE_PK11TOKEN) {
+ rv = list_pk11_objects(kmfhandle, token_spec,
+ oclass, list_label, &serial,
+ issuer, subject, dir, filename,
+ &tokencred, find_criteria_flag);
- /* List the objects found. */
- for (i = 0; i < num_objs; i++) {
- /* Get object class first, then decide what is next. */
- cryptodebug("calling C_GetAttributeValue for object class");
- if ((rv = C_GetAttributeValue(sess, objs[i], &class_attr, 1))
- != CKR_OK) {
- cryptoerror(LOG_STDERR, gettext(
- "Unable to get object #%d class attribute (%s)."),
- i+1, pkcs11_strerror(rv));
- continue;
- }
+ } else if (kstype == KMF_KEYSTORE_NSS) {
+ if (dir == NULL)
+ dir = PK_DEFAULT_DIRECTORY;
+ rv = list_nss_objects(kmfhandle,
+ oclass, token_spec, dir, prefix,
+ list_label, &serial, issuer, subject,
+ &tokencred, find_criteria_flag);
- /* Display based on the type of object. */
- switch (objclass) {
- case CKO_CERTIFICATE:
- if ((rv = display_cert(sess, objs[i], i+1)) != CKR_OK)
- cryptoerror(LOG_STDERR,
- gettext("Unable to display certificate."));
- break;
- case CKO_PUBLIC_KEY:
- if ((rv = display_pubkey(sess, objs[i], i+1)) != CKR_OK)
- cryptoerror(LOG_STDERR,
- gettext("Unable to display public key."));
- break;
- case CKO_PRIVATE_KEY:
- if ((rv = display_prikey(sess, objs[i], i+1)) != CKR_OK)
- cryptoerror(LOG_STDERR,
- gettext("Unable to display private key."));
- break;
- case CKO_SECRET_KEY:
- if ((rv = display_seckey(sess, objs[i], i+1)) != CKR_OK)
- cryptoerror(LOG_STDERR,
- gettext("Unable to display secret key."));
- break;
- case CKO_DATA:
- cryptoerror(LOG_STDERR,
- gettext("Data object display not implemented."));
- break;
- default:
- cryptoerror(LOG_STDERR, gettext(
- "Unknown token object class (0x%02x)."), objclass);
- break;
- }
+ } else if (kstype == KMF_KEYSTORE_OPENSSL) {
+
+ rv = list_file_objects(kmfhandle,
+ oclass, dir, filename,
+ &serial, issuer, subject, find_criteria_flag);
+ }
+
+ if (rv != KMF_OK) {
+ display_error(kmfhandle, rv,
+ gettext("Error listing objects"));
}
- /* Clean up. */
- quick_finish(sess);
- return (0);
+ if (serial.val != NULL)
+ free(serial.val);
+
+ if (tokencred.cred != NULL)
+ free(tokencred.cred);
+
+ (void) KMF_Finalize(kmfhandle);
+ return (rv);
}