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 /* 2271593db2Swyllys * 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 42*30a5e8faSwyllys pk_destroy_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr) 4399ebb4caSwyllys { 4499ebb4caSwyllys int i; 4599ebb4caSwyllys KMF_RETURN rv = KMF_OK; 46*30a5e8faSwyllys uint32_t *numkeys; 47*30a5e8faSwyllys KMF_KEY_HANDLE *keys = NULL; 48*30a5e8faSwyllys int del_num = 0; 49*30a5e8faSwyllys KMF_ATTRIBUTE delete_attlist[16]; 50*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype; 51*30a5e8faSwyllys uint32_t len; 52*30a5e8faSwyllys boolean_t destroy = B_TRUE; 53*30a5e8faSwyllys KMF_CREDENTIAL cred; 54*30a5e8faSwyllys char *slotlabel = NULL; 5599ebb4caSwyllys 56*30a5e8faSwyllys len = sizeof (kstype); 57*30a5e8faSwyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 58*30a5e8faSwyllys &kstype, &len); 59*30a5e8faSwyllys if (rv != KMF_OK) 60*30a5e8faSwyllys return (rv); 6199ebb4caSwyllys 62*30a5e8faSwyllys kmf_set_attr_at_index(delete_attlist, del_num, 63*30a5e8faSwyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 64*30a5e8faSwyllys del_num++; 65*30a5e8faSwyllys 66*30a5e8faSwyllys /* "destroy" is optional. Default is TRUE */ 67*30a5e8faSwyllys (void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr, 68*30a5e8faSwyllys (void *)&destroy, NULL); 69*30a5e8faSwyllys 70*30a5e8faSwyllys kmf_set_attr_at_index(delete_attlist, del_num, 71*30a5e8faSwyllys KMF_DESTROY_BOOL_ATTR, &destroy, sizeof (boolean_t)); 72*30a5e8faSwyllys del_num++; 73*30a5e8faSwyllys 74*30a5e8faSwyllys switch (kstype) { 7599ebb4caSwyllys case KMF_KEYSTORE_NSS: 76*30a5e8faSwyllys rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr, 77*30a5e8faSwyllys (void *)&cred, NULL); 78*30a5e8faSwyllys if (rv == KMF_OK) { 79*30a5e8faSwyllys if (cred.credlen > 0) { 80*30a5e8faSwyllys kmf_set_attr_at_index(delete_attlist, del_num, 81*30a5e8faSwyllys KMF_CREDENTIAL_ATTR, &cred, 82*30a5e8faSwyllys sizeof (KMF_CREDENTIAL)); 83*30a5e8faSwyllys del_num++; 84*30a5e8faSwyllys } 85*30a5e8faSwyllys } 86*30a5e8faSwyllys 87*30a5e8faSwyllys slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist, 88*30a5e8faSwyllys numattr); 89*30a5e8faSwyllys if (slotlabel != NULL) { 90*30a5e8faSwyllys kmf_set_attr_at_index(delete_attlist, del_num, 91*30a5e8faSwyllys KMF_TOKEN_LABEL_ATTR, slotlabel, 92*30a5e8faSwyllys strlen(slotlabel)); 93*30a5e8faSwyllys del_num++; 94*30a5e8faSwyllys } 9599ebb4caSwyllys break; 9699ebb4caSwyllys case KMF_KEYSTORE_OPENSSL: 9799ebb4caSwyllys break; 9899ebb4caSwyllys case KMF_KEYSTORE_PK11TOKEN: 99*30a5e8faSwyllys rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr, 100*30a5e8faSwyllys (void *)&cred, NULL); 101*30a5e8faSwyllys if (rv == KMF_OK) { 102*30a5e8faSwyllys if (cred.credlen > 0) { 103*30a5e8faSwyllys kmf_set_attr_at_index(delete_attlist, del_num, 104*30a5e8faSwyllys KMF_CREDENTIAL_ATTR, &cred, 105*30a5e8faSwyllys sizeof (KMF_CREDENTIAL)); 106*30a5e8faSwyllys del_num++; 107*30a5e8faSwyllys } 108*30a5e8faSwyllys } 10999ebb4caSwyllys break; 11099ebb4caSwyllys default: 11199ebb4caSwyllys return (PK_ERR_USAGE); 11299ebb4caSwyllys } 11399ebb4caSwyllys 114*30a5e8faSwyllys numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr); 115*30a5e8faSwyllys if (numkeys == NULL) 116*30a5e8faSwyllys return (PK_ERR_USAGE); 117*30a5e8faSwyllys 118*30a5e8faSwyllys keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr); 119*30a5e8faSwyllys if (keys == NULL) 120*30a5e8faSwyllys return (PK_ERR_USAGE); 121*30a5e8faSwyllys 122*30a5e8faSwyllys for (i = 0; rv == KMF_OK && i < *numkeys; i++) { 123*30a5e8faSwyllys int num = del_num; 124*30a5e8faSwyllys 125*30a5e8faSwyllys kmf_set_attr_at_index(delete_attlist, num, 126*30a5e8faSwyllys KMF_KEY_HANDLE_ATTR, &keys[i], sizeof (KMF_KEY_HANDLE)); 127*30a5e8faSwyllys num++; 128*30a5e8faSwyllys 129*30a5e8faSwyllys rv = kmf_delete_key_from_keystore(handle, num, delete_attlist); 13099ebb4caSwyllys } 13199ebb4caSwyllys return (rv); 13299ebb4caSwyllys } 13399ebb4caSwyllys 13499ebb4caSwyllys static KMF_RETURN 135*30a5e8faSwyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr, 136*30a5e8faSwyllys char *desc, int *keysdeleted) 13799ebb4caSwyllys { 13899ebb4caSwyllys KMF_RETURN rv = KMF_OK; 13999ebb4caSwyllys uint32_t numkeys = 0; 140*30a5e8faSwyllys int num = numattr; 14199ebb4caSwyllys 14299ebb4caSwyllys *keysdeleted = 0; 14399ebb4caSwyllys numkeys = 0; 144*30a5e8faSwyllys 145*30a5e8faSwyllys kmf_set_attr_at_index(attlist, num, 146*30a5e8faSwyllys KMF_COUNT_ATTR, &numkeys, sizeof (uint32_t)); 147*30a5e8faSwyllys num++; 148*30a5e8faSwyllys 149*30a5e8faSwyllys rv = kmf_find_key(kmfhandle, num, attlist); 150*30a5e8faSwyllys 15199ebb4caSwyllys if (rv == KMF_OK && numkeys > 0) { 15299ebb4caSwyllys KMF_KEY_HANDLE *keys = NULL; 15399ebb4caSwyllys char prompt[1024]; 15499ebb4caSwyllys 15599ebb4caSwyllys (void) snprintf(prompt, sizeof (prompt), 15699ebb4caSwyllys gettext("%d %s key(s) found, do you want " 15799ebb4caSwyllys "to delete them (y/N) ?"), numkeys, 15899ebb4caSwyllys (desc != NULL ? desc : "")); 15999ebb4caSwyllys 16099ebb4caSwyllys if (!yesno(prompt, 16199ebb4caSwyllys gettext("Respond with yes or no.\n"), 16299ebb4caSwyllys B_FALSE)) { 16399ebb4caSwyllys return (KMF_OK); 16499ebb4caSwyllys } 16599ebb4caSwyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 16699ebb4caSwyllys sizeof (KMF_KEY_HANDLE)); 16799ebb4caSwyllys if (keys == NULL) 16899ebb4caSwyllys return (KMF_ERR_MEMORY); 16999ebb4caSwyllys (void) memset(keys, 0, numkeys * 17099ebb4caSwyllys sizeof (KMF_KEY_HANDLE)); 17199ebb4caSwyllys 172*30a5e8faSwyllys kmf_set_attr_at_index(attlist, num, 173*30a5e8faSwyllys KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE)); 174*30a5e8faSwyllys num++; 175*30a5e8faSwyllys 176*30a5e8faSwyllys rv = kmf_find_key(kmfhandle, num, attlist); 17799ebb4caSwyllys if (rv == KMF_OK) { 178*30a5e8faSwyllys rv = pk_destroy_keys(kmfhandle, attlist, num); 17999ebb4caSwyllys } 18099ebb4caSwyllys 18199ebb4caSwyllys free(keys); 18299ebb4caSwyllys } 18399ebb4caSwyllys 18499ebb4caSwyllys if (rv == KMF_ERR_KEY_NOT_FOUND) { 18599ebb4caSwyllys rv = KMF_OK; 18699ebb4caSwyllys } 18799ebb4caSwyllys 18899ebb4caSwyllys *keysdeleted = numkeys; 18999ebb4caSwyllys return (rv); 19099ebb4caSwyllys } 19199ebb4caSwyllys 19299ebb4caSwyllys static KMF_RETURN 193*30a5e8faSwyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr) 19499ebb4caSwyllys { 19599ebb4caSwyllys KMF_RETURN rv = KMF_OK; 19699ebb4caSwyllys uint32_t numcerts = 0; 197*30a5e8faSwyllys int num = numattr; 19899ebb4caSwyllys 199*30a5e8faSwyllys kmf_set_attr_at_index(attlist, num, 200*30a5e8faSwyllys KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t)); 201*30a5e8faSwyllys num++; 202*30a5e8faSwyllys 203*30a5e8faSwyllys rv = kmf_find_cert(kmfhandle, num, attlist); 20499ebb4caSwyllys if (rv == KMF_OK && numcerts > 0) { 20599ebb4caSwyllys char prompt[1024]; 20699ebb4caSwyllys (void) snprintf(prompt, sizeof (prompt), 20799ebb4caSwyllys gettext("%d certificate(s) found, do you want " 20899ebb4caSwyllys "to delete them (y/N) ?"), numcerts); 20999ebb4caSwyllys 21099ebb4caSwyllys if (!yesno(prompt, 21199ebb4caSwyllys gettext("Respond with yes or no.\n"), 21299ebb4caSwyllys B_FALSE)) { 21399ebb4caSwyllys return (KMF_OK); 21499ebb4caSwyllys } 21599ebb4caSwyllys 216*30a5e8faSwyllys /* 217*30a5e8faSwyllys * Use numattr because delete cert does not require 218*30a5e8faSwyllys * KMF_COUNT_ATTR attribute. 219*30a5e8faSwyllys */ 220*30a5e8faSwyllys rv = kmf_delete_cert_from_keystore(kmfhandle, numattr, attlist); 22199ebb4caSwyllys 22299ebb4caSwyllys } else if (rv == KMF_ERR_CERT_NOT_FOUND) { 22399ebb4caSwyllys rv = KMF_OK; 22499ebb4caSwyllys } 22599ebb4caSwyllys 22699ebb4caSwyllys return (rv); 22799ebb4caSwyllys } 22899ebb4caSwyllys 22999ebb4caSwyllys static KMF_RETURN 23099ebb4caSwyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix, 23199ebb4caSwyllys char *token, int oclass, char *objlabel, 23299ebb4caSwyllys KMF_CREDENTIAL *tokencred) 23399ebb4caSwyllys { 23499ebb4caSwyllys KMF_RETURN rv = KMF_OK; 23599ebb4caSwyllys char *keytype = NULL; 23699ebb4caSwyllys int nk, numkeys = 0; 237*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 238*30a5e8faSwyllys int numattr = 0; 239*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[16]; 240*30a5e8faSwyllys KMF_KEY_CLASS keyclass; 24199ebb4caSwyllys 24299ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 24399ebb4caSwyllys if (rv != KMF_OK) 24499ebb4caSwyllys return (rv); 24599ebb4caSwyllys 246*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 247*30a5e8faSwyllys &kstype, sizeof (kstype)); 248*30a5e8faSwyllys numattr++; 249*30a5e8faSwyllys 250*30a5e8faSwyllys if (objlabel != NULL) { 251*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR, 252*30a5e8faSwyllys objlabel, strlen(objlabel)); 253*30a5e8faSwyllys numattr++; 254*30a5e8faSwyllys } 255*30a5e8faSwyllys 256*30a5e8faSwyllys if (tokencred->credlen > 0) { 257*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR, 258*30a5e8faSwyllys tokencred, sizeof (KMF_CREDENTIAL)); 259*30a5e8faSwyllys numattr++; 260*30a5e8faSwyllys } 261*30a5e8faSwyllys 262*30a5e8faSwyllys if (token && strlen(token)) { 263*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR, 264*30a5e8faSwyllys token, strlen(token)); 265*30a5e8faSwyllys numattr++; 266*30a5e8faSwyllys } 26799ebb4caSwyllys 26899ebb4caSwyllys if (oclass & PK_PRIKEY_OBJ) { 269*30a5e8faSwyllys int num = numattr; 270*30a5e8faSwyllys 271*30a5e8faSwyllys keyclass = KMF_ASYM_PRI; 272*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 273*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 274*30a5e8faSwyllys num++; 275*30a5e8faSwyllys 27699ebb4caSwyllys keytype = "private"; 277*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 27899ebb4caSwyllys numkeys += nk; 27999ebb4caSwyllys } 28099ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 281*30a5e8faSwyllys int num = numattr; 282*30a5e8faSwyllys 283*30a5e8faSwyllys keyclass = KMF_SYMMETRIC; 284*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 285*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 286*30a5e8faSwyllys num++; 287*30a5e8faSwyllys 28899ebb4caSwyllys keytype = "symmetric"; 289*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 29099ebb4caSwyllys numkeys += nk; 29199ebb4caSwyllys } 29299ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 293*30a5e8faSwyllys int num = numattr; 294*30a5e8faSwyllys 295*30a5e8faSwyllys keyclass = KMF_ASYM_PUB; 296*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 297*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 298*30a5e8faSwyllys num++; 299*30a5e8faSwyllys 30099ebb4caSwyllys keytype = "public"; 301*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &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 31199ebb4caSwyllys static KMF_RETURN 31299ebb4caSwyllys delete_nss_certs(KMF_HANDLE_T kmfhandle, 31399ebb4caSwyllys char *dir, char *prefix, 31499ebb4caSwyllys char *token, char *objlabel, 31599ebb4caSwyllys KMF_BIGINT *serno, char *issuer, char *subject, 31699ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag) 31799ebb4caSwyllys { 31899ebb4caSwyllys KMF_RETURN rv = KMF_OK; 319*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 320*30a5e8faSwyllys int numattr = 0; 321*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[16]; 32299ebb4caSwyllys 32399ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 32499ebb4caSwyllys if (rv != KMF_OK) 32599ebb4caSwyllys return (rv); 32699ebb4caSwyllys 327*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 328*30a5e8faSwyllys &kstype, sizeof (kstype)); 329*30a5e8faSwyllys numattr++; 33099ebb4caSwyllys 331*30a5e8faSwyllys if (objlabel != NULL) { 332*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, 333*30a5e8faSwyllys KMF_CERT_LABEL_ATTR, objlabel, 334*30a5e8faSwyllys strlen(objlabel)); 335*30a5e8faSwyllys numattr++; 336*30a5e8faSwyllys } 33799ebb4caSwyllys 338*30a5e8faSwyllys if (issuer != NULL) { 339*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, 340*30a5e8faSwyllys KMF_ISSUER_NAME_ATTR, issuer, 341*30a5e8faSwyllys strlen(issuer)); 342*30a5e8faSwyllys numattr++; 343*30a5e8faSwyllys } 344*30a5e8faSwyllys 345*30a5e8faSwyllys if (subject != NULL) { 346*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, 347*30a5e8faSwyllys KMF_SUBJECT_NAME_ATTR, subject, 348*30a5e8faSwyllys strlen(subject)); 349*30a5e8faSwyllys numattr++; 350*30a5e8faSwyllys } 351*30a5e8faSwyllys 352*30a5e8faSwyllys if (serno != NULL) { 353*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, 354*30a5e8faSwyllys KMF_BIGINT_ATTR, serno, 355*30a5e8faSwyllys sizeof (KMF_BIGINT)); 356*30a5e8faSwyllys numattr++; 357*30a5e8faSwyllys } 358*30a5e8faSwyllys 359*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, 360*30a5e8faSwyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 361*30a5e8faSwyllys sizeof (KMF_CERT_VALIDITY)); 362*30a5e8faSwyllys numattr++; 363*30a5e8faSwyllys 364*30a5e8faSwyllys if (token != NULL) { 365*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, 366*30a5e8faSwyllys KMF_TOKEN_LABEL_ATTR, token, 367*30a5e8faSwyllys strlen(token)); 368*30a5e8faSwyllys numattr++; 369*30a5e8faSwyllys } 370*30a5e8faSwyllys 371*30a5e8faSwyllys rv = pk_delete_certs(kmfhandle, attrlist, numattr); 37299ebb4caSwyllys 37399ebb4caSwyllys return (rv); 37499ebb4caSwyllys } 37599ebb4caSwyllys 37699ebb4caSwyllys static KMF_RETURN 37799ebb4caSwyllys delete_nss_crl(void *kmfhandle, 37899ebb4caSwyllys char *dir, char *prefix, char *token, 379*30a5e8faSwyllys char *issuer, char *subject) 38099ebb4caSwyllys { 38199ebb4caSwyllys KMF_RETURN rv = KMF_OK; 382*30a5e8faSwyllys int numattr = 0; 383*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[8]; 384*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 38599ebb4caSwyllys 38699ebb4caSwyllys rv = configure_nss(kmfhandle, dir, prefix); 38799ebb4caSwyllys if (rv != KMF_OK) 38899ebb4caSwyllys return (rv); 38999ebb4caSwyllys 390*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 391*30a5e8faSwyllys &kstype, sizeof (kstype)); 392*30a5e8faSwyllys numattr++; 39399ebb4caSwyllys 394*30a5e8faSwyllys if (token != NULL) { 395*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR, 396*30a5e8faSwyllys token, strlen(token)); 397*30a5e8faSwyllys numattr++; 398*30a5e8faSwyllys } 399*30a5e8faSwyllys if (issuer != NULL) { 400*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR, 401*30a5e8faSwyllys issuer, strlen(issuer)); 402*30a5e8faSwyllys numattr++; 403*30a5e8faSwyllys } 404*30a5e8faSwyllys if (subject != NULL) { 405*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR, 406*30a5e8faSwyllys subject, strlen(subject)); 407*30a5e8faSwyllys numattr++; 408*30a5e8faSwyllys } 40999ebb4caSwyllys 410*30a5e8faSwyllys rv = kmf_delete_crl(kmfhandle, numattr, attrlist); 41199ebb4caSwyllys 41299ebb4caSwyllys return (rv); 41399ebb4caSwyllys } 41499ebb4caSwyllys 41599ebb4caSwyllys static KMF_RETURN 41699ebb4caSwyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle, 41799ebb4caSwyllys char *token, int oclass, char *objlabel, 41899ebb4caSwyllys KMF_CREDENTIAL *tokencred) 41999ebb4caSwyllys { 42099ebb4caSwyllys KMF_RETURN rv = KMF_OK; 42199ebb4caSwyllys int nk, numkeys = 0; 422*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 423*30a5e8faSwyllys int numattr = 0; 424*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[16]; 425*30a5e8faSwyllys KMF_KEY_CLASS keyclass; 426*30a5e8faSwyllys boolean_t token_bool = B_TRUE; 427*30a5e8faSwyllys KMF_KEY_ALG keytype = 0; 428*30a5e8faSwyllys boolean_t private; 42999ebb4caSwyllys /* 43099ebb4caSwyllys * Symmetric keys and RSA/DSA private keys are always 43199ebb4caSwyllys * created with the "CKA_PRIVATE" field == TRUE, so 43299ebb4caSwyllys * make sure we search for them with it also set. 43399ebb4caSwyllys */ 43499ebb4caSwyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 43599ebb4caSwyllys oclass |= PK_PRIVATE_OBJ; 43699ebb4caSwyllys 43799ebb4caSwyllys rv = select_token(kmfhandle, token, FALSE); 43899ebb4caSwyllys if (rv != KMF_OK) { 43999ebb4caSwyllys return (rv); 44099ebb4caSwyllys } 44199ebb4caSwyllys 442*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 443*30a5e8faSwyllys &kstype, sizeof (kstype)); 444*30a5e8faSwyllys numattr++; 445*30a5e8faSwyllys 446*30a5e8faSwyllys if (objlabel != NULL) { 447*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR, 448*30a5e8faSwyllys objlabel, strlen(objlabel)); 449*30a5e8faSwyllys numattr++; 450*30a5e8faSwyllys } 451*30a5e8faSwyllys 452*30a5e8faSwyllys if (tokencred != NULL && tokencred->credlen > 0) { 453*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR, 454*30a5e8faSwyllys tokencred, sizeof (KMF_CREDENTIAL)); 455*30a5e8faSwyllys numattr++; 456*30a5e8faSwyllys } 457*30a5e8faSwyllys 458*30a5e8faSwyllys private = ((oclass & PK_PRIVATE_OBJ) > 0); 459*30a5e8faSwyllys 460*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR, 461*30a5e8faSwyllys &private, sizeof (private)); 462*30a5e8faSwyllys numattr++; 463*30a5e8faSwyllys 464*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR, 465*30a5e8faSwyllys &keytype, sizeof (keytype)); 466*30a5e8faSwyllys numattr++; 467*30a5e8faSwyllys 468*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR, 469*30a5e8faSwyllys &token_bool, sizeof (token_bool)); 470*30a5e8faSwyllys numattr++; 47199ebb4caSwyllys 47299ebb4caSwyllys if (oclass & PK_PRIKEY_OBJ) { 473*30a5e8faSwyllys int num = numattr; 474*30a5e8faSwyllys 475*30a5e8faSwyllys keyclass = KMF_ASYM_PRI; 476*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 477*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 478*30a5e8faSwyllys num++; 479*30a5e8faSwyllys 480*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, "private", &nk); 48199ebb4caSwyllys numkeys += nk; 48299ebb4caSwyllys } 48399ebb4caSwyllys 48499ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 485*30a5e8faSwyllys int num = numattr; 486*30a5e8faSwyllys 487*30a5e8faSwyllys keyclass = KMF_SYMMETRIC; 488*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 489*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 490*30a5e8faSwyllys num++; 491*30a5e8faSwyllys 492*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, "symmetric", &nk); 49399ebb4caSwyllys numkeys += nk; 49499ebb4caSwyllys } 49599ebb4caSwyllys 49699ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 497*30a5e8faSwyllys int num = numattr; 498*30a5e8faSwyllys 499*30a5e8faSwyllys keyclass = KMF_ASYM_PUB; 500*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 501*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 502*30a5e8faSwyllys num++; 503*30a5e8faSwyllys 504*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, "public", &nk); 50599ebb4caSwyllys numkeys += nk; 50699ebb4caSwyllys } 50799ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 50899ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 50999ebb4caSwyllys 51099ebb4caSwyllys return (rv); 51199ebb4caSwyllys } 51299ebb4caSwyllys 51399ebb4caSwyllys static KMF_RETURN 51499ebb4caSwyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle, 51599ebb4caSwyllys char *token, char *objlabel, 51699ebb4caSwyllys KMF_BIGINT *serno, char *issuer, char *subject, 51799ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag) 51899ebb4caSwyllys { 51999ebb4caSwyllys KMF_RETURN kmfrv; 520*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 521*30a5e8faSwyllys int numattr = 0; 522*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[16]; 52399ebb4caSwyllys 52499ebb4caSwyllys kmfrv = select_token(kmfhandle, token, FALSE); 52599ebb4caSwyllys 52699ebb4caSwyllys if (kmfrv != KMF_OK) { 52799ebb4caSwyllys return (kmfrv); 52899ebb4caSwyllys } 52999ebb4caSwyllys 530*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 531*30a5e8faSwyllys &kstype, sizeof (kstype)); 532*30a5e8faSwyllys numattr++; 53399ebb4caSwyllys 534*30a5e8faSwyllys if (objlabel != NULL) { 535*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR, 536*30a5e8faSwyllys objlabel, strlen(objlabel)); 537*30a5e8faSwyllys numattr++; 538*30a5e8faSwyllys } 539*30a5e8faSwyllys 540*30a5e8faSwyllys if (issuer != NULL) { 541*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR, 542*30a5e8faSwyllys issuer, strlen(issuer)); 543*30a5e8faSwyllys numattr++; 544*30a5e8faSwyllys } 545*30a5e8faSwyllys 546*30a5e8faSwyllys if (subject != NULL) { 547*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR, 548*30a5e8faSwyllys subject, strlen(subject)); 549*30a5e8faSwyllys numattr++; 550*30a5e8faSwyllys } 551*30a5e8faSwyllys 552*30a5e8faSwyllys if (serno != NULL) { 553*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR, 554*30a5e8faSwyllys serno, sizeof (KMF_BIGINT)); 555*30a5e8faSwyllys numattr++; 556*30a5e8faSwyllys } 557*30a5e8faSwyllys 558*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR, 559*30a5e8faSwyllys &find_criteria_flag, sizeof (KMF_CERT_VALIDITY)); 560*30a5e8faSwyllys numattr++; 561*30a5e8faSwyllys 562*30a5e8faSwyllys kmfrv = pk_delete_certs(kmfhandle, attrlist, numattr); 56399ebb4caSwyllys 56499ebb4caSwyllys return (kmfrv); 56599ebb4caSwyllys } 56699ebb4caSwyllys 56799ebb4caSwyllys static KMF_RETURN 56899ebb4caSwyllys delete_file_certs(KMF_HANDLE_T kmfhandle, 56999ebb4caSwyllys char *dir, char *filename, KMF_BIGINT *serial, char *issuer, 57099ebb4caSwyllys char *subject, KMF_CERT_VALIDITY find_criteria_flag) 57199ebb4caSwyllys { 57299ebb4caSwyllys KMF_RETURN rv; 573*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 574*30a5e8faSwyllys int numattr = 0; 575*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[16]; 57699ebb4caSwyllys 577*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 578*30a5e8faSwyllys &kstype, sizeof (kstype)); 579*30a5e8faSwyllys numattr++; 58099ebb4caSwyllys 581*30a5e8faSwyllys if (issuer != NULL) { 582*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR, 583*30a5e8faSwyllys issuer, strlen(issuer)); 584*30a5e8faSwyllys numattr++; 585*30a5e8faSwyllys } 58699ebb4caSwyllys 587*30a5e8faSwyllys if (subject != NULL) { 588*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR, 589*30a5e8faSwyllys subject, strlen(subject)); 590*30a5e8faSwyllys numattr++; 591*30a5e8faSwyllys } 592*30a5e8faSwyllys 593*30a5e8faSwyllys if (serial != NULL) { 594*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR, 595*30a5e8faSwyllys serial, sizeof (KMF_BIGINT)); 596*30a5e8faSwyllys numattr++; 597*30a5e8faSwyllys } 598*30a5e8faSwyllys 599*30a5e8faSwyllys if (dir != NULL) { 600*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR, 601*30a5e8faSwyllys dir, strlen(dir)); 602*30a5e8faSwyllys numattr++; 603*30a5e8faSwyllys } 604*30a5e8faSwyllys 605*30a5e8faSwyllys if (filename != NULL) { 606*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR, 607*30a5e8faSwyllys filename, strlen(filename)); 608*30a5e8faSwyllys numattr++; 609*30a5e8faSwyllys } 610*30a5e8faSwyllys 611*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR, 612*30a5e8faSwyllys &find_criteria_flag, sizeof (KMF_CERT_VALIDITY)); 613*30a5e8faSwyllys numattr++; 614*30a5e8faSwyllys 615*30a5e8faSwyllys rv = pk_delete_certs(kmfhandle, attrlist, numattr); 61699ebb4caSwyllys 61799ebb4caSwyllys return (rv); 61899ebb4caSwyllys } 61999ebb4caSwyllys 62099ebb4caSwyllys static KMF_RETURN 62199ebb4caSwyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass, 62299ebb4caSwyllys char *dir, char *infile) 62399ebb4caSwyllys { 62499ebb4caSwyllys KMF_RETURN rv = KMF_OK; 62599ebb4caSwyllys char *keytype = ""; 62699ebb4caSwyllys int nk, numkeys = 0; 627*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 628*30a5e8faSwyllys int numattr = 0; 629*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[16]; 630*30a5e8faSwyllys KMF_KEY_CLASS keyclass; 63199ebb4caSwyllys 632*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 633*30a5e8faSwyllys &kstype, sizeof (kstype)); 634*30a5e8faSwyllys numattr++; 635*30a5e8faSwyllys 636*30a5e8faSwyllys if (dir != NULL) { 637*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR, 638*30a5e8faSwyllys dir, strlen(dir)); 639*30a5e8faSwyllys numattr++; 640*30a5e8faSwyllys } 641*30a5e8faSwyllys 642*30a5e8faSwyllys if (infile != NULL) { 643*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR, 644*30a5e8faSwyllys infile, strlen(infile)); 645*30a5e8faSwyllys numattr++; 646*30a5e8faSwyllys } 64799ebb4caSwyllys 64899ebb4caSwyllys if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) { 649*30a5e8faSwyllys int num = numattr; 650*30a5e8faSwyllys 651*30a5e8faSwyllys keyclass = KMF_ASYM_PRI; 652*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 653*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 654*30a5e8faSwyllys num++; 655*30a5e8faSwyllys 65699ebb4caSwyllys keytype = "Asymmetric"; 657*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 65899ebb4caSwyllys numkeys += nk; 65999ebb4caSwyllys } 66099ebb4caSwyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 661*30a5e8faSwyllys int num = numattr; 662*30a5e8faSwyllys 663*30a5e8faSwyllys keyclass = KMF_SYMMETRIC; 664*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 665*30a5e8faSwyllys &keyclass, sizeof (keyclass)); 666*30a5e8faSwyllys num++; 667*30a5e8faSwyllys 66899ebb4caSwyllys keytype = "symmetric"; 669*30a5e8faSwyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 67099ebb4caSwyllys numkeys += nk; 67199ebb4caSwyllys } 67299ebb4caSwyllys if (rv == KMF_OK && numkeys == 0) 67399ebb4caSwyllys rv = KMF_ERR_KEY_NOT_FOUND; 67499ebb4caSwyllys 67599ebb4caSwyllys return (rv); 67699ebb4caSwyllys } 67799ebb4caSwyllys 67899ebb4caSwyllys static KMF_RETURN 67999ebb4caSwyllys delete_file_crl(void *kmfhandle, char *dir, char *filename) 68099ebb4caSwyllys { 68199ebb4caSwyllys KMF_RETURN rv; 682*30a5e8faSwyllys int numattr = 0; 683*30a5e8faSwyllys KMF_ATTRIBUTE attrlist[4]; 684*30a5e8faSwyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 68599ebb4caSwyllys 686*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 687*30a5e8faSwyllys &kstype, sizeof (kstype)); 688*30a5e8faSwyllys numattr++; 68999ebb4caSwyllys 690*30a5e8faSwyllys if (dir) { 691*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR, 692*30a5e8faSwyllys dir, strlen(dir)); 693*30a5e8faSwyllys numattr++; 694*30a5e8faSwyllys } 695*30a5e8faSwyllys if (filename) { 696*30a5e8faSwyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR, 697*30a5e8faSwyllys filename, strlen(filename)); 698*30a5e8faSwyllys numattr++; 699*30a5e8faSwyllys } 70099ebb4caSwyllys 701*30a5e8faSwyllys rv = kmf_delete_crl(kmfhandle, numattr, attrlist); 70299ebb4caSwyllys 70399ebb4caSwyllys return (rv); 70499ebb4caSwyllys } 7057711facfSdinak 7067711facfSdinak /* 7077711facfSdinak * Delete token objects. 7087711facfSdinak */ 7097711facfSdinak int 7107711facfSdinak pk_delete(int argc, char *argv[]) 7117711facfSdinak { 7127711facfSdinak int opt; 71349e21299Sdinak extern int optind_av; 71449e21299Sdinak extern char *optarg_av; 71549e21299Sdinak char *token_spec = NULL; 71699ebb4caSwyllys char *subject = NULL; 71799ebb4caSwyllys char *issuer = NULL; 71899ebb4caSwyllys char *dir = NULL; 71999ebb4caSwyllys char *prefix = NULL; 72099ebb4caSwyllys char *infile = NULL; 72199ebb4caSwyllys char *object_label = NULL; 72299ebb4caSwyllys char *serstr = NULL; 7237711facfSdinak 72499ebb4caSwyllys int oclass = 0; 72599ebb4caSwyllys KMF_BIGINT serial = { NULL, 0 }; 72699ebb4caSwyllys KMF_HANDLE_T kmfhandle = NULL; 72799ebb4caSwyllys KMF_KEYSTORE_TYPE kstype = 0; 72899ebb4caSwyllys KMF_RETURN kmfrv; 72999ebb4caSwyllys int rv = 0; 73099ebb4caSwyllys char *find_criteria = NULL; 73199ebb4caSwyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 73299ebb4caSwyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 7337711facfSdinak 7347711facfSdinak /* Parse command line options. Do NOT i18n/l10n. */ 73549e21299Sdinak while ((opt = getopt_av(argc, argv, 73699ebb4caSwyllys "T:(token)y:(objtype)l:(label)" 73799ebb4caSwyllys "k:(keystore)s:(subject)n:(nickname)" 73899ebb4caSwyllys "d:(dir)p:(prefix)S:(serial)i:(issuer)" 73999ebb4caSwyllys "c:(criteria)" 74099ebb4caSwyllys "f:(infile)")) != EOF) { 74199ebb4caSwyllys 74299ebb4caSwyllys if (EMPTYSTRING(optarg_av)) 74399ebb4caSwyllys return (PK_ERR_USAGE); 7447711facfSdinak switch (opt) { 74549e21299Sdinak case 'T': /* token specifier */ 74649e21299Sdinak if (token_spec) 74749e21299Sdinak return (PK_ERR_USAGE); 74849e21299Sdinak token_spec = optarg_av; 7497711facfSdinak break; 75049e21299Sdinak case 'y': /* object type: public, private, both */ 75199ebb4caSwyllys if (oclass) 75249e21299Sdinak return (PK_ERR_USAGE); 75399ebb4caSwyllys oclass = OT2Int(optarg_av); 75499ebb4caSwyllys if (oclass == -1) 75599ebb4caSwyllys return (PK_ERR_USAGE); 7567711facfSdinak break; 7577711facfSdinak case 'l': /* objects with specific label */ 75899ebb4caSwyllys case 'n': 7597711facfSdinak if (object_label) 7607711facfSdinak return (PK_ERR_USAGE); 76199ebb4caSwyllys object_label = (char *)optarg_av; 76299ebb4caSwyllys break; 76399ebb4caSwyllys case 'k': 76499ebb4caSwyllys kstype = KS2Int(optarg_av); 76599ebb4caSwyllys if (kstype == 0) 76699ebb4caSwyllys return (PK_ERR_USAGE); 76799ebb4caSwyllys break; 76899ebb4caSwyllys case 's': 76999ebb4caSwyllys subject = optarg_av; 77099ebb4caSwyllys break; 77199ebb4caSwyllys case 'i': 77299ebb4caSwyllys issuer = optarg_av; 77399ebb4caSwyllys break; 77499ebb4caSwyllys case 'd': 77599ebb4caSwyllys dir = optarg_av; 77699ebb4caSwyllys break; 77799ebb4caSwyllys case 'p': 77899ebb4caSwyllys prefix = optarg_av; 77999ebb4caSwyllys break; 78099ebb4caSwyllys case 'S': 78199ebb4caSwyllys serstr = optarg_av; 78299ebb4caSwyllys break; 78399ebb4caSwyllys case 'f': 78499ebb4caSwyllys infile = optarg_av; 78599ebb4caSwyllys break; 78699ebb4caSwyllys case 'c': 78799ebb4caSwyllys find_criteria = optarg_av; 78899ebb4caSwyllys if (!strcasecmp(find_criteria, "valid")) 78999ebb4caSwyllys find_criteria_flag = 79099ebb4caSwyllys KMF_NONEXPIRED_CERTS; 79199ebb4caSwyllys else if (!strcasecmp(find_criteria, "expired")) 79299ebb4caSwyllys find_criteria_flag = KMF_EXPIRED_CERTS; 79399ebb4caSwyllys else if (!strcasecmp(find_criteria, "both")) 79499ebb4caSwyllys find_criteria_flag = KMF_ALL_CERTS; 79599ebb4caSwyllys else 79699ebb4caSwyllys return (PK_ERR_USAGE); 7977711facfSdinak break; 7987711facfSdinak default: 7997711facfSdinak return (PK_ERR_USAGE); 8007711facfSdinak break; 8017711facfSdinak } 8027711facfSdinak } 8037711facfSdinak 80499ebb4caSwyllys /* Assume keystore = PKCS#11 if not specified */ 80599ebb4caSwyllys if (kstype == 0) 80699ebb4caSwyllys kstype = KMF_KEYSTORE_PK11TOKEN; 80799ebb4caSwyllys 80899ebb4caSwyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 80999ebb4caSwyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 81099ebb4caSwyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 81199ebb4caSwyllys 81299ebb4caSwyllys (void) fprintf(stderr, gettext("The objtype parameter " 81399ebb4caSwyllys "is only relevant if keystore=pkcs11\n")); 81449e21299Sdinak return (PK_ERR_USAGE); 81549e21299Sdinak } 81649e21299Sdinak 81799ebb4caSwyllys /* If no object class specified, delete everything but CRLs */ 81899ebb4caSwyllys if (oclass == 0) 81999ebb4caSwyllys oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ | 82099ebb4caSwyllys PK_SYMKEY_OBJ; 8217711facfSdinak 8227711facfSdinak /* No additional args allowed. */ 82349e21299Sdinak argc -= optind_av; 82449e21299Sdinak argv += optind_av; 8257711facfSdinak if (argc) 8267711facfSdinak return (PK_ERR_USAGE); 8277711facfSdinak /* Done parsing command line options. */ 8287711facfSdinak 82999ebb4caSwyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) { 83099ebb4caSwyllys token_spec = PK_DEFAULT_PK11TOKEN; 83199ebb4caSwyllys } else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) { 83299ebb4caSwyllys token_spec = DEFAULT_NSS_TOKEN; 8337711facfSdinak } 8347711facfSdinak 83599ebb4caSwyllys if (serstr != NULL) { 83699ebb4caSwyllys uchar_t *bytes = NULL; 83799ebb4caSwyllys size_t bytelen; 83899ebb4caSwyllys 839*30a5e8faSwyllys rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen); 84099ebb4caSwyllys if (rv != KMF_OK || bytes == NULL) { 84199ebb4caSwyllys (void) fprintf(stderr, gettext("serial number " 84299ebb4caSwyllys "must be specified as a hex number " 84399ebb4caSwyllys "(ex: 0x0102030405ffeeddee)\n")); 84499ebb4caSwyllys return (PK_ERR_USAGE); 84599ebb4caSwyllys } 84699ebb4caSwyllys serial.val = bytes; 84799ebb4caSwyllys serial.len = bytelen; 8487711facfSdinak } 8497711facfSdinak 85099ebb4caSwyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 85199ebb4caSwyllys kstype == KMF_KEYSTORE_NSS) && 85299ebb4caSwyllys (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) { 85399ebb4caSwyllys 85499ebb4caSwyllys (void) get_token_password(kstype, token_spec, 85599ebb4caSwyllys &tokencred); 8567711facfSdinak } 8577711facfSdinak 858*30a5e8faSwyllys if ((kmfrv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) 85999ebb4caSwyllys return (kmfrv); 8607711facfSdinak 86199ebb4caSwyllys switch (kstype) { 86299ebb4caSwyllys case KMF_KEYSTORE_PK11TOKEN: 86399ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 86499ebb4caSwyllys kmfrv = delete_pk11_keys(kmfhandle, 86599ebb4caSwyllys token_spec, oclass, 866*30a5e8faSwyllys object_label, &tokencred); 8677711facfSdinak /* 86899ebb4caSwyllys * If deleting groups of objects, it is OK 86999ebb4caSwyllys * to ignore the "key not found" case so that 87099ebb4caSwyllys * we can continue to find other objects. 8717711facfSdinak */ 87299ebb4caSwyllys if (kmfrv == KMF_ERR_KEY_NOT_FOUND && 87399ebb4caSwyllys (oclass != PK_KEY_OBJ)) 87499ebb4caSwyllys kmfrv = KMF_OK; 87599ebb4caSwyllys if (kmfrv != KMF_OK) 87699ebb4caSwyllys break; 8777711facfSdinak } 87899ebb4caSwyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 87999ebb4caSwyllys kmfrv = delete_pk11_certs(kmfhandle, 880*30a5e8faSwyllys token_spec, object_label, 88199ebb4caSwyllys &serial, issuer, 88299ebb4caSwyllys subject, find_criteria_flag); 88399ebb4caSwyllys /* 88499ebb4caSwyllys * If cert delete failed, but we are looking at 88599ebb4caSwyllys * other objects, then it is OK. 88699ebb4caSwyllys */ 88799ebb4caSwyllys if (kmfrv == KMF_ERR_CERT_NOT_FOUND && 88899ebb4caSwyllys (oclass & (PK_CRL_OBJ | PK_KEY_OBJ))) 88999ebb4caSwyllys kmfrv = KMF_OK; 89099ebb4caSwyllys if (kmfrv != KMF_OK) 89199ebb4caSwyllys break; 8927711facfSdinak } 89399ebb4caSwyllys if (oclass & PK_CRL_OBJ) 89499ebb4caSwyllys kmfrv = delete_file_crl(kmfhandle, 89599ebb4caSwyllys dir, infile); 89699ebb4caSwyllys break; 89799ebb4caSwyllys case KMF_KEYSTORE_NSS: 89899ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 89999ebb4caSwyllys kmfrv = delete_nss_keys(kmfhandle, 90099ebb4caSwyllys dir, prefix, token_spec, 90199ebb4caSwyllys oclass, (char *)object_label, 90299ebb4caSwyllys &tokencred); 90399ebb4caSwyllys if (kmfrv != KMF_OK) 90499ebb4caSwyllys break; 90599ebb4caSwyllys } 90699ebb4caSwyllys if (oclass & PK_CERT_OBJ) { 90799ebb4caSwyllys kmfrv = delete_nss_certs(kmfhandle, 90899ebb4caSwyllys dir, prefix, token_spec, 90999ebb4caSwyllys (char *)object_label, 91099ebb4caSwyllys &serial, issuer, subject, 91199ebb4caSwyllys find_criteria_flag); 91299ebb4caSwyllys if (kmfrv != KMF_OK) 91399ebb4caSwyllys break; 91499ebb4caSwyllys } 91599ebb4caSwyllys if (oclass & PK_CRL_OBJ) 91699ebb4caSwyllys kmfrv = delete_nss_crl(kmfhandle, 91799ebb4caSwyllys dir, prefix, token_spec, 91899ebb4caSwyllys (char *)object_label, subject); 91999ebb4caSwyllys break; 92099ebb4caSwyllys case KMF_KEYSTORE_OPENSSL: 92199ebb4caSwyllys if (oclass & PK_KEY_OBJ) { 92299ebb4caSwyllys kmfrv = delete_file_keys(kmfhandle, oclass, 92399ebb4caSwyllys dir, infile); 92499ebb4caSwyllys if (kmfrv != KMF_OK) 92599ebb4caSwyllys break; 92699ebb4caSwyllys } 92799ebb4caSwyllys if (oclass & (PK_CERT_OBJ)) { 92899ebb4caSwyllys kmfrv = delete_file_certs(kmfhandle, 92999ebb4caSwyllys dir, infile, &serial, issuer, 93099ebb4caSwyllys subject, find_criteria_flag); 93199ebb4caSwyllys if (kmfrv != KMF_OK) 93299ebb4caSwyllys break; 93399ebb4caSwyllys } 93499ebb4caSwyllys if (oclass & PK_CRL_OBJ) 93599ebb4caSwyllys kmfrv = delete_file_crl(kmfhandle, 93699ebb4caSwyllys dir, infile); 93799ebb4caSwyllys break; 93899ebb4caSwyllys default: 93999ebb4caSwyllys rv = PK_ERR_USAGE; 94099ebb4caSwyllys break; 9417711facfSdinak } 9427711facfSdinak 94399ebb4caSwyllys if (kmfrv != KMF_OK) { 94499ebb4caSwyllys display_error(kmfhandle, kmfrv, 94599ebb4caSwyllys gettext("Error deleting objects")); 9467711facfSdinak } 9477711facfSdinak 94899ebb4caSwyllys if (serial.val != NULL) 94999ebb4caSwyllys free(serial.val); 950*30a5e8faSwyllys (void) kmf_finalize(kmfhandle); 95199ebb4caSwyllys return (kmfrv); 9527711facfSdinak } 953