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 /* 226354Swyllys * Copyright 2008 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 import operation for this tool. 3017Sdinak * The basic flow of the process is to decrypt the PKCS#12 3117Sdinak * input file if it has a password, parse the elements in 3217Sdinak * the file, find the soft token, log into it, import the 3317Sdinak * PKCS#11 objects into the soft token, and log out. 3417Sdinak */ 3517Sdinak 3617Sdinak #include <stdio.h> 3717Sdinak #include <stdlib.h> 3817Sdinak #include <string.h> 393089Swyllys #include <ctype.h> 4017Sdinak #include <errno.h> 4117Sdinak #include <fcntl.h> 4217Sdinak #include <sys/types.h> 4317Sdinak #include <sys/stat.h> 4417Sdinak #include "common.h" 453089Swyllys 463089Swyllys #include <kmfapi.h> 4717Sdinak 485536Swyllys #define NEW_ATTRLIST(a, n) \ 495536Swyllys { \ 505536Swyllys a = (KMF_ATTRIBUTE *)malloc(n * sizeof (KMF_ATTRIBUTE)); \ 515536Swyllys if (a == NULL) { \ 525536Swyllys rv = KMF_ERR_MEMORY; \ 535536Swyllys goto end; \ 545536Swyllys } \ 555536Swyllys (void) memset(a, 0, n * sizeof (KMF_ATTRIBUTE)); \ 565536Swyllys } 575536Swyllys 583089Swyllys static KMF_RETURN 593089Swyllys pk_import_pk12_files(KMF_HANDLE_T kmfhandle, KMF_CREDENTIAL *cred, 603089Swyllys char *outfile, char *certfile, char *keyfile, 616669Swyllys KMF_ENCODE_FORMAT outformat) 6217Sdinak { 633089Swyllys KMF_RETURN rv = KMF_OK; 645536Swyllys KMF_X509_DER_CERT *certs = NULL; 653089Swyllys KMF_RAW_KEY_DATA *keys = NULL; 663089Swyllys int ncerts = 0; 673089Swyllys int nkeys = 0; 683089Swyllys int i; 695051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 705536Swyllys KMF_ATTRIBUTE *attrlist = NULL; 715051Swyllys int numattr = 0; 7217Sdinak 735051Swyllys rv = kmf_import_objects(kmfhandle, outfile, cred, 745051Swyllys &certs, &ncerts, &keys, &nkeys); 7517Sdinak 763089Swyllys if (rv == KMF_OK) { 773089Swyllys (void) printf(gettext("Found %d certificate(s) and %d " 785051Swyllys "key(s) in %s\n"), ncerts, nkeys, outfile); 7917Sdinak } 8017Sdinak 813089Swyllys if (rv == KMF_OK && ncerts > 0) { 823089Swyllys char newcertfile[MAXPATHLEN]; 833089Swyllys 845536Swyllys NEW_ATTRLIST(attrlist, (3 + (3 * ncerts))); 855536Swyllys 865051Swyllys kmf_set_attr_at_index(attrlist, numattr, 875051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 885051Swyllys numattr++; 895051Swyllys 905051Swyllys kmf_set_attr_at_index(attrlist, numattr, 915051Swyllys KMF_ENCODE_FORMAT_ATTR, &outformat, sizeof (outformat)); 925051Swyllys numattr++; 933089Swyllys 943089Swyllys for (i = 0; rv == KMF_OK && i < ncerts; i++) { 955051Swyllys int num = numattr; 965051Swyllys 973089Swyllys /* 983089Swyllys * If storing more than 1 cert, gotta change 993089Swyllys * the name so we don't overwrite the previous one. 1003089Swyllys * Just append a _# to the name. 1013089Swyllys */ 1023089Swyllys if (i > 0) { 1033089Swyllys (void) snprintf(newcertfile, 1045051Swyllys sizeof (newcertfile), "%s_%d", certfile, i); 1055051Swyllys 1065051Swyllys kmf_set_attr_at_index(attrlist, num, 1075051Swyllys KMF_CERT_FILENAME_ATTR, newcertfile, 1085051Swyllys strlen(newcertfile)); 1095051Swyllys num++; 1103089Swyllys } else { 1115051Swyllys kmf_set_attr_at_index(attrlist, num, 1125051Swyllys KMF_CERT_FILENAME_ATTR, certfile, 1135051Swyllys strlen(certfile)); 1145051Swyllys num++; 1153089Swyllys } 1165051Swyllys 1175536Swyllys if (certs[i].kmf_private.label != NULL) { 1185536Swyllys kmf_set_attr_at_index(attrlist, num, 1195536Swyllys KMF_CERT_LABEL_ATTR, 1205536Swyllys certs[i].kmf_private.label, 1215536Swyllys strlen(certs[i].kmf_private.label)); 1225536Swyllys num++; 1235536Swyllys } 1245051Swyllys kmf_set_attr_at_index(attrlist, num, 1255536Swyllys KMF_CERT_DATA_ATTR, &certs[i].certificate, 1265536Swyllys sizeof (KMF_DATA)); 1275051Swyllys num++; 1285051Swyllys rv = kmf_store_cert(kmfhandle, num, attrlist); 1293089Swyllys } 1305536Swyllys free(attrlist); 1313089Swyllys } 1323089Swyllys if (rv == KMF_OK && nkeys > 0) { 1333089Swyllys char newkeyfile[MAXPATHLEN]; 1345051Swyllys numattr = 0; 1355536Swyllys NEW_ATTRLIST(attrlist, (4 + (4 * nkeys))); 1365051Swyllys 1375051Swyllys kmf_set_attr_at_index(attrlist, numattr, 1385051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 1395051Swyllys sizeof (kstype)); 1405051Swyllys numattr++; 1415051Swyllys 1425051Swyllys kmf_set_attr_at_index(attrlist, numattr, 1435051Swyllys KMF_ENCODE_FORMAT_ATTR, &outformat, 1445051Swyllys sizeof (outformat)); 1455051Swyllys numattr++; 1465051Swyllys 1475051Swyllys if (cred != NULL && cred->credlen > 0) { 1485051Swyllys kmf_set_attr_at_index(attrlist, numattr, 1495051Swyllys KMF_CREDENTIAL_ATTR, cred, 1505051Swyllys sizeof (KMF_CREDENTIAL)); 1515051Swyllys numattr++; 1525051Swyllys } 15317Sdinak 1543089Swyllys /* The order of certificates and keys should match */ 1553089Swyllys for (i = 0; rv == KMF_OK && i < nkeys; i++) { 1565051Swyllys int num = numattr; 1573089Swyllys 1583089Swyllys if (i > 0) { 1593089Swyllys (void) snprintf(newkeyfile, 1605051Swyllys sizeof (newkeyfile), "%s_%d", keyfile, i); 1615051Swyllys 1625051Swyllys kmf_set_attr_at_index(attrlist, num, 1635051Swyllys KMF_KEY_FILENAME_ATTR, newkeyfile, 1645051Swyllys strlen(newkeyfile)); 1655051Swyllys num++; 1663089Swyllys } else { 1675051Swyllys kmf_set_attr_at_index(attrlist, num, 1685051Swyllys KMF_KEY_FILENAME_ATTR, keyfile, 1695051Swyllys strlen(keyfile)); 1705051Swyllys num++; 1713089Swyllys } 17217Sdinak 1735536Swyllys if (i < ncerts) { 1745536Swyllys kmf_set_attr_at_index(attrlist, num, 1755536Swyllys KMF_CERT_DATA_ATTR, &certs[i], 1765536Swyllys sizeof (KMF_CERT_DATA_ATTR)); 1775536Swyllys num++; 1785536Swyllys } 1795051Swyllys 1805051Swyllys kmf_set_attr_at_index(attrlist, num, 1815051Swyllys KMF_RAW_KEY_ATTR, &keys[i], 1825051Swyllys sizeof (KMF_RAW_KEY_DATA)); 1835051Swyllys num++; 1845051Swyllys 1855051Swyllys rv = kmf_store_key(kmfhandle, num, attrlist); 1863089Swyllys } 1875536Swyllys free(attrlist); 1883089Swyllys } 1895536Swyllys end: 1903089Swyllys /* 1913089Swyllys * Cleanup memory. 1923089Swyllys */ 1933089Swyllys if (certs) { 1943089Swyllys for (i = 0; i < ncerts; i++) 1955536Swyllys kmf_free_kmf_cert(kmfhandle, &certs[i]); 1963089Swyllys free(certs); 1973089Swyllys } 1983089Swyllys if (keys) { 1993089Swyllys for (i = 0; i < nkeys; i++) 2005051Swyllys kmf_free_raw_key(&keys[i]); 2013089Swyllys free(keys); 20217Sdinak } 20317Sdinak 20417Sdinak 2053089Swyllys return (rv); 20617Sdinak } 20717Sdinak 2083089Swyllys 2093089Swyllys static KMF_RETURN 2103089Swyllys pk_import_pk12_nss( 2113089Swyllys KMF_HANDLE_T kmfhandle, KMF_CREDENTIAL *kmfcred, 2123089Swyllys KMF_CREDENTIAL *tokencred, 2133089Swyllys char *token_spec, char *dir, char *prefix, 2143089Swyllys char *nickname, char *trustflags, char *filename) 21517Sdinak { 2163089Swyllys KMF_RETURN rv = KMF_OK; 2175536Swyllys KMF_X509_DER_CERT *certs = NULL; 2183089Swyllys KMF_RAW_KEY_DATA *keys = NULL; 2193089Swyllys int ncerts = 0; 2203089Swyllys int nkeys = 0; 2213089Swyllys int i; 2225051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 2235536Swyllys KMF_ATTRIBUTE *attrlist = NULL; 2245051Swyllys int numattr = 0; 2253089Swyllys 2263089Swyllys rv = configure_nss(kmfhandle, dir, prefix); 2273089Swyllys if (rv != KMF_OK) 2283089Swyllys return (rv); 2293089Swyllys 2305051Swyllys rv = kmf_import_objects(kmfhandle, filename, kmfcred, 2315051Swyllys &certs, &ncerts, &keys, &nkeys); 2323089Swyllys 2333089Swyllys if (rv == KMF_OK) 2343089Swyllys (void) printf(gettext("Found %d certificate(s) and %d " 2355051Swyllys "key(s) in %s\n"), ncerts, nkeys, filename); 23617Sdinak 2373089Swyllys if (rv == KMF_OK) { 2385536Swyllys NEW_ATTRLIST(attrlist, (3 + (2 * ncerts))); 2395536Swyllys 2405051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2415051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 2425051Swyllys numattr++; 24317Sdinak 2445051Swyllys if (token_spec != NULL) { 2455051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2465051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 2475051Swyllys strlen(token_spec)); 2485051Swyllys numattr++; 2495051Swyllys } 2505051Swyllys 2515051Swyllys if (trustflags != NULL) { 2525051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2535051Swyllys KMF_TRUSTFLAG_ATTR, trustflags, 2545051Swyllys strlen(trustflags)); 2555051Swyllys numattr++; 2565051Swyllys } 25717Sdinak 2583089Swyllys for (i = 0; rv == KMF_OK && i < ncerts; i++) { 2595051Swyllys int num = numattr; 26017Sdinak 2615536Swyllys if (certs[i].kmf_private.label != NULL) { 2625536Swyllys kmf_set_attr_at_index(attrlist, num, 2635536Swyllys KMF_CERT_LABEL_ATTR, 2645536Swyllys certs[i].kmf_private.label, 2655536Swyllys strlen(certs[i].kmf_private.label)); 2665536Swyllys num++; 2675536Swyllys } else if (i == 0 && nickname != NULL) { 2685051Swyllys kmf_set_attr_at_index(attrlist, num, 2695051Swyllys KMF_CERT_LABEL_ATTR, nickname, 2705051Swyllys strlen(nickname)); 2715051Swyllys num++; 2725051Swyllys } 2735051Swyllys 2745051Swyllys kmf_set_attr_at_index(attrlist, num, 2755536Swyllys KMF_CERT_DATA_ATTR, 2765536Swyllys &certs[i].certificate, sizeof (KMF_DATA)); 2775051Swyllys num++; 2785051Swyllys rv = kmf_store_cert(kmfhandle, num, attrlist); 2793089Swyllys } 2805536Swyllys free(attrlist); 2815536Swyllys attrlist = NULL; 2823089Swyllys if (rv != KMF_OK) { 2833089Swyllys display_error(kmfhandle, rv, 2845051Swyllys gettext("Error storing certificate in NSS token")); 2853089Swyllys } 28617Sdinak } 28717Sdinak 2883089Swyllys if (rv == KMF_OK) { 2895051Swyllys numattr = 0; 2905536Swyllys NEW_ATTRLIST(attrlist, (4 + (2 * nkeys))); 2915051Swyllys 2925051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2935051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 2945051Swyllys sizeof (kstype)); 2955051Swyllys numattr++; 2965051Swyllys 2975051Swyllys if (token_spec != NULL) { 2985051Swyllys kmf_set_attr_at_index(attrlist, numattr, 2995051Swyllys KMF_TOKEN_LABEL_ATTR, token_spec, 3005051Swyllys strlen(token_spec)); 3015051Swyllys numattr++; 3025051Swyllys } 3035051Swyllys 3045051Swyllys if (nickname != NULL) { 3055051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3065051Swyllys KMF_KEYLABEL_ATTR, nickname, 3075051Swyllys strlen(nickname)); 3085051Swyllys numattr++; 3095051Swyllys } 3105051Swyllys 3115051Swyllys if (tokencred->credlen > 0) { 3125051Swyllys kmf_set_attr_at_index(attrlist, numattr, 3135051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 3145051Swyllys sizeof (KMF_CREDENTIAL)); 3155051Swyllys numattr++; 3165051Swyllys } 3173089Swyllys 3183089Swyllys /* The order of certificates and keys should match */ 3193089Swyllys for (i = 0; i < nkeys; i++) { 3205051Swyllys int num = numattr; 3215051Swyllys 3225536Swyllys if (i < ncerts) { 3235536Swyllys kmf_set_attr_at_index(attrlist, num, 3245536Swyllys KMF_CERT_DATA_ATTR, &certs[i], 3255536Swyllys sizeof (KMF_DATA)); 3265536Swyllys num++; 3275536Swyllys } 3283089Swyllys 3295051Swyllys kmf_set_attr_at_index(attrlist, num, 3305051Swyllys KMF_RAW_KEY_ATTR, &keys[i], 3315051Swyllys sizeof (KMF_RAW_KEY_DATA)); 3325051Swyllys num++; 3335051Swyllys 3345051Swyllys rv = kmf_store_key(kmfhandle, num, attrlist); 3353089Swyllys } 3365536Swyllys free(attrlist); 3373089Swyllys } 3383089Swyllys 3395536Swyllys end: 3403089Swyllys /* 3413089Swyllys * Cleanup memory. 3423089Swyllys */ 3433089Swyllys if (certs) { 3443089Swyllys for (i = 0; i < ncerts; i++) 3455536Swyllys kmf_free_kmf_cert(kmfhandle, &certs[i]); 3463089Swyllys free(certs); 3473089Swyllys } 3483089Swyllys if (keys) { 3493089Swyllys for (i = 0; i < nkeys; i++) 3505051Swyllys kmf_free_raw_key(&keys[i]); 3513089Swyllys free(keys); 35217Sdinak } 35317Sdinak 3543089Swyllys return (rv); 3553089Swyllys } 35617Sdinak 3573089Swyllys static KMF_RETURN 3583089Swyllys pk_import_cert( 3593089Swyllys KMF_HANDLE_T kmfhandle, 3603089Swyllys KMF_KEYSTORE_TYPE kstype, 3613089Swyllys char *label, char *token_spec, char *filename, 3623089Swyllys char *dir, char *prefix, char *trustflags) 3633089Swyllys { 3643089Swyllys KMF_RETURN rv = KMF_OK; 3655051Swyllys KMF_ATTRIBUTE attrlist[32]; 3666354Swyllys KMF_CREDENTIAL tokencred; 3675051Swyllys int i = 0; 36817Sdinak 3693089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) { 3703089Swyllys rv = select_token(kmfhandle, token_spec, FALSE); 3715051Swyllys } else if (kstype == KMF_KEYSTORE_NSS) { 3725051Swyllys rv = configure_nss(kmfhandle, dir, prefix); 3735051Swyllys } 3745051Swyllys if (rv != KMF_OK) 3755051Swyllys return (rv); 37617Sdinak 3775051Swyllys kmf_set_attr_at_index(attrlist, i, 3785051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (KMF_KEYSTORE_TYPE)); 3795051Swyllys i++; 3805051Swyllys 3815051Swyllys kmf_set_attr_at_index(attrlist, i, KMF_CERT_FILENAME_ATTR, 3825051Swyllys filename, strlen(filename)); 3835051Swyllys i++; 3845051Swyllys 3855051Swyllys if (label != NULL) { 3865051Swyllys kmf_set_attr_at_index(attrlist, i, KMF_CERT_LABEL_ATTR, 3875051Swyllys label, strlen(label)); 3885051Swyllys i++; 3895051Swyllys } 3905051Swyllys 3915051Swyllys if (kstype == KMF_KEYSTORE_NSS) { 3925051Swyllys if (trustflags != NULL) { 3935051Swyllys kmf_set_attr_at_index(attrlist, i, KMF_TRUSTFLAG_ATTR, 3945051Swyllys trustflags, strlen(trustflags)); 3955051Swyllys i++; 3965051Swyllys } 3975051Swyllys 3985051Swyllys if (token_spec != NULL) { 3995051Swyllys kmf_set_attr_at_index(attrlist, i, 4005051Swyllys KMF_TOKEN_LABEL_ATTR, 4015051Swyllys token_spec, strlen(token_spec)); 4025051Swyllys i++; 40317Sdinak } 4043089Swyllys } 40517Sdinak 4065051Swyllys rv = kmf_import_cert(kmfhandle, i, attrlist); 4076354Swyllys if (rv == KMF_ERR_AUTH_FAILED) { 4086354Swyllys /* 4096354Swyllys * The token requires a credential, prompt and try again. 4106354Swyllys */ 4116354Swyllys (void) get_token_password(kstype, token_spec, &tokencred); 4126354Swyllys kmf_set_attr_at_index(attrlist, i, KMF_CREDENTIAL_ATTR, 4136354Swyllys &tokencred, sizeof (KMF_CREDENTIAL)); 4146354Swyllys i++; 4156354Swyllys 4166354Swyllys rv = kmf_import_cert(kmfhandle, i, attrlist); 4176354Swyllys 4186354Swyllys } 4193089Swyllys return (rv); 4203089Swyllys } 4213089Swyllys 4223089Swyllys static KMF_RETURN 4233089Swyllys pk_import_file_crl(void *kmfhandle, 4243089Swyllys char *infile, 4253089Swyllys char *outfile, 4263089Swyllys KMF_ENCODE_FORMAT outfmt) 4273089Swyllys { 4285051Swyllys int numattr = 0; 4295051Swyllys KMF_ATTRIBUTE attrlist[8]; 4305051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL; 4313089Swyllys 4325051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 4335051Swyllys &kstype, sizeof (kstype)); 4345051Swyllys numattr++; 4355051Swyllys if (infile) { 4365051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4375051Swyllys KMF_CRL_FILENAME_ATTR, infile, strlen(infile)); 4385051Swyllys numattr++; 4395051Swyllys } 4405051Swyllys if (outfile) { 4415051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4425051Swyllys KMF_CRL_OUTFILE_ATTR, outfile, strlen(outfile)); 4435051Swyllys numattr++; 4445051Swyllys } 4455051Swyllys kmf_set_attr_at_index(attrlist, numattr, 4465051Swyllys KMF_ENCODE_FORMAT_ATTR, &outfmt, sizeof (outfmt)); 4475051Swyllys numattr++; 4483089Swyllys 4495051Swyllys return (kmf_import_crl(kmfhandle, numattr, attrlist)); 4503089Swyllys } 4513089Swyllys 4523089Swyllys static KMF_RETURN 4533089Swyllys pk_import_nss_crl(void *kmfhandle, 4543089Swyllys boolean_t verify_crl_flag, 4553089Swyllys char *infile, 4563089Swyllys char *outdir, 4573089Swyllys char *prefix) 4583089Swyllys { 4593089Swyllys KMF_RETURN rv; 4605051Swyllys int numattr = 0; 4615051Swyllys KMF_ATTRIBUTE attrlist[4]; 4625051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS; 4633089Swyllys 4643089Swyllys rv = configure_nss(kmfhandle, outdir, prefix); 4653089Swyllys if (rv != KMF_OK) 4663089Swyllys return (rv); 4673089Swyllys 4685051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 4695051Swyllys &kstype, sizeof (kstype)); 4705051Swyllys numattr++; 4715051Swyllys if (infile) { 4725051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR, 4735051Swyllys infile, strlen(infile)); 4745051Swyllys numattr++; 4755051Swyllys } 4765051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_CHECK_ATTR, 4775051Swyllys &verify_crl_flag, sizeof (verify_crl_flag)); 4785051Swyllys numattr++; 4793089Swyllys 4805051Swyllys return (kmf_import_crl(kmfhandle, numattr, attrlist)); 4813089Swyllys 4823089Swyllys } 4833089Swyllys 4843089Swyllys static KMF_RETURN 4853089Swyllys pk_import_pk12_pk11( 4863089Swyllys KMF_HANDLE_T kmfhandle, 4873089Swyllys KMF_CREDENTIAL *p12cred, 4883089Swyllys KMF_CREDENTIAL *tokencred, 4893089Swyllys char *label, char *token_spec, 4903089Swyllys char *filename) 4913089Swyllys { 4923089Swyllys KMF_RETURN rv = KMF_OK; 4935536Swyllys KMF_X509_DER_CERT *certs = NULL; 4943089Swyllys KMF_RAW_KEY_DATA *keys = NULL; 4953089Swyllys int ncerts = 0; 4963089Swyllys int nkeys = 0; 4973089Swyllys int i; 4985051Swyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN; 4995536Swyllys KMF_ATTRIBUTE *attrlist = NULL; 5005051Swyllys int numattr = 0; 5013089Swyllys 5023089Swyllys rv = select_token(kmfhandle, token_spec, FALSE); 5033089Swyllys 5043089Swyllys if (rv != KMF_OK) { 50517Sdinak return (rv); 50617Sdinak } 50717Sdinak 5085051Swyllys rv = kmf_import_objects(kmfhandle, filename, p12cred, 5095051Swyllys &certs, &ncerts, &keys, &nkeys); 5103089Swyllys 5113089Swyllys if (rv == KMF_OK) { 5125536Swyllys NEW_ATTRLIST(attrlist, (3 + (2 * nkeys))); 5135051Swyllys 5145051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5155051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, 5165051Swyllys sizeof (kstype)); 5175051Swyllys numattr++; 5185051Swyllys 5195051Swyllys if (label != NULL) { 5205051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5215051Swyllys KMF_KEYLABEL_ATTR, label, 5225051Swyllys strlen(label)); 5235051Swyllys numattr++; 5245051Swyllys } 5255051Swyllys 5265051Swyllys if (tokencred != NULL && tokencred->credlen > 0) { 5275051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5285051Swyllys KMF_CREDENTIAL_ATTR, tokencred, 5295051Swyllys sizeof (KMF_CREDENTIAL)); 5305051Swyllys numattr++; 5315051Swyllys } 5323089Swyllys 5333089Swyllys /* The order of certificates and keys should match */ 5343089Swyllys for (i = 0; i < nkeys; i++) { 5355051Swyllys int num = numattr; 5365051Swyllys 5375536Swyllys if (i < ncerts) { 5385536Swyllys kmf_set_attr_at_index(attrlist, num, 5395536Swyllys KMF_CERT_DATA_ATTR, &certs[i].certificate, 5405536Swyllys sizeof (KMF_DATA)); 5415536Swyllys num++; 5425536Swyllys } 5433089Swyllys 5445051Swyllys kmf_set_attr_at_index(attrlist, num, 5455051Swyllys KMF_RAW_KEY_ATTR, &keys[i], 5465051Swyllys sizeof (KMF_RAW_KEY_DATA)); 5475051Swyllys num++; 5485051Swyllys 5495051Swyllys rv = kmf_store_key(kmfhandle, num, attrlist); 5505051Swyllys 5513089Swyllys } 5525536Swyllys free(attrlist); 5533089Swyllys } 5543089Swyllys 5553089Swyllys if (rv == KMF_OK) { 5565536Swyllys numattr = 0; 5575536Swyllys NEW_ATTRLIST(attrlist, (1 + (2 * ncerts))); 5583089Swyllys 5593089Swyllys (void) printf(gettext("Found %d certificate(s) and %d " 5605051Swyllys "key(s) in %s\n"), ncerts, nkeys, filename); 5615536Swyllys 5625051Swyllys kmf_set_attr_at_index(attrlist, numattr, 5635051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 5645051Swyllys numattr++; 5653089Swyllys 5663089Swyllys for (i = 0; rv == KMF_OK && i < ncerts; i++) { 5675051Swyllys int num = numattr; 5685536Swyllys if (certs[i].kmf_private.label != NULL) { 5695536Swyllys kmf_set_attr_at_index(attrlist, num, 5705536Swyllys KMF_CERT_LABEL_ATTR, 5715536Swyllys certs[i].kmf_private.label, 5725536Swyllys strlen(certs[i].kmf_private.label)); 5735536Swyllys num++; 5745536Swyllys } else if (i == 0 && label != NULL) { 5755051Swyllys kmf_set_attr_at_index(attrlist, num, 5765051Swyllys KMF_CERT_LABEL_ATTR, label, strlen(label)); 5775051Swyllys num++; 5785051Swyllys } 5795051Swyllys 5805051Swyllys kmf_set_attr_at_index(attrlist, num, 5815536Swyllys KMF_CERT_DATA_ATTR, &certs[i].certificate, 5825536Swyllys sizeof (KMF_DATA)); 5835051Swyllys num++; 5845051Swyllys 5855051Swyllys rv = kmf_store_cert(kmfhandle, num, attrlist); 5863089Swyllys } 5875536Swyllys free(attrlist); 5883089Swyllys } 5893089Swyllys 5905536Swyllys end: 5913089Swyllys /* 5923089Swyllys * Cleanup memory. 5933089Swyllys */ 5943089Swyllys if (certs) { 5953089Swyllys for (i = 0; i < ncerts; i++) 5965536Swyllys kmf_free_kmf_cert(kmfhandle, &certs[i]); 5973089Swyllys free(certs); 5983089Swyllys } 5993089Swyllys if (keys) { 6003089Swyllys for (i = 0; i < nkeys; i++) 6015051Swyllys kmf_free_raw_key(&keys[i]); 6023089Swyllys free(keys); 6033089Swyllys } 6043089Swyllys 6053089Swyllys return (rv); 60617Sdinak } 60717Sdinak 6085069Swyllys /*ARGSUSED*/ 6095051Swyllys static KMF_RETURN 6105051Swyllys pk_import_keys(KMF_HANDLE_T kmfhandle, 6115051Swyllys KMF_KEYSTORE_TYPE kstype, char *token_spec, 6125051Swyllys KMF_CREDENTIAL *cred, char *filename, 6135051Swyllys char *label, char *senstr, char *extstr) 6145051Swyllys { 6155051Swyllys KMF_RETURN rv = KMF_OK; 6165051Swyllys KMF_ATTRIBUTE attrlist[16]; 6175051Swyllys KMF_KEYSTORE_TYPE fileks = KMF_KEYSTORE_OPENSSL; 6185051Swyllys int numattr = 0; 6195051Swyllys KMF_KEY_HANDLE key; 6205051Swyllys KMF_RAW_KEY_DATA rawkey; 6215051Swyllys KMF_KEY_CLASS class = KMF_ASYM_PRI; 6225051Swyllys int numkeys = 1; 6235051Swyllys 6245051Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN) { 6255051Swyllys rv = select_token(kmfhandle, token_spec, FALSE); 6265051Swyllys } 6275051Swyllys if (rv != KMF_OK) 6285051Swyllys return (rv); 6295051Swyllys /* 6305051Swyllys * First, set up to read the keyfile using the FILE plugin 6315051Swyllys * mechanisms. 6325051Swyllys */ 6335051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 6345051Swyllys &fileks, sizeof (fileks)); 6355051Swyllys numattr++; 6365051Swyllys 6375051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR, 6385051Swyllys &numkeys, sizeof (numkeys)); 6395051Swyllys numattr++; 6405051Swyllys 6415051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR, 6425051Swyllys &key, sizeof (key)); 6435051Swyllys numattr++; 6445051Swyllys 6455051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_RAW_KEY_ATTR, 6465051Swyllys &rawkey, sizeof (rawkey)); 6475051Swyllys numattr++; 6485051Swyllys 6495051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYCLASS_ATTR, 6505051Swyllys &class, sizeof (class)); 6515051Swyllys numattr++; 6525051Swyllys 6535051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR, 6545051Swyllys filename, strlen(filename)); 6555051Swyllys numattr++; 6565051Swyllys 6575051Swyllys rv = kmf_find_key(kmfhandle, numattr, attrlist); 6585051Swyllys if (rv == KMF_OK) { 6595051Swyllys numattr = 0; 6605051Swyllys 6615051Swyllys kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR, 6625051Swyllys &kstype, sizeof (kstype)); 6635051Swyllys numattr++; 6645051Swyllys 6655051Swyllys if (cred != NULL && cred->credlen > 0) { 6665051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6675051Swyllys KMF_CREDENTIAL_ATTR, cred, sizeof (KMF_CREDENTIAL)); 6685051Swyllys numattr++; 6695051Swyllys } 6705051Swyllys 6715051Swyllys if (label != NULL) { 6725051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6735051Swyllys KMF_KEYLABEL_ATTR, label, strlen(label)); 6745051Swyllys numattr++; 6755051Swyllys } 6765051Swyllys 6775051Swyllys kmf_set_attr_at_index(attrlist, numattr, 6785051Swyllys KMF_RAW_KEY_ATTR, &rawkey, sizeof (rawkey)); 6795051Swyllys numattr++; 6805051Swyllys 6815051Swyllys rv = kmf_store_key(kmfhandle, numattr, attrlist); 6825051Swyllys if (rv == KMF_OK) { 6835069Swyllys (void) printf(gettext("Importing %d keys\n"), numkeys); 6845051Swyllys } 6855051Swyllys 6865051Swyllys kmf_free_kmf_key(kmfhandle, &key); 6875051Swyllys kmf_free_raw_key(&rawkey); 6885051Swyllys } else { 6895051Swyllys cryptoerror(LOG_STDERR, 6905051Swyllys gettext("Failed to load key from file (%s)\n"), 6915051Swyllys filename); 6925051Swyllys } 6935051Swyllys return (rv); 6945051Swyllys } 6955051Swyllys 6965051Swyllys static KMF_RETURN 6975051Swyllys pk_import_rawkey(KMF_HANDLE_T kmfhandle, 6985051Swyllys KMF_KEYSTORE_TYPE kstype, char *token, 6995051Swyllys KMF_CREDENTIAL *cred, 7005051Swyllys char *filename, char *label, KMF_KEY_ALG keyAlg, 7015051Swyllys char *senstr, char *extstr) 7025051Swyllys { 7035051Swyllys KMF_RETURN rv = KMF_OK; 7045051Swyllys KMF_ATTRIBUTE attrlist[16]; 7055051Swyllys int numattr = 0; 7065051Swyllys uint32_t keylen; 7075051Swyllys boolean_t sensitive = B_FALSE; 7085051Swyllys boolean_t not_extractable = B_FALSE; 7095051Swyllys KMF_DATA keydata = {NULL, 0}; 7105051Swyllys KMF_KEY_HANDLE rawkey; 7115051Swyllys 7125051Swyllys rv = kmf_read_input_file(kmfhandle, filename, &keydata); 7135051Swyllys if (rv != KMF_OK) 7145051Swyllys return (rv); 7155051Swyllys 7165051Swyllys rv = select_token(kmfhandle, token, FALSE); 7175051Swyllys 7185051Swyllys if (rv != KMF_OK) { 7195051Swyllys return (rv); 7205051Swyllys } 7215051Swyllys if (senstr != NULL) { 7225051Swyllys if (tolower(senstr[0]) == 'y') 7235051Swyllys sensitive = B_TRUE; 7245051Swyllys else if (tolower(senstr[0]) == 'n') 7255051Swyllys sensitive = B_FALSE; 7265051Swyllys else { 7275051Swyllys cryptoerror(LOG_STDERR, 7285051Swyllys gettext("Incorrect sensitive option value.\n")); 7295051Swyllys return (KMF_ERR_BAD_PARAMETER); 7305051Swyllys } 7315051Swyllys } 7325051Swyllys 7335051Swyllys if (extstr != NULL) { 7345051Swyllys if (tolower(extstr[0]) == 'y') 7355051Swyllys not_extractable = B_FALSE; 7365051Swyllys else if (tolower(extstr[0]) == 'n') 7375051Swyllys not_extractable = B_TRUE; 7385051Swyllys else { 7395051Swyllys cryptoerror(LOG_STDERR, 7405051Swyllys gettext("Incorrect extractable option value.\n")); 7415051Swyllys return (KMF_ERR_BAD_PARAMETER); 7425051Swyllys } 7435051Swyllys } 7445051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7455051Swyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype)); 7465051Swyllys numattr++; 7475051Swyllys 7485051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7495051Swyllys KMF_KEY_HANDLE_ATTR, &rawkey, sizeof (rawkey)); 7505051Swyllys numattr++; 7515051Swyllys 7525051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7535051Swyllys KMF_KEYALG_ATTR, &keyAlg, sizeof (KMF_KEY_ALG)); 7545051Swyllys numattr++; 7555051Swyllys 7565051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7575051Swyllys KMF_KEY_DATA_ATTR, keydata.Data, keydata.Length); 7585051Swyllys numattr++; 7595051Swyllys 7605051Swyllys /* Key length is given in bits not bytes */ 7615051Swyllys keylen = keydata.Length * 8; 7625051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7635051Swyllys KMF_KEYLENGTH_ATTR, &keylen, sizeof (keydata.Length)); 7645051Swyllys numattr++; 7655051Swyllys 7665051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7675051Swyllys KMF_SENSITIVE_BOOL_ATTR, &sensitive, sizeof (sensitive)); 7685051Swyllys numattr++; 7695051Swyllys 7705051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7715051Swyllys KMF_NON_EXTRACTABLE_BOOL_ATTR, ¬_extractable, 7725051Swyllys sizeof (not_extractable)); 7735051Swyllys numattr++; 7745051Swyllys 7755051Swyllys if (label != NULL) { 7765051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7775051Swyllys KMF_KEYLABEL_ATTR, label, strlen(label)); 7785051Swyllys numattr++; 7795051Swyllys } 7805051Swyllys if (cred != NULL && cred->credlen > 0) { 7815051Swyllys kmf_set_attr_at_index(attrlist, numattr, 7825051Swyllys KMF_CREDENTIAL_ATTR, cred, sizeof (KMF_CREDENTIAL)); 7835051Swyllys numattr++; 7845051Swyllys } 7855051Swyllys rv = kmf_create_sym_key(kmfhandle, numattr, attrlist); 7865051Swyllys 7875051Swyllys return (rv); 7885051Swyllys } 7895051Swyllys 79017Sdinak /* 7913089Swyllys * Import objects from into KMF repositories. 79217Sdinak */ 79317Sdinak int 79417Sdinak pk_import(int argc, char *argv[]) 79517Sdinak { 796864Sdinak int opt; 797864Sdinak extern int optind_av; 798864Sdinak extern char *optarg_av; 799864Sdinak char *token_spec = NULL; 80017Sdinak char *filename = NULL; 8013089Swyllys char *keyfile = NULL; 8023089Swyllys char *certfile = NULL; 8033089Swyllys char *crlfile = NULL; 8045051Swyllys char *label = NULL; 8053089Swyllys char *dir = NULL; 8063089Swyllys char *prefix = NULL; 8073089Swyllys char *trustflags = NULL; 8083089Swyllys char *verify_crl = NULL; 8095051Swyllys char *keytype = "generic"; 8105051Swyllys char *senstr = NULL; 8115051Swyllys char *extstr = NULL; 8123089Swyllys boolean_t verify_crl_flag = B_FALSE; 8133089Swyllys int oclass = 0; 8143089Swyllys KMF_KEYSTORE_TYPE kstype = 0; 8153089Swyllys KMF_ENCODE_FORMAT kfmt = 0; 8163089Swyllys KMF_ENCODE_FORMAT okfmt = KMF_FORMAT_ASN1; 8173089Swyllys KMF_RETURN rv = KMF_OK; 8183089Swyllys KMF_CREDENTIAL pk12cred = { NULL, 0 }; 8193089Swyllys KMF_CREDENTIAL tokencred = { NULL, 0 }; 8203089Swyllys KMF_HANDLE_T kmfhandle = NULL; 8215051Swyllys KMF_KEY_ALG keyAlg = KMF_GENERIC_SECRET; 82217Sdinak 823864Sdinak /* Parse command line options. Do NOT i18n/l10n. */ 8243089Swyllys while ((opt = getopt_av(argc, argv, 8255051Swyllys "T:(token)i:(infile)" 8265051Swyllys "k:(keystore)y:(objtype)" 8275051Swyllys "d:(dir)p:(prefix)" 8285051Swyllys "n:(certlabel)N:(label)" 8295051Swyllys "K:(outkey)c:(outcert)" 8305051Swyllys "v:(verifycrl)l:(outcrl)" 8315051Swyllys "E:(keytype)s:(sensitive)x:(extractable)" 8326669Swyllys "t:(trust)F:(outformat)")) != EOF) { 8333089Swyllys if (EMPTYSTRING(optarg_av)) 8343089Swyllys return (PK_ERR_USAGE); 835864Sdinak switch (opt) { 836864Sdinak case 'T': /* token specifier */ 837864Sdinak if (token_spec) 838864Sdinak return (PK_ERR_USAGE); 839864Sdinak token_spec = optarg_av; 840864Sdinak break; 8413089Swyllys case 'c': /* output cert file name */ 8423089Swyllys if (certfile) 8433089Swyllys return (PK_ERR_USAGE); 8443089Swyllys certfile = optarg_av; 8453089Swyllys break; 8463089Swyllys case 'l': /* output CRL file name */ 8473089Swyllys if (crlfile) 8483089Swyllys return (PK_ERR_USAGE); 8493089Swyllys crlfile = optarg_av; 8503089Swyllys break; 8513089Swyllys case 'K': /* output key file name */ 8523089Swyllys if (keyfile) 8533089Swyllys return (PK_ERR_USAGE); 8543089Swyllys keyfile = optarg_av; 8553089Swyllys break; 856864Sdinak case 'i': /* input file name */ 857864Sdinak if (filename) 858864Sdinak return (PK_ERR_USAGE); 859864Sdinak filename = optarg_av; 860864Sdinak break; 8613089Swyllys case 'k': 8623089Swyllys kstype = KS2Int(optarg_av); 8633089Swyllys if (kstype == 0) 8643089Swyllys return (PK_ERR_USAGE); 8653089Swyllys break; 8663089Swyllys case 'y': 8673089Swyllys oclass = OT2Int(optarg_av); 8683089Swyllys if (oclass == -1) 8693089Swyllys return (PK_ERR_USAGE); 8703089Swyllys break; 8713089Swyllys case 'd': 8723089Swyllys dir = optarg_av; 8733089Swyllys break; 8743089Swyllys case 'p': 8753089Swyllys if (prefix) 8763089Swyllys return (PK_ERR_USAGE); 8773089Swyllys prefix = optarg_av; 8783089Swyllys break; 8793089Swyllys case 'n': 8803089Swyllys case 'N': 8815051Swyllys if (label) 8823089Swyllys return (PK_ERR_USAGE); 8835051Swyllys label = optarg_av; 8843089Swyllys break; 8853089Swyllys case 'F': 8863089Swyllys okfmt = Str2Format(optarg_av); 8873089Swyllys if (okfmt == KMF_FORMAT_UNDEF) 8883089Swyllys return (PK_ERR_USAGE); 8893089Swyllys break; 8903089Swyllys case 't': 8913089Swyllys if (trustflags) 8923089Swyllys return (PK_ERR_USAGE); 8933089Swyllys trustflags = optarg_av; 8943089Swyllys break; 8953089Swyllys case 'v': 8963089Swyllys verify_crl = optarg_av; 8973089Swyllys if (tolower(verify_crl[0]) == 'y') 8983089Swyllys verify_crl_flag = B_TRUE; 8993089Swyllys else if (tolower(verify_crl[0]) == 'n') 9003089Swyllys verify_crl_flag = B_FALSE; 9013089Swyllys else 9023089Swyllys return (PK_ERR_USAGE); 9033089Swyllys break; 9045051Swyllys case 'E': 9055051Swyllys keytype = optarg_av; 9065051Swyllys break; 9075051Swyllys case 's': 9085051Swyllys if (senstr) 9095051Swyllys return (PK_ERR_USAGE); 9105051Swyllys senstr = optarg_av; 9115051Swyllys break; 9125051Swyllys case 'x': 9135051Swyllys if (extstr) 9145051Swyllys return (PK_ERR_USAGE); 9155051Swyllys extstr = optarg_av; 9165051Swyllys break; 917864Sdinak default: 918864Sdinak return (PK_ERR_USAGE); 919864Sdinak break; 920864Sdinak } 921864Sdinak } 92217Sdinak 9233089Swyllys /* Assume keystore = PKCS#11 if not specified */ 9243089Swyllys if (kstype == 0) 9253089Swyllys kstype = KMF_KEYSTORE_PK11TOKEN; 926864Sdinak 927864Sdinak /* Filename arg is required. */ 9283089Swyllys if (EMPTYSTRING(filename)) { 9293089Swyllys cryptoerror(LOG_STDERR, gettext("The 'infile' parameter" 9305051Swyllys "is required for the import operation.\n")); 93117Sdinak return (PK_ERR_USAGE); 9323089Swyllys } 93317Sdinak 934864Sdinak /* No additional args allowed. */ 935864Sdinak argc -= optind_av; 936864Sdinak argv += optind_av; 937864Sdinak if (argc) 938864Sdinak return (PK_ERR_USAGE); 93917Sdinak 940*6884Swyllys DIR_OPTION_CHECK(kstype, dir); 941*6884Swyllys 9423089Swyllys /* if PUBLIC or PRIVATE obj was given, the old syntax was used. */ 9433089Swyllys if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) && 9445051Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 9453089Swyllys 9463089Swyllys (void) fprintf(stderr, gettext("The objtype parameter " 9475051Swyllys "is only relevant if keystore=pkcs11\n")); 9483089Swyllys return (PK_ERR_USAGE); 94917Sdinak } 95017Sdinak 9513089Swyllys /* 9523089Swyllys * You must specify a certlabel (cert label) when importing 9533089Swyllys * into NSS or PKCS#11. 9543089Swyllys */ 9553089Swyllys if (kstype == KMF_KEYSTORE_NSS && 9565051Swyllys (oclass != PK_CRL_OBJ) && EMPTYSTRING(label)) { 9573089Swyllys cryptoerror(LOG_STDERR, gettext("The 'label' argument " 9585051Swyllys "is required for this operation\n")); 9593089Swyllys return (PK_ERR_USAGE); 96017Sdinak } 96117Sdinak 9625051Swyllys if ((rv = kmf_get_file_format(filename, &kfmt)) != KMF_OK) { 9635051Swyllys /* 9645051Swyllys * Allow for raw key data to be imported. 9655051Swyllys */ 9665051Swyllys if (rv == KMF_ERR_ENCODING) { 9675051Swyllys rv = KMF_OK; 9685051Swyllys kfmt = KMF_FORMAT_RAWKEY; 9695051Swyllys /* 9705051Swyllys * Set the object class only if it was not 9715051Swyllys * given on the command line or if it was 9725051Swyllys * specified as a symmetric key object. 9735051Swyllys */ 9745051Swyllys if (oclass == 0 || (oclass & PK_SYMKEY_OBJ)) { 9755051Swyllys oclass = PK_SYMKEY_OBJ; 9765051Swyllys } else { 9775051Swyllys cryptoerror(LOG_STDERR, gettext( 9785051Swyllys "The input file does not contain the " 9795051Swyllys "object type indicated on command " 9805051Swyllys "line.")); 9815051Swyllys return (KMF_ERR_BAD_PARAMETER); 9825051Swyllys } 9835051Swyllys } else { 9845051Swyllys cryptoerror(LOG_STDERR, 9855051Swyllys gettext("File format not recognized.")); 9865051Swyllys return (rv); 9875051Swyllys } 9885051Swyllys } 9895051Swyllys 9905051Swyllys /* Check parameters for raw key import operation */ 9915051Swyllys if (kfmt == KMF_FORMAT_RAWKEY) { 9925051Swyllys if (keytype != NULL && 9935051Swyllys Str2SymKeyType(keytype, &keyAlg) != 0) { 9945051Swyllys cryptoerror(LOG_STDERR, 9955051Swyllys gettext("Unrecognized keytype(%s).\n"), keytype); 9965051Swyllys return (PK_ERR_USAGE); 9975051Swyllys } 9985051Swyllys if (senstr != NULL && extstr != NULL && 9995051Swyllys kstype != KMF_KEYSTORE_PK11TOKEN) { 10005051Swyllys cryptoerror(LOG_STDERR, 10015051Swyllys gettext("The sensitive or extractable option " 10025051Swyllys "applies only when importing a key from a file " 10035051Swyllys "into a PKCS#11 keystore.\n")); 10043089Swyllys return (PK_ERR_USAGE); 10053089Swyllys } 100617Sdinak } 100717Sdinak 10085051Swyllys /* If no objtype was given, treat it as a certificate */ 10093089Swyllys if (oclass == 0 && (kfmt == KMF_FORMAT_ASN1 || 10105051Swyllys kfmt == KMF_FORMAT_PEM)) 10113089Swyllys oclass = PK_CERT_OBJ; 101217Sdinak 10133089Swyllys if (kstype == KMF_KEYSTORE_NSS) { 10143089Swyllys if (oclass == PK_CRL_OBJ && 10155051Swyllys (kfmt != KMF_FORMAT_ASN1 && kfmt != KMF_FORMAT_PEM)) { 10163089Swyllys cryptoerror(LOG_STDERR, gettext( 10175051Swyllys "CRL data can only be imported as DER or " 10185051Swyllys "PEM format")); 10193089Swyllys return (PK_ERR_USAGE); 10203089Swyllys } 10213089Swyllys 10223089Swyllys if (oclass == PK_CERT_OBJ && 10235051Swyllys (kfmt != KMF_FORMAT_ASN1 && kfmt != KMF_FORMAT_PEM)) { 10243089Swyllys cryptoerror(LOG_STDERR, gettext( 10255051Swyllys "Certificates can only be imported as DER or " 10265051Swyllys "PEM format")); 10273089Swyllys return (PK_ERR_USAGE); 10283089Swyllys } 10293089Swyllys 10303089Swyllys /* we do not import private keys except in PKCS12 bundles */ 10313089Swyllys if (oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)) { 10323089Swyllys cryptoerror(LOG_STDERR, gettext( 10335051Swyllys "Private key data can only be imported as part " 10345051Swyllys "of a PKCS12 file.\n")); 10353089Swyllys return (PK_ERR_USAGE); 10363089Swyllys } 103717Sdinak } 103817Sdinak 10393089Swyllys if (kstype == KMF_KEYSTORE_OPENSSL && oclass != PK_CRL_OBJ) { 10403089Swyllys if (EMPTYSTRING(keyfile) || EMPTYSTRING(certfile)) { 104117Sdinak cryptoerror(LOG_STDERR, gettext( 10425051Swyllys "The 'outkey' and 'outcert' parameters " 10435051Swyllys "are required for the import operation " 10445051Swyllys "when the 'file' keystore is used.\n")); 10453089Swyllys return (PK_ERR_USAGE); 104617Sdinak } 104717Sdinak } 104817Sdinak 10493089Swyllys if (kstype == KMF_KEYSTORE_PK11TOKEN && EMPTYSTRING(token_spec)) 10503089Swyllys token_spec = PK_DEFAULT_PK11TOKEN; 10513089Swyllys else if (kstype == KMF_KEYSTORE_NSS && EMPTYSTRING(token_spec)) 10523089Swyllys token_spec = DEFAULT_NSS_TOKEN; 10533089Swyllys 10543089Swyllys if (kfmt == KMF_FORMAT_PKCS12) { 10553089Swyllys (void) get_pk12_password(&pk12cred); 10563089Swyllys } 10573089Swyllys 10585051Swyllys if ((kfmt == KMF_FORMAT_PKCS12 || kfmt == KMF_FORMAT_RAWKEY || 10595051Swyllys (kfmt == KMF_FORMAT_PEM && (oclass & PK_KEY_OBJ))) && 10605051Swyllys (kstype == KMF_KEYSTORE_PK11TOKEN || kstype == KMF_KEYSTORE_NSS)) { 10615051Swyllys (void) get_token_password(kstype, token_spec, &tokencred); 10625051Swyllys } 10635051Swyllys 10645051Swyllys if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) { 10653089Swyllys cryptoerror(LOG_STDERR, gettext("Error initializing " 10665051Swyllys "KMF: 0x%02x\n"), rv); 10673089Swyllys goto end; 10683089Swyllys } 106917Sdinak 10703089Swyllys switch (kstype) { 10713089Swyllys case KMF_KEYSTORE_PK11TOKEN: 10723089Swyllys if (kfmt == KMF_FORMAT_PKCS12) 10733089Swyllys rv = pk_import_pk12_pk11( 10745051Swyllys kmfhandle, &pk12cred, 10755051Swyllys &tokencred, label, 10765051Swyllys token_spec, filename); 10773089Swyllys else if (oclass == PK_CERT_OBJ) 10783089Swyllys rv = pk_import_cert( 10795051Swyllys kmfhandle, kstype, 10805051Swyllys label, token_spec, 10815051Swyllys filename, 10825051Swyllys NULL, NULL, NULL); 10833089Swyllys else if (oclass == PK_CRL_OBJ) 10843089Swyllys rv = pk_import_file_crl( 10855051Swyllys kmfhandle, filename, 10866669Swyllys crlfile, okfmt); 10875051Swyllys else if (kfmt == KMF_FORMAT_RAWKEY && 10885051Swyllys oclass == PK_SYMKEY_OBJ) { 10895051Swyllys rv = pk_import_rawkey(kmfhandle, 10905051Swyllys kstype, token_spec, &tokencred, 10915051Swyllys filename, label, 10925051Swyllys keyAlg, senstr, extstr); 10935051Swyllys } else if (kfmt == KMF_FORMAT_PEM || 10945051Swyllys kfmt == KMF_FORMAT_PEM_KEYPAIR) { 10955051Swyllys rv = pk_import_keys(kmfhandle, 10965051Swyllys kstype, token_spec, &tokencred, 10975051Swyllys filename, label, senstr, extstr); 10985051Swyllys } else { 10995051Swyllys rv = PK_ERR_USAGE; 11005051Swyllys } 11013089Swyllys break; 11023089Swyllys case KMF_KEYSTORE_NSS: 11033089Swyllys if (dir == NULL) 11043089Swyllys dir = PK_DEFAULT_DIRECTORY; 11053089Swyllys if (kfmt == KMF_FORMAT_PKCS12) 11063089Swyllys rv = pk_import_pk12_nss( 11075051Swyllys kmfhandle, &pk12cred, 11085051Swyllys &tokencred, 11095051Swyllys token_spec, dir, prefix, 11105051Swyllys label, trustflags, filename); 11113089Swyllys else if (oclass == PK_CERT_OBJ) { 11123089Swyllys rv = pk_import_cert( 11135051Swyllys kmfhandle, kstype, 11145051Swyllys label, token_spec, 11155051Swyllys filename, dir, prefix, trustflags); 11163089Swyllys } else if (oclass == PK_CRL_OBJ) { 11173089Swyllys rv = pk_import_nss_crl( 11185051Swyllys kmfhandle, verify_crl_flag, 11195051Swyllys filename, dir, prefix); 11203089Swyllys } 11213089Swyllys break; 11223089Swyllys case KMF_KEYSTORE_OPENSSL: 11233089Swyllys if (kfmt == KMF_FORMAT_PKCS12) 11243089Swyllys rv = pk_import_pk12_files( 11255051Swyllys kmfhandle, &pk12cred, 11265051Swyllys filename, certfile, keyfile, 11276669Swyllys okfmt); 11283089Swyllys else if (oclass == PK_CRL_OBJ) { 11293089Swyllys rv = pk_import_file_crl( 11305051Swyllys kmfhandle, filename, 11316669Swyllys crlfile, okfmt); 11323089Swyllys } else 11333089Swyllys /* 11343089Swyllys * It doesn't make sense to import anything 11353089Swyllys * else for the files plugin. 11363089Swyllys */ 11373089Swyllys return (PK_ERR_USAGE); 11383089Swyllys break; 11393089Swyllys default: 11403089Swyllys rv = PK_ERR_USAGE; 11413089Swyllys break; 11423089Swyllys } 114317Sdinak 11443089Swyllys end: 11453089Swyllys if (rv != KMF_OK) 11463089Swyllys display_error(kmfhandle, rv, 11475051Swyllys gettext("Error importing objects")); 11483089Swyllys 11493089Swyllys if (tokencred.cred != NULL) 11503089Swyllys free(tokencred.cred); 11513089Swyllys 11523089Swyllys if (pk12cred.cred != NULL) 11533089Swyllys free(pk12cred.cred); 11543089Swyllys 11555051Swyllys (void) kmf_finalize(kmfhandle); 11563089Swyllys 11573089Swyllys if (rv != KMF_OK) 11583089Swyllys return (PK_ERR_USAGE); 11593089Swyllys 116017Sdinak return (0); 116117Sdinak } 1162