199ebb4caSwyllys /* 299ebb4caSwyllys * CDDL HEADER START 399ebb4caSwyllys * 499ebb4caSwyllys * The contents of this file are subject to the terms of the 599ebb4caSwyllys * Common Development and Distribution License (the "License"). 699ebb4caSwyllys * You may not use this file except in compliance with the License. 799ebb4caSwyllys * 899ebb4caSwyllys * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 999ebb4caSwyllys * or http://www.opensolaris.org/os/licensing. 1099ebb4caSwyllys * See the License for the specific language governing permissions 1199ebb4caSwyllys * and limitations under the License. 1299ebb4caSwyllys * 1399ebb4caSwyllys * When distributing Covered Code, include this CDDL HEADER in each 1499ebb4caSwyllys * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1599ebb4caSwyllys * If applicable, add the following below this CDDL HEADER, with the 1699ebb4caSwyllys * fields enclosed by brackets "[]" replaced with your own identifying 1799ebb4caSwyllys * information: Portions Copyright [yyyy] [name of copyright owner] 1899ebb4caSwyllys * 1999ebb4caSwyllys * CDDL HEADER END 2099ebb4caSwyllys * 21269e59f9SJan Pechanec * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 2299ebb4caSwyllys */ 2399ebb4caSwyllys 2499ebb4caSwyllys #include <stdio.h> 2599ebb4caSwyllys #include <strings.h> 2699ebb4caSwyllys #include <ctype.h> 2799ebb4caSwyllys #include <libgen.h> 2899ebb4caSwyllys #include <libintl.h> 2999ebb4caSwyllys #include <errno.h> 30431deaa0Shylee #include <sys/stat.h> 3199ebb4caSwyllys #include <kmfapiP.h> 3299ebb4caSwyllys #include "util.h" 3399ebb4caSwyllys 34431deaa0Shylee #define LIB_NSS_PATH "/usr/lib/mps/libnss3.so" 35431deaa0Shylee #define LIB_NSPR_PATH "/usr/lib/mps/libnspr4.so" 36431deaa0Shylee 3799ebb4caSwyllys static void 3899ebb4caSwyllys show_policy(KMF_POLICY_RECORD *plc) 3999ebb4caSwyllys { 4099ebb4caSwyllys int i; 4199ebb4caSwyllys if (plc == NULL) 4299ebb4caSwyllys return; 4399ebb4caSwyllys 4499ebb4caSwyllys (void) printf("Name: %s\n", plc->name); 4599ebb4caSwyllys 4699ebb4caSwyllys (void) printf(gettext("Ignore Date: %s\n"), 4799ebb4caSwyllys plc->ignore_date ? gettext("true") : gettext("false")); 4899ebb4caSwyllys 4999ebb4caSwyllys (void) printf(gettext("Ignore Unknown EKUs: %s\n"), 5099ebb4caSwyllys plc->ignore_unknown_ekus ? gettext("true") : gettext("false")); 5199ebb4caSwyllys 5299ebb4caSwyllys (void) printf(gettext("Ignore TA: %s\n"), 5399ebb4caSwyllys plc->ignore_trust_anchor ? gettext("true") : gettext("false")); 5499ebb4caSwyllys 5599ebb4caSwyllys (void) printf(gettext("Validity Adjusted Time: %s\n"), 5630a5e8faSwyllys plc->validity_adjusttime ? plc->validity_adjusttime : "<null>"); 5799ebb4caSwyllys 5899ebb4caSwyllys if (plc->ta_name == NULL && plc->ta_serial == NULL) { 5999ebb4caSwyllys (void) printf(gettext("Trust Anchor Certificate: <null>\n")); 60*fc2613b0SWyllys Ingersoll } else if (strcasecmp(plc->ta_name, "search") == 0) { 61*fc2613b0SWyllys Ingersoll (void) printf(gettext("Trust Anchor Certificate: " 62*fc2613b0SWyllys Ingersoll "Search by Issuer\n")); 6399ebb4caSwyllys } else { 6499ebb4caSwyllys (void) printf(gettext("Trust Anchor Certificate:\n")); 6599ebb4caSwyllys (void) printf(gettext("\tName: %s\n"), 6699ebb4caSwyllys plc->ta_name ? plc->ta_name : "<null>"); 6799ebb4caSwyllys (void) printf(gettext("\tSerial Number: %s\n"), 6899ebb4caSwyllys plc->ta_serial ? plc->ta_serial : "<null>"); 6999ebb4caSwyllys } 7099ebb4caSwyllys 7199ebb4caSwyllys if (plc->ku_bits != 0) { 7299ebb4caSwyllys (void) printf(gettext("Key Usage Bits: ")); 7399ebb4caSwyllys for (i = KULOWBIT; i <= KUHIGHBIT; i++) { 7430a5e8faSwyllys char *s = kmf_ku_to_string( 7530a5e8faSwyllys (plc->ku_bits & (1<<i))); 7699ebb4caSwyllys if (s != NULL) { 7799ebb4caSwyllys (void) printf("%s ", s); 7899ebb4caSwyllys } 7999ebb4caSwyllys } 8099ebb4caSwyllys (void) printf("\n"); 8199ebb4caSwyllys } else { 8299ebb4caSwyllys (void) printf(gettext("Key Usage Bits: 0\n")); 8399ebb4caSwyllys } 8499ebb4caSwyllys 8599ebb4caSwyllys if (plc->eku_set.eku_count > 0) { 8699ebb4caSwyllys (void) printf(gettext("Extended Key Usage Values:\n")); 8799ebb4caSwyllys for (i = 0; i < plc->eku_set.eku_count; i++) { 88d00756ccSwyllys char *s = kmf_oid_to_ekuname( 8930a5e8faSwyllys &plc->eku_set.ekulist[i]); 9099ebb4caSwyllys (void) printf("\t%s\t(%s)\n", 9130a5e8faSwyllys kmf_oid_to_string(&plc->eku_set.ekulist[i]), 9299ebb4caSwyllys s ? s : "unknown"); 9399ebb4caSwyllys } 9499ebb4caSwyllys } else { 9599ebb4caSwyllys (void) printf(gettext("Extended Key Usage Values: <null>\n")); 9699ebb4caSwyllys } 9799ebb4caSwyllys 9899ebb4caSwyllys (void) printf(gettext("Validation Policy Information:\n")); 9999ebb4caSwyllys 10099ebb4caSwyllys if (plc->revocation & KMF_REVOCATION_METHOD_OCSP) { 10199ebb4caSwyllys (void) printf(gettext(" OCSP:\n")); 10299ebb4caSwyllys 10399ebb4caSwyllys (void) printf(gettext("\tResponder URI: %s\n"), 10499ebb4caSwyllys plc->VAL_OCSP_BASIC.responderURI ? 10599ebb4caSwyllys plc->VAL_OCSP_BASIC.responderURI : "<null>"); 10699ebb4caSwyllys 10799ebb4caSwyllys (void) printf(gettext("\tProxy: %s\n"), 10899ebb4caSwyllys plc->VAL_OCSP_BASIC.proxy ? 10999ebb4caSwyllys plc->VAL_OCSP_BASIC.proxy : "<null>"); 11099ebb4caSwyllys 11199ebb4caSwyllys (void) printf(gettext("\tUse ResponderURI from Certificate: " 11299ebb4caSwyllys "%s\n"), plc->VAL_OCSP_BASIC.uri_from_cert ? 11399ebb4caSwyllys gettext("true") : gettext("false")); 11499ebb4caSwyllys 11599ebb4caSwyllys (void) printf(gettext("\tResponse lifetime: %s\n"), 11699ebb4caSwyllys plc->VAL_OCSP_BASIC.response_lifetime ? 11799ebb4caSwyllys plc->VAL_OCSP_BASIC.response_lifetime : "<null>"); 11899ebb4caSwyllys 11999ebb4caSwyllys (void) printf(gettext("\tIgnore Response signature: %s\n"), 12099ebb4caSwyllys plc->VAL_OCSP_BASIC.ignore_response_sign ? 12199ebb4caSwyllys gettext("true") : gettext("false")); 12299ebb4caSwyllys 12399ebb4caSwyllys if (!plc->VAL_OCSP.has_resp_cert) { 12499ebb4caSwyllys (void) printf(gettext("\tResponder Certificate:" 12599ebb4caSwyllys " <null>\n")); 12699ebb4caSwyllys } else { 12799ebb4caSwyllys (void) printf(gettext("\tResponder Certificate:\n")); 12899ebb4caSwyllys (void) printf(gettext("\t\tName: %s\n"), 12999ebb4caSwyllys plc->VAL_OCSP_RESP_CERT.name ? 13099ebb4caSwyllys plc->VAL_OCSP_RESP_CERT.name : "<null>"); 13199ebb4caSwyllys (void) printf(gettext("\t\tSerial: %s\n"), 13299ebb4caSwyllys plc->VAL_OCSP_RESP_CERT.serial ? 13399ebb4caSwyllys plc->VAL_OCSP_RESP_CERT.serial : "<null>"); 13499ebb4caSwyllys } 13599ebb4caSwyllys } 13699ebb4caSwyllys 13799ebb4caSwyllys if (plc->revocation & KMF_REVOCATION_METHOD_CRL) { 13899ebb4caSwyllys (void) printf(gettext(" CRL:\n")); 13999ebb4caSwyllys 14099ebb4caSwyllys (void) printf(gettext("\tBase filename: %s\n"), 14199ebb4caSwyllys plc->validation_info.crl_info.basefilename ? 14299ebb4caSwyllys plc->validation_info.crl_info.basefilename : "<null>"); 14399ebb4caSwyllys 14499ebb4caSwyllys (void) printf(gettext("\tDirectory: %s\n"), 14599ebb4caSwyllys plc->validation_info.crl_info.directory ? 14699ebb4caSwyllys plc->validation_info.crl_info.directory : "<null>"); 14799ebb4caSwyllys 14899ebb4caSwyllys (void) printf(gettext("\tDownload and cache CRL: %s\n"), 14999ebb4caSwyllys plc->validation_info.crl_info.get_crl_uri ? 15099ebb4caSwyllys gettext("true") : gettext("false")); 15199ebb4caSwyllys 15299ebb4caSwyllys (void) printf(gettext("\tProxy: %s\n"), 15399ebb4caSwyllys plc->validation_info.crl_info.proxy ? 15499ebb4caSwyllys plc->validation_info.crl_info.proxy : "<null>"); 15599ebb4caSwyllys 15699ebb4caSwyllys (void) printf(gettext("\tIgnore CRL signature: %s\n"), 15799ebb4caSwyllys plc->validation_info.crl_info.ignore_crl_sign ? 15899ebb4caSwyllys gettext("true") : gettext("false")); 15999ebb4caSwyllys 16099ebb4caSwyllys (void) printf(gettext("\tIgnore CRL validity date: %s\n"), 16199ebb4caSwyllys plc->validation_info.crl_info.ignore_crl_date ? 16299ebb4caSwyllys gettext("true") : gettext("false")); 16399ebb4caSwyllys } 164269e59f9SJan Pechanec (void) printf(gettext("Mapper name: %s\n"), 165269e59f9SJan Pechanec plc->mapper.mapname ? plc->mapper.mapname : "<null>"); 166269e59f9SJan Pechanec (void) printf(gettext("Mapper pathname: %s\n"), 167269e59f9SJan Pechanec plc->mapper.pathname ? plc->mapper.pathname : "<null>"); 168269e59f9SJan Pechanec (void) printf(gettext("Mapper directory: %s\n"), 169269e59f9SJan Pechanec plc->mapper.dir ? plc->mapper.dir : "<null>"); 170269e59f9SJan Pechanec (void) printf(gettext("Mapper options: %s\n"), 171269e59f9SJan Pechanec plc->mapper.options ? plc->mapper.options : "<null>"); 17299ebb4caSwyllys 17399ebb4caSwyllys (void) printf("\n"); 17499ebb4caSwyllys } 17599ebb4caSwyllys 176431deaa0Shylee void 177431deaa0Shylee show_plugin(void) 178431deaa0Shylee { 179431deaa0Shylee conf_entrylist_t *phead = NULL; 180431deaa0Shylee struct stat statbuf; 181431deaa0Shylee 182431deaa0Shylee (void) printf(gettext("KMF plugin information:\n")); 183431deaa0Shylee (void) printf(gettext("-----------------------\n")); 184431deaa0Shylee 185431deaa0Shylee /* List the built-in plugins */ 186431deaa0Shylee (void) printf("pkcs11:kmf_pkcs11.so.1 (built-in)\n"); 187431deaa0Shylee (void) printf("file:kmf_openssl.so.1 (built-in)\n"); 188431deaa0Shylee 189431deaa0Shylee /* 190431deaa0Shylee * If the NSS libraries are not installed in the system, 191431deaa0Shylee * then we will not show the nss plugin either. 192431deaa0Shylee */ 193431deaa0Shylee if (stat(LIB_NSS_PATH, &statbuf) == 0 && 194431deaa0Shylee stat(LIB_NSPR_PATH, &statbuf) == 0) { 195431deaa0Shylee (void) printf("nss:kmf_nss.so.1 (built-in)\n"); 196431deaa0Shylee } 197431deaa0Shylee 198431deaa0Shylee /* List non-default plugins, if there is any. */ 199431deaa0Shylee if (get_entrylist(&phead) == KMF_OK) { 200431deaa0Shylee while (phead != NULL) { 201431deaa0Shylee (void) printf("%s:%s", phead->entry->keystore, 202431deaa0Shylee phead->entry->modulepath); 203431deaa0Shylee 204431deaa0Shylee if (phead->entry->option == NULL) 205431deaa0Shylee (void) printf("\n"); 206431deaa0Shylee else 207431deaa0Shylee (void) printf(";option=%s\n", 208431deaa0Shylee phead->entry->option); 209431deaa0Shylee phead = phead->next; 210431deaa0Shylee } 211431deaa0Shylee free_entrylist(phead); 212431deaa0Shylee } 213431deaa0Shylee } 214431deaa0Shylee 215431deaa0Shylee 21699ebb4caSwyllys int 21799ebb4caSwyllys kc_list(int argc, char *argv[]) 21899ebb4caSwyllys { 21999ebb4caSwyllys int rv = KC_OK; 22099ebb4caSwyllys int opt, found = 0; 22199ebb4caSwyllys extern int optind_av; 22299ebb4caSwyllys extern char *optarg_av; 22399ebb4caSwyllys char *filename = NULL; 22499ebb4caSwyllys char *policyname = NULL; 22599ebb4caSwyllys POLICY_LIST *plclist = NULL, *pnode; 22699ebb4caSwyllys int sanity_err = 0; 227431deaa0Shylee boolean_t list_plugin = B_FALSE; 22899ebb4caSwyllys 229431deaa0Shylee while ((opt = getopt_av(argc, argv, "i:(dbfile)p:(policy)m(plugin)")) 230431deaa0Shylee != EOF) { 23199ebb4caSwyllys switch (opt) { 23299ebb4caSwyllys case 'i': 233431deaa0Shylee if (list_plugin) 234431deaa0Shylee rv = KC_ERR_USAGE; 235431deaa0Shylee else { 23699ebb4caSwyllys filename = get_string(optarg_av, &rv); 23799ebb4caSwyllys if (filename == NULL) { 23899ebb4caSwyllys (void) fprintf(stderr, 23999ebb4caSwyllys gettext("Error dbfile input.\n")); 24099ebb4caSwyllys } 241431deaa0Shylee } 24299ebb4caSwyllys break; 24399ebb4caSwyllys case 'p': 244431deaa0Shylee if (list_plugin) 245431deaa0Shylee rv = KC_ERR_USAGE; 246431deaa0Shylee else { 24799ebb4caSwyllys policyname = get_string(optarg_av, &rv); 24899ebb4caSwyllys if (policyname == NULL) { 24999ebb4caSwyllys (void) fprintf(stderr, 25099ebb4caSwyllys gettext("Error policy name.\n")); 25199ebb4caSwyllys } 252431deaa0Shylee } 253431deaa0Shylee break; 254431deaa0Shylee case 'm': 255431deaa0Shylee list_plugin = B_TRUE; 25699ebb4caSwyllys break; 25799ebb4caSwyllys default: 25899ebb4caSwyllys (void) fprintf(stderr, 25999ebb4caSwyllys gettext("Error input option.\n")); 26099ebb4caSwyllys rv = KC_ERR_USAGE; 26199ebb4caSwyllys break; 26299ebb4caSwyllys } 26399ebb4caSwyllys if (rv != KC_OK) 26499ebb4caSwyllys goto out; 26599ebb4caSwyllys } 26699ebb4caSwyllys 26799ebb4caSwyllys /* No additional args allowed. */ 26899ebb4caSwyllys argc -= optind_av; 26999ebb4caSwyllys if (argc) { 27099ebb4caSwyllys (void) fprintf(stderr, 27199ebb4caSwyllys gettext("Error input option\n")); 27299ebb4caSwyllys rv = KC_ERR_USAGE; 27399ebb4caSwyllys goto out; 27499ebb4caSwyllys } 27599ebb4caSwyllys 276431deaa0Shylee if (list_plugin) { 277431deaa0Shylee show_plugin(); 278431deaa0Shylee goto out; 279431deaa0Shylee } 280431deaa0Shylee 28199ebb4caSwyllys if (filename == NULL) { 28299ebb4caSwyllys filename = strdup(KMF_DEFAULT_POLICY_FILE); 28399ebb4caSwyllys if (filename == NULL) { 28499ebb4caSwyllys rv = KC_ERR_MEMORY; 28599ebb4caSwyllys goto out; 28699ebb4caSwyllys } 28799ebb4caSwyllys } 28899ebb4caSwyllys 28999ebb4caSwyllys /* Check the access permission of the policy DB */ 29099ebb4caSwyllys if (access(filename, R_OK) < 0) { 29199ebb4caSwyllys int err = errno; 29299ebb4caSwyllys (void) fprintf(stderr, 29399ebb4caSwyllys gettext("Cannot access \"%s\" for list - %s\n"), filename, 29499ebb4caSwyllys strerror(err)); 29599ebb4caSwyllys rv = KC_ERR_ACCESS; 29699ebb4caSwyllys goto out; 29799ebb4caSwyllys } 29899ebb4caSwyllys 29999ebb4caSwyllys rv = load_policies(filename, &plclist); 30099ebb4caSwyllys if (rv != KMF_OK) { 30199ebb4caSwyllys goto out; 30299ebb4caSwyllys } 30399ebb4caSwyllys 30499ebb4caSwyllys pnode = plclist; 30599ebb4caSwyllys while (pnode != NULL) { 30699ebb4caSwyllys if (policyname == NULL || 30799ebb4caSwyllys strcmp(policyname, pnode->plc.name) == 0) { 30899ebb4caSwyllys KMF_POLICY_RECORD *plc = &pnode->plc; 30999ebb4caSwyllys 31099ebb4caSwyllys found++; 31130a5e8faSwyllys rv = kmf_verify_policy(plc); 31299ebb4caSwyllys if (rv != KMF_OK) { 31399ebb4caSwyllys (void) fprintf(stderr, gettext( 31499ebb4caSwyllys "Policy Name: '%s' is invalid\n"), 31599ebb4caSwyllys plc->name); 31699ebb4caSwyllys sanity_err++; 31799ebb4caSwyllys } else { 31899ebb4caSwyllys show_policy(&pnode->plc); 31999ebb4caSwyllys } 32099ebb4caSwyllys } 32199ebb4caSwyllys pnode = pnode->next; 32299ebb4caSwyllys } 32399ebb4caSwyllys 32499ebb4caSwyllys free_policy_list(plclist); 32599ebb4caSwyllys 32699ebb4caSwyllys if (!found) { 32799ebb4caSwyllys if (policyname) 32899ebb4caSwyllys (void) fprintf(stderr, gettext( 32999ebb4caSwyllys "Cannot find policy '%s'\n"), policyname); 33099ebb4caSwyllys else 33199ebb4caSwyllys (void) fprintf(stderr, gettext("Cannot find " 33299ebb4caSwyllys "any policies to display\n")); 33399ebb4caSwyllys rv = KC_ERR_FIND_POLICY; 33499ebb4caSwyllys } else if (sanity_err) { 33599ebb4caSwyllys rv = KC_ERR_VERIFY_POLICY; 33699ebb4caSwyllys } 33799ebb4caSwyllys 33899ebb4caSwyllys out: 33999ebb4caSwyllys 34099ebb4caSwyllys if (filename != NULL) 34199ebb4caSwyllys free(filename); 34299ebb4caSwyllys 34399ebb4caSwyllys if (policyname != NULL) 34499ebb4caSwyllys free(policyname); 34599ebb4caSwyllys 34699ebb4caSwyllys return (rv); 34799ebb4caSwyllys } 348