xref: /titanic_50/usr/src/cmd/cmd-crypto/pktool/delete.c (revision 99ebb4ca412cb0a19d77a3899a87c055b9c30fa8)
17711facfSdinak /*
27711facfSdinak  * CDDL HEADER START
37711facfSdinak  *
47711facfSdinak  * The contents of this file are subject to the terms of the
5*99ebb4caSwyllys  * Common Development and Distribution License (the "License").
6*99ebb4caSwyllys  * 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*99ebb4caSwyllys  * Copyright 2006 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"
39*99ebb4caSwyllys #include <kmfapi.h>
40*99ebb4caSwyllys 
41*99ebb4caSwyllys static KMF_RETURN
42*99ebb4caSwyllys pk_destroy_keys(void *handle, KMF_KEY_HANDLE *keys,
43*99ebb4caSwyllys 	KMF_FINDKEY_PARAMS *fkparams, uint32_t numkeys)
44*99ebb4caSwyllys {
45*99ebb4caSwyllys 	int i;
46*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
47*99ebb4caSwyllys 	KMF_DELETEKEY_PARAMS dkparams;
48*99ebb4caSwyllys 
49*99ebb4caSwyllys 	(void) memset(&dkparams, 0, sizeof (dkparams));
50*99ebb4caSwyllys 	dkparams.kstype = fkparams->kstype;
51*99ebb4caSwyllys 
52*99ebb4caSwyllys 	switch (fkparams->kstype) {
53*99ebb4caSwyllys 	case KMF_KEYSTORE_NSS:
54*99ebb4caSwyllys 		dkparams.nssparms = fkparams->nssparms;
55*99ebb4caSwyllys 		dkparams.cred = fkparams->cred;
56*99ebb4caSwyllys 		break;
57*99ebb4caSwyllys 	case KMF_KEYSTORE_OPENSSL:
58*99ebb4caSwyllys 		break;
59*99ebb4caSwyllys 	case KMF_KEYSTORE_PK11TOKEN:
60*99ebb4caSwyllys 		dkparams.cred = fkparams->cred;
61*99ebb4caSwyllys 		break;
62*99ebb4caSwyllys 	default:
63*99ebb4caSwyllys 		return (PK_ERR_USAGE);
64*99ebb4caSwyllys 	}
65*99ebb4caSwyllys 
66*99ebb4caSwyllys 	for (i = 0; rv == KMF_OK && i < numkeys; i++) {
67*99ebb4caSwyllys 		rv = KMF_DeleteKeyFromKeystore(handle, &dkparams, &keys[i]);
68*99ebb4caSwyllys 	}
69*99ebb4caSwyllys 	return (rv);
70*99ebb4caSwyllys }
71*99ebb4caSwyllys 
72*99ebb4caSwyllys static KMF_RETURN
73*99ebb4caSwyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc,
74*99ebb4caSwyllys 	int *keysdeleted)
75*99ebb4caSwyllys {
76*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
77*99ebb4caSwyllys 	uint32_t numkeys = 0;
78*99ebb4caSwyllys 
79*99ebb4caSwyllys 	*keysdeleted = 0;
80*99ebb4caSwyllys 	numkeys = 0;
81*99ebb4caSwyllys 	rv = KMF_FindKey(kmfhandle, parms, NULL, &numkeys);
82*99ebb4caSwyllys 	if (rv == KMF_OK && numkeys > 0) {
83*99ebb4caSwyllys 		KMF_KEY_HANDLE *keys = NULL;
84*99ebb4caSwyllys 		char prompt[1024];
85*99ebb4caSwyllys 
86*99ebb4caSwyllys 		(void) snprintf(prompt, sizeof (prompt),
87*99ebb4caSwyllys 			gettext("%d %s key(s) found, do you want "
88*99ebb4caSwyllys 			"to delete them (y/N) ?"), numkeys,
89*99ebb4caSwyllys 			(desc != NULL ? desc : ""));
90*99ebb4caSwyllys 
91*99ebb4caSwyllys 		if (!yesno(prompt,
92*99ebb4caSwyllys 			gettext("Respond with yes or no.\n"),
93*99ebb4caSwyllys 			B_FALSE)) {
94*99ebb4caSwyllys 			return (KMF_OK);
95*99ebb4caSwyllys 		}
96*99ebb4caSwyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
97*99ebb4caSwyllys 				sizeof (KMF_KEY_HANDLE));
98*99ebb4caSwyllys 		if (keys == NULL)
99*99ebb4caSwyllys 			return (KMF_ERR_MEMORY);
100*99ebb4caSwyllys 		(void) memset(keys, 0, numkeys *
101*99ebb4caSwyllys 			sizeof (KMF_KEY_HANDLE));
102*99ebb4caSwyllys 
103*99ebb4caSwyllys 		rv = KMF_FindKey(kmfhandle, parms, keys, &numkeys);
104*99ebb4caSwyllys 		if (rv == KMF_OK) {
105*99ebb4caSwyllys 			rv = pk_destroy_keys(kmfhandle, keys,
106*99ebb4caSwyllys 				parms, numkeys);
107*99ebb4caSwyllys 		}
108*99ebb4caSwyllys 
109*99ebb4caSwyllys 		free(keys);
110*99ebb4caSwyllys 	}
111*99ebb4caSwyllys 
112*99ebb4caSwyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND) {
113*99ebb4caSwyllys 		rv = KMF_OK;
114*99ebb4caSwyllys 	}
115*99ebb4caSwyllys 
116*99ebb4caSwyllys 	*keysdeleted = numkeys;
117*99ebb4caSwyllys 	return (rv);
118*99ebb4caSwyllys }
119*99ebb4caSwyllys 
120*99ebb4caSwyllys static KMF_RETURN
121*99ebb4caSwyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *fcparms,
122*99ebb4caSwyllys 	KMF_DELETECERT_PARAMS *dcparms)
123*99ebb4caSwyllys {
124*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
125*99ebb4caSwyllys 	uint32_t numcerts = 0;
126*99ebb4caSwyllys 
127*99ebb4caSwyllys 	rv = KMF_FindCert(kmfhandle, fcparms, NULL, &numcerts);
128*99ebb4caSwyllys 	if (rv == KMF_OK && numcerts > 0) {
129*99ebb4caSwyllys 		char prompt[1024];
130*99ebb4caSwyllys 		(void) snprintf(prompt, sizeof (prompt),
131*99ebb4caSwyllys 			gettext("%d certificate(s) found, do you want "
132*99ebb4caSwyllys 			"to delete them (y/N) ?"), numcerts);
133*99ebb4caSwyllys 
134*99ebb4caSwyllys 		if (!yesno(prompt,
135*99ebb4caSwyllys 			gettext("Respond with yes or no.\n"),
136*99ebb4caSwyllys 			B_FALSE)) {
137*99ebb4caSwyllys 			return (KMF_OK);
138*99ebb4caSwyllys 		}
139*99ebb4caSwyllys 
140*99ebb4caSwyllys 		rv = KMF_DeleteCertFromKeystore(kmfhandle, dcparms);
141*99ebb4caSwyllys 
142*99ebb4caSwyllys 	} else if (rv == KMF_ERR_CERT_NOT_FOUND) {
143*99ebb4caSwyllys 		rv = KMF_OK;
144*99ebb4caSwyllys 	}
145*99ebb4caSwyllys 
146*99ebb4caSwyllys 	return (rv);
147*99ebb4caSwyllys }
148*99ebb4caSwyllys 
149*99ebb4caSwyllys static KMF_RETURN
150*99ebb4caSwyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix,
151*99ebb4caSwyllys 	char *token, int oclass, char *objlabel,
152*99ebb4caSwyllys 	KMF_CREDENTIAL *tokencred)
153*99ebb4caSwyllys {
154*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
155*99ebb4caSwyllys 	KMF_FINDKEY_PARAMS parms;
156*99ebb4caSwyllys 	char *keytype = NULL;
157*99ebb4caSwyllys 	int nk, numkeys = 0;
158*99ebb4caSwyllys 
159*99ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
160*99ebb4caSwyllys 	if (rv != KMF_OK)
161*99ebb4caSwyllys 		return (rv);
162*99ebb4caSwyllys 
163*99ebb4caSwyllys 	(void) memset(&parms, 0, sizeof (parms));
164*99ebb4caSwyllys 	parms.kstype = KMF_KEYSTORE_NSS;
165*99ebb4caSwyllys 	parms.findLabel = objlabel;
166*99ebb4caSwyllys 	parms.cred = *tokencred;
167*99ebb4caSwyllys 	parms.nssparms.slotlabel = token;
168*99ebb4caSwyllys 
169*99ebb4caSwyllys 	if (oclass & PK_PRIKEY_OBJ) {
170*99ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PRI;
171*99ebb4caSwyllys 		keytype = "private";
172*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
173*99ebb4caSwyllys 		numkeys += nk;
174*99ebb4caSwyllys 	}
175*99ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
176*99ebb4caSwyllys 		parms.keyclass = KMF_SYMMETRIC;
177*99ebb4caSwyllys 		keytype = "symmetric";
178*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
179*99ebb4caSwyllys 		numkeys += nk;
180*99ebb4caSwyllys 	}
181*99ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
182*99ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PUB;
183*99ebb4caSwyllys 		keytype = "public";
184*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
185*99ebb4caSwyllys 		numkeys += nk;
186*99ebb4caSwyllys 	}
187*99ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
188*99ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
189*99ebb4caSwyllys 
190*99ebb4caSwyllys 	return (rv);
191*99ebb4caSwyllys }
192*99ebb4caSwyllys 
193*99ebb4caSwyllys 
194*99ebb4caSwyllys static KMF_RETURN
195*99ebb4caSwyllys delete_nss_certs(KMF_HANDLE_T kmfhandle,
196*99ebb4caSwyllys 	char *dir, char *prefix,
197*99ebb4caSwyllys 	char *token, char *objlabel,
198*99ebb4caSwyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
199*99ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
200*99ebb4caSwyllys {
201*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
202*99ebb4caSwyllys 	KMF_DELETECERT_PARAMS dcparms;
203*99ebb4caSwyllys 	KMF_FINDCERT_PARAMS fcargs;
204*99ebb4caSwyllys 
205*99ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
206*99ebb4caSwyllys 	if (rv != KMF_OK)
207*99ebb4caSwyllys 		return (rv);
208*99ebb4caSwyllys 
209*99ebb4caSwyllys 	(void) memset(&dcparms, 0, sizeof (dcparms));
210*99ebb4caSwyllys 	dcparms.kstype = KMF_KEYSTORE_NSS;
211*99ebb4caSwyllys 	dcparms.certLabel = objlabel;
212*99ebb4caSwyllys 	dcparms.issuer = issuer;
213*99ebb4caSwyllys 	dcparms.subject = subject;
214*99ebb4caSwyllys 	dcparms.serial = serno;
215*99ebb4caSwyllys 	dcparms.find_cert_validity = find_criteria_flag;
216*99ebb4caSwyllys 	dcparms.nssparms.slotlabel = token;
217*99ebb4caSwyllys 
218*99ebb4caSwyllys 	(void) memset(&fcargs, 0, sizeof (fcargs));
219*99ebb4caSwyllys 	fcargs.kstype = KMF_KEYSTORE_NSS;
220*99ebb4caSwyllys 	fcargs.certLabel = objlabel;
221*99ebb4caSwyllys 	fcargs.issuer = issuer;
222*99ebb4caSwyllys 	fcargs.subject = subject;
223*99ebb4caSwyllys 	fcargs.serial = serno;
224*99ebb4caSwyllys 	fcargs.find_cert_validity = find_criteria_flag;
225*99ebb4caSwyllys 	fcargs.nssparms.slotlabel = token;
226*99ebb4caSwyllys 
227*99ebb4caSwyllys 	rv = pk_delete_certs(kmfhandle, &fcargs, &dcparms);
228*99ebb4caSwyllys 
229*99ebb4caSwyllys 	return (rv);
230*99ebb4caSwyllys }
231*99ebb4caSwyllys 
232*99ebb4caSwyllys static KMF_RETURN
233*99ebb4caSwyllys delete_nss_crl(void *kmfhandle,
234*99ebb4caSwyllys 	char *dir, char *prefix, char *token,
235*99ebb4caSwyllys 	char *issuernickname, char *subject)
236*99ebb4caSwyllys {
237*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
238*99ebb4caSwyllys 	KMF_DELETECRL_PARAMS dcrlparms;
239*99ebb4caSwyllys 
240*99ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
241*99ebb4caSwyllys 	if (rv != KMF_OK)
242*99ebb4caSwyllys 		return (rv);
243*99ebb4caSwyllys 
244*99ebb4caSwyllys 	(void) memset(&dcrlparms, 0, sizeof (dcrlparms));
245*99ebb4caSwyllys 
246*99ebb4caSwyllys 	dcrlparms.kstype = KMF_KEYSTORE_NSS;
247*99ebb4caSwyllys 	dcrlparms.nssparms.slotlabel = token;
248*99ebb4caSwyllys 	dcrlparms.nssparms.crl_issuerName = issuernickname;
249*99ebb4caSwyllys 	dcrlparms.nssparms.crl_subjName = subject;
250*99ebb4caSwyllys 
251*99ebb4caSwyllys 	rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
252*99ebb4caSwyllys 
253*99ebb4caSwyllys 	return (rv);
254*99ebb4caSwyllys }
255*99ebb4caSwyllys 
256*99ebb4caSwyllys static KMF_RETURN
257*99ebb4caSwyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle,
258*99ebb4caSwyllys 	char *token, int oclass, char *objlabel,
259*99ebb4caSwyllys 	KMF_CREDENTIAL *tokencred)
260*99ebb4caSwyllys {
261*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
262*99ebb4caSwyllys 	KMF_FINDKEY_PARAMS parms;
263*99ebb4caSwyllys 	int nk, numkeys = 0;
264*99ebb4caSwyllys 
265*99ebb4caSwyllys 	/*
266*99ebb4caSwyllys 	 * Symmetric keys and RSA/DSA private keys are always
267*99ebb4caSwyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
268*99ebb4caSwyllys 	 * make sure we search for them with it also set.
269*99ebb4caSwyllys 	 */
270*99ebb4caSwyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
271*99ebb4caSwyllys 		oclass |= PK_PRIVATE_OBJ;
272*99ebb4caSwyllys 
273*99ebb4caSwyllys 	rv = select_token(kmfhandle, token, FALSE);
274*99ebb4caSwyllys 	if (rv != KMF_OK) {
275*99ebb4caSwyllys 		return (rv);
276*99ebb4caSwyllys 	}
277*99ebb4caSwyllys 
278*99ebb4caSwyllys 	(void) memset(&parms, 0, sizeof (parms));
279*99ebb4caSwyllys 	parms.kstype = KMF_KEYSTORE_PK11TOKEN;
280*99ebb4caSwyllys 	parms.findLabel = (char *)objlabel;
281*99ebb4caSwyllys 	parms.keytype = 0;
282*99ebb4caSwyllys 	parms.pkcs11parms.private = ((oclass & PK_PRIVATE_OBJ) > 0);
283*99ebb4caSwyllys 	parms.cred.cred = tokencred->cred;
284*99ebb4caSwyllys 	parms.cred.credlen = tokencred->credlen;
285*99ebb4caSwyllys 
286*99ebb4caSwyllys 	if (oclass & PK_PRIKEY_OBJ) {
287*99ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PRI;
288*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, "private", &nk);
289*99ebb4caSwyllys 		numkeys += nk;
290*99ebb4caSwyllys 	}
291*99ebb4caSwyllys 
292*99ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
293*99ebb4caSwyllys 		parms.keyclass = KMF_SYMMETRIC;
294*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, "symmetric", &nk);
295*99ebb4caSwyllys 		numkeys += nk;
296*99ebb4caSwyllys 	}
297*99ebb4caSwyllys 
298*99ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
299*99ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PUB;
300*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, "public", &nk);
301*99ebb4caSwyllys 		numkeys += nk;
302*99ebb4caSwyllys 	}
303*99ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
304*99ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
305*99ebb4caSwyllys 
306*99ebb4caSwyllys 	return (rv);
307*99ebb4caSwyllys }
308*99ebb4caSwyllys 
309*99ebb4caSwyllys static KMF_RETURN
310*99ebb4caSwyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle,
311*99ebb4caSwyllys 	char *token, char *objlabel,
312*99ebb4caSwyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
313*99ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
314*99ebb4caSwyllys {
315*99ebb4caSwyllys 	KMF_RETURN kmfrv;
316*99ebb4caSwyllys 	KMF_DELETECERT_PARAMS dparms;
317*99ebb4caSwyllys 	KMF_FINDCERT_PARAMS fcargs;
318*99ebb4caSwyllys 
319*99ebb4caSwyllys 	kmfrv = select_token(kmfhandle, token, FALSE);
320*99ebb4caSwyllys 
321*99ebb4caSwyllys 	if (kmfrv != KMF_OK) {
322*99ebb4caSwyllys 		return (kmfrv);
323*99ebb4caSwyllys 	}
324*99ebb4caSwyllys 
325*99ebb4caSwyllys 	(void) memset(&dparms, 0, sizeof (dparms));
326*99ebb4caSwyllys 	dparms.kstype = KMF_KEYSTORE_PK11TOKEN;
327*99ebb4caSwyllys 	dparms.certLabel = objlabel;
328*99ebb4caSwyllys 	dparms.issuer = issuer;
329*99ebb4caSwyllys 	dparms.subject = subject;
330*99ebb4caSwyllys 	dparms.serial = serno;
331*99ebb4caSwyllys 	dparms.find_cert_validity = find_criteria_flag;
332*99ebb4caSwyllys 
333*99ebb4caSwyllys 	fcargs = dparms;
334*99ebb4caSwyllys 	kmfrv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
335*99ebb4caSwyllys 
336*99ebb4caSwyllys 	return (kmfrv);
337*99ebb4caSwyllys }
338*99ebb4caSwyllys 
339*99ebb4caSwyllys static KMF_RETURN
340*99ebb4caSwyllys delete_file_certs(KMF_HANDLE_T kmfhandle,
341*99ebb4caSwyllys 	char *dir, char *filename, KMF_BIGINT *serial, char *issuer,
342*99ebb4caSwyllys 	char *subject, KMF_CERT_VALIDITY find_criteria_flag)
343*99ebb4caSwyllys {
344*99ebb4caSwyllys 	KMF_RETURN rv;
345*99ebb4caSwyllys 	KMF_DELETECERT_PARAMS dparms;
346*99ebb4caSwyllys 	KMF_FINDCERT_PARAMS fcargs;
347*99ebb4caSwyllys 
348*99ebb4caSwyllys 	(void *)memset(&dparms, 0, sizeof (dparms));
349*99ebb4caSwyllys 	(void *)memset(&fcargs, 0, sizeof (fcargs));
350*99ebb4caSwyllys 	fcargs.kstype = KMF_KEYSTORE_OPENSSL;
351*99ebb4caSwyllys 	fcargs.certLabel = NULL;
352*99ebb4caSwyllys 	fcargs.issuer = issuer;
353*99ebb4caSwyllys 	fcargs.subject = subject;
354*99ebb4caSwyllys 	fcargs.serial = serial;
355*99ebb4caSwyllys 	fcargs.sslparms.dirpath = dir;
356*99ebb4caSwyllys 	fcargs.sslparms.certfile = filename;
357*99ebb4caSwyllys 	fcargs.find_cert_validity = find_criteria_flag;
358*99ebb4caSwyllys 
359*99ebb4caSwyllys 	/* For now, delete parameters and find parameters are the same */
360*99ebb4caSwyllys 	dparms = fcargs;
361*99ebb4caSwyllys 
362*99ebb4caSwyllys 	rv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
363*99ebb4caSwyllys 
364*99ebb4caSwyllys 	return (rv);
365*99ebb4caSwyllys }
366*99ebb4caSwyllys 
367*99ebb4caSwyllys static KMF_RETURN
368*99ebb4caSwyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass,
369*99ebb4caSwyllys 	char *dir, char *infile)
370*99ebb4caSwyllys {
371*99ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
372*99ebb4caSwyllys 	KMF_FINDKEY_PARAMS parms;
373*99ebb4caSwyllys 	char *keytype = "";
374*99ebb4caSwyllys 	int nk, numkeys = 0;
375*99ebb4caSwyllys 
376*99ebb4caSwyllys 	(void) memset(&parms, 0, sizeof (parms));
377*99ebb4caSwyllys 	parms.kstype = KMF_KEYSTORE_OPENSSL;
378*99ebb4caSwyllys 	parms.sslparms.dirpath = dir;
379*99ebb4caSwyllys 	parms.sslparms.keyfile = infile;
380*99ebb4caSwyllys 
381*99ebb4caSwyllys 	if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) {
382*99ebb4caSwyllys 		parms.keyclass = KMF_ASYM_PRI;
383*99ebb4caSwyllys 		keytype = "Asymmetric";
384*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
385*99ebb4caSwyllys 		numkeys += nk;
386*99ebb4caSwyllys 	}
387*99ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
388*99ebb4caSwyllys 		parms.keyclass = KMF_SYMMETRIC;
389*99ebb4caSwyllys 		keytype = "symmetric";
390*99ebb4caSwyllys 		rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
391*99ebb4caSwyllys 		numkeys += nk;
392*99ebb4caSwyllys 	}
393*99ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
394*99ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
395*99ebb4caSwyllys 
396*99ebb4caSwyllys 	return (rv);
397*99ebb4caSwyllys }
398*99ebb4caSwyllys 
399*99ebb4caSwyllys static KMF_RETURN
400*99ebb4caSwyllys delete_file_crl(void *kmfhandle, char *dir, char *filename)
401*99ebb4caSwyllys {
402*99ebb4caSwyllys 	KMF_RETURN rv;
403*99ebb4caSwyllys 	KMF_DELETECRL_PARAMS dcrlparms;
404*99ebb4caSwyllys 
405*99ebb4caSwyllys 	(void) memset(&dcrlparms, 0, sizeof (dcrlparms));
406*99ebb4caSwyllys 
407*99ebb4caSwyllys 	dcrlparms.kstype = KMF_KEYSTORE_OPENSSL;
408*99ebb4caSwyllys 	dcrlparms.sslparms.dirpath = dir;
409*99ebb4caSwyllys 	dcrlparms.sslparms.crlfile = filename;
410*99ebb4caSwyllys 
411*99ebb4caSwyllys 	rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
412*99ebb4caSwyllys 
413*99ebb4caSwyllys 	return (rv);
414*99ebb4caSwyllys }
4157711facfSdinak 
4167711facfSdinak /*
4177711facfSdinak  * Delete token objects.
4187711facfSdinak  */
4197711facfSdinak int
4207711facfSdinak pk_delete(int argc, char *argv[])
4217711facfSdinak {
4227711facfSdinak 	int		opt;
42349e21299Sdinak 	extern int	optind_av;
42449e21299Sdinak 	extern char	*optarg_av;
42549e21299Sdinak 	char		*token_spec = NULL;
426*99ebb4caSwyllys 	char		*subject = NULL;
427*99ebb4caSwyllys 	char		*issuer = NULL;
428*99ebb4caSwyllys 	char		*dir = NULL;
429*99ebb4caSwyllys 	char		*prefix = NULL;
430*99ebb4caSwyllys 	char		*infile = NULL;
431*99ebb4caSwyllys 	char		*object_label = NULL;
432*99ebb4caSwyllys 	char		*serstr = NULL;
4337711facfSdinak 
434*99ebb4caSwyllys 	int		oclass = 0;
435*99ebb4caSwyllys 	KMF_BIGINT	serial = { NULL, 0 };
436*99ebb4caSwyllys 	KMF_HANDLE_T	kmfhandle = NULL;
437*99ebb4caSwyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
438*99ebb4caSwyllys 	KMF_RETURN	kmfrv;
439*99ebb4caSwyllys 	int		rv = 0;
440*99ebb4caSwyllys 	char			*find_criteria = NULL;
441*99ebb4caSwyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
442*99ebb4caSwyllys 	KMF_CREDENTIAL	tokencred = {NULL, 0};
4437711facfSdinak 
4447711facfSdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
44549e21299Sdinak 	while ((opt = getopt_av(argc, argv,
446*99ebb4caSwyllys 		"T:(token)y:(objtype)l:(label)"
447*99ebb4caSwyllys 		"k:(keystore)s:(subject)n:(nickname)"
448*99ebb4caSwyllys 		"d:(dir)p:(prefix)S:(serial)i:(issuer)"
449*99ebb4caSwyllys 		"c:(criteria)"
450*99ebb4caSwyllys 		"f:(infile)")) != EOF) {
451*99ebb4caSwyllys 
452*99ebb4caSwyllys 		if (EMPTYSTRING(optarg_av))
453*99ebb4caSwyllys 			return (PK_ERR_USAGE);
4547711facfSdinak 		switch (opt) {
45549e21299Sdinak 		case 'T':	/* token specifier */
45649e21299Sdinak 			if (token_spec)
45749e21299Sdinak 				return (PK_ERR_USAGE);
45849e21299Sdinak 			token_spec = optarg_av;
4597711facfSdinak 			break;
46049e21299Sdinak 		case 'y':	/* object type:  public, private, both */
461*99ebb4caSwyllys 			if (oclass)
46249e21299Sdinak 				return (PK_ERR_USAGE);
463*99ebb4caSwyllys 			oclass = OT2Int(optarg_av);
464*99ebb4caSwyllys 			if (oclass == -1)
465*99ebb4caSwyllys 				return (PK_ERR_USAGE);
4667711facfSdinak 			break;
4677711facfSdinak 		case 'l':	/* objects with specific label */
468*99ebb4caSwyllys 		case 'n':
4697711facfSdinak 			if (object_label)
4707711facfSdinak 				return (PK_ERR_USAGE);
471*99ebb4caSwyllys 			object_label = (char *)optarg_av;
472*99ebb4caSwyllys 			break;
473*99ebb4caSwyllys 		case 'k':
474*99ebb4caSwyllys 			kstype = KS2Int(optarg_av);
475*99ebb4caSwyllys 			if (kstype == 0)
476*99ebb4caSwyllys 				return (PK_ERR_USAGE);
477*99ebb4caSwyllys 			break;
478*99ebb4caSwyllys 		case 's':
479*99ebb4caSwyllys 			subject = optarg_av;
480*99ebb4caSwyllys 			break;
481*99ebb4caSwyllys 		case 'i':
482*99ebb4caSwyllys 			issuer = optarg_av;
483*99ebb4caSwyllys 			break;
484*99ebb4caSwyllys 		case 'd':
485*99ebb4caSwyllys 			dir = optarg_av;
486*99ebb4caSwyllys 			break;
487*99ebb4caSwyllys 		case 'p':
488*99ebb4caSwyllys 			prefix = optarg_av;
489*99ebb4caSwyllys 			break;
490*99ebb4caSwyllys 		case 'S':
491*99ebb4caSwyllys 			serstr = optarg_av;
492*99ebb4caSwyllys 			break;
493*99ebb4caSwyllys 		case 'f':
494*99ebb4caSwyllys 			infile = optarg_av;
495*99ebb4caSwyllys 			break;
496*99ebb4caSwyllys 		case 'c':
497*99ebb4caSwyllys 			find_criteria = optarg_av;
498*99ebb4caSwyllys 			if (!strcasecmp(find_criteria, "valid"))
499*99ebb4caSwyllys 				find_criteria_flag =
500*99ebb4caSwyllys 					KMF_NONEXPIRED_CERTS;
501*99ebb4caSwyllys 			else if (!strcasecmp(find_criteria, "expired"))
502*99ebb4caSwyllys 				find_criteria_flag = KMF_EXPIRED_CERTS;
503*99ebb4caSwyllys 			else if (!strcasecmp(find_criteria, "both"))
504*99ebb4caSwyllys 				find_criteria_flag = KMF_ALL_CERTS;
505*99ebb4caSwyllys 			else
506*99ebb4caSwyllys 				return (PK_ERR_USAGE);
5077711facfSdinak 			break;
5087711facfSdinak 		default:
5097711facfSdinak 			return (PK_ERR_USAGE);
5107711facfSdinak 			break;
5117711facfSdinak 		}
5127711facfSdinak 	}
5137711facfSdinak 
514*99ebb4caSwyllys 	/* Assume keystore = PKCS#11 if not specified */
515*99ebb4caSwyllys 	if (kstype == 0)
516*99ebb4caSwyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
517*99ebb4caSwyllys 
518*99ebb4caSwyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
519*99ebb4caSwyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
520*99ebb4caSwyllys 		kstype != KMF_KEYSTORE_PK11TOKEN) {
521*99ebb4caSwyllys 
522*99ebb4caSwyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
523*99ebb4caSwyllys 			"is only relevant if keystore=pkcs11\n"));
52449e21299Sdinak 		return (PK_ERR_USAGE);
52549e21299Sdinak 	}
52649e21299Sdinak 
527*99ebb4caSwyllys 	/* If no object class specified, delete everything but CRLs */
528*99ebb4caSwyllys 	if (oclass == 0)
529*99ebb4caSwyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ |
530*99ebb4caSwyllys 			PK_SYMKEY_OBJ;
5317711facfSdinak 
5327711facfSdinak 	/* No additional args allowed. */
53349e21299Sdinak 	argc -= optind_av;
53449e21299Sdinak 	argv += optind_av;
5357711facfSdinak 	if (argc)
5367711facfSdinak 		return (PK_ERR_USAGE);
5377711facfSdinak 	/* Done parsing command line options. */
5387711facfSdinak 
539*99ebb4caSwyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) {
540*99ebb4caSwyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
541*99ebb4caSwyllys 	} else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) {
542*99ebb4caSwyllys 		token_spec = DEFAULT_NSS_TOKEN;
5437711facfSdinak 	}
5447711facfSdinak 
545*99ebb4caSwyllys 	if (serstr != NULL) {
546*99ebb4caSwyllys 		uchar_t *bytes = NULL;
547*99ebb4caSwyllys 		size_t bytelen;
548*99ebb4caSwyllys 
549*99ebb4caSwyllys 		rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
550*99ebb4caSwyllys 		if (rv != KMF_OK || bytes == NULL) {
551*99ebb4caSwyllys 			(void) fprintf(stderr, gettext("serial number "
552*99ebb4caSwyllys 				"must be specified as a hex number "
553*99ebb4caSwyllys 				"(ex: 0x0102030405ffeeddee)\n"));
554*99ebb4caSwyllys 			return (PK_ERR_USAGE);
555*99ebb4caSwyllys 		}
556*99ebb4caSwyllys 		serial.val = bytes;
557*99ebb4caSwyllys 		serial.len = bytelen;
5587711facfSdinak 	}
5597711facfSdinak 
560*99ebb4caSwyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
561*99ebb4caSwyllys 		kstype == KMF_KEYSTORE_NSS) &&
562*99ebb4caSwyllys 		(oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
563*99ebb4caSwyllys 
564*99ebb4caSwyllys 		(void) get_token_password(kstype, token_spec,
565*99ebb4caSwyllys 			&tokencred);
5667711facfSdinak 	}
5677711facfSdinak 
568*99ebb4caSwyllys 	if ((kmfrv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
569*99ebb4caSwyllys 		return (kmfrv);
5707711facfSdinak 
571*99ebb4caSwyllys 	switch (kstype) {
572*99ebb4caSwyllys 		case KMF_KEYSTORE_PK11TOKEN:
573*99ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
574*99ebb4caSwyllys 				kmfrv = delete_pk11_keys(kmfhandle,
575*99ebb4caSwyllys 						token_spec, oclass,
576*99ebb4caSwyllys 						object_label,
577*99ebb4caSwyllys 						&tokencred);
5787711facfSdinak 				/*
579*99ebb4caSwyllys 				 * If deleting groups of objects, it is OK
580*99ebb4caSwyllys 				 * to ignore the "key not found" case so that
581*99ebb4caSwyllys 				 * we can continue to find other objects.
5827711facfSdinak 				 */
583*99ebb4caSwyllys 				if (kmfrv == KMF_ERR_KEY_NOT_FOUND &&
584*99ebb4caSwyllys 					(oclass != PK_KEY_OBJ))
585*99ebb4caSwyllys 					kmfrv = KMF_OK;
586*99ebb4caSwyllys 				if (kmfrv != KMF_OK)
587*99ebb4caSwyllys 					break;
5887711facfSdinak 			}
589*99ebb4caSwyllys 			if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
590*99ebb4caSwyllys 				kmfrv = delete_pk11_certs(kmfhandle,
591*99ebb4caSwyllys 						token_spec,
592*99ebb4caSwyllys 						object_label,
593*99ebb4caSwyllys 						&serial, issuer,
594*99ebb4caSwyllys 						subject, find_criteria_flag);
595*99ebb4caSwyllys 				/*
596*99ebb4caSwyllys 				 * If cert delete failed, but we are looking at
597*99ebb4caSwyllys 				 * other objects, then it is OK.
598*99ebb4caSwyllys 				 */
599*99ebb4caSwyllys 				if (kmfrv == KMF_ERR_CERT_NOT_FOUND &&
600*99ebb4caSwyllys 					(oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
601*99ebb4caSwyllys 					kmfrv = KMF_OK;
602*99ebb4caSwyllys 				if (kmfrv != KMF_OK)
603*99ebb4caSwyllys 					break;
6047711facfSdinak 			}
605*99ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
606*99ebb4caSwyllys 				kmfrv = delete_file_crl(kmfhandle,
607*99ebb4caSwyllys 						dir, infile);
608*99ebb4caSwyllys 			break;
609*99ebb4caSwyllys 		case KMF_KEYSTORE_NSS:
610*99ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
611*99ebb4caSwyllys 				kmfrv = delete_nss_keys(kmfhandle,
612*99ebb4caSwyllys 					dir, prefix, token_spec,
613*99ebb4caSwyllys 					oclass, (char  *)object_label,
614*99ebb4caSwyllys 					&tokencred);
615*99ebb4caSwyllys 				if (kmfrv != KMF_OK)
616*99ebb4caSwyllys 					break;
617*99ebb4caSwyllys 			}
618*99ebb4caSwyllys 			if (oclass & PK_CERT_OBJ) {
619*99ebb4caSwyllys 				kmfrv = delete_nss_certs(kmfhandle,
620*99ebb4caSwyllys 					dir, prefix, token_spec,
621*99ebb4caSwyllys 					(char  *)object_label,
622*99ebb4caSwyllys 					&serial, issuer, subject,
623*99ebb4caSwyllys 					find_criteria_flag);
624*99ebb4caSwyllys 				if (kmfrv != KMF_OK)
625*99ebb4caSwyllys 					break;
626*99ebb4caSwyllys 			}
627*99ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
628*99ebb4caSwyllys 				kmfrv = delete_nss_crl(kmfhandle,
629*99ebb4caSwyllys 					dir, prefix, token_spec,
630*99ebb4caSwyllys 					(char  *)object_label, subject);
631*99ebb4caSwyllys 			break;
632*99ebb4caSwyllys 		case KMF_KEYSTORE_OPENSSL:
633*99ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
634*99ebb4caSwyllys 				kmfrv = delete_file_keys(kmfhandle, oclass,
635*99ebb4caSwyllys 					dir, infile);
636*99ebb4caSwyllys 				if (kmfrv != KMF_OK)
637*99ebb4caSwyllys 					break;
638*99ebb4caSwyllys 			}
639*99ebb4caSwyllys 			if (oclass & (PK_CERT_OBJ)) {
640*99ebb4caSwyllys 				kmfrv = delete_file_certs(kmfhandle,
641*99ebb4caSwyllys 					dir, infile, &serial, issuer,
642*99ebb4caSwyllys 					subject, find_criteria_flag);
643*99ebb4caSwyllys 				if (kmfrv != KMF_OK)
644*99ebb4caSwyllys 					break;
645*99ebb4caSwyllys 			}
646*99ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
647*99ebb4caSwyllys 				kmfrv = delete_file_crl(kmfhandle,
648*99ebb4caSwyllys 					dir, infile);
649*99ebb4caSwyllys 			break;
650*99ebb4caSwyllys 		default:
651*99ebb4caSwyllys 			rv = PK_ERR_USAGE;
652*99ebb4caSwyllys 			break;
6537711facfSdinak 	}
6547711facfSdinak 
655*99ebb4caSwyllys 	if (kmfrv != KMF_OK) {
656*99ebb4caSwyllys 		display_error(kmfhandle, kmfrv,
657*99ebb4caSwyllys 			gettext("Error deleting objects"));
6587711facfSdinak 	}
6597711facfSdinak 
660*99ebb4caSwyllys 	if (serial.val != NULL)
661*99ebb4caSwyllys 		free(serial.val);
662*99ebb4caSwyllys 	(void) KMF_Finalize(kmfhandle);
663*99ebb4caSwyllys 	return (kmfrv);
6647711facfSdinak }
665