xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/delete.c (revision 5051:cbbb7c8b40a9)
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 /*
223408Swyllys  * 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
42*5051Swyllys pk_destroy_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr)
433089Swyllys {
443089Swyllys 	int i;
453089Swyllys 	KMF_RETURN rv = KMF_OK;
46*5051Swyllys 	uint32_t *numkeys;
47*5051Swyllys 	KMF_KEY_HANDLE *keys = NULL;
48*5051Swyllys 	int del_num = 0;
49*5051Swyllys 	KMF_ATTRIBUTE delete_attlist[16];
50*5051Swyllys 	KMF_KEYSTORE_TYPE kstype;
51*5051Swyllys 	uint32_t len;
52*5051Swyllys 	boolean_t destroy = B_TRUE;
53*5051Swyllys 	KMF_CREDENTIAL cred;
54*5051Swyllys 	char *slotlabel = NULL;
553089Swyllys 
56*5051Swyllys 	len = sizeof (kstype);
57*5051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
58*5051Swyllys 	    &kstype, &len);
59*5051Swyllys 	if (rv != KMF_OK)
60*5051Swyllys 		return (rv);
61*5051Swyllys 
62*5051Swyllys 	kmf_set_attr_at_index(delete_attlist, del_num,
63*5051Swyllys 	    KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
64*5051Swyllys 	del_num++;
65*5051Swyllys 
66*5051Swyllys 	/* "destroy" is optional. Default is TRUE */
67*5051Swyllys 	(void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
68*5051Swyllys 	    (void *)&destroy, NULL);
693089Swyllys 
70*5051Swyllys 	kmf_set_attr_at_index(delete_attlist, del_num,
71*5051Swyllys 	    KMF_DESTROY_BOOL_ATTR, &destroy, sizeof (boolean_t));
72*5051Swyllys 	del_num++;
73*5051Swyllys 
74*5051Swyllys 	switch (kstype) {
753089Swyllys 	case KMF_KEYSTORE_NSS:
76*5051Swyllys 		rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
77*5051Swyllys 		    (void *)&cred, NULL);
78*5051Swyllys 		if (rv == KMF_OK) {
79*5051Swyllys 			if (cred.credlen > 0) {
80*5051Swyllys 				kmf_set_attr_at_index(delete_attlist, del_num,
81*5051Swyllys 				    KMF_CREDENTIAL_ATTR, &cred,
82*5051Swyllys 				    sizeof (KMF_CREDENTIAL));
83*5051Swyllys 				del_num++;
84*5051Swyllys 			}
85*5051Swyllys 		}
86*5051Swyllys 
87*5051Swyllys 		slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist,
88*5051Swyllys 		    numattr);
89*5051Swyllys 		if (slotlabel != NULL) {
90*5051Swyllys 			kmf_set_attr_at_index(delete_attlist, del_num,
91*5051Swyllys 			    KMF_TOKEN_LABEL_ATTR, slotlabel,
92*5051Swyllys 			    strlen(slotlabel));
93*5051Swyllys 			del_num++;
94*5051Swyllys 		}
953089Swyllys 		break;
963089Swyllys 	case KMF_KEYSTORE_OPENSSL:
973089Swyllys 		break;
983089Swyllys 	case KMF_KEYSTORE_PK11TOKEN:
99*5051Swyllys 		rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
100*5051Swyllys 		    (void *)&cred, NULL);
101*5051Swyllys 		if (rv == KMF_OK) {
102*5051Swyllys 			if (cred.credlen > 0) {
103*5051Swyllys 				kmf_set_attr_at_index(delete_attlist, del_num,
104*5051Swyllys 				    KMF_CREDENTIAL_ATTR, &cred,
105*5051Swyllys 				    sizeof (KMF_CREDENTIAL));
106*5051Swyllys 				del_num++;
107*5051Swyllys 			}
108*5051Swyllys 		}
1093089Swyllys 		break;
1103089Swyllys 	default:
1113089Swyllys 		return (PK_ERR_USAGE);
1123089Swyllys 	}
1133089Swyllys 
114*5051Swyllys 	numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
115*5051Swyllys 	if (numkeys == NULL)
116*5051Swyllys 		return (PK_ERR_USAGE);
117*5051Swyllys 
118*5051Swyllys 	keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
119*5051Swyllys 	if (keys == NULL)
120*5051Swyllys 		return (PK_ERR_USAGE);
121*5051Swyllys 
122*5051Swyllys 	for (i = 0; rv == KMF_OK && i < *numkeys; i++) {
123*5051Swyllys 		int num = del_num;
124*5051Swyllys 
125*5051Swyllys 		kmf_set_attr_at_index(delete_attlist, num,
126*5051Swyllys 		    KMF_KEY_HANDLE_ATTR, &keys[i], sizeof (KMF_KEY_HANDLE));
127*5051Swyllys 		num++;
128*5051Swyllys 
129*5051Swyllys 		rv = kmf_delete_key_from_keystore(handle, num, delete_attlist);
1303089Swyllys 	}
1313089Swyllys 	return (rv);
1323089Swyllys }
1333089Swyllys 
1343089Swyllys static KMF_RETURN
135*5051Swyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr,
136*5051Swyllys 	char *desc, int *keysdeleted)
1373089Swyllys {
1383089Swyllys 	KMF_RETURN rv = KMF_OK;
1393089Swyllys 	uint32_t numkeys = 0;
140*5051Swyllys 	int num = numattr;
1413089Swyllys 
1423089Swyllys 	*keysdeleted = 0;
1433089Swyllys 	numkeys = 0;
144*5051Swyllys 
145*5051Swyllys 	kmf_set_attr_at_index(attlist, num,
146*5051Swyllys 	    KMF_COUNT_ATTR, &numkeys, sizeof (uint32_t));
147*5051Swyllys 	num++;
148*5051Swyllys 
149*5051Swyllys 	rv = kmf_find_key(kmfhandle, num, attlist);
150*5051Swyllys 
1513089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
1523089Swyllys 		KMF_KEY_HANDLE *keys = NULL;
1533089Swyllys 		char prompt[1024];
1543089Swyllys 
1553089Swyllys 		(void) snprintf(prompt, sizeof (prompt),
156*5051Swyllys 		    gettext("%d %s key(s) found, do you want "
157*5051Swyllys 		    "to delete them (y/N) ?"), numkeys,
158*5051Swyllys 		    (desc != NULL ? desc : ""));
1593089Swyllys 
1603089Swyllys 		if (!yesno(prompt,
161*5051Swyllys 		    gettext("Respond with yes or no.\n"),
162*5051Swyllys 		    B_FALSE)) {
1633089Swyllys 			return (KMF_OK);
1643089Swyllys 		}
1653089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
166*5051Swyllys 		    sizeof (KMF_KEY_HANDLE));
1673089Swyllys 		if (keys == NULL)
1683089Swyllys 			return (KMF_ERR_MEMORY);
1693089Swyllys 		(void) memset(keys, 0, numkeys *
170*5051Swyllys 		    sizeof (KMF_KEY_HANDLE));
1713089Swyllys 
172*5051Swyllys 		kmf_set_attr_at_index(attlist, num,
173*5051Swyllys 		    KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE));
174*5051Swyllys 		num++;
175*5051Swyllys 
176*5051Swyllys 		rv = kmf_find_key(kmfhandle, num, attlist);
1773089Swyllys 		if (rv == KMF_OK) {
178*5051Swyllys 			rv = pk_destroy_keys(kmfhandle, attlist, num);
1793089Swyllys 		}
1803089Swyllys 
1813089Swyllys 		free(keys);
1823089Swyllys 	}
1833089Swyllys 
1843089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND) {
1853089Swyllys 		rv = KMF_OK;
1863089Swyllys 	}
1873089Swyllys 
1883089Swyllys 	*keysdeleted = numkeys;
1893089Swyllys 	return (rv);
1903089Swyllys }
1913089Swyllys 
1923089Swyllys static KMF_RETURN
193*5051Swyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr)
1943089Swyllys {
1953089Swyllys 	KMF_RETURN rv = KMF_OK;
1963089Swyllys 	uint32_t numcerts = 0;
197*5051Swyllys 	int num = numattr;
1983089Swyllys 
199*5051Swyllys 	kmf_set_attr_at_index(attlist, num,
200*5051Swyllys 	    KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t));
201*5051Swyllys 	num++;
202*5051Swyllys 
203*5051Swyllys 	rv = kmf_find_cert(kmfhandle, num, attlist);
2043089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
2053089Swyllys 		char prompt[1024];
2063089Swyllys 		(void) snprintf(prompt, sizeof (prompt),
207*5051Swyllys 		    gettext("%d certificate(s) found, do you want "
208*5051Swyllys 		    "to delete them (y/N) ?"), numcerts);
2093089Swyllys 
2103089Swyllys 		if (!yesno(prompt,
211*5051Swyllys 		    gettext("Respond with yes or no.\n"),
212*5051Swyllys 		    B_FALSE)) {
2133089Swyllys 			return (KMF_OK);
2143089Swyllys 		}
2153089Swyllys 
216*5051Swyllys 		/*
217*5051Swyllys 		 * Use numattr because delete cert does not require
218*5051Swyllys 		 * KMF_COUNT_ATTR attribute.
219*5051Swyllys 		 */
220*5051Swyllys 		rv = kmf_delete_cert_from_keystore(kmfhandle, numattr, attlist);
2213089Swyllys 
2223089Swyllys 	} else if (rv == KMF_ERR_CERT_NOT_FOUND) {
2233089Swyllys 		rv = KMF_OK;
2243089Swyllys 	}
2253089Swyllys 
2263089Swyllys 	return (rv);
2273089Swyllys }
2283089Swyllys 
2293089Swyllys static KMF_RETURN
2303089Swyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix,
2313089Swyllys 	char *token, int oclass, char *objlabel,
2323089Swyllys 	KMF_CREDENTIAL *tokencred)
2333089Swyllys {
2343089Swyllys 	KMF_RETURN rv = KMF_OK;
2353089Swyllys 	char *keytype = NULL;
2363089Swyllys 	int nk, numkeys = 0;
237*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
238*5051Swyllys 	int numattr = 0;
239*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
240*5051Swyllys 	KMF_KEY_CLASS keyclass;
2413089Swyllys 
2423089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
2433089Swyllys 	if (rv != KMF_OK)
2443089Swyllys 		return (rv);
2453089Swyllys 
246*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
247*5051Swyllys 	    &kstype, sizeof (kstype));
248*5051Swyllys 	numattr++;
249*5051Swyllys 
250*5051Swyllys 	if (objlabel != NULL) {
251*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
252*5051Swyllys 		    objlabel, strlen(objlabel));
253*5051Swyllys 		numattr++;
254*5051Swyllys 	}
255*5051Swyllys 
256*5051Swyllys 	if (tokencred->credlen > 0) {
257*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
258*5051Swyllys 		    tokencred, sizeof (KMF_CREDENTIAL));
259*5051Swyllys 		numattr++;
260*5051Swyllys 	}
261*5051Swyllys 
262*5051Swyllys 	if (token && strlen(token)) {
263*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
264*5051Swyllys 		    token, strlen(token));
265*5051Swyllys 		numattr++;
266*5051Swyllys 	}
2673089Swyllys 
2683089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
269*5051Swyllys 		int num = numattr;
270*5051Swyllys 
271*5051Swyllys 		keyclass = KMF_ASYM_PRI;
272*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
273*5051Swyllys 		    &keyclass, sizeof (keyclass));
274*5051Swyllys 		num++;
275*5051Swyllys 
2763089Swyllys 		keytype = "private";
277*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
2783089Swyllys 		numkeys += nk;
2793089Swyllys 	}
2803089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
281*5051Swyllys 		int num = numattr;
282*5051Swyllys 
283*5051Swyllys 		keyclass = KMF_SYMMETRIC;
284*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
285*5051Swyllys 		    &keyclass, sizeof (keyclass));
286*5051Swyllys 		num++;
287*5051Swyllys 
2883089Swyllys 		keytype = "symmetric";
289*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
2903089Swyllys 		numkeys += nk;
2913089Swyllys 	}
2923089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
293*5051Swyllys 		int num = numattr;
294*5051Swyllys 
295*5051Swyllys 		keyclass = KMF_ASYM_PUB;
296*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
297*5051Swyllys 		    &keyclass, sizeof (keyclass));
298*5051Swyllys 		num++;
299*5051Swyllys 
3003089Swyllys 		keytype = "public";
301*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &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 
3113089Swyllys static KMF_RETURN
3123089Swyllys delete_nss_certs(KMF_HANDLE_T kmfhandle,
3133089Swyllys 	char *dir, char *prefix,
3143089Swyllys 	char *token, char *objlabel,
3153089Swyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
3163089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
3173089Swyllys {
3183089Swyllys 	KMF_RETURN rv = KMF_OK;
319*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
320*5051Swyllys 	int numattr = 0;
321*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
3223089Swyllys 
3233089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
3243089Swyllys 	if (rv != KMF_OK)
3253089Swyllys 		return (rv);
3263089Swyllys 
327*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
328*5051Swyllys 		    &kstype, sizeof (kstype));
329*5051Swyllys 		numattr++;
330*5051Swyllys 
331*5051Swyllys 		if (objlabel != NULL) {
332*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
333*5051Swyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
334*5051Swyllys 			    strlen(objlabel));
335*5051Swyllys 			numattr++;
336*5051Swyllys 		}
337*5051Swyllys 
338*5051Swyllys 		if (issuer != NULL) {
339*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
340*5051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
341*5051Swyllys 			    strlen(issuer));
342*5051Swyllys 			numattr++;
343*5051Swyllys 		}
3443089Swyllys 
345*5051Swyllys 		if (subject != NULL) {
346*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
347*5051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
348*5051Swyllys 			    strlen(subject));
349*5051Swyllys 			numattr++;
350*5051Swyllys 		}
351*5051Swyllys 
352*5051Swyllys 		if (serno != NULL) {
353*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
354*5051Swyllys 			    KMF_BIGINT_ATTR, serno,
355*5051Swyllys 			    sizeof (KMF_BIGINT));
356*5051Swyllys 			numattr++;
357*5051Swyllys 		}
3583089Swyllys 
359*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
360*5051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
361*5051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
362*5051Swyllys 		numattr++;
363*5051Swyllys 
364*5051Swyllys 		if (token != NULL) {
365*5051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
366*5051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token,
367*5051Swyllys 			    strlen(token));
368*5051Swyllys 			numattr++;
369*5051Swyllys 		}
370*5051Swyllys 
371*5051Swyllys 	rv = pk_delete_certs(kmfhandle, attrlist, numattr);
3723089Swyllys 
3733089Swyllys 	return (rv);
3743089Swyllys }
3753089Swyllys 
3763089Swyllys static KMF_RETURN
3773089Swyllys delete_nss_crl(void *kmfhandle,
3783089Swyllys 	char *dir, char *prefix, char *token,
379*5051Swyllys 	char *issuer, char *subject)
3803089Swyllys {
3813089Swyllys 	KMF_RETURN rv = KMF_OK;
382*5051Swyllys 	int numattr = 0;
383*5051Swyllys 	KMF_ATTRIBUTE attrlist[8];
384*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
3853089Swyllys 
3863089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
3873089Swyllys 	if (rv != KMF_OK)
3883089Swyllys 		return (rv);
3893089Swyllys 
390*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
391*5051Swyllys 	    &kstype, sizeof (kstype));
392*5051Swyllys 	numattr++;
3933089Swyllys 
394*5051Swyllys 	if (token != NULL) {
395*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
396*5051Swyllys 		    token, strlen(token));
397*5051Swyllys 		numattr++;
398*5051Swyllys 	}
399*5051Swyllys 	if (issuer != NULL) {
400*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
401*5051Swyllys 		    issuer, strlen(issuer));
402*5051Swyllys 		numattr++;
403*5051Swyllys 	}
404*5051Swyllys 	if (subject != NULL) {
405*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
406*5051Swyllys 		    subject, strlen(subject));
407*5051Swyllys 		numattr++;
408*5051Swyllys 	}
4093089Swyllys 
410*5051Swyllys 	rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
4113089Swyllys 
4123089Swyllys 	return (rv);
4133089Swyllys }
4143089Swyllys 
4153089Swyllys static KMF_RETURN
4163089Swyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle,
4173089Swyllys 	char *token, int oclass, char *objlabel,
4183089Swyllys 	KMF_CREDENTIAL *tokencred)
4193089Swyllys {
4203089Swyllys 	KMF_RETURN rv = KMF_OK;
4213089Swyllys 	int nk, numkeys = 0;
422*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
423*5051Swyllys 	int numattr = 0;
424*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
425*5051Swyllys 	KMF_KEY_CLASS keyclass;
426*5051Swyllys 	boolean_t token_bool = B_TRUE;
427*5051Swyllys 	KMF_KEY_ALG keytype = 0;
428*5051Swyllys 	boolean_t private;
4293089Swyllys 	/*
4303089Swyllys 	 * Symmetric keys and RSA/DSA private keys are always
4313089Swyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
4323089Swyllys 	 * make sure we search for them with it also set.
4333089Swyllys 	 */
4343089Swyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
4353089Swyllys 		oclass |= PK_PRIVATE_OBJ;
4363089Swyllys 
4373089Swyllys 	rv = select_token(kmfhandle, token, FALSE);
4383089Swyllys 	if (rv != KMF_OK) {
4393089Swyllys 		return (rv);
4403089Swyllys 	}
4413089Swyllys 
442*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
443*5051Swyllys 	    &kstype, sizeof (kstype));
444*5051Swyllys 	numattr++;
445*5051Swyllys 
446*5051Swyllys 	if (objlabel != NULL) {
447*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
448*5051Swyllys 		    objlabel, strlen(objlabel));
449*5051Swyllys 		numattr++;
450*5051Swyllys 	}
451*5051Swyllys 
452*5051Swyllys 	if (tokencred != NULL && tokencred->credlen > 0) {
453*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
454*5051Swyllys 		    tokencred, sizeof (KMF_CREDENTIAL));
455*5051Swyllys 		numattr++;
456*5051Swyllys 	}
457*5051Swyllys 
458*5051Swyllys 	private = ((oclass & PK_PRIVATE_OBJ) > 0);
459*5051Swyllys 
460*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR,
461*5051Swyllys 	    &private, sizeof (private));
462*5051Swyllys 	numattr++;
463*5051Swyllys 
464*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR,
465*5051Swyllys 	    &keytype, sizeof (keytype));
466*5051Swyllys 	numattr++;
467*5051Swyllys 
468*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR,
469*5051Swyllys 	    &token_bool, sizeof (token_bool));
470*5051Swyllys 	numattr++;
4713089Swyllys 
4723089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
473*5051Swyllys 		int num = numattr;
474*5051Swyllys 
475*5051Swyllys 		keyclass = KMF_ASYM_PRI;
476*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
477*5051Swyllys 		    &keyclass, sizeof (keyclass));
478*5051Swyllys 		num++;
479*5051Swyllys 
480*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "private", &nk);
4813089Swyllys 		numkeys += nk;
4823089Swyllys 	}
4833089Swyllys 
4843089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
485*5051Swyllys 		int num = numattr;
486*5051Swyllys 
487*5051Swyllys 		keyclass = KMF_SYMMETRIC;
488*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
489*5051Swyllys 		    &keyclass, sizeof (keyclass));
490*5051Swyllys 		num++;
491*5051Swyllys 
492*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "symmetric", &nk);
4933089Swyllys 		numkeys += nk;
4943089Swyllys 	}
4953089Swyllys 
4963089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
497*5051Swyllys 		int num = numattr;
498*5051Swyllys 
499*5051Swyllys 		keyclass = KMF_ASYM_PUB;
500*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
501*5051Swyllys 		    &keyclass, sizeof (keyclass));
502*5051Swyllys 		num++;
503*5051Swyllys 
504*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "public", &nk);
5053089Swyllys 		numkeys += nk;
5063089Swyllys 	}
5073089Swyllys 	if (rv == KMF_OK && numkeys == 0)
5083089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
5093089Swyllys 
5103089Swyllys 	return (rv);
5113089Swyllys }
5123089Swyllys 
5133089Swyllys static KMF_RETURN
5143089Swyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle,
5153089Swyllys 	char *token, char *objlabel,
5163089Swyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
5173089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
5183089Swyllys {
5193089Swyllys 	KMF_RETURN kmfrv;
520*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
521*5051Swyllys 	int numattr = 0;
522*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
5233089Swyllys 
5243089Swyllys 	kmfrv = select_token(kmfhandle, token, FALSE);
5253089Swyllys 
5263089Swyllys 	if (kmfrv != KMF_OK) {
5273089Swyllys 		return (kmfrv);
5283089Swyllys 	}
5293089Swyllys 
530*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
531*5051Swyllys 	    &kstype, sizeof (kstype));
532*5051Swyllys 	numattr++;
533*5051Swyllys 
534*5051Swyllys 	if (objlabel != NULL) {
535*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR,
536*5051Swyllys 		    objlabel, strlen(objlabel));
537*5051Swyllys 		numattr++;
538*5051Swyllys 	}
539*5051Swyllys 
540*5051Swyllys 	if (issuer != NULL) {
541*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
542*5051Swyllys 		    issuer, strlen(issuer));
543*5051Swyllys 		numattr++;
544*5051Swyllys 	}
5453089Swyllys 
546*5051Swyllys 	if (subject != NULL) {
547*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
548*5051Swyllys 		    subject, strlen(subject));
549*5051Swyllys 		numattr++;
550*5051Swyllys 	}
551*5051Swyllys 
552*5051Swyllys 	if (serno != NULL) {
553*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
554*5051Swyllys 		    serno, sizeof (KMF_BIGINT));
555*5051Swyllys 		numattr++;
556*5051Swyllys 	}
557*5051Swyllys 
558*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
559*5051Swyllys 	    &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
560*5051Swyllys 	numattr++;
561*5051Swyllys 
562*5051Swyllys 	kmfrv = pk_delete_certs(kmfhandle, attrlist, numattr);
5633089Swyllys 
5643089Swyllys 	return (kmfrv);
5653089Swyllys }
5663089Swyllys 
5673089Swyllys static KMF_RETURN
5683089Swyllys delete_file_certs(KMF_HANDLE_T kmfhandle,
5693089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial, char *issuer,
5703089Swyllys 	char *subject, KMF_CERT_VALIDITY find_criteria_flag)
5713089Swyllys {
5723089Swyllys 	KMF_RETURN rv;
573*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
574*5051Swyllys 	int numattr = 0;
575*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
576*5051Swyllys 
577*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
578*5051Swyllys 	    &kstype, sizeof (kstype));
579*5051Swyllys 	numattr++;
580*5051Swyllys 
581*5051Swyllys 	if (issuer != NULL) {
582*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
583*5051Swyllys 		    issuer, strlen(issuer));
584*5051Swyllys 		numattr++;
585*5051Swyllys 	}
586*5051Swyllys 
587*5051Swyllys 	if (subject != NULL) {
588*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
589*5051Swyllys 		    subject, strlen(subject));
590*5051Swyllys 		numattr++;
591*5051Swyllys 	}
5923089Swyllys 
593*5051Swyllys 	if (serial != NULL) {
594*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
595*5051Swyllys 		    serial, sizeof (KMF_BIGINT));
596*5051Swyllys 		numattr++;
597*5051Swyllys 	}
598*5051Swyllys 
599*5051Swyllys 	if (dir != NULL) {
600*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
601*5051Swyllys 		    dir, strlen(dir));
602*5051Swyllys 		numattr++;
603*5051Swyllys 	}
6043089Swyllys 
605*5051Swyllys 	if (filename != NULL) {
606*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR,
607*5051Swyllys 		    filename, strlen(filename));
608*5051Swyllys 		numattr++;
609*5051Swyllys 	}
6103089Swyllys 
611*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
612*5051Swyllys 	    &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
613*5051Swyllys 	numattr++;
614*5051Swyllys 
615*5051Swyllys 	rv = pk_delete_certs(kmfhandle, attrlist, numattr);
6163089Swyllys 
6173089Swyllys 	return (rv);
6183089Swyllys }
6193089Swyllys 
6203089Swyllys static KMF_RETURN
6213089Swyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass,
6223089Swyllys 	char *dir, char *infile)
6233089Swyllys {
6243089Swyllys 	KMF_RETURN rv = KMF_OK;
6253089Swyllys 	char *keytype = "";
6263089Swyllys 	int nk, numkeys = 0;
627*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
628*5051Swyllys 	int numattr = 0;
629*5051Swyllys 	KMF_ATTRIBUTE attrlist[16];
630*5051Swyllys 	KMF_KEY_CLASS keyclass;
6313089Swyllys 
632*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
633*5051Swyllys 	    &kstype, sizeof (kstype));
634*5051Swyllys 	numattr++;
635*5051Swyllys 
636*5051Swyllys 	if (dir != NULL) {
637*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
638*5051Swyllys 		    dir, strlen(dir));
639*5051Swyllys 		numattr++;
640*5051Swyllys 	}
641*5051Swyllys 
642*5051Swyllys 	if (infile != NULL) {
643*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR,
644*5051Swyllys 		    infile, strlen(infile));
645*5051Swyllys 		numattr++;
646*5051Swyllys 	}
6473089Swyllys 
6483089Swyllys 	if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) {
649*5051Swyllys 		int num = numattr;
650*5051Swyllys 
651*5051Swyllys 		keyclass = KMF_ASYM_PRI;
652*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
653*5051Swyllys 		    &keyclass, sizeof (keyclass));
654*5051Swyllys 		num++;
655*5051Swyllys 
6563089Swyllys 		keytype = "Asymmetric";
657*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
6583089Swyllys 		numkeys += nk;
6593089Swyllys 	}
6603089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
661*5051Swyllys 		int num = numattr;
662*5051Swyllys 
663*5051Swyllys 		keyclass = KMF_SYMMETRIC;
664*5051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
665*5051Swyllys 		    &keyclass, sizeof (keyclass));
666*5051Swyllys 		num++;
667*5051Swyllys 
6683089Swyllys 		keytype = "symmetric";
669*5051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
6703089Swyllys 		numkeys += nk;
6713089Swyllys 	}
6723089Swyllys 	if (rv == KMF_OK && numkeys == 0)
6733089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
6743089Swyllys 
6753089Swyllys 	return (rv);
6763089Swyllys }
6773089Swyllys 
6783089Swyllys static KMF_RETURN
6793089Swyllys delete_file_crl(void *kmfhandle, char *dir, char *filename)
6803089Swyllys {
6813089Swyllys 	KMF_RETURN rv;
682*5051Swyllys 	int numattr = 0;
683*5051Swyllys 	KMF_ATTRIBUTE attrlist[4];
684*5051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
6853089Swyllys 
686*5051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
687*5051Swyllys 	    &kstype, sizeof (kstype));
688*5051Swyllys 	numattr++;
6893089Swyllys 
690*5051Swyllys 	if (dir) {
691*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
692*5051Swyllys 		    dir, strlen(dir));
693*5051Swyllys 		numattr++;
694*5051Swyllys 	}
695*5051Swyllys 	if (filename) {
696*5051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR,
697*5051Swyllys 		    filename, strlen(filename));
698*5051Swyllys 		numattr++;
699*5051Swyllys 	}
7003089Swyllys 
701*5051Swyllys 	rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
7023089Swyllys 
7033089Swyllys 	return (rv);
7043089Swyllys }
70517Sdinak 
70617Sdinak /*
70717Sdinak  * Delete token objects.
70817Sdinak  */
70917Sdinak int
71017Sdinak pk_delete(int argc, char *argv[])
71117Sdinak {
71217Sdinak 	int		opt;
713864Sdinak 	extern int	optind_av;
714864Sdinak 	extern char	*optarg_av;
715864Sdinak 	char		*token_spec = NULL;
7163089Swyllys 	char		*subject = NULL;
7173089Swyllys 	char		*issuer = NULL;
7183089Swyllys 	char		*dir = NULL;
7193089Swyllys 	char		*prefix = NULL;
7203089Swyllys 	char		*infile = NULL;
7213089Swyllys 	char		*object_label = NULL;
7223089Swyllys 	char		*serstr = NULL;
72317Sdinak 
7243089Swyllys 	int		oclass = 0;
7253089Swyllys 	KMF_BIGINT	serial = { NULL, 0 };
7263089Swyllys 	KMF_HANDLE_T	kmfhandle = NULL;
7273089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
7283089Swyllys 	KMF_RETURN	kmfrv;
7293089Swyllys 	int		rv = 0;
7303089Swyllys 	char			*find_criteria = NULL;
7313089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
7323089Swyllys 	KMF_CREDENTIAL	tokencred = {NULL, 0};
73317Sdinak 
73417Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
735864Sdinak 	while ((opt = getopt_av(argc, argv,
736*5051Swyllys 	    "T:(token)y:(objtype)l:(label)"
737*5051Swyllys 	    "k:(keystore)s:(subject)n:(nickname)"
738*5051Swyllys 	    "d:(dir)p:(prefix)S:(serial)i:(issuer)"
739*5051Swyllys 	    "c:(criteria)"
740*5051Swyllys 	    "f:(infile)")) != EOF) {
7413089Swyllys 
7423089Swyllys 		if (EMPTYSTRING(optarg_av))
7433089Swyllys 			return (PK_ERR_USAGE);
74417Sdinak 		switch (opt) {
745864Sdinak 		case 'T':	/* token specifier */
746864Sdinak 			if (token_spec)
747864Sdinak 				return (PK_ERR_USAGE);
748864Sdinak 			token_spec = optarg_av;
74917Sdinak 			break;
750864Sdinak 		case 'y':	/* object type:  public, private, both */
7513089Swyllys 			if (oclass)
752864Sdinak 				return (PK_ERR_USAGE);
7533089Swyllys 			oclass = OT2Int(optarg_av);
7543089Swyllys 			if (oclass == -1)
7553089Swyllys 				return (PK_ERR_USAGE);
75617Sdinak 			break;
75717Sdinak 		case 'l':	/* objects with specific label */
7583089Swyllys 		case 'n':
75917Sdinak 			if (object_label)
76017Sdinak 				return (PK_ERR_USAGE);
7613089Swyllys 			object_label = (char *)optarg_av;
7623089Swyllys 			break;
7633089Swyllys 		case 'k':
7643089Swyllys 			kstype = KS2Int(optarg_av);
7653089Swyllys 			if (kstype == 0)
7663089Swyllys 				return (PK_ERR_USAGE);
7673089Swyllys 			break;
7683089Swyllys 		case 's':
7693089Swyllys 			subject = optarg_av;
7703089Swyllys 			break;
7713089Swyllys 		case 'i':
7723089Swyllys 			issuer = optarg_av;
7733089Swyllys 			break;
7743089Swyllys 		case 'd':
7753089Swyllys 			dir = optarg_av;
7763089Swyllys 			break;
7773089Swyllys 		case 'p':
7783089Swyllys 			prefix = optarg_av;
7793089Swyllys 			break;
7803089Swyllys 		case 'S':
7813089Swyllys 			serstr = optarg_av;
7823089Swyllys 			break;
7833089Swyllys 		case 'f':
7843089Swyllys 			infile = optarg_av;
7853089Swyllys 			break;
7863089Swyllys 		case 'c':
7873089Swyllys 			find_criteria = optarg_av;
7883089Swyllys 			if (!strcasecmp(find_criteria, "valid"))
7893089Swyllys 				find_criteria_flag =
790*5051Swyllys 				    KMF_NONEXPIRED_CERTS;
7913089Swyllys 			else if (!strcasecmp(find_criteria, "expired"))
7923089Swyllys 				find_criteria_flag = KMF_EXPIRED_CERTS;
7933089Swyllys 			else if (!strcasecmp(find_criteria, "both"))
7943089Swyllys 				find_criteria_flag = KMF_ALL_CERTS;
7953089Swyllys 			else
7963089Swyllys 				return (PK_ERR_USAGE);
79717Sdinak 			break;
79817Sdinak 		default:
79917Sdinak 			return (PK_ERR_USAGE);
80017Sdinak 			break;
80117Sdinak 		}
80217Sdinak 	}
80317Sdinak 
8043089Swyllys 	/* Assume keystore = PKCS#11 if not specified */
8053089Swyllys 	if (kstype == 0)
8063089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
8073089Swyllys 
8083089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
8093089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
810*5051Swyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
8113089Swyllys 
8123089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
813*5051Swyllys 		    "is only relevant if keystore=pkcs11\n"));
8143089Swyllys 		return (PK_ERR_USAGE);
815864Sdinak 	}
816864Sdinak 
8173089Swyllys 	/* If no object class specified, delete everything but CRLs */
8183089Swyllys 	if (oclass == 0)
8193089Swyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ |
820*5051Swyllys 		    PK_SYMKEY_OBJ;
82117Sdinak 
82217Sdinak 	/* No additional args allowed. */
823864Sdinak 	argc -= optind_av;
824864Sdinak 	argv += optind_av;
82517Sdinak 	if (argc)
82617Sdinak 		return (PK_ERR_USAGE);
82717Sdinak 	/* Done parsing command line options. */
82817Sdinak 
8293089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) {
8303089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
8313089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) {
8323089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
83317Sdinak 	}
83417Sdinak 
8353089Swyllys 	if (serstr != NULL) {
8363089Swyllys 		uchar_t *bytes = NULL;
8373089Swyllys 		size_t bytelen;
8383089Swyllys 
839*5051Swyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
8403089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
8413089Swyllys 			(void) fprintf(stderr, gettext("serial number "
842*5051Swyllys 			    "must be specified as a hex number "
843*5051Swyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
8443089Swyllys 			return (PK_ERR_USAGE);
8453089Swyllys 		}
8463089Swyllys 		serial.val = bytes;
8473089Swyllys 		serial.len = bytelen;
84817Sdinak 	}
84917Sdinak 
8503089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
851*5051Swyllys 	    kstype == KMF_KEYSTORE_NSS) &&
852*5051Swyllys 	    (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
85317Sdinak 
8543089Swyllys 		(void) get_token_password(kstype, token_spec,
855*5051Swyllys 		    &tokencred);
85617Sdinak 	}
85717Sdinak 
858*5051Swyllys 	if ((kmfrv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
8593089Swyllys 		return (kmfrv);
8603089Swyllys 
8613089Swyllys 	switch (kstype) {
8623089Swyllys 		case KMF_KEYSTORE_PK11TOKEN:
8633089Swyllys 			if (oclass & PK_KEY_OBJ) {
8643089Swyllys 				kmfrv = delete_pk11_keys(kmfhandle,
865*5051Swyllys 				    token_spec, oclass,
866*5051Swyllys 				    object_label, &tokencred);
8673089Swyllys 				/*
8683089Swyllys 				 * If deleting groups of objects, it is OK
8693089Swyllys 				 * to ignore the "key not found" case so that
8703089Swyllys 				 * we can continue to find other objects.
8713089Swyllys 				 */
8723089Swyllys 				if (kmfrv == KMF_ERR_KEY_NOT_FOUND &&
873*5051Swyllys 				    (oclass != PK_KEY_OBJ))
8743089Swyllys 					kmfrv = KMF_OK;
8753089Swyllys 				if (kmfrv != KMF_OK)
8763089Swyllys 					break;
8773089Swyllys 			}
8783089Swyllys 			if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
8793089Swyllys 				kmfrv = delete_pk11_certs(kmfhandle,
880*5051Swyllys 				    token_spec, object_label,
881*5051Swyllys 				    &serial, issuer,
882*5051Swyllys 				    subject, find_criteria_flag);
8833089Swyllys 				/*
8843089Swyllys 				 * If cert delete failed, but we are looking at
8853089Swyllys 				 * other objects, then it is OK.
8863089Swyllys 				 */
8873089Swyllys 				if (kmfrv == KMF_ERR_CERT_NOT_FOUND &&
888*5051Swyllys 				    (oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
8893089Swyllys 					kmfrv = KMF_OK;
8903089Swyllys 				if (kmfrv != KMF_OK)
8913089Swyllys 					break;
8923089Swyllys 			}
8933089Swyllys 			if (oclass & PK_CRL_OBJ)
8943089Swyllys 				kmfrv = delete_file_crl(kmfhandle,
895*5051Swyllys 				    dir, infile);
8963089Swyllys 			break;
8973089Swyllys 		case KMF_KEYSTORE_NSS:
8983089Swyllys 			if (oclass & PK_KEY_OBJ) {
8993089Swyllys 				kmfrv = delete_nss_keys(kmfhandle,
900*5051Swyllys 				    dir, prefix, token_spec,
901*5051Swyllys 				    oclass, (char  *)object_label,
902*5051Swyllys 				    &tokencred);
9033089Swyllys 				if (kmfrv != KMF_OK)
9043089Swyllys 					break;
9053089Swyllys 			}
9063089Swyllys 			if (oclass & PK_CERT_OBJ) {
9073089Swyllys 				kmfrv = delete_nss_certs(kmfhandle,
908*5051Swyllys 				    dir, prefix, token_spec,
909*5051Swyllys 				    (char  *)object_label,
910*5051Swyllys 				    &serial, issuer, subject,
911*5051Swyllys 				    find_criteria_flag);
9123089Swyllys 				if (kmfrv != KMF_OK)
9133089Swyllys 					break;
9143089Swyllys 			}
9153089Swyllys 			if (oclass & PK_CRL_OBJ)
9163089Swyllys 				kmfrv = delete_nss_crl(kmfhandle,
917*5051Swyllys 				    dir, prefix, token_spec,
918*5051Swyllys 				    (char  *)object_label, subject);
9193089Swyllys 			break;
9203089Swyllys 		case KMF_KEYSTORE_OPENSSL:
9213089Swyllys 			if (oclass & PK_KEY_OBJ) {
9223089Swyllys 				kmfrv = delete_file_keys(kmfhandle, oclass,
923*5051Swyllys 				    dir, infile);
9243089Swyllys 				if (kmfrv != KMF_OK)
9253089Swyllys 					break;
9263089Swyllys 			}
9273089Swyllys 			if (oclass & (PK_CERT_OBJ)) {
9283089Swyllys 				kmfrv = delete_file_certs(kmfhandle,
929*5051Swyllys 				    dir, infile, &serial, issuer,
930*5051Swyllys 				    subject, find_criteria_flag);
9313089Swyllys 				if (kmfrv != KMF_OK)
9323089Swyllys 					break;
9333089Swyllys 			}
9343089Swyllys 			if (oclass & PK_CRL_OBJ)
9353089Swyllys 				kmfrv = delete_file_crl(kmfhandle,
936*5051Swyllys 				    dir, infile);
9373089Swyllys 			break;
9383089Swyllys 		default:
9393089Swyllys 			rv = PK_ERR_USAGE;
9403089Swyllys 			break;
94117Sdinak 	}
94217Sdinak 
9433089Swyllys 	if (kmfrv != KMF_OK) {
9443089Swyllys 		display_error(kmfhandle, kmfrv,
945*5051Swyllys 		    gettext("Error deleting objects"));
94617Sdinak 	}
94717Sdinak 
9483089Swyllys 	if (serial.val != NULL)
9493089Swyllys 		free(serial.val);
950*5051Swyllys 	(void) kmf_finalize(kmfhandle);
9513089Swyllys 	return (kmfrv);
95217Sdinak }
953