xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/delete.c (revision 3408:67ca9373b99e)
117Sdinak /*
217Sdinak  * CDDL HEADER START
317Sdinak  *
417Sdinak  * 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.
717Sdinak  *
817Sdinak  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
917Sdinak  * or http://www.opensolaris.org/os/licensing.
1017Sdinak  * See the License for the specific language governing permissions
1117Sdinak  * and limitations under the License.
1217Sdinak  *
1317Sdinak  * When distributing Covered Code, include this CDDL HEADER in each
1417Sdinak  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1517Sdinak  * If applicable, add the following below this CDDL HEADER, with the
1617Sdinak  * fields enclosed by brackets "[]" replaced with your own identifying
1717Sdinak  * information: Portions Copyright [yyyy] [name of copyright owner]
1817Sdinak  *
1917Sdinak  * CDDL HEADER END
2017Sdinak  */
2117Sdinak /*
22*3408Swyllys  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
2317Sdinak  * Use is subject to license terms.
2417Sdinak  */
2517Sdinak 
2617Sdinak #pragma ident	"%Z%%M%	%I%	%E% SMI"
2717Sdinak 
2817Sdinak /*
2917Sdinak  * This file implements the token object delete operation for this tool.
3017Sdinak  * It loads the PKCS#11 modules, finds the object to delete, deletes it,
3117Sdinak  * and cleans up.  User must be R/W logged into the token.
3217Sdinak  */
3317Sdinak 
3417Sdinak #include <stdio.h>
3517Sdinak #include <string.h>
3617Sdinak #include <cryptoutil.h>
3717Sdinak #include <security/cryptoki.h>
3817Sdinak #include "common.h"
393089Swyllys #include <kmfapi.h>
403089Swyllys 
413089Swyllys static KMF_RETURN
423089Swyllys pk_destroy_keys(void *handle, KMF_KEY_HANDLE *keys,
433089Swyllys 	KMF_FINDKEY_PARAMS *fkparams, uint32_t numkeys)
443089Swyllys {
453089Swyllys 	int i;
463089Swyllys 	KMF_RETURN rv = KMF_OK;
473089Swyllys 	KMF_DELETEKEY_PARAMS dkparams;
483089Swyllys 
493089Swyllys 	(void) memset(&dkparams, 0, sizeof (dkparams));
503089Swyllys 	dkparams.kstype = fkparams->kstype;
513089Swyllys 
523089Swyllys 	switch (fkparams->kstype) {
533089Swyllys 	case KMF_KEYSTORE_NSS:
543089Swyllys 		dkparams.nssparms = fkparams->nssparms;
553089Swyllys 		dkparams.cred = fkparams->cred;
563089Swyllys 		break;
573089Swyllys 	case KMF_KEYSTORE_OPENSSL:
583089Swyllys 		break;
593089Swyllys 	case KMF_KEYSTORE_PK11TOKEN:
603089Swyllys 		dkparams.cred = fkparams->cred;
613089Swyllys 		break;
623089Swyllys 	default:
633089Swyllys 		return (PK_ERR_USAGE);
643089Swyllys 	}
653089Swyllys 
663089Swyllys 	for (i = 0; rv == KMF_OK && i < numkeys; i++) {
673089Swyllys 		rv = KMF_DeleteKeyFromKeystore(handle, &dkparams, &keys[i]);
683089Swyllys 	}
693089Swyllys 	return (rv);
703089Swyllys }
713089Swyllys 
723089Swyllys static KMF_RETURN
733089Swyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc,
743089Swyllys 	int *keysdeleted)
753089Swyllys {
763089Swyllys 	KMF_RETURN rv = KMF_OK;
773089Swyllys 	uint32_t numkeys = 0;
783089Swyllys 
793089Swyllys 	*keysdeleted = 0;
803089Swyllys 	numkeys = 0;
813089Swyllys 	rv = KMF_FindKey(kmfhandle, parms, NULL, &numkeys);
823089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
833089Swyllys 		KMF_KEY_HANDLE *keys = NULL;
843089Swyllys 		char prompt[1024];
853089Swyllys 
863089Swyllys 		(void) snprintf(prompt, sizeof (prompt),
873089Swyllys 			gettext("%d %s key(s) found, do you want "
883089Swyllys 			"to delete them (y/N) ?"), numkeys,
893089Swyllys 			(desc != NULL ? desc : ""));
903089Swyllys 
913089Swyllys 		if (!yesno(prompt,
923089Swyllys 			gettext("Respond with yes or no.\n"),
933089Swyllys 			B_FALSE)) {
943089Swyllys 			return (KMF_OK);
953089Swyllys 		}
963089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
973089Swyllys 				sizeof (KMF_KEY_HANDLE));
983089Swyllys 		if (keys == NULL)
993089Swyllys 			return (KMF_ERR_MEMORY);
1003089Swyllys 		(void) memset(keys, 0, numkeys *
1013089Swyllys 			sizeof (KMF_KEY_HANDLE));
1023089Swyllys 
1033089Swyllys 		rv = KMF_FindKey(kmfhandle, parms, keys, &numkeys);
1043089Swyllys 		if (rv == KMF_OK) {
1053089Swyllys 			rv = pk_destroy_keys(kmfhandle, keys,
1063089Swyllys 				parms, numkeys);
1073089Swyllys 		}
1083089Swyllys 
1093089Swyllys 		free(keys);
1103089Swyllys 	}
1113089Swyllys 
1123089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND) {
1133089Swyllys 		rv = KMF_OK;
1143089Swyllys 	}
1153089Swyllys 
1163089Swyllys 	*keysdeleted = numkeys;
1173089Swyllys 	return (rv);
1183089Swyllys }
1193089Swyllys 
1203089Swyllys static KMF_RETURN
1213089Swyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *fcparms,
1223089Swyllys 	KMF_DELETECERT_PARAMS *dcparms)
1233089Swyllys {
1243089Swyllys 	KMF_RETURN rv = KMF_OK;
1253089Swyllys 	uint32_t numcerts = 0;
1263089Swyllys 
1273089Swyllys 	rv = KMF_FindCert(kmfhandle, fcparms, NULL, &numcerts);
1283089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
1293089Swyllys 		char prompt[1024];
1303089Swyllys 		(void) snprintf(prompt, sizeof (prompt),
1313089Swyllys 			gettext("%d certificate(s) found, do you want "
1323089Swyllys 			"to delete them (y/N) ?"), numcerts);
1333089Swyllys 
1343089Swyllys 		if (!yesno(prompt,
1353089Swyllys 			gettext("Respond with yes or no.\n"),
1363089Swyllys 			B_FALSE)) {
1373089Swyllys 			return (KMF_OK);
1383089Swyllys 		}
1393089Swyllys 
1403089Swyllys 		rv = KMF_DeleteCertFromKeystore(kmfhandle, dcparms);
1413089Swyllys 
1423089Swyllys 	} else if (rv == KMF_ERR_CERT_NOT_FOUND) {
1433089Swyllys 		rv = KMF_OK;
1443089Swyllys 	}
1453089Swyllys 
1463089Swyllys 	return (rv);
1473089Swyllys }
1483089Swyllys 
1493089Swyllys static KMF_RETURN
1503089Swyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix,
1513089Swyllys 	char *token, int oclass, char *objlabel,
1523089Swyllys 	KMF_CREDENTIAL *tokencred)
1533089Swyllys {
1543089Swyllys 	KMF_RETURN rv = KMF_OK;
1553089Swyllys 	KMF_FINDKEY_PARAMS parms;
1563089Swyllys 	char *keytype = NULL;
1573089Swyllys 	int nk, numkeys = 0;
1583089Swyllys 
1593089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
1603089Swyllys 	if (rv != KMF_OK)
1613089Swyllys 		return (rv);
1623089Swyllys 
1633089Swyllys 	(void) memset(&parms, 0, sizeof (parms));
1643089Swyllys 	parms.kstype = KMF_KEYSTORE_NSS;
1653089Swyllys 	parms.findLabel = objlabel;
1663089Swyllys 	parms.cred = *tokencred;
1673089Swyllys 	parms.nssparms.slotlabel = token;
1683089Swyllys 
1693089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
1703089Swyllys 		parms.keyclass = KMF_ASYM_PRI;
1713089Swyllys 		keytype = "private";
1723089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
1733089Swyllys 		numkeys += nk;
1743089Swyllys 	}
1753089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
1763089Swyllys 		parms.keyclass = KMF_SYMMETRIC;
1773089Swyllys 		keytype = "symmetric";
1783089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
1793089Swyllys 		numkeys += nk;
1803089Swyllys 	}
1813089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
1823089Swyllys 		parms.keyclass = KMF_ASYM_PUB;
1833089Swyllys 		keytype = "public";
1843089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
1853089Swyllys 		numkeys += nk;
1863089Swyllys 	}
1873089Swyllys 	if (rv == KMF_OK && numkeys == 0)
1883089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
1893089Swyllys 
1903089Swyllys 	return (rv);
1913089Swyllys }
1923089Swyllys 
1933089Swyllys 
1943089Swyllys static KMF_RETURN
1953089Swyllys delete_nss_certs(KMF_HANDLE_T kmfhandle,
1963089Swyllys 	char *dir, char *prefix,
1973089Swyllys 	char *token, char *objlabel,
1983089Swyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
1993089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
2003089Swyllys {
2013089Swyllys 	KMF_RETURN rv = KMF_OK;
2023089Swyllys 	KMF_DELETECERT_PARAMS dcparms;
2033089Swyllys 	KMF_FINDCERT_PARAMS fcargs;
2043089Swyllys 
2053089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
2063089Swyllys 	if (rv != KMF_OK)
2073089Swyllys 		return (rv);
2083089Swyllys 
2093089Swyllys 	(void) memset(&dcparms, 0, sizeof (dcparms));
2103089Swyllys 	dcparms.kstype = KMF_KEYSTORE_NSS;
2113089Swyllys 	dcparms.certLabel = objlabel;
2123089Swyllys 	dcparms.issuer = issuer;
2133089Swyllys 	dcparms.subject = subject;
2143089Swyllys 	dcparms.serial = serno;
2153089Swyllys 	dcparms.find_cert_validity = find_criteria_flag;
2163089Swyllys 	dcparms.nssparms.slotlabel = token;
2173089Swyllys 
2183089Swyllys 	(void) memset(&fcargs, 0, sizeof (fcargs));
2193089Swyllys 	fcargs.kstype = KMF_KEYSTORE_NSS;
2203089Swyllys 	fcargs.certLabel = objlabel;
2213089Swyllys 	fcargs.issuer = issuer;
2223089Swyllys 	fcargs.subject = subject;
2233089Swyllys 	fcargs.serial = serno;
2243089Swyllys 	fcargs.find_cert_validity = find_criteria_flag;
2253089Swyllys 	fcargs.nssparms.slotlabel = token;
2263089Swyllys 
2273089Swyllys 	rv = pk_delete_certs(kmfhandle, &fcargs, &dcparms);
2283089Swyllys 
2293089Swyllys 	return (rv);
2303089Swyllys }
2313089Swyllys 
2323089Swyllys static KMF_RETURN
2333089Swyllys delete_nss_crl(void *kmfhandle,
2343089Swyllys 	char *dir, char *prefix, char *token,
2353089Swyllys 	char *issuernickname, char *subject)
2363089Swyllys {
2373089Swyllys 	KMF_RETURN rv = KMF_OK;
2383089Swyllys 	KMF_DELETECRL_PARAMS dcrlparms;
2393089Swyllys 
2403089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
2413089Swyllys 	if (rv != KMF_OK)
2423089Swyllys 		return (rv);
2433089Swyllys 
2443089Swyllys 	(void) memset(&dcrlparms, 0, sizeof (dcrlparms));
2453089Swyllys 
2463089Swyllys 	dcrlparms.kstype = KMF_KEYSTORE_NSS;
2473089Swyllys 	dcrlparms.nssparms.slotlabel = token;
2483089Swyllys 	dcrlparms.nssparms.crl_issuerName = issuernickname;
2493089Swyllys 	dcrlparms.nssparms.crl_subjName = subject;
2503089Swyllys 
2513089Swyllys 	rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
2523089Swyllys 
2533089Swyllys 	return (rv);
2543089Swyllys }
2553089Swyllys 
2563089Swyllys static KMF_RETURN
2573089Swyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle,
2583089Swyllys 	char *token, int oclass, char *objlabel,
2593089Swyllys 	KMF_CREDENTIAL *tokencred)
2603089Swyllys {
2613089Swyllys 	KMF_RETURN rv = KMF_OK;
2623089Swyllys 	KMF_FINDKEY_PARAMS parms;
2633089Swyllys 	int nk, numkeys = 0;
2643089Swyllys 
2653089Swyllys 	/*
2663089Swyllys 	 * Symmetric keys and RSA/DSA private keys are always
2673089Swyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
2683089Swyllys 	 * make sure we search for them with it also set.
2693089Swyllys 	 */
2703089Swyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
2713089Swyllys 		oclass |= PK_PRIVATE_OBJ;
2723089Swyllys 
2733089Swyllys 	rv = select_token(kmfhandle, token, FALSE);
2743089Swyllys 	if (rv != KMF_OK) {
2753089Swyllys 		return (rv);
2763089Swyllys 	}
2773089Swyllys 
2783089Swyllys 	(void) memset(&parms, 0, sizeof (parms));
2793089Swyllys 	parms.kstype = KMF_KEYSTORE_PK11TOKEN;
2803089Swyllys 	parms.findLabel = (char *)objlabel;
2813089Swyllys 	parms.keytype = 0;
2823089Swyllys 	parms.pkcs11parms.private = ((oclass & PK_PRIVATE_OBJ) > 0);
283*3408Swyllys 	parms.pkcs11parms.token = 1;
2843089Swyllys 	parms.cred.cred = tokencred->cred;
2853089Swyllys 	parms.cred.credlen = tokencred->credlen;
2863089Swyllys 
2873089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
2883089Swyllys 		parms.keyclass = KMF_ASYM_PRI;
2893089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, "private", &nk);
2903089Swyllys 		numkeys += nk;
2913089Swyllys 	}
2923089Swyllys 
2933089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
2943089Swyllys 		parms.keyclass = KMF_SYMMETRIC;
2953089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, "symmetric", &nk);
2963089Swyllys 		numkeys += nk;
2973089Swyllys 	}
2983089Swyllys 
2993089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
3003089Swyllys 		parms.keyclass = KMF_ASYM_PUB;
3013089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, "public", &nk);
3023089Swyllys 		numkeys += nk;
3033089Swyllys 	}
3043089Swyllys 	if (rv == KMF_OK && numkeys == 0)
3053089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
3063089Swyllys 
3073089Swyllys 	return (rv);
3083089Swyllys }
3093089Swyllys 
3103089Swyllys static KMF_RETURN
3113089Swyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle,
3123089Swyllys 	char *token, char *objlabel,
3133089Swyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
3143089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
3153089Swyllys {
3163089Swyllys 	KMF_RETURN kmfrv;
3173089Swyllys 	KMF_DELETECERT_PARAMS dparms;
3183089Swyllys 	KMF_FINDCERT_PARAMS fcargs;
3193089Swyllys 
3203089Swyllys 	kmfrv = select_token(kmfhandle, token, FALSE);
3213089Swyllys 
3223089Swyllys 	if (kmfrv != KMF_OK) {
3233089Swyllys 		return (kmfrv);
3243089Swyllys 	}
3253089Swyllys 
3263089Swyllys 	(void) memset(&dparms, 0, sizeof (dparms));
3273089Swyllys 	dparms.kstype = KMF_KEYSTORE_PK11TOKEN;
3283089Swyllys 	dparms.certLabel = objlabel;
3293089Swyllys 	dparms.issuer = issuer;
3303089Swyllys 	dparms.subject = subject;
3313089Swyllys 	dparms.serial = serno;
3323089Swyllys 	dparms.find_cert_validity = find_criteria_flag;
3333089Swyllys 
3343089Swyllys 	fcargs = dparms;
3353089Swyllys 	kmfrv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
3363089Swyllys 
3373089Swyllys 	return (kmfrv);
3383089Swyllys }
3393089Swyllys 
3403089Swyllys static KMF_RETURN
3413089Swyllys delete_file_certs(KMF_HANDLE_T kmfhandle,
3423089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial, char *issuer,
3433089Swyllys 	char *subject, KMF_CERT_VALIDITY find_criteria_flag)
3443089Swyllys {
3453089Swyllys 	KMF_RETURN rv;
3463089Swyllys 	KMF_DELETECERT_PARAMS dparms;
3473089Swyllys 	KMF_FINDCERT_PARAMS fcargs;
3483089Swyllys 
3493089Swyllys 	(void *)memset(&dparms, 0, sizeof (dparms));
3503089Swyllys 	(void *)memset(&fcargs, 0, sizeof (fcargs));
3513089Swyllys 	fcargs.kstype = KMF_KEYSTORE_OPENSSL;
3523089Swyllys 	fcargs.certLabel = NULL;
3533089Swyllys 	fcargs.issuer = issuer;
3543089Swyllys 	fcargs.subject = subject;
3553089Swyllys 	fcargs.serial = serial;
3563089Swyllys 	fcargs.sslparms.dirpath = dir;
3573089Swyllys 	fcargs.sslparms.certfile = filename;
3583089Swyllys 	fcargs.find_cert_validity = find_criteria_flag;
3593089Swyllys 
3603089Swyllys 	/* For now, delete parameters and find parameters are the same */
3613089Swyllys 	dparms = fcargs;
3623089Swyllys 
3633089Swyllys 	rv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
3643089Swyllys 
3653089Swyllys 	return (rv);
3663089Swyllys }
3673089Swyllys 
3683089Swyllys static KMF_RETURN
3693089Swyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass,
3703089Swyllys 	char *dir, char *infile)
3713089Swyllys {
3723089Swyllys 	KMF_RETURN rv = KMF_OK;
3733089Swyllys 	KMF_FINDKEY_PARAMS parms;
3743089Swyllys 	char *keytype = "";
3753089Swyllys 	int nk, numkeys = 0;
3763089Swyllys 
3773089Swyllys 	(void) memset(&parms, 0, sizeof (parms));
3783089Swyllys 	parms.kstype = KMF_KEYSTORE_OPENSSL;
3793089Swyllys 	parms.sslparms.dirpath = dir;
3803089Swyllys 	parms.sslparms.keyfile = infile;
3813089Swyllys 
3823089Swyllys 	if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) {
3833089Swyllys 		parms.keyclass = KMF_ASYM_PRI;
3843089Swyllys 		keytype = "Asymmetric";
3853089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
3863089Swyllys 		numkeys += nk;
3873089Swyllys 	}
3883089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
3893089Swyllys 		parms.keyclass = KMF_SYMMETRIC;
3903089Swyllys 		keytype = "symmetric";
3913089Swyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
3923089Swyllys 		numkeys += nk;
3933089Swyllys 	}
3943089Swyllys 	if (rv == KMF_OK && numkeys == 0)
3953089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
3963089Swyllys 
3973089Swyllys 	return (rv);
3983089Swyllys }
3993089Swyllys 
4003089Swyllys static KMF_RETURN
4013089Swyllys delete_file_crl(void *kmfhandle, char *dir, char *filename)
4023089Swyllys {
4033089Swyllys 	KMF_RETURN rv;
4043089Swyllys 	KMF_DELETECRL_PARAMS dcrlparms;
4053089Swyllys 
4063089Swyllys 	(void) memset(&dcrlparms, 0, sizeof (dcrlparms));
4073089Swyllys 
4083089Swyllys 	dcrlparms.kstype = KMF_KEYSTORE_OPENSSL;
4093089Swyllys 	dcrlparms.sslparms.dirpath = dir;
4103089Swyllys 	dcrlparms.sslparms.crlfile = filename;
4113089Swyllys 
4123089Swyllys 	rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
4133089Swyllys 
4143089Swyllys 	return (rv);
4153089Swyllys }
41617Sdinak 
41717Sdinak /*
41817Sdinak  * Delete token objects.
41917Sdinak  */
42017Sdinak int
42117Sdinak pk_delete(int argc, char *argv[])
42217Sdinak {
42317Sdinak 	int		opt;
424864Sdinak 	extern int	optind_av;
425864Sdinak 	extern char	*optarg_av;
426864Sdinak 	char		*token_spec = NULL;
4273089Swyllys 	char		*subject = NULL;
4283089Swyllys 	char		*issuer = NULL;
4293089Swyllys 	char		*dir = NULL;
4303089Swyllys 	char		*prefix = NULL;
4313089Swyllys 	char		*infile = NULL;
4323089Swyllys 	char		*object_label = NULL;
4333089Swyllys 	char		*serstr = NULL;
43417Sdinak 
4353089Swyllys 	int		oclass = 0;
4363089Swyllys 	KMF_BIGINT	serial = { NULL, 0 };
4373089Swyllys 	KMF_HANDLE_T	kmfhandle = NULL;
4383089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
4393089Swyllys 	KMF_RETURN	kmfrv;
4403089Swyllys 	int		rv = 0;
4413089Swyllys 	char			*find_criteria = NULL;
4423089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
4433089Swyllys 	KMF_CREDENTIAL	tokencred = {NULL, 0};
44417Sdinak 
44517Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
446864Sdinak 	while ((opt = getopt_av(argc, argv,
4473089Swyllys 		"T:(token)y:(objtype)l:(label)"
4483089Swyllys 		"k:(keystore)s:(subject)n:(nickname)"
4493089Swyllys 		"d:(dir)p:(prefix)S:(serial)i:(issuer)"
4503089Swyllys 		"c:(criteria)"
4513089Swyllys 		"f:(infile)")) != EOF) {
4523089Swyllys 
4533089Swyllys 		if (EMPTYSTRING(optarg_av))
4543089Swyllys 			return (PK_ERR_USAGE);
45517Sdinak 		switch (opt) {
456864Sdinak 		case 'T':	/* token specifier */
457864Sdinak 			if (token_spec)
458864Sdinak 				return (PK_ERR_USAGE);
459864Sdinak 			token_spec = optarg_av;
46017Sdinak 			break;
461864Sdinak 		case 'y':	/* object type:  public, private, both */
4623089Swyllys 			if (oclass)
463864Sdinak 				return (PK_ERR_USAGE);
4643089Swyllys 			oclass = OT2Int(optarg_av);
4653089Swyllys 			if (oclass == -1)
4663089Swyllys 				return (PK_ERR_USAGE);
46717Sdinak 			break;
46817Sdinak 		case 'l':	/* objects with specific label */
4693089Swyllys 		case 'n':
47017Sdinak 			if (object_label)
47117Sdinak 				return (PK_ERR_USAGE);
4723089Swyllys 			object_label = (char *)optarg_av;
4733089Swyllys 			break;
4743089Swyllys 		case 'k':
4753089Swyllys 			kstype = KS2Int(optarg_av);
4763089Swyllys 			if (kstype == 0)
4773089Swyllys 				return (PK_ERR_USAGE);
4783089Swyllys 			break;
4793089Swyllys 		case 's':
4803089Swyllys 			subject = optarg_av;
4813089Swyllys 			break;
4823089Swyllys 		case 'i':
4833089Swyllys 			issuer = optarg_av;
4843089Swyllys 			break;
4853089Swyllys 		case 'd':
4863089Swyllys 			dir = optarg_av;
4873089Swyllys 			break;
4883089Swyllys 		case 'p':
4893089Swyllys 			prefix = optarg_av;
4903089Swyllys 			break;
4913089Swyllys 		case 'S':
4923089Swyllys 			serstr = optarg_av;
4933089Swyllys 			break;
4943089Swyllys 		case 'f':
4953089Swyllys 			infile = optarg_av;
4963089Swyllys 			break;
4973089Swyllys 		case 'c':
4983089Swyllys 			find_criteria = optarg_av;
4993089Swyllys 			if (!strcasecmp(find_criteria, "valid"))
5003089Swyllys 				find_criteria_flag =
5013089Swyllys 					KMF_NONEXPIRED_CERTS;
5023089Swyllys 			else if (!strcasecmp(find_criteria, "expired"))
5033089Swyllys 				find_criteria_flag = KMF_EXPIRED_CERTS;
5043089Swyllys 			else if (!strcasecmp(find_criteria, "both"))
5053089Swyllys 				find_criteria_flag = KMF_ALL_CERTS;
5063089Swyllys 			else
5073089Swyllys 				return (PK_ERR_USAGE);
50817Sdinak 			break;
50917Sdinak 		default:
51017Sdinak 			return (PK_ERR_USAGE);
51117Sdinak 			break;
51217Sdinak 		}
51317Sdinak 	}
51417Sdinak 
5153089Swyllys 	/* Assume keystore = PKCS#11 if not specified */
5163089Swyllys 	if (kstype == 0)
5173089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
5183089Swyllys 
5193089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
5203089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
5213089Swyllys 		kstype != KMF_KEYSTORE_PK11TOKEN) {
5223089Swyllys 
5233089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
5243089Swyllys 			"is only relevant if keystore=pkcs11\n"));
5253089Swyllys 		return (PK_ERR_USAGE);
526864Sdinak 	}
527864Sdinak 
5283089Swyllys 	/* If no object class specified, delete everything but CRLs */
5293089Swyllys 	if (oclass == 0)
5303089Swyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ |
5313089Swyllys 			PK_SYMKEY_OBJ;
53217Sdinak 
53317Sdinak 	/* No additional args allowed. */
534864Sdinak 	argc -= optind_av;
535864Sdinak 	argv += optind_av;
53617Sdinak 	if (argc)
53717Sdinak 		return (PK_ERR_USAGE);
53817Sdinak 	/* Done parsing command line options. */
53917Sdinak 
5403089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) {
5413089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
5423089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) {
5433089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
54417Sdinak 	}
54517Sdinak 
5463089Swyllys 	if (serstr != NULL) {
5473089Swyllys 		uchar_t *bytes = NULL;
5483089Swyllys 		size_t bytelen;
5493089Swyllys 
5503089Swyllys 		rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
5513089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
5523089Swyllys 			(void) fprintf(stderr, gettext("serial number "
5533089Swyllys 				"must be specified as a hex number "
5543089Swyllys 				"(ex: 0x0102030405ffeeddee)\n"));
5553089Swyllys 			return (PK_ERR_USAGE);
5563089Swyllys 		}
5573089Swyllys 		serial.val = bytes;
5583089Swyllys 		serial.len = bytelen;
55917Sdinak 	}
56017Sdinak 
5613089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
5623089Swyllys 		kstype == KMF_KEYSTORE_NSS) &&
5633089Swyllys 		(oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
56417Sdinak 
5653089Swyllys 		(void) get_token_password(kstype, token_spec,
5663089Swyllys 			&tokencred);
56717Sdinak 	}
56817Sdinak 
5693089Swyllys 	if ((kmfrv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
5703089Swyllys 		return (kmfrv);
5713089Swyllys 
5723089Swyllys 	switch (kstype) {
5733089Swyllys 		case KMF_KEYSTORE_PK11TOKEN:
5743089Swyllys 			if (oclass & PK_KEY_OBJ) {
5753089Swyllys 				kmfrv = delete_pk11_keys(kmfhandle,
5763089Swyllys 						token_spec, oclass,
5773089Swyllys 						object_label,
5783089Swyllys 						&tokencred);
5793089Swyllys 				/*
5803089Swyllys 				 * If deleting groups of objects, it is OK
5813089Swyllys 				 * to ignore the "key not found" case so that
5823089Swyllys 				 * we can continue to find other objects.
5833089Swyllys 				 */
5843089Swyllys 				if (kmfrv == KMF_ERR_KEY_NOT_FOUND &&
5853089Swyllys 					(oclass != PK_KEY_OBJ))
5863089Swyllys 					kmfrv = KMF_OK;
5873089Swyllys 				if (kmfrv != KMF_OK)
5883089Swyllys 					break;
5893089Swyllys 			}
5903089Swyllys 			if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
5913089Swyllys 				kmfrv = delete_pk11_certs(kmfhandle,
5923089Swyllys 						token_spec,
5933089Swyllys 						object_label,
5943089Swyllys 						&serial, issuer,
5953089Swyllys 						subject, find_criteria_flag);
5963089Swyllys 				/*
5973089Swyllys 				 * If cert delete failed, but we are looking at
5983089Swyllys 				 * other objects, then it is OK.
5993089Swyllys 				 */
6003089Swyllys 				if (kmfrv == KMF_ERR_CERT_NOT_FOUND &&
6013089Swyllys 					(oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
6023089Swyllys 					kmfrv = KMF_OK;
6033089Swyllys 				if (kmfrv != KMF_OK)
6043089Swyllys 					break;
6053089Swyllys 			}
6063089Swyllys 			if (oclass & PK_CRL_OBJ)
6073089Swyllys 				kmfrv = delete_file_crl(kmfhandle,
6083089Swyllys 						dir, infile);
6093089Swyllys 			break;
6103089Swyllys 		case KMF_KEYSTORE_NSS:
6113089Swyllys 			if (oclass & PK_KEY_OBJ) {
6123089Swyllys 				kmfrv = delete_nss_keys(kmfhandle,
6133089Swyllys 					dir, prefix, token_spec,
6143089Swyllys 					oclass, (char  *)object_label,
6153089Swyllys 					&tokencred);
6163089Swyllys 				if (kmfrv != KMF_OK)
6173089Swyllys 					break;
6183089Swyllys 			}
6193089Swyllys 			if (oclass & PK_CERT_OBJ) {
6203089Swyllys 				kmfrv = delete_nss_certs(kmfhandle,
6213089Swyllys 					dir, prefix, token_spec,
6223089Swyllys 					(char  *)object_label,
6233089Swyllys 					&serial, issuer, subject,
6243089Swyllys 					find_criteria_flag);
6253089Swyllys 				if (kmfrv != KMF_OK)
6263089Swyllys 					break;
6273089Swyllys 			}
6283089Swyllys 			if (oclass & PK_CRL_OBJ)
6293089Swyllys 				kmfrv = delete_nss_crl(kmfhandle,
6303089Swyllys 					dir, prefix, token_spec,
6313089Swyllys 					(char  *)object_label, subject);
6323089Swyllys 			break;
6333089Swyllys 		case KMF_KEYSTORE_OPENSSL:
6343089Swyllys 			if (oclass & PK_KEY_OBJ) {
6353089Swyllys 				kmfrv = delete_file_keys(kmfhandle, oclass,
6363089Swyllys 					dir, infile);
6373089Swyllys 				if (kmfrv != KMF_OK)
6383089Swyllys 					break;
6393089Swyllys 			}
6403089Swyllys 			if (oclass & (PK_CERT_OBJ)) {
6413089Swyllys 				kmfrv = delete_file_certs(kmfhandle,
6423089Swyllys 					dir, infile, &serial, issuer,
6433089Swyllys 					subject, find_criteria_flag);
6443089Swyllys 				if (kmfrv != KMF_OK)
6453089Swyllys 					break;
6463089Swyllys 			}
6473089Swyllys 			if (oclass & PK_CRL_OBJ)
6483089Swyllys 				kmfrv = delete_file_crl(kmfhandle,
6493089Swyllys 					dir, infile);
6503089Swyllys 			break;
6513089Swyllys 		default:
6523089Swyllys 			rv = PK_ERR_USAGE;
6533089Swyllys 			break;
65417Sdinak 	}
65517Sdinak 
6563089Swyllys 	if (kmfrv != KMF_OK) {
6573089Swyllys 		display_error(kmfhandle, kmfrv,
6583089Swyllys 			gettext("Error deleting objects"));
65917Sdinak 	}
66017Sdinak 
6613089Swyllys 	if (serial.val != NULL)
6623089Swyllys 		free(serial.val);
6633089Swyllys 	(void) KMF_Finalize(kmfhandle);
6643089Swyllys 	return (kmfrv);
66517Sdinak }
666