list.c revision 49e212991a3065f7e499a4b29ae8d8eaf33f3135
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * CDDL HEADER START
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * The contents of this file are subject to the terms of the
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Common Development and Distribution License, Version 1.0 only
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * (the "License"). You may not use this file except in compliance
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * with the License.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * See the License for the specific language governing permissions
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * and limitations under the License.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * When distributing Covered Code, include this CDDL HEADER in each
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * If applicable, add the following below this CDDL HEADER, with the
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * fields enclosed by brackets "[]" replaced with your own identifying
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * information: Portions Copyright [yyyy] [name of copyright owner]
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * CDDL HEADER END
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Use is subject to license terms.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak#pragma ident "%Z%%M% %I% %E% SMI"
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * This file implements the token object list operation for this tool.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * It loads the PKCS#11 modules, finds the object to list, lists it,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * and cleans up. User must be logged into the token to list private
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Get key size based on the key type.
7711facfe58561dd91d6ece0f5f41150c3956c83dinakget_key_size(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, CK_KEY_TYPE key_type)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak { CKA_VALUE, NULL_PTR, 0 }; /* DH, DES/DES3, AES, GENERIC */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, &modulus_sz, 1)) !=
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get modulus attribute size (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Convert key size to bits. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, &value_sz, 1)) !=
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get value attribute size (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Convert key size to bits. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, &prime_sz, 1)) !=
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get prime attribute size (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Convert key size to bits. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, &value_sz, 1)) !=
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get value attribute size (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Convert key size to bits -- omitting parity bit. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, &value_sz, 1)) !=
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get value attribute size (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Convert key size to bits. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Display private key.
7711facfe58561dd91d6ece0f5f41150c3956c83dinakdisplay_prikey(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 0 to 2 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 3 to 12 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 13 to 17 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* not displaying CKA_KEY_GEN_MECHANISM */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the sizes of the attributes we need. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for size info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get private key attribute sizes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Allocate memory for each variable-length attribute. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Now really get the attributes. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for attribute info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get private key attributes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Fill in all the optional temp variables. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &label, &label_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &subject, &subject_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_date(&(attrs[i++]), &start_date, &start_date_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_date(&(attrs[i++]), &end_date, &end_date_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the key size for the object. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Display the object ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the label and what it is (and key size in bits) ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("%d. \"%.*s\" (%d-bit %s %s)\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak gettext("<no label>"), key_size, keytype_str(key_type),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the id ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the subject name ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak hex_subject_len = 2 * subject_len + 1; /* best guesstimate */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((hex_subject = malloc(hex_subject_len)) == NULL) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the start date ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (start_date_len == (CK_ULONG)-1 || start_date_len == 0)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tStart Date: --\n"));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "\tStart Date: %02.2s/%02.2s/%04.4s\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak start_date->month, start_date->day, start_date->year);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the end date ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (end_date_len == (CK_ULONG)-1 || end_date_len == 0)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "\tEnd Date: %02.2s/%02.2s/%04.4s\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... and its capabilities */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak private != pk_false ? gettext("private") : gettext("public"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, ", %s", attr_str(attrs[i].type));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Display public key.
7711facfe58561dd91d6ece0f5f41150c3956c83dinakdisplay_pubkey(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 0 to 3 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 4 to 9 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 10 to 14 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* not displaying CKA_KEY_GEN_MECHANISM */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the sizes of the attributes we need. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for size info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get public key attribute sizes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Allocate memory for each variable-length attribute. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Now really get the attributes. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for attribute info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get public key attributes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Fill in all the optional temp variables. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &label, &label_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &subject, &subject_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_date(&(attrs[i++]), &start_date, &start_date_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_date(&(attrs[i++]), &end_date, &end_date_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the key size for the object. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Display the object ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the label and what it is (and key size in bits) ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("%d. \"%.*s\" (%d-bit %s %s)\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak gettext("<no label>"), key_size, keytype_str(key_type),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the id ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the subject name ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak hex_subject_len = 2 * subject_len + 1; /* best guesstimate */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((hex_subject = malloc(hex_subject_len)) == NULL) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the start date ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (start_date_len == (CK_ULONG)-1 || start_date_len == 0)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tStart Date: --\n"));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "\tStart Date: %02.2s/%02.2s/%04.4s\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak start_date->month, start_date->day, start_date->year);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the end date ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (end_date_len == (CK_ULONG)-1 || end_date_len == 0)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "\tEnd Date: %02.2s/%02.2s/%04.4s\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... and its capabilities */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak private == B_TRUE ? gettext("private") : gettext("public"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak trusted == B_TRUE ? gettext("trusted") : gettext("untrusted"));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, ", %s", attr_str(attrs[i].type));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Display secret key.
7711facfe58561dd91d6ece0f5f41150c3956c83dinakdisplay_seckey(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 0 to 2 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 3 to 14 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* 15 to 18 */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* not displaying CKA_KEY_GEN_MECHANISM */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the sizes of the attributes we need. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for size info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get secret key attribute sizes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Allocate memory for each variable-length attribute. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Now really get the attributes. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for attribute info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get secret key attributes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Fill in all the optional temp variables. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &label, &label_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_date(&(attrs[i++]), &start_date, &start_date_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_date(&(attrs[i++]), &end_date, &end_date_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the key size for the object. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Display the object ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the label and what it is (and key size in bytes) ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("%d. \"%.*s\" (%d-bit %s %s)\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak gettext("<no label>"), key_size, keytype_str(key_type),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the id ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the start date ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (start_date_len == (CK_ULONG)-1 || start_date_len == 0)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tStart Date: --\n"));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "\tStart Date: %02.2s/%02.2s/%04.4s\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak start_date->month, start_date->day, start_date->year);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the end date ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (end_date_len == (CK_ULONG)-1 || end_date_len == 0)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "\tEnd Date: %02.2s/%02.2s/%04.4s\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... and its capabilities */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak private == B_TRUE ? gettext("private") : gettext("public"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, ", %s", attr_str(attrs[i].type));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Display certificate.
7711facfe58561dd91d6ece0f5f41150c3956c83dinakdisplay_cert(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj, int counter)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak CK_ULONG n_attrs = sizeof (attrs) / sizeof (CK_ATTRIBUTE);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the sizes of the attributes we need. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for size info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get certificate attribute sizes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Allocate memory for each variable-length attribute. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((attrs[i].pValue = malloc(attrs[i].ulValueLen)) == NULL) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Now really get the attributes. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for attribute info");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, obj, attrs, n_attrs)) != CKR_OK) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get certificate attributes (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Fill in all the temp variables. Subject and value are required.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * The rest are optional.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &subject, &subject_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &value, &value_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &label, &label_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &issuer, &issuer_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak copy_attr_to_string(&(attrs[i++]), &serial, &serial_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Display the object ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the label and what it is ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("%d. \"%.*s\" (%s %s)\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak gettext("<no label>"), "X.509", class_str(CKO_CERTIFICATE));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... its capabilities ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak private == B_TRUE ? gettext("private") : gettext("public"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak trusted == B_TRUE ? gettext("trusted") : gettext("untrusted"));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the id ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak octetify(id, id_len, hex_id, hex_id_len, B_FALSE, B_FALSE, 60,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tId: %s\n"), hex_id);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the subject name ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak hex_subject_len = 2 * subject_len + 1; /* best guesstimate */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((hex_subject = malloc(hex_subject_len)) == NULL) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the issuer name ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak hex_issuer_len = 2 * issuer_len + 1; /* best guesstimate */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak rdnseq_to_str(issuer, issuer_len, hex_issuer, hex_issuer_len);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... the serial number ... */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak octetify(serial, serial_len, hex_serial, hex_serial_len,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak for (i = 0; i < serial_len; i++) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tSerial: %s (%d)\n"),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* ... and the value */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) fprintf(stdout, gettext("\tValue: %s\n"), hex_value);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * List token object.
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak extern char *optarg_av;
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Parse command line options. Do NOT i18n/l10n. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak switch (opt) {
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak /* If no token is specified, default is to use softtoken. */
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak * Parse token specifier into token_name, manuf_id, serial_no.
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak * Token_name is required; manuf_id and serial_no are optional.
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak if (parse_token_spec(token_spec, &token_name, &manuf_id,
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak /* If no object type specified, default is public objects. */
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak * Otherwise, the object type must be "public", "private",
49e212991a3065f7e499a4b29ae8d8eaf33f3135dinak * or "both".
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* No additional args allowed. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Done parsing command line options. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak full_token_name(token_name, manuf_id, serial_no, full_name);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Find the slot with token. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = find_token_slot(token_name, manuf_id, serial_no, &slot_id,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* If private objects are to be listed, user must be logged in. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get the user's PIN. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = get_pin(gettext("Enter token passphrase:"), NULL,
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Logging in user R/O into the token is sufficient. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = quick_start(slot_id, 0, pin, pinlen, &sess)) !=
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Otherwise, just create a session. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Find the object(s) with the given label and/or type. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = find_objs(sess, obj_type, list_label, &objs, &num_objs)) !=
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to find token objects (%s)."), pkcs11_strerror(rv));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptoerror(LOG_STDERR, gettext("No objects found."));
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (0);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* List the objects found. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak for (i = 0; i < num_objs; i++) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Get object class first, then decide what is next. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak cryptodebug("calling C_GetAttributeValue for object class");
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = C_GetAttributeValue(sess, objs[i], &class_attr, 1))
7711facfe58561dd91d6ece0f5f41150c3956c83dinak "Unable to get object #%d class attribute (%s)."),
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Display based on the type of object. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = display_cert(sess, objs[i], i+1)) != CKR_OK)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = display_pubkey(sess, objs[i], i+1)) != CKR_OK)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = display_prikey(sess, objs[i], i+1)) != CKR_OK)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((rv = display_seckey(sess, objs[i], i+1)) != CKR_OK)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak /* Clean up. */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (0);