13089Swyllys /* 23089Swyllys * CDDL HEADER START 33089Swyllys * 43089Swyllys * 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. 73089Swyllys * 83089Swyllys * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 93089Swyllys * or http://www.opensolaris.org/os/licensing. 103089Swyllys * See the License for the specific language governing permissions 113089Swyllys * and limitations under the License. 123089Swyllys * 133089Swyllys * When distributing Covered Code, include this CDDL HEADER in each 143089Swyllys * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 153089Swyllys * If applicable, add the following below this CDDL HEADER, with the 163089Swyllys * fields enclosed by brackets "[]" replaced with your own identifying 173089Swyllys * information: Portions Copyright [yyyy] [name of copyright owner] 183089Swyllys * 193089Swyllys * CDDL HEADER END 203089Swyllys */ 213089Swyllys /* 223812Shylee * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 233089Swyllys * Use is subject to license terms. 243089Swyllys */ 253089Swyllys 263089Swyllys #pragma ident "%Z%%M% %I% %E% SMI" 273089Swyllys 283089Swyllys #include <stdio.h> 293089Swyllys #include <string.h> 303089Swyllys #include <ctype.h> 313089Swyllys #include <malloc.h> 323089Swyllys #include <libgen.h> 333089Swyllys #include <errno.h> 343089Swyllys #include <cryptoutil.h> 353089Swyllys #include <security/cryptoki.h> 363089Swyllys #include "common.h" 373089Swyllys #include <kmfapi.h> 383089Swyllys 393089Swyllys 403089Swyllys static KMF_RETURN 413089Swyllys genkey_nss(KMF_HANDLE_T kmfhandle, char *token, char *dir, char *prefix, 423089Swyllys char *keylabel, KMF_KEY_ALG keyAlg, int keylen, KMF_CREDENTIAL *tokencred) 433089Swyllys { 443089Swyllys KMF_RETURN kmfrv = KMF_OK; 453089Swyllys KMF_KEY_HANDLE key; 46*5051Swyllys KMF_ATTRIBUTE attlist[20]; 47*5051Swyllys int i = 0; 48*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 49*5051Swyllys KMF_KEY_ALG keytype; 50*5051Swyllys uint32_t keylength; 513089Swyllys 523089Swyllys if (keylabel == NULL) { 533089Swyllys cryptoerror(LOG_STDERR, 543089Swyllys gettext("A key label must be specified \n")); 553089Swyllys return (KMF_ERR_BAD_PARAMETER); 563089Swyllys } 573089Swyllys 583089Swyllys kmfrv = configure_nss(kmfhandle, dir, prefix); 593089Swyllys if (kmfrv != KMF_OK) 603089Swyllys return (kmfrv); 613089Swyllys 623089Swyllys (void) memset(&key, 0, sizeof (KMF_KEY_HANDLE)); 63*5051Swyllys 64*5051Swyllys keytype = keyAlg; 65*5051Swyllys keylength = keylen; 66*5051Swyllys 67*5051Swyllys kmf_set_attr_at_index(attlist, i, 68*5051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 69*5051Swyllys i++; 70*5051Swyllys 71*5051Swyllys kmf_set_attr_at_index(attlist, i, 72*5051Swyllys KMF_KEY_HANDLE_ATTR, &key, sizeof (KMF_KEY_HANDLE)); 73*5051Swyllys i++; 74*5051Swyllys 75*5051Swyllys kmf_set_attr_at_index(attlist, i, 76*5051Swyllys KMF_KEYALG_ATTR, &keytype, sizeof (keytype)); 77*5051Swyllys i++; 78*5051Swyllys 79*5051Swyllys kmf_set_attr_at_index(attlist, i, 80*5051Swyllys KMF_KEYLENGTH_ATTR, &keylength, sizeof (keylength)); 81*5051Swyllys i++; 82*5051Swyllys 83*5051Swyllys if (keylabel != NULL) { 84*5051Swyllys kmf_set_attr_at_index(attlist, i, 85*5051Swyllys KMF_KEYLABEL_ATTR, keylabel, 86*5051Swyllys strlen(keylabel)); 87*5051Swyllys i++; 88*5051Swyllys } 89*5051Swyllys 90*5051Swyllys if (tokencred != NULL && tokencred->credlen > 0) { 91*5051Swyllys kmf_set_attr_at_index(attlist, i, 92*5051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 93*5051Swyllys sizeof (KMF_CREDENTIAL)); 94*5051Swyllys i++; 95*5051Swyllys } 96*5051Swyllys 97*5051Swyllys if (token != NULL) { 98*5051Swyllys kmf_set_attr_at_index(attlist, i, 99*5051Swyllys KMF_TOKEN_LABEL_ATTR, token, 100*5051Swyllys strlen(token)); 101*5051Swyllys i++; 102*5051Swyllys } 103*5051Swyllys 104*5051Swyllys kmfrv = kmf_create_sym_key(kmfhandle, i, attlist); 1053089Swyllys 1063089Swyllys return (kmfrv); 1073089Swyllys } 1083089Swyllys 1093089Swyllys static KMF_RETURN 1103089Swyllys genkey_pkcs11(KMF_HANDLE_T kmfhandle, char *token, 1113089Swyllys char *keylabel, KMF_KEY_ALG keyAlg, int keylen, 1123089Swyllys char *senstr, char *extstr, boolean_t print_hex, 1133089Swyllys KMF_CREDENTIAL *tokencred) 1143089Swyllys { 1153089Swyllys KMF_RETURN kmfrv = KMF_OK; 1163089Swyllys KMF_KEY_HANDLE key; 1173089Swyllys KMF_RAW_SYM_KEY *rkey = NULL; 1183089Swyllys boolean_t sensitive = B_FALSE; 1193089Swyllys boolean_t not_extractable = B_FALSE; 1203089Swyllys char *hexstr = NULL; 1213089Swyllys int hexstrlen; 122*5051Swyllys KMF_ATTRIBUTE attlist[20]; 123*5051Swyllys int i = 0; 124*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 125*5051Swyllys KMF_KEY_ALG keytype; 126*5051Swyllys uint32_t keylength; 1273089Swyllys 1283089Swyllys if (keylabel == NULL) { 1293089Swyllys cryptoerror(LOG_STDERR, 1303089Swyllys gettext("A key label must be specified \n")); 1313089Swyllys return (KMF_ERR_BAD_PARAMETER); 1323089Swyllys } 1333089Swyllys 1343089Swyllys /* Check the sensitive option value if specified. */ 1353089Swyllys if (senstr != NULL) { 1363089Swyllys if (tolower(senstr[0]) == 'y') 1373089Swyllys sensitive = B_TRUE; 1383089Swyllys else if (tolower(senstr[0]) == 'n') 1393089Swyllys sensitive = B_FALSE; 1403089Swyllys else { 1413089Swyllys cryptoerror(LOG_STDERR, 1423089Swyllys gettext("Incorrect sensitive option value.\n")); 1433089Swyllys return (KMF_ERR_BAD_PARAMETER); 1443089Swyllys } 1453089Swyllys } 1463089Swyllys 1473089Swyllys /* Check the extractable option value if specified. */ 1483089Swyllys if (extstr != NULL) { 1493089Swyllys if (tolower(extstr[0]) == 'y') 1503089Swyllys not_extractable = B_FALSE; 1513089Swyllys else if (tolower(extstr[0]) == 'n') 1523089Swyllys not_extractable = B_TRUE; 1533089Swyllys else { 1543089Swyllys cryptoerror(LOG_STDERR, 1553089Swyllys gettext("Incorrect extractable option value.\n")); 1563089Swyllys return (KMF_ERR_BAD_PARAMETER); 1573089Swyllys } 1583089Swyllys } 1593089Swyllys 1603089Swyllys /* Select a PKCS11 token first */ 1613089Swyllys kmfrv = select_token(kmfhandle, token, FALSE); 1623089Swyllys if (kmfrv != KMF_OK) { 1633089Swyllys return (kmfrv); 1643089Swyllys } 1653089Swyllys 1663089Swyllys (void) memset(&key, 0, sizeof (KMF_KEY_HANDLE)); 167*5051Swyllys 168*5051Swyllys keytype = keyAlg; 169*5051Swyllys keylength = keylen; /* bits */ 170*5051Swyllys 171*5051Swyllys kmf_set_attr_at_index(attlist, i, 172*5051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 173*5051Swyllys i++; 174*5051Swyllys 175*5051Swyllys kmf_set_attr_at_index(attlist, i, 176*5051Swyllys KMF_KEY_HANDLE_ATTR, &key, sizeof (KMF_KEY_HANDLE)); 177*5051Swyllys i++; 178*5051Swyllys 179*5051Swyllys kmf_set_attr_at_index(attlist, i, 180*5051Swyllys KMF_KEYALG_ATTR, &keytype, sizeof (keytype)); 181*5051Swyllys i++; 182*5051Swyllys 183*5051Swyllys kmf_set_attr_at_index(attlist, i, 184*5051Swyllys KMF_KEYLENGTH_ATTR, &keylength, sizeof (keylength)); 185*5051Swyllys i++; 186*5051Swyllys 187*5051Swyllys if (keylabel != NULL) { 188*5051Swyllys kmf_set_attr_at_index(attlist, i, 189*5051Swyllys KMF_KEYLABEL_ATTR, keylabel, 190*5051Swyllys strlen(keylabel)); 191*5051Swyllys i++; 192*5051Swyllys } 193*5051Swyllys 194*5051Swyllys if (tokencred != NULL && tokencred->credlen > 0) { 195*5051Swyllys kmf_set_attr_at_index(attlist, i, 196*5051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 197*5051Swyllys sizeof (KMF_CREDENTIAL)); 198*5051Swyllys i++; 199*5051Swyllys } 200*5051Swyllys 201*5051Swyllys kmf_set_attr_at_index(attlist, i, 202*5051Swyllys KMF_SENSITIVE_BOOL_ATTR, &sensitive, 203*5051Swyllys sizeof (sensitive)); 204*5051Swyllys i++; 205*5051Swyllys 206*5051Swyllys kmf_set_attr_at_index(attlist, i, 207*5051Swyllys KMF_NON_EXTRACTABLE_BOOL_ATTR, ¬_extractable, 208*5051Swyllys sizeof (not_extractable)); 209*5051Swyllys i++; 210*5051Swyllys 211*5051Swyllys kmfrv = kmf_create_sym_key(kmfhandle, i, attlist); 2123089Swyllys if (kmfrv != KMF_OK) { 2133089Swyllys goto out; 2143089Swyllys } 2153089Swyllys 2163089Swyllys if (print_hex) { 2173089Swyllys if (sensitive == B_TRUE || not_extractable == B_TRUE) { 2183089Swyllys cryptoerror(LOG_STDERR, 2193089Swyllys gettext("Warning: can not reveal the key value " 2203089Swyllys "for a sensitive or non-extractable key.\n")); 2213089Swyllys goto out; 2223089Swyllys } else { 2233089Swyllys rkey = malloc(sizeof (KMF_RAW_SYM_KEY)); 2243089Swyllys if (rkey == NULL) { 2253089Swyllys kmfrv = KMF_ERR_MEMORY; 2263089Swyllys goto out; 2273089Swyllys } 2283089Swyllys (void) memset(rkey, 0, sizeof (KMF_RAW_SYM_KEY)); 229*5051Swyllys kmfrv = kmf_get_sym_key_value(kmfhandle, &key, rkey); 2303089Swyllys if (kmfrv != KMF_OK) { 2313089Swyllys goto out; 2323089Swyllys } 2333089Swyllys hexstrlen = 2 * rkey->keydata.len + 1; 2343089Swyllys hexstr = malloc(hexstrlen); 2353089Swyllys if (hexstr == NULL) { 2363089Swyllys kmfrv = KMF_ERR_MEMORY; 2373089Swyllys goto out; 2383089Swyllys } 2393089Swyllys 2403089Swyllys tohexstr(rkey->keydata.val, rkey->keydata.len, hexstr, 2413089Swyllys hexstrlen); 2423089Swyllys (void) printf(gettext("\tKey Value =\"%s\"\n"), hexstr); 2433089Swyllys } 2443089Swyllys } 2453089Swyllys 2463089Swyllys out: 247*5051Swyllys kmf_free_raw_sym_key(rkey); 2483089Swyllys 2493089Swyllys if (hexstr != NULL) 2503089Swyllys free(hexstr); 2513089Swyllys 2523089Swyllys return (kmfrv); 2533089Swyllys } 2543089Swyllys 2553089Swyllys 2563089Swyllys static KMF_RETURN 2573089Swyllys genkey_file(KMF_HANDLE_T kmfhandle, KMF_KEY_ALG keyAlg, int keylen, char *dir, 2583089Swyllys char *outkey, boolean_t print_hex) 2593089Swyllys { 2603089Swyllys KMF_RETURN kmfrv = KMF_OK; 2613089Swyllys KMF_KEY_HANDLE key; 2623089Swyllys KMF_RAW_SYM_KEY *rkey = NULL; 2633089Swyllys char *hexstr = NULL; 2643089Swyllys int hexstrlen; 265*5051Swyllys KMF_ATTRIBUTE attlist[20]; 266*5051Swyllys int i = 0; 267*5051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 268*5051Swyllys KMF_KEY_ALG keytype; 269*5051Swyllys uint32_t keylength; 270*5051Swyllys char *dirpath; 2713089Swyllys 2723089Swyllys if (EMPTYSTRING(outkey)) { 2733089Swyllys cryptoerror(LOG_STDERR, 2743089Swyllys gettext("No output key file was specified for the key\n")); 2753089Swyllys return (KMF_ERR_BAD_PARAMETER); 2763089Swyllys } 2773089Swyllys 2783089Swyllys if (verify_file(outkey)) { 2793089Swyllys cryptoerror(LOG_STDERR, 280*5051Swyllys gettext("Cannot write the indicated output " 281*5051Swyllys "key file (%s).\n"), outkey); 2823089Swyllys return (KMF_ERR_BAD_PARAMETER); 2833089Swyllys } 2843089Swyllys 2853089Swyllys (void) memset(&key, 0, sizeof (KMF_KEY_HANDLE)); 286*5051Swyllys 287*5051Swyllys keytype = keyAlg; 288*5051Swyllys keylength = keylen; 289*5051Swyllys 290*5051Swyllys dirpath = (dir == NULL) ? "." : dir; 291*5051Swyllys 292*5051Swyllys 293*5051Swyllys kmf_set_attr_at_index(attlist, i, 294*5051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 295*5051Swyllys i++; 296*5051Swyllys 297*5051Swyllys kmf_set_attr_at_index(attlist, i, 298*5051Swyllys KMF_KEY_HANDLE_ATTR, &key, sizeof (KMF_KEY_HANDLE)); 299*5051Swyllys i++; 300*5051Swyllys 301*5051Swyllys kmf_set_attr_at_index(attlist, i, 302*5051Swyllys KMF_KEYALG_ATTR, &keytype, sizeof (keytype)); 303*5051Swyllys i++; 3043089Swyllys 305*5051Swyllys kmf_set_attr_at_index(attlist, i, 306*5051Swyllys KMF_KEYLENGTH_ATTR, &keylength, sizeof (keylength)); 307*5051Swyllys i++; 308*5051Swyllys 309*5051Swyllys if (dirpath != NULL) { 310*5051Swyllys kmf_set_attr_at_index(attlist, i, 311*5051Swyllys KMF_DIRPATH_ATTR, dirpath, 312*5051Swyllys strlen(dirpath)); 313*5051Swyllys i++; 314*5051Swyllys } 315*5051Swyllys 316*5051Swyllys if (outkey != NULL) { 317*5051Swyllys kmf_set_attr_at_index(attlist, i, 318*5051Swyllys KMF_KEY_FILENAME_ATTR, outkey, 319*5051Swyllys strlen(outkey)); 320*5051Swyllys i++; 321*5051Swyllys } 322*5051Swyllys 323*5051Swyllys kmfrv = kmf_create_sym_key(kmfhandle, i, attlist); 3243089Swyllys if (kmfrv != KMF_OK) { 3253089Swyllys goto out; 3263089Swyllys } 3273089Swyllys 3283089Swyllys if (print_hex) { 3293089Swyllys rkey = malloc(sizeof (KMF_RAW_SYM_KEY)); 3303089Swyllys if (rkey == NULL) { 3313089Swyllys kmfrv = KMF_ERR_MEMORY; 3323089Swyllys goto out; 3333089Swyllys } 3343089Swyllys (void) memset(rkey, 0, sizeof (KMF_RAW_SYM_KEY)); 335*5051Swyllys kmfrv = kmf_get_sym_key_value(kmfhandle, &key, rkey); 3363089Swyllys if (kmfrv != KMF_OK) { 3373089Swyllys goto out; 3383089Swyllys } 3393089Swyllys 3403089Swyllys hexstrlen = 2 * rkey->keydata.len + 1; 3413089Swyllys hexstr = malloc(hexstrlen); 3423089Swyllys if (hexstr == NULL) { 3433089Swyllys kmfrv = KMF_ERR_MEMORY; 3443089Swyllys goto out; 3453089Swyllys } 3463089Swyllys tohexstr(rkey->keydata.val, rkey->keydata.len, hexstr, 3473089Swyllys hexstrlen); 3483089Swyllys (void) printf(gettext("\tKey Value =\"%s\"\n"), hexstr); 3493089Swyllys } 3503089Swyllys 3513089Swyllys out: 352*5051Swyllys kmf_free_raw_sym_key(rkey); 3533089Swyllys 3543089Swyllys if (hexstr != NULL) 3553089Swyllys free(hexstr); 3563089Swyllys 3573089Swyllys return (kmfrv); 3583089Swyllys } 3593089Swyllys 3603089Swyllys int 3613089Swyllys pk_genkey(int argc, char *argv[]) 3623089Swyllys { 3633089Swyllys int rv; 3643089Swyllys int opt; 3653089Swyllys extern int optind_av; 3663089Swyllys extern char *optarg_av; 3673089Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 3683089Swyllys char *tokenname = NULL; 3693089Swyllys char *dir = NULL; 3703089Swyllys char *prefix = NULL; 371*5051Swyllys char *keytype = "generic"; 3723089Swyllys char *keylenstr = NULL; 3733089Swyllys int keylen = 0; 3743089Swyllys char *keylabel = NULL; 3753089Swyllys char *outkey = NULL; 3763089Swyllys char *senstr = NULL; 3773089Swyllys char *extstr = NULL; 3783089Swyllys char *printstr = NULL; 3793089Swyllys KMF_HANDLE_T kmfhandle = NULL; 380*5051Swyllys KMF_KEY_ALG keyAlg = KMF_GENERIC_SECRET; 3813089Swyllys boolean_t print_hex = B_FALSE; 3823089Swyllys KMF_CREDENTIAL tokencred = {NULL, 0}; 3833089Swyllys 3843089Swyllys while ((opt = getopt_av(argc, argv, 385*5051Swyllys "k:(keystore)l:(label)T:(token)d:(dir)p:(prefix)" 386*5051Swyllys "t:(keytype)y:(keylen)K:(outkey)P:(print)" 387*5051Swyllys "s:(sensitive)e:(extractable)")) != EOF) { 3883089Swyllys if (EMPTYSTRING(optarg_av)) 3893089Swyllys return (PK_ERR_USAGE); 3903089Swyllys switch (opt) { 3913089Swyllys case 'k': 3923089Swyllys kstype = KS2Int(optarg_av); 3933089Swyllys if (kstype == 0) 3943089Swyllys return (PK_ERR_USAGE); 3953089Swyllys break; 3963089Swyllys case 'l': 3973089Swyllys if (keylabel) 3983089Swyllys return (PK_ERR_USAGE); 3993089Swyllys keylabel = optarg_av; 4003089Swyllys break; 4013089Swyllys case 'T': 4023089Swyllys if (tokenname) 4033089Swyllys return (PK_ERR_USAGE); 4043089Swyllys tokenname = optarg_av; 4053089Swyllys break; 4063089Swyllys case 'd': 4073089Swyllys if (dir) 4083089Swyllys return (PK_ERR_USAGE); 4093089Swyllys dir = optarg_av; 4103089Swyllys break; 4113089Swyllys case 'p': 4123089Swyllys if (prefix) 4133089Swyllys return (PK_ERR_USAGE); 4143089Swyllys prefix = optarg_av; 4153089Swyllys break; 4163089Swyllys case 't': 4173089Swyllys keytype = optarg_av; 4183089Swyllys break; 4193089Swyllys case 'y': 4203089Swyllys if (keylenstr) 4213089Swyllys return (PK_ERR_USAGE); 4223089Swyllys keylenstr = optarg_av; 4233089Swyllys break; 4243089Swyllys case 'K': 4253089Swyllys if (outkey) 4263089Swyllys return (PK_ERR_USAGE); 4273089Swyllys outkey = optarg_av; 4283089Swyllys break; 4293089Swyllys case 'P': 4303089Swyllys if (printstr) 4313089Swyllys return (PK_ERR_USAGE); 4323089Swyllys printstr = optarg_av; 4333089Swyllys break; 4343089Swyllys case 's': 4353089Swyllys if (senstr) 4363089Swyllys return (PK_ERR_USAGE); 4373089Swyllys senstr = optarg_av; 4383089Swyllys break; 4393089Swyllys case 'e': 4403089Swyllys if (extstr) 4413089Swyllys return (PK_ERR_USAGE); 4423089Swyllys extstr = optarg_av; 4433089Swyllys break; 4443089Swyllys default: 4453089Swyllys return (PK_ERR_USAGE); 4463089Swyllys } 4473089Swyllys } 4483089Swyllys 4493089Swyllys /* No additional args allowed. */ 4503089Swyllys argc -= optind_av; 4513089Swyllys argv += optind_av; 4523089Swyllys if (argc) { 4533089Swyllys return (PK_ERR_USAGE); 4543089Swyllys } 4553089Swyllys 4563089Swyllys /* Check keytype. If not specified, default to AES */ 4573089Swyllys if (keytype != NULL && Str2SymKeyType(keytype, &keyAlg) != 0) { 4583089Swyllys cryptoerror(LOG_STDERR, gettext("Unrecognized keytype(%s).\n"), 459*5051Swyllys keytype); 4603089Swyllys return (PK_ERR_USAGE); 4613089Swyllys } 4623089Swyllys 4633089Swyllys /* 4643089Swyllys * Check and set the key length. 4653089Swyllys * - For DES and 3DES, the key size are fixed. Ingore the keylen 4663089Swyllys * option, even if it is specified. 4673089Swyllys * - For AES and ARCFOUR, if keylen is not specified, default to 4683089Swyllys * 128 bits. 4693089Swyllys */ 4703089Swyllys if (keyAlg == KMF_DES) 4713089Swyllys keylen = 64; /* fixed size; ignore input */ 4723089Swyllys else if (keyAlg == KMF_DES3) 4733089Swyllys keylen = 192; /* fixed size; ignore input */ 4743812Shylee else /* AES, ARCFOUR, or GENERIC SECRET */ { 4753089Swyllys if (keylenstr == NULL) { 4763089Swyllys cryptoerror(LOG_STDERR, 477*5051Swyllys gettext("Key length must be specified for " 478*5051Swyllys "AES, ARCFOUR or GENERIC symmetric keys.\n")); 4793089Swyllys return (PK_ERR_USAGE); 4803089Swyllys } 4813089Swyllys if (sscanf(keylenstr, "%d", &keylen) != 1) { 4823089Swyllys cryptoerror(LOG_STDERR, 483*5051Swyllys gettext("Unrecognized key length (%s).\n"), 484*5051Swyllys keytype); 4853089Swyllys return (PK_ERR_USAGE); 4863089Swyllys } 4873089Swyllys if (keylen == 0 || (keylen % 8) != 0) { 4883089Swyllys cryptoerror(LOG_STDERR, 489*5051Swyllys gettext("Key length bitlength must be a " 490*5051Swyllys "multiple of 8.\n")); 4913089Swyllys return (PK_ERR_USAGE); 4923089Swyllys } 4933089Swyllys } 4943089Swyllys 4953089Swyllys /* check the print option */ 4963089Swyllys if (printstr != NULL) { 4973089Swyllys if (kstype == KMF_KEYSTORE_NSS) { 4983089Swyllys cryptoerror(LOG_STDERR, 4993089Swyllys gettext("The print option does not apply " 5003089Swyllys "to the NSS keystore.\n")); 5013089Swyllys return (PK_ERR_USAGE); 5023089Swyllys } 5033089Swyllys 5043089Swyllys if (tolower(printstr[0]) == 'y') 5053089Swyllys print_hex = B_TRUE; 5063089Swyllys else if (tolower(printstr[0]) == 'n') 5073089Swyllys print_hex = B_FALSE; 5083089Swyllys else { 5093089Swyllys cryptoerror(LOG_STDERR, 5103089Swyllys gettext("Incorrect print option value.\n")); 5113089Swyllys return (PK_ERR_USAGE); 5123089Swyllys } 5133089Swyllys } 5143089Swyllys 5153089Swyllys /* check the sensitive and extractable options */ 5163089Swyllys if ((senstr != NULL || extstr != NULL) && 5173089Swyllys (kstype == KMF_KEYSTORE_NSS || kstype == KMF_KEYSTORE_OPENSSL)) { 5183089Swyllys cryptoerror(LOG_STDERR, 5193089Swyllys gettext("The sensitive or extractable option applies " 5203089Swyllys "to the PKCS11 keystore only.\n")); 5213089Swyllys return (PK_ERR_USAGE); 5223089Swyllys } 5233089Swyllys 5243089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && tokenname == NULL) { 5253089Swyllys tokenname = PK_DEFAULT_PK11TOKEN; 5263089Swyllys } else if (kstype == KMF_KEYSTORE_NSS && tokenname == NULL) { 5273089Swyllys tokenname = DEFAULT_NSS_TOKEN; 5283089Swyllys } 5293089Swyllys 5303089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN || kstype == KMF_KEYSTORE_NSS) 5313089Swyllys (void) get_token_password(kstype, tokenname, &tokencred); 5323089Swyllys 533*5051Swyllys if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) { 5343089Swyllys cryptoerror(LOG_STDERR, gettext("Error initializing KMF\n")); 5353089Swyllys goto end; 5363089Swyllys } 5373089Swyllys 5383089Swyllys if (kstype == KMF_KEYSTORE_NSS) { 5393089Swyllys rv = genkey_nss(kmfhandle, tokenname, dir, prefix, 5403089Swyllys keylabel, keyAlg, keylen, &tokencred); 5413089Swyllys } else if (kstype == KMF_KEYSTORE_OPENSSL) { 5423089Swyllys rv = genkey_file(kmfhandle, keyAlg, keylen, dir, outkey, 5433089Swyllys print_hex); 5443089Swyllys } else { 5453089Swyllys rv = genkey_pkcs11(kmfhandle, tokenname, keylabel, keyAlg, 5463089Swyllys keylen, senstr, extstr, print_hex, &tokencred); 5473089Swyllys } 5483089Swyllys 5493089Swyllys end: 5503089Swyllys if (rv != KMF_OK) 5513089Swyllys display_error(kmfhandle, rv, 552*5051Swyllys gettext("Error generating key")); 5533089Swyllys 5543089Swyllys if (tokencred.cred != NULL) 5553089Swyllys free(tokencred.cred); 5563089Swyllys 557*5051Swyllys (void) kmf_finalize(kmfhandle); 5583089Swyllys if (rv != KMF_OK) 5593089Swyllys return (PK_ERR_USAGE); 5603089Swyllys 5613089Swyllys return (0); 5623089Swyllys } 563