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