xref: /onnv-gate/usr/src/cmd/cmd-crypto/pktool/delete.c (revision 6884:ca518f772fa0)
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 /*
226669Swyllys  * Copyright 2008 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
425051Swyllys pk_destroy_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr)
433089Swyllys {
443089Swyllys 	int i;
453089Swyllys 	KMF_RETURN rv = KMF_OK;
465051Swyllys 	uint32_t *numkeys;
475051Swyllys 	KMF_KEY_HANDLE *keys = NULL;
485051Swyllys 	int del_num = 0;
495051Swyllys 	KMF_ATTRIBUTE delete_attlist[16];
505051Swyllys 	KMF_KEYSTORE_TYPE kstype;
515051Swyllys 	uint32_t len;
525051Swyllys 	boolean_t destroy = B_TRUE;
535051Swyllys 	KMF_CREDENTIAL cred;
545051Swyllys 	char *slotlabel = NULL;
553089Swyllys 
565051Swyllys 	len = sizeof (kstype);
575051Swyllys 	rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
585051Swyllys 	    &kstype, &len);
595051Swyllys 	if (rv != KMF_OK)
605051Swyllys 		return (rv);
615051Swyllys 
625051Swyllys 	kmf_set_attr_at_index(delete_attlist, del_num,
635051Swyllys 	    KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
645051Swyllys 	del_num++;
655051Swyllys 
665051Swyllys 	/* "destroy" is optional. Default is TRUE */
675051Swyllys 	(void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
685051Swyllys 	    (void *)&destroy, NULL);
693089Swyllys 
705051Swyllys 	kmf_set_attr_at_index(delete_attlist, del_num,
715051Swyllys 	    KMF_DESTROY_BOOL_ATTR, &destroy, sizeof (boolean_t));
725051Swyllys 	del_num++;
735051Swyllys 
745051Swyllys 	switch (kstype) {
753089Swyllys 	case KMF_KEYSTORE_NSS:
765051Swyllys 		rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
775051Swyllys 		    (void *)&cred, NULL);
785051Swyllys 		if (rv == KMF_OK) {
795051Swyllys 			if (cred.credlen > 0) {
805051Swyllys 				kmf_set_attr_at_index(delete_attlist, del_num,
815051Swyllys 				    KMF_CREDENTIAL_ATTR, &cred,
825051Swyllys 				    sizeof (KMF_CREDENTIAL));
835051Swyllys 				del_num++;
845051Swyllys 			}
855051Swyllys 		}
865051Swyllys 
875051Swyllys 		slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist,
885051Swyllys 		    numattr);
895051Swyllys 		if (slotlabel != NULL) {
905051Swyllys 			kmf_set_attr_at_index(delete_attlist, del_num,
915051Swyllys 			    KMF_TOKEN_LABEL_ATTR, slotlabel,
925051Swyllys 			    strlen(slotlabel));
935051Swyllys 			del_num++;
945051Swyllys 		}
953089Swyllys 		break;
963089Swyllys 	case KMF_KEYSTORE_OPENSSL:
973089Swyllys 		break;
983089Swyllys 	case KMF_KEYSTORE_PK11TOKEN:
995051Swyllys 		rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
1005051Swyllys 		    (void *)&cred, NULL);
1015051Swyllys 		if (rv == KMF_OK) {
1025051Swyllys 			if (cred.credlen > 0) {
1035051Swyllys 				kmf_set_attr_at_index(delete_attlist, del_num,
1045051Swyllys 				    KMF_CREDENTIAL_ATTR, &cred,
1055051Swyllys 				    sizeof (KMF_CREDENTIAL));
1065051Swyllys 				del_num++;
1075051Swyllys 			}
1085051Swyllys 		}
1093089Swyllys 		break;
1103089Swyllys 	default:
1113089Swyllys 		return (PK_ERR_USAGE);
1123089Swyllys 	}
1133089Swyllys 
1145051Swyllys 	numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
1155051Swyllys 	if (numkeys == NULL)
1165051Swyllys 		return (PK_ERR_USAGE);
1175051Swyllys 
1185051Swyllys 	keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
1195051Swyllys 	if (keys == NULL)
1205051Swyllys 		return (PK_ERR_USAGE);
1215051Swyllys 
1225051Swyllys 	for (i = 0; rv == KMF_OK && i < *numkeys; i++) {
1235051Swyllys 		int num = del_num;
1245051Swyllys 
1255051Swyllys 		kmf_set_attr_at_index(delete_attlist, num,
1265051Swyllys 		    KMF_KEY_HANDLE_ATTR, &keys[i], sizeof (KMF_KEY_HANDLE));
1275051Swyllys 		num++;
1285051Swyllys 
1295051Swyllys 		rv = kmf_delete_key_from_keystore(handle, num, delete_attlist);
1303089Swyllys 	}
1313089Swyllys 	return (rv);
1323089Swyllys }
1333089Swyllys 
1343089Swyllys static KMF_RETURN
1355051Swyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr,
1365051Swyllys 	char *desc, int *keysdeleted)
1373089Swyllys {
1383089Swyllys 	KMF_RETURN rv = KMF_OK;
1393089Swyllys 	uint32_t numkeys = 0;
1405051Swyllys 	int num = numattr;
1413089Swyllys 
1423089Swyllys 	*keysdeleted = 0;
1433089Swyllys 	numkeys = 0;
1445051Swyllys 
1455051Swyllys 	kmf_set_attr_at_index(attlist, num,
1465051Swyllys 	    KMF_COUNT_ATTR, &numkeys, sizeof (uint32_t));
1475051Swyllys 	num++;
1485051Swyllys 
1495051Swyllys 	rv = kmf_find_key(kmfhandle, num, attlist);
1505051Swyllys 
1513089Swyllys 	if (rv == KMF_OK && numkeys > 0) {
1523089Swyllys 		KMF_KEY_HANDLE *keys = NULL;
1533089Swyllys 		char prompt[1024];
1543089Swyllys 
1553089Swyllys 		(void) snprintf(prompt, sizeof (prompt),
1565051Swyllys 		    gettext("%d %s key(s) found, do you want "
1575051Swyllys 		    "to delete them (y/N) ?"), numkeys,
1585051Swyllys 		    (desc != NULL ? desc : ""));
1593089Swyllys 
1603089Swyllys 		if (!yesno(prompt,
1615051Swyllys 		    gettext("Respond with yes or no.\n"),
1625051Swyllys 		    B_FALSE)) {
1635221Swyllys 			*keysdeleted = numkeys;
1643089Swyllys 			return (KMF_OK);
1653089Swyllys 		}
1663089Swyllys 		keys = (KMF_KEY_HANDLE *)malloc(numkeys *
1675051Swyllys 		    sizeof (KMF_KEY_HANDLE));
1683089Swyllys 		if (keys == NULL)
1693089Swyllys 			return (KMF_ERR_MEMORY);
1703089Swyllys 		(void) memset(keys, 0, numkeys *
1715051Swyllys 		    sizeof (KMF_KEY_HANDLE));
1723089Swyllys 
1735051Swyllys 		kmf_set_attr_at_index(attlist, num,
1745051Swyllys 		    KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE));
1755051Swyllys 		num++;
1765051Swyllys 
1775051Swyllys 		rv = kmf_find_key(kmfhandle, num, attlist);
1783089Swyllys 		if (rv == KMF_OK) {
1795051Swyllys 			rv = pk_destroy_keys(kmfhandle, attlist, num);
1803089Swyllys 		}
1813089Swyllys 
1823089Swyllys 		free(keys);
1833089Swyllys 	}
1843089Swyllys 
1853089Swyllys 	if (rv == KMF_ERR_KEY_NOT_FOUND) {
1863089Swyllys 		rv = KMF_OK;
1873089Swyllys 	}
1883089Swyllys 
1893089Swyllys 	*keysdeleted = numkeys;
1903089Swyllys 	return (rv);
1913089Swyllys }
1923089Swyllys 
1933089Swyllys static KMF_RETURN
1945051Swyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr)
1953089Swyllys {
1963089Swyllys 	KMF_RETURN rv = KMF_OK;
1973089Swyllys 	uint32_t numcerts = 0;
1985051Swyllys 	int num = numattr;
1993089Swyllys 
2005051Swyllys 	kmf_set_attr_at_index(attlist, num,
2015051Swyllys 	    KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t));
2025051Swyllys 	num++;
2035051Swyllys 
2045051Swyllys 	rv = kmf_find_cert(kmfhandle, num, attlist);
2053089Swyllys 	if (rv == KMF_OK && numcerts > 0) {
2063089Swyllys 		char prompt[1024];
2073089Swyllys 		(void) snprintf(prompt, sizeof (prompt),
2085051Swyllys 		    gettext("%d certificate(s) found, do you want "
2095051Swyllys 		    "to delete them (y/N) ?"), numcerts);
2103089Swyllys 
2113089Swyllys 		if (!yesno(prompt,
2125051Swyllys 		    gettext("Respond with yes or no.\n"),
2135051Swyllys 		    B_FALSE)) {
2143089Swyllys 			return (KMF_OK);
2153089Swyllys 		}
2163089Swyllys 
2175051Swyllys 		/*
2185051Swyllys 		 * Use numattr because delete cert does not require
2195051Swyllys 		 * KMF_COUNT_ATTR attribute.
2205051Swyllys 		 */
2215051Swyllys 		rv = kmf_delete_cert_from_keystore(kmfhandle, numattr, attlist);
2223089Swyllys 
2233089Swyllys 	} else if (rv == KMF_ERR_CERT_NOT_FOUND) {
2243089Swyllys 		rv = KMF_OK;
2253089Swyllys 	}
2263089Swyllys 
2273089Swyllys 	return (rv);
2283089Swyllys }
2293089Swyllys 
2303089Swyllys static KMF_RETURN
2313089Swyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix,
2323089Swyllys 	char *token, int oclass, char *objlabel,
2333089Swyllys 	KMF_CREDENTIAL *tokencred)
2343089Swyllys {
2353089Swyllys 	KMF_RETURN rv = KMF_OK;
2363089Swyllys 	char *keytype = NULL;
2373089Swyllys 	int nk, numkeys = 0;
2385051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
2395051Swyllys 	int numattr = 0;
2405051Swyllys 	KMF_ATTRIBUTE attrlist[16];
2415051Swyllys 	KMF_KEY_CLASS keyclass;
2423089Swyllys 
2433089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
2443089Swyllys 	if (rv != KMF_OK)
2453089Swyllys 		return (rv);
2463089Swyllys 
2475051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
2485051Swyllys 	    &kstype, sizeof (kstype));
2495051Swyllys 	numattr++;
2505051Swyllys 
2515051Swyllys 	if (objlabel != NULL) {
2525051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
2535051Swyllys 		    objlabel, strlen(objlabel));
2545051Swyllys 		numattr++;
2555051Swyllys 	}
2565051Swyllys 
2575051Swyllys 	if (tokencred->credlen > 0) {
2585051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
2595051Swyllys 		    tokencred, sizeof (KMF_CREDENTIAL));
2605051Swyllys 		numattr++;
2615051Swyllys 	}
2625051Swyllys 
2635051Swyllys 	if (token && strlen(token)) {
2645051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
2655051Swyllys 		    token, strlen(token));
2665051Swyllys 		numattr++;
2675051Swyllys 	}
2683089Swyllys 
2693089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
2705051Swyllys 		int num = numattr;
2715051Swyllys 
2725051Swyllys 		keyclass = KMF_ASYM_PRI;
2735051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
2745051Swyllys 		    &keyclass, sizeof (keyclass));
2755051Swyllys 		num++;
2765051Swyllys 
2773089Swyllys 		keytype = "private";
2785051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
2793089Swyllys 		numkeys += nk;
2803089Swyllys 	}
2813089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
2825051Swyllys 		int num = numattr;
2835051Swyllys 
2845051Swyllys 		keyclass = KMF_SYMMETRIC;
2855051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
2865051Swyllys 		    &keyclass, sizeof (keyclass));
2875051Swyllys 		num++;
2885051Swyllys 
2893089Swyllys 		keytype = "symmetric";
2905051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
2913089Swyllys 		numkeys += nk;
2923089Swyllys 	}
2933089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
2945051Swyllys 		int num = numattr;
2955051Swyllys 
2965051Swyllys 		keyclass = KMF_ASYM_PUB;
2975051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
2985051Swyllys 		    &keyclass, sizeof (keyclass));
2995051Swyllys 		num++;
3005051Swyllys 
3013089Swyllys 		keytype = "public";
3025051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
3033089Swyllys 		numkeys += nk;
3043089Swyllys 	}
3053089Swyllys 	if (rv == KMF_OK && numkeys == 0)
3063089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
3073089Swyllys 
3083089Swyllys 	return (rv);
3093089Swyllys }
3103089Swyllys 
3113089Swyllys 
3123089Swyllys static KMF_RETURN
3133089Swyllys delete_nss_certs(KMF_HANDLE_T kmfhandle,
3143089Swyllys 	char *dir, char *prefix,
3153089Swyllys 	char *token, char *objlabel,
3163089Swyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
3173089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
3183089Swyllys {
3193089Swyllys 	KMF_RETURN rv = KMF_OK;
3205051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
3215051Swyllys 	int numattr = 0;
3225051Swyllys 	KMF_ATTRIBUTE attrlist[16];
3233089Swyllys 
3243089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
3253089Swyllys 	if (rv != KMF_OK)
3263089Swyllys 		return (rv);
3273089Swyllys 
3285051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
3295051Swyllys 		    &kstype, sizeof (kstype));
3305051Swyllys 		numattr++;
3315051Swyllys 
3325051Swyllys 		if (objlabel != NULL) {
3335051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3345051Swyllys 			    KMF_CERT_LABEL_ATTR, objlabel,
3355051Swyllys 			    strlen(objlabel));
3365051Swyllys 			numattr++;
3375051Swyllys 		}
3385051Swyllys 
3395051Swyllys 		if (issuer != NULL) {
3405051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3415051Swyllys 			    KMF_ISSUER_NAME_ATTR, issuer,
3425051Swyllys 			    strlen(issuer));
3435051Swyllys 			numattr++;
3445051Swyllys 		}
3453089Swyllys 
3465051Swyllys 		if (subject != NULL) {
3475051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3485051Swyllys 			    KMF_SUBJECT_NAME_ATTR, subject,
3495051Swyllys 			    strlen(subject));
3505051Swyllys 			numattr++;
3515051Swyllys 		}
3525051Swyllys 
3535051Swyllys 		if (serno != NULL) {
3545051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3555051Swyllys 			    KMF_BIGINT_ATTR, serno,
3565051Swyllys 			    sizeof (KMF_BIGINT));
3575051Swyllys 			numattr++;
3585051Swyllys 		}
3593089Swyllys 
3605051Swyllys 		kmf_set_attr_at_index(attrlist, numattr,
3615051Swyllys 		    KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
3625051Swyllys 		    sizeof (KMF_CERT_VALIDITY));
3635051Swyllys 		numattr++;
3645051Swyllys 
3655051Swyllys 		if (token != NULL) {
3665051Swyllys 			kmf_set_attr_at_index(attrlist, numattr,
3675051Swyllys 			    KMF_TOKEN_LABEL_ATTR, token,
3685051Swyllys 			    strlen(token));
3695051Swyllys 			numattr++;
3705051Swyllys 		}
3715051Swyllys 
3725051Swyllys 	rv = pk_delete_certs(kmfhandle, attrlist, numattr);
3733089Swyllys 
3743089Swyllys 	return (rv);
3753089Swyllys }
3763089Swyllys 
3773089Swyllys static KMF_RETURN
3783089Swyllys delete_nss_crl(void *kmfhandle,
3793089Swyllys 	char *dir, char *prefix, char *token,
3805051Swyllys 	char *issuer, char *subject)
3813089Swyllys {
3823089Swyllys 	KMF_RETURN rv = KMF_OK;
3835051Swyllys 	int numattr = 0;
3845051Swyllys 	KMF_ATTRIBUTE attrlist[8];
3855051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
3863089Swyllys 
3873089Swyllys 	rv = configure_nss(kmfhandle, dir, prefix);
3883089Swyllys 	if (rv != KMF_OK)
3893089Swyllys 		return (rv);
3903089Swyllys 
3915051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
3925051Swyllys 	    &kstype, sizeof (kstype));
3935051Swyllys 	numattr++;
3943089Swyllys 
3955051Swyllys 	if (token != NULL) {
3965051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
3975051Swyllys 		    token, strlen(token));
3985051Swyllys 		numattr++;
3995051Swyllys 	}
4005051Swyllys 	if (issuer != NULL) {
4015051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
4025051Swyllys 		    issuer, strlen(issuer));
4035051Swyllys 		numattr++;
4045051Swyllys 	}
4055051Swyllys 	if (subject != NULL) {
4065051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
4075051Swyllys 		    subject, strlen(subject));
4085051Swyllys 		numattr++;
4095051Swyllys 	}
4103089Swyllys 
4115051Swyllys 	rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
4123089Swyllys 
4133089Swyllys 	return (rv);
4143089Swyllys }
4153089Swyllys 
4163089Swyllys static KMF_RETURN
4173089Swyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle,
4183089Swyllys 	char *token, int oclass, char *objlabel,
4193089Swyllys 	KMF_CREDENTIAL *tokencred)
4203089Swyllys {
4213089Swyllys 	KMF_RETURN rv = KMF_OK;
4223089Swyllys 	int nk, numkeys = 0;
4235051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
4245051Swyllys 	int numattr = 0;
4255051Swyllys 	KMF_ATTRIBUTE attrlist[16];
4265051Swyllys 	KMF_KEY_CLASS keyclass;
4275051Swyllys 	boolean_t token_bool = B_TRUE;
4285051Swyllys 	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 
4425051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
4435051Swyllys 	    &kstype, sizeof (kstype));
4445051Swyllys 	numattr++;
4455051Swyllys 
4465051Swyllys 	if (objlabel != NULL) {
4475051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
4485051Swyllys 		    objlabel, strlen(objlabel));
4495051Swyllys 		numattr++;
4505051Swyllys 	}
4515051Swyllys 
4525051Swyllys 	if (tokencred != NULL && tokencred->credlen > 0) {
4535051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
4545051Swyllys 		    tokencred, sizeof (KMF_CREDENTIAL));
4555051Swyllys 		numattr++;
4565051Swyllys 	}
4575051Swyllys 
4585051Swyllys 	private = ((oclass & PK_PRIVATE_OBJ) > 0);
4595051Swyllys 
4605051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR,
4615051Swyllys 	    &private, sizeof (private));
4625051Swyllys 	numattr++;
4635051Swyllys 
4645051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR,
4655051Swyllys 	    &token_bool, sizeof (token_bool));
4665051Swyllys 	numattr++;
4673089Swyllys 
4683089Swyllys 	if (oclass & PK_PRIKEY_OBJ) {
4695051Swyllys 		int num = numattr;
4705051Swyllys 
4715051Swyllys 		keyclass = KMF_ASYM_PRI;
4725051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
4735051Swyllys 		    &keyclass, sizeof (keyclass));
4745051Swyllys 		num++;
4755051Swyllys 
4765051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "private", &nk);
4773089Swyllys 		numkeys += nk;
4783089Swyllys 	}
4793089Swyllys 
4803089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
4815051Swyllys 		int num = numattr;
4825051Swyllys 
4835051Swyllys 		keyclass = KMF_SYMMETRIC;
4845051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
4855051Swyllys 		    &keyclass, sizeof (keyclass));
4865051Swyllys 		num++;
4875051Swyllys 
4885051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "symmetric", &nk);
4893089Swyllys 		numkeys += nk;
4903089Swyllys 	}
4913089Swyllys 
4923089Swyllys 	if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
4935051Swyllys 		int num = numattr;
4945051Swyllys 
4955221Swyllys 		private = B_FALSE;
4965051Swyllys 		keyclass = KMF_ASYM_PUB;
4975051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
4985051Swyllys 		    &keyclass, sizeof (keyclass));
4995051Swyllys 		num++;
5005051Swyllys 
5015051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, "public", &nk);
5023089Swyllys 		numkeys += nk;
5033089Swyllys 	}
5043089Swyllys 	if (rv == KMF_OK && numkeys == 0)
5053089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
5063089Swyllys 
5073089Swyllys 	return (rv);
5083089Swyllys }
5093089Swyllys 
5103089Swyllys static KMF_RETURN
5113089Swyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle,
5123089Swyllys 	char *token, char *objlabel,
5133089Swyllys 	KMF_BIGINT *serno, char *issuer, char *subject,
5143089Swyllys 	KMF_CERT_VALIDITY find_criteria_flag)
5153089Swyllys {
5163089Swyllys 	KMF_RETURN kmfrv;
5175051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
5185051Swyllys 	int numattr = 0;
5195051Swyllys 	KMF_ATTRIBUTE attrlist[16];
5203089Swyllys 
5213089Swyllys 	kmfrv = select_token(kmfhandle, token, FALSE);
5223089Swyllys 
5233089Swyllys 	if (kmfrv != KMF_OK) {
5243089Swyllys 		return (kmfrv);
5253089Swyllys 	}
5263089Swyllys 
5275051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5285051Swyllys 	    &kstype, sizeof (kstype));
5295051Swyllys 	numattr++;
5305051Swyllys 
5315051Swyllys 	if (objlabel != NULL) {
5325051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR,
5335051Swyllys 		    objlabel, strlen(objlabel));
5345051Swyllys 		numattr++;
5355051Swyllys 	}
5365051Swyllys 
5375051Swyllys 	if (issuer != NULL) {
5385051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
5395051Swyllys 		    issuer, strlen(issuer));
5405051Swyllys 		numattr++;
5415051Swyllys 	}
5423089Swyllys 
5435051Swyllys 	if (subject != NULL) {
5445051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
5455051Swyllys 		    subject, strlen(subject));
5465051Swyllys 		numattr++;
5475051Swyllys 	}
5485051Swyllys 
5495051Swyllys 	if (serno != NULL) {
5505051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
5515051Swyllys 		    serno, sizeof (KMF_BIGINT));
5525051Swyllys 		numattr++;
5535051Swyllys 	}
5545051Swyllys 
5555051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
5565051Swyllys 	    &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
5575051Swyllys 	numattr++;
5585051Swyllys 
5595051Swyllys 	kmfrv = pk_delete_certs(kmfhandle, attrlist, numattr);
5603089Swyllys 
5613089Swyllys 	return (kmfrv);
5623089Swyllys }
5633089Swyllys 
5643089Swyllys static KMF_RETURN
5653089Swyllys delete_file_certs(KMF_HANDLE_T kmfhandle,
5663089Swyllys 	char *dir, char *filename, KMF_BIGINT *serial, char *issuer,
5673089Swyllys 	char *subject, KMF_CERT_VALIDITY find_criteria_flag)
5683089Swyllys {
5693089Swyllys 	KMF_RETURN rv;
5705051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
5715051Swyllys 	int numattr = 0;
5725051Swyllys 	KMF_ATTRIBUTE attrlist[16];
5735051Swyllys 
5745051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
5755051Swyllys 	    &kstype, sizeof (kstype));
5765051Swyllys 	numattr++;
5775051Swyllys 
5785051Swyllys 	if (issuer != NULL) {
5795051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
5805051Swyllys 		    issuer, strlen(issuer));
5815051Swyllys 		numattr++;
5825051Swyllys 	}
5835051Swyllys 
5845051Swyllys 	if (subject != NULL) {
5855051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
5865051Swyllys 		    subject, strlen(subject));
5875051Swyllys 		numattr++;
5885051Swyllys 	}
5893089Swyllys 
5905051Swyllys 	if (serial != NULL) {
5915051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
5925051Swyllys 		    serial, sizeof (KMF_BIGINT));
5935051Swyllys 		numattr++;
5945051Swyllys 	}
5955051Swyllys 
5965051Swyllys 	if (dir != NULL) {
5975051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
5985051Swyllys 		    dir, strlen(dir));
5995051Swyllys 		numattr++;
6005051Swyllys 	}
6013089Swyllys 
6025051Swyllys 	if (filename != NULL) {
6035051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR,
6045051Swyllys 		    filename, strlen(filename));
6055051Swyllys 		numattr++;
6065051Swyllys 	}
6073089Swyllys 
6085051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
6095051Swyllys 	    &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
6105051Swyllys 	numattr++;
6115051Swyllys 
6125051Swyllys 	rv = pk_delete_certs(kmfhandle, attrlist, numattr);
6133089Swyllys 
6143089Swyllys 	return (rv);
6153089Swyllys }
6163089Swyllys 
6173089Swyllys static KMF_RETURN
6183089Swyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass,
6193089Swyllys 	char *dir, char *infile)
6203089Swyllys {
6213089Swyllys 	KMF_RETURN rv = KMF_OK;
6223089Swyllys 	char *keytype = "";
6233089Swyllys 	int nk, numkeys = 0;
6245051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
6255051Swyllys 	int numattr = 0;
6265051Swyllys 	KMF_ATTRIBUTE attrlist[16];
6275051Swyllys 	KMF_KEY_CLASS keyclass;
6283089Swyllys 
6295051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
6305051Swyllys 	    &kstype, sizeof (kstype));
6315051Swyllys 	numattr++;
6325051Swyllys 
6335051Swyllys 	if (dir != NULL) {
6345051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
6355051Swyllys 		    dir, strlen(dir));
6365051Swyllys 		numattr++;
6375051Swyllys 	}
6385051Swyllys 
6395051Swyllys 	if (infile != NULL) {
6405051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR,
6415051Swyllys 		    infile, strlen(infile));
6425051Swyllys 		numattr++;
6435051Swyllys 	}
6443089Swyllys 
6453089Swyllys 	if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) {
6465051Swyllys 		int num = numattr;
6475051Swyllys 
6485051Swyllys 		keyclass = KMF_ASYM_PRI;
6495051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
6505051Swyllys 		    &keyclass, sizeof (keyclass));
6515051Swyllys 		num++;
6525051Swyllys 
6533089Swyllys 		keytype = "Asymmetric";
6545051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
6553089Swyllys 		numkeys += nk;
6563089Swyllys 	}
6573089Swyllys 	if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
6585051Swyllys 		int num = numattr;
6595051Swyllys 
6605051Swyllys 		keyclass = KMF_SYMMETRIC;
6615051Swyllys 		kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
6625051Swyllys 		    &keyclass, sizeof (keyclass));
6635051Swyllys 		num++;
6645051Swyllys 
6653089Swyllys 		keytype = "symmetric";
6665051Swyllys 		rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
6673089Swyllys 		numkeys += nk;
6683089Swyllys 	}
6693089Swyllys 	if (rv == KMF_OK && numkeys == 0)
6703089Swyllys 		rv = KMF_ERR_KEY_NOT_FOUND;
6713089Swyllys 
6723089Swyllys 	return (rv);
6733089Swyllys }
6743089Swyllys 
6753089Swyllys static KMF_RETURN
6766669Swyllys delete_file_crl(void *kmfhandle, char *filename)
6773089Swyllys {
6783089Swyllys 	KMF_RETURN rv;
6795051Swyllys 	int numattr = 0;
6805051Swyllys 	KMF_ATTRIBUTE attrlist[4];
6815051Swyllys 	KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
6823089Swyllys 
6836669Swyllys 	if (filename == NULL || strlen(filename) == 0)
6846669Swyllys 		return (KMF_ERR_BAD_PARAMETER);
6856669Swyllys 
6865051Swyllys 	kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
6875051Swyllys 	    &kstype, sizeof (kstype));
6885051Swyllys 	numattr++;
6893089Swyllys 
6905051Swyllys 	if (filename) {
6915051Swyllys 		kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR,
6925051Swyllys 		    filename, strlen(filename));
6935051Swyllys 		numattr++;
6945051Swyllys 	}
6953089Swyllys 
6965051Swyllys 	rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
6973089Swyllys 
6983089Swyllys 	return (rv);
6993089Swyllys }
70017Sdinak 
70117Sdinak /*
70217Sdinak  * Delete token objects.
70317Sdinak  */
70417Sdinak int
70517Sdinak pk_delete(int argc, char *argv[])
70617Sdinak {
70717Sdinak 	int		opt;
708864Sdinak 	extern int	optind_av;
709864Sdinak 	extern char	*optarg_av;
710864Sdinak 	char		*token_spec = NULL;
7113089Swyllys 	char		*subject = NULL;
7123089Swyllys 	char		*issuer = NULL;
7133089Swyllys 	char		*dir = NULL;
7143089Swyllys 	char		*prefix = NULL;
7153089Swyllys 	char		*infile = NULL;
7163089Swyllys 	char		*object_label = NULL;
7173089Swyllys 	char		*serstr = NULL;
71817Sdinak 
7193089Swyllys 	int		oclass = 0;
7203089Swyllys 	KMF_BIGINT	serial = { NULL, 0 };
7213089Swyllys 	KMF_HANDLE_T	kmfhandle = NULL;
7223089Swyllys 	KMF_KEYSTORE_TYPE	kstype = 0;
7233089Swyllys 	KMF_RETURN	kmfrv;
7243089Swyllys 	int		rv = 0;
7253089Swyllys 	char			*find_criteria = NULL;
7263089Swyllys 	KMF_CERT_VALIDITY	find_criteria_flag = KMF_ALL_CERTS;
7273089Swyllys 	KMF_CREDENTIAL	tokencred = {NULL, 0};
72817Sdinak 
72917Sdinak 	/* Parse command line options.  Do NOT i18n/l10n. */
730864Sdinak 	while ((opt = getopt_av(argc, argv,
7315051Swyllys 	    "T:(token)y:(objtype)l:(label)"
7325051Swyllys 	    "k:(keystore)s:(subject)n:(nickname)"
7335051Swyllys 	    "d:(dir)p:(prefix)S:(serial)i:(issuer)"
7345051Swyllys 	    "c:(criteria)"
7355051Swyllys 	    "f:(infile)")) != EOF) {
7363089Swyllys 
7373089Swyllys 		if (EMPTYSTRING(optarg_av))
7383089Swyllys 			return (PK_ERR_USAGE);
73917Sdinak 		switch (opt) {
740864Sdinak 		case 'T':	/* token specifier */
741864Sdinak 			if (token_spec)
742864Sdinak 				return (PK_ERR_USAGE);
743864Sdinak 			token_spec = optarg_av;
74417Sdinak 			break;
745864Sdinak 		case 'y':	/* object type:  public, private, both */
7463089Swyllys 			if (oclass)
747864Sdinak 				return (PK_ERR_USAGE);
7483089Swyllys 			oclass = OT2Int(optarg_av);
7493089Swyllys 			if (oclass == -1)
7503089Swyllys 				return (PK_ERR_USAGE);
75117Sdinak 			break;
75217Sdinak 		case 'l':	/* objects with specific label */
7533089Swyllys 		case 'n':
75417Sdinak 			if (object_label)
75517Sdinak 				return (PK_ERR_USAGE);
7563089Swyllys 			object_label = (char *)optarg_av;
7573089Swyllys 			break;
7583089Swyllys 		case 'k':
7593089Swyllys 			kstype = KS2Int(optarg_av);
7603089Swyllys 			if (kstype == 0)
7613089Swyllys 				return (PK_ERR_USAGE);
7623089Swyllys 			break;
7633089Swyllys 		case 's':
7643089Swyllys 			subject = optarg_av;
7653089Swyllys 			break;
7663089Swyllys 		case 'i':
7673089Swyllys 			issuer = optarg_av;
7683089Swyllys 			break;
7693089Swyllys 		case 'd':
7703089Swyllys 			dir = optarg_av;
7713089Swyllys 			break;
7723089Swyllys 		case 'p':
7733089Swyllys 			prefix = optarg_av;
7743089Swyllys 			break;
7753089Swyllys 		case 'S':
7763089Swyllys 			serstr = optarg_av;
7773089Swyllys 			break;
7783089Swyllys 		case 'f':
7793089Swyllys 			infile = optarg_av;
7803089Swyllys 			break;
7813089Swyllys 		case 'c':
7823089Swyllys 			find_criteria = optarg_av;
7833089Swyllys 			if (!strcasecmp(find_criteria, "valid"))
7843089Swyllys 				find_criteria_flag =
7855051Swyllys 				    KMF_NONEXPIRED_CERTS;
7863089Swyllys 			else if (!strcasecmp(find_criteria, "expired"))
7873089Swyllys 				find_criteria_flag = KMF_EXPIRED_CERTS;
7883089Swyllys 			else if (!strcasecmp(find_criteria, "both"))
7893089Swyllys 				find_criteria_flag = KMF_ALL_CERTS;
7903089Swyllys 			else
7913089Swyllys 				return (PK_ERR_USAGE);
79217Sdinak 			break;
79317Sdinak 		default:
79417Sdinak 			return (PK_ERR_USAGE);
79517Sdinak 			break;
79617Sdinak 		}
79717Sdinak 	}
79817Sdinak 
7993089Swyllys 	/* Assume keystore = PKCS#11 if not specified */
8003089Swyllys 	if (kstype == 0)
8013089Swyllys 		kstype = KMF_KEYSTORE_PK11TOKEN;
8023089Swyllys 
8033089Swyllys 	/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
8043089Swyllys 	if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
8055051Swyllys 	    kstype != KMF_KEYSTORE_PK11TOKEN) {
8063089Swyllys 
8073089Swyllys 		(void) fprintf(stderr, gettext("The objtype parameter "
8085051Swyllys 		    "is only relevant if keystore=pkcs11\n"));
8093089Swyllys 		return (PK_ERR_USAGE);
810864Sdinak 	}
811864Sdinak 
81217Sdinak 
81317Sdinak 	/* No additional args allowed. */
814864Sdinak 	argc -= optind_av;
815864Sdinak 	argv += optind_av;
81617Sdinak 	if (argc)
81717Sdinak 		return (PK_ERR_USAGE);
81817Sdinak 	/* Done parsing command line options. */
81917Sdinak 
820*6884Swyllys 	DIR_OPTION_CHECK(kstype, dir);
821*6884Swyllys 
8223089Swyllys 	if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) {
8233089Swyllys 		token_spec = PK_DEFAULT_PK11TOKEN;
8243089Swyllys 	} else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) {
8253089Swyllys 		token_spec = DEFAULT_NSS_TOKEN;
82617Sdinak 	}
82717Sdinak 
8283089Swyllys 	if (serstr != NULL) {
8293089Swyllys 		uchar_t *bytes = NULL;
8303089Swyllys 		size_t bytelen;
8313089Swyllys 
8325051Swyllys 		rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
8333089Swyllys 		if (rv != KMF_OK || bytes == NULL) {
8343089Swyllys 			(void) fprintf(stderr, gettext("serial number "
8355051Swyllys 			    "must be specified as a hex number "
8365051Swyllys 			    "(ex: 0x0102030405ffeeddee)\n"));
8373089Swyllys 			return (PK_ERR_USAGE);
8383089Swyllys 		}
8393089Swyllys 		serial.val = bytes;
8403089Swyllys 		serial.len = bytelen;
8415221Swyllys 		/* If serial number was given, it must be a cert search */
8425221Swyllys 		if (oclass == 0)
8435221Swyllys 			oclass = PK_CERT_OBJ;
84417Sdinak 	}
8455221Swyllys 	/*
8465221Swyllys 	 * If no object type was given but subject or issuer was,
8475221Swyllys 	 * it must be a certificate we are looking to delete.
8485221Swyllys 	 */
8495221Swyllys 	if ((issuer != NULL || subject != NULL) && oclass == 0)
8505221Swyllys 		oclass = PK_CERT_OBJ;
8515221Swyllys 	/* If no object class specified, delete everything but CRLs */
8525221Swyllys 	if (oclass == 0)
8535221Swyllys 		oclass = PK_CERT_OBJ | PK_KEY_OBJ;
85417Sdinak 
8553089Swyllys 	if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
8565051Swyllys 	    kstype == KMF_KEYSTORE_NSS) &&
8575051Swyllys 	    (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
85817Sdinak 
8593089Swyllys 		(void) get_token_password(kstype, token_spec,
8605051Swyllys 		    &tokencred);
86117Sdinak 	}
86217Sdinak 
8635051Swyllys 	if ((kmfrv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
8643089Swyllys 		return (kmfrv);
8653089Swyllys 
8663089Swyllys 	switch (kstype) {
8673089Swyllys 		case KMF_KEYSTORE_PK11TOKEN:
8683089Swyllys 			if (oclass & PK_KEY_OBJ) {
8693089Swyllys 				kmfrv = delete_pk11_keys(kmfhandle,
8705051Swyllys 				    token_spec, oclass,
8715051Swyllys 				    object_label, &tokencred);
8723089Swyllys 				/*
8733089Swyllys 				 * If deleting groups of objects, it is OK
8743089Swyllys 				 * to ignore the "key not found" case so that
8753089Swyllys 				 * we can continue to find other objects.
8763089Swyllys 				 */
8773089Swyllys 				if (kmfrv == KMF_ERR_KEY_NOT_FOUND &&
8785051Swyllys 				    (oclass != PK_KEY_OBJ))
8793089Swyllys 					kmfrv = KMF_OK;
8803089Swyllys 				if (kmfrv != KMF_OK)
8813089Swyllys 					break;
8823089Swyllys 			}
8833089Swyllys 			if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
8843089Swyllys 				kmfrv = delete_pk11_certs(kmfhandle,
8855051Swyllys 				    token_spec, object_label,
8865051Swyllys 				    &serial, issuer,
8875051Swyllys 				    subject, find_criteria_flag);
8883089Swyllys 				/*
8893089Swyllys 				 * If cert delete failed, but we are looking at
8903089Swyllys 				 * other objects, then it is OK.
8913089Swyllys 				 */
8923089Swyllys 				if (kmfrv == KMF_ERR_CERT_NOT_FOUND &&
8935051Swyllys 				    (oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
8943089Swyllys 					kmfrv = KMF_OK;
8953089Swyllys 				if (kmfrv != KMF_OK)
8963089Swyllys 					break;
8973089Swyllys 			}
8983089Swyllys 			if (oclass & PK_CRL_OBJ)
8993089Swyllys 				kmfrv = delete_file_crl(kmfhandle,
9006669Swyllys 				    infile);
9013089Swyllys 			break;
9023089Swyllys 		case KMF_KEYSTORE_NSS:
9033089Swyllys 			if (oclass & PK_KEY_OBJ) {
9043089Swyllys 				kmfrv = delete_nss_keys(kmfhandle,
9055051Swyllys 				    dir, prefix, token_spec,
9065051Swyllys 				    oclass, (char  *)object_label,
9075051Swyllys 				    &tokencred);
9083089Swyllys 				if (kmfrv != KMF_OK)
9093089Swyllys 					break;
9103089Swyllys 			}
9113089Swyllys 			if (oclass & PK_CERT_OBJ) {
9123089Swyllys 				kmfrv = delete_nss_certs(kmfhandle,
9135051Swyllys 				    dir, prefix, token_spec,
9145051Swyllys 				    (char  *)object_label,
9155051Swyllys 				    &serial, issuer, subject,
9165051Swyllys 				    find_criteria_flag);
9173089Swyllys 				if (kmfrv != KMF_OK)
9183089Swyllys 					break;
9193089Swyllys 			}
9203089Swyllys 			if (oclass & PK_CRL_OBJ)
9213089Swyllys 				kmfrv = delete_nss_crl(kmfhandle,
9225051Swyllys 				    dir, prefix, token_spec,
9235051Swyllys 				    (char  *)object_label, subject);
9243089Swyllys 			break;
9253089Swyllys 		case KMF_KEYSTORE_OPENSSL:
9263089Swyllys 			if (oclass & PK_KEY_OBJ) {
9273089Swyllys 				kmfrv = delete_file_keys(kmfhandle, oclass,
9285051Swyllys 				    dir, infile);
9293089Swyllys 				if (kmfrv != KMF_OK)
9303089Swyllys 					break;
9313089Swyllys 			}
9323089Swyllys 			if (oclass & (PK_CERT_OBJ)) {
9333089Swyllys 				kmfrv = delete_file_certs(kmfhandle,
9345051Swyllys 				    dir, infile, &serial, issuer,
9355051Swyllys 				    subject, find_criteria_flag);
9363089Swyllys 				if (kmfrv != KMF_OK)
9373089Swyllys 					break;
9383089Swyllys 			}
9393089Swyllys 			if (oclass & PK_CRL_OBJ)
9403089Swyllys 				kmfrv = delete_file_crl(kmfhandle,
9416669Swyllys 				    infile);
9423089Swyllys 			break;
9433089Swyllys 		default:
9443089Swyllys 			rv = PK_ERR_USAGE;
9453089Swyllys 			break;
94617Sdinak 	}
94717Sdinak 
9483089Swyllys 	if (kmfrv != KMF_OK) {
9493089Swyllys 		display_error(kmfhandle, kmfrv,
9505051Swyllys 		    gettext("Error deleting objects"));
95117Sdinak 	}
95217Sdinak 
9533089Swyllys 	if (serial.val != NULL)
9543089Swyllys 		free(serial.val);
9555051Swyllys 	(void) kmf_finalize(kmfhandle);
9563089Swyllys 	return (kmfrv);
95717Sdinak }
958