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 /* 22*3408Swyllys * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 2317Sdinak * Use is subject to license terms. 2417Sdinak */ 2517Sdinak 2617Sdinak #pragma ident "%Z%%M% %I% %E% SMI" 2717Sdinak 2817Sdinak /* 2917Sdinak * This file implements the token object delete operation for this tool. 3017Sdinak * It loads the PKCS#11 modules, finds the object to delete, deletes it, 3117Sdinak * and cleans up. User must be R/W logged into the token. 3217Sdinak */ 3317Sdinak 3417Sdinak #include <stdio.h> 3517Sdinak #include <string.h> 3617Sdinak #include <cryptoutil.h> 3717Sdinak #include <security/cryptoki.h> 3817Sdinak #include "common.h" 393089Swyllys #include <kmfapi.h> 403089Swyllys 413089Swyllys static KMF_RETURN 423089Swyllys pk_destroy_keys(void *handle, KMF_KEY_HANDLE *keys, 433089Swyllys KMF_FINDKEY_PARAMS *fkparams, uint32_t numkeys) 443089Swyllys { 453089Swyllys int i; 463089Swyllys KMF_RETURN rv = KMF_OK; 473089Swyllys KMF_DELETEKEY_PARAMS dkparams; 483089Swyllys 493089Swyllys (void) memset(&dkparams, 0, sizeof (dkparams)); 503089Swyllys dkparams.kstype = fkparams->kstype; 513089Swyllys 523089Swyllys switch (fkparams->kstype) { 533089Swyllys case KMF_KEYSTORE_NSS: 543089Swyllys dkparams.nssparms = fkparams->nssparms; 553089Swyllys dkparams.cred = fkparams->cred; 563089Swyllys break; 573089Swyllys case KMF_KEYSTORE_OPENSSL: 583089Swyllys break; 593089Swyllys case KMF_KEYSTORE_PK11TOKEN: 603089Swyllys dkparams.cred = fkparams->cred; 613089Swyllys break; 623089Swyllys default: 633089Swyllys return (PK_ERR_USAGE); 643089Swyllys } 653089Swyllys 663089Swyllys for (i = 0; rv == KMF_OK && i < numkeys; i++) { 673089Swyllys rv = KMF_DeleteKeyFromKeystore(handle, &dkparams, &keys[i]); 683089Swyllys } 693089Swyllys return (rv); 703089Swyllys } 713089Swyllys 723089Swyllys static KMF_RETURN 733089Swyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc, 743089Swyllys int *keysdeleted) 753089Swyllys { 763089Swyllys KMF_RETURN rv = KMF_OK; 773089Swyllys uint32_t numkeys = 0; 783089Swyllys 793089Swyllys *keysdeleted = 0; 803089Swyllys numkeys = 0; 813089Swyllys rv = KMF_FindKey(kmfhandle, parms, NULL, &numkeys); 823089Swyllys if (rv == KMF_OK && numkeys > 0) { 833089Swyllys KMF_KEY_HANDLE *keys = NULL; 843089Swyllys char prompt[1024]; 853089Swyllys 863089Swyllys (void) snprintf(prompt, sizeof (prompt), 873089Swyllys gettext("%d %s key(s) found, do you want " 883089Swyllys "to delete them (y/N) ?"), numkeys, 893089Swyllys (desc != NULL ? desc : "")); 903089Swyllys 913089Swyllys if (!yesno(prompt, 923089Swyllys gettext("Respond with yes or no.\n"), 933089Swyllys B_FALSE)) { 943089Swyllys return (KMF_OK); 953089Swyllys } 963089Swyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 973089Swyllys sizeof (KMF_KEY_HANDLE)); 983089Swyllys if (keys == NULL) 993089Swyllys return (KMF_ERR_MEMORY); 1003089Swyllys (void) memset(keys, 0, numkeys * 1013089Swyllys sizeof (KMF_KEY_HANDLE)); 1023089Swyllys 1033089Swyllys rv = KMF_FindKey(kmfhandle, parms, keys, &numkeys); 1043089Swyllys if (rv == KMF_OK) { 1053089Swyllys rv = pk_destroy_keys(kmfhandle, keys, 1063089Swyllys parms, numkeys); 1073089Swyllys } 1083089Swyllys 1093089Swyllys free(keys); 1103089Swyllys } 1113089Swyllys 1123089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) { 1133089Swyllys rv = KMF_OK; 1143089Swyllys } 1153089Swyllys 1163089Swyllys *keysdeleted = numkeys; 1173089Swyllys return (rv); 1183089Swyllys } 1193089Swyllys 1203089Swyllys static KMF_RETURN 1213089Swyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *fcparms, 1223089Swyllys KMF_DELETECERT_PARAMS *dcparms) 1233089Swyllys { 1243089Swyllys KMF_RETURN rv = KMF_OK; 1253089Swyllys uint32_t numcerts = 0; 1263089Swyllys 1273089Swyllys rv = KMF_FindCert(kmfhandle, fcparms, NULL, &numcerts); 1283089Swyllys if (rv == KMF_OK && numcerts > 0) { 1293089Swyllys char prompt[1024]; 1303089Swyllys (void) snprintf(prompt, sizeof (prompt), 1313089Swyllys gettext("%d certificate(s) found, do you want " 1323089Swyllys "to delete them (y/N) ?"), numcerts); 1333089Swyllys 1343089Swyllys if (!yesno(prompt, 1353089Swyllys gettext("Respond with yes or no.\n"), 1363089Swyllys B_FALSE)) { 1373089Swyllys return (KMF_OK); 1383089Swyllys } 1393089Swyllys 1403089Swyllys rv = KMF_DeleteCertFromKeystore(kmfhandle, dcparms); 1413089Swyllys 1423089Swyllys } else if (rv == KMF_ERR_CERT_NOT_FOUND) { 1433089Swyllys rv = KMF_OK; 1443089Swyllys } 1453089Swyllys 1463089Swyllys return (rv); 1473089Swyllys } 1483089Swyllys 1493089Swyllys static KMF_RETURN 1503089Swyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix, 1513089Swyllys char *token, int oclass, char *objlabel, 1523089Swyllys KMF_CREDENTIAL *tokencred) 1533089Swyllys { 1543089Swyllys KMF_RETURN rv = KMF_OK; 1553089Swyllys KMF_FINDKEY_PARAMS parms; 1563089Swyllys char *keytype = NULL; 1573089Swyllys int nk, numkeys = 0; 1583089Swyllys 1593089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 1603089Swyllys if (rv != KMF_OK) 1613089Swyllys return (rv); 1623089Swyllys 1633089Swyllys (void) memset(&parms, 0, sizeof (parms)); 1643089Swyllys parms.kstype = KMF_KEYSTORE_NSS; 1653089Swyllys parms.findLabel = objlabel; 1663089Swyllys parms.cred = *tokencred; 1673089Swyllys parms.nssparms.slotlabel = token; 1683089Swyllys 1693089Swyllys if (oclass & PK_PRIKEY_OBJ) { 1703089Swyllys parms.keyclass = KMF_ASYM_PRI; 1713089Swyllys keytype = "private"; 1723089Swyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 1733089Swyllys numkeys += nk; 1743089Swyllys } 1753089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 1763089Swyllys parms.keyclass = KMF_SYMMETRIC; 1773089Swyllys keytype = "symmetric"; 1783089Swyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 1793089Swyllys numkeys += nk; 1803089Swyllys } 1813089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 1823089Swyllys parms.keyclass = KMF_ASYM_PUB; 1833089Swyllys keytype = "public"; 1843089Swyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 1853089Swyllys numkeys += nk; 1863089Swyllys } 1873089Swyllys if (rv == KMF_OK && numkeys == 0) 1883089Swyllys rv = KMF_ERR_KEY_NOT_FOUND; 1893089Swyllys 1903089Swyllys return (rv); 1913089Swyllys } 1923089Swyllys 1933089Swyllys 1943089Swyllys static KMF_RETURN 1953089Swyllys delete_nss_certs(KMF_HANDLE_T kmfhandle, 1963089Swyllys char *dir, char *prefix, 1973089Swyllys char *token, char *objlabel, 1983089Swyllys KMF_BIGINT *serno, char *issuer, char *subject, 1993089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 2003089Swyllys { 2013089Swyllys KMF_RETURN rv = KMF_OK; 2023089Swyllys KMF_DELETECERT_PARAMS dcparms; 2033089Swyllys KMF_FINDCERT_PARAMS fcargs; 2043089Swyllys 2053089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 2063089Swyllys if (rv != KMF_OK) 2073089Swyllys return (rv); 2083089Swyllys 2093089Swyllys (void) memset(&dcparms, 0, sizeof (dcparms)); 2103089Swyllys dcparms.kstype = KMF_KEYSTORE_NSS; 2113089Swyllys dcparms.certLabel = objlabel; 2123089Swyllys dcparms.issuer = issuer; 2133089Swyllys dcparms.subject = subject; 2143089Swyllys dcparms.serial = serno; 2153089Swyllys dcparms.find_cert_validity = find_criteria_flag; 2163089Swyllys dcparms.nssparms.slotlabel = token; 2173089Swyllys 2183089Swyllys (void) memset(&fcargs, 0, sizeof (fcargs)); 2193089Swyllys fcargs.kstype = KMF_KEYSTORE_NSS; 2203089Swyllys fcargs.certLabel = objlabel; 2213089Swyllys fcargs.issuer = issuer; 2223089Swyllys fcargs.subject = subject; 2233089Swyllys fcargs.serial = serno; 2243089Swyllys fcargs.find_cert_validity = find_criteria_flag; 2253089Swyllys fcargs.nssparms.slotlabel = token; 2263089Swyllys 2273089Swyllys rv = pk_delete_certs(kmfhandle, &fcargs, &dcparms); 2283089Swyllys 2293089Swyllys return (rv); 2303089Swyllys } 2313089Swyllys 2323089Swyllys static KMF_RETURN 2333089Swyllys delete_nss_crl(void *kmfhandle, 2343089Swyllys char *dir, char *prefix, char *token, 2353089Swyllys char *issuernickname, char *subject) 2363089Swyllys { 2373089Swyllys KMF_RETURN rv = KMF_OK; 2383089Swyllys KMF_DELETECRL_PARAMS dcrlparms; 2393089Swyllys 2403089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 2413089Swyllys if (rv != KMF_OK) 2423089Swyllys return (rv); 2433089Swyllys 2443089Swyllys (void) memset(&dcrlparms, 0, sizeof (dcrlparms)); 2453089Swyllys 2463089Swyllys dcrlparms.kstype = KMF_KEYSTORE_NSS; 2473089Swyllys dcrlparms.nssparms.slotlabel = token; 2483089Swyllys dcrlparms.nssparms.crl_issuerName = issuernickname; 2493089Swyllys dcrlparms.nssparms.crl_subjName = subject; 2503089Swyllys 2513089Swyllys rv = KMF_DeleteCRL(kmfhandle, &dcrlparms); 2523089Swyllys 2533089Swyllys return (rv); 2543089Swyllys } 2553089Swyllys 2563089Swyllys static KMF_RETURN 2573089Swyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle, 2583089Swyllys char *token, int oclass, char *objlabel, 2593089Swyllys KMF_CREDENTIAL *tokencred) 2603089Swyllys { 2613089Swyllys KMF_RETURN rv = KMF_OK; 2623089Swyllys KMF_FINDKEY_PARAMS parms; 2633089Swyllys int nk, numkeys = 0; 2643089Swyllys 2653089Swyllys /* 2663089Swyllys * Symmetric keys and RSA/DSA private keys are always 2673089Swyllys * created with the "CKA_PRIVATE" field == TRUE, so 2683089Swyllys * make sure we search for them with it also set. 2693089Swyllys */ 2703089Swyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 2713089Swyllys oclass |= PK_PRIVATE_OBJ; 2723089Swyllys 2733089Swyllys rv = select_token(kmfhandle, token, FALSE); 2743089Swyllys if (rv != KMF_OK) { 2753089Swyllys return (rv); 2763089Swyllys } 2773089Swyllys 2783089Swyllys (void) memset(&parms, 0, sizeof (parms)); 2793089Swyllys parms.kstype = KMF_KEYSTORE_PK11TOKEN; 2803089Swyllys parms.findLabel = (char *)objlabel; 2813089Swyllys parms.keytype = 0; 2823089Swyllys parms.pkcs11parms.private = ((oclass & PK_PRIVATE_OBJ) > 0); 283*3408Swyllys parms.pkcs11parms.token = 1; 2843089Swyllys parms.cred.cred = tokencred->cred; 2853089Swyllys parms.cred.credlen = tokencred->credlen; 2863089Swyllys 2873089Swyllys if (oclass & PK_PRIKEY_OBJ) { 2883089Swyllys parms.keyclass = KMF_ASYM_PRI; 2893089Swyllys rv = pk_delete_keys(kmfhandle, &parms, "private", &nk); 2903089Swyllys numkeys += nk; 2913089Swyllys } 2923089Swyllys 2933089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 2943089Swyllys parms.keyclass = KMF_SYMMETRIC; 2953089Swyllys rv = pk_delete_keys(kmfhandle, &parms, "symmetric", &nk); 2963089Swyllys numkeys += nk; 2973089Swyllys } 2983089Swyllys 2993089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 3003089Swyllys parms.keyclass = KMF_ASYM_PUB; 3013089Swyllys rv = pk_delete_keys(kmfhandle, &parms, "public", &nk); 3023089Swyllys numkeys += nk; 3033089Swyllys } 3043089Swyllys if (rv == KMF_OK && numkeys == 0) 3053089Swyllys rv = KMF_ERR_KEY_NOT_FOUND; 3063089Swyllys 3073089Swyllys return (rv); 3083089Swyllys } 3093089Swyllys 3103089Swyllys static KMF_RETURN 3113089Swyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle, 3123089Swyllys char *token, char *objlabel, 3133089Swyllys KMF_BIGINT *serno, char *issuer, char *subject, 3143089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 3153089Swyllys { 3163089Swyllys KMF_RETURN kmfrv; 3173089Swyllys KMF_DELETECERT_PARAMS dparms; 3183089Swyllys KMF_FINDCERT_PARAMS fcargs; 3193089Swyllys 3203089Swyllys kmfrv = select_token(kmfhandle, token, FALSE); 3213089Swyllys 3223089Swyllys if (kmfrv != KMF_OK) { 3233089Swyllys return (kmfrv); 3243089Swyllys } 3253089Swyllys 3263089Swyllys (void) memset(&dparms, 0, sizeof (dparms)); 3273089Swyllys dparms.kstype = KMF_KEYSTORE_PK11TOKEN; 3283089Swyllys dparms.certLabel = objlabel; 3293089Swyllys dparms.issuer = issuer; 3303089Swyllys dparms.subject = subject; 3313089Swyllys dparms.serial = serno; 3323089Swyllys dparms.find_cert_validity = find_criteria_flag; 3333089Swyllys 3343089Swyllys fcargs = dparms; 3353089Swyllys kmfrv = pk_delete_certs(kmfhandle, &fcargs, &dparms); 3363089Swyllys 3373089Swyllys return (kmfrv); 3383089Swyllys } 3393089Swyllys 3403089Swyllys static KMF_RETURN 3413089Swyllys delete_file_certs(KMF_HANDLE_T kmfhandle, 3423089Swyllys char *dir, char *filename, KMF_BIGINT *serial, char *issuer, 3433089Swyllys char *subject, KMF_CERT_VALIDITY find_criteria_flag) 3443089Swyllys { 3453089Swyllys KMF_RETURN rv; 3463089Swyllys KMF_DELETECERT_PARAMS dparms; 3473089Swyllys KMF_FINDCERT_PARAMS fcargs; 3483089Swyllys 3493089Swyllys (void *)memset(&dparms, 0, sizeof (dparms)); 3503089Swyllys (void *)memset(&fcargs, 0, sizeof (fcargs)); 3513089Swyllys fcargs.kstype = KMF_KEYSTORE_OPENSSL; 3523089Swyllys fcargs.certLabel = NULL; 3533089Swyllys fcargs.issuer = issuer; 3543089Swyllys fcargs.subject = subject; 3553089Swyllys fcargs.serial = serial; 3563089Swyllys fcargs.sslparms.dirpath = dir; 3573089Swyllys fcargs.sslparms.certfile = filename; 3583089Swyllys fcargs.find_cert_validity = find_criteria_flag; 3593089Swyllys 3603089Swyllys /* For now, delete parameters and find parameters are the same */ 3613089Swyllys dparms = fcargs; 3623089Swyllys 3633089Swyllys rv = pk_delete_certs(kmfhandle, &fcargs, &dparms); 3643089Swyllys 3653089Swyllys return (rv); 3663089Swyllys } 3673089Swyllys 3683089Swyllys static KMF_RETURN 3693089Swyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass, 3703089Swyllys char *dir, char *infile) 3713089Swyllys { 3723089Swyllys KMF_RETURN rv = KMF_OK; 3733089Swyllys KMF_FINDKEY_PARAMS parms; 3743089Swyllys char *keytype = ""; 3753089Swyllys int nk, numkeys = 0; 3763089Swyllys 3773089Swyllys (void) memset(&parms, 0, sizeof (parms)); 3783089Swyllys parms.kstype = KMF_KEYSTORE_OPENSSL; 3793089Swyllys parms.sslparms.dirpath = dir; 3803089Swyllys parms.sslparms.keyfile = infile; 3813089Swyllys 3823089Swyllys if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) { 3833089Swyllys parms.keyclass = KMF_ASYM_PRI; 3843089Swyllys keytype = "Asymmetric"; 3853089Swyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 3863089Swyllys numkeys += nk; 3873089Swyllys } 3883089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 3893089Swyllys parms.keyclass = KMF_SYMMETRIC; 3903089Swyllys keytype = "symmetric"; 3913089Swyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 3923089Swyllys numkeys += nk; 3933089Swyllys } 3943089Swyllys if (rv == KMF_OK && numkeys == 0) 3953089Swyllys rv = KMF_ERR_KEY_NOT_FOUND; 3963089Swyllys 3973089Swyllys return (rv); 3983089Swyllys } 3993089Swyllys 4003089Swyllys static KMF_RETURN 4013089Swyllys delete_file_crl(void *kmfhandle, char *dir, char *filename) 4023089Swyllys { 4033089Swyllys KMF_RETURN rv; 4043089Swyllys KMF_DELETECRL_PARAMS dcrlparms; 4053089Swyllys 4063089Swyllys (void) memset(&dcrlparms, 0, sizeof (dcrlparms)); 4073089Swyllys 4083089Swyllys dcrlparms.kstype = KMF_KEYSTORE_OPENSSL; 4093089Swyllys dcrlparms.sslparms.dirpath = dir; 4103089Swyllys dcrlparms.sslparms.crlfile = filename; 4113089Swyllys 4123089Swyllys rv = KMF_DeleteCRL(kmfhandle, &dcrlparms); 4133089Swyllys 4143089Swyllys return (rv); 4153089Swyllys } 41617Sdinak 41717Sdinak /* 41817Sdinak * Delete token objects. 41917Sdinak */ 42017Sdinak int 42117Sdinak pk_delete(int argc, char *argv[]) 42217Sdinak { 42317Sdinak int opt; 424864Sdinak extern int optind_av; 425864Sdinak extern char *optarg_av; 426864Sdinak char *token_spec = NULL; 4273089Swyllys char *subject = NULL; 4283089Swyllys char *issuer = NULL; 4293089Swyllys char *dir = NULL; 4303089Swyllys char *prefix = NULL; 4313089Swyllys char *infile = NULL; 4323089Swyllys char *object_label = NULL; 4333089Swyllys char *serstr = NULL; 43417Sdinak 4353089Swyllys int oclass = 0; 4363089Swyllys KMF_BIGINT serial = { NULL, 0 }; 4373089Swyllys KMF_HANDLE_T kmfhandle = NULL; 4383089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 4393089Swyllys KMF_RETURN kmfrv; 4403089Swyllys int rv = 0; 4413089Swyllys char *find_criteria = NULL; 4423089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 4433089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 44417Sdinak 44517Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 446864Sdinak while ((opt = getopt_av(argc, argv, 4473089Swyllys "T:(token)y:(objtype)l:(label)" 4483089Swyllys "k:(keystore)s:(subject)n:(nickname)" 4493089Swyllys "d:(dir)p:(prefix)S:(serial)i:(issuer)" 4503089Swyllys "c:(criteria)" 4513089Swyllys "f:(infile)")) != EOF) { 4523089Swyllys 4533089Swyllys if (EMPTYSTRING(optarg_av)) 4543089Swyllys return (PK_ERR_USAGE); 45517Sdinak switch (opt) { 456864Sdinak case 'T': /* token specifier */ 457864Sdinak if (token_spec) 458864Sdinak return (PK_ERR_USAGE); 459864Sdinak token_spec = optarg_av; 46017Sdinak break; 461864Sdinak case 'y': /* object type: public, private, both */ 4623089Swyllys if (oclass) 463864Sdinak return (PK_ERR_USAGE); 4643089Swyllys oclass = OT2Int(optarg_av); 4653089Swyllys if (oclass == -1) 4663089Swyllys return (PK_ERR_USAGE); 46717Sdinak break; 46817Sdinak case 'l': /* objects with specific label */ 4693089Swyllys case 'n': 47017Sdinak if (object_label) 47117Sdinak return (PK_ERR_USAGE); 4723089Swyllys object_label = (char *)optarg_av; 4733089Swyllys break; 4743089Swyllys case 'k': 4753089Swyllys kstype = KS2Int(optarg_av); 4763089Swyllys if (kstype == 0) 4773089Swyllys return (PK_ERR_USAGE); 4783089Swyllys break; 4793089Swyllys case 's': 4803089Swyllys subject = optarg_av; 4813089Swyllys break; 4823089Swyllys case 'i': 4833089Swyllys issuer = optarg_av; 4843089Swyllys break; 4853089Swyllys case 'd': 4863089Swyllys dir = optarg_av; 4873089Swyllys break; 4883089Swyllys case 'p': 4893089Swyllys prefix = optarg_av; 4903089Swyllys break; 4913089Swyllys case 'S': 4923089Swyllys serstr = optarg_av; 4933089Swyllys break; 4943089Swyllys case 'f': 4953089Swyllys infile = optarg_av; 4963089Swyllys break; 4973089Swyllys case 'c': 4983089Swyllys find_criteria = optarg_av; 4993089Swyllys if (!strcasecmp(find_criteria, "valid")) 5003089Swyllys find_criteria_flag = 5013089Swyllys KMF_NONEXPIRED_CERTS; 5023089Swyllys else if (!strcasecmp(find_criteria, "expired")) 5033089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS; 5043089Swyllys else if (!strcasecmp(find_criteria, "both")) 5053089Swyllys find_criteria_flag = KMF_ALL_CERTS; 5063089Swyllys else 5073089Swyllys return (PK_ERR_USAGE); 50817Sdinak break; 50917Sdinak default: 51017Sdinak return (PK_ERR_USAGE); 51117Sdinak break; 51217Sdinak } 51317Sdinak } 51417Sdinak 5153089Swyllys /* Assume keystore = PKCS#11 if not specified */ 5163089Swyllys if (kstype == 0) 5173089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 5183089Swyllys 5193089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 5203089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 5213089Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 5223089Swyllys 5233089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 5243089Swyllys "is only relevant if keystore=pkcs11\n")); 5253089Swyllys return (PK_ERR_USAGE); 526864Sdinak } 527864Sdinak 5283089Swyllys /* If no object class specified, delete everything but CRLs */ 5293089Swyllys if (oclass == 0) 5303089Swyllys oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ | 5313089Swyllys PK_SYMKEY_OBJ; 53217Sdinak 53317Sdinak /* No additional args allowed. */ 534864Sdinak argc -= optind_av; 535864Sdinak argv += optind_av; 53617Sdinak if (argc) 53717Sdinak return (PK_ERR_USAGE); 53817Sdinak /* Done parsing command line options. */ 53917Sdinak 5403089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) { 5413089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 5423089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) { 5433089Swyllys token_spec = DEFAULT_NSS_TOKEN; 54417Sdinak } 54517Sdinak 5463089Swyllys if (serstr != NULL) { 5473089Swyllys uchar_t *bytes = NULL; 5483089Swyllys size_t bytelen; 5493089Swyllys 5503089Swyllys rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen); 5513089Swyllys if (rv != KMF_OK || bytes == NULL) { 5523089Swyllys (void) fprintf(stderr, gettext("serial number " 5533089Swyllys "must be specified as a hex number " 5543089Swyllys "(ex: 0x0102030405ffeeddee)\n")); 5553089Swyllys return (PK_ERR_USAGE); 5563089Swyllys } 5573089Swyllys serial.val = bytes; 5583089Swyllys serial.len = bytelen; 55917Sdinak } 56017Sdinak 5613089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 5623089Swyllys kstype == KMF_KEYSTORE_NSS) && 5633089Swyllys (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) { 56417Sdinak 5653089Swyllys (void) get_token_password(kstype, token_spec, 5663089Swyllys &tokencred); 56717Sdinak } 56817Sdinak 5693089Swyllys if ((kmfrv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) 5703089Swyllys return (kmfrv); 5713089Swyllys 5723089Swyllys switch (kstype) { 5733089Swyllys case KMF_KEYSTORE_PK11TOKEN: 5743089Swyllys if (oclass & PK_KEY_OBJ) { 5753089Swyllys kmfrv = delete_pk11_keys(kmfhandle, 5763089Swyllys token_spec, oclass, 5773089Swyllys object_label, 5783089Swyllys &tokencred); 5793089Swyllys /* 5803089Swyllys * If deleting groups of objects, it is OK 5813089Swyllys * to ignore the "key not found" case so that 5823089Swyllys * we can continue to find other objects. 5833089Swyllys */ 5843089Swyllys if (kmfrv == KMF_ERR_KEY_NOT_FOUND && 5853089Swyllys (oclass != PK_KEY_OBJ)) 5863089Swyllys kmfrv = KMF_OK; 5873089Swyllys if (kmfrv != KMF_OK) 5883089Swyllys break; 5893089Swyllys } 5903089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 5913089Swyllys kmfrv = delete_pk11_certs(kmfhandle, 5923089Swyllys token_spec, 5933089Swyllys object_label, 5943089Swyllys &serial, issuer, 5953089Swyllys subject, find_criteria_flag); 5963089Swyllys /* 5973089Swyllys * If cert delete failed, but we are looking at 5983089Swyllys * other objects, then it is OK. 5993089Swyllys */ 6003089Swyllys if (kmfrv == KMF_ERR_CERT_NOT_FOUND && 6013089Swyllys (oclass & (PK_CRL_OBJ | PK_KEY_OBJ))) 6023089Swyllys kmfrv = KMF_OK; 6033089Swyllys if (kmfrv != KMF_OK) 6043089Swyllys break; 6053089Swyllys } 6063089Swyllys if (oclass & PK_CRL_OBJ) 6073089Swyllys kmfrv = delete_file_crl(kmfhandle, 6083089Swyllys dir, infile); 6093089Swyllys break; 6103089Swyllys case KMF_KEYSTORE_NSS: 6113089Swyllys if (oclass & PK_KEY_OBJ) { 6123089Swyllys kmfrv = delete_nss_keys(kmfhandle, 6133089Swyllys dir, prefix, token_spec, 6143089Swyllys oclass, (char *)object_label, 6153089Swyllys &tokencred); 6163089Swyllys if (kmfrv != KMF_OK) 6173089Swyllys break; 6183089Swyllys } 6193089Swyllys if (oclass & PK_CERT_OBJ) { 6203089Swyllys kmfrv = delete_nss_certs(kmfhandle, 6213089Swyllys dir, prefix, token_spec, 6223089Swyllys (char *)object_label, 6233089Swyllys &serial, issuer, subject, 6243089Swyllys find_criteria_flag); 6253089Swyllys if (kmfrv != KMF_OK) 6263089Swyllys break; 6273089Swyllys } 6283089Swyllys if (oclass & PK_CRL_OBJ) 6293089Swyllys kmfrv = delete_nss_crl(kmfhandle, 6303089Swyllys dir, prefix, token_spec, 6313089Swyllys (char *)object_label, subject); 6323089Swyllys break; 6333089Swyllys case KMF_KEYSTORE_OPENSSL: 6343089Swyllys if (oclass & PK_KEY_OBJ) { 6353089Swyllys kmfrv = delete_file_keys(kmfhandle, oclass, 6363089Swyllys dir, infile); 6373089Swyllys if (kmfrv != KMF_OK) 6383089Swyllys break; 6393089Swyllys } 6403089Swyllys if (oclass & (PK_CERT_OBJ)) { 6413089Swyllys kmfrv = delete_file_certs(kmfhandle, 6423089Swyllys dir, infile, &serial, issuer, 6433089Swyllys subject, find_criteria_flag); 6443089Swyllys if (kmfrv != KMF_OK) 6453089Swyllys break; 6463089Swyllys } 6473089Swyllys if (oclass & PK_CRL_OBJ) 6483089Swyllys kmfrv = delete_file_crl(kmfhandle, 6493089Swyllys dir, infile); 6503089Swyllys break; 6513089Swyllys default: 6523089Swyllys rv = PK_ERR_USAGE; 6533089Swyllys break; 65417Sdinak } 65517Sdinak 6563089Swyllys if (kmfrv != KMF_OK) { 6573089Swyllys display_error(kmfhandle, kmfrv, 6583089Swyllys gettext("Error deleting objects")); 65917Sdinak } 66017Sdinak 6613089Swyllys if (serial.val != NULL) 6623089Swyllys free(serial.val); 6633089Swyllys (void) KMF_Finalize(kmfhandle); 6643089Swyllys return (kmfrv); 66517Sdinak } 666