xref: /titanic_53/usr/src/cmd/cmd-crypto/pktool/delete.c (revision 71593db26bb6ef7b739cffe06d53bf990cac112c)
17711facfSdinak /*
27711facfSdinak  * CDDL HEADER START
37711facfSdinak  *
47711facfSdinak  * 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.
77711facfSdinak  *
87711facfSdinak  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97711facfSdinak  * or http://www.opensolaris.org/os/licensing.
107711facfSdinak  * See the License for the specific language governing permissions
117711facfSdinak  * and limitations under the License.
127711facfSdinak  *
137711facfSdinak  * When distributing Covered Code, include this CDDL HEADER in each
147711facfSdinak  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157711facfSdinak  * If applicable, add the following below this CDDL HEADER, with the
167711facfSdinak  * fields enclosed by brackets "[]" replaced with your own identifying
177711facfSdinak  * information: Portions Copyright [yyyy] [name of copyright owner]
187711facfSdinak  *
197711facfSdinak  * CDDL HEADER END
207711facfSdinak  */
217711facfSdinak /*
22*71593db2Swyllys  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
237711facfSdinak  * Use is subject to license terms.
247711facfSdinak  */
257711facfSdinak 
267711facfSdinak #pragma ident	"%Z%%M%	%I%	%E% SMI"
277711facfSdinak 
287711facfSdinak /*
297711facfSdinak  * This file implements the token object delete operation for this tool.
307711facfSdinak  * It loads the PKCS#11 modules, finds the object to delete, deletes it,
317711facfSdinak  * and cleans up.  User must be R/W logged into the token.
327711facfSdinak  */
337711facfSdinak 
347711facfSdinak #include <stdio.h>
357711facfSdinak #include <string.h>
367711facfSdinak #include <cryptoutil.h>
377711facfSdinak #include <security/cryptoki.h>
387711facfSdinak #include "common.h"
3999ebb4caSwyllys #include <kmfapi.h>
4099ebb4caSwyllys 
4199ebb4caSwyllys static KMF_RETURN
4299ebb4caSwyllys pk_destroy_keys(void *handle, KMF_KEY_HANDLE *keys,
4399ebb4caSwyllys 	KMF_FINDKEY_PARAMS *fkparams, uint32_t numkeys)
4499ebb4caSwyllys {
4599ebb4caSwyllys 	int i;
4699ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
4799ebb4caSwyllys 	KMF_DELETEKEY_PARAMS dkparams;
4899ebb4caSwyllys 
4999ebb4caSwyllys 	(void) memset(&dkparams, 0, sizeof (dkparams));
5099ebb4caSwyllys 	dkparams.kstype = fkparams->kstype;
5199ebb4caSwyllys 
5299ebb4caSwyllys 	switch (fkparams->kstype) {
5399ebb4caSwyllys 	case KMF_KEYSTORE_NSS:
5499ebb4caSwyllys 		dkparams.nssparms = fkparams->nssparms;
5599ebb4caSwyllys 		dkparams.cred = fkparams->cred;
5699ebb4caSwyllys 		break;
5799ebb4caSwyllys 	case KMF_KEYSTORE_OPENSSL:
5899ebb4caSwyllys 		break;
5999ebb4caSwyllys 	case KMF_KEYSTORE_PK11TOKEN:
6099ebb4caSwyllys 		dkparams.cred = fkparams->cred;
6199ebb4caSwyllys 		break;
6299ebb4caSwyllys 	default:
6399ebb4caSwyllys 		return (PK_ERR_USAGE);
6499ebb4caSwyllys 	}
6599ebb4caSwyllys 
6699ebb4caSwyllys 	for (i = 0; rv == KMF_OK && i < numkeys; i++) {
6799ebb4caSwyllys 		rv = KMF_DeleteKeyFromKeystore(handle, &dkparams, &keys[i]);
6899ebb4caSwyllys 	}
6999ebb4caSwyllys 	return (rv);
7099ebb4caSwyllys }
7199ebb4caSwyllys 
7299ebb4caSwyllys static KMF_RETURN
7399ebb4caSwyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc,
7499ebb4caSwyllys 	int *keysdeleted)
7599ebb4caSwyllys {
7699ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
7799ebb4caSwyllys 	uint32_t numkeys = 0;
7899ebb4caSwyllys 
7999ebb4caSwyllys 	*keysdeleted = 0;
8099ebb4caSwyllys 	numkeys = 0;
8199ebb4caSwyllys 	rv = KMF_FindKey(kmfhandle, parms, NULL, &numkeys);
8299ebb4caSwyllys 	if (rv == KMF_OK && numkeys > 0) {
8399ebb4caSwyllys 		KMF_KEY_HANDLE *keys = NULL;
8499ebb4caSwyllys 		char prompt[1024];
8599ebb4caSwyllys 
8699ebb4caSwyllys 		(void) snprintf(prompt, sizeof (prompt),
8799ebb4caSwyllys 			gettext("%d %s key(s) found, do you want "
8899ebb4caSwyllys 			"to delete them (y/N) ?"), numkeys,
8999ebb4caSwyllys 			(desc != NULL ? desc : ""));
9099ebb4caSwyllys 
9199ebb4caSwyllys 		if (!yesno(prompt,
9299ebb4caSwyllys 			gettext("Respond with yes or no.\n"),
9399ebb4caSwyllys 			B_FALSE)) {
9499ebb4caSwyllys 			return (KMF_OK);
9599ebb4caSwyllys 		}
9699ebb4caSwyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
9799ebb4caSwyllys 				sizeof (KMF_KEY_HANDLE));
9899ebb4caSwyllys 		if (keys == NULL)
9999ebb4caSwyllys 			return (KMF_ERR_MEMORY);
10099ebb4caSwyllys 		(void) memset(keys, 0, numkeys *
10199ebb4caSwyllys 			sizeof (KMF_KEY_HANDLE));
10299ebb4caSwyllys 
10399ebb4caSwyllys 		rv = KMF_FindKey(kmfhandle, parms, keys, &numkeys);
10499ebb4caSwyllys 		if (rv == KMF_OK) {
10599ebb4caSwyllys 			rv = pk_destroy_keys(kmfhandle, keys,
10699ebb4caSwyllys 				parms, numkeys);
10799ebb4caSwyllys 		}
10899ebb4caSwyllys 
10999ebb4caSwyllys 		free(keys);
11099ebb4caSwyllys 	}
11199ebb4caSwyllys 
11299ebb4caSwyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND) {
11399ebb4caSwyllys 		rv = KMF_OK;
11499ebb4caSwyllys 	}
11599ebb4caSwyllys 
11699ebb4caSwyllys 	*keysdeleted = numkeys;
11799ebb4caSwyllys 	return (rv);
11899ebb4caSwyllys }
11999ebb4caSwyllys 
12099ebb4caSwyllys static KMF_RETURN
12199ebb4caSwyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *fcparms,
12299ebb4caSwyllys 	KMF_DELETECERT_PARAMS *dcparms)
12399ebb4caSwyllys {
12499ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
12599ebb4caSwyllys 	uint32_t numcerts = 0;
12699ebb4caSwyllys 
12799ebb4caSwyllys 	rv = KMF_FindCert(kmfhandle, fcparms, NULL, &numcerts);
12899ebb4caSwyllys 	if (rv == KMF_OK && numcerts > 0) {
12999ebb4caSwyllys 		char prompt[1024];
13099ebb4caSwyllys 		(void) snprintf(prompt, sizeof (prompt),
13199ebb4caSwyllys 			gettext("%d certificate(s) found, do you want "
13299ebb4caSwyllys 			"to delete them (y/N) ?"), numcerts);
13399ebb4caSwyllys 
13499ebb4caSwyllys 		if (!yesno(prompt,
13599ebb4caSwyllys 			gettext("Respond with yes or no.\n"),
13699ebb4caSwyllys 			B_FALSE)) {
13799ebb4caSwyllys 			return (KMF_OK);
13899ebb4caSwyllys 		}
13999ebb4caSwyllys 
14099ebb4caSwyllys 		rv = KMF_DeleteCertFromKeystore(kmfhandle, dcparms);
14199ebb4caSwyllys 
14299ebb4caSwyllys 	} else if (rv == KMF_ERR_CERT_NOT_FOUND) {
14399ebb4caSwyllys 		rv = KMF_OK;
14499ebb4caSwyllys 	}
14599ebb4caSwyllys 
14699ebb4caSwyllys 	return (rv);
14799ebb4caSwyllys }
14899ebb4caSwyllys 
14999ebb4caSwyllys static KMF_RETURN
15099ebb4caSwyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix,
15199ebb4caSwyllys 	char *token, int oclass, char *objlabel,
15299ebb4caSwyllys 	KMF_CREDENTIAL *tokencred)
15399ebb4caSwyllys {
15499ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
15599ebb4caSwyllys 	KMF_FINDKEY_PARAMS parms;
15699ebb4caSwyllys 	char *keytype = NULL;
15799ebb4caSwyllys 	int nk, numkeys = 0;
15899ebb4caSwyllys 
15999ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
16099ebb4caSwyllys 	if (rv != KMF_OK)
16199ebb4caSwyllys 		return (rv);
16299ebb4caSwyllys 
16399ebb4caSwyllys 	(void) memset(&parms, 0, sizeof (parms));
16499ebb4caSwyllys 	parms.kstype = KMF_KEYSTORE_NSS;
16599ebb4caSwyllys 	parms.findLabel = objlabel;
16699ebb4caSwyllys 	parms.cred = *tokencred;
16799ebb4caSwyllys 	parms.nssparms.slotlabel = token;
16899ebb4caSwyllys 
16999ebb4caSwyllys 	if (oclass & PK_PRIKEY_OBJ) {
17099ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PRI;
17199ebb4caSwyllys 		keytype = "private";
17299ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
17399ebb4caSwyllys 		numkeys += nk;
17499ebb4caSwyllys 	}
17599ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
17699ebb4caSwyllys 		parms.keyclass = KMF_SYMMETRIC;
17799ebb4caSwyllys 		keytype = "symmetric";
17899ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
17999ebb4caSwyllys 		numkeys += nk;
18099ebb4caSwyllys 	}
18199ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
18299ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PUB;
18399ebb4caSwyllys 		keytype = "public";
18499ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
18599ebb4caSwyllys 		numkeys += nk;
18699ebb4caSwyllys 	}
18799ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
18899ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
18999ebb4caSwyllys 
19099ebb4caSwyllys 	return (rv);
19199ebb4caSwyllys }
19299ebb4caSwyllys 
19399ebb4caSwyllys 
19499ebb4caSwyllys static KMF_RETURN
19599ebb4caSwyllys delete_nss_certs(KMF_HANDLE_T kmfhandle,
19699ebb4caSwyllys 	char *dir, char *prefix,
19799ebb4caSwyllys 	char *token, char *objlabel,
19899ebb4caSwyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
19999ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
20099ebb4caSwyllys {
20199ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
20299ebb4caSwyllys 	KMF_DELETECERT_PARAMS dcparms;
20399ebb4caSwyllys 	KMF_FINDCERT_PARAMS fcargs;
20499ebb4caSwyllys 
20599ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
20699ebb4caSwyllys 	if (rv != KMF_OK)
20799ebb4caSwyllys 		return (rv);
20899ebb4caSwyllys 
20999ebb4caSwyllys 	(void) memset(&dcparms, 0, sizeof (dcparms));
21099ebb4caSwyllys 	dcparms.kstype = KMF_KEYSTORE_NSS;
21199ebb4caSwyllys 	dcparms.certLabel = objlabel;
21299ebb4caSwyllys 	dcparms.issuer = issuer;
21399ebb4caSwyllys 	dcparms.subject = subject;
21499ebb4caSwyllys 	dcparms.serial = serno;
21599ebb4caSwyllys 	dcparms.find_cert_validity = find_criteria_flag;
21699ebb4caSwyllys 	dcparms.nssparms.slotlabel = token;
21799ebb4caSwyllys 
21899ebb4caSwyllys 	(void) memset(&fcargs, 0, sizeof (fcargs));
21999ebb4caSwyllys 	fcargs.kstype = KMF_KEYSTORE_NSS;
22099ebb4caSwyllys 	fcargs.certLabel = objlabel;
22199ebb4caSwyllys 	fcargs.issuer = issuer;
22299ebb4caSwyllys 	fcargs.subject = subject;
22399ebb4caSwyllys 	fcargs.serial = serno;
22499ebb4caSwyllys 	fcargs.find_cert_validity = find_criteria_flag;
22599ebb4caSwyllys 	fcargs.nssparms.slotlabel = token;
22699ebb4caSwyllys 
22799ebb4caSwyllys 	rv = pk_delete_certs(kmfhandle, &fcargs, &dcparms);
22899ebb4caSwyllys 
22999ebb4caSwyllys 	return (rv);
23099ebb4caSwyllys }
23199ebb4caSwyllys 
23299ebb4caSwyllys static KMF_RETURN
23399ebb4caSwyllys delete_nss_crl(void *kmfhandle,
23499ebb4caSwyllys 	char *dir, char *prefix, char *token,
23599ebb4caSwyllys 	char *issuernickname, char *subject)
23699ebb4caSwyllys {
23799ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
23899ebb4caSwyllys 	KMF_DELETECRL_PARAMS dcrlparms;
23999ebb4caSwyllys 
24099ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
24199ebb4caSwyllys 	if (rv != KMF_OK)
24299ebb4caSwyllys 		return (rv);
24399ebb4caSwyllys 
24499ebb4caSwyllys 	(void) memset(&dcrlparms, 0, sizeof (dcrlparms));
24599ebb4caSwyllys 
24699ebb4caSwyllys 	dcrlparms.kstype = KMF_KEYSTORE_NSS;
24799ebb4caSwyllys 	dcrlparms.nssparms.slotlabel = token;
24899ebb4caSwyllys 	dcrlparms.nssparms.crl_issuerName = issuernickname;
24999ebb4caSwyllys 	dcrlparms.nssparms.crl_subjName = subject;
25099ebb4caSwyllys 
25199ebb4caSwyllys 	rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
25299ebb4caSwyllys 
25399ebb4caSwyllys 	return (rv);
25499ebb4caSwyllys }
25599ebb4caSwyllys 
25699ebb4caSwyllys static KMF_RETURN
25799ebb4caSwyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle,
25899ebb4caSwyllys 	char *token, int oclass, char *objlabel,
25999ebb4caSwyllys 	KMF_CREDENTIAL *tokencred)
26099ebb4caSwyllys {
26199ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
26299ebb4caSwyllys 	KMF_FINDKEY_PARAMS parms;
26399ebb4caSwyllys 	int nk, numkeys = 0;
26499ebb4caSwyllys 
26599ebb4caSwyllys 	/*
26699ebb4caSwyllys 	 * Symmetric keys and RSA/DSA private keys are always
26799ebb4caSwyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
26899ebb4caSwyllys 	 * make sure we search for them with it also set.
26999ebb4caSwyllys 	 */
27099ebb4caSwyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
27199ebb4caSwyllys 		oclass |= PK_PRIVATE_OBJ;
27299ebb4caSwyllys 
27399ebb4caSwyllys 	rv = select_token(kmfhandle, token, FALSE);
27499ebb4caSwyllys 	if (rv != KMF_OK) {
27599ebb4caSwyllys 		return (rv);
27699ebb4caSwyllys 	}
27799ebb4caSwyllys 
27899ebb4caSwyllys 	(void) memset(&parms, 0, sizeof (parms));
27999ebb4caSwyllys 	parms.kstype = KMF_KEYSTORE_PK11TOKEN;
28099ebb4caSwyllys 	parms.findLabel = (char *)objlabel;
28199ebb4caSwyllys 	parms.keytype = 0;
28299ebb4caSwyllys 	parms.pkcs11parms.private = ((oclass & PK_PRIVATE_OBJ) > 0);
283*71593db2Swyllys 	parms.pkcs11parms.token = 1;
28499ebb4caSwyllys 	parms.cred.cred = tokencred->cred;
28599ebb4caSwyllys 	parms.cred.credlen = tokencred->credlen;
28699ebb4caSwyllys 
28799ebb4caSwyllys 	if (oclass & PK_PRIKEY_OBJ) {
28899ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PRI;
28999ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, "private", &nk);
29099ebb4caSwyllys 		numkeys += nk;
29199ebb4caSwyllys 	}
29299ebb4caSwyllys 
29399ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
29499ebb4caSwyllys 		parms.keyclass = KMF_SYMMETRIC;
29599ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, "symmetric", &nk);
29699ebb4caSwyllys 		numkeys += nk;
29799ebb4caSwyllys 	}
29899ebb4caSwyllys 
29999ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
30099ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PUB;
30199ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, "public", &nk);
30299ebb4caSwyllys 		numkeys += nk;
30399ebb4caSwyllys 	}
30499ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
30599ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
30699ebb4caSwyllys 
30799ebb4caSwyllys 	return (rv);
30899ebb4caSwyllys }
30999ebb4caSwyllys 
31099ebb4caSwyllys static KMF_RETURN
31199ebb4caSwyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle,
31299ebb4caSwyllys 	char *token, char *objlabel,
31399ebb4caSwyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
31499ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
31599ebb4caSwyllys {
31699ebb4caSwyllys 	KMF_RETURN kmfrv;
31799ebb4caSwyllys 	KMF_DELETECERT_PARAMS dparms;
31899ebb4caSwyllys 	KMF_FINDCERT_PARAMS fcargs;
31999ebb4caSwyllys 
32099ebb4caSwyllys 	kmfrv = select_token(kmfhandle, token, FALSE);
32199ebb4caSwyllys 
32299ebb4caSwyllys 	if (kmfrv != KMF_OK) {
32399ebb4caSwyllys 		return (kmfrv);
32499ebb4caSwyllys 	}
32599ebb4caSwyllys 
32699ebb4caSwyllys 	(void) memset(&dparms, 0, sizeof (dparms));
32799ebb4caSwyllys 	dparms.kstype = KMF_KEYSTORE_PK11TOKEN;
32899ebb4caSwyllys 	dparms.certLabel = objlabel;
32999ebb4caSwyllys 	dparms.issuer = issuer;
33099ebb4caSwyllys 	dparms.subject = subject;
33199ebb4caSwyllys 	dparms.serial = serno;
33299ebb4caSwyllys 	dparms.find_cert_validity = find_criteria_flag;
33399ebb4caSwyllys 
33499ebb4caSwyllys 	fcargs = dparms;
33599ebb4caSwyllys 	kmfrv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
33699ebb4caSwyllys 
33799ebb4caSwyllys 	return (kmfrv);
33899ebb4caSwyllys }
33999ebb4caSwyllys 
34099ebb4caSwyllys static KMF_RETURN
34199ebb4caSwyllys delete_file_certs(KMF_HANDLE_T kmfhandle,
34299ebb4caSwyllys 	char *dir, char *filename, KMF_BIGINT *serial, char *issuer,
34399ebb4caSwyllys 	char *subject, KMF_CERT_VALIDITY find_criteria_flag)
34499ebb4caSwyllys {
34599ebb4caSwyllys 	KMF_RETURN rv;
34699ebb4caSwyllys 	KMF_DELETECERT_PARAMS dparms;
34799ebb4caSwyllys 	KMF_FINDCERT_PARAMS fcargs;
34899ebb4caSwyllys 
34999ebb4caSwyllys 	(void *)memset(&dparms, 0, sizeof (dparms));
35099ebb4caSwyllys 	(void *)memset(&fcargs, 0, sizeof (fcargs));
35199ebb4caSwyllys 	fcargs.kstype = KMF_KEYSTORE_OPENSSL;
35299ebb4caSwyllys 	fcargs.certLabel = NULL;
35399ebb4caSwyllys 	fcargs.issuer = issuer;
35499ebb4caSwyllys 	fcargs.subject = subject;
35599ebb4caSwyllys 	fcargs.serial = serial;
35699ebb4caSwyllys 	fcargs.sslparms.dirpath = dir;
35799ebb4caSwyllys 	fcargs.sslparms.certfile = filename;
35899ebb4caSwyllys 	fcargs.find_cert_validity = find_criteria_flag;
35999ebb4caSwyllys 
36099ebb4caSwyllys 	/* For now, delete parameters and find parameters are the same */
36199ebb4caSwyllys 	dparms = fcargs;
36299ebb4caSwyllys 
36399ebb4caSwyllys 	rv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
36499ebb4caSwyllys 
36599ebb4caSwyllys 	return (rv);
36699ebb4caSwyllys }
36799ebb4caSwyllys 
36899ebb4caSwyllys static KMF_RETURN
36999ebb4caSwyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass,
37099ebb4caSwyllys 	char *dir, char *infile)
37199ebb4caSwyllys {
37299ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
37399ebb4caSwyllys 	KMF_FINDKEY_PARAMS parms;
37499ebb4caSwyllys 	char *keytype = "";
37599ebb4caSwyllys 	int nk, numkeys = 0;
37699ebb4caSwyllys 
37799ebb4caSwyllys 	(void) memset(&parms, 0, sizeof (parms));
37899ebb4caSwyllys 	parms.kstype = KMF_KEYSTORE_OPENSSL;
37999ebb4caSwyllys 	parms.sslparms.dirpath = dir;
38099ebb4caSwyllys 	parms.sslparms.keyfile = infile;
38199ebb4caSwyllys 
38299ebb4caSwyllys 	if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) {
38399ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PRI;
38499ebb4caSwyllys 		keytype = "Asymmetric";
38599ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
38699ebb4caSwyllys 		numkeys += nk;
38799ebb4caSwyllys 	}
38899ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
38999ebb4caSwyllys 		parms.keyclass = KMF_SYMMETRIC;
39099ebb4caSwyllys 		keytype = "symmetric";
39199ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
39299ebb4caSwyllys 		numkeys += nk;
39399ebb4caSwyllys 	}
39499ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
39599ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
39699ebb4caSwyllys 
39799ebb4caSwyllys 	return (rv);
39899ebb4caSwyllys }
39999ebb4caSwyllys 
40099ebb4caSwyllys static KMF_RETURN
40199ebb4caSwyllys delete_file_crl(void *kmfhandle, char *dir, char *filename)
40299ebb4caSwyllys {
40399ebb4caSwyllys 	KMF_RETURN rv;
40499ebb4caSwyllys 	KMF_DELETECRL_PARAMS dcrlparms;
40599ebb4caSwyllys 
40699ebb4caSwyllys 	(void) memset(&dcrlparms, 0, sizeof (dcrlparms));
40799ebb4caSwyllys 
40899ebb4caSwyllys 	dcrlparms.kstype = KMF_KEYSTORE_OPENSSL;
40999ebb4caSwyllys 	dcrlparms.sslparms.dirpath = dir;
41099ebb4caSwyllys 	dcrlparms.sslparms.crlfile = filename;
41199ebb4caSwyllys 
41299ebb4caSwyllys 	rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
41399ebb4caSwyllys 
41499ebb4caSwyllys 	return (rv);
41599ebb4caSwyllys }
4167711facfSdinak 
4177711facfSdinak /*
4187711facfSdinak  * Delete token objects.
4197711facfSdinak  */
4207711facfSdinak int
4217711facfSdinak pk_delete(int argc, char *argv[])
4227711facfSdinak {
4237711facfSdinak 	int		opt;
42449e21299Sdinak 	extern int	optind_av;
42549e21299Sdinak 	extern char	*optarg_av;
42649e21299Sdinak 	char		*token_spec = NULL;
42799ebb4caSwyllys 	char		*subject = NULL;
42899ebb4caSwyllys 	char		*issuer = NULL;
42999ebb4caSwyllys 	char		*dir = NULL;
43099ebb4caSwyllys 	char		*prefix = NULL;
43199ebb4caSwyllys 	char		*infile = NULL;
43299ebb4caSwyllys 	char		*object_label = NULL;
43399ebb4caSwyllys 	char		*serstr = NULL;
4347711facfSdinak 
43599ebb4caSwyllys 	int		oclass = 0;
43699ebb4caSwyllys 	KMF_BIGINT	serial = { NULL, 0 };
43799ebb4caSwyllys 	KMF_HANDLE_T	kmfhandle = NULL;
43899ebb4caSwyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
43999ebb4caSwyllys 	KMF_RETURN	kmfrv;
44099ebb4caSwyllys 	int		rv = 0;
44199ebb4caSwyllys 	char			*find_criteria = NULL;
44299ebb4caSwyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
44399ebb4caSwyllys 	KMF_CREDENTIAL	tokencred = {NULL, 0};
4447711facfSdinak 
4457711facfSdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
44649e21299Sdinak 	while ((opt = getopt_av(argc, argv,
44799ebb4caSwyllys 		"T:(token)y:(objtype)l:(label)"
44899ebb4caSwyllys 		"k:(keystore)s:(subject)n:(nickname)"
44999ebb4caSwyllys 		"d:(dir)p:(prefix)S:(serial)i:(issuer)"
45099ebb4caSwyllys 		"c:(criteria)"
45199ebb4caSwyllys 		"f:(infile)")) != EOF) {
45299ebb4caSwyllys 
45399ebb4caSwyllys 		if (EMPTYSTRING(optarg_av))
45499ebb4caSwyllys 			return (PK_ERR_USAGE);
4557711facfSdinak 		switch (opt) {
45649e21299Sdinak 		case 'T':	/* token specifier */
45749e21299Sdinak 			if (token_spec)
45849e21299Sdinak 				return (PK_ERR_USAGE);
45949e21299Sdinak 			token_spec = optarg_av;
4607711facfSdinak 			break;
46149e21299Sdinak 		case 'y':	/* object type:  public, private, both */
46299ebb4caSwyllys 			if (oclass)
46349e21299Sdinak 				return (PK_ERR_USAGE);
46499ebb4caSwyllys 			oclass = OT2Int(optarg_av);
46599ebb4caSwyllys 			if (oclass == -1)
46699ebb4caSwyllys 				return (PK_ERR_USAGE);
4677711facfSdinak 			break;
4687711facfSdinak 		case 'l':	/* objects with specific label */
46999ebb4caSwyllys 		case 'n':
4707711facfSdinak 			if (object_label)
4717711facfSdinak 				return (PK_ERR_USAGE);
47299ebb4caSwyllys 			object_label = (char *)optarg_av;
47399ebb4caSwyllys 			break;
47499ebb4caSwyllys 		case 'k':
47599ebb4caSwyllys 			kstype = KS2Int(optarg_av);
47699ebb4caSwyllys 			if (kstype == 0)
47799ebb4caSwyllys 				return (PK_ERR_USAGE);
47899ebb4caSwyllys 			break;
47999ebb4caSwyllys 		case 's':
48099ebb4caSwyllys 			subject = optarg_av;
48199ebb4caSwyllys 			break;
48299ebb4caSwyllys 		case 'i':
48399ebb4caSwyllys 			issuer = optarg_av;
48499ebb4caSwyllys 			break;
48599ebb4caSwyllys 		case 'd':
48699ebb4caSwyllys 			dir = optarg_av;
48799ebb4caSwyllys 			break;
48899ebb4caSwyllys 		case 'p':
48999ebb4caSwyllys 			prefix = optarg_av;
49099ebb4caSwyllys 			break;
49199ebb4caSwyllys 		case 'S':
49299ebb4caSwyllys 			serstr = optarg_av;
49399ebb4caSwyllys 			break;
49499ebb4caSwyllys 		case 'f':
49599ebb4caSwyllys 			infile = optarg_av;
49699ebb4caSwyllys 			break;
49799ebb4caSwyllys 		case 'c':
49899ebb4caSwyllys 			find_criteria = optarg_av;
49999ebb4caSwyllys 			if (!strcasecmp(find_criteria, "valid"))
50099ebb4caSwyllys 				find_criteria_flag =
50199ebb4caSwyllys 					KMF_NONEXPIRED_CERTS;
50299ebb4caSwyllys 			else if (!strcasecmp(find_criteria, "expired"))
50399ebb4caSwyllys 				find_criteria_flag = KMF_EXPIRED_CERTS;
50499ebb4caSwyllys 			else if (!strcasecmp(find_criteria, "both"))
50599ebb4caSwyllys 				find_criteria_flag = KMF_ALL_CERTS;
50699ebb4caSwyllys 			else
50799ebb4caSwyllys 				return (PK_ERR_USAGE);
5087711facfSdinak 			break;
5097711facfSdinak 		default:
5107711facfSdinak 			return (PK_ERR_USAGE);
5117711facfSdinak 			break;
5127711facfSdinak 		}
5137711facfSdinak 	}
5147711facfSdinak 
51599ebb4caSwyllys 	/* Assume keystore = PKCS#11 if not specified */
51699ebb4caSwyllys 	if (kstype == 0)
51799ebb4caSwyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
51899ebb4caSwyllys 
51999ebb4caSwyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
52099ebb4caSwyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
52199ebb4caSwyllys 		kstype != KMF_KEYSTORE_PK11TOKEN) {
52299ebb4caSwyllys 
52399ebb4caSwyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
52499ebb4caSwyllys 			"is only relevant if keystore=pkcs11\n"));
52549e21299Sdinak 		return (PK_ERR_USAGE);
52649e21299Sdinak 	}
52749e21299Sdinak 
52899ebb4caSwyllys 	/* If no object class specified, delete everything but CRLs */
52999ebb4caSwyllys 	if (oclass == 0)
53099ebb4caSwyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ |
53199ebb4caSwyllys 			PK_SYMKEY_OBJ;
5327711facfSdinak 
5337711facfSdinak 	/* No additional args allowed. */
53449e21299Sdinak 	argc -= optind_av;
53549e21299Sdinak 	argv += optind_av;
5367711facfSdinak 	if (argc)
5377711facfSdinak 		return (PK_ERR_USAGE);
5387711facfSdinak 	/* Done parsing command line options. */
5397711facfSdinak 
54099ebb4caSwyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) {
54199ebb4caSwyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
54299ebb4caSwyllys 	} else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) {
54399ebb4caSwyllys 		token_spec = DEFAULT_NSS_TOKEN;
5447711facfSdinak 	}
5457711facfSdinak 
54699ebb4caSwyllys 	if (serstr != NULL) {
54799ebb4caSwyllys 		uchar_t *bytes = NULL;
54899ebb4caSwyllys 		size_t bytelen;
54999ebb4caSwyllys 
55099ebb4caSwyllys 		rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
55199ebb4caSwyllys 		if (rv != KMF_OK || bytes == NULL) {
55299ebb4caSwyllys 			(void) fprintf(stderr, gettext("serial number "
55399ebb4caSwyllys 				"must be specified as a hex number "
55499ebb4caSwyllys 				"(ex: 0x0102030405ffeeddee)\n"));
55599ebb4caSwyllys 			return (PK_ERR_USAGE);
55699ebb4caSwyllys 		}
55799ebb4caSwyllys 		serial.val = bytes;
55899ebb4caSwyllys 		serial.len = bytelen;
5597711facfSdinak 	}
5607711facfSdinak 
56199ebb4caSwyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
56299ebb4caSwyllys 		kstype == KMF_KEYSTORE_NSS) &&
56399ebb4caSwyllys 		(oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
56499ebb4caSwyllys 
56599ebb4caSwyllys 		(void) get_token_password(kstype, token_spec,
56699ebb4caSwyllys 			&tokencred);
5677711facfSdinak 	}
5687711facfSdinak 
56999ebb4caSwyllys 	if ((kmfrv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
57099ebb4caSwyllys 		return (kmfrv);
5717711facfSdinak 
57299ebb4caSwyllys 	switch (kstype) {
57399ebb4caSwyllys 		case KMF_KEYSTORE_PK11TOKEN:
57499ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
57599ebb4caSwyllys 				kmfrv = delete_pk11_keys(kmfhandle,
57699ebb4caSwyllys 						token_spec, oclass,
57799ebb4caSwyllys 						object_label,
57899ebb4caSwyllys 						&tokencred);
5797711facfSdinak 				/*
58099ebb4caSwyllys 				 * If deleting groups of objects, it is OK
58199ebb4caSwyllys 				 * to ignore the "key not found" case so that
58299ebb4caSwyllys 				 * we can continue to find other objects.
5837711facfSdinak 				 */
58499ebb4caSwyllys 				if (kmfrv == KMF_ERR_KEY_NOT_FOUND &&
58599ebb4caSwyllys 					(oclass != PK_KEY_OBJ))
58699ebb4caSwyllys 					kmfrv = KMF_OK;
58799ebb4caSwyllys 				if (kmfrv != KMF_OK)
58899ebb4caSwyllys 					break;
5897711facfSdinak 			}
59099ebb4caSwyllys 			if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
59199ebb4caSwyllys 				kmfrv = delete_pk11_certs(kmfhandle,
59299ebb4caSwyllys 						token_spec,
59399ebb4caSwyllys 						object_label,
59499ebb4caSwyllys 						&serial, issuer,
59599ebb4caSwyllys 						subject, find_criteria_flag);
59699ebb4caSwyllys 				/*
59799ebb4caSwyllys 				 * If cert delete failed, but we are looking at
59899ebb4caSwyllys 				 * other objects, then it is OK.
59999ebb4caSwyllys 				 */
60099ebb4caSwyllys 				if (kmfrv == KMF_ERR_CERT_NOT_FOUND &&
60199ebb4caSwyllys 					(oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
60299ebb4caSwyllys 					kmfrv = KMF_OK;
60399ebb4caSwyllys 				if (kmfrv != KMF_OK)
60499ebb4caSwyllys 					break;
6057711facfSdinak 			}
60699ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
60799ebb4caSwyllys 				kmfrv = delete_file_crl(kmfhandle,
60899ebb4caSwyllys 						dir, infile);
60999ebb4caSwyllys 			break;
61099ebb4caSwyllys 		case KMF_KEYSTORE_NSS:
61199ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
61299ebb4caSwyllys 				kmfrv = delete_nss_keys(kmfhandle,
61399ebb4caSwyllys 					dir, prefix, token_spec,
61499ebb4caSwyllys 					oclass, (char  *)object_label,
61599ebb4caSwyllys 					&tokencred);
61699ebb4caSwyllys 				if (kmfrv != KMF_OK)
61799ebb4caSwyllys 					break;
61899ebb4caSwyllys 			}
61999ebb4caSwyllys 			if (oclass & PK_CERT_OBJ) {
62099ebb4caSwyllys 				kmfrv = delete_nss_certs(kmfhandle,
62199ebb4caSwyllys 					dir, prefix, token_spec,
62299ebb4caSwyllys 					(char  *)object_label,
62399ebb4caSwyllys 					&serial, issuer, subject,
62499ebb4caSwyllys 					find_criteria_flag);
62599ebb4caSwyllys 				if (kmfrv != KMF_OK)
62699ebb4caSwyllys 					break;
62799ebb4caSwyllys 			}
62899ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
62999ebb4caSwyllys 				kmfrv = delete_nss_crl(kmfhandle,
63099ebb4caSwyllys 					dir, prefix, token_spec,
63199ebb4caSwyllys 					(char  *)object_label, subject);
63299ebb4caSwyllys 			break;
63399ebb4caSwyllys 		case KMF_KEYSTORE_OPENSSL:
63499ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
63599ebb4caSwyllys 				kmfrv = delete_file_keys(kmfhandle, oclass,
63699ebb4caSwyllys 					dir, infile);
63799ebb4caSwyllys 				if (kmfrv != KMF_OK)
63899ebb4caSwyllys 					break;
63999ebb4caSwyllys 			}
64099ebb4caSwyllys 			if (oclass & (PK_CERT_OBJ)) {
64199ebb4caSwyllys 				kmfrv = delete_file_certs(kmfhandle,
64299ebb4caSwyllys 					dir, infile, &serial, issuer,
64399ebb4caSwyllys 					subject, find_criteria_flag);
64499ebb4caSwyllys 				if (kmfrv != KMF_OK)
64599ebb4caSwyllys 					break;
64699ebb4caSwyllys 			}
64799ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
64899ebb4caSwyllys 				kmfrv = delete_file_crl(kmfhandle,
64999ebb4caSwyllys 					dir, infile);
65099ebb4caSwyllys 			break;
65199ebb4caSwyllys 		default:
65299ebb4caSwyllys 			rv = PK_ERR_USAGE;
65399ebb4caSwyllys 			break;
6547711facfSdinak 	}
6557711facfSdinak 
65699ebb4caSwyllys 	if (kmfrv != KMF_OK) {
65799ebb4caSwyllys 		display_error(kmfhandle, kmfrv,
65899ebb4caSwyllys 			gettext("Error deleting objects"));
6597711facfSdinak 	}
6607711facfSdinak 
66199ebb4caSwyllys 	if (serial.val != NULL)
66299ebb4caSwyllys 		free(serial.val);
66399ebb4caSwyllys 	(void) KMF_Finalize(kmfhandle);
66499ebb4caSwyllys 	return (kmfrv);
6657711facfSdinak }
666