117Sdinak /* 217Sdinak * CDDL HEADER START 317Sdinak * 417Sdinak * The contents of this file are subject to the terms of the 53089Swyllys * Common Development and Distribution License (the "License"). 63089Swyllys * You may not use this file except in compliance with the License. 717Sdinak * 817Sdinak * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 917Sdinak * or http://www.opensolaris.org/os/licensing. 1017Sdinak * See the License for the specific language governing permissions 1117Sdinak * and limitations under the License. 1217Sdinak * 1317Sdinak * When distributing Covered Code, include this CDDL HEADER in each 1417Sdinak * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1517Sdinak * If applicable, add the following below this CDDL HEADER, with the 1617Sdinak * fields enclosed by brackets "[]" replaced with your own identifying 1717Sdinak * information: Portions Copyright [yyyy] [name of copyright owner] 1817Sdinak * 1917Sdinak * CDDL HEADER END 2017Sdinak */ 2117Sdinak /* 223408Swyllys * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 2317Sdinak * Use is subject to license terms. 2417Sdinak */ 2517Sdinak 2617Sdinak #pragma ident "%Z%%M% %I% %E% SMI" 2717Sdinak 2817Sdinak /* 2917Sdinak * This file implements the token object delete operation for this tool. 3017Sdinak * It loads the PKCS#11 modules, finds the object to delete, deletes it, 3117Sdinak * and cleans up. User must be R/W logged into the token. 3217Sdinak */ 3317Sdinak 3417Sdinak #include <stdio.h> 3517Sdinak #include <string.h> 3617Sdinak #include <cryptoutil.h> 3717Sdinak #include <security/cryptoki.h> 3817Sdinak #include "common.h" 393089Swyllys #include <kmfapi.h> 403089Swyllys 413089Swyllys static KMF_RETURN 42*5051Swyllys pk_destroy_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr) 433089Swyllys { 443089Swyllys int i; 453089Swyllys KMF_RETURN rv = KMF_OK; 46*5051Swyllys uint32_t *numkeys; 47*5051Swyllys KMF_KEY_HANDLE *keys = NULL; 48*5051Swyllys int del_num = 0; 49*5051Swyllys KMF_ATTRIBUTE delete_attlist[16]; 50*5051Swyllys KMF_KEYSTORE_TYPE kstype; 51*5051Swyllys uint32_t len; 52*5051Swyllys boolean_t destroy = B_TRUE; 53*5051Swyllys KMF_CREDENTIAL cred; 54*5051Swyllys char *slotlabel = NULL; 553089Swyllys 56*5051Swyllys len = sizeof (kstype); 57*5051Swyllys rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr, 58*5051Swyllys &kstype, &len); 59*5051Swyllys if (rv != KMF_OK) 60*5051Swyllys return (rv); 61*5051Swyllys 62*5051Swyllys kmf_set_attr_at_index(delete_attlist, del_num, 63*5051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 64*5051Swyllys del_num++; 65*5051Swyllys 66*5051Swyllys /* "destroy" is optional. Default is TRUE */ 67*5051Swyllys (void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr, 68*5051Swyllys (void *)&destroy, NULL); 693089Swyllys 70*5051Swyllys kmf_set_attr_at_index(delete_attlist, del_num, 71*5051Swyllys KMF_DESTROY_BOOL_ATTR, &destroy, sizeof (boolean_t)); 72*5051Swyllys del_num++; 73*5051Swyllys 74*5051Swyllys switch (kstype) { 753089Swyllys case KMF_KEYSTORE_NSS: 76*5051Swyllys rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr, 77*5051Swyllys (void *)&cred, NULL); 78*5051Swyllys if (rv == KMF_OK) { 79*5051Swyllys if (cred.credlen > 0) { 80*5051Swyllys kmf_set_attr_at_index(delete_attlist, del_num, 81*5051Swyllys KMF_CREDENTIAL_ATTR, &cred, 82*5051Swyllys sizeof (KMF_CREDENTIAL)); 83*5051Swyllys del_num++; 84*5051Swyllys } 85*5051Swyllys } 86*5051Swyllys 87*5051Swyllys slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist, 88*5051Swyllys numattr); 89*5051Swyllys if (slotlabel != NULL) { 90*5051Swyllys kmf_set_attr_at_index(delete_attlist, del_num, 91*5051Swyllys KMF_TOKEN_LABEL_ATTR, slotlabel, 92*5051Swyllys strlen(slotlabel)); 93*5051Swyllys del_num++; 94*5051Swyllys } 953089Swyllys break; 963089Swyllys case KMF_KEYSTORE_OPENSSL: 973089Swyllys break; 983089Swyllys case KMF_KEYSTORE_PK11TOKEN: 99*5051Swyllys rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr, 100*5051Swyllys (void *)&cred, NULL); 101*5051Swyllys if (rv == KMF_OK) { 102*5051Swyllys if (cred.credlen > 0) { 103*5051Swyllys kmf_set_attr_at_index(delete_attlist, del_num, 104*5051Swyllys KMF_CREDENTIAL_ATTR, &cred, 105*5051Swyllys sizeof (KMF_CREDENTIAL)); 106*5051Swyllys del_num++; 107*5051Swyllys } 108*5051Swyllys } 1093089Swyllys break; 1103089Swyllys default: 1113089Swyllys return (PK_ERR_USAGE); 1123089Swyllys } 1133089Swyllys 114*5051Swyllys numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr); 115*5051Swyllys if (numkeys == NULL) 116*5051Swyllys return (PK_ERR_USAGE); 117*5051Swyllys 118*5051Swyllys keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr); 119*5051Swyllys if (keys == NULL) 120*5051Swyllys return (PK_ERR_USAGE); 121*5051Swyllys 122*5051Swyllys for (i = 0; rv == KMF_OK && i < *numkeys; i++) { 123*5051Swyllys int num = del_num; 124*5051Swyllys 125*5051Swyllys kmf_set_attr_at_index(delete_attlist, num, 126*5051Swyllys KMF_KEY_HANDLE_ATTR, &keys[i], sizeof (KMF_KEY_HANDLE)); 127*5051Swyllys num++; 128*5051Swyllys 129*5051Swyllys rv = kmf_delete_key_from_keystore(handle, num, delete_attlist); 1303089Swyllys } 1313089Swyllys return (rv); 1323089Swyllys } 1333089Swyllys 1343089Swyllys static KMF_RETURN 135*5051Swyllys pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr, 136*5051Swyllys char *desc, int *keysdeleted) 1373089Swyllys { 1383089Swyllys KMF_RETURN rv = KMF_OK; 1393089Swyllys uint32_t numkeys = 0; 140*5051Swyllys int num = numattr; 1413089Swyllys 1423089Swyllys *keysdeleted = 0; 1433089Swyllys numkeys = 0; 144*5051Swyllys 145*5051Swyllys kmf_set_attr_at_index(attlist, num, 146*5051Swyllys KMF_COUNT_ATTR, &numkeys, sizeof (uint32_t)); 147*5051Swyllys num++; 148*5051Swyllys 149*5051Swyllys rv = kmf_find_key(kmfhandle, num, attlist); 150*5051Swyllys 1513089Swyllys if (rv == KMF_OK && numkeys > 0) { 1523089Swyllys KMF_KEY_HANDLE *keys = NULL; 1533089Swyllys char prompt[1024]; 1543089Swyllys 1553089Swyllys (void) snprintf(prompt, sizeof (prompt), 156*5051Swyllys gettext("%d %s key(s) found, do you want " 157*5051Swyllys "to delete them (y/N) ?"), numkeys, 158*5051Swyllys (desc != NULL ? desc : "")); 1593089Swyllys 1603089Swyllys if (!yesno(prompt, 161*5051Swyllys gettext("Respond with yes or no.\n"), 162*5051Swyllys B_FALSE)) { 1633089Swyllys return (KMF_OK); 1643089Swyllys } 1653089Swyllys keys = (KMF_KEY_HANDLE *)malloc(numkeys * 166*5051Swyllys sizeof (KMF_KEY_HANDLE)); 1673089Swyllys if (keys == NULL) 1683089Swyllys return (KMF_ERR_MEMORY); 1693089Swyllys (void) memset(keys, 0, numkeys * 170*5051Swyllys sizeof (KMF_KEY_HANDLE)); 1713089Swyllys 172*5051Swyllys kmf_set_attr_at_index(attlist, num, 173*5051Swyllys KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE)); 174*5051Swyllys num++; 175*5051Swyllys 176*5051Swyllys rv = kmf_find_key(kmfhandle, num, attlist); 1773089Swyllys if (rv == KMF_OK) { 178*5051Swyllys rv = pk_destroy_keys(kmfhandle, attlist, num); 1793089Swyllys } 1803089Swyllys 1813089Swyllys free(keys); 1823089Swyllys } 1833089Swyllys 1843089Swyllys if (rv == KMF_ERR_KEY_NOT_FOUND) { 1853089Swyllys rv = KMF_OK; 1863089Swyllys } 1873089Swyllys 1883089Swyllys *keysdeleted = numkeys; 1893089Swyllys return (rv); 1903089Swyllys } 1913089Swyllys 1923089Swyllys static KMF_RETURN 193*5051Swyllys pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr) 1943089Swyllys { 1953089Swyllys KMF_RETURN rv = KMF_OK; 1963089Swyllys uint32_t numcerts = 0; 197*5051Swyllys int num = numattr; 1983089Swyllys 199*5051Swyllys kmf_set_attr_at_index(attlist, num, 200*5051Swyllys KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t)); 201*5051Swyllys num++; 202*5051Swyllys 203*5051Swyllys rv = kmf_find_cert(kmfhandle, num, attlist); 2043089Swyllys if (rv == KMF_OK && numcerts > 0) { 2053089Swyllys char prompt[1024]; 2063089Swyllys (void) snprintf(prompt, sizeof (prompt), 207*5051Swyllys gettext("%d certificate(s) found, do you want " 208*5051Swyllys "to delete them (y/N) ?"), numcerts); 2093089Swyllys 2103089Swyllys if (!yesno(prompt, 211*5051Swyllys gettext("Respond with yes or no.\n"), 212*5051Swyllys B_FALSE)) { 2133089Swyllys return (KMF_OK); 2143089Swyllys } 2153089Swyllys 216*5051Swyllys /* 217*5051Swyllys * Use numattr because delete cert does not require 218*5051Swyllys * KMF_COUNT_ATTR attribute. 219*5051Swyllys */ 220*5051Swyllys rv = kmf_delete_cert_from_keystore(kmfhandle, numattr, attlist); 2213089Swyllys 2223089Swyllys } else if (rv == KMF_ERR_CERT_NOT_FOUND) { 2233089Swyllys rv = KMF_OK; 2243089Swyllys } 2253089Swyllys 2263089Swyllys return (rv); 2273089Swyllys } 2283089Swyllys 2293089Swyllys static KMF_RETURN 2303089Swyllys delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix, 2313089Swyllys char *token, int oclass, char *objlabel, 2323089Swyllys KMF_CREDENTIAL *tokencred) 2333089Swyllys { 2343089Swyllys KMF_RETURN rv = KMF_OK; 2353089Swyllys char *keytype = NULL; 2363089Swyllys int nk, numkeys = 0; 237*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 238*5051Swyllys int numattr = 0; 239*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 240*5051Swyllys KMF_KEY_CLASS keyclass; 2413089Swyllys 2423089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 2433089Swyllys if (rv != KMF_OK) 2443089Swyllys return (rv); 2453089Swyllys 246*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 247*5051Swyllys &kstype, sizeof (kstype)); 248*5051Swyllys numattr++; 249*5051Swyllys 250*5051Swyllys if (objlabel != NULL) { 251*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR, 252*5051Swyllys objlabel, strlen(objlabel)); 253*5051Swyllys numattr++; 254*5051Swyllys } 255*5051Swyllys 256*5051Swyllys if (tokencred->credlen > 0) { 257*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR, 258*5051Swyllys tokencred, sizeof (KMF_CREDENTIAL)); 259*5051Swyllys numattr++; 260*5051Swyllys } 261*5051Swyllys 262*5051Swyllys if (token && strlen(token)) { 263*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR, 264*5051Swyllys token, strlen(token)); 265*5051Swyllys numattr++; 266*5051Swyllys } 2673089Swyllys 2683089Swyllys if (oclass & PK_PRIKEY_OBJ) { 269*5051Swyllys int num = numattr; 270*5051Swyllys 271*5051Swyllys keyclass = KMF_ASYM_PRI; 272*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 273*5051Swyllys &keyclass, sizeof (keyclass)); 274*5051Swyllys num++; 275*5051Swyllys 2763089Swyllys keytype = "private"; 277*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 2783089Swyllys numkeys += nk; 2793089Swyllys } 2803089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 281*5051Swyllys int num = numattr; 282*5051Swyllys 283*5051Swyllys keyclass = KMF_SYMMETRIC; 284*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 285*5051Swyllys &keyclass, sizeof (keyclass)); 286*5051Swyllys num++; 287*5051Swyllys 2883089Swyllys keytype = "symmetric"; 289*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 2903089Swyllys numkeys += nk; 2913089Swyllys } 2923089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 293*5051Swyllys int num = numattr; 294*5051Swyllys 295*5051Swyllys keyclass = KMF_ASYM_PUB; 296*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 297*5051Swyllys &keyclass, sizeof (keyclass)); 298*5051Swyllys num++; 299*5051Swyllys 3003089Swyllys keytype = "public"; 301*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 3023089Swyllys numkeys += nk; 3033089Swyllys } 3043089Swyllys if (rv == KMF_OK && numkeys == 0) 3053089Swyllys rv = KMF_ERR_KEY_NOT_FOUND; 3063089Swyllys 3073089Swyllys return (rv); 3083089Swyllys } 3093089Swyllys 3103089Swyllys 3113089Swyllys static KMF_RETURN 3123089Swyllys delete_nss_certs(KMF_HANDLE_T kmfhandle, 3133089Swyllys char *dir, char *prefix, 3143089Swyllys char *token, char *objlabel, 3153089Swyllys KMF_BIGINT *serno, char *issuer, char *subject, 3163089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 3173089Swyllys { 3183089Swyllys KMF_RETURN rv = KMF_OK; 319*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 320*5051Swyllys int numattr = 0; 321*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 3223089Swyllys 3233089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 3243089Swyllys if (rv != KMF_OK) 3253089Swyllys return (rv); 3263089Swyllys 327*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 328*5051Swyllys &kstype, sizeof (kstype)); 329*5051Swyllys numattr++; 330*5051Swyllys 331*5051Swyllys if (objlabel != NULL) { 332*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 333*5051Swyllys KMF_CERT_LABEL_ATTR, objlabel, 334*5051Swyllys strlen(objlabel)); 335*5051Swyllys numattr++; 336*5051Swyllys } 337*5051Swyllys 338*5051Swyllys if (issuer != NULL) { 339*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 340*5051Swyllys KMF_ISSUER_NAME_ATTR, issuer, 341*5051Swyllys strlen(issuer)); 342*5051Swyllys numattr++; 343*5051Swyllys } 3443089Swyllys 345*5051Swyllys if (subject != NULL) { 346*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 347*5051Swyllys KMF_SUBJECT_NAME_ATTR, subject, 348*5051Swyllys strlen(subject)); 349*5051Swyllys numattr++; 350*5051Swyllys } 351*5051Swyllys 352*5051Swyllys if (serno != NULL) { 353*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 354*5051Swyllys KMF_BIGINT_ATTR, serno, 355*5051Swyllys sizeof (KMF_BIGINT)); 356*5051Swyllys numattr++; 357*5051Swyllys } 3583089Swyllys 359*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 360*5051Swyllys KMF_CERT_VALIDITY_ATTR, &find_criteria_flag, 361*5051Swyllys sizeof (KMF_CERT_VALIDITY)); 362*5051Swyllys numattr++; 363*5051Swyllys 364*5051Swyllys if (token != NULL) { 365*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, 366*5051Swyllys KMF_TOKEN_LABEL_ATTR, token, 367*5051Swyllys strlen(token)); 368*5051Swyllys numattr++; 369*5051Swyllys } 370*5051Swyllys 371*5051Swyllys rv = pk_delete_certs(kmfhandle, attrlist, numattr); 3723089Swyllys 3733089Swyllys return (rv); 3743089Swyllys } 3753089Swyllys 3763089Swyllys static KMF_RETURN 3773089Swyllys delete_nss_crl(void *kmfhandle, 3783089Swyllys char *dir, char *prefix, char *token, 379*5051Swyllys char *issuer, char *subject) 3803089Swyllys { 3813089Swyllys KMF_RETURN rv = KMF_OK; 382*5051Swyllys int numattr = 0; 383*5051Swyllys KMF_ATTRIBUTE attrlist[8]; 384*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 3853089Swyllys 3863089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 3873089Swyllys if (rv != KMF_OK) 3883089Swyllys return (rv); 3893089Swyllys 390*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 391*5051Swyllys &kstype, sizeof (kstype)); 392*5051Swyllys numattr++; 3933089Swyllys 394*5051Swyllys if (token != NULL) { 395*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR, 396*5051Swyllys token, strlen(token)); 397*5051Swyllys numattr++; 398*5051Swyllys } 399*5051Swyllys if (issuer != NULL) { 400*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR, 401*5051Swyllys issuer, strlen(issuer)); 402*5051Swyllys numattr++; 403*5051Swyllys } 404*5051Swyllys if (subject != NULL) { 405*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR, 406*5051Swyllys subject, strlen(subject)); 407*5051Swyllys numattr++; 408*5051Swyllys } 4093089Swyllys 410*5051Swyllys rv = kmf_delete_crl(kmfhandle, numattr, attrlist); 4113089Swyllys 4123089Swyllys return (rv); 4133089Swyllys } 4143089Swyllys 4153089Swyllys static KMF_RETURN 4163089Swyllys delete_pk11_keys(KMF_HANDLE_T kmfhandle, 4173089Swyllys char *token, int oclass, char *objlabel, 4183089Swyllys KMF_CREDENTIAL *tokencred) 4193089Swyllys { 4203089Swyllys KMF_RETURN rv = KMF_OK; 4213089Swyllys int nk, numkeys = 0; 422*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 423*5051Swyllys int numattr = 0; 424*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 425*5051Swyllys KMF_KEY_CLASS keyclass; 426*5051Swyllys boolean_t token_bool = B_TRUE; 427*5051Swyllys KMF_KEY_ALG keytype = 0; 428*5051Swyllys boolean_t private; 4293089Swyllys /* 4303089Swyllys * Symmetric keys and RSA/DSA private keys are always 4313089Swyllys * created with the "CKA_PRIVATE" field == TRUE, so 4323089Swyllys * make sure we search for them with it also set. 4333089Swyllys */ 4343089Swyllys if (oclass & (PK_SYMKEY_OBJ | PK_PRIKEY_OBJ)) 4353089Swyllys oclass |= PK_PRIVATE_OBJ; 4363089Swyllys 4373089Swyllys rv = select_token(kmfhandle, token, FALSE); 4383089Swyllys if (rv != KMF_OK) { 4393089Swyllys return (rv); 4403089Swyllys } 4413089Swyllys 442*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 443*5051Swyllys &kstype, sizeof (kstype)); 444*5051Swyllys numattr++; 445*5051Swyllys 446*5051Swyllys if (objlabel != NULL) { 447*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR, 448*5051Swyllys objlabel, strlen(objlabel)); 449*5051Swyllys numattr++; 450*5051Swyllys } 451*5051Swyllys 452*5051Swyllys if (tokencred != NULL && tokencred->credlen > 0) { 453*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR, 454*5051Swyllys tokencred, sizeof (KMF_CREDENTIAL)); 455*5051Swyllys numattr++; 456*5051Swyllys } 457*5051Swyllys 458*5051Swyllys private = ((oclass & PK_PRIVATE_OBJ) > 0); 459*5051Swyllys 460*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR, 461*5051Swyllys &private, sizeof (private)); 462*5051Swyllys numattr++; 463*5051Swyllys 464*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR, 465*5051Swyllys &keytype, sizeof (keytype)); 466*5051Swyllys numattr++; 467*5051Swyllys 468*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR, 469*5051Swyllys &token_bool, sizeof (token_bool)); 470*5051Swyllys numattr++; 4713089Swyllys 4723089Swyllys if (oclass & PK_PRIKEY_OBJ) { 473*5051Swyllys int num = numattr; 474*5051Swyllys 475*5051Swyllys keyclass = KMF_ASYM_PRI; 476*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 477*5051Swyllys &keyclass, sizeof (keyclass)); 478*5051Swyllys num++; 479*5051Swyllys 480*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, "private", &nk); 4813089Swyllys numkeys += nk; 4823089Swyllys } 4833089Swyllys 4843089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 485*5051Swyllys int num = numattr; 486*5051Swyllys 487*5051Swyllys keyclass = KMF_SYMMETRIC; 488*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 489*5051Swyllys &keyclass, sizeof (keyclass)); 490*5051Swyllys num++; 491*5051Swyllys 492*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, "symmetric", &nk); 4933089Swyllys numkeys += nk; 4943089Swyllys } 4953089Swyllys 4963089Swyllys if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) { 497*5051Swyllys int num = numattr; 498*5051Swyllys 499*5051Swyllys keyclass = KMF_ASYM_PUB; 500*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 501*5051Swyllys &keyclass, sizeof (keyclass)); 502*5051Swyllys num++; 503*5051Swyllys 504*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, "public", &nk); 5053089Swyllys numkeys += nk; 5063089Swyllys } 5073089Swyllys if (rv == KMF_OK && numkeys == 0) 5083089Swyllys rv = KMF_ERR_KEY_NOT_FOUND; 5093089Swyllys 5103089Swyllys return (rv); 5113089Swyllys } 5123089Swyllys 5133089Swyllys static KMF_RETURN 5143089Swyllys delete_pk11_certs(KMF_HANDLE_T kmfhandle, 5153089Swyllys char *token, char *objlabel, 5163089Swyllys KMF_BIGINT *serno, char *issuer, char *subject, 5173089Swyllys KMF_CERT_VALIDITY find_criteria_flag) 5183089Swyllys { 5193089Swyllys KMF_RETURN kmfrv; 520*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 521*5051Swyllys int numattr = 0; 522*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 5233089Swyllys 5243089Swyllys kmfrv = select_token(kmfhandle, token, FALSE); 5253089Swyllys 5263089Swyllys if (kmfrv != KMF_OK) { 5273089Swyllys return (kmfrv); 5283089Swyllys } 5293089Swyllys 530*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 531*5051Swyllys &kstype, sizeof (kstype)); 532*5051Swyllys numattr++; 533*5051Swyllys 534*5051Swyllys if (objlabel != NULL) { 535*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR, 536*5051Swyllys objlabel, strlen(objlabel)); 537*5051Swyllys numattr++; 538*5051Swyllys } 539*5051Swyllys 540*5051Swyllys if (issuer != NULL) { 541*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR, 542*5051Swyllys issuer, strlen(issuer)); 543*5051Swyllys numattr++; 544*5051Swyllys } 5453089Swyllys 546*5051Swyllys if (subject != NULL) { 547*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR, 548*5051Swyllys subject, strlen(subject)); 549*5051Swyllys numattr++; 550*5051Swyllys } 551*5051Swyllys 552*5051Swyllys if (serno != NULL) { 553*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR, 554*5051Swyllys serno, sizeof (KMF_BIGINT)); 555*5051Swyllys numattr++; 556*5051Swyllys } 557*5051Swyllys 558*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR, 559*5051Swyllys &find_criteria_flag, sizeof (KMF_CERT_VALIDITY)); 560*5051Swyllys numattr++; 561*5051Swyllys 562*5051Swyllys kmfrv = pk_delete_certs(kmfhandle, attrlist, numattr); 5633089Swyllys 5643089Swyllys return (kmfrv); 5653089Swyllys } 5663089Swyllys 5673089Swyllys static KMF_RETURN 5683089Swyllys delete_file_certs(KMF_HANDLE_T kmfhandle, 5693089Swyllys char *dir, char *filename, KMF_BIGINT *serial, char *issuer, 5703089Swyllys char *subject, KMF_CERT_VALIDITY find_criteria_flag) 5713089Swyllys { 5723089Swyllys KMF_RETURN rv; 573*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 574*5051Swyllys int numattr = 0; 575*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 576*5051Swyllys 577*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 578*5051Swyllys &kstype, sizeof (kstype)); 579*5051Swyllys numattr++; 580*5051Swyllys 581*5051Swyllys if (issuer != NULL) { 582*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR, 583*5051Swyllys issuer, strlen(issuer)); 584*5051Swyllys numattr++; 585*5051Swyllys } 586*5051Swyllys 587*5051Swyllys if (subject != NULL) { 588*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR, 589*5051Swyllys subject, strlen(subject)); 590*5051Swyllys numattr++; 591*5051Swyllys } 5923089Swyllys 593*5051Swyllys if (serial != NULL) { 594*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR, 595*5051Swyllys serial, sizeof (KMF_BIGINT)); 596*5051Swyllys numattr++; 597*5051Swyllys } 598*5051Swyllys 599*5051Swyllys if (dir != NULL) { 600*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR, 601*5051Swyllys dir, strlen(dir)); 602*5051Swyllys numattr++; 603*5051Swyllys } 6043089Swyllys 605*5051Swyllys if (filename != NULL) { 606*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR, 607*5051Swyllys filename, strlen(filename)); 608*5051Swyllys numattr++; 609*5051Swyllys } 6103089Swyllys 611*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR, 612*5051Swyllys &find_criteria_flag, sizeof (KMF_CERT_VALIDITY)); 613*5051Swyllys numattr++; 614*5051Swyllys 615*5051Swyllys rv = pk_delete_certs(kmfhandle, attrlist, numattr); 6163089Swyllys 6173089Swyllys return (rv); 6183089Swyllys } 6193089Swyllys 6203089Swyllys static KMF_RETURN 6213089Swyllys delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass, 6223089Swyllys char *dir, char *infile) 6233089Swyllys { 6243089Swyllys KMF_RETURN rv = KMF_OK; 6253089Swyllys char *keytype = ""; 6263089Swyllys int nk, numkeys = 0; 627*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 628*5051Swyllys int numattr = 0; 629*5051Swyllys KMF_ATTRIBUTE attrlist[16]; 630*5051Swyllys KMF_KEY_CLASS keyclass; 6313089Swyllys 632*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 633*5051Swyllys &kstype, sizeof (kstype)); 634*5051Swyllys numattr++; 635*5051Swyllys 636*5051Swyllys if (dir != NULL) { 637*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR, 638*5051Swyllys dir, strlen(dir)); 639*5051Swyllys numattr++; 640*5051Swyllys } 641*5051Swyllys 642*5051Swyllys if (infile != NULL) { 643*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR, 644*5051Swyllys infile, strlen(infile)); 645*5051Swyllys numattr++; 646*5051Swyllys } 6473089Swyllys 6483089Swyllys if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) { 649*5051Swyllys int num = numattr; 650*5051Swyllys 651*5051Swyllys keyclass = KMF_ASYM_PRI; 652*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 653*5051Swyllys &keyclass, sizeof (keyclass)); 654*5051Swyllys num++; 655*5051Swyllys 6563089Swyllys keytype = "Asymmetric"; 657*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 6583089Swyllys numkeys += nk; 6593089Swyllys } 6603089Swyllys if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) { 661*5051Swyllys int num = numattr; 662*5051Swyllys 663*5051Swyllys keyclass = KMF_SYMMETRIC; 664*5051Swyllys kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR, 665*5051Swyllys &keyclass, sizeof (keyclass)); 666*5051Swyllys num++; 667*5051Swyllys 6683089Swyllys keytype = "symmetric"; 669*5051Swyllys rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk); 6703089Swyllys numkeys += nk; 6713089Swyllys } 6723089Swyllys if (rv == KMF_OK && numkeys == 0) 6733089Swyllys rv = KMF_ERR_KEY_NOT_FOUND; 6743089Swyllys 6753089Swyllys return (rv); 6763089Swyllys } 6773089Swyllys 6783089Swyllys static KMF_RETURN 6793089Swyllys delete_file_crl(void *kmfhandle, char *dir, char *filename) 6803089Swyllys { 6813089Swyllys KMF_RETURN rv; 682*5051Swyllys int numattr = 0; 683*5051Swyllys KMF_ATTRIBUTE attrlist[4]; 684*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 6853089Swyllys 686*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 687*5051Swyllys &kstype, sizeof (kstype)); 688*5051Swyllys numattr++; 6893089Swyllys 690*5051Swyllys if (dir) { 691*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR, 692*5051Swyllys dir, strlen(dir)); 693*5051Swyllys numattr++; 694*5051Swyllys } 695*5051Swyllys if (filename) { 696*5051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR, 697*5051Swyllys filename, strlen(filename)); 698*5051Swyllys numattr++; 699*5051Swyllys } 7003089Swyllys 701*5051Swyllys rv = kmf_delete_crl(kmfhandle, numattr, attrlist); 7023089Swyllys 7033089Swyllys return (rv); 7043089Swyllys } 70517Sdinak 70617Sdinak /* 70717Sdinak * Delete token objects. 70817Sdinak */ 70917Sdinak int 71017Sdinak pk_delete(int argc, char *argv[]) 71117Sdinak { 71217Sdinak int opt; 713864Sdinak extern int optind_av; 714864Sdinak extern char *optarg_av; 715864Sdinak char *token_spec = NULL; 7163089Swyllys char *subject = NULL; 7173089Swyllys char *issuer = NULL; 7183089Swyllys char *dir = NULL; 7193089Swyllys char *prefix = NULL; 7203089Swyllys char *infile = NULL; 7213089Swyllys char *object_label = NULL; 7223089Swyllys char *serstr = NULL; 72317Sdinak 7243089Swyllys int oclass = 0; 7253089Swyllys KMF_BIGINT serial = { NULL, 0 }; 7263089Swyllys KMF_HANDLE_T kmfhandle = NULL; 7273089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 7283089Swyllys KMF_RETURN kmfrv; 7293089Swyllys int rv = 0; 7303089Swyllys char *find_criteria = NULL; 7313089Swyllys KMF_CERT_VALIDITY find_criteria_flag = KMF_ALL_CERTS; 7323089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 73317Sdinak 73417Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 735864Sdinak while ((opt = getopt_av(argc, argv, 736*5051Swyllys "T:(token)y:(objtype)l:(label)" 737*5051Swyllys "k:(keystore)s:(subject)n:(nickname)" 738*5051Swyllys "d:(dir)p:(prefix)S:(serial)i:(issuer)" 739*5051Swyllys "c:(criteria)" 740*5051Swyllys "f:(infile)")) != EOF) { 7413089Swyllys 7423089Swyllys if (EMPTYSTRING(optarg_av)) 7433089Swyllys return (PK_ERR_USAGE); 74417Sdinak switch (opt) { 745864Sdinak case 'T': /* token specifier */ 746864Sdinak if (token_spec) 747864Sdinak return (PK_ERR_USAGE); 748864Sdinak token_spec = optarg_av; 74917Sdinak break; 750864Sdinak case 'y': /* object type: public, private, both */ 7513089Swyllys if (oclass) 752864Sdinak return (PK_ERR_USAGE); 7533089Swyllys oclass = OT2Int(optarg_av); 7543089Swyllys if (oclass == -1) 7553089Swyllys return (PK_ERR_USAGE); 75617Sdinak break; 75717Sdinak case 'l': /* objects with specific label */ 7583089Swyllys case 'n': 75917Sdinak if (object_label) 76017Sdinak return (PK_ERR_USAGE); 7613089Swyllys object_label = (char *)optarg_av; 7623089Swyllys break; 7633089Swyllys case 'k': 7643089Swyllys kstype = KS2Int(optarg_av); 7653089Swyllys if (kstype == 0) 7663089Swyllys return (PK_ERR_USAGE); 7673089Swyllys break; 7683089Swyllys case 's': 7693089Swyllys subject = optarg_av; 7703089Swyllys break; 7713089Swyllys case 'i': 7723089Swyllys issuer = optarg_av; 7733089Swyllys break; 7743089Swyllys case 'd': 7753089Swyllys dir = optarg_av; 7763089Swyllys break; 7773089Swyllys case 'p': 7783089Swyllys prefix = optarg_av; 7793089Swyllys break; 7803089Swyllys case 'S': 7813089Swyllys serstr = optarg_av; 7823089Swyllys break; 7833089Swyllys case 'f': 7843089Swyllys infile = optarg_av; 7853089Swyllys break; 7863089Swyllys case 'c': 7873089Swyllys find_criteria = optarg_av; 7883089Swyllys if (!strcasecmp(find_criteria, "valid")) 7893089Swyllys find_criteria_flag = 790*5051Swyllys KMF_NONEXPIRED_CERTS; 7913089Swyllys else if (!strcasecmp(find_criteria, "expired")) 7923089Swyllys find_criteria_flag = KMF_EXPIRED_CERTS; 7933089Swyllys else if (!strcasecmp(find_criteria, "both")) 7943089Swyllys find_criteria_flag = KMF_ALL_CERTS; 7953089Swyllys else 7963089Swyllys return (PK_ERR_USAGE); 79717Sdinak break; 79817Sdinak default: 79917Sdinak return (PK_ERR_USAGE); 80017Sdinak break; 80117Sdinak } 80217Sdinak } 80317Sdinak 8043089Swyllys /* Assume keystore = PKCS#11 if not specified */ 8053089Swyllys if (kstype == 0) 8063089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 8073089Swyllys 8083089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 8093089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 810*5051Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 8113089Swyllys 8123089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 813*5051Swyllys "is only relevant if keystore=pkcs11\n")); 8143089Swyllys return (PK_ERR_USAGE); 815864Sdinak } 816864Sdinak 8173089Swyllys /* If no object class specified, delete everything but CRLs */ 8183089Swyllys if (oclass == 0) 8193089Swyllys oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ | 820*5051Swyllys PK_SYMKEY_OBJ; 82117Sdinak 82217Sdinak /* No additional args allowed. */ 823864Sdinak argc -= optind_av; 824864Sdinak argv += optind_av; 82517Sdinak if (argc) 82617Sdinak return (PK_ERR_USAGE); 82717Sdinak /* Done parsing command line options. */ 82817Sdinak 8293089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && token_spec == NULL) { 8303089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 8313089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && token_spec == NULL) { 8323089Swyllys token_spec = DEFAULT_NSS_TOKEN; 83317Sdinak } 83417Sdinak 8353089Swyllys if (serstr != NULL) { 8363089Swyllys uchar_t *bytes = NULL; 8373089Swyllys size_t bytelen; 8383089Swyllys 839*5051Swyllys rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen); 8403089Swyllys if (rv != KMF_OK || bytes == NULL) { 8413089Swyllys (void) fprintf(stderr, gettext("serial number " 842*5051Swyllys "must be specified as a hex number " 843*5051Swyllys "(ex: 0x0102030405ffeeddee)\n")); 8443089Swyllys return (PK_ERR_USAGE); 8453089Swyllys } 8463089Swyllys serial.val = bytes; 8473089Swyllys serial.len = bytelen; 84817Sdinak } 84917Sdinak 8503089Swyllys if ((kstype == KMF_KEYSTORE_PK11TOKEN || 851*5051Swyllys kstype == KMF_KEYSTORE_NSS) && 852*5051Swyllys (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) { 85317Sdinak 8543089Swyllys (void) get_token_password(kstype, token_spec, 855*5051Swyllys &tokencred); 85617Sdinak } 85717Sdinak 858*5051Swyllys if ((kmfrv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) 8593089Swyllys return (kmfrv); 8603089Swyllys 8613089Swyllys switch (kstype) { 8623089Swyllys case KMF_KEYSTORE_PK11TOKEN: 8633089Swyllys if (oclass & PK_KEY_OBJ) { 8643089Swyllys kmfrv = delete_pk11_keys(kmfhandle, 865*5051Swyllys token_spec, oclass, 866*5051Swyllys object_label, &tokencred); 8673089Swyllys /* 8683089Swyllys * If deleting groups of objects, it is OK 8693089Swyllys * to ignore the "key not found" case so that 8703089Swyllys * we can continue to find other objects. 8713089Swyllys */ 8723089Swyllys if (kmfrv == KMF_ERR_KEY_NOT_FOUND && 873*5051Swyllys (oclass != PK_KEY_OBJ)) 8743089Swyllys kmfrv = KMF_OK; 8753089Swyllys if (kmfrv != KMF_OK) 8763089Swyllys break; 8773089Swyllys } 8783089Swyllys if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) { 8793089Swyllys kmfrv = delete_pk11_certs(kmfhandle, 880*5051Swyllys token_spec, object_label, 881*5051Swyllys &serial, issuer, 882*5051Swyllys subject, find_criteria_flag); 8833089Swyllys /* 8843089Swyllys * If cert delete failed, but we are looking at 8853089Swyllys * other objects, then it is OK. 8863089Swyllys */ 8873089Swyllys if (kmfrv == KMF_ERR_CERT_NOT_FOUND && 888*5051Swyllys (oclass & (PK_CRL_OBJ | PK_KEY_OBJ))) 8893089Swyllys kmfrv = KMF_OK; 8903089Swyllys if (kmfrv != KMF_OK) 8913089Swyllys break; 8923089Swyllys } 8933089Swyllys if (oclass & PK_CRL_OBJ) 8943089Swyllys kmfrv = delete_file_crl(kmfhandle, 895*5051Swyllys dir, infile); 8963089Swyllys break; 8973089Swyllys case KMF_KEYSTORE_NSS: 8983089Swyllys if (oclass & PK_KEY_OBJ) { 8993089Swyllys kmfrv = delete_nss_keys(kmfhandle, 900*5051Swyllys dir, prefix, token_spec, 901*5051Swyllys oclass, (char *)object_label, 902*5051Swyllys &tokencred); 9033089Swyllys if (kmfrv != KMF_OK) 9043089Swyllys break; 9053089Swyllys } 9063089Swyllys if (oclass & PK_CERT_OBJ) { 9073089Swyllys kmfrv = delete_nss_certs(kmfhandle, 908*5051Swyllys dir, prefix, token_spec, 909*5051Swyllys (char *)object_label, 910*5051Swyllys &serial, issuer, subject, 911*5051Swyllys find_criteria_flag); 9123089Swyllys if (kmfrv != KMF_OK) 9133089Swyllys break; 9143089Swyllys } 9153089Swyllys if (oclass & PK_CRL_OBJ) 9163089Swyllys kmfrv = delete_nss_crl(kmfhandle, 917*5051Swyllys dir, prefix, token_spec, 918*5051Swyllys (char *)object_label, subject); 9193089Swyllys break; 9203089Swyllys case KMF_KEYSTORE_OPENSSL: 9213089Swyllys if (oclass & PK_KEY_OBJ) { 9223089Swyllys kmfrv = delete_file_keys(kmfhandle, oclass, 923*5051Swyllys dir, infile); 9243089Swyllys if (kmfrv != KMF_OK) 9253089Swyllys break; 9263089Swyllys } 9273089Swyllys if (oclass & (PK_CERT_OBJ)) { 9283089Swyllys kmfrv = delete_file_certs(kmfhandle, 929*5051Swyllys dir, infile, &serial, issuer, 930*5051Swyllys subject, find_criteria_flag); 9313089Swyllys if (kmfrv != KMF_OK) 9323089Swyllys break; 9333089Swyllys } 9343089Swyllys if (oclass & PK_CRL_OBJ) 9353089Swyllys kmfrv = delete_file_crl(kmfhandle, 936*5051Swyllys dir, infile); 9373089Swyllys break; 9383089Swyllys default: 9393089Swyllys rv = PK_ERR_USAGE; 9403089Swyllys break; 94117Sdinak } 94217Sdinak 9433089Swyllys if (kmfrv != KMF_OK) { 9443089Swyllys display_error(kmfhandle, kmfrv, 945*5051Swyllys gettext("Error deleting objects")); 94617Sdinak } 94717Sdinak 9483089Swyllys if (serial.val != NULL) 9493089Swyllys free(serial.val); 950*5051Swyllys (void) kmf_finalize(kmfhandle); 9513089Swyllys return (kmfrv); 95217Sdinak } 953