17711facfSdinak /* 27711facfSdinak * CDDL HEADER START 37711facfSdinak * 47711facfSdinak * The contents of this file are subject to the terms of the 599ebb4caSwyllys * Common Development and Distribution License (the "License"). 699ebb4caSwyllys * You may not use this file except in compliance with the License. 77711facfSdinak * 87711facfSdinak * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97711facfSdinak * or http://www.opensolaris.org/os/licensing. 107711facfSdinak * See the License for the specific language governing permissions 117711facfSdinak * and limitations under the License. 127711facfSdinak * 137711facfSdinak * When distributing Covered Code, include this CDDL HEADER in each 147711facfSdinak * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157711facfSdinak * If applicable, add the following below this CDDL HEADER, with the 167711facfSdinak * fields enclosed by brackets "[]" replaced with your own identifying 177711facfSdinak * information: Portions Copyright [yyyy] [name of copyright owner] 187711facfSdinak * 197711facfSdinak * CDDL HEADER END 207711facfSdinak */ 217711facfSdinak /* 22*71593db2Swyllys * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 237711facfSdinak * Use is subject to license terms. 247711facfSdinak */ 257711facfSdinak 267711facfSdinak #pragma ident "%Z%%M% %I% %E% SMI" 277711facfSdinak 287711facfSdinak /* 297711facfSdinak * This file implements the token object delete operation for this tool. 307711facfSdinak * It loads the PKCS#11 modules, finds the object to delete, deletes it, 317711facfSdinak * and cleans up. User must be R/W logged into the token. 327711facfSdinak */ 337711facfSdinak 347711facfSdinak #include <stdio.h> 357711facfSdinak #include <string.h> 367711facfSdinak #include <cryptoutil.h> 377711facfSdinak #include <security/cryptoki.h> 387711facfSdinak #include "common.h" 3999ebb4caSwyllys #include <kmfapi.h> 4099ebb4caSwyllys 4199ebb4caSwyllys static KMF_RETURN 4299ebb4caSwyllys pk_destroy_keys(void *handle, KMF_KEY_HANDLE *keys, 4399ebb4caSwyllys KMF_FINDKEY_PARAMS *fkparams, uint32_t numkeys) 4499ebb4caSwyllys { 4599ebb4caSwyllys int i; 4699ebb4caSwyllys KMF_RETURN rv = KMF_OK; 4799ebb4caSwyllys KMF_DELETEKEY_PARAMS dkparams; 4899ebb4caSwyllys 4999ebb4caSwyllys (void) memset(&dkparams, 0, sizeof (dkparams)); 5099ebb4caSwyllys dkparams.kstype = fkparams->kstype; 5199ebb4caSwyllys 5299ebb4caSwyllys switch (fkparams->kstype) { 5399ebb4caSwyllys case KMF_KEYSTORE_NSS: 5499ebb4caSwyllys dkparams.nssparms = fkparams->nssparms; 5599ebb4caSwyllys dkparams.cred = fkparams->cred; 5699ebb4caSwyllys break; 5799ebb4caSwyllys case KMF_KEYSTORE_OPENSSL: 5899ebb4caSwyllys break; 5999ebb4caSwyllys case KMF_KEYSTORE_PK11TOKEN: 6099ebb4caSwyllys dkparams.cred = fkparams->cred; 6199ebb4caSwyllys break; 6299ebb4caSwyllys default: 6399ebb4caSwyllys return (PK_ERR_USAGE); 6499ebb4caSwyllys } 6599ebb4caSwyllys 6699ebb4caSwyllys for (i = 0; rv == KMF_OK && i < numkeys; i++) { 6799ebb4caSwyllys rv = KMF_DeleteKeyFromKeystore(handle, &dkparams, &keys[i]); 6899ebb4caSwyllys } 6999ebb4caSwyllys return (rv); 7099ebb4caSwyllys } 7199ebb4caSwyllys 7299ebb4caSwyllys static KMF_RETURN 7399ebb4caSwyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc, 7499ebb4caSwyllys int *keysdeleted) 7599ebb4caSwyllys { 7699ebb4caSwyllys KMF_RETURN rv = KMF_OK; 7799ebb4caSwyllys uint32_t numkeys = 0; 7899ebb4caSwyllys 7999ebb4caSwyllys *keysdeleted = 0; 8099ebb4caSwyllys numkeys = 0; 8199ebb4caSwyllys rv = KMF_FindKey(kmfhandle, parms, NULL, &numkeys); 8299ebb4caSwyllys if (rv == KMF_OK && numkeys > 0) { 8399ebb4caSwyllys KMF_KEY_HANDLE *keys = NULL; 8499ebb4caSwyllys char prompt[1024]; 8599ebb4caSwyllys 8699ebb4caSwyllys (void) snprintf(prompt, sizeof (prompt), 8799ebb4caSwyllys gettext("%d %s key(s) found, do you want " 8899ebb4caSwyllys "to delete them (y/N) ?"), numkeys, 8999ebb4caSwyllys (desc != NULL ? desc : "")); 9099ebb4caSwyllys 9199ebb4caSwyllys if (!yesno(prompt, 9299ebb4caSwyllys gettext("Respond with yes or no.\n"), 9399ebb4caSwyllys B_FALSE)) { 9499ebb4caSwyllys return (KMF_OK); 9599ebb4caSwyllys } 9699ebb4caSwyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 9799ebb4caSwyllys sizeof (KMF_KEY_HANDLE)); 9899ebb4caSwyllys if (keys == NULL) 9999ebb4caSwyllys return (KMF_ERR_MEMORY); 10099ebb4caSwyllys (void) memset(keys, 0, numkeys * 10199ebb4caSwyllys sizeof (KMF_KEY_HANDLE)); 10299ebb4caSwyllys 10399ebb4caSwyllys rv = KMF_FindKey(kmfhandle, parms, keys, &numkeys); 10499ebb4caSwyllys if (rv == KMF_OK) { 10599ebb4caSwyllys rv = pk_destroy_keys(kmfhandle, keys, 10699ebb4caSwyllys parms, numkeys); 10799ebb4caSwyllys } 10899ebb4caSwyllys 10999ebb4caSwyllys free(keys); 11099ebb4caSwyllys } 11199ebb4caSwyllys 11299ebb4caSwyllys if (rv == KMF_ERR_KEY_NOT_FOUND) { 11399ebb4caSwyllys rv = KMF_OK; 11499ebb4caSwyllys } 11599ebb4caSwyllys 11699ebb4caSwyllys *keysdeleted = numkeys; 11799ebb4caSwyllys return (rv); 11899ebb4caSwyllys } 11999ebb4caSwyllys 12099ebb4caSwyllys static KMF_RETURN 12199ebb4caSwyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *fcparms, 12299ebb4caSwyllys KMF_DELETECERT_PARAMS *dcparms) 12399ebb4caSwyllys { 12499ebb4caSwyllys KMF_RETURN rv = KMF_OK; 12599ebb4caSwyllys uint32_t numcerts = 0; 12699ebb4caSwyllys 12799ebb4caSwyllys rv = KMF_FindCert(kmfhandle, fcparms, NULL, &numcerts); 12899ebb4caSwyllys if (rv == KMF_OK && numcerts > 0) { 12999ebb4caSwyllys char prompt[1024]; 13099ebb4caSwyllys (void) snprintf(prompt, sizeof (prompt), 13199ebb4caSwyllys gettext("%d certificate(s) found, do you want " 13299ebb4caSwyllys "to delete them (y/N) ?"), numcerts); 13399ebb4caSwyllys 13499ebb4caSwyllys if (!yesno(prompt, 13599ebb4caSwyllys gettext("Respond with yes or no.\n"), 13699ebb4caSwyllys B_FALSE)) { 13799ebb4caSwyllys return (KMF_OK); 13899ebb4caSwyllys } 13999ebb4caSwyllys 14099ebb4caSwyllys rv = KMF_DeleteCertFromKeystore(kmfhandle, dcparms); 14199ebb4caSwyllys 14299ebb4caSwyllys } else if (rv == KMF_ERR_CERT_NOT_FOUND) { 14399ebb4caSwyllys rv = KMF_OK; 14499ebb4caSwyllys } 14599ebb4caSwyllys 14699ebb4caSwyllys return (rv); 14799ebb4caSwyllys } 14899ebb4caSwyllys 14999ebb4caSwyllys static KMF_RETURN 15099ebb4caSwyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix, 15199ebb4caSwyllys char *token, int oclass, char *objlabel, 15299ebb4caSwyllys KMF_CREDENTIAL *tokencred) 15399ebb4caSwyllys { 15499ebb4caSwyllys KMF_RETURN rv = KMF_OK; 15599ebb4caSwyllys KMF_FINDKEY_PARAMS parms; 15699ebb4caSwyllys char *keytype = NULL; 15799ebb4caSwyllys int nk, numkeys = 0; 15899ebb4caSwyllys 15999ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 16099ebb4caSwyllys if (rv != KMF_OK) 16199ebb4caSwyllys return (rv); 16299ebb4caSwyllys 16399ebb4caSwyllys (void) memset(&parms, 0, sizeof (parms)); 16499ebb4caSwyllys parms.kstype = KMF_KEYSTORE_NSS; 16599ebb4caSwyllys parms.findLabel = objlabel; 16699ebb4caSwyllys parms.cred = *tokencred; 16799ebb4caSwyllys parms.nssparms.slotlabel = token; 16899ebb4caSwyllys 16999ebb4caSwyllys if (oclass & PK_PRIKEY_OBJ) { 17099ebb4caSwyllys parms.keyclass = KMF_ASYM_PRI; 17199ebb4caSwyllys keytype = "private"; 17299ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 17399ebb4caSwyllys numkeys += nk; 17499ebb4caSwyllys } 17599ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 17699ebb4caSwyllys parms.keyclass = KMF_SYMMETRIC; 17799ebb4caSwyllys keytype = "symmetric"; 17899ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 17999ebb4caSwyllys numkeys += nk; 18099ebb4caSwyllys } 18199ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 18299ebb4caSwyllys parms.keyclass = KMF_ASYM_PUB; 18399ebb4caSwyllys keytype = "public"; 18499ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 18599ebb4caSwyllys numkeys += nk; 18699ebb4caSwyllys } 18799ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 18899ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 18999ebb4caSwyllys 19099ebb4caSwyllys return (rv); 19199ebb4caSwyllys } 19299ebb4caSwyllys 19399ebb4caSwyllys 19499ebb4caSwyllys static KMF_RETURN 19599ebb4caSwyllys delete_nss_certs(KMF_HANDLE_T kmfhandle, 19699ebb4caSwyllys char *dir, char *prefix, 19799ebb4caSwyllys char *token, char *objlabel, 19899ebb4caSwyllys KMF_BIGINT *serno, char *issuer, char *subject, 19999ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag) 20099ebb4caSwyllys { 20199ebb4caSwyllys KMF_RETURN rv = KMF_OK; 20299ebb4caSwyllys KMF_DELETECERT_PARAMS dcparms; 20399ebb4caSwyllys KMF_FINDCERT_PARAMS fcargs; 20499ebb4caSwyllys 20599ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 20699ebb4caSwyllys if (rv != KMF_OK) 20799ebb4caSwyllys return (rv); 20899ebb4caSwyllys 20999ebb4caSwyllys (void) memset(&dcparms, 0, sizeof (dcparms)); 21099ebb4caSwyllys dcparms.kstype = KMF_KEYSTORE_NSS; 21199ebb4caSwyllys dcparms.certLabel = objlabel; 21299ebb4caSwyllys dcparms.issuer = issuer; 21399ebb4caSwyllys dcparms.subject = subject; 21499ebb4caSwyllys dcparms.serial = serno; 21599ebb4caSwyllys dcparms.find_cert_validity = find_criteria_flag; 21699ebb4caSwyllys dcparms.nssparms.slotlabel = token; 21799ebb4caSwyllys 21899ebb4caSwyllys (void) memset(&fcargs, 0, sizeof (fcargs)); 21999ebb4caSwyllys fcargs.kstype = KMF_KEYSTORE_NSS; 22099ebb4caSwyllys fcargs.certLabel = objlabel; 22199ebb4caSwyllys fcargs.issuer = issuer; 22299ebb4caSwyllys fcargs.subject = subject; 22399ebb4caSwyllys fcargs.serial = serno; 22499ebb4caSwyllys fcargs.find_cert_validity = find_criteria_flag; 22599ebb4caSwyllys fcargs.nssparms.slotlabel = token; 22699ebb4caSwyllys 22799ebb4caSwyllys rv = pk_delete_certs(kmfhandle, &fcargs, &dcparms); 22899ebb4caSwyllys 22999ebb4caSwyllys return (rv); 23099ebb4caSwyllys } 23199ebb4caSwyllys 23299ebb4caSwyllys static KMF_RETURN 23399ebb4caSwyllys delete_nss_crl(void *kmfhandle, 23499ebb4caSwyllys char *dir, char *prefix, char *token, 23599ebb4caSwyllys char *issuernickname, char *subject) 23699ebb4caSwyllys { 23799ebb4caSwyllys KMF_RETURN rv = KMF_OK; 23899ebb4caSwyllys KMF_DELETECRL_PARAMS dcrlparms; 23999ebb4caSwyllys 24099ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 24199ebb4caSwyllys if (rv != KMF_OK) 24299ebb4caSwyllys return (rv); 24399ebb4caSwyllys 24499ebb4caSwyllys (void) memset(&dcrlparms, 0, sizeof (dcrlparms)); 24599ebb4caSwyllys 24699ebb4caSwyllys dcrlparms.kstype = KMF_KEYSTORE_NSS; 24799ebb4caSwyllys dcrlparms.nssparms.slotlabel = token; 24899ebb4caSwyllys dcrlparms.nssparms.crl_issuerName = issuernickname; 24999ebb4caSwyllys dcrlparms.nssparms.crl_subjName = subject; 25099ebb4caSwyllys 25199ebb4caSwyllys rv = KMF_DeleteCRL(kmfhandle, &dcrlparms); 25299ebb4caSwyllys 25399ebb4caSwyllys return (rv); 25499ebb4caSwyllys } 25599ebb4caSwyllys 25699ebb4caSwyllys static KMF_RETURN 25799ebb4caSwyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle, 25899ebb4caSwyllys char *token, int oclass, char *objlabel, 25999ebb4caSwyllys KMF_CREDENTIAL *tokencred) 26099ebb4caSwyllys { 26199ebb4caSwyllys KMF_RETURN rv = KMF_OK; 26299ebb4caSwyllys KMF_FINDKEY_PARAMS parms; 26399ebb4caSwyllys int nk, numkeys = 0; 26499ebb4caSwyllys 26599ebb4caSwyllys /* 26699ebb4caSwyllys * Symmetric keys and RSA/DSA private keys are always 26799ebb4caSwyllys * created with the "CKA_PRIVATE" field == TRUE, so 26899ebb4caSwyllys * make sure we search for them with it also set. 26999ebb4caSwyllys */ 27099ebb4caSwyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 27199ebb4caSwyllys oclass |= PK_PRIVATE_OBJ; 27299ebb4caSwyllys 27399ebb4caSwyllys rv = select_token(kmfhandle, token, FALSE); 27499ebb4caSwyllys if (rv != KMF_OK) { 27599ebb4caSwyllys return (rv); 27699ebb4caSwyllys } 27799ebb4caSwyllys 27899ebb4caSwyllys (void) memset(&parms, 0, sizeof (parms)); 27999ebb4caSwyllys parms.kstype = KMF_KEYSTORE_PK11TOKEN; 28099ebb4caSwyllys parms.findLabel = (char *)objlabel; 28199ebb4caSwyllys parms.keytype = 0; 28299ebb4caSwyllys parms.pkcs11parms.private = ((oclass & PK_PRIVATE_OBJ) > 0); 283*71593db2Swyllys parms.pkcs11parms.token = 1; 28499ebb4caSwyllys parms.cred.cred = tokencred->cred; 28599ebb4caSwyllys parms.cred.credlen = tokencred->credlen; 28699ebb4caSwyllys 28799ebb4caSwyllys if (oclass & PK_PRIKEY_OBJ) { 28899ebb4caSwyllys parms.keyclass = KMF_ASYM_PRI; 28999ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, "private", &nk); 29099ebb4caSwyllys numkeys += nk; 29199ebb4caSwyllys } 29299ebb4caSwyllys 29399ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 29499ebb4caSwyllys parms.keyclass = KMF_SYMMETRIC; 29599ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, "symmetric", &nk); 29699ebb4caSwyllys numkeys += nk; 29799ebb4caSwyllys } 29899ebb4caSwyllys 29999ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 30099ebb4caSwyllys parms.keyclass = KMF_ASYM_PUB; 30199ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, "public", &nk); 30299ebb4caSwyllys numkeys += nk; 30399ebb4caSwyllys } 30499ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 30599ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 30699ebb4caSwyllys 30799ebb4caSwyllys return (rv); 30899ebb4caSwyllys } 30999ebb4caSwyllys 31099ebb4caSwyllys static KMF_RETURN 31199ebb4caSwyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle, 31299ebb4caSwyllys char *token, char *objlabel, 31399ebb4caSwyllys KMF_BIGINT *serno, char *issuer, char *subject, 31499ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag) 31599ebb4caSwyllys { 31699ebb4caSwyllys KMF_RETURN kmfrv; 31799ebb4caSwyllys KMF_DELETECERT_PARAMS dparms; 31899ebb4caSwyllys KMF_FINDCERT_PARAMS fcargs; 31999ebb4caSwyllys 32099ebb4caSwyllys kmfrv = select_token(kmfhandle, token, FALSE); 32199ebb4caSwyllys 32299ebb4caSwyllys if (kmfrv != KMF_OK) { 32399ebb4caSwyllys return (kmfrv); 32499ebb4caSwyllys } 32599ebb4caSwyllys 32699ebb4caSwyllys (void) memset(&dparms, 0, sizeof (dparms)); 32799ebb4caSwyllys dparms.kstype = KMF_KEYSTORE_PK11TOKEN; 32899ebb4caSwyllys dparms.certLabel = objlabel; 32999ebb4caSwyllys dparms.issuer = issuer; 33099ebb4caSwyllys dparms.subject = subject; 33199ebb4caSwyllys dparms.serial = serno; 33299ebb4caSwyllys dparms.find_cert_validity = find_criteria_flag; 33399ebb4caSwyllys 33499ebb4caSwyllys fcargs = dparms; 33599ebb4caSwyllys kmfrv = pk_delete_certs(kmfhandle, &fcargs, &dparms); 33699ebb4caSwyllys 33799ebb4caSwyllys return (kmfrv); 33899ebb4caSwyllys } 33999ebb4caSwyllys 34099ebb4caSwyllys static KMF_RETURN 34199ebb4caSwyllys delete_file_certs(KMF_HANDLE_T kmfhandle, 34299ebb4caSwyllys char *dir, char *filename, KMF_BIGINT *serial, char *issuer, 34399ebb4caSwyllys char *subject, KMF_CERT_VALIDITY find_criteria_flag) 34499ebb4caSwyllys { 34599ebb4caSwyllys KMF_RETURN rv; 34699ebb4caSwyllys KMF_DELETECERT_PARAMS dparms; 34799ebb4caSwyllys KMF_FINDCERT_PARAMS fcargs; 34899ebb4caSwyllys 34999ebb4caSwyllys (void *)memset(&dparms, 0, sizeof (dparms)); 35099ebb4caSwyllys (void *)memset(&fcargs, 0, sizeof (fcargs)); 35199ebb4caSwyllys fcargs.kstype = KMF_KEYSTORE_OPENSSL; 35299ebb4caSwyllys fcargs.certLabel = NULL; 35399ebb4caSwyllys fcargs.issuer = issuer; 35499ebb4caSwyllys fcargs.subject = subject; 35599ebb4caSwyllys fcargs.serial = serial; 35699ebb4caSwyllys fcargs.sslparms.dirpath = dir; 35799ebb4caSwyllys fcargs.sslparms.certfile = filename; 35899ebb4caSwyllys fcargs.find_cert_validity = find_criteria_flag; 35999ebb4caSwyllys 36099ebb4caSwyllys /* For now, delete parameters and find parameters are the same */ 36199ebb4caSwyllys dparms = fcargs; 36299ebb4caSwyllys 36399ebb4caSwyllys rv = pk_delete_certs(kmfhandle, &fcargs, &dparms); 36499ebb4caSwyllys 36599ebb4caSwyllys return (rv); 36699ebb4caSwyllys } 36799ebb4caSwyllys 36899ebb4caSwyllys static KMF_RETURN 36999ebb4caSwyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass, 37099ebb4caSwyllys char *dir, char *infile) 37199ebb4caSwyllys { 37299ebb4caSwyllys KMF_RETURN rv = KMF_OK; 37399ebb4caSwyllys KMF_FINDKEY_PARAMS parms; 37499ebb4caSwyllys char *keytype = ""; 37599ebb4caSwyllys int nk, numkeys = 0; 37699ebb4caSwyllys 37799ebb4caSwyllys (void) memset(&parms, 0, sizeof (parms)); 37899ebb4caSwyllys parms.kstype = KMF_KEYSTORE_OPENSSL; 37999ebb4caSwyllys parms.sslparms.dirpath = dir; 38099ebb4caSwyllys parms.sslparms.keyfile = infile; 38199ebb4caSwyllys 38299ebb4caSwyllys if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) { 38399ebb4caSwyllys parms.keyclass = KMF_ASYM_PRI; 38499ebb4caSwyllys keytype = "Asymmetric"; 38599ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 38699ebb4caSwyllys numkeys += nk; 38799ebb4caSwyllys } 38899ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 38999ebb4caSwyllys parms.keyclass = KMF_SYMMETRIC; 39099ebb4caSwyllys keytype = "symmetric"; 39199ebb4caSwyllys rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk); 39299ebb4caSwyllys numkeys += nk; 39399ebb4caSwyllys } 39499ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 39599ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 39699ebb4caSwyllys 39799ebb4caSwyllys return (rv); 39899ebb4caSwyllys } 39999ebb4caSwyllys 40099ebb4caSwyllys static KMF_RETURN 40199ebb4caSwyllys delete_file_crl(void *kmfhandle, char *dir, char *filename) 40299ebb4caSwyllys { 40399ebb4caSwyllys KMF_RETURN rv; 40499ebb4caSwyllys KMF_DELETECRL_PARAMS dcrlparms; 40599ebb4caSwyllys 40699ebb4caSwyllys (void) memset(&dcrlparms, 0, sizeof (dcrlparms)); 40799ebb4caSwyllys 40899ebb4caSwyllys dcrlparms.kstype = KMF_KEYSTORE_OPENSSL; 40999ebb4caSwyllys dcrlparms.sslparms.dirpath = dir; 41099ebb4caSwyllys dcrlparms.sslparms.crlfile = filename; 41199ebb4caSwyllys 41299ebb4caSwyllys rv = KMF_DeleteCRL(kmfhandle, &dcrlparms); 41399ebb4caSwyllys 41499ebb4caSwyllys return (rv); 41599ebb4caSwyllys } 4167711facfSdinak 4177711facfSdinak /* 4187711facfSdinak * Delete token objects. 4197711facfSdinak */ 4207711facfSdinak int 4217711facfSdinak pk_delete(int argc, char *argv[]) 4227711facfSdinak { 4237711facfSdinak int opt; 42449e21299Sdinak extern int optind_av; 42549e21299Sdinak extern char *optarg_av; 42649e21299Sdinak char *token_spec = NULL; 42799ebb4caSwyllys char *subject = NULL; 42899ebb4caSwyllys char *issuer = NULL; 42999ebb4caSwyllys char *dir = NULL; 43099ebb4caSwyllys char *prefix = NULL; 43199ebb4caSwyllys char *infile = NULL; 43299ebb4caSwyllys char *object_label = NULL; 43399ebb4caSwyllys char *serstr = NULL; 4347711facfSdinak 43599ebb4caSwyllys int oclass = 0; 43699ebb4caSwyllys KMF_BIGINT serial = { NULL, 0 }; 43799ebb4caSwyllys KMF_HANDLE_T kmfhandle = NULL; 43899ebb4caSwyllys KMF_KEYSTORE_TYPE kstype = 0; 43999ebb4caSwyllys KMF_RETURN kmfrv; 44099ebb4caSwyllys int rv = 0; 44199ebb4caSwyllys char *find_criteria = NULL; 44299ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 44399ebb4caSwyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 4447711facfSdinak 4457711facfSdinak /* Parse command line options. Do NOT i18n/l10n. */ 44649e21299Sdinak while ((opt = getopt_av(argc, argv, 44799ebb4caSwyllys "T:(token)y:(objtype)l:(label)" 44899ebb4caSwyllys "k:(keystore)s:(subject)n:(nickname)" 44999ebb4caSwyllys "d:(dir)p:(prefix)S:(serial)i:(issuer)" 45099ebb4caSwyllys "c:(criteria)" 45199ebb4caSwyllys "f:(infile)")) != EOF) { 45299ebb4caSwyllys 45399ebb4caSwyllys if (EMPTYSTRING(optarg_av)) 45499ebb4caSwyllys return (PK_ERR_USAGE); 4557711facfSdinak switch (opt) { 45649e21299Sdinak case 'T': /* token specifier */ 45749e21299Sdinak if (token_spec) 45849e21299Sdinak return (PK_ERR_USAGE); 45949e21299Sdinak token_spec = optarg_av; 4607711facfSdinak break; 46149e21299Sdinak case 'y': /* object type: public, private, both */ 46299ebb4caSwyllys if (oclass) 46349e21299Sdinak return (PK_ERR_USAGE); 46499ebb4caSwyllys oclass = OT2Int(optarg_av); 46599ebb4caSwyllys if (oclass == -1) 46699ebb4caSwyllys return (PK_ERR_USAGE); 4677711facfSdinak break; 4687711facfSdinak case 'l': /* objects with specific label */ 46999ebb4caSwyllys case 'n': 4707711facfSdinak if (object_label) 4717711facfSdinak return (PK_ERR_USAGE); 47299ebb4caSwyllys object_label = (char *)optarg_av; 47399ebb4caSwyllys break; 47499ebb4caSwyllys case 'k': 47599ebb4caSwyllys kstype = KS2Int(optarg_av); 47699ebb4caSwyllys if (kstype == 0) 47799ebb4caSwyllys return (PK_ERR_USAGE); 47899ebb4caSwyllys break; 47999ebb4caSwyllys case 's': 48099ebb4caSwyllys subject = optarg_av; 48199ebb4caSwyllys break; 48299ebb4caSwyllys case 'i': 48399ebb4caSwyllys issuer = optarg_av; 48499ebb4caSwyllys break; 48599ebb4caSwyllys case 'd': 48699ebb4caSwyllys dir = optarg_av; 48799ebb4caSwyllys break; 48899ebb4caSwyllys case 'p': 48999ebb4caSwyllys prefix = optarg_av; 49099ebb4caSwyllys break; 49199ebb4caSwyllys case 'S': 49299ebb4caSwyllys serstr = optarg_av; 49399ebb4caSwyllys break; 49499ebb4caSwyllys case 'f': 49599ebb4caSwyllys infile = optarg_av; 49699ebb4caSwyllys break; 49799ebb4caSwyllys case 'c': 49899ebb4caSwyllys find_criteria = optarg_av; 49999ebb4caSwyllys if (!strcasecmp(find_criteria, "valid")) 50099ebb4caSwyllys find_criteria_flag = 50199ebb4caSwyllys KMF_NONEXPIRED_CERTS; 50299ebb4caSwyllys else if (!strcasecmp(find_criteria, "expired")) 50399ebb4caSwyllys find_criteria_flag = KMF_EXPIRED_CERTS; 50499ebb4caSwyllys else if (!strcasecmp(find_criteria, "both")) 50599ebb4caSwyllys find_criteria_flag = KMF_ALL_CERTS; 50699ebb4caSwyllys else 50799ebb4caSwyllys return (PK_ERR_USAGE); 5087711facfSdinak break; 5097711facfSdinak default: 5107711facfSdinak return (PK_ERR_USAGE); 5117711facfSdinak break; 5127711facfSdinak } 5137711facfSdinak } 5147711facfSdinak 51599ebb4caSwyllys /* Assume keystore = PKCS#11 if not specified */ 51699ebb4caSwyllys if (kstype == 0) 51799ebb4caSwyllys kstype = KMF_KEYSTORE_PK11TOKEN; 51899ebb4caSwyllys 51999ebb4caSwyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 52099ebb4caSwyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 52199ebb4caSwyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 52299ebb4caSwyllys 52399ebb4caSwyllys (void) fprintf(stderr, gettext("The objtype parameter " 52499ebb4caSwyllys "is only relevant if keystore=pkcs11\n")); 52549e21299Sdinak return (PK_ERR_USAGE); 52649e21299Sdinak } 52749e21299Sdinak 52899ebb4caSwyllys /* If no object class specified, delete everything but CRLs */ 52999ebb4caSwyllys if (oclass == 0) 53099ebb4caSwyllys oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ | 53199ebb4caSwyllys PK_SYMKEY_OBJ; 5327711facfSdinak 5337711facfSdinak /* No additional args allowed. */ 53449e21299Sdinak argc -= optind_av; 53549e21299Sdinak argv += optind_av; 5367711facfSdinak if (argc) 5377711facfSdinak return (PK_ERR_USAGE); 5387711facfSdinak /* Done parsing command line options. */ 5397711facfSdinak 54099ebb4caSwyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) { 54199ebb4caSwyllys token_spec = PK_DEFAULT_PK11TOKEN; 54299ebb4caSwyllys } else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) { 54399ebb4caSwyllys token_spec = DEFAULT_NSS_TOKEN; 5447711facfSdinak } 5457711facfSdinak 54699ebb4caSwyllys if (serstr != NULL) { 54799ebb4caSwyllys uchar_t *bytes = NULL; 54899ebb4caSwyllys size_t bytelen; 54999ebb4caSwyllys 55099ebb4caSwyllys rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen); 55199ebb4caSwyllys if (rv != KMF_OK || bytes == NULL) { 55299ebb4caSwyllys (void) fprintf(stderr, gettext("serial number " 55399ebb4caSwyllys "must be specified as a hex number " 55499ebb4caSwyllys "(ex: 0x0102030405ffeeddee)\n")); 55599ebb4caSwyllys return (PK_ERR_USAGE); 55699ebb4caSwyllys } 55799ebb4caSwyllys serial.val = bytes; 55899ebb4caSwyllys serial.len = bytelen; 5597711facfSdinak } 5607711facfSdinak 56199ebb4caSwyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 56299ebb4caSwyllys kstype == KMF_KEYSTORE_NSS) && 56399ebb4caSwyllys (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) { 56499ebb4caSwyllys 56599ebb4caSwyllys (void) get_token_password(kstype, token_spec, 56699ebb4caSwyllys &tokencred); 5677711facfSdinak } 5687711facfSdinak 56999ebb4caSwyllys if ((kmfrv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) 57099ebb4caSwyllys return (kmfrv); 5717711facfSdinak 57299ebb4caSwyllys switch (kstype) { 57399ebb4caSwyllys case KMF_KEYSTORE_PK11TOKEN: 57499ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 57599ebb4caSwyllys kmfrv = delete_pk11_keys(kmfhandle, 57699ebb4caSwyllys token_spec, oclass, 57799ebb4caSwyllys object_label, 57899ebb4caSwyllys &tokencred); 5797711facfSdinak /* 58099ebb4caSwyllys * If deleting groups of objects, it is OK 58199ebb4caSwyllys * to ignore the "key not found" case so that 58299ebb4caSwyllys * we can continue to find other objects. 5837711facfSdinak */ 58499ebb4caSwyllys if (kmfrv == KMF_ERR_KEY_NOT_FOUND && 58599ebb4caSwyllys (oclass != PK_KEY_OBJ)) 58699ebb4caSwyllys kmfrv = KMF_OK; 58799ebb4caSwyllys if (kmfrv != KMF_OK) 58899ebb4caSwyllys break; 5897711facfSdinak } 59099ebb4caSwyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 59199ebb4caSwyllys kmfrv = delete_pk11_certs(kmfhandle, 59299ebb4caSwyllys token_spec, 59399ebb4caSwyllys object_label, 59499ebb4caSwyllys &serial, issuer, 59599ebb4caSwyllys subject, find_criteria_flag); 59699ebb4caSwyllys /* 59799ebb4caSwyllys * If cert delete failed, but we are looking at 59899ebb4caSwyllys * other objects, then it is OK. 59999ebb4caSwyllys */ 60099ebb4caSwyllys if (kmfrv == KMF_ERR_CERT_NOT_FOUND && 60199ebb4caSwyllys (oclass & (PK_CRL_OBJ | PK_KEY_OBJ))) 60299ebb4caSwyllys kmfrv = KMF_OK; 60399ebb4caSwyllys if (kmfrv != KMF_OK) 60499ebb4caSwyllys break; 6057711facfSdinak } 60699ebb4caSwyllys if (oclass & PK_CRL_OBJ) 60799ebb4caSwyllys kmfrv = delete_file_crl(kmfhandle, 60899ebb4caSwyllys dir, infile); 60999ebb4caSwyllys break; 61099ebb4caSwyllys case KMF_KEYSTORE_NSS: 61199ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 61299ebb4caSwyllys kmfrv = delete_nss_keys(kmfhandle, 61399ebb4caSwyllys dir, prefix, token_spec, 61499ebb4caSwyllys oclass, (char *)object_label, 61599ebb4caSwyllys &tokencred); 61699ebb4caSwyllys if (kmfrv != KMF_OK) 61799ebb4caSwyllys break; 61899ebb4caSwyllys } 61999ebb4caSwyllys if (oclass & PK_CERT_OBJ) { 62099ebb4caSwyllys kmfrv = delete_nss_certs(kmfhandle, 62199ebb4caSwyllys dir, prefix, token_spec, 62299ebb4caSwyllys (char *)object_label, 62399ebb4caSwyllys &serial, issuer, subject, 62499ebb4caSwyllys find_criteria_flag); 62599ebb4caSwyllys if (kmfrv != KMF_OK) 62699ebb4caSwyllys break; 62799ebb4caSwyllys } 62899ebb4caSwyllys if (oclass & PK_CRL_OBJ) 62999ebb4caSwyllys kmfrv = delete_nss_crl(kmfhandle, 63099ebb4caSwyllys dir, prefix, token_spec, 63199ebb4caSwyllys (char *)object_label, subject); 63299ebb4caSwyllys break; 63399ebb4caSwyllys case KMF_KEYSTORE_OPENSSL: 63499ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 63599ebb4caSwyllys kmfrv = delete_file_keys(kmfhandle, oclass, 63699ebb4caSwyllys dir, infile); 63799ebb4caSwyllys if (kmfrv != KMF_OK) 63899ebb4caSwyllys break; 63999ebb4caSwyllys } 64099ebb4caSwyllys if (oclass & (PK_CERT_OBJ)) { 64199ebb4caSwyllys kmfrv = delete_file_certs(kmfhandle, 64299ebb4caSwyllys dir, infile, &serial, issuer, 64399ebb4caSwyllys subject, find_criteria_flag); 64499ebb4caSwyllys if (kmfrv != KMF_OK) 64599ebb4caSwyllys break; 64699ebb4caSwyllys } 64799ebb4caSwyllys if (oclass & PK_CRL_OBJ) 64899ebb4caSwyllys kmfrv = delete_file_crl(kmfhandle, 64999ebb4caSwyllys dir, infile); 65099ebb4caSwyllys break; 65199ebb4caSwyllys default: 65299ebb4caSwyllys rv = PK_ERR_USAGE; 65399ebb4caSwyllys break; 6547711facfSdinak } 6557711facfSdinak 65699ebb4caSwyllys if (kmfrv != KMF_OK) { 65799ebb4caSwyllys display_error(kmfhandle, kmfrv, 65899ebb4caSwyllys gettext("Error deleting objects")); 6597711facfSdinak } 6607711facfSdinak 66199ebb4caSwyllys if (serial.val != NULL) 66299ebb4caSwyllys free(serial.val); 66399ebb4caSwyllys (void) KMF_Finalize(kmfhandle); 66499ebb4caSwyllys return (kmfrv); 6657711facfSdinak } 666