13089Swyllys /* 23089Swyllys * CDDL HEADER START 33089Swyllys * 43089Swyllys * 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. 73089Swyllys * 83089Swyllys * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 93089Swyllys * or http://www.opensolaris.org/os/licensing. 103089Swyllys * See the License for the specific language governing permissions 113089Swyllys * and limitations under the License. 123089Swyllys * 133089Swyllys * When distributing Covered Code, include this CDDL HEADER in each 143089Swyllys * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 153089Swyllys * If applicable, add the following below this CDDL HEADER, with the 163089Swyllys * fields enclosed by brackets "[]" replaced with your own identifying 173089Swyllys * information: Portions Copyright [yyyy] [name of copyright owner] 183089Swyllys * 193089Swyllys * CDDL HEADER END 203089Swyllys * 21*5051Swyllys * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 223089Swyllys * Use is subject to license terms. 233089Swyllys */ 243089Swyllys 253089Swyllys #pragma ident "%Z%%M% %I% %E% SMI" 263089Swyllys 273089Swyllys #include <stdio.h> 283089Swyllys #include <strings.h> 293089Swyllys #include <ctype.h> 303089Swyllys #include <libgen.h> 313089Swyllys #include <libintl.h> 323089Swyllys #include <errno.h> 333089Swyllys #include <kmfapiP.h> 343089Swyllys 353089Swyllys #include "util.h" 363089Swyllys 373089Swyllys static void 383089Swyllys show_policy(KMF_POLICY_RECORD *plc) 393089Swyllys { 403089Swyllys int i; 413089Swyllys if (plc == NULL) 423089Swyllys return; 433089Swyllys 443089Swyllys (void) printf("Name: %s\n", plc->name); 453089Swyllys 463089Swyllys (void) printf(gettext("Ignore Date: %s\n"), 47*5051Swyllys plc->ignore_date ? gettext("true") : gettext("false")); 483089Swyllys 493089Swyllys (void) printf(gettext("Ignore Unknown EKUs: %s\n"), 50*5051Swyllys plc->ignore_unknown_ekus ? gettext("true") : gettext("false")); 513089Swyllys 523089Swyllys (void) printf(gettext("Ignore TA: %s\n"), 53*5051Swyllys plc->ignore_trust_anchor ? gettext("true") : gettext("false")); 543089Swyllys 553089Swyllys (void) printf(gettext("Validity Adjusted Time: %s\n"), 56*5051Swyllys plc->validity_adjusttime ? plc->validity_adjusttime : "<null>"); 573089Swyllys 583089Swyllys if (plc->ta_name == NULL && plc->ta_serial == NULL) { 593089Swyllys (void) printf(gettext("Trust Anchor Certificate: <null>\n")); 603089Swyllys } else { 613089Swyllys (void) printf(gettext("Trust Anchor Certificate:\n")); 623089Swyllys (void) printf(gettext("\tName: %s\n"), 63*5051Swyllys plc->ta_name ? plc->ta_name : "<null>"); 643089Swyllys (void) printf(gettext("\tSerial Number: %s\n"), 65*5051Swyllys plc->ta_serial ? plc->ta_serial : "<null>"); 663089Swyllys } 673089Swyllys 683089Swyllys if (plc->ku_bits != 0) { 693089Swyllys (void) printf(gettext("Key Usage Bits: ")); 703089Swyllys for (i = KULOWBIT; i <= KUHIGHBIT; i++) { 71*5051Swyllys char *s = kmf_ku_to_string( 72*5051Swyllys (plc->ku_bits & (1<<i))); 733089Swyllys if (s != NULL) { 743089Swyllys (void) printf("%s ", s); 753089Swyllys } 763089Swyllys } 773089Swyllys (void) printf("\n"); 783089Swyllys } else { 793089Swyllys (void) printf(gettext("Key Usage Bits: 0\n")); 803089Swyllys } 813089Swyllys 823089Swyllys if (plc->eku_set.eku_count > 0) { 833089Swyllys (void) printf(gettext("Extended Key Usage Values:\n")); 843089Swyllys for (i = 0; i < plc->eku_set.eku_count; i++) { 85*5051Swyllys char *s = kmf_oid_to_eku_string( 86*5051Swyllys &plc->eku_set.ekulist[i]); 873089Swyllys (void) printf("\t%s\t(%s)\n", 88*5051Swyllys kmf_oid_to_string(&plc->eku_set.ekulist[i]), 89*5051Swyllys s ? s : "unknown"); 903089Swyllys } 913089Swyllys } else { 923089Swyllys (void) printf(gettext("Extended Key Usage Values: <null>\n")); 933089Swyllys } 943089Swyllys 953089Swyllys (void) printf(gettext("Validation Policy Information:\n")); 963089Swyllys 973089Swyllys if (plc->revocation & KMF_REVOCATION_METHOD_OCSP) { 983089Swyllys (void) printf(gettext(" OCSP:\n")); 993089Swyllys 1003089Swyllys (void) printf(gettext("\tResponder URI: %s\n"), 1013089Swyllys plc->VAL_OCSP_BASIC.responderURI ? 1023089Swyllys plc->VAL_OCSP_BASIC.responderURI : "<null>"); 1033089Swyllys 1043089Swyllys (void) printf(gettext("\tProxy: %s\n"), 1053089Swyllys plc->VAL_OCSP_BASIC.proxy ? 1063089Swyllys plc->VAL_OCSP_BASIC.proxy : "<null>"); 1073089Swyllys 1083089Swyllys (void) printf(gettext("\tUse ResponderURI from Certificate: " 1093089Swyllys "%s\n"), plc->VAL_OCSP_BASIC.uri_from_cert ? 1103089Swyllys gettext("true") : gettext("false")); 1113089Swyllys 1123089Swyllys (void) printf(gettext("\tResponse lifetime: %s\n"), 1133089Swyllys plc->VAL_OCSP_BASIC.response_lifetime ? 1143089Swyllys plc->VAL_OCSP_BASIC.response_lifetime : "<null>"); 1153089Swyllys 1163089Swyllys (void) printf(gettext("\tIgnore Response signature: %s\n"), 1173089Swyllys plc->VAL_OCSP_BASIC.ignore_response_sign ? 1183089Swyllys gettext("true") : gettext("false")); 1193089Swyllys 1203089Swyllys if (!plc->VAL_OCSP.has_resp_cert) { 1213089Swyllys (void) printf(gettext("\tResponder Certificate:" 1223089Swyllys " <null>\n")); 1233089Swyllys } else { 1243089Swyllys (void) printf(gettext("\tResponder Certificate:\n")); 1253089Swyllys (void) printf(gettext("\t\tName: %s\n"), 1263089Swyllys plc->VAL_OCSP_RESP_CERT.name ? 1273089Swyllys plc->VAL_OCSP_RESP_CERT.name : "<null>"); 1283089Swyllys (void) printf(gettext("\t\tSerial: %s\n"), 1293089Swyllys plc->VAL_OCSP_RESP_CERT.serial ? 1303089Swyllys plc->VAL_OCSP_RESP_CERT.serial : "<null>"); 1313089Swyllys } 1323089Swyllys } 1333089Swyllys 1343089Swyllys if (plc->revocation & KMF_REVOCATION_METHOD_CRL) { 1353089Swyllys (void) printf(gettext(" CRL:\n")); 1363089Swyllys 1373089Swyllys (void) printf(gettext("\tBase filename: %s\n"), 1383089Swyllys plc->validation_info.crl_info.basefilename ? 1393089Swyllys plc->validation_info.crl_info.basefilename : "<null>"); 1403089Swyllys 1413089Swyllys (void) printf(gettext("\tDirectory: %s\n"), 1423089Swyllys plc->validation_info.crl_info.directory ? 1433089Swyllys plc->validation_info.crl_info.directory : "<null>"); 1443089Swyllys 1453089Swyllys (void) printf(gettext("\tDownload and cache CRL: %s\n"), 146*5051Swyllys plc->validation_info.crl_info.get_crl_uri ? 147*5051Swyllys gettext("true") : gettext("false")); 1483089Swyllys 1493089Swyllys (void) printf(gettext("\tProxy: %s\n"), 1503089Swyllys plc->validation_info.crl_info.proxy ? 1513089Swyllys plc->validation_info.crl_info.proxy : "<null>"); 1523089Swyllys 1533089Swyllys (void) printf(gettext("\tIgnore CRL signature: %s\n"), 154*5051Swyllys plc->validation_info.crl_info.ignore_crl_sign ? 155*5051Swyllys gettext("true") : gettext("false")); 1563089Swyllys 1573089Swyllys (void) printf(gettext("\tIgnore CRL validity date: %s\n"), 158*5051Swyllys plc->validation_info.crl_info.ignore_crl_date ? 159*5051Swyllys gettext("true") : gettext("false")); 1603089Swyllys } 1613089Swyllys 1623089Swyllys (void) printf("\n"); 1633089Swyllys } 1643089Swyllys 1653089Swyllys int 1663089Swyllys kc_list(int argc, char *argv[]) 1673089Swyllys { 1683089Swyllys int rv = KC_OK; 1693089Swyllys int opt, found = 0; 1703089Swyllys extern int optind_av; 1713089Swyllys extern char *optarg_av; 1723089Swyllys char *filename = NULL; 1733089Swyllys char *policyname = NULL; 1743089Swyllys POLICY_LIST *plclist = NULL, *pnode; 1753089Swyllys int sanity_err = 0; 1763089Swyllys 1773089Swyllys while ((opt = getopt_av(argc, argv, "i:(dbfile)p:(policy)")) != EOF) { 1783089Swyllys switch (opt) { 1793089Swyllys case 'i': 1803089Swyllys filename = get_string(optarg_av, &rv); 1813089Swyllys if (filename == NULL) { 1823089Swyllys (void) fprintf(stderr, 1833089Swyllys gettext("Error dbfile input.\n")); 1843089Swyllys } 1853089Swyllys break; 1863089Swyllys case 'p': 1873089Swyllys policyname = get_string(optarg_av, &rv); 1883089Swyllys if (policyname == NULL) { 1893089Swyllys (void) fprintf(stderr, 1903089Swyllys gettext("Error policy name.\n")); 1913089Swyllys } 1923089Swyllys break; 1933089Swyllys default: 1943089Swyllys (void) fprintf(stderr, 1953089Swyllys gettext("Error input option.\n")); 1963089Swyllys rv = KC_ERR_USAGE; 1973089Swyllys break; 1983089Swyllys } 1993089Swyllys if (rv != KC_OK) 2003089Swyllys goto out; 2013089Swyllys } 2023089Swyllys 2033089Swyllys /* No additional args allowed. */ 2043089Swyllys argc -= optind_av; 2053089Swyllys if (argc) { 2063089Swyllys (void) fprintf(stderr, 2073089Swyllys gettext("Error input option\n")); 2083089Swyllys rv = KC_ERR_USAGE; 2093089Swyllys goto out; 2103089Swyllys } 2113089Swyllys 2123089Swyllys if (filename == NULL) { 2133089Swyllys filename = strdup(KMF_DEFAULT_POLICY_FILE); 2143089Swyllys if (filename == NULL) { 2153089Swyllys rv = KC_ERR_MEMORY; 2163089Swyllys goto out; 2173089Swyllys } 2183089Swyllys } 2193089Swyllys 2203089Swyllys /* Check the access permission of the policy DB */ 2213089Swyllys if (access(filename, R_OK) < 0) { 2223089Swyllys int err = errno; 2233089Swyllys (void) fprintf(stderr, 2243089Swyllys gettext("Cannot access \"%s\" for list - %s\n"), filename, 2253089Swyllys strerror(err)); 2263089Swyllys rv = KC_ERR_ACCESS; 2273089Swyllys goto out; 2283089Swyllys } 2293089Swyllys 2303089Swyllys rv = load_policies(filename, &plclist); 2313089Swyllys if (rv != KMF_OK) { 2323089Swyllys goto out; 2333089Swyllys } 2343089Swyllys 2353089Swyllys pnode = plclist; 2363089Swyllys while (pnode != NULL) { 2373089Swyllys if (policyname == NULL || 238*5051Swyllys strcmp(policyname, pnode->plc.name) == 0) { 2393089Swyllys KMF_POLICY_RECORD *plc = &pnode->plc; 2403089Swyllys 2413089Swyllys found++; 242*5051Swyllys rv = kmf_verify_policy(plc); 2433089Swyllys if (rv != KMF_OK) { 2443089Swyllys (void) fprintf(stderr, gettext( 2453089Swyllys "Policy Name: '%s' is invalid\n"), 2463089Swyllys plc->name); 2473089Swyllys sanity_err++; 2483089Swyllys } else { 2493089Swyllys show_policy(&pnode->plc); 2503089Swyllys } 2513089Swyllys } 2523089Swyllys pnode = pnode->next; 2533089Swyllys } 2543089Swyllys 2553089Swyllys free_policy_list(plclist); 2563089Swyllys 2573089Swyllys if (!found) { 2583089Swyllys if (policyname) 2593089Swyllys (void) fprintf(stderr, gettext( 2603089Swyllys "Cannot find policy '%s'\n"), policyname); 2613089Swyllys else 2623089Swyllys (void) fprintf(stderr, gettext("Cannot find " 2633089Swyllys "any policies to display\n")); 2643089Swyllys rv = KC_ERR_FIND_POLICY; 2653089Swyllys } else if (sanity_err) { 2663089Swyllys rv = KC_ERR_VERIFY_POLICY; 2673089Swyllys } 2683089Swyllys 2693089Swyllys out: 2703089Swyllys 2713089Swyllys if (filename != NULL) 2723089Swyllys free(filename); 2733089Swyllys 2743089Swyllys if (policyname != NULL) 2753089Swyllys free(policyname); 2763089Swyllys 2773089Swyllys return (rv); 2783089Swyllys } 279