xref: /onnv-gate/usr/src/cmd/cmd-crypto/kmfcfg/list.c (revision 5051:cbbb7c8b40a9)
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