xref: /titanic_51/usr/src/cmd/cmd-crypto/pktool/delete.c (revision 30a5e8fa1253cb33980ee4514743cf683f584b4e)
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 /*
2271593db2Swyllys  * 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
42*30a5e8faSwyllys pk_destroy_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr)
4399ebb4caSwyllys {
4499ebb4caSwyllys 	int i;
4599ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
46*30a5e8faSwyllys 	uint32_t *numkeys;
47*30a5e8faSwyllys 	KMF_KEY_HANDLE *keys = NULL;
48*30a5e8faSwyllys 	int del_num = 0;
49*30a5e8faSwyllys 	KMF_ATTRIBUTE delete_attlist[16];
50*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype;
51*30a5e8faSwyllys 	uint32_t len;
52*30a5e8faSwyllys 	boolean_t destroy = B_TRUE;
53*30a5e8faSwyllys 	KMF_CREDENTIAL cred;
54*30a5e8faSwyllys 	char *slotlabel = NULL;
5599ebb4caSwyllys 
56*30a5e8faSwyllys 	len = sizeof (kstype);
57*30a5e8faSwyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
58*30a5e8faSwyllys 	    &kstype, &len);
59*30a5e8faSwyllys 	if (rv != KMF_OK)
60*30a5e8faSwyllys 		return (rv);
6199ebb4caSwyllys 
62*30a5e8faSwyllys 	kmf_set_attr_at_index(delete_attlist, del_num,
63*30a5e8faSwyllys 	    KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
64*30a5e8faSwyllys 	del_num++;
65*30a5e8faSwyllys 
66*30a5e8faSwyllys 	/* "destroy" is optional. Default is TRUE */
67*30a5e8faSwyllys 	(void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
68*30a5e8faSwyllys 	    (void *)&destroy, NULL);
69*30a5e8faSwyllys 
70*30a5e8faSwyllys 	kmf_set_attr_at_index(delete_attlist, del_num,
71*30a5e8faSwyllys 	    KMF_DESTROY_BOOL_ATTR, &destroy, sizeof (boolean_t));
72*30a5e8faSwyllys 	del_num++;
73*30a5e8faSwyllys 
74*30a5e8faSwyllys 	switch (kstype) {
7599ebb4caSwyllys 	case KMF_KEYSTORE_NSS:
76*30a5e8faSwyllys 		rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
77*30a5e8faSwyllys 		    (void *)&cred, NULL);
78*30a5e8faSwyllys 		if (rv == KMF_OK) {
79*30a5e8faSwyllys 			if (cred.credlen > 0) {
80*30a5e8faSwyllys 				kmf_set_attr_at_index(delete_attlist, del_num,
81*30a5e8faSwyllys 				    KMF_CREDENTIAL_ATTR, &cred,
82*30a5e8faSwyllys 				    sizeof (KMF_CREDENTIAL));
83*30a5e8faSwyllys 				del_num++;
84*30a5e8faSwyllys 			}
85*30a5e8faSwyllys 		}
86*30a5e8faSwyllys 
87*30a5e8faSwyllys 		slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist,
88*30a5e8faSwyllys 		    numattr);
89*30a5e8faSwyllys 		if (slotlabel != NULL) {
90*30a5e8faSwyllys 			kmf_set_attr_at_index(delete_attlist, del_num,
91*30a5e8faSwyllys 			    KMF_TOKEN_LABEL_ATTR, slotlabel,
92*30a5e8faSwyllys 			    strlen(slotlabel));
93*30a5e8faSwyllys 			del_num++;
94*30a5e8faSwyllys 		}
9599ebb4caSwyllys 		break;
9699ebb4caSwyllys 	case KMF_KEYSTORE_OPENSSL:
9799ebb4caSwyllys 		break;
9899ebb4caSwyllys 	case KMF_KEYSTORE_PK11TOKEN:
99*30a5e8faSwyllys 		rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
100*30a5e8faSwyllys 		    (void *)&cred, NULL);
101*30a5e8faSwyllys 		if (rv == KMF_OK) {
102*30a5e8faSwyllys 			if (cred.credlen > 0) {
103*30a5e8faSwyllys 				kmf_set_attr_at_index(delete_attlist, del_num,
104*30a5e8faSwyllys 				    KMF_CREDENTIAL_ATTR, &cred,
105*30a5e8faSwyllys 				    sizeof (KMF_CREDENTIAL));
106*30a5e8faSwyllys 				del_num++;
107*30a5e8faSwyllys 			}
108*30a5e8faSwyllys 		}
10999ebb4caSwyllys 		break;
11099ebb4caSwyllys 	default:
11199ebb4caSwyllys 		return (PK_ERR_USAGE);
11299ebb4caSwyllys 	}
11399ebb4caSwyllys 
114*30a5e8faSwyllys 	numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
115*30a5e8faSwyllys 	if (numkeys == NULL)
116*30a5e8faSwyllys 		return (PK_ERR_USAGE);
117*30a5e8faSwyllys 
118*30a5e8faSwyllys 	keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
119*30a5e8faSwyllys 	if (keys == NULL)
120*30a5e8faSwyllys 		return (PK_ERR_USAGE);
121*30a5e8faSwyllys 
122*30a5e8faSwyllys 	for (i = 0; rv == KMF_OK && i < *numkeys; i++) {
123*30a5e8faSwyllys 		int num = del_num;
124*30a5e8faSwyllys 
125*30a5e8faSwyllys 		kmf_set_attr_at_index(delete_attlist, num,
126*30a5e8faSwyllys 		    KMF_KEY_HANDLE_ATTR, &keys[i], sizeof (KMF_KEY_HANDLE));
127*30a5e8faSwyllys 		num++;
128*30a5e8faSwyllys 
129*30a5e8faSwyllys 		rv = kmf_delete_key_from_keystore(handle, num, delete_attlist);
13099ebb4caSwyllys 	}
13199ebb4caSwyllys 	return (rv);
13299ebb4caSwyllys }
13399ebb4caSwyllys 
13499ebb4caSwyllys static KMF_RETURN
135*30a5e8faSwyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr,
136*30a5e8faSwyllys 	char *desc, int *keysdeleted)
13799ebb4caSwyllys {
13899ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
13999ebb4caSwyllys 	uint32_t numkeys = 0;
140*30a5e8faSwyllys 	int num = numattr;
14199ebb4caSwyllys 
14299ebb4caSwyllys 	*keysdeleted = 0;
14399ebb4caSwyllys 	numkeys = 0;
144*30a5e8faSwyllys 
145*30a5e8faSwyllys 	kmf_set_attr_at_index(attlist, num,
146*30a5e8faSwyllys 	    KMF_COUNT_ATTR, &numkeys, sizeof (uint32_t));
147*30a5e8faSwyllys 	num++;
148*30a5e8faSwyllys 
149*30a5e8faSwyllys 	rv = kmf_find_key(kmfhandle, num, attlist);
150*30a5e8faSwyllys 
15199ebb4caSwyllys 	if (rv == KMF_OK && numkeys > 0) {
15299ebb4caSwyllys 		KMF_KEY_HANDLE *keys = NULL;
15399ebb4caSwyllys 		char prompt[1024];
15499ebb4caSwyllys 
15599ebb4caSwyllys 		(void) snprintf(prompt, sizeof (prompt),
15699ebb4caSwyllys 		    gettext("%d %s key(s) found, do you want "
15799ebb4caSwyllys 		    "to delete them (y/N) ?"), numkeys,
15899ebb4caSwyllys 		    (desc != NULL ? desc : ""));
15999ebb4caSwyllys 
16099ebb4caSwyllys 		if (!yesno(prompt,
16199ebb4caSwyllys 		    gettext("Respond with yes or no.\n"),
16299ebb4caSwyllys 		    B_FALSE)) {
16399ebb4caSwyllys 			return (KMF_OK);
16499ebb4caSwyllys 		}
16599ebb4caSwyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
16699ebb4caSwyllys 		    sizeof (KMF_KEY_HANDLE));
16799ebb4caSwyllys 		if (keys == NULL)
16899ebb4caSwyllys 			return (KMF_ERR_MEMORY);
16999ebb4caSwyllys 		(void) memset(keys, 0, numkeys *
17099ebb4caSwyllys 		    sizeof (KMF_KEY_HANDLE));
17199ebb4caSwyllys 
172*30a5e8faSwyllys 		kmf_set_attr_at_index(attlist, num,
173*30a5e8faSwyllys 		    KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE));
174*30a5e8faSwyllys 		num++;
175*30a5e8faSwyllys 
176*30a5e8faSwyllys 		rv = kmf_find_key(kmfhandle, num, attlist);
17799ebb4caSwyllys 		if (rv == KMF_OK) {
178*30a5e8faSwyllys 			rv = pk_destroy_keys(kmfhandle, attlist, num);
17999ebb4caSwyllys 		}
18099ebb4caSwyllys 
18199ebb4caSwyllys 		free(keys);
18299ebb4caSwyllys 	}
18399ebb4caSwyllys 
18499ebb4caSwyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND) {
18599ebb4caSwyllys 		rv = KMF_OK;
18699ebb4caSwyllys 	}
18799ebb4caSwyllys 
18899ebb4caSwyllys 	*keysdeleted = numkeys;
18999ebb4caSwyllys 	return (rv);
19099ebb4caSwyllys }
19199ebb4caSwyllys 
19299ebb4caSwyllys static KMF_RETURN
193*30a5e8faSwyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr)
19499ebb4caSwyllys {
19599ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
19699ebb4caSwyllys 	uint32_t numcerts = 0;
197*30a5e8faSwyllys 	int num = numattr;
19899ebb4caSwyllys 
199*30a5e8faSwyllys 	kmf_set_attr_at_index(attlist, num,
200*30a5e8faSwyllys 	    KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t));
201*30a5e8faSwyllys 	num++;
202*30a5e8faSwyllys 
203*30a5e8faSwyllys 	rv = kmf_find_cert(kmfhandle, num, attlist);
20499ebb4caSwyllys 	if (rv == KMF_OK && numcerts > 0) {
20599ebb4caSwyllys 		char prompt[1024];
20699ebb4caSwyllys 		(void) snprintf(prompt, sizeof (prompt),
20799ebb4caSwyllys 		    gettext("%d certificate(s) found, do you want "
20899ebb4caSwyllys 		    "to delete them (y/N) ?"), numcerts);
20999ebb4caSwyllys 
21099ebb4caSwyllys 		if (!yesno(prompt,
21199ebb4caSwyllys 		    gettext("Respond with yes or no.\n"),
21299ebb4caSwyllys 		    B_FALSE)) {
21399ebb4caSwyllys 			return (KMF_OK);
21499ebb4caSwyllys 		}
21599ebb4caSwyllys 
216*30a5e8faSwyllys 		/*
217*30a5e8faSwyllys 		 * Use numattr because delete cert does not require
218*30a5e8faSwyllys 		 * KMF_COUNT_ATTR attribute.
219*30a5e8faSwyllys 		 */
220*30a5e8faSwyllys 		rv = kmf_delete_cert_from_keystore(kmfhandle, numattr, attlist);
22199ebb4caSwyllys 
22299ebb4caSwyllys 	} else if (rv == KMF_ERR_CERT_NOT_FOUND) {
22399ebb4caSwyllys 		rv = KMF_OK;
22499ebb4caSwyllys 	}
22599ebb4caSwyllys 
22699ebb4caSwyllys 	return (rv);
22799ebb4caSwyllys }
22899ebb4caSwyllys 
22999ebb4caSwyllys static KMF_RETURN
23099ebb4caSwyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix,
23199ebb4caSwyllys 	char *token, int oclass, char *objlabel,
23299ebb4caSwyllys 	KMF_CREDENTIAL *tokencred)
23399ebb4caSwyllys {
23499ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
23599ebb4caSwyllys 	char *keytype = NULL;
23699ebb4caSwyllys 	int nk, numkeys = 0;
237*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
238*30a5e8faSwyllys 	int numattr = 0;
239*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
240*30a5e8faSwyllys 	KMF_KEY_CLASS keyclass;
24199ebb4caSwyllys 
24299ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
24399ebb4caSwyllys 	if (rv != KMF_OK)
24499ebb4caSwyllys 		return (rv);
24599ebb4caSwyllys 
246*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
247*30a5e8faSwyllys 	    &kstype, sizeof (kstype));
248*30a5e8faSwyllys 	numattr++;
249*30a5e8faSwyllys 
250*30a5e8faSwyllys 	if (objlabel != NULL) {
251*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
252*30a5e8faSwyllys 		    objlabel, strlen(objlabel));
253*30a5e8faSwyllys 		numattr++;
254*30a5e8faSwyllys 	}
255*30a5e8faSwyllys 
256*30a5e8faSwyllys 	if (tokencred->credlen > 0) {
257*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
258*30a5e8faSwyllys 		    tokencred, sizeof (KMF_CREDENTIAL));
259*30a5e8faSwyllys 		numattr++;
260*30a5e8faSwyllys 	}
261*30a5e8faSwyllys 
262*30a5e8faSwyllys 	if (token && strlen(token)) {
263*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
264*30a5e8faSwyllys 		    token, strlen(token));
265*30a5e8faSwyllys 		numattr++;
266*30a5e8faSwyllys 	}
26799ebb4caSwyllys 
26899ebb4caSwyllys 	if (oclass & PK_PRIKEY_OBJ) {
269*30a5e8faSwyllys 		int num = numattr;
270*30a5e8faSwyllys 
271*30a5e8faSwyllys 		keyclass = KMF_ASYM_PRI;
272*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
273*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
274*30a5e8faSwyllys 		num++;
275*30a5e8faSwyllys 
27699ebb4caSwyllys 		keytype = "private";
277*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
27899ebb4caSwyllys 		numkeys += nk;
27999ebb4caSwyllys 	}
28099ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
281*30a5e8faSwyllys 		int num = numattr;
282*30a5e8faSwyllys 
283*30a5e8faSwyllys 		keyclass = KMF_SYMMETRIC;
284*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
285*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
286*30a5e8faSwyllys 		num++;
287*30a5e8faSwyllys 
28899ebb4caSwyllys 		keytype = "symmetric";
289*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
29099ebb4caSwyllys 		numkeys += nk;
29199ebb4caSwyllys 	}
29299ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
293*30a5e8faSwyllys 		int num = numattr;
294*30a5e8faSwyllys 
295*30a5e8faSwyllys 		keyclass = KMF_ASYM_PUB;
296*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
297*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
298*30a5e8faSwyllys 		num++;
299*30a5e8faSwyllys 
30099ebb4caSwyllys 		keytype = "public";
301*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &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 
31199ebb4caSwyllys static KMF_RETURN
31299ebb4caSwyllys delete_nss_certs(KMF_HANDLE_T kmfhandle,
31399ebb4caSwyllys 	char *dir, char *prefix,
31499ebb4caSwyllys 	char *token, char *objlabel,
31599ebb4caSwyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
31699ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
31799ebb4caSwyllys {
31899ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
319*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
320*30a5e8faSwyllys 	int numattr = 0;
321*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
32299ebb4caSwyllys 
32399ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
32499ebb4caSwyllys 	if (rv != KMF_OK)
32599ebb4caSwyllys 		return (rv);
32699ebb4caSwyllys 
327*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
328*30a5e8faSwyllys 		    &kstype, sizeof (kstype));
329*30a5e8faSwyllys 		numattr++;
33099ebb4caSwyllys 
331*30a5e8faSwyllys 		if (objlabel != NULL) {
332*30a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
333*30a5e8faSwyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
334*30a5e8faSwyllys 			    strlen(objlabel));
335*30a5e8faSwyllys 			numattr++;
336*30a5e8faSwyllys 		}
33799ebb4caSwyllys 
338*30a5e8faSwyllys 		if (issuer != NULL) {
339*30a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
340*30a5e8faSwyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
341*30a5e8faSwyllys 			    strlen(issuer));
342*30a5e8faSwyllys 			numattr++;
343*30a5e8faSwyllys 		}
344*30a5e8faSwyllys 
345*30a5e8faSwyllys 		if (subject != NULL) {
346*30a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
347*30a5e8faSwyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
348*30a5e8faSwyllys 			    strlen(subject));
349*30a5e8faSwyllys 			numattr++;
350*30a5e8faSwyllys 		}
351*30a5e8faSwyllys 
352*30a5e8faSwyllys 		if (serno != NULL) {
353*30a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
354*30a5e8faSwyllys 			    KMF_BIGINT_ATTR, serno,
355*30a5e8faSwyllys 			    sizeof (KMF_BIGINT));
356*30a5e8faSwyllys 			numattr++;
357*30a5e8faSwyllys 		}
358*30a5e8faSwyllys 
359*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr,
360*30a5e8faSwyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
361*30a5e8faSwyllys 		    sizeof (KMF_CERT_VALIDITY));
362*30a5e8faSwyllys 		numattr++;
363*30a5e8faSwyllys 
364*30a5e8faSwyllys 		if (token != NULL) {
365*30a5e8faSwyllys 			kmf_set_attr_at_index(attrlist, numattr,
366*30a5e8faSwyllys 			    KMF_TOKEN_LABEL_ATTR, token,
367*30a5e8faSwyllys 			    strlen(token));
368*30a5e8faSwyllys 			numattr++;
369*30a5e8faSwyllys 		}
370*30a5e8faSwyllys 
371*30a5e8faSwyllys 	rv = pk_delete_certs(kmfhandle, attrlist, numattr);
37299ebb4caSwyllys 
37399ebb4caSwyllys 	return (rv);
37499ebb4caSwyllys }
37599ebb4caSwyllys 
37699ebb4caSwyllys static KMF_RETURN
37799ebb4caSwyllys delete_nss_crl(void *kmfhandle,
37899ebb4caSwyllys 	char *dir, char *prefix, char *token,
379*30a5e8faSwyllys 	char *issuer, char *subject)
38099ebb4caSwyllys {
38199ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
382*30a5e8faSwyllys 	int numattr = 0;
383*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[8];
384*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
38599ebb4caSwyllys 
38699ebb4caSwyllys 	rv = configure_nss(kmfhandle, dir, prefix);
38799ebb4caSwyllys 	if (rv != KMF_OK)
38899ebb4caSwyllys 		return (rv);
38999ebb4caSwyllys 
390*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
391*30a5e8faSwyllys 	    &kstype, sizeof (kstype));
392*30a5e8faSwyllys 	numattr++;
39399ebb4caSwyllys 
394*30a5e8faSwyllys 	if (token != NULL) {
395*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
396*30a5e8faSwyllys 		    token, strlen(token));
397*30a5e8faSwyllys 		numattr++;
398*30a5e8faSwyllys 	}
399*30a5e8faSwyllys 	if (issuer != NULL) {
400*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
401*30a5e8faSwyllys 		    issuer, strlen(issuer));
402*30a5e8faSwyllys 		numattr++;
403*30a5e8faSwyllys 	}
404*30a5e8faSwyllys 	if (subject != NULL) {
405*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
406*30a5e8faSwyllys 		    subject, strlen(subject));
407*30a5e8faSwyllys 		numattr++;
408*30a5e8faSwyllys 	}
40999ebb4caSwyllys 
410*30a5e8faSwyllys 	rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
41199ebb4caSwyllys 
41299ebb4caSwyllys 	return (rv);
41399ebb4caSwyllys }
41499ebb4caSwyllys 
41599ebb4caSwyllys static KMF_RETURN
41699ebb4caSwyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle,
41799ebb4caSwyllys 	char *token, int oclass, char *objlabel,
41899ebb4caSwyllys 	KMF_CREDENTIAL *tokencred)
41999ebb4caSwyllys {
42099ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
42199ebb4caSwyllys 	int nk, numkeys = 0;
422*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
423*30a5e8faSwyllys 	int numattr = 0;
424*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
425*30a5e8faSwyllys 	KMF_KEY_CLASS keyclass;
426*30a5e8faSwyllys 	boolean_t token_bool = B_TRUE;
427*30a5e8faSwyllys 	KMF_KEY_ALG keytype = 0;
428*30a5e8faSwyllys 	boolean_t private;
42999ebb4caSwyllys 	/*
43099ebb4caSwyllys 	 * Symmetric keys and RSA/DSA private keys are always
43199ebb4caSwyllys 	 * created with the "CKA_PRIVATE" field == TRUE, so
43299ebb4caSwyllys 	 * make sure we search for them with it also set.
43399ebb4caSwyllys 	 */
43499ebb4caSwyllys 	if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ))
43599ebb4caSwyllys 		oclass |= PK_PRIVATE_OBJ;
43699ebb4caSwyllys 
43799ebb4caSwyllys 	rv = select_token(kmfhandle, token, FALSE);
43899ebb4caSwyllys 	if (rv != KMF_OK) {
43999ebb4caSwyllys 		return (rv);
44099ebb4caSwyllys 	}
44199ebb4caSwyllys 
442*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
443*30a5e8faSwyllys 	    &kstype, sizeof (kstype));
444*30a5e8faSwyllys 	numattr++;
445*30a5e8faSwyllys 
446*30a5e8faSwyllys 	if (objlabel != NULL) {
447*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
448*30a5e8faSwyllys 		    objlabel, strlen(objlabel));
449*30a5e8faSwyllys 		numattr++;
450*30a5e8faSwyllys 	}
451*30a5e8faSwyllys 
452*30a5e8faSwyllys 	if (tokencred != NULL && tokencred->credlen > 0) {
453*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
454*30a5e8faSwyllys 		    tokencred, sizeof (KMF_CREDENTIAL));
455*30a5e8faSwyllys 		numattr++;
456*30a5e8faSwyllys 	}
457*30a5e8faSwyllys 
458*30a5e8faSwyllys 	private = ((oclass & PK_PRIVATE_OBJ) > 0);
459*30a5e8faSwyllys 
460*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR,
461*30a5e8faSwyllys 	    &private, sizeof (private));
462*30a5e8faSwyllys 	numattr++;
463*30a5e8faSwyllys 
464*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR,
465*30a5e8faSwyllys 	    &keytype, sizeof (keytype));
466*30a5e8faSwyllys 	numattr++;
467*30a5e8faSwyllys 
468*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR,
469*30a5e8faSwyllys 	    &token_bool, sizeof (token_bool));
470*30a5e8faSwyllys 	numattr++;
47199ebb4caSwyllys 
47299ebb4caSwyllys 	if (oclass & PK_PRIKEY_OBJ) {
473*30a5e8faSwyllys 		int num = numattr;
474*30a5e8faSwyllys 
475*30a5e8faSwyllys 		keyclass = KMF_ASYM_PRI;
476*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
477*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
478*30a5e8faSwyllys 		num++;
479*30a5e8faSwyllys 
480*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "private", &nk);
48199ebb4caSwyllys 		numkeys += nk;
48299ebb4caSwyllys 	}
48399ebb4caSwyllys 
48499ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
485*30a5e8faSwyllys 		int num = numattr;
486*30a5e8faSwyllys 
487*30a5e8faSwyllys 		keyclass = KMF_SYMMETRIC;
488*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
489*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
490*30a5e8faSwyllys 		num++;
491*30a5e8faSwyllys 
492*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "symmetric", &nk);
49399ebb4caSwyllys 		numkeys += nk;
49499ebb4caSwyllys 	}
49599ebb4caSwyllys 
49699ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
497*30a5e8faSwyllys 		int num = numattr;
498*30a5e8faSwyllys 
499*30a5e8faSwyllys 		keyclass = KMF_ASYM_PUB;
500*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
501*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
502*30a5e8faSwyllys 		num++;
503*30a5e8faSwyllys 
504*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "public", &nk);
50599ebb4caSwyllys 		numkeys += nk;
50699ebb4caSwyllys 	}
50799ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
50899ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
50999ebb4caSwyllys 
51099ebb4caSwyllys 	return (rv);
51199ebb4caSwyllys }
51299ebb4caSwyllys 
51399ebb4caSwyllys static KMF_RETURN
51499ebb4caSwyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle,
51599ebb4caSwyllys 	char *token, char *objlabel,
51699ebb4caSwyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
51799ebb4caSwyllys 	KMF_CERT_VALIDITY find_criteria_flag)
51899ebb4caSwyllys {
51999ebb4caSwyllys 	KMF_RETURN kmfrv;
520*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
521*30a5e8faSwyllys 	int numattr = 0;
522*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
52399ebb4caSwyllys 
52499ebb4caSwyllys 	kmfrv = select_token(kmfhandle, token, FALSE);
52599ebb4caSwyllys 
52699ebb4caSwyllys 	if (kmfrv != KMF_OK) {
52799ebb4caSwyllys 		return (kmfrv);
52899ebb4caSwyllys 	}
52999ebb4caSwyllys 
530*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
531*30a5e8faSwyllys 	    &kstype, sizeof (kstype));
532*30a5e8faSwyllys 	numattr++;
53399ebb4caSwyllys 
534*30a5e8faSwyllys 	if (objlabel != NULL) {
535*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR,
536*30a5e8faSwyllys 		    objlabel, strlen(objlabel));
537*30a5e8faSwyllys 		numattr++;
538*30a5e8faSwyllys 	}
539*30a5e8faSwyllys 
540*30a5e8faSwyllys 	if (issuer != NULL) {
541*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
542*30a5e8faSwyllys 		    issuer, strlen(issuer));
543*30a5e8faSwyllys 		numattr++;
544*30a5e8faSwyllys 	}
545*30a5e8faSwyllys 
546*30a5e8faSwyllys 	if (subject != NULL) {
547*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
548*30a5e8faSwyllys 		    subject, strlen(subject));
549*30a5e8faSwyllys 		numattr++;
550*30a5e8faSwyllys 	}
551*30a5e8faSwyllys 
552*30a5e8faSwyllys 	if (serno != NULL) {
553*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
554*30a5e8faSwyllys 		    serno, sizeof (KMF_BIGINT));
555*30a5e8faSwyllys 		numattr++;
556*30a5e8faSwyllys 	}
557*30a5e8faSwyllys 
558*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
559*30a5e8faSwyllys 	    &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
560*30a5e8faSwyllys 	numattr++;
561*30a5e8faSwyllys 
562*30a5e8faSwyllys 	kmfrv = pk_delete_certs(kmfhandle, attrlist, numattr);
56399ebb4caSwyllys 
56499ebb4caSwyllys 	return (kmfrv);
56599ebb4caSwyllys }
56699ebb4caSwyllys 
56799ebb4caSwyllys static KMF_RETURN
56899ebb4caSwyllys delete_file_certs(KMF_HANDLE_T kmfhandle,
56999ebb4caSwyllys 	char *dir, char *filename, KMF_BIGINT *serial, char *issuer,
57099ebb4caSwyllys 	char *subject, KMF_CERT_VALIDITY find_criteria_flag)
57199ebb4caSwyllys {
57299ebb4caSwyllys 	KMF_RETURN rv;
573*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
574*30a5e8faSwyllys 	int numattr = 0;
575*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
57699ebb4caSwyllys 
577*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
578*30a5e8faSwyllys 	    &kstype, sizeof (kstype));
579*30a5e8faSwyllys 	numattr++;
58099ebb4caSwyllys 
581*30a5e8faSwyllys 	if (issuer != NULL) {
582*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
583*30a5e8faSwyllys 		    issuer, strlen(issuer));
584*30a5e8faSwyllys 		numattr++;
585*30a5e8faSwyllys 	}
58699ebb4caSwyllys 
587*30a5e8faSwyllys 	if (subject != NULL) {
588*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
589*30a5e8faSwyllys 		    subject, strlen(subject));
590*30a5e8faSwyllys 		numattr++;
591*30a5e8faSwyllys 	}
592*30a5e8faSwyllys 
593*30a5e8faSwyllys 	if (serial != NULL) {
594*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
595*30a5e8faSwyllys 		    serial, sizeof (KMF_BIGINT));
596*30a5e8faSwyllys 		numattr++;
597*30a5e8faSwyllys 	}
598*30a5e8faSwyllys 
599*30a5e8faSwyllys 	if (dir != NULL) {
600*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
601*30a5e8faSwyllys 		    dir, strlen(dir));
602*30a5e8faSwyllys 		numattr++;
603*30a5e8faSwyllys 	}
604*30a5e8faSwyllys 
605*30a5e8faSwyllys 	if (filename != NULL) {
606*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR,
607*30a5e8faSwyllys 		    filename, strlen(filename));
608*30a5e8faSwyllys 		numattr++;
609*30a5e8faSwyllys 	}
610*30a5e8faSwyllys 
611*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
612*30a5e8faSwyllys 	    &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
613*30a5e8faSwyllys 	numattr++;
614*30a5e8faSwyllys 
615*30a5e8faSwyllys 	rv = pk_delete_certs(kmfhandle, attrlist, numattr);
61699ebb4caSwyllys 
61799ebb4caSwyllys 	return (rv);
61899ebb4caSwyllys }
61999ebb4caSwyllys 
62099ebb4caSwyllys static KMF_RETURN
62199ebb4caSwyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass,
62299ebb4caSwyllys 	char *dir, char *infile)
62399ebb4caSwyllys {
62499ebb4caSwyllys 	KMF_RETURN rv = KMF_OK;
62599ebb4caSwyllys 	char *keytype = "";
62699ebb4caSwyllys 	int nk, numkeys = 0;
627*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
628*30a5e8faSwyllys 	int numattr = 0;
629*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[16];
630*30a5e8faSwyllys 	KMF_KEY_CLASS keyclass;
63199ebb4caSwyllys 
632*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
633*30a5e8faSwyllys 	    &kstype, sizeof (kstype));
634*30a5e8faSwyllys 	numattr++;
635*30a5e8faSwyllys 
636*30a5e8faSwyllys 	if (dir != NULL) {
637*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
638*30a5e8faSwyllys 		    dir, strlen(dir));
639*30a5e8faSwyllys 		numattr++;
640*30a5e8faSwyllys 	}
641*30a5e8faSwyllys 
642*30a5e8faSwyllys 	if (infile != NULL) {
643*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR,
644*30a5e8faSwyllys 		    infile, strlen(infile));
645*30a5e8faSwyllys 		numattr++;
646*30a5e8faSwyllys 	}
64799ebb4caSwyllys 
64899ebb4caSwyllys 	if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) {
649*30a5e8faSwyllys 		int num = numattr;
650*30a5e8faSwyllys 
651*30a5e8faSwyllys 		keyclass = KMF_ASYM_PRI;
652*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
653*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
654*30a5e8faSwyllys 		num++;
655*30a5e8faSwyllys 
65699ebb4caSwyllys 		keytype = "Asymmetric";
657*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
65899ebb4caSwyllys 		numkeys += nk;
65999ebb4caSwyllys 	}
66099ebb4caSwyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
661*30a5e8faSwyllys 		int num = numattr;
662*30a5e8faSwyllys 
663*30a5e8faSwyllys 		keyclass = KMF_SYMMETRIC;
664*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
665*30a5e8faSwyllys 		    &keyclass, sizeof (keyclass));
666*30a5e8faSwyllys 		num++;
667*30a5e8faSwyllys 
66899ebb4caSwyllys 		keytype = "symmetric";
669*30a5e8faSwyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
67099ebb4caSwyllys 		numkeys += nk;
67199ebb4caSwyllys 	}
67299ebb4caSwyllys 	if (rv == KMF_OK && numkeys == 0)
67399ebb4caSwyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
67499ebb4caSwyllys 
67599ebb4caSwyllys 	return (rv);
67699ebb4caSwyllys }
67799ebb4caSwyllys 
67899ebb4caSwyllys static KMF_RETURN
67999ebb4caSwyllys delete_file_crl(void *kmfhandle, char *dir, char *filename)
68099ebb4caSwyllys {
68199ebb4caSwyllys 	KMF_RETURN rv;
682*30a5e8faSwyllys 	int numattr = 0;
683*30a5e8faSwyllys 	KMF_ATTRIBUTE attrlist[4];
684*30a5e8faSwyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
68599ebb4caSwyllys 
686*30a5e8faSwyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
687*30a5e8faSwyllys 	    &kstype, sizeof (kstype));
688*30a5e8faSwyllys 	numattr++;
68999ebb4caSwyllys 
690*30a5e8faSwyllys 	if (dir) {
691*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
692*30a5e8faSwyllys 		    dir, strlen(dir));
693*30a5e8faSwyllys 		numattr++;
694*30a5e8faSwyllys 	}
695*30a5e8faSwyllys 	if (filename) {
696*30a5e8faSwyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR,
697*30a5e8faSwyllys 		    filename, strlen(filename));
698*30a5e8faSwyllys 		numattr++;
699*30a5e8faSwyllys 	}
70099ebb4caSwyllys 
701*30a5e8faSwyllys 	rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
70299ebb4caSwyllys 
70399ebb4caSwyllys 	return (rv);
70499ebb4caSwyllys }
7057711facfSdinak 
7067711facfSdinak /*
7077711facfSdinak  * Delete token objects.
7087711facfSdinak  */
7097711facfSdinak int
7107711facfSdinak pk_delete(int argc, char *argv[])
7117711facfSdinak {
7127711facfSdinak 	int		opt;
71349e21299Sdinak 	extern int	optind_av;
71449e21299Sdinak 	extern char	*optarg_av;
71549e21299Sdinak 	char		*token_spec = NULL;
71699ebb4caSwyllys 	char		*subject = NULL;
71799ebb4caSwyllys 	char		*issuer = NULL;
71899ebb4caSwyllys 	char		*dir = NULL;
71999ebb4caSwyllys 	char		*prefix = NULL;
72099ebb4caSwyllys 	char		*infile = NULL;
72199ebb4caSwyllys 	char		*object_label = NULL;
72299ebb4caSwyllys 	char		*serstr = NULL;
7237711facfSdinak 
72499ebb4caSwyllys 	int		oclass = 0;
72599ebb4caSwyllys 	KMF_BIGINT	serial = { NULL, 0 };
72699ebb4caSwyllys 	KMF_HANDLE_T	kmfhandle = NULL;
72799ebb4caSwyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
72899ebb4caSwyllys 	KMF_RETURN	kmfrv;
72999ebb4caSwyllys 	int		rv = 0;
73099ebb4caSwyllys 	char			*find_criteria = NULL;
73199ebb4caSwyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
73299ebb4caSwyllys 	KMF_CREDENTIAL	tokencred = {NULL, 0};
7337711facfSdinak 
7347711facfSdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
73549e21299Sdinak 	while ((opt = getopt_av(argc, argv,
73699ebb4caSwyllys 	    "T:(token)y:(objtype)l:(label)"
73799ebb4caSwyllys 	    "k:(keystore)s:(subject)n:(nickname)"
73899ebb4caSwyllys 	    "d:(dir)p:(prefix)S:(serial)i:(issuer)"
73999ebb4caSwyllys 	    "c:(criteria)"
74099ebb4caSwyllys 	    "f:(infile)")) != EOF) {
74199ebb4caSwyllys 
74299ebb4caSwyllys 		if (EMPTYSTRING(optarg_av))
74399ebb4caSwyllys 			return (PK_ERR_USAGE);
7447711facfSdinak 		switch (opt) {
74549e21299Sdinak 		case 'T':	/* token specifier */
74649e21299Sdinak 			if (token_spec)
74749e21299Sdinak 				return (PK_ERR_USAGE);
74849e21299Sdinak 			token_spec = optarg_av;
7497711facfSdinak 			break;
75049e21299Sdinak 		case 'y':	/* object type:  public, private, both */
75199ebb4caSwyllys 			if (oclass)
75249e21299Sdinak 				return (PK_ERR_USAGE);
75399ebb4caSwyllys 			oclass = OT2Int(optarg_av);
75499ebb4caSwyllys 			if (oclass == -1)
75599ebb4caSwyllys 				return (PK_ERR_USAGE);
7567711facfSdinak 			break;
7577711facfSdinak 		case 'l':	/* objects with specific label */
75899ebb4caSwyllys 		case 'n':
7597711facfSdinak 			if (object_label)
7607711facfSdinak 				return (PK_ERR_USAGE);
76199ebb4caSwyllys 			object_label = (char *)optarg_av;
76299ebb4caSwyllys 			break;
76399ebb4caSwyllys 		case 'k':
76499ebb4caSwyllys 			kstype = KS2Int(optarg_av);
76599ebb4caSwyllys 			if (kstype == 0)
76699ebb4caSwyllys 				return (PK_ERR_USAGE);
76799ebb4caSwyllys 			break;
76899ebb4caSwyllys 		case 's':
76999ebb4caSwyllys 			subject = optarg_av;
77099ebb4caSwyllys 			break;
77199ebb4caSwyllys 		case 'i':
77299ebb4caSwyllys 			issuer = optarg_av;
77399ebb4caSwyllys 			break;
77499ebb4caSwyllys 		case 'd':
77599ebb4caSwyllys 			dir = optarg_av;
77699ebb4caSwyllys 			break;
77799ebb4caSwyllys 		case 'p':
77899ebb4caSwyllys 			prefix = optarg_av;
77999ebb4caSwyllys 			break;
78099ebb4caSwyllys 		case 'S':
78199ebb4caSwyllys 			serstr = optarg_av;
78299ebb4caSwyllys 			break;
78399ebb4caSwyllys 		case 'f':
78499ebb4caSwyllys 			infile = optarg_av;
78599ebb4caSwyllys 			break;
78699ebb4caSwyllys 		case 'c':
78799ebb4caSwyllys 			find_criteria = optarg_av;
78899ebb4caSwyllys 			if (!strcasecmp(find_criteria, "valid"))
78999ebb4caSwyllys 				find_criteria_flag =
79099ebb4caSwyllys 				    KMF_NONEXPIRED_CERTS;
79199ebb4caSwyllys 			else if (!strcasecmp(find_criteria, "expired"))
79299ebb4caSwyllys 				find_criteria_flag = KMF_EXPIRED_CERTS;
79399ebb4caSwyllys 			else if (!strcasecmp(find_criteria, "both"))
79499ebb4caSwyllys 				find_criteria_flag = KMF_ALL_CERTS;
79599ebb4caSwyllys 			else
79699ebb4caSwyllys 				return (PK_ERR_USAGE);
7977711facfSdinak 			break;
7987711facfSdinak 		default:
7997711facfSdinak 			return (PK_ERR_USAGE);
8007711facfSdinak 			break;
8017711facfSdinak 		}
8027711facfSdinak 	}
8037711facfSdinak 
80499ebb4caSwyllys 	/* Assume keystore = PKCS#11 if not specified */
80599ebb4caSwyllys 	if (kstype == 0)
80699ebb4caSwyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
80799ebb4caSwyllys 
80899ebb4caSwyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
80999ebb4caSwyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
81099ebb4caSwyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
81199ebb4caSwyllys 
81299ebb4caSwyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
81399ebb4caSwyllys 		    "is only relevant if keystore=pkcs11\n"));
81449e21299Sdinak 		return (PK_ERR_USAGE);
81549e21299Sdinak 	}
81649e21299Sdinak 
81799ebb4caSwyllys 	/* If no object class specified, delete everything but CRLs */
81899ebb4caSwyllys 	if (oclass == 0)
81999ebb4caSwyllys 		oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ |
82099ebb4caSwyllys 		    PK_SYMKEY_OBJ;
8217711facfSdinak 
8227711facfSdinak 	/* No additional args allowed. */
82349e21299Sdinak 	argc -= optind_av;
82449e21299Sdinak 	argv += optind_av;
8257711facfSdinak 	if (argc)
8267711facfSdinak 		return (PK_ERR_USAGE);
8277711facfSdinak 	/* Done parsing command line options. */
8287711facfSdinak 
82999ebb4caSwyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) {
83099ebb4caSwyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
83199ebb4caSwyllys 	} else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) {
83299ebb4caSwyllys 		token_spec = DEFAULT_NSS_TOKEN;
8337711facfSdinak 	}
8347711facfSdinak 
83599ebb4caSwyllys 	if (serstr != NULL) {
83699ebb4caSwyllys 		uchar_t *bytes = NULL;
83799ebb4caSwyllys 		size_t bytelen;
83899ebb4caSwyllys 
839*30a5e8faSwyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
84099ebb4caSwyllys 		if (rv != KMF_OK || bytes == NULL) {
84199ebb4caSwyllys 			(void) fprintf(stderr, gettext("serial number "
84299ebb4caSwyllys 			    "must be specified as a hex number "
84399ebb4caSwyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
84499ebb4caSwyllys 			return (PK_ERR_USAGE);
84599ebb4caSwyllys 		}
84699ebb4caSwyllys 		serial.val = bytes;
84799ebb4caSwyllys 		serial.len = bytelen;
8487711facfSdinak 	}
8497711facfSdinak 
85099ebb4caSwyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
85199ebb4caSwyllys 	    kstype == KMF_KEYSTORE_NSS) &&
85299ebb4caSwyllys 	    (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
85399ebb4caSwyllys 
85499ebb4caSwyllys 		(void) get_token_password(kstype, token_spec,
85599ebb4caSwyllys 		    &tokencred);
8567711facfSdinak 	}
8577711facfSdinak 
858*30a5e8faSwyllys 	if ((kmfrv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
85999ebb4caSwyllys 		return (kmfrv);
8607711facfSdinak 
86199ebb4caSwyllys 	switch (kstype) {
86299ebb4caSwyllys 		case KMF_KEYSTORE_PK11TOKEN:
86399ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
86499ebb4caSwyllys 				kmfrv = delete_pk11_keys(kmfhandle,
86599ebb4caSwyllys 				    token_spec, oclass,
866*30a5e8faSwyllys 				    object_label, &tokencred);
8677711facfSdinak 				/*
86899ebb4caSwyllys 				 * If deleting groups of objects, it is OK
86999ebb4caSwyllys 				 * to ignore the "key not found" case so that
87099ebb4caSwyllys 				 * we can continue to find other objects.
8717711facfSdinak 				 */
87299ebb4caSwyllys 				if (kmfrv == KMF_ERR_KEY_NOT_FOUND &&
87399ebb4caSwyllys 				    (oclass != PK_KEY_OBJ))
87499ebb4caSwyllys 					kmfrv = KMF_OK;
87599ebb4caSwyllys 				if (kmfrv != KMF_OK)
87699ebb4caSwyllys 					break;
8777711facfSdinak 			}
87899ebb4caSwyllys 			if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
87999ebb4caSwyllys 				kmfrv = delete_pk11_certs(kmfhandle,
880*30a5e8faSwyllys 				    token_spec, object_label,
88199ebb4caSwyllys 				    &serial, issuer,
88299ebb4caSwyllys 				    subject, find_criteria_flag);
88399ebb4caSwyllys 				/*
88499ebb4caSwyllys 				 * If cert delete failed, but we are looking at
88599ebb4caSwyllys 				 * other objects, then it is OK.
88699ebb4caSwyllys 				 */
88799ebb4caSwyllys 				if (kmfrv == KMF_ERR_CERT_NOT_FOUND &&
88899ebb4caSwyllys 				    (oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
88999ebb4caSwyllys 					kmfrv = KMF_OK;
89099ebb4caSwyllys 				if (kmfrv != KMF_OK)
89199ebb4caSwyllys 					break;
8927711facfSdinak 			}
89399ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
89499ebb4caSwyllys 				kmfrv = delete_file_crl(kmfhandle,
89599ebb4caSwyllys 				    dir, infile);
89699ebb4caSwyllys 			break;
89799ebb4caSwyllys 		case KMF_KEYSTORE_NSS:
89899ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
89999ebb4caSwyllys 				kmfrv = delete_nss_keys(kmfhandle,
90099ebb4caSwyllys 				    dir, prefix, token_spec,
90199ebb4caSwyllys 				    oclass, (char  *)object_label,
90299ebb4caSwyllys 				    &tokencred);
90399ebb4caSwyllys 				if (kmfrv != KMF_OK)
90499ebb4caSwyllys 					break;
90599ebb4caSwyllys 			}
90699ebb4caSwyllys 			if (oclass & PK_CERT_OBJ) {
90799ebb4caSwyllys 				kmfrv = delete_nss_certs(kmfhandle,
90899ebb4caSwyllys 				    dir, prefix, token_spec,
90999ebb4caSwyllys 				    (char  *)object_label,
91099ebb4caSwyllys 				    &serial, issuer, subject,
91199ebb4caSwyllys 				    find_criteria_flag);
91299ebb4caSwyllys 				if (kmfrv != KMF_OK)
91399ebb4caSwyllys 					break;
91499ebb4caSwyllys 			}
91599ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
91699ebb4caSwyllys 				kmfrv = delete_nss_crl(kmfhandle,
91799ebb4caSwyllys 				    dir, prefix, token_spec,
91899ebb4caSwyllys 				    (char  *)object_label, subject);
91999ebb4caSwyllys 			break;
92099ebb4caSwyllys 		case KMF_KEYSTORE_OPENSSL:
92199ebb4caSwyllys 			if (oclass & PK_KEY_OBJ) {
92299ebb4caSwyllys 				kmfrv = delete_file_keys(kmfhandle, oclass,
92399ebb4caSwyllys 				    dir, infile);
92499ebb4caSwyllys 				if (kmfrv != KMF_OK)
92599ebb4caSwyllys 					break;
92699ebb4caSwyllys 			}
92799ebb4caSwyllys 			if (oclass & (PK_CERT_OBJ)) {
92899ebb4caSwyllys 				kmfrv = delete_file_certs(kmfhandle,
92999ebb4caSwyllys 				    dir, infile, &serial, issuer,
93099ebb4caSwyllys 				    subject, find_criteria_flag);
93199ebb4caSwyllys 				if (kmfrv != KMF_OK)
93299ebb4caSwyllys 					break;
93399ebb4caSwyllys 			}
93499ebb4caSwyllys 			if (oclass & PK_CRL_OBJ)
93599ebb4caSwyllys 				kmfrv = delete_file_crl(kmfhandle,
93699ebb4caSwyllys 				    dir, infile);
93799ebb4caSwyllys 			break;
93899ebb4caSwyllys 		default:
93999ebb4caSwyllys 			rv = PK_ERR_USAGE;
94099ebb4caSwyllys 			break;
9417711facfSdinak 	}
9427711facfSdinak 
94399ebb4caSwyllys 	if (kmfrv != KMF_OK) {
94499ebb4caSwyllys 		display_error(kmfhandle, kmfrv,
94599ebb4caSwyllys 		    gettext("Error deleting objects"));
9467711facfSdinak 	}
9477711facfSdinak 
94899ebb4caSwyllys 	if (serial.val != NULL)
94999ebb4caSwyllys 		free(serial.val);
950*30a5e8faSwyllys 	(void) kmf_finalize(kmfhandle);
95199ebb4caSwyllys 	return (kmfrv);
9527711facfSdinak }
953