17711facfSdinak /* 27711facfSdinak * CDDL HEADER START 37711facfSdinak * 47711facfSdinak * The contents of this file are subject to the terms of the 5*99ebb4caSwyllys * Common Development and Distribution License (the "License"). 6*99ebb4caSwyllys * You may not use this file except in compliance with the License. 77711facfSdinak * 87711facfSdinak * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97711facfSdinak * or http://www.opensolaris.org/os/licensing. 107711facfSdinak * See the License for the specific language governing permissions 117711facfSdinak * and limitations under the License. 127711facfSdinak * 137711facfSdinak * When distributing Covered Code, include this CDDL HEADER in each 147711facfSdinak * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157711facfSdinak * If applicable, add the following below this CDDL HEADER, with the 167711facfSdinak * fields enclosed by brackets "[]" replaced with your own identifying 177711facfSdinak * information: Portions Copyright [yyyy] [name of copyright owner] 187711facfSdinak * 197711facfSdinak * CDDL HEADER END 207711facfSdinak */ 217711facfSdinak /* 22*99ebb4caSwyllys * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 237711facfSdinak * Use is subject to license terms. 247711facfSdinak */ 257711facfSdinak 267711facfSdinak #pragma ident "%Z%%M% %I% %E% SMI" 277711facfSdinak 287711facfSdinak /* 297711facfSdinak * This file implements the token object delete operation for this tool. 307711facfSdinak * It loads the PKCS#11 modules, finds the object to delete, deletes it, 317711facfSdinak * and cleans up. User must be R/W logged into the token. 327711facfSdinak */ 337711facfSdinak 347711facfSdinak #include <stdio.h> 357711facfSdinak #include <string.h> 367711facfSdinak #include <cryptoutil.h> 377711facfSdinak #include <security/cryptoki.h> 387711facfSdinak #include "common.h" 39*99ebb4caSwyllys #include <kmfapi.h> 40*99ebb4caSwyllys 41*99ebb4caSwyllys static KMF_RETURN 42*99ebb4caSwyllys pk_destroy_keys(void *handle, KMF_KEY_HANDLE *keys, 43*99ebb4caSwyllys KMF_FINDKEY_PARAMS *fkparams, uint32_t numkeys) 44*99ebb4caSwyllys { 45*99ebb4caSwyllys int i; 46*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 47*99ebb4caSwyllys KMF_DELETEKEY_PARAMS dkparams; 48*99ebb4caSwyllys 49*99ebb4caSwyllys (void) memset(&dkparams, 0, sizeof (dkparams)); 50*99ebb4caSwyllys dkparams.kstype = fkparams->kstype; 51*99ebb4caSwyllys 52*99ebb4caSwyllys switch (fkparams->kstype) { 53*99ebb4caSwyllys case KMF_KEYSTORE_NSS: 54*99ebb4caSwyllys dkparams.nssparms = fkparams->nssparms; 55*99ebb4caSwyllys dkparams.cred = fkparams->cred; 56*99ebb4caSwyllys break; 57*99ebb4caSwyllys case KMF_KEYSTORE_OPENSSL: 58*99ebb4caSwyllys break; 59*99ebb4caSwyllys case KMF_KEYSTORE_PK11TOKEN: 60*99ebb4caSwyllys dkparams.cred = fkparams->cred; 61*99ebb4caSwyllys break; 62*99ebb4caSwyllys default: 63*99ebb4caSwyllys return (PK_ERR_USAGE); 64*99ebb4caSwyllys } 65*99ebb4caSwyllys 66*99ebb4caSwyllys for (i = 0; rv == KMF_OK && i < numkeys; i++) { 67*99ebb4caSwyllys rv = KMF_DeleteKeyFromKeystore(handle, &dkparams, &keys[i]); 68*99ebb4caSwyllys } 69*99ebb4caSwyllys return (rv); 70*99ebb4caSwyllys } 71*99ebb4caSwyllys 72*99ebb4caSwyllys static KMF_RETURN 73*99ebb4caSwyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc, 74*99ebb4caSwyllys int *keysdeleted) 75*99ebb4caSwyllys { 76*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 77*99ebb4caSwyllys uint32_t numkeys = 0; 78*99ebb4caSwyllys 79*99ebb4caSwyllys *keysdeleted = 0; 80*99ebb4caSwyllys numkeys = 0; 81*99ebb4caSwyllys rv = KMF_FindKey(kmfhandle, parms, NULL, &numkeys); 82*99ebb4caSwyllys if (rv == KMF_OK && numkeys > 0) { 83*99ebb4caSwyllys KMF_KEY_HANDLE *keys = NULL; 84*99ebb4caSwyllys char prompt[1024]; 85*99ebb4caSwyllys 86*99ebb4caSwyllys (void) snprintf(prompt, sizeof (prompt), 87*99ebb4caSwyllys gettext("%d %s key(s) found, do you want " 88*99ebb4caSwyllys "to delete them (y/N) ?"), numkeys, 89*99ebb4caSwyllys (desc != NULL ? desc : "")); 90*99ebb4caSwyllys 91*99ebb4caSwyllys if (!yesno(prompt, 92*99ebb4caSwyllys gettext("Respond with yes or no.\n"), 93*99ebb4caSwyllys B_FALSE)) { 94*99ebb4caSwyllys return (KMF_OK); 95*99ebb4caSwyllys } 96*99ebb4caSwyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 97*99ebb4caSwyllys sizeof (KMF_KEY_HANDLE)); 98*99ebb4caSwyllys if (keys == NULL) 99*99ebb4caSwyllys return (KMF_ERR_MEMORY); 100*99ebb4caSwyllys (void) memset(keys, 0, numkeys * 101*99ebb4caSwyllys sizeof (KMF_KEY_HANDLE)); 102*99ebb4caSwyllys 103*99ebb4caSwyllys rv = KMF_FindKey(kmfhandle, parms, keys, &numkeys); 104*99ebb4caSwyllys if (rv == KMF_OK) { 105*99ebb4caSwyllys rv = pk_destroy_keys(kmfhandle, keys, 106*99ebb4caSwyllys parms, numkeys); 107*99ebb4caSwyllys } 108*99ebb4caSwyllys 109*99ebb4caSwyllys free(keys); 110*99ebb4caSwyllys } 111*99ebb4caSwyllys 112*99ebb4caSwyllys if (rv == KMF_ERR_KEY_NOT_FOUND) { 113*99ebb4caSwyllys rv = KMF_OK; 114*99ebb4caSwyllys } 115*99ebb4caSwyllys 116*99ebb4caSwyllys *keysdeleted = numkeys; 117*99ebb4caSwyllys return (rv); 118*99ebb4caSwyllys } 119*99ebb4caSwyllys 120*99ebb4caSwyllys static KMF_RETURN 121*99ebb4caSwyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *fcparms, 122*99ebb4caSwyllys KMF_DELETECERT_PARAMS *dcparms) 123*99ebb4caSwyllys { 124*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 125*99ebb4caSwyllys uint32_t numcerts = 0; 126*99ebb4caSwyllys 127*99ebb4caSwyllys rv = KMF_FindCert(kmfhandle, fcparms, NULL, &numcerts); 128*99ebb4caSwyllys if (rv == KMF_OK && numcerts > 0) { 129*99ebb4caSwyllys char prompt[1024]; 130*99ebb4caSwyllys (void) snprintf(prompt, sizeof (prompt), 131*99ebb4caSwyllys gettext("%d certificate(s) found, do you want " 132*99ebb4caSwyllys "to delete them (y/N) ?"), numcerts); 133*99ebb4caSwyllys 134*99ebb4caSwyllys if (!yesno(prompt, 135*99ebb4caSwyllys gettext("Respond with yes or no.\n"), 136*99ebb4caSwyllys B_FALSE)) { 137*99ebb4caSwyllys return (KMF_OK); 138*99ebb4caSwyllys } 139*99ebb4caSwyllys 140*99ebb4caSwyllys rv = KMF_DeleteCertFromKeystore(kmfhandle, dcparms); 141*99ebb4caSwyllys 142*99ebb4caSwyllys } else if (rv == KMF_ERR_CERT_NOT_FOUND) { 143*99ebb4caSwyllys rv = KMF_OK; 144*99ebb4caSwyllys } 145*99ebb4caSwyllys 146*99ebb4caSwyllys return (rv); 147*99ebb4caSwyllys } 148*99ebb4caSwyllys 149*99ebb4caSwyllys static KMF_RETURN 150*99ebb4caSwyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix, 151*99ebb4caSwyllys char *token, int oclass, char *objlabel, 152*99ebb4caSwyllys KMF_CREDENTIAL *tokencred) 153*99ebb4caSwyllys { 154*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 155*99ebb4caSwyllys KMF_FINDKEY_PARAMS parms; 156*99ebb4caSwyllys char *keytype = NULL; 157*99ebb4caSwyllys int nk, numkeys = 0; 158*99ebb4caSwyllys 159*99ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 160*99ebb4caSwyllys if (rv != KMF_OK) 161*99ebb4caSwyllys return (rv); 162*99ebb4caSwyllys 163*99ebb4caSwyllys (void) memset(&parms, 0, sizeof (parms)); 164*99ebb4caSwyllys parms.kstype = KMF_KEYSTORE_NSS; 165*99ebb4caSwyllys parms.findLabel = objlabel; 166*99ebb4caSwyllys parms.cred = *tokencred; 167*99ebb4caSwyllys parms.nssparms.slotlabel = token; 168*99ebb4caSwyllys 169*99ebb4caSwyllys if (oclass & PK_PRIKEY_OBJ) { 170*99ebb4caSwyllys parms.keyclass = KMF_ASYM_PRI; 171*99ebb4caSwyllys keytype = "private"; 172*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 173*99ebb4caSwyllys numkeys += nk; 174*99ebb4caSwyllys } 175*99ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 176*99ebb4caSwyllys parms.keyclass = KMF_SYMMETRIC; 177*99ebb4caSwyllys keytype = "symmetric"; 178*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 179*99ebb4caSwyllys numkeys += nk; 180*99ebb4caSwyllys } 181*99ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 182*99ebb4caSwyllys parms.keyclass = KMF_ASYM_PUB; 183*99ebb4caSwyllys keytype = "public"; 184*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 185*99ebb4caSwyllys numkeys += nk; 186*99ebb4caSwyllys } 187*99ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 188*99ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 189*99ebb4caSwyllys 190*99ebb4caSwyllys return (rv); 191*99ebb4caSwyllys } 192*99ebb4caSwyllys 193*99ebb4caSwyllys 194*99ebb4caSwyllys static KMF_RETURN 195*99ebb4caSwyllys delete_nss_certs(KMF_HANDLE_T kmfhandle, 196*99ebb4caSwyllys char *dir, char *prefix, 197*99ebb4caSwyllys char *token, char *objlabel, 198*99ebb4caSwyllys KMF_BIGINT *serno, char *issuer, char *subject, 199*99ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag) 200*99ebb4caSwyllys { 201*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 202*99ebb4caSwyllys KMF_DELETECERT_PARAMS dcparms; 203*99ebb4caSwyllys KMF_FINDCERT_PARAMS fcargs; 204*99ebb4caSwyllys 205*99ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 206*99ebb4caSwyllys if (rv != KMF_OK) 207*99ebb4caSwyllys return (rv); 208*99ebb4caSwyllys 209*99ebb4caSwyllys (void) memset(&dcparms, 0, sizeof (dcparms)); 210*99ebb4caSwyllys dcparms.kstype = KMF_KEYSTORE_NSS; 211*99ebb4caSwyllys dcparms.certLabel = objlabel; 212*99ebb4caSwyllys dcparms.issuer = issuer; 213*99ebb4caSwyllys dcparms.subject = subject; 214*99ebb4caSwyllys dcparms.serial = serno; 215*99ebb4caSwyllys dcparms.find_cert_validity = find_criteria_flag; 216*99ebb4caSwyllys dcparms.nssparms.slotlabel = token; 217*99ebb4caSwyllys 218*99ebb4caSwyllys (void) memset(&fcargs, 0, sizeof (fcargs)); 219*99ebb4caSwyllys fcargs.kstype = KMF_KEYSTORE_NSS; 220*99ebb4caSwyllys fcargs.certLabel = objlabel; 221*99ebb4caSwyllys fcargs.issuer = issuer; 222*99ebb4caSwyllys fcargs.subject = subject; 223*99ebb4caSwyllys fcargs.serial = serno; 224*99ebb4caSwyllys fcargs.find_cert_validity = find_criteria_flag; 225*99ebb4caSwyllys fcargs.nssparms.slotlabel = token; 226*99ebb4caSwyllys 227*99ebb4caSwyllys rv = pk_delete_certs(kmfhandle, &fcargs, &dcparms); 228*99ebb4caSwyllys 229*99ebb4caSwyllys return (rv); 230*99ebb4caSwyllys } 231*99ebb4caSwyllys 232*99ebb4caSwyllys static KMF_RETURN 233*99ebb4caSwyllys delete_nss_crl(void *kmfhandle, 234*99ebb4caSwyllys char *dir, char *prefix, char *token, 235*99ebb4caSwyllys char *issuernickname, char *subject) 236*99ebb4caSwyllys { 237*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 238*99ebb4caSwyllys KMF_DELETECRL_PARAMS dcrlparms; 239*99ebb4caSwyllys 240*99ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 241*99ebb4caSwyllys if (rv != KMF_OK) 242*99ebb4caSwyllys return (rv); 243*99ebb4caSwyllys 244*99ebb4caSwyllys (void) memset(&dcrlparms, 0, sizeof (dcrlparms)); 245*99ebb4caSwyllys 246*99ebb4caSwyllys dcrlparms.kstype = KMF_KEYSTORE_NSS; 247*99ebb4caSwyllys dcrlparms.nssparms.slotlabel = token; 248*99ebb4caSwyllys dcrlparms.nssparms.crl_issuerName = issuernickname; 249*99ebb4caSwyllys dcrlparms.nssparms.crl_subjName = subject; 250*99ebb4caSwyllys 251*99ebb4caSwyllys rv = KMF_DeleteCRL(kmfhandle, &dcrlparms); 252*99ebb4caSwyllys 253*99ebb4caSwyllys return (rv); 254*99ebb4caSwyllys } 255*99ebb4caSwyllys 256*99ebb4caSwyllys static KMF_RETURN 257*99ebb4caSwyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle, 258*99ebb4caSwyllys char *token, int oclass, char *objlabel, 259*99ebb4caSwyllys KMF_CREDENTIAL *tokencred) 260*99ebb4caSwyllys { 261*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 262*99ebb4caSwyllys KMF_FINDKEY_PARAMS parms; 263*99ebb4caSwyllys int nk, numkeys = 0; 264*99ebb4caSwyllys 265*99ebb4caSwyllys /* 266*99ebb4caSwyllys * Symmetric keys and RSA/DSA private keys are always 267*99ebb4caSwyllys * created with the "CKA_PRIVATE" field == TRUE, so 268*99ebb4caSwyllys * make sure we search for them with it also set. 269*99ebb4caSwyllys */ 270*99ebb4caSwyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 271*99ebb4caSwyllys oclass |= PK_PRIVATE_OBJ; 272*99ebb4caSwyllys 273*99ebb4caSwyllys rv = select_token(kmfhandle, token, FALSE); 274*99ebb4caSwyllys if (rv != KMF_OK) { 275*99ebb4caSwyllys return (rv); 276*99ebb4caSwyllys } 277*99ebb4caSwyllys 278*99ebb4caSwyllys (void) memset(&parms, 0, sizeof (parms)); 279*99ebb4caSwyllys parms.kstype = KMF_KEYSTORE_PK11TOKEN; 280*99ebb4caSwyllys parms.findLabel = (char *)objlabel; 281*99ebb4caSwyllys parms.keytype = 0; 282*99ebb4caSwyllys parms.pkcs11parms.private = ((oclass & PK_PRIVATE_OBJ) > 0); 283*99ebb4caSwyllys parms.cred.cred = tokencred->cred; 284*99ebb4caSwyllys parms.cred.credlen = tokencred->credlen; 285*99ebb4caSwyllys 286*99ebb4caSwyllys if (oclass & PK_PRIKEY_OBJ) { 287*99ebb4caSwyllys parms.keyclass = KMF_ASYM_PRI; 288*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, "private", &nk); 289*99ebb4caSwyllys numkeys += nk; 290*99ebb4caSwyllys } 291*99ebb4caSwyllys 292*99ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 293*99ebb4caSwyllys parms.keyclass = KMF_SYMMETRIC; 294*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, "symmetric", &nk); 295*99ebb4caSwyllys numkeys += nk; 296*99ebb4caSwyllys } 297*99ebb4caSwyllys 298*99ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 299*99ebb4caSwyllys parms.keyclass = KMF_ASYM_PUB; 300*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, "public", &nk); 301*99ebb4caSwyllys numkeys += nk; 302*99ebb4caSwyllys } 303*99ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 304*99ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 305*99ebb4caSwyllys 306*99ebb4caSwyllys return (rv); 307*99ebb4caSwyllys } 308*99ebb4caSwyllys 309*99ebb4caSwyllys static KMF_RETURN 310*99ebb4caSwyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle, 311*99ebb4caSwyllys char *token, char *objlabel, 312*99ebb4caSwyllys KMF_BIGINT *serno, char *issuer, char *subject, 313*99ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag) 314*99ebb4caSwyllys { 315*99ebb4caSwyllys KMF_RETURN kmfrv; 316*99ebb4caSwyllys KMF_DELETECERT_PARAMS dparms; 317*99ebb4caSwyllys KMF_FINDCERT_PARAMS fcargs; 318*99ebb4caSwyllys 319*99ebb4caSwyllys kmfrv = select_token(kmfhandle, token, FALSE); 320*99ebb4caSwyllys 321*99ebb4caSwyllys if (kmfrv != KMF_OK) { 322*99ebb4caSwyllys return (kmfrv); 323*99ebb4caSwyllys } 324*99ebb4caSwyllys 325*99ebb4caSwyllys (void) memset(&dparms, 0, sizeof (dparms)); 326*99ebb4caSwyllys dparms.kstype = KMF_KEYSTORE_PK11TOKEN; 327*99ebb4caSwyllys dparms.certLabel = objlabel; 328*99ebb4caSwyllys dparms.issuer = issuer; 329*99ebb4caSwyllys dparms.subject = subject; 330*99ebb4caSwyllys dparms.serial = serno; 331*99ebb4caSwyllys dparms.find_cert_validity = find_criteria_flag; 332*99ebb4caSwyllys 333*99ebb4caSwyllys fcargs = dparms; 334*99ebb4caSwyllys kmfrv = pk_delete_certs(kmfhandle, &fcargs, &dparms); 335*99ebb4caSwyllys 336*99ebb4caSwyllys return (kmfrv); 337*99ebb4caSwyllys } 338*99ebb4caSwyllys 339*99ebb4caSwyllys static KMF_RETURN 340*99ebb4caSwyllys delete_file_certs(KMF_HANDLE_T kmfhandle, 341*99ebb4caSwyllys char *dir, char *filename, KMF_BIGINT *serial, char *issuer, 342*99ebb4caSwyllys char *subject, KMF_CERT_VALIDITY find_criteria_flag) 343*99ebb4caSwyllys { 344*99ebb4caSwyllys KMF_RETURN rv; 345*99ebb4caSwyllys KMF_DELETECERT_PARAMS dparms; 346*99ebb4caSwyllys KMF_FINDCERT_PARAMS fcargs; 347*99ebb4caSwyllys 348*99ebb4caSwyllys (void *)memset(&dparms, 0, sizeof (dparms)); 349*99ebb4caSwyllys (void *)memset(&fcargs, 0, sizeof (fcargs)); 350*99ebb4caSwyllys fcargs.kstype = KMF_KEYSTORE_OPENSSL; 351*99ebb4caSwyllys fcargs.certLabel = NULL; 352*99ebb4caSwyllys fcargs.issuer = issuer; 353*99ebb4caSwyllys fcargs.subject = subject; 354*99ebb4caSwyllys fcargs.serial = serial; 355*99ebb4caSwyllys fcargs.sslparms.dirpath = dir; 356*99ebb4caSwyllys fcargs.sslparms.certfile = filename; 357*99ebb4caSwyllys fcargs.find_cert_validity = find_criteria_flag; 358*99ebb4caSwyllys 359*99ebb4caSwyllys /* For now, delete parameters and find parameters are the same */ 360*99ebb4caSwyllys dparms = fcargs; 361*99ebb4caSwyllys 362*99ebb4caSwyllys rv = pk_delete_certs(kmfhandle, &fcargs, &dparms); 363*99ebb4caSwyllys 364*99ebb4caSwyllys return (rv); 365*99ebb4caSwyllys } 366*99ebb4caSwyllys 367*99ebb4caSwyllys static KMF_RETURN 368*99ebb4caSwyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass, 369*99ebb4caSwyllys char *dir, char *infile) 370*99ebb4caSwyllys { 371*99ebb4caSwyllys KMF_RETURN rv = KMF_OK; 372*99ebb4caSwyllys KMF_FINDKEY_PARAMS parms; 373*99ebb4caSwyllys char *keytype = ""; 374*99ebb4caSwyllys int nk, numkeys = 0; 375*99ebb4caSwyllys 376*99ebb4caSwyllys (void) memset(&parms, 0, sizeof (parms)); 377*99ebb4caSwyllys parms.kstype = KMF_KEYSTORE_OPENSSL; 378*99ebb4caSwyllys parms.sslparms.dirpath = dir; 379*99ebb4caSwyllys parms.sslparms.keyfile = infile; 380*99ebb4caSwyllys 381*99ebb4caSwyllys if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) { 382*99ebb4caSwyllys parms.keyclass = KMF_ASYM_PRI; 383*99ebb4caSwyllys keytype = "Asymmetric"; 384*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 385*99ebb4caSwyllys numkeys += nk; 386*99ebb4caSwyllys } 387*99ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 388*99ebb4caSwyllys parms.keyclass = KMF_SYMMETRIC; 389*99ebb4caSwyllys keytype = "symmetric"; 390*99ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 391*99ebb4caSwyllys numkeys += nk; 392*99ebb4caSwyllys } 393*99ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 394*99ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 395*99ebb4caSwyllys 396*99ebb4caSwyllys return (rv); 397*99ebb4caSwyllys } 398*99ebb4caSwyllys 399*99ebb4caSwyllys static KMF_RETURN 400*99ebb4caSwyllys delete_file_crl(void *kmfhandle, char *dir, char *filename) 401*99ebb4caSwyllys { 402*99ebb4caSwyllys KMF_RETURN rv; 403*99ebb4caSwyllys KMF_DELETECRL_PARAMS dcrlparms; 404*99ebb4caSwyllys 405*99ebb4caSwyllys (void) memset(&dcrlparms, 0, sizeof (dcrlparms)); 406*99ebb4caSwyllys 407*99ebb4caSwyllys dcrlparms.kstype = KMF_KEYSTORE_OPENSSL; 408*99ebb4caSwyllys dcrlparms.sslparms.dirpath = dir; 409*99ebb4caSwyllys dcrlparms.sslparms.crlfile = filename; 410*99ebb4caSwyllys 411*99ebb4caSwyllys rv = KMF_DeleteCRL(kmfhandle, &dcrlparms); 412*99ebb4caSwyllys 413*99ebb4caSwyllys return (rv); 414*99ebb4caSwyllys } 4157711facfSdinak 4167711facfSdinak /* 4177711facfSdinak * Delete token objects. 4187711facfSdinak */ 4197711facfSdinak int 4207711facfSdinak pk_delete(int argc, char *argv[]) 4217711facfSdinak { 4227711facfSdinak int opt; 42349e21299Sdinak extern int optind_av; 42449e21299Sdinak extern char *optarg_av; 42549e21299Sdinak char *token_spec = NULL; 426*99ebb4caSwyllys char *subject = NULL; 427*99ebb4caSwyllys char *issuer = NULL; 428*99ebb4caSwyllys char *dir = NULL; 429*99ebb4caSwyllys char *prefix = NULL; 430*99ebb4caSwyllys char *infile = NULL; 431*99ebb4caSwyllys char *object_label = NULL; 432*99ebb4caSwyllys char *serstr = NULL; 4337711facfSdinak 434*99ebb4caSwyllys int oclass = 0; 435*99ebb4caSwyllys KMF_BIGINT serial = { NULL, 0 }; 436*99ebb4caSwyllys KMF_HANDLE_T kmfhandle = NULL; 437*99ebb4caSwyllys KMF_KEYSTORE_TYPE kstype = 0; 438*99ebb4caSwyllys KMF_RETURN kmfrv; 439*99ebb4caSwyllys int rv = 0; 440*99ebb4caSwyllys char *find_criteria = NULL; 441*99ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 442*99ebb4caSwyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 4437711facfSdinak 4447711facfSdinak /* Parse command line options. Do NOT i18n/l10n. */ 44549e21299Sdinak while ((opt = getopt_av(argc, argv, 446*99ebb4caSwyllys "T:(token)y:(objtype)l:(label)" 447*99ebb4caSwyllys "k:(keystore)s:(subject)n:(nickname)" 448*99ebb4caSwyllys "d:(dir)p:(prefix)S:(serial)i:(issuer)" 449*99ebb4caSwyllys "c:(criteria)" 450*99ebb4caSwyllys "f:(infile)")) != EOF) { 451*99ebb4caSwyllys 452*99ebb4caSwyllys if (EMPTYSTRING(optarg_av)) 453*99ebb4caSwyllys return (PK_ERR_USAGE); 4547711facfSdinak switch (opt) { 45549e21299Sdinak case 'T': /* token specifier */ 45649e21299Sdinak if (token_spec) 45749e21299Sdinak return (PK_ERR_USAGE); 45849e21299Sdinak token_spec = optarg_av; 4597711facfSdinak break; 46049e21299Sdinak case 'y': /* object type: public, private, both */ 461*99ebb4caSwyllys if (oclass) 46249e21299Sdinak return (PK_ERR_USAGE); 463*99ebb4caSwyllys oclass = OT2Int(optarg_av); 464*99ebb4caSwyllys if (oclass == -1) 465*99ebb4caSwyllys return (PK_ERR_USAGE); 4667711facfSdinak break; 4677711facfSdinak case 'l': /* objects with specific label */ 468*99ebb4caSwyllys case 'n': 4697711facfSdinak if (object_label) 4707711facfSdinak return (PK_ERR_USAGE); 471*99ebb4caSwyllys object_label = (char *)optarg_av; 472*99ebb4caSwyllys break; 473*99ebb4caSwyllys case 'k': 474*99ebb4caSwyllys kstype = KS2Int(optarg_av); 475*99ebb4caSwyllys if (kstype == 0) 476*99ebb4caSwyllys return (PK_ERR_USAGE); 477*99ebb4caSwyllys break; 478*99ebb4caSwyllys case 's': 479*99ebb4caSwyllys subject = optarg_av; 480*99ebb4caSwyllys break; 481*99ebb4caSwyllys case 'i': 482*99ebb4caSwyllys issuer = optarg_av; 483*99ebb4caSwyllys break; 484*99ebb4caSwyllys case 'd': 485*99ebb4caSwyllys dir = optarg_av; 486*99ebb4caSwyllys break; 487*99ebb4caSwyllys case 'p': 488*99ebb4caSwyllys prefix = optarg_av; 489*99ebb4caSwyllys break; 490*99ebb4caSwyllys case 'S': 491*99ebb4caSwyllys serstr = optarg_av; 492*99ebb4caSwyllys break; 493*99ebb4caSwyllys case 'f': 494*99ebb4caSwyllys infile = optarg_av; 495*99ebb4caSwyllys break; 496*99ebb4caSwyllys case 'c': 497*99ebb4caSwyllys find_criteria = optarg_av; 498*99ebb4caSwyllys if (!strcasecmp(find_criteria, "valid")) 499*99ebb4caSwyllys find_criteria_flag = 500*99ebb4caSwyllys KMF_NONEXPIRED_CERTS; 501*99ebb4caSwyllys else if (!strcasecmp(find_criteria, "expired")) 502*99ebb4caSwyllys find_criteria_flag = KMF_EXPIRED_CERTS; 503*99ebb4caSwyllys else if (!strcasecmp(find_criteria, "both")) 504*99ebb4caSwyllys find_criteria_flag = KMF_ALL_CERTS; 505*99ebb4caSwyllys else 506*99ebb4caSwyllys return (PK_ERR_USAGE); 5077711facfSdinak break; 5087711facfSdinak default: 5097711facfSdinak return (PK_ERR_USAGE); 5107711facfSdinak break; 5117711facfSdinak } 5127711facfSdinak } 5137711facfSdinak 514*99ebb4caSwyllys /* Assume keystore = PKCS#11 if not specified */ 515*99ebb4caSwyllys if (kstype == 0) 516*99ebb4caSwyllys kstype = KMF_KEYSTORE_PK11TOKEN; 517*99ebb4caSwyllys 518*99ebb4caSwyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 519*99ebb4caSwyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 520*99ebb4caSwyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 521*99ebb4caSwyllys 522*99ebb4caSwyllys (void) fprintf(stderr, gettext("The objtype parameter " 523*99ebb4caSwyllys "is only relevant if keystore=pkcs11\n")); 52449e21299Sdinak return (PK_ERR_USAGE); 52549e21299Sdinak } 52649e21299Sdinak 527*99ebb4caSwyllys /* If no object class specified, delete everything but CRLs */ 528*99ebb4caSwyllys if (oclass == 0) 529*99ebb4caSwyllys oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ | 530*99ebb4caSwyllys PK_SYMKEY_OBJ; 5317711facfSdinak 5327711facfSdinak /* No additional args allowed. */ 53349e21299Sdinak argc -= optind_av; 53449e21299Sdinak argv += optind_av; 5357711facfSdinak if (argc) 5367711facfSdinak return (PK_ERR_USAGE); 5377711facfSdinak /* Done parsing command line options. */ 5387711facfSdinak 539*99ebb4caSwyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) { 540*99ebb4caSwyllys token_spec = PK_DEFAULT_PK11TOKEN; 541*99ebb4caSwyllys } else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) { 542*99ebb4caSwyllys token_spec = DEFAULT_NSS_TOKEN; 5437711facfSdinak } 5447711facfSdinak 545*99ebb4caSwyllys if (serstr != NULL) { 546*99ebb4caSwyllys uchar_t *bytes = NULL; 547*99ebb4caSwyllys size_t bytelen; 548*99ebb4caSwyllys 549*99ebb4caSwyllys rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen); 550*99ebb4caSwyllys if (rv != KMF_OK || bytes == NULL) { 551*99ebb4caSwyllys (void) fprintf(stderr, gettext("serial number " 552*99ebb4caSwyllys "must be specified as a hex number " 553*99ebb4caSwyllys "(ex: 0x0102030405ffeeddee)\n")); 554*99ebb4caSwyllys return (PK_ERR_USAGE); 555*99ebb4caSwyllys } 556*99ebb4caSwyllys serial.val = bytes; 557*99ebb4caSwyllys serial.len = bytelen; 5587711facfSdinak } 5597711facfSdinak 560*99ebb4caSwyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 561*99ebb4caSwyllys kstype == KMF_KEYSTORE_NSS) && 562*99ebb4caSwyllys (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) { 563*99ebb4caSwyllys 564*99ebb4caSwyllys (void) get_token_password(kstype, token_spec, 565*99ebb4caSwyllys &tokencred); 5667711facfSdinak } 5677711facfSdinak 568*99ebb4caSwyllys if ((kmfrv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) 569*99ebb4caSwyllys return (kmfrv); 5707711facfSdinak 571*99ebb4caSwyllys switch (kstype) { 572*99ebb4caSwyllys case KMF_KEYSTORE_PK11TOKEN: 573*99ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 574*99ebb4caSwyllys kmfrv = delete_pk11_keys(kmfhandle, 575*99ebb4caSwyllys token_spec, oclass, 576*99ebb4caSwyllys object_label, 577*99ebb4caSwyllys &tokencred); 5787711facfSdinak /* 579*99ebb4caSwyllys * If deleting groups of objects, it is OK 580*99ebb4caSwyllys * to ignore the "key not found" case so that 581*99ebb4caSwyllys * we can continue to find other objects. 5827711facfSdinak */ 583*99ebb4caSwyllys if (kmfrv == KMF_ERR_KEY_NOT_FOUND && 584*99ebb4caSwyllys (oclass != PK_KEY_OBJ)) 585*99ebb4caSwyllys kmfrv = KMF_OK; 586*99ebb4caSwyllys if (kmfrv != KMF_OK) 587*99ebb4caSwyllys break; 5887711facfSdinak } 589*99ebb4caSwyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 590*99ebb4caSwyllys kmfrv = delete_pk11_certs(kmfhandle, 591*99ebb4caSwyllys token_spec, 592*99ebb4caSwyllys object_label, 593*99ebb4caSwyllys &serial, issuer, 594*99ebb4caSwyllys subject, find_criteria_flag); 595*99ebb4caSwyllys /* 596*99ebb4caSwyllys * If cert delete failed, but we are looking at 597*99ebb4caSwyllys * other objects, then it is OK. 598*99ebb4caSwyllys */ 599*99ebb4caSwyllys if (kmfrv == KMF_ERR_CERT_NOT_FOUND && 600*99ebb4caSwyllys (oclass & (PK_CRL_OBJ | PK_KEY_OBJ))) 601*99ebb4caSwyllys kmfrv = KMF_OK; 602*99ebb4caSwyllys if (kmfrv != KMF_OK) 603*99ebb4caSwyllys break; 6047711facfSdinak } 605*99ebb4caSwyllys if (oclass & PK_CRL_OBJ) 606*99ebb4caSwyllys kmfrv = delete_file_crl(kmfhandle, 607*99ebb4caSwyllys dir, infile); 608*99ebb4caSwyllys break; 609*99ebb4caSwyllys case KMF_KEYSTORE_NSS: 610*99ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 611*99ebb4caSwyllys kmfrv = delete_nss_keys(kmfhandle, 612*99ebb4caSwyllys dir, prefix, token_spec, 613*99ebb4caSwyllys oclass, (char *)object_label, 614*99ebb4caSwyllys &tokencred); 615*99ebb4caSwyllys if (kmfrv != KMF_OK) 616*99ebb4caSwyllys break; 617*99ebb4caSwyllys } 618*99ebb4caSwyllys if (oclass & PK_CERT_OBJ) { 619*99ebb4caSwyllys kmfrv = delete_nss_certs(kmfhandle, 620*99ebb4caSwyllys dir, prefix, token_spec, 621*99ebb4caSwyllys (char *)object_label, 622*99ebb4caSwyllys &serial, issuer, subject, 623*99ebb4caSwyllys find_criteria_flag); 624*99ebb4caSwyllys if (kmfrv != KMF_OK) 625*99ebb4caSwyllys break; 626*99ebb4caSwyllys } 627*99ebb4caSwyllys if (oclass & PK_CRL_OBJ) 628*99ebb4caSwyllys kmfrv = delete_nss_crl(kmfhandle, 629*99ebb4caSwyllys dir, prefix, token_spec, 630*99ebb4caSwyllys (char *)object_label, subject); 631*99ebb4caSwyllys break; 632*99ebb4caSwyllys case KMF_KEYSTORE_OPENSSL: 633*99ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 634*99ebb4caSwyllys kmfrv = delete_file_keys(kmfhandle, oclass, 635*99ebb4caSwyllys dir, infile); 636*99ebb4caSwyllys if (kmfrv != KMF_OK) 637*99ebb4caSwyllys break; 638*99ebb4caSwyllys } 639*99ebb4caSwyllys if (oclass & (PK_CERT_OBJ)) { 640*99ebb4caSwyllys kmfrv = delete_file_certs(kmfhandle, 641*99ebb4caSwyllys dir, infile, &serial, issuer, 642*99ebb4caSwyllys subject, find_criteria_flag); 643*99ebb4caSwyllys if (kmfrv != KMF_OK) 644*99ebb4caSwyllys break; 645*99ebb4caSwyllys } 646*99ebb4caSwyllys if (oclass & PK_CRL_OBJ) 647*99ebb4caSwyllys kmfrv = delete_file_crl(kmfhandle, 648*99ebb4caSwyllys dir, infile); 649*99ebb4caSwyllys break; 650*99ebb4caSwyllys default: 651*99ebb4caSwyllys rv = PK_ERR_USAGE; 652*99ebb4caSwyllys break; 6537711facfSdinak } 6547711facfSdinak 655*99ebb4caSwyllys if (kmfrv != KMF_OK) { 656*99ebb4caSwyllys display_error(kmfhandle, kmfrv, 657*99ebb4caSwyllys gettext("Error deleting objects")); 6587711facfSdinak } 6597711facfSdinak 660*99ebb4caSwyllys if (serial.val != NULL) 661*99ebb4caSwyllys free(serial.val); 662*99ebb4caSwyllys (void) KMF_Finalize(kmfhandle); 663*99ebb4caSwyllys return (kmfrv); 6647711facfSdinak } 665