99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * CDDL HEADER START
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The contents of this file are subject to the terms of the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Common Development and Distribution License (the "License").
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * You may not use this file except in compliance with the License.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * or http://www.opensolaris.org/os/licensing.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * See the License for the specific language governing permissions
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * and limitations under the License.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * When distributing Covered Code, include this CDDL HEADER in each
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If applicable, add the following below this CDDL HEADER, with the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * fields enclosed by brackets "[]" replaced with your own identifying
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * information: Portions Copyright [yyyy] [name of copyright owner]
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * CDDL HEADER END
2c9a247fb01631b3eb3b85a1127e72f0b60ae108Wyllys Ingersoll *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * PKCS11 token KMF Plugin
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
2c9a247fb01631b3eb3b85a1127e72f0b60ae108Wyllys Ingersoll * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <stdio.h> /* debugging only */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <errno.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <values.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <kmfapiP.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <ber_der.h>
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys#include <fcntl.h>
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys#include <sha1.h>
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys#include <bignum.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <cryptoutil.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <security/cryptoki.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <security/pkcs11.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
c197cb9db36685d2808c057fdbe5700734483ab2hylee#define DEV_RANDOM "/dev/random"
c197cb9db36685d2808c057fdbe5700734483ab2hylee
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#define SETATTR(t, n, atype, value, size) \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys t[n].type = atype; \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys t[n].pValue = (CK_BYTE *)value; \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys t[n].ulValueLen = (CK_ULONG)size;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#define SET_ERROR(h, c) h->lasterr.kstype = KMF_KEYSTORE_PK11TOKEN; \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys h->lasterr.errcode = c;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllystypedef struct _objlist {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_HANDLE handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys struct _objlist *next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys} OBJLIST;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyssearch_certs(KMF_HANDLE_T, char *, char *, char *, KMF_BIGINT *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t, KMF_CERT_VALIDITY, OBJLIST **, uint32_t *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
71593db26bb6ef7b739cffe06d53bf990cac112cwyllysstatic CK_RV
71593db26bb6ef7b739cffe06d53bf990cac112cwyllysgetObjectLabel(KMF_HANDLE_T, CK_OBJECT_HANDLE, char **);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyskeyObj2RawKey(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_KEY_DATA **);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
c197cb9db36685d2808c057fdbe5700734483ab2hyleestatic KMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyscreate_generic_secret_key(KMF_HANDLE_T,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int, KMF_ATTRIBUTE *, CK_OBJECT_HANDLE *);
c197cb9db36685d2808c057fdbe5700734483ab2hylee
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_ConfigureKeystore(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_FindCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_FreeKMFCert(KMF_HANDLE_T,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_DER_CERT *kmf_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_StoreCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_ImportCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_DeleteCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_CreateKeypair(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_StoreKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_DeleteKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_EncodePubKeyData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_DATA *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_SignData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *, KMF_DATA *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_GetErrorString(KMF_HANDLE_T, char **);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_FindPrikeyByCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_DecryptData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *, KMF_DATA *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_FindKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_CreateSymKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_GetSymKeyValue(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_SYM_KEY *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_SetTokenPin(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_ExportPK12(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_PLUGIN_FUNCLIST pk11token_plugin_table =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 1, /* Version */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_ConfigureKeystore,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_FindCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_FreeKMFCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_StoreCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_ImportCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL, /* ImportCRL */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_DeleteCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL, /* DeleteCRL */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_CreateKeypair,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_FindKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_EncodePubKeyData,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_SignData,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_DeleteKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL, /* ListCRL */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL, /* FindCRL */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL, /* FindCertInCRL */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_GetErrorString,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMFPK11_FindPrikeyByCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_DecryptData,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMFPK11_ExportPK12,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_CreateSymKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_GetSymKeyValue,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMFPK11_SetTokenPin,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMFPK11_StoreKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL /* Finalize */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_PLUGIN_FUNCLIST *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_Plugin_Initialize()
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (&pk11token_plugin_table);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_ConfigureKeystore(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *label;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys boolean_t readonly = B_TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys label = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (label == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* "readonly" is optional. Default is TRUE */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_READONLY_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&readonly, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_select_token(handle, label, readonly);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyspk11_authenticate(KMF_HANDLE_T handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_CREDENTIAL *cred)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ck_rv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE hSession = (CK_SESSION_HANDLE)handle->pk11handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (hSession == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (cred == NULL || cred->cred == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((ck_rv = C_Login(hSession, CKU_USER, (uchar_t *)cred->cred,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cred->credlen)) != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ck_rv != CKR_USER_ALREADY_LOGGED_IN) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->lasterr.kstype = KMF_KEYSTORE_PK11TOKEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->lasterr.errcode = ck_rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_AUTH_FAILED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysPK11Cert2KMFCert(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE hObj,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_DER_CERT *kmfcert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_CERTIFICATE_TYPE cktype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_CLASS class;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG subject_len, value_len, issuer_len, serno_len, id_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BYTE *subject = NULL, *value = NULL;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys char *label = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE templ[10];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys (void) memset(templ, 0, 10 * sizeof (CK_ATTRIBUTE));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, 0, CKA_CLASS, &class, sizeof (class));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Is this a certificate object ? */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_GetAttributeValue(kmfh->pk11handle, hObj, templ, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK || class != CKO_CERTIFICATE) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, 0, CKA_CERTIFICATE_TYPE, &cktype, sizeof (cktype));
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys ckrv = C_GetAttributeValue(kmfh->pk11handle, hObj, templ, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK || cktype != CKC_X_509) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys int i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* What attributes are available and how big are they? */
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys subject_len = issuer_len = serno_len = id_len = value_len = 0;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys SETATTR(templ, i, CKA_SUBJECT, NULL, subject_len);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys i++;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys SETATTR(templ, i, CKA_ISSUER, NULL, issuer_len);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys i++;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys SETATTR(templ, i, CKA_SERIAL_NUMBER, NULL, serno_len);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys i++;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys SETATTR(templ, i, CKA_ID, NULL, id_len);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys i++;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys SETATTR(templ, i, CKA_VALUE, NULL, value_len);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Query the object with NULL values in the pValue spot
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * so we know how much space to allocate for each field.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys ckrv = C_GetAttributeValue(kmfh->pk11handle, hObj, templ, i);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL); /* TODO - Error messages ? */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subject_len = templ[0].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys issuer_len = templ[1].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys serno_len = templ[2].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys id_len = templ[3].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys value_len = templ[4].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * For PKCS#11 CKC_X_509 certificate objects,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * the following attributes must be defined.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * CKA_SUBJECT, CKA_ID, CKA_ISSUER, CKA_SERIAL_NUMBER,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * CKA_VALUE.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (subject_len == 0 || issuer_len == 0 ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys serno_len == 0 || value_len == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Only fetch the value field if we are saving the data */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfcert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys value = malloc(value_len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (value == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto errout;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_VALUE, value, value_len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* re-query the object with room for the value attr */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_GetAttributeValue(kmfh->pk11handle, hObj,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys templ, i);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto errout;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfcert->certificate.Data = value;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfcert->certificate.Length = value_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfcert->kmf_private.flags |= KMF_FLAG_CERT_SIGNED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfcert->kmf_private.keystore_type =
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEYSTORE_PK11TOKEN;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys ckrv = getObjectLabel(kmfh, hObj, &label);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys if (ckrv == CKR_OK && label != NULL) {
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys kmfcert->kmf_private.label = (char *)label;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyserrout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (subject)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(subject);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (value)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(value);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfcert) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfcert->certificate.Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfcert->certificate.Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_objlist(OBJLIST *head)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST *temp = head;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (temp != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys head = head->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(temp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys temp = head;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The caller should make sure that the templ->pValue is NULL since
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * it will be overwritten below.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysget_attr(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE *templ)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle, obj, templ, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (templ->ulValueLen > 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys templ->pValue = malloc(templ->ulValueLen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (templ->pValue == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle, obj, templ, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Match a certificate with an issuer and/or subject name.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This is tricky because we cannot reliably compare DER encodings
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * because RDNs may have their AV-pairs in different orders even
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * if the values are the same. You must compare individual
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * AV pairs for the RDNs.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * RETURN: 0 for a match, non-zero for a non-match.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysmatchcert(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_NAME *issuer, KMF_X509_NAME *subject)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE certattr;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA name;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_NAME dn;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (issuer->numberOfRDNs > 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certattr.type = CKA_ISSUER;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certattr.pValue = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certattr.ulValueLen = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = get_attr(kmfh, obj, &certattr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name.Data = certattr.pValue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name.Length = certattr.ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerDecodeName(&name, &dn);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_compare_rdns(issuer, &dn);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_dn(&dn);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(certattr.pValue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (subject->numberOfRDNs > 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certattr.type = CKA_SUBJECT;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certattr.pValue = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certattr.ulValueLen = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = get_attr(kmfh, obj, &certattr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name.Data = certattr.pValue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name.Length = certattr.ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerDecodeName(&name, &dn);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_compare_rdns(subject, &dn);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_dn(&dn);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(certattr.pValue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * delete "curr" node from the "newlist".
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyspk11_delete_obj_from_list(OBJLIST **newlist,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST **prev, OBJLIST **curr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (*curr == *newlist) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* first node in the list */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *newlist = (*curr)->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *prev = (*curr)->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(*curr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *curr = *newlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (*prev)->next = (*curr)->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(*curr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *curr = (*prev)->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * search_certs
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Because this code is shared by the FindCert and
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * DeleteCert functions, put it in a separate routine
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * to save some work and make code easier to debug and
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * read.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyssearch_certs(KMF_HANDLE_T handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *label, char *issuer, char *subject, KMF_BIGINT *serial,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t private, KMF_CERT_VALIDITY validity,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST **objlist, uint32_t *numobj)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE templ[10];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BBOOL true = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_CLASS oclass = CKO_CERTIFICATE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_CERTIFICATE_TYPE ctype = CKC_X_509;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_NAME subjectDN, issuerDN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST *newlist, *tail;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG num = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t num_ok_certs = 0; /* number of non-expired or expired certs */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&templ, 0, 10 * sizeof (CK_ATTRIBUTE));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&issuerDN, 0, sizeof (KMF_X509_NAME));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&subjectDN, 0, sizeof (KMF_X509_NAME));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_TOKEN, &true, sizeof (true)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_CLASS, &oclass, sizeof (oclass)); i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_CERTIFICATE_TYPE, &ctype, sizeof (ctype)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (label != NULL && strlen(label)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_LABEL, label, strlen(label));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (private) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PRIVATE, &true, sizeof (true)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (issuer != NULL && strlen(issuer)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((rv = kmf_dn_parser(issuer, &issuerDN)) != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (subject != NULL && strlen(subject)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((rv = kmf_dn_parser(subject, &subjectDN)) != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (serial != NULL && serial->val != NULL && serial->len > 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_SERIAL_NUMBER, serial->val, serial->len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (*numobj) = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *objlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_FindObjectsInit(kmfh->pk11handle, templ, i);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tail = newlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (ckrv == CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_HANDLE tObj;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_FindObjects(kmfh->pk11handle, &tObj, 1, &num);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK || num == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * 'matchcert' returns 0 if subject/issuer match
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If no match, move on to the next one
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (matchcert(kmfh, tObj, &issuerDN, &subjectDN))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys continue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (newlist == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newlist = malloc(sizeof (OBJLIST));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (newlist == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newlist->handle = tObj;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newlist->next = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tail = newlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tail->next = malloc(sizeof (OBJLIST));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (tail->next != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tail = tail->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tail->handle = tObj;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tail->next = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (*numobj)++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_FindObjectsFinal(kmfh->pk11handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (newlist != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_objlist(newlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numobj = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (validity == KMF_ALL_CERTS) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *objlist = newlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST *node, *prev;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_DER_CERT tmp_kmf_cert;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = prev = newlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Now check to see if any found certificate is expired
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * or valid.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (node != NULL && i < (*numobj)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&tmp_kmf_cert, 0,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sizeof (KMF_X509_DER_CERT));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = PK11Cert2KMFCert(kmfh, node->handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &tmp_kmf_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_check_cert_date(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &tmp_kmf_cert.certificate);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (validity == KMF_NONEXPIRED_CERTS) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys num_ok_certs++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys prev = node;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = node->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (rv ==
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_ERR_VALIDITY_PERIOD) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * expired - remove it from list
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pk11_delete_obj_from_list(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &newlist, &prev, &node);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (validity == KMF_EXPIRED_CERTS) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_ERR_VALIDITY_PERIOD) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys num_ok_certs++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys prev = node;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = node->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * valid - remove it from list
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pk11_delete_obj_from_list(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &newlist, &prev, &node);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_kmf_cert(handle, &tmp_kmf_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numobj = num_ok_certs;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *objlist = newlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup1:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK && newlist != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_objlist(newlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numobj = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *objlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (issuer != NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_dn(&issuerDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (subject != NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_dn(&subjectDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The caller may pass a NULL value for kmf_cert below and the function will
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * just return the number of certs found (in num_certs).
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_FindCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t want_certs;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST *objlist = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t *num_certs;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_X509_DER_CERT *kmf_cert = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *certlabel = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *issuer = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *subject = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_BIGINT *serial = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CERT_VALIDITY validity;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys KMF_CREDENTIAL *cred = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys boolean_t private;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys num_certs = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (num_certs == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (*num_certs > 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys want_certs = *num_certs;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys want_certs = MAXINT; /* count them all */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Get the optional returned certificate list */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_cert = kmf_get_attr_ptr(KMF_X509_DER_CERT_ATTR, attrlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Get optional search criteria attributes */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &validity, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys validity = KMF_ALL_CERTS;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_PRIVATE_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&private, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys private = B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (cred != NULL) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = pk11_authenticate(handle, cred);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (rv != KMF_OK)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys return (rv);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys }
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Start searching */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = search_certs(handle, certlabel, issuer, subject, serial, private,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys validity, &objlist, num_certs);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && objlist != NULL && kmf_cert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST *node = objlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (node != NULL && i < want_certs) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = PK11Cert2KMFCert(kmfh, node->handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &kmf_cert[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = node->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (objlist != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_objlist(objlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (*num_certs == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CERT_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*ARGSUSED*/
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_FreeKMFCert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmf_cert != NULL && kmf_cert->certificate.Data != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(kmf_cert->certificate.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->certificate.Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->certificate.Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmf_cert->kmf_private.label != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(kmf_cert->kmf_private.label);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->kmf_private.label = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_DATA *eData)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_CLASS ckObjClass = CKO_PUBLIC_KEY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_KEY_TYPE ckKeyType;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA Modulus, Exponent, Prime, Subprime, Base, Value;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_OID *Algorithm;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerElement *asn1 = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerValue *PubKeyParams = NULL, *EncodedKey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_SPKI spki;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_BYTE ec_params[256], ec_point[256];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE rsaTemplate[4];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE dsaTemplate[6];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE ecdsaTemplate[6];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pKey == NULL || pKey->keyp == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&Modulus, 0, sizeof (Modulus));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&Exponent, 0, sizeof (Exponent));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&Prime, 0, sizeof (Prime));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&Subprime, 0, sizeof (Subprime));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&Base, 0, sizeof (Base));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&Value, 0, sizeof (Value));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (pKey->keyalg) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_RSA:
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaTemplate, 0, CKA_CLASS, &ckObjClass,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (ckObjClass));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaTemplate, 1, CKA_KEY_TYPE, &ckKeyType,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (ckKeyType));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaTemplate, 2, CKA_MODULUS, Modulus.Data,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll Modulus.Length);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaTemplate, 3, CKA_PUBLIC_EXPONENT,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll Exponent.Data, Exponent.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the length of the fields */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pKey->keyp, rsaTemplate, 4);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Modulus.Length = rsaTemplate[2].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Modulus.Data = malloc(Modulus.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Modulus.Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Exponent.Length = rsaTemplate[3].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Exponent.Data = malloc(Exponent.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Exponent.Data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Modulus.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(rsaTemplate, 2, CKA_MODULUS, Modulus.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Modulus.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(rsaTemplate, 3, CKA_PUBLIC_EXPONENT,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Exponent.Data, Exponent.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now get the values */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pKey->keyp, rsaTemplate, 4);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Modulus.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Exponent.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This is the KEY algorithm, not the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * signature algorithm.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Algorithm = x509_algid_to_algoid(KMF_ALGID_RSA);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Algorithm != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Encode the RSA Key Data */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((asn1 = kmfder_alloc()) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Modulus.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Exponent.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfber_printf(asn1, "{II}", Modulus.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Modulus.Length, Exponent.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Exponent.Length) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Modulus.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Exponent.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_flatten(asn1, &EncodedKey) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Modulus.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Exponent.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Exponent.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Modulus.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DSA:
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(dsaTemplate, 0, CKA_CLASS, &ckObjClass,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (ckObjClass));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(dsaTemplate, 1, CKA_KEY_TYPE, &ckKeyType,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (ckKeyType));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(dsaTemplate, 2, CKA_PRIME, Prime.Data,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll Prime.Length);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(dsaTemplate, 3, CKA_SUBPRIME, Subprime.Data,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll Subprime.Length);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(dsaTemplate, 4, CKA_BASE, Base.Data,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll Base.Length);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(dsaTemplate, 5, CKA_VALUE, Value.Data,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll Value.Length);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the length of the fields */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pKey->keyp, dsaTemplate, 6);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Prime.Length = dsaTemplate[2].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Prime.Data = malloc(Prime.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Prime.Data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Subprime.Length = dsaTemplate[3].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Subprime.Data = malloc(Subprime.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Subprime.Data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Base.Length = dsaTemplate[4].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Base.Data = malloc(Base.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Base.Data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Subprime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Value.Length = dsaTemplate[5].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Value.Data = malloc(Value.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Value.Data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Subprime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Base.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(dsaTemplate, 2, CKA_PRIME, Prime.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Prime.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(dsaTemplate, 3, CKA_SUBPRIME, Subprime.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Subprime.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(dsaTemplate, 4, CKA_BASE, Base.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Base.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(dsaTemplate, 5, CKA_VALUE, Value.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Value.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now get the values */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pKey->keyp, dsaTemplate, 6);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Subprime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Base.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This is the KEY algorithm, not the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * signature algorithm.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Algorithm = x509_algid_to_algoid(KMF_ALGID_DSA);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Encode the DSA Algorithm Parameters */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((asn1 = kmfder_alloc()) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Subprime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Base.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfber_printf(asn1, "{III}", Prime.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Prime.Length, Subprime.Data, Subprime.Length,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Base.Data, Base.Length) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Subprime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Base.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_flatten(asn1, &PubKeyParams) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Subprime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Base.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Prime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Subprime.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Base.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Encode the DSA Key Value */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((asn1 = kmfder_alloc()) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_printf(asn1, "I",
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys Value.Data, Value.Length) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_flatten(asn1, &EncodedKey) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Value.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll case KMF_ECDSA:
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* The EC_PARAMS are the PubKey algorithm parameters */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll PubKeyParams = calloc(1, sizeof (BerValue));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (PubKeyParams == NULL)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_MEMORY);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll EncodedKey = calloc(1, sizeof (BerValue));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (EncodedKey == NULL) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll free(PubKeyParams);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_MEMORY);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(ecdsaTemplate, 0, CKA_EC_PARAMS,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &ec_params, sizeof (ec_params));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(ecdsaTemplate, 1, CKA_EC_POINT,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &ec_point, sizeof (ec_point));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Get the length of the fields */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rv = C_GetAttributeValue(kmfh->pk11handle,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (CK_OBJECT_HANDLE)pKey->keyp,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ecdsaTemplate, 2);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (rv != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, rv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_BAD_PARAMETER);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* The params are to be used as algorithm parameters */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll PubKeyParams->bv_val = (char *)ec_params;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll PubKeyParams->bv_len = ecdsaTemplate[0].ulValueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /*
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll * The EC_POINT is to be used as the subject pub key.
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll EncodedKey->bv_val = (char *)ec_point;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll EncodedKey->bv_len = ecdsaTemplate[1].ulValueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Use the EC_PUBLIC_KEY OID */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll Algorithm = (KMF_OID *)&KMFOID_EC_PUBLIC_KEY;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys default:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now, build an SPKI structure for the final encoding step */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.algorithm.algorithm = *Algorithm;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (PubKeyParams != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.algorithm.parameters.Data =
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (uchar_t *)PubKeyParams->bv_val;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.algorithm.parameters.Length = PubKeyParams->bv_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.algorithm.parameters.Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.algorithm.parameters.Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (EncodedKey != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.subjectPublicKey.Data = (uchar_t *)EncodedKey->bv_val;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.subjectPublicKey.Length = EncodedKey->bv_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.subjectPublicKey.Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki.subjectPublicKey.Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Finally, encode the entire SPKI record */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = DerEncodeSPKI(&spki, eData);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (EncodedKey) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (pKey->keyalg != KMF_ECDSA)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll free(EncodedKey->bv_val);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(EncodedKey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (PubKeyParams) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (pKey->keyalg != KMF_ECDSA)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll free(PubKeyParams->bv_val);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(PubKeyParams);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysCreateCertObject(KMF_HANDLE_T handle, char *label, KMF_DATA *pcert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_CERTIFICATE *signed_cert_ptr = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA Id;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG subject_len, issuer_len, serno_len;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys CK_BYTE *subject, *issuer, *serial, nullserno;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BBOOL true = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_CERTIFICATE_TYPE certtype = CKC_X_509;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_CLASS certClass = CKO_CERTIFICATE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE x509templ[11];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_HANDLE hCert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL); /* should not happen */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL); /* should not happen */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pcert == NULL || pcert->Data == NULL || pcert->Length == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL); /* should not happen */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The data *must* be a DER encoded X.509 certificate.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Convert it to a CSSM cert and then parse the fields so
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * the PKCS#11 attributes can be filled in correctly.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerDecodeSignedCertificate((const KMF_DATA *)pcert,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &signed_cert_ptr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Encode fields into PKCS#11 attributes.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the subject name */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerEncodeName(&signed_cert_ptr->certificate.subject, &data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subject = data.Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subject_len = data.Length;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Encode the issuer */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerEncodeName(&signed_cert_ptr->certificate.issuer, &data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys issuer = data.Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys issuer_len = data.Length;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Encode serial number */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (signed_cert_ptr->certificate.serialNumber.len > 0 &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys signed_cert_ptr->certificate.serialNumber.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys serial = signed_cert_ptr->certificate.serialNumber.val;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys serno_len = signed_cert_ptr->certificate.serialNumber.len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys /*
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys * RFC3280 says to gracefully handle certs with serial numbers
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys * of 0.
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys */
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys nullserno = '\0';
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys serial = &nullserno;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys serno_len = 1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Generate an ID from the SPKI data */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = GetIDFromSPKI(&signed_cert_ptr->certificate.subjectPublicKeyInfo,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &Id);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(x509templ, i, CKA_CLASS, &certClass, sizeof (certClass)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(x509templ, i, CKA_CERTIFICATE_TYPE, &certtype,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (certtype));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(x509templ, i, CKA_TOKEN, &true, sizeof (true)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(x509templ, i, CKA_SUBJECT, subject, subject_len); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(x509templ, i, CKA_ISSUER, issuer, issuer_len); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(x509templ, i, CKA_SERIAL_NUMBER, serial, serno_len); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(x509templ, i, CKA_VALUE, pcert->Data, pcert->Length); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(x509templ, i, CKA_ID, Id.Data, Id.Length); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (label != NULL && strlen(label)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(x509templ, i, CKA_LABEL, label, strlen(label)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The cert object handle is actually "leaked" here. If the app
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * really wants to clean up the data space, it will have to call
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * KMF_DeleteCert and specify the softtoken keystore.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_CreateObject(kmfh->pk11handle, x509templ, i, &hCert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys /* Report authentication failures to the caller */
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (ckrv == CKR_USER_NOT_LOGGED_IN ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_INCORRECT ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_INVALID ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_EXPIRED ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_LOCKED ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_SESSION_READ_ONLY)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = KMF_ERR_AUTH_FAILED;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys else
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = KMF_ERR_INTERNAL;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(subject);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(issuer);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Id.Data != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Id.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (signed_cert_ptr) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_signed_cert(signed_cert_ptr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(signed_cert_ptr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_StoreCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_DATA *cert = NULL;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys KMF_CREDENTIAL *cred = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *label = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_UNINITIALIZED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (cert == NULL || cert->Data == NULL || cert->Length == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* label attribute is optional */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys label = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (cred != NULL) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = pk11_authenticate(handle, cred);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (rv != KMF_OK)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys return (rv);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys }
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = CreateCertObject(handle, label, cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_ImportCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *certfile = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *label = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_ENCODE_FORMAT format;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys KMF_CREDENTIAL *cred = NULL;
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA cert1 = { 0, NULL };
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA cert2 = { 0, NULL };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_UNINITIALIZED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Get the input cert filename attribute, check if it is a valid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * certificate and auto-detect the file format of it.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys certfile = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (certfile == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_is_cert_file(handle, certfile, &format);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Read in the CERT file */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_read_input_file(handle, certfile, &cert1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* The label attribute is optional */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys label = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If the input certificate is in PEM format, we need to convert
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * it to DER first.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (format == KMF_FORMAT_PEM) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int derlen;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_pem_to_der(cert1.Data, cert1.Length,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &cert2.Data, &derlen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cert2.Length = (size_t)derlen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (cred != NULL) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = pk11_authenticate(handle, cred);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (rv != KMF_OK)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys return (rv);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys }
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = CreateCertObject(handle, label,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys format == KMF_FORMAT_ASN1 ? &cert1 : &cert2);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (cert1.Data != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(cert1.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (cert2.Data != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(cert2.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_DeleteCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST *objlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t numObjects = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *certlabel = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *issuer = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *subject = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_BIGINT *serial = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CERT_VALIDITY validity;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys boolean_t private;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Get the search criteria attributes. They are all optional. */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &validity, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys validity = KMF_ALL_CERTS;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_PRIVATE_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&private, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys private = B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Start searching for certificates that match the criteria and
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * delete them.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys objlist = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = search_certs(handle, certlabel, issuer, subject, serial,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys private, validity, &objlist, &numObjects);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && objlist != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys OBJLIST *node = objlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (node != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ckrv = C_DestroyObject(kmfh->pk11handle, node->handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = node->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_objlist(objlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && numObjects == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CERT_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollstatic CK_RV
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollgendsa_keypair(KMF_HANDLE *kmfh, boolean_t storekey,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_OBJECT_HANDLE *pubKey,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_OBJECT_HANDLE *priKey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_RV ckrv = CKR_OK;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_SESSION_HANDLE hSession = kmfh->pk11handle;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_ULONG dsaKeyType = CKK_DSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys static CK_BBOOL true = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys static CK_BBOOL false = FALSE;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_OBJECT_CLASS priClass = CKO_PRIVATE_KEY;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_OBJECT_CLASS pubClass = CKO_PUBLIC_KEY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys static CK_BYTE ckDsaPrime[128] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xb2, 0x6b, 0xc3, 0xfb, 0xe3, 0x26, 0xf4, 0xc2,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xcf, 0xdd, 0xf9, 0xae, 0x3e, 0x39, 0x7f, 0x9c,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xa7, 0x73, 0xc3, 0x00, 0xa3, 0x50, 0x67, 0xc3,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xab, 0x49, 0x2c, 0xea, 0x59, 0x10, 0xa4, 0xbc,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x09, 0x94, 0xa9, 0x05, 0x3b, 0x0d, 0x35, 0x3c,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x55, 0x52, 0x47, 0xf0, 0xe3, 0x72, 0x5b, 0xe8,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x72, 0xa0, 0x71, 0x1c, 0x23, 0x4f, 0x6d, 0xe8,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xac, 0xe5, 0x21, 0x1b, 0xc0, 0xd8, 0x42, 0xd3,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x87, 0xae, 0x83, 0x5e, 0x52, 0x7e, 0x46, 0x09,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xb5, 0xc7, 0x3d, 0xd6, 0x00, 0xf5, 0xf2, 0x9c,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x84, 0x30, 0x81, 0x7e, 0x7b, 0x30, 0x5b, 0xd5,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xab, 0xd0, 0x2f, 0x21, 0xb3, 0xd8, 0xed, 0xdb,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x97, 0x77, 0xe4, 0x7e, 0x6c, 0xcc, 0xb9, 0x6b,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xdd, 0xaa, 0x96, 0x04, 0xe7, 0xd4, 0x55, 0x11,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x53, 0xab, 0xba, 0x95, 0x9a, 0xa2, 0x8c, 0x27,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xd9, 0xcf, 0xad, 0xf3, 0xcf, 0x3a, 0x0c, 0x4b};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys static CK_BYTE ckDsaSubPrime[20] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xa4, 0x5f, 0x2a, 0x27, 0x09, 0x49, 0xb6, 0xfe,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x73, 0xeb, 0x95, 0x7d, 0x00, 0xf3, 0x42, 0xfc,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x78, 0x47, 0xb0, 0xd5};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys static CK_BYTE ckDsaBase[128] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x5c, 0x57, 0x16, 0x49, 0xef, 0xc8, 0xfb, 0x4b,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xee, 0x07, 0x45, 0x3b, 0x6a, 0x1d, 0xf3, 0xe5,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xeb, 0xee, 0xad, 0x11, 0x13, 0xe3, 0x52, 0xe3,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x0d, 0xc0, 0x21, 0x25, 0xfa, 0xf0, 0x93, 0x1c,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x53, 0x4d, 0xdc, 0x0d, 0x76, 0xd2, 0xfe, 0xc2,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xd7, 0x72, 0x64, 0x69, 0x53, 0x3d, 0x33, 0xbd,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xe1, 0x34, 0xf2, 0x5a, 0x67, 0x83, 0xe0, 0xd3,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x1c, 0xd6, 0x41, 0x4d, 0x16, 0xe8, 0x6c, 0x5a,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x07, 0x95, 0x21, 0x9a, 0xa3, 0xc4, 0xb9, 0x05,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x9d, 0x11, 0xcb, 0xc8, 0xc4, 0x9d, 0x00, 0x1a,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xf4, 0x85, 0x2a, 0xa9, 0x20, 0x3c, 0xba, 0x67,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xe5, 0xed, 0x31, 0xb2, 0x11, 0xfb, 0x1f, 0x73,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xec, 0x61, 0x29, 0xad, 0xc7, 0x68, 0xb2, 0x3f,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x38, 0xea, 0xd9, 0x87, 0x83, 0x9e, 0x7e, 0x19,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0x18, 0xdd, 0xc2, 0xc3, 0x5b, 0x16, 0x6d, 0xce,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 0xcf, 0x88, 0x91, 0x07, 0xe0, 0x2b, 0xa8, 0x54 };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys static CK_ATTRIBUTE ckDsaPubKeyTemplate[] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_CLASS, &pubClass, sizeof (pubClass) },
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_KEY_TYPE, &dsaKeyType, sizeof (dsaKeyType) },
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll { CKA_TOKEN, &true, sizeof (true)},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_PRIVATE, &false, sizeof (false)},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_PRIME, &ckDsaPrime, sizeof (ckDsaPrime) },
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_SUBPRIME, &ckDsaSubPrime, sizeof (ckDsaSubPrime)},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_BASE, &ckDsaBase, sizeof (ckDsaBase) },
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_VERIFY, &true, sizeof (true) },
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#define NUMBER_DSA_PUB_TEMPLATES (sizeof (ckDsaPubKeyTemplate) / \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sizeof (CK_ATTRIBUTE))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#define MAX_DSA_PUB_TEMPLATES (sizeof (ckDsaPubKeyTemplate) / \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sizeof (CK_ATTRIBUTE))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys static CK_ATTRIBUTE ckDsaPriKeyTemplate[] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {CKA_CLASS, &priClass, sizeof (priClass)},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {CKA_KEY_TYPE, &dsaKeyType, sizeof (dsaKeyType)},
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll {CKA_TOKEN, &true, sizeof (true)},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {CKA_PRIVATE, &true, sizeof (true)},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {CKA_SIGN, &true, sizeof (true)},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll#define NUMBER_DSA_PRI_TEMPLATES (sizeof (ckDsaPriKeyTemplate) / \
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (CK_ATTRIBUTE))
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll#define MAX_DSA_PRI_TEMPLATES (sizeof (ckDsaPriKeyTemplate) / \
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (CK_ATTRIBUTE))
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_MECHANISM keyGenMech = {CKM_DSA_KEY_PAIR_GEN, NULL, 0};
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(ckDsaPriKeyTemplate, 2, CKA_TOKEN,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (storekey ? &true : &false), sizeof (CK_BBOOL));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = C_GenerateKeyPair(hSession, &keyGenMech,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckDsaPubKeyTemplate,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (sizeof (ckDsaPubKeyTemplate)/sizeof (CK_ATTRIBUTE)),
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckDsaPriKeyTemplate,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (sizeof (ckDsaPriKeyTemplate)/sizeof (CK_ATTRIBUTE)),
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubKey, priKey);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_KEYGEN_FAILED);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll}
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollstatic CK_RV
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollgenrsa_keypair(KMF_HANDLE *kmfh, CK_ULONG modulusBits,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll boolean_t storekey, KMF_BIGINT *rsaexp,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_OBJECT_HANDLE *pubKey,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_OBJECT_HANDLE *priKey)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll{
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_RV ckrv = CKR_OK;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_SESSION_HANDLE hSession = kmfh->pk11handle;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE rsaPubKeyTemplate[16];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE rsaPriKeyTemplate[16];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_MECHANISM keyGenMech = {CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0};
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll int numpubattr = 0, numpriattr = 0;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_BYTE PubExpo[3] = {0x01, 0x00, 0x01};
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_BBOOL true = TRUE;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_BBOOL false = FALSE;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPubKeyTemplate, numpubattr, CKA_TOKEN,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (storekey ? &true : &false), sizeof (CK_BBOOL));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPubKeyTemplate, numpubattr, CKA_MODULUS_BITS,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &modulusBits, sizeof (modulusBits));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (rsaexp != NULL && (rsaexp->len > 0 && rsaexp->val != NULL)) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPubKeyTemplate, numpubattr,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CKA_PUBLIC_EXPONENT,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rsaexp->val, rsaexp->len);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll } else {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPubKeyTemplate, numpubattr,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CKA_PUBLIC_EXPONENT, &PubExpo, sizeof (PubExpo));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPubKeyTemplate, numpubattr, CKA_ENCRYPT,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &true, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPubKeyTemplate, numpubattr, CKA_VERIFY,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &true, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPubKeyTemplate, numpubattr, CKA_WRAP,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &true, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPriKeyTemplate, numpriattr, CKA_TOKEN,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (storekey ? &true : &false), sizeof (CK_BBOOL));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPriKeyTemplate, numpriattr, CKA_PRIVATE, &true,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPriKeyTemplate, numpriattr, CKA_DECRYPT, &true,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPriKeyTemplate, numpriattr, CKA_SIGN, &true,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(rsaPriKeyTemplate, numpriattr, CKA_UNWRAP, &true,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = C_GenerateKeyPair(hSession, &keyGenMech,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rsaPubKeyTemplate, numpubattr,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rsaPriKeyTemplate, numpriattr,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubKey, priKey);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll}
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollstatic CK_RV
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollgenecc_keypair(KMF_HANDLE *kmfh,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll boolean_t ontoken,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_OID *curveoid,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_OBJECT_HANDLE *pubKey,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_OBJECT_HANDLE *priKey)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll{
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_RV ckrv;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_SESSION_HANDLE hSession = kmfh->pk11handle;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_MECHANISM keyGenMech = {CKM_EC_KEY_PAIR_GEN, NULL, 0};
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll const ulong_t publicKey = CKO_PUBLIC_KEY;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll const ulong_t privateKey = CKO_PRIVATE_KEY;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll const ulong_t keytype = CKK_EC;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_BBOOL true = TRUE;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_BBOOL false = FALSE;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE public_template[6];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE private_template[6];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll int numpubattr, numpriattr;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr = 0;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(public_template, numpubattr, CKA_CLASS,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &publicKey, sizeof (publicKey));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(public_template, numpubattr, CKA_KEY_TYPE,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &keytype, sizeof (keytype));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(public_template, numpubattr, CKA_EC_PARAMS,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll curveoid->Data, curveoid->Length);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(public_template, numpubattr, CKA_TOKEN,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ontoken ? &true : &false, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(public_template, numpubattr, CKA_VERIFY,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &true, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(public_template, numpubattr, CKA_PRIVATE,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &false, sizeof (false));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpubattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr = 0;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(private_template, numpriattr, CKA_CLASS,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &privateKey, sizeof (privateKey));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(private_template, numpriattr, CKA_KEY_TYPE,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &keytype, sizeof (keytype));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(private_template, numpriattr, CKA_TOKEN,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ontoken ? &true : &false, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(private_template, numpriattr, CKA_PRIVATE,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &true, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(private_template, numpriattr, CKA_SIGN,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &true, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(private_template, numpriattr, CKA_DERIVE,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &true, sizeof (true));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll numpriattr++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = C_GenerateKeyPair(hSession, &keyGenMech,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll public_template, numpubattr,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll private_template, numpriattr,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubKey, priKey);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll}
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys IngersollKMF_RETURN
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys IngersollKMFPK11_CreateKeypair(KMF_HANDLE_T handle,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll int numattr,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_ATTRIBUTE *attlist)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll{
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_RETURN rv = KMF_OK;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_DATA IDInput, IDOutput;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_CREDENTIAL *cred;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_KEY_ALG keytype = KMF_RSA;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_KEY_HANDLE *pubkey, *privkey;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_RV ckrv = 0;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_SESSION_HANDLE hSession = kmfh->pk11handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE labelattr[1];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE idattr[1];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_OBJECT_HANDLE pubKey, priKey;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char IDHashData[SHA1_HASH_LENGTH];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll static CK_ULONG modulusBits = 1024;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll uint32_t modulusBits_size = sizeof (CK_ULONG);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys SHA1_CTX ctx;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys boolean_t storekey = TRUE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *keylabel = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* "storekey" is optional. Default is TRUE */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_STOREKEY_BOOL_ATTR, attlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &storekey, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (cred == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = pk11_authenticate(handle, cred);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* keytype is optional. KMF_RSA is default */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_KEYALG_ATTR, attlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&keytype, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (pubkey == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (privkey == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memset(pubkey, 0, sizeof (KMF_KEY_HANDLE));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memset(privkey, 0, sizeof (KMF_KEY_HANDLE));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keytype == KMF_RSA) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_BYTE *modulus = NULL;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys CK_ULONG modulusLength = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_BIGINT *rsaexp = NULL;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE modattr[1];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &modulusBits, &modulusBits_size);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_ERR_ATTR_NOT_FOUND)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Default modulusBits = 1024 */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rsaexp = kmf_get_attr_ptr(KMF_RSAEXP_ATTR, attlist, numattr);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Generate the RSA keypair */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = genrsa_keypair(kmfh, modulusBits, storekey,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rsaexp, &pubKey, &priKey);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->kstype = KMF_KEYSTORE_PK11TOKEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->keyalg = KMF_RSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->keyclass = KMF_ASYM_PRI;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->keyp = (void *)priKey;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->kstype = KMF_KEYSTORE_PK11TOKEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->keyalg = KMF_RSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->keyclass = KMF_ASYM_PUB;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->keyp = (void *)pubKey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys SETATTR(modattr, 0, CKA_MODULUS, NULL, modulusLength);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the Modulus field to use as input for creating the ID */
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv = C_GetAttributeValue(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pubKey, modattr, 1);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys modulusLength = modattr[0].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys modulus = malloc(modulusLength);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (modulus == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys modattr[0].pValue = modulus;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv = C_GetAttributeValue(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pubKey, modattr, 1);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(modulus);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys IDInput.Data = modulus;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys IDInput.Length = modulusLength;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keytype == KMF_DSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BYTE *keyvalue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG valueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE valattr[1];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Generate the DSA keypair */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = gendsa_keypair(kmfh, storekey, &pubKey, &priKey);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_BAD_PARAMETER);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll privkey->kstype = KMF_KEYSTORE_PK11TOKEN;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll privkey->keyalg = KMF_DSA;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll privkey->keyclass = KMF_ASYM_PRI;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll privkey->keyp = (void *)priKey;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubkey->kstype = KMF_KEYSTORE_PK11TOKEN;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubkey->keyalg = KMF_DSA;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubkey->keyclass = KMF_ASYM_PUB;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubkey->keyp = (void *)pubKey;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Get the Public Value to use as input for creating the ID */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(valattr, 0, CKA_VALUE, NULL, &valueLen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = C_GetAttributeValue(hSession,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (CK_OBJECT_HANDLE)pubKey, valattr, 1);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_BAD_PARAMETER);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll valueLen = valattr[0].ulValueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll keyvalue = malloc(valueLen);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (keyvalue == NULL)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_MEMORY);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll valattr[0].pValue = keyvalue;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = C_GetAttributeValue(hSession,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (CK_OBJECT_HANDLE)pubKey, valattr, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll free(keyvalue);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll IDInput.Data = keyvalue;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll IDInput.Length = valueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll } else if (keytype == KMF_ECDSA) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_BYTE *keyvalue;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ULONG valueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE valattr[1];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_OID *eccoid = kmf_get_attr_ptr(KMF_ECC_CURVE_OID_ATTR,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll attlist, numattr);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (eccoid == NULL)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_BAD_PARAMETER);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = genecc_keypair(kmfh, storekey, eccoid,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &pubKey, &priKey);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_BAD_PARAMETER);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->kstype = KMF_KEYSTORE_PK11TOKEN;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll privkey->keyalg = KMF_ECDSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->keyclass = KMF_ASYM_PRI;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->keyp = (void *)priKey;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->kstype = KMF_KEYSTORE_PK11TOKEN;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll pubkey->keyalg = KMF_ECDSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->keyclass = KMF_ASYM_PUB;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->keyp = (void *)pubKey;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Get the EC_POINT to use as input for creating the ID */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(valattr, 0, CKA_EC_POINT, NULL, &valueLen);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv = C_GetAttributeValue(hSession,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pubKey, valattr, 1);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys valueLen = valattr[0].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyvalue = malloc(valueLen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keyvalue == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys valattr[0].pValue = keyvalue;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv = C_GetAttributeValue(hSession,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)pubKey, valattr, 1);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(keyvalue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys IDInput.Data = keyvalue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys IDInput.Length = valueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylabel != NULL && strlen(keylabel)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(labelattr, 0, CKA_LABEL, keylabel, strlen(keylabel));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Set the CKA_LABEL if one was indicated */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((ckrv = C_SetAttributeValue(hSession, pubKey,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys labelattr, 1)) != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubkey->keylabel = (char *)strdup(keylabel);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (pubkey->keylabel == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((ckrv = C_SetAttributeValue(hSession, priKey,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys labelattr, 1)) != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys privkey->keylabel = (char *)strdup(keylabel);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (privkey->keylabel == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now, assign a CKA_ID value so it can be searched */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* ID_Input was assigned above in the RSA or DSA keygen section */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys IDOutput.Data = (uchar_t *)IDHashData;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys IDOutput.Length = sizeof (IDHashData);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys SHA1Init(&ctx);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys SHA1Update(&ctx, IDInput.Data, IDInput.Length);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys SHA1Final(IDOutput.Data, &ctx);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys IDOutput.Length = SHA1_DIGEST_LENGTH;
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(IDInput.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(idattr, 0, CKA_ID, IDOutput.Data, IDOutput.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((ckrv = C_SetAttributeValue(hSession, pubKey,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys idattr, 1)) != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((ckrv = C_SetAttributeValue(hSession, priKey,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys idattr, 1)) != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pubKey != CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) C_DestroyObject(hSession, pubKey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (priKey != CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) C_DestroyObject(hSession, priKey);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (privkey->keylabel)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys free(privkey->keylabel);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (pubkey->keylabel)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys free(pubkey->keylabel);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_DeleteKey(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE *key;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CREDENTIAL cred;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys boolean_t destroy = B_TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL || key->keyp == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key->keyclass != KMF_ASYM_PUB &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key->keyclass != KMF_ASYM_PRI &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key->keyclass != KMF_SYMMETRIC)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_CLASS);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* "destroy" is optional. Default is TRUE */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&destroy, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (destroy) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&cred, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = pk11_authenticate(handle, &cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!key->israw && destroy)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_DestroyObject(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Report authentication failures to the caller */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ckrv == CKR_PIN_EXPIRED || ckrv == CKR_SESSION_READ_ONLY)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_AUTH_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *keyp,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_OID *algOID,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *tobesigned,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *output)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE hSession = kmfh->pk11handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_MECHANISM mechanism;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_MECHANISM_TYPE mechtype, hashmech;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_KEY_TYPE keytype;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ALGORITHM_INDEX AlgId;
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA hashData = { 0, NULL };
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll uchar_t digest[1024];
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE subprime = { CKA_SUBPRIME, NULL, 0 };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keyp == NULL || algOID == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tobesigned == NULL || output == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* These functions are available to the plugin from libkmf */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys AlgId = x509_algoid_to_algid(algOID);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (AlgId == KMF_ALGID_NONE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Get the PKCS11 signing key type and mechtype */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (get_pk11_data(AlgId, &keytype, &mechtype, &hashmech, 0))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (void) memset(digest, 0, sizeof (digest));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll hashData.Data = digest;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll hashData.Length = sizeof (digest);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rv = PKCS_DigestData(handle, hSession, hashmech, tobesigned, &hashData,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (mechtype == CKM_RSA_PKCS));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (rv)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (rv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (mechtype == CKM_DSA && hashmech == CKM_SHA256) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /*
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll * FIPS 186-3 says that when signing with DSA
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll * the hash must be truncated to the size of the
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll * subprime.
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = C_GetAttributeValue(hSession,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (CK_OBJECT_HANDLE)keyp->keyp,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &subprime, 1);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_INTERNAL);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll hashData.Length = subprime.ulValueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* the mechtype from the 'get_pk11_info' refers to the signing */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll mechanism.mechanism = mechtype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys mechanism.pParameter = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys mechanism.ulParameterLen = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_SignInit(hSession, &mechanism, (CK_OBJECT_HANDLE)keyp->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ckrv = C_Sign(hSession, hashData.Data, hashData.Length,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys output->Data, (CK_ULONG *)&output->Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_GetErrorString(KMF_HANDLE_T handle, char **msgstr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *msgstr = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->lasterr.errcode != 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *e = pkcs11_strerror(kmfh->lasterr.errcode);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (e == NULL || (*msgstr = (char *)strdup(e)) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic CK_RV
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysgetObjectKeytype(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG *keytype)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV rv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE templ;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG len = sizeof (CK_ULONG);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys templ.type = CKA_KEY_TYPE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys templ.pValue = keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys templ.ulValueLen = len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle, obj, &templ, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic CK_RV
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysgetObjectLabel(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char **outlabel)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV rv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE templ;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char Label[BUFSIZ];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG len = sizeof (Label);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(Label, 0, len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys templ.type = CKA_LABEL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys templ.pValue = Label;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys templ.ulValueLen = len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_GetAttributeValue(kmfh->pk11handle, obj, &templ, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outlabel = (char *)strdup(Label);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outlabel = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
4ba70ed0e487727de98a6297bc6d0a827001a390wyllysstatic CK_RV
4ba70ed0e487727de98a6297bc6d0a827001a390wyllysgetObjectKeyclass(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys KMF_KEY_CLASS *keyclass)
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys{
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys CK_RV rv = CKR_OK;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys CK_ATTRIBUTE templ;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys CK_OBJECT_CLASS class;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys templ.type = CKA_CLASS;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys templ.pValue = &class;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys templ.ulValueLen = sizeof (CK_OBJECT_CLASS);
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys rv = C_GetAttributeValue(kmfh->pk11handle, obj, &templ, 1);
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys if (rv == CKR_OK) {
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys if (class == CKO_PUBLIC_KEY) {
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys *keyclass = KMF_ASYM_PUB;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys } else if (class == CKO_PRIVATE_KEY) {
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys *keyclass = KMF_ASYM_PRI;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys } else if (class == CKO_SECRET_KEY) {
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys *keyclass = KMF_SYMMETRIC;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys }
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys } else {
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys *keyclass = KMF_KEYCLASS_NONE;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys }
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys return (rv);
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_FindPrikeyByCert(KMF_HANDLE_T handle, int numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_SPKI *pubkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_CERTIFICATE *SignerCert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE templ[4];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_HANDLE pri_obj = CK_INVALID_HANDLE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG obj_count;
2c9a247fb01631b3eb3b85a1127e72f0b60ae108Wyllys Ingersoll CK_OBJECT_CLASS objClass = CKO_PRIVATE_KEY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BBOOL true = TRUE;
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA Id = { 0, NULL };
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE *key = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_DATA *cert = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CREDENTIAL cred;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ENCODE_FORMAT format = KMF_FORMAT_UNDEF;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_ULONG keytype;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Get the key handle */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (key == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Get the optional encoded format */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&format, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Decode the signer cert so we can get the SPKI data */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (cert == NULL || cert->Data == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((rv = DerDecodeSignedCertificate(cert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &SignerCert)) != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the public key info from the signer certificate */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubkey = &SignerCert->certificate.subjectPublicKeyInfo;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Generate an ID from the SPKI data */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = GetIDFromSPKI(pubkey, &Id);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto errout;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Get the credential and login */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&cred, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = pk11_authenticate(handle, &cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Start searching */
2c9a247fb01631b3eb3b85a1127e72f0b60ae108Wyllys Ingersoll SETATTR(templ, 0, CKA_CLASS, &objClass, sizeof (objClass));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, 1, CKA_TOKEN, &true, sizeof (true));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, 2, CKA_PRIVATE, &true, sizeof (true));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, 3, CKA_ID, Id.Data, Id.Length);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((ckrv = C_FindObjectsInit(kmfh->pk11handle, templ, 4)) != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto errout;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((ckrv = C_FindObjects(kmfh->pk11handle, &pri_obj, 1,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &obj_count)) != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto errout;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (obj_count == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
2c9a247fb01631b3eb3b85a1127e72f0b60ae108Wyllys Ingersoll rv = KMF_ERR_KEY_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto errout;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->kstype = KMF_KEYSTORE_PK11TOKEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyclass = KMF_ASYM_PRI;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyp = (void *)pri_obj;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key->israw = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) C_FindObjectsFinal(kmfh->pk11handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = getObjectLabel(handle, (CK_OBJECT_HANDLE)key->keyp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &key->keylabel);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ckrv != CKR_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SET_ERROR(handle, ckrv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_INTERNAL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * The key->keyalg value is needed if we need to convert the key
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * to raw key. However, the key->keyalg value will not be set if
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * this function is not called thru the kmf_find_prikey_by_cert()
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * framework function. To be safe, we will get the keytype from
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * the key object and set key->keyalg value here.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ckrv = getObjectKeytype(handle, (CK_OBJECT_HANDLE)key->keyp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &keytype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(handle, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keytype == CKK_RSA)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key->keyalg = KMF_RSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys else if (keytype == CKK_DSA)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key->keyalg = KMF_DSA;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll else if (keytype == CKK_EC)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll key->keyalg = KMF_ECDSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* For asymmetric keys, we only support RSA and DSA */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_KEY_NOT_FOUND;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto errout;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_OK && format == KMF_FORMAT_RAWKEY) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_KEY_DATA *rkey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = keyObj2RawKey(handle, key, &rkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyp = rkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->israw = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyserrout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (Id.Data != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(Id.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (SignerCert != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_signed_cert(SignerCert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(SignerCert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_DecryptData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_OID *algOID, KMF_DATA *ciphertext,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *output)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE hSession = kmfh->pk11handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_MECHANISM mechanism;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_MECHANISM_TYPE mechtype;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_KEY_TYPE keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_ALGORITHM_INDEX AlgId;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG out_len = 0, block_len = 0, total_decrypted = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint8_t *in_data, *out_data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i, blocks;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE ckTemplate[1];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL || algOID == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ciphertext == NULL || output == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys AlgId = x509_algoid_to_algid(algOID);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (AlgId == KMF_ALGID_NONE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Map the Algorithm ID to a PKCS#11 mechanism */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (get_pk11_data(AlgId, &keytype, &mechtype, NULL, 0))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll mechanism.mechanism = mechtype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys mechanism.pParameter = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys mechanism.ulParameterLen = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(ckTemplate, 0, CKA_MODULUS, (CK_BYTE *)NULL,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sizeof (CK_ULONG));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the modulus length */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_GetAttributeValue(hSession,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (CK_OBJECT_HANDLE)key->keyp, ckTemplate, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys block_len = ckTemplate[0].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Compute the number of times to do single-part decryption */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys blocks = ciphertext->Length/block_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys out_data = output->Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys in_data = ciphertext->Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys out_len = block_len - 11;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < blocks; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_DecryptInit(hSession, &mechanism,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_Decrypt(hSession, in_data, block_len,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys out_data, (CK_ULONG *)&out_len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys out_data += out_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys total_decrypted += out_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys in_data += block_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys output->Length = total_decrypted;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysattr2bigint(CK_ATTRIBUTE_PTR attr, KMF_BIGINT *big)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys big->val = attr->pValue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys big->len = attr->ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllysstatic KMF_RETURN
73cc0e021f4115db3085cd78083c42c8be4559e3wyllysget_bigint_attr(CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj,
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys CK_ATTRIBUTE_TYPE attrtype, KMF_BIGINT *bigint)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys{
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys CK_RV ckrv;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys CK_ATTRIBUTE attr;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys attr.type = attrtype;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys attr.pValue = NULL;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys attr.ulValueLen = 0;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if ((ckrv = C_GetAttributeValue(sess, obj,
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys &attr, 1)) != CKR_OK) {
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys /* Mask this error so the caller can continue */
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (ckrv == CKR_ATTRIBUTE_TYPE_INVALID)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys return (KMF_OK);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys else
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys return (KMF_ERR_INTERNAL);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys }
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (attr.ulValueLen > 0 && bigint != NULL) {
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys attr.pValue = malloc(attr.ulValueLen);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (attr.pValue == NULL)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys return (KMF_ERR_MEMORY);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if ((ckrv = C_GetAttributeValue(sess, obj,
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys &attr, 1)) != CKR_OK)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (ckrv != CKR_OK) {
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys free(attr.pValue);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys return (KMF_ERR_INTERNAL);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys }
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys bigint->val = attr.pValue;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys bigint->len = attr.ulValueLen;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys }
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys return (KMF_OK);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysget_raw_rsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_RSA_KEY *rawrsa)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE sess = kmfh->pk11handle;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys CK_ATTRIBUTE rsa_pri_attrs[2] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_MODULUS, NULL, 0 },
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys { CKA_PUBLIC_EXPONENT, NULL, 0 }
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys };
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_ULONG count = sizeof (rsa_pri_attrs) / sizeof (CK_ATTRIBUTE);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rawrsa == NULL)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys return (KMF_ERR_BAD_PARAMETER);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys (void) memset(rawrsa, 0, sizeof (KMF_RAW_RSA_KEY));
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys if ((ckrv = C_GetAttributeValue(sess, obj,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rsa_pri_attrs, count)) != CKR_OK) {
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys SET_ERROR(kmfh, ckrv);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys /* Tell the caller know why the key data cannot be retrieved. */
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys if (ckrv == CKR_ATTRIBUTE_SENSITIVE)
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys return (KMF_ERR_SENSITIVE_KEY);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys else if (ckrv == CKR_KEY_UNEXTRACTABLE)
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys return (KMF_ERR_UNEXTRACTABLE_KEY);
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys else
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Allocate memory for each attribute. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < count; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rsa_pri_attrs[i].ulValueLen == (CK_ULONG)-1 ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rsa_pri_attrs[i].ulValueLen == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rsa_pri_attrs[i].ulValueLen = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys continue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((rsa_pri_attrs[i].pValue =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys malloc(rsa_pri_attrs[i].ulValueLen)) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now that we have space, really get the attributes */
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((ckrv = C_GetAttributeValue(sess, obj,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rsa_pri_attrs, count)) != CKR_OK) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys attr2bigint(&(rsa_pri_attrs[i++]), &rawrsa->mod);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys attr2bigint(&(rsa_pri_attrs[i++]), &rawrsa->pubexp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys /* Now get the optional parameters */
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys rv = get_bigint_attr(sess, obj, CKA_PRIVATE_EXPONENT, &rawrsa->priexp);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rv != KMF_OK)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys goto end;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys rv = get_bigint_attr(sess, obj, CKA_PRIME_1, &rawrsa->prime1);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rv != KMF_OK)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys goto end;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys rv = get_bigint_attr(sess, obj, CKA_PRIME_2, &rawrsa->prime2);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rv != KMF_OK)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys goto end;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys rv = get_bigint_attr(sess, obj, CKA_EXPONENT_1, &rawrsa->exp1);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rv != KMF_OK)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys goto end;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys rv = get_bigint_attr(sess, obj, CKA_EXPONENT_2, &rawrsa->exp2);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rv != KMF_OK)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys goto end;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys rv = get_bigint_attr(sess, obj, CKA_COEFFICIENT, &rawrsa->coef);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rv != KMF_OK)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysend:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < count; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rsa_pri_attrs[i].pValue != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(rsa_pri_attrs[i].pValue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rawrsa->priexp.val)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys free(rawrsa->priexp.val);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rawrsa->prime1.val)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys free(rawrsa->prime1.val);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rawrsa->prime2.val)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys free(rawrsa->prime2.val);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rawrsa->exp1.val)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys free(rawrsa->exp1.val);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rawrsa->exp2.val)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys free(rawrsa->exp2.val);
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys if (rawrsa->coef.val)
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys free(rawrsa->coef.val);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(rawrsa, 0, sizeof (KMF_RAW_RSA_KEY));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
b60f2a0b921611326383e4789e0874e9e8a2e708fr#define DSA_PRIME_BUFSIZE CHARLEN2BIGNUMLEN(1024) /* 8192 bits */
b60f2a0b921611326383e4789e0874e9e8a2e708fr#define DSA_PRIVATE_BUFSIZE BIG_CHUNKS_FOR_160BITS /* 160 bits */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * This function calculates the pubkey value from the prime,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * base and private key values of a DSA key.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysstatic KMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyscompute_dsa_pubvalue(KMF_RAW_DSA_KEY *rawdsa)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys BIGNUM p, g, x, y;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys BIG_ERR_CODE err;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uchar_t *pubvalue;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t pubvalue_len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((err = big_init1(&p, DSA_PRIME_BUFSIZE, NULL, 0)) != BIG_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys bytestring2bignum(&p, rawdsa->prime.val, rawdsa->prime.len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((err = big_init1(&g, DSA_PRIME_BUFSIZE, NULL, 0)) != BIG_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto ret1;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys bytestring2bignum(&g, rawdsa->base.val, rawdsa->base.len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((err = big_init1(&x, DSA_PRIVATE_BUFSIZE, NULL, 0)) != BIG_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto ret2;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys bytestring2bignum(&x, rawdsa->value.val, rawdsa->value.len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((err = big_init1(&y, DSA_PRIME_BUFSIZE, NULL, 0)) != BIG_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto ret3;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys err = big_modexp(&y, &g, &x, &p, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (err != BIG_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_INTERNAL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto ret3;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys pubvalue_len = y.len * (int)sizeof (uint32_t);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((pubvalue = malloc(pubvalue_len)) == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto ret4;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys bignum2bytestring(pubvalue, &y, pubvalue_len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawdsa->pubvalue.val = pubvalue;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawdsa->pubvalue.len = pubvalue_len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysret4:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys big_finish(&y);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysret3:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys big_finish(&x);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysret2:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys big_finish(&g);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysret1:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys big_finish(&p);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollstatic KMF_RETURN
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollget_raw_ec(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_EC_KEY *rawec)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll{
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll KMF_RETURN rv = KMF_OK;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_RV ckrv;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_SESSION_HANDLE sess = kmfh->pk11handle;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ATTRIBUTE ec_attrs[2] = {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll { CKA_EC_PARAMS, NULL, 0},
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll { CKA_VALUE, NULL, 0}
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll };
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll CK_ULONG count = sizeof (ec_attrs) / sizeof (CK_ATTRIBUTE);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll int i;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if ((ckrv = C_GetAttributeValue(sess, obj,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ec_attrs, 2)) != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll /* Tell the caller know why the key data cannot be retrieved. */
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ckrv == CKR_ATTRIBUTE_SENSITIVE)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_SENSITIVE_KEY);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll else if (ckrv == CKR_KEY_UNEXTRACTABLE)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_UNEXTRACTABLE_KEY);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (KMF_ERR_INTERNAL);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll for (i = 0; i < count; i++) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ec_attrs[i].ulValueLen == (CK_ULONG)-1 ||
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ec_attrs[i].ulValueLen == 0) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ec_attrs[i].ulValueLen = 0;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll continue;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if ((ec_attrs[i].pValue =
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll malloc(ec_attrs[i].ulValueLen)) == NULL) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rv = KMF_ERR_MEMORY;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll goto end;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if ((ckrv = C_GetAttributeValue(sess, obj,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll ec_attrs, count)) != CKR_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SET_ERROR(kmfh, ckrv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rv = KMF_ERR_INTERNAL;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll goto end;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawec->params.Data = ec_attrs[0].pValue;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawec->params.Length = ec_attrs[0].ulValueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawec->value.val = ec_attrs[1].pValue;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawec->value.len = ec_attrs[1].ulValueLen;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersollend:
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (rv != KMF_OK) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll for (i = 0; i < count; i++) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (ec_attrs[i].pValue != NULL)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll free(ec_attrs[i].pValue);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll (void) memset(rawec, 0, sizeof (KMF_RAW_EC_KEY));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll return (rv);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysget_raw_dsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_DSA_KEY *rawdsa)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE sess = kmfh->pk11handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE dsa_pri_attrs[8] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_PRIME, NULL, 0 },
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_SUBPRIME, NULL, 0 },
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_BASE, NULL, 0 },
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { CKA_VALUE, NULL, 0 }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG count = sizeof (dsa_pri_attrs) / sizeof (CK_ATTRIBUTE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((ckrv = C_GetAttributeValue(sess, obj,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys dsa_pri_attrs, count)) != CKR_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SET_ERROR(kmfh, ckrv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Tell the caller know why the key data cannot be retrieved. */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ckrv == CKR_ATTRIBUTE_SENSITIVE)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_SENSITIVE_KEY);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys else if (ckrv == CKR_KEY_UNEXTRACTABLE)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_UNEXTRACTABLE_KEY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Allocate memory for each attribute. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < count; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (dsa_pri_attrs[i].ulValueLen == (CK_ULONG)-1 ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys dsa_pri_attrs[i].ulValueLen == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys dsa_pri_attrs[i].ulValueLen = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys continue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((dsa_pri_attrs[i].pValue =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys malloc(dsa_pri_attrs[i].ulValueLen)) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((ckrv = C_GetAttributeValue(sess, obj,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys dsa_pri_attrs, count)) != CKR_OK) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Fill in all the temp variables. They are all required. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys attr2bigint(&(dsa_pri_attrs[i++]), &rawdsa->prime);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys attr2bigint(&(dsa_pri_attrs[i++]), &rawdsa->subprime);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys attr2bigint(&(dsa_pri_attrs[i++]), &rawdsa->base);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys attr2bigint(&(dsa_pri_attrs[i++]), &rawdsa->value);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Compute the public key value and store it */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = compute_dsa_pubvalue(rawdsa);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysend:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < count; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (dsa_pri_attrs[i].pValue != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(dsa_pri_attrs[i].pValue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(rawdsa, 0, sizeof (KMF_RAW_DSA_KEY));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysget_raw_sym(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_SYM_KEY *rawsym)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE sess = kmfh->pk11handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE sym_attr[1];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG value_len = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* find the key length first */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sym_attr[0].type = CKA_VALUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sym_attr[0].pValue = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sym_attr[0].ulValueLen = value_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((ckrv = C_GetAttributeValue(sess, obj, sym_attr, 1)) != CKR_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawsym->keydata.val = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawsym->keydata.len = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv == CKR_ATTRIBUTE_SENSITIVE) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_SENSITIVE_KEY);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (ckrv == CKR_KEY_UNEXTRACTABLE) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_UNEXTRACTABLE_KEY);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SET_ERROR(kmfh, ckrv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Allocate memory for pValue */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sym_attr[0].pValue = malloc(sym_attr[0].ulValueLen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (sym_attr[0].pValue == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* get the key data */
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((ckrv = C_GetAttributeValue(sess, obj, sym_attr, 1)) != CKR_OK) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(sym_attr[0].pValue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rawsym->keydata.val = sym_attr[0].pValue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rawsym->keydata.len = sym_attr[0].ulValueLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyskeyObj2RawKey(KMF_HANDLE_T handle, KMF_KEY_HANDLE *inkey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_KEY_DATA **outkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_KEY_DATA *rkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rkey = malloc(sizeof (KMF_RAW_KEY_DATA));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rkey == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(rkey, 0, sizeof (KMF_RAW_KEY_DATA));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rkey->keytype = inkey->keyalg;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (inkey->keyalg == KMF_RSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = get_raw_rsa(kmfh, (CK_OBJECT_HANDLE)inkey->keyp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &rkey->rawdata.rsa);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (inkey->keyalg == KMF_DSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = get_raw_dsa(kmfh, (CK_OBJECT_HANDLE)inkey->keyp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &rkey->rawdata.dsa);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (inkey->keyalg == KMF_AES ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys inkey->keyalg == KMF_RC4 ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys inkey->keyalg == KMF_DES ||
c197cb9db36685d2808c057fdbe5700734483ab2hylee inkey->keyalg == KMF_DES3 ||
c197cb9db36685d2808c057fdbe5700734483ab2hylee inkey->keyalg == KMF_GENERIC_SECRET) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = get_raw_sym(kmfh, (CK_OBJECT_HANDLE)inkey->keyp,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &rkey->rawdata.sym);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * If sensitive or non-extractable, mark them as such
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * but return "OK" status so the keys get counted
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * when doing FindKey operations.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_ERR_SENSITIVE_KEY) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rkey->sensitive = B_TRUE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rkey->not_extractable = B_TRUE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll } else if (inkey->keyalg == KMF_ECDSA) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rv = get_raw_ec(kmfh, (CK_OBJECT_HANDLE)inkey->keyp,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll &rkey->rawdata.ec);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_BAD_PARAMETER;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outkey = rkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (rkey != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(rkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outkey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyskmf2pk11keytype(KMF_KEY_ALG keyalg, CK_KEY_TYPE *type)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (keyalg) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_RSA:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *type = CKK_RSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DSA:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *type = CKK_DSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll case KMF_ECDSA:
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll *type = CKK_EC;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_AES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *type = CKK_AES;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_RC4:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *type = CKK_RC4;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *type = CKK_DES;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DES3:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *type = CKK_DES3;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
c197cb9db36685d2808c057fdbe5700734483ab2hylee case KMF_GENERIC_SECRET:
c197cb9db36685d2808c057fdbe5700734483ab2hylee *type = CKK_GENERIC_SECRET;
c197cb9db36685d2808c057fdbe5700734483ab2hylee break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys default:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_TYPE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic int
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysIDStringToData(char *idstr, KMF_DATA *iddata)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int len, i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *iddup, *byte;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint_t lvalue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (idstr == NULL || !strlen(idstr))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (-1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys iddup = (char *)strdup(idstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (iddup == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys len = strlen(iddup) / 3 + 1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys iddata->Data = malloc(len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (iddata->Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(iddata->Data, 0, len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys iddata->Length = len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys byte = strtok(iddup, ":");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (byte == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(iddup);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(iddata->Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys iddata->Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys iddata->Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (-1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys do {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sscanf(byte, "%x", &lvalue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys iddata->Data[i++] = (uchar_t)(lvalue & 0x000000FF);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys byte = strtok(NULL, ":");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } while (byte != NULL && i < len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys iddata->Length = i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(iddup);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (0);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_FindKey(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t want_keys, i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE pTmpl[10];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_CLASS class;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BBOOL true = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG alg;
73cc0e021f4115db3085cd78083c42c8be4559e3wyllys boolean_t is_token = B_TRUE, is_private = B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE *keys;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t *numkeys;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys KMF_CREDENTIAL *cred = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_CLASS keyclass = KMF_KEYCLASS_NONE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *findLabel, *idstr;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_ALG keytype = KMF_KEYALG_NONE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ENCODE_FORMAT format;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (numkeys == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (*numkeys > 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys want_keys = *numkeys;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys want_keys = MAXINT; /* count them all */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* keyclass is optional */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_KEYCLASS_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&keyclass, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keyclass == KMF_ASYM_PUB) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys class = CKO_PUBLIC_KEY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keyclass == KMF_ASYM_PRI) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys class = CKO_PRIVATE_KEY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keyclass == KMF_SYMMETRIC) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys class = CKO_SECRET_KEY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_TOKEN_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&is_token, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_token) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(pTmpl, i, CKA_TOKEN, &true, sizeof (true));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keyclass != KMF_KEYCLASS_NONE) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(pTmpl, i, CKA_CLASS, &class, sizeof (class));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys findLabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (findLabel != NULL && strlen(findLabel)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(pTmpl, i, CKA_LABEL, findLabel, strlen(findLabel));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* keytype is optional */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&keytype, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keytype != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf2pk11keytype(keytype, &alg);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_TYPE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(pTmpl, i, CKA_KEY_TYPE, &alg, sizeof (alg));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys idstr = kmf_get_attr_ptr(KMF_IDSTR_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (idstr != NULL) {
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA iddata = { 0, NULL };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * ID String parameter is assumed to be of form:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * XX:XX:XX:XX:XX ... :XX
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * where XX is a hex number.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * We must convert this back to binary in order to
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * use it in a search.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = IDStringToData(idstr, &iddata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(pTmpl, i, CKA_ID, iddata.Data, iddata.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* is_private is optional */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_get_attr(KMF_PRIVATE_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&is_private, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_private) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(pTmpl, i, CKA_PRIVATE, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys /*
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys * Authenticate if the object is a token object,
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys * a private or secred key, or if the user passed in credentials.
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (cred != NULL) {
d00756ccb34596a328f8a15d1965da5412d366d0wyllys rv = pk11_authenticate(handle, cred);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (rv != KMF_OK)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* it is okay to have "keys" contains NULL */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_FindObjectsInit(kmfh->pk11handle, pTmpl, i);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv == CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG obj_count, n = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (ckrv == CKR_OK && n < want_keys) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_HANDLE hObj;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_FindObjects(kmfh->pk11handle, &hObj,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys 1, &obj_count);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv == CKR_OK && obj_count == 1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keys != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].kstype = KMF_KEYSTORE_PK11TOKEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].israw = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].keyp = (void *)hObj;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = getObjectKeytype(handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)keys[n].keyp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &keytype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = getObjectLabel(handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)keys[n].keyp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &(keys[n].keylabel));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys if (keyclass == KMF_KEYCLASS_NONE) {
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys ckrv = getObjectKeyclass(handle,
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys (CK_OBJECT_HANDLE)
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys keys[n].keyp,
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys &(keys[n].keyclass));
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys if (ckrv != CKR_OK)
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys goto end;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys } else {
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys keys[n].keyclass = keyclass;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keytype == CKK_RSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].keyalg = KMF_RSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keytype == CKK_DSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].keyalg = KMF_DSA;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll } else if (keytype == CKK_EC) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll keys[n].keyalg = KMF_ECDSA;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keytype == CKK_AES) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].keyalg = KMF_AES;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys[n].keyclass =
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_SYMMETRIC;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keytype == CKK_RC4) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].keyalg = KMF_RC4;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys[n].keyclass =
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_SYMMETRIC;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keytype == CKK_DES) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].keyalg = KMF_DES;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys[n].keyclass =
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_SYMMETRIC;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keytype == CKK_DES3) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[n].keyalg = KMF_DES3;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys[n].keyclass =
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_SYMMETRIC;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (keytype ==
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CKK_GENERIC_SECRET) {
c197cb9db36685d2808c057fdbe5700734483ab2hylee keys[n].keyalg =
c197cb9db36685d2808c057fdbe5700734483ab2hylee KMF_GENERIC_SECRET;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys[n].keyclass =
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_SYMMETRIC;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys n++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_FindObjectsFinal(kmfh->pk11handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* "numkeys" indicates the number that were actually found */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numkeys = n;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys if (ckrv == KMF_OK && keys != NULL && (*numkeys) > 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((rv = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numattr, (void *)&format, NULL)) == KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (format == KMF_FORMAT_RAWKEY ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys format == KMF_FORMAT_PEM) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Convert keys to "rawkey" format */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < (*numkeys); i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RAW_KEY_DATA *rkey = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = keyObj2RawKey(handle, &keys[i],
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &rkey);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys[i].keyp = rkey;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keys[i].israw = TRUE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys break;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK; /* format is optional */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysend:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Report authentication failures to the caller */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv == CKR_USER_NOT_LOGGED_IN ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_INCORRECT ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_INVALID ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_EXPIRED ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_LOCKED ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_SESSION_READ_ONLY)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_AUTH_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if ((*numkeys) == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEY_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic char *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysconvertDate(char *fulldate)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys struct tm tms;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char newtime[9];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strptime(fulldate, "%b %d %T %Y %Z", &tms);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (tms.tm_year < 69)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tms.tm_year += 100;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strftime(newtime, sizeof (newtime), "m%d", &tms);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newtime[8] = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* memory returned must be freed by the caller */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return ((char *)strdup(newtime));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysstatic KMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysstore_raw_key(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attrlist, int numattr,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_KEY_DATA *rawkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE templ[32];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_HANDLE keyobj;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_KEY_TYPE keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_CLASS oClass = CKO_PRIVATE_KEY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BBOOL cktrue = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_DATE startdate, enddate;
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA id = { 0, NULL };
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA subject = { 0, NULL };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509EXT_KEY_USAGE kuext;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_CERTIFICATE *x509 = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_BBOOL kufound = B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_DATA *cert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *notbefore = NULL, *start = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *notafter = NULL, *end = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *keylabel = NULL;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys KMF_CREDENTIAL *cred = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->keytype == KMF_RSA)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keytype = CKK_RSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if (rawkey->keytype == KMF_DSA)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keytype = CKK_DSA;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll else if (rawkey->keytype == KMF_ECDSA)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll keytype = CKK_EC;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (cred != NULL) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = pk11_authenticate(handle, cred);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (rv != KMF_OK)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys return (rv);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys }
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys /*
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys * If the caller did not specify a label, see if the raw key
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys * came with one (possible if it came from a PKCS#12 file).
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys */
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys if (keylabel == NULL) {
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys keylabel = rawkey->label;
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_CLASS, &oClass, sizeof (CK_OBJECT_CLASS)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_KEY_TYPE, &keytype, sizeof (keytype)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_TOKEN, &cktrue, sizeof (cktrue)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PRIVATE, &cktrue, sizeof (cktrue)); i++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll if (keytype != CKK_EC)
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(templ, i, CKA_DECRYPT, &cktrue, sizeof (cktrue)); i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (cert != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys id.Data = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys id.Length = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_cert_id_data(cert, &id);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = DerDecodeSignedCertificate((const KMF_DATA *)cert, &x509);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = DerEncodeName(&x509->certificate.subject, &subject);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_SUBJECT, subject.Data, subject.Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_cert_start_date_str(handle, cert, &notbefore);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys start = convertDate(notbefore);
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys free(notbefore);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_cert_end_date_str(handle, cert, &notafter);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys end = convertDate(notafter);
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys free(notafter);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (id.Data != NULL && id.Data != NULL && id.Length > 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_ID, id.Data, id.Length);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (start != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * This makes some potentially dangerous assumptions:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * 1. that the startdate in the parameter block is
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * properly formatted as YYYYMMDD
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * 2. That the CK_DATE structure is always the same.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memcpy(&startdate, start, sizeof (CK_DATE));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_START_DATE, &startdate,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (startdate));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (end != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memcpy(&enddate, end, sizeof (CK_DATE));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_END_DATE, &enddate,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (enddate));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((rv = kmf_get_cert_ku(cert, &kuext)) != KMF_OK &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv != KMF_ERR_EXTENSION_NOT_FOUND)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto cleanup;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kufound = (rv == KMF_OK);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK; /* reset if we got KMF_ERR_EXTENSION_NOT_FOUND */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Only set the KeyUsage stuff if the KU extension was present.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kufound) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_BBOOL condition;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys condition = (kuext.KeyUsageBits & KMF_keyEncipherment) ?
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys B_TRUE : B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_UNWRAP, &condition, sizeof (CK_BBOOL));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys condition = (kuext.KeyUsageBits & KMF_dataEncipherment) ?
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys B_TRUE : B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_DECRYPT, &condition, sizeof (CK_BBOOL));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys condition = (kuext.KeyUsageBits & KMF_digitalSignature) ?
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys B_TRUE : B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_SIGN, &condition, sizeof (CK_BBOOL));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys condition = (kuext.KeyUsageBits & KMF_digitalSignature) ?
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys B_TRUE : B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_SIGN_RECOVER, &condition,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (CK_BBOOL));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylabel != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_LABEL, keylabel, strlen(keylabel));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys if (id.Data == NULL && rawkey->id.Data != NULL) {
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys SETATTR(templ, i, CKA_ID, rawkey->id.Data,
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys rawkey->id.Length);
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys i++;
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keytype == CKK_RSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_MODULUS,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.mod.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.mod.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PUBLIC_EXPONENT,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.pubexp.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.pubexp.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->rawdata.rsa.priexp.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PRIVATE_EXPONENT,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.priexp.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.priexp.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->rawdata.rsa.prime1.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PRIME_1,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.prime1.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.prime1.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->rawdata.rsa.prime2.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PRIME_2,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.prime2.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.prime2.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->rawdata.rsa.exp1.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_EXPONENT_1,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.exp1.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.exp1.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->rawdata.rsa.exp2.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_EXPONENT_2,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.exp2.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.exp2.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->rawdata.rsa.coef.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_COEFFICIENT,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.coef.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.rsa.coef.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll } else if (keytype == CKK_DSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PRIME,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.prime.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.prime.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_SUBPRIME,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.subprime.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.subprime.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_BASE,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.base.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.base.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_VALUE,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.value.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.dsa.value.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll } else if (keytype == CKK_EC) {
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(templ, i, CKA_SIGN, &cktrue, sizeof (cktrue));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll i++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(templ, i, CKA_DERIVE, &cktrue, sizeof (cktrue));
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll i++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(templ, i, CKA_VALUE,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawkey->rawdata.ec.value.val,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawkey->rawdata.ec.value.len);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll i++;
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll SETATTR(templ, i, CKA_EC_PARAMS,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawkey->rawdata.ec.params.Data,
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll rawkey->rawdata.ec.params.Length);
e65e5c2d2f32a99e8c5f740cabae9075dab03ce7Wyllys Ingersoll i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = C_CreateObject(kmfh->pk11handle, templ, i, &keyobj);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Report authentication failures to the caller */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv == CKR_USER_NOT_LOGGED_IN ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_INCORRECT ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_INVALID ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_EXPIRED ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_PIN_LOCKED ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv == CKR_SESSION_READ_ONLY)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_AUTH_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys if (start != NULL)
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys free(start);
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys if (end != NULL)
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys free(end);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&id);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&subject);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_signed_cert(x509);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(x509);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_CreateSymKey(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV ckrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE hSession = kmfh->pk11handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_HANDLE keyhandle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_MECHANISM keyGenMech;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_OBJECT_CLASS class = CKO_SECRET_KEY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG secKeyType;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ULONG secKeyLen; /* for RC4 and AES */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BBOOL true = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_BBOOL false = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_ATTRIBUTE templ[15];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_BYTE *keydata = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE *symkey;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_ALG keytype;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t keylen = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t attrkeylen = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t keylen_size = sizeof (uint32_t);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *keylabel = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys KMF_CREDENTIAL *cred = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t is_sensitive = B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t is_not_extractable = B_FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys symkey = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (symkey == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&keytype, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylabel == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_SENSITIVE_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&is_sensitive, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_NON_EXTRACTABLE_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&is_not_extractable, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
c197cb9db36685d2808c057fdbe5700734483ab2hylee /*
c197cb9db36685d2808c057fdbe5700734483ab2hylee * For AES, RC4, DES and 3DES, call C_GenerateKey() to create a key.
c197cb9db36685d2808c057fdbe5700734483ab2hylee *
c197cb9db36685d2808c057fdbe5700734483ab2hylee * For a generic secret key, because it may not be supported in
c197cb9db36685d2808c057fdbe5700734483ab2hylee * C_GenerateKey() for some PKCS11 providers, we will handle it
c197cb9db36685d2808c057fdbe5700734483ab2hylee * differently.
c197cb9db36685d2808c057fdbe5700734483ab2hylee */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keytype == KMF_GENERIC_SECRET) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = create_generic_secret_key(handle, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attrlist, &keyhandle);
c197cb9db36685d2808c057fdbe5700734483ab2hylee if (rv != KMF_OK)
c197cb9db36685d2808c057fdbe5700734483ab2hylee goto out;
c197cb9db36685d2808c057fdbe5700734483ab2hylee else
c197cb9db36685d2808c057fdbe5700734483ab2hylee goto setup;
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_KEY_DATA_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys NULL, &attrkeylen);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_OK && attrkeylen > 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keydata = kmf_get_attr_ptr(KMF_KEY_DATA_ATTR, attrlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keydata = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attrkeylen = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keydata != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keytype == KMF_DES && attrkeylen != 8) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_BAD_KEY_SIZE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto out;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keytype == KMF_DES3 && attrkeylen != 24) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_BAD_KEY_SIZE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto out;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * This may override what the user gave on the
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * command line.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keylen = attrkeylen * 8; /* bytes to bits */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * If keydata was not given, key length must be
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * provided.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &keylen, &keylen_size);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_ERR_ATTR_NOT_FOUND &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (keytype == KMF_DES || keytype == KMF_DES3))
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* keylength is not required for DES and 3DES */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((keylen % 8) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_KEY_SIZE);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys secKeyLen = keylen / 8; /* in bytes for RC4/AES */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Only set CKA_VALUE_LEN if the key data was not given and
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * we are creating an RC4 or AES key.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keydata == NULL &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (keytype == KMF_AES || keytype == KMF_RC4)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_VALUE_LEN, &secKeyLen,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (secKeyLen));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
c197cb9db36685d2808c057fdbe5700734483ab2hylee /* Other keytypes */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyGenMech.pParameter = NULL_PTR;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyGenMech.ulParameterLen = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys switch (keytype) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys case KMF_AES:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keyGenMech.mechanism = CKM_AES_KEY_GEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys secKeyType = CKK_AES;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys break;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys case KMF_RC4:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keyGenMech.mechanism = CKM_RC4_KEY_GEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys secKeyType = CKK_RC4;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys break;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys case KMF_DES:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keyGenMech.mechanism = CKM_DES_KEY_GEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys secKeyType = CKK_DES;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys break;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys case KMF_DES3:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keyGenMech.mechanism = CKM_DES3_KEY_GEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys secKeyType = CKK_DES3;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys break;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys default:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_KEY_TYPE);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keydata != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_VALUE, keydata, secKeyLen);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_CLASS, &class, sizeof (class));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_KEY_TYPE, &secKeyType, sizeof (secKeyType));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylabel != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_LABEL, keylabel, strlen(keylabel));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_sensitive == B_TRUE) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_SENSITIVE, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_SENSITIVE, &false, sizeof (false));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_not_extractable == B_TRUE) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_EXTRACTABLE, &false, sizeof (false));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_EXTRACTABLE, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_TOKEN, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_PRIVATE, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_ENCRYPT, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_DECRYPT, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_SIGN, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SETATTR(templ, i, CKA_VERIFY, &true, sizeof (true));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (cred == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys rv = pk11_authenticate(handle, cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* If the key data was given, use C_CreateObject */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keydata != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ckrv = C_CreateObject(hSession, templ, i, &keyhandle);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ckrv = C_GenerateKey(hSession, &keyGenMech, templ, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &keyhandle);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (ckrv == CKR_USER_NOT_LOGGED_IN ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_INCORRECT ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_INVALID ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_EXPIRED ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_LOCKED ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_SESSION_READ_ONLY)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = KMF_ERR_AUTH_FAILED;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys else
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = KMF_ERR_KEYGEN_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, ckrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
c197cb9db36685d2808c057fdbe5700734483ab2hyleesetup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->kstype = KMF_KEYSTORE_PK11TOKEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys symkey->keyalg = keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->keyclass = KMF_SYMMETRIC;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->israw = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->keyp = (void *)keyhandle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMFPK11_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_SYM_KEY *rkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_NO_TOKEN_SELECTED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (symkey == NULL || rkey == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if (symkey->keyclass != KMF_SYMMETRIC)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_CLASS);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * If the key is already in "raw" format, copy the data
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * to the new record if possible.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (symkey->israw) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_KEY_DATA *rawkey = (KMF_RAW_KEY_DATA *)symkey->keyp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rawkey == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEYHANDLE);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rawkey->sensitive)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_SENSITIVE_KEY);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rawkey->not_extractable)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_UNEXTRACTABLE_KEY);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rawkey->rawdata.sym.keydata.val == NULL ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.sym.keydata.len == 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_GETKEYVALUE_FAILED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rkey->keydata.len = rawkey->rawdata.sym.keydata.len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((rkey->keydata.val = malloc(rkey->keydata.len)) == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(rkey->keydata.val,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey->rawdata.sym.keydata.val, rkey->keydata.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = get_raw_sym(kmfh, (CK_OBJECT_HANDLE)symkey->keyp, rkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_SetTokenPin(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattr, KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_RV rv = CKR_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_SESSION_HANDLE session = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys KMF_CREDENTIAL *oldcred;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys KMF_CREDENTIAL *newcred;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_SLOT_ID slotid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_USER_TYPE user = CKU_USER;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (handle == NULL || attrlist == NULL || numattr == 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys oldcred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (oldcred == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys newcred = kmf_get_attr_ptr(KMF_NEWPIN_ATTR, attrlist, numattr);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (newcred == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_SLOT_ID_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&slotid, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *tokenlabel = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * If a slot wasn't given, the user must pass
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * a token label so we can find the slot here.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys tokenlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist,
d00756ccb34596a328f8a15d1965da5412d366d0wyllys numattr);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (tokenlabel == NULL)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_pk11_token_lookup(handle, tokenlabel, &slotid);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = kmf_get_attr(KMF_PK11_USER_TYPE_ATTR, attrlist, numattr,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void *)&user, NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (rv != CKR_OK)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll user = CKU_USER;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = C_OpenSession(slotid, CKF_SERIAL_SESSION | CKF_RW_SESSION,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys NULL, NULL, &session);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_UNINITIALIZED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = C_Login(session, user, (CK_BYTE *)oldcred->cred,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll oldcred->credlen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (rv != CKR_OK) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll SET_ERROR(kmfh, rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (rv == CKR_PIN_INCORRECT ||
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv == CKR_PIN_INVALID ||
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv == CKR_PIN_EXPIRED ||
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv == CKR_PIN_LOCKED)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = KMF_ERR_AUTH_FAILED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll else
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = KMF_ERR_INTERNAL;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll goto end;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = C_SetPIN(session,
d00756ccb34596a328f8a15d1965da5412d366d0wyllys (CK_BYTE *)oldcred->cred, oldcred->credlen,
d00756ccb34596a328f8a15d1965da5412d366d0wyllys (CK_BYTE *)newcred->cred, newcred->credlen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == CKR_PIN_INCORRECT ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv == CKR_PIN_INVALID ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv == CKR_PIN_EXPIRED ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv == CKR_PIN_LOCKED)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_AUTH_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysend:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (session != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) C_CloseSession(session);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
02744e811b15322c5f109827a116c33bfe3438b5wyllys
c197cb9db36685d2808c057fdbe5700734483ab2hyleestatic KMF_RETURN
c197cb9db36685d2808c057fdbe5700734483ab2hyleecreate_generic_secret_key(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattr, KMF_ATTRIBUTE *attrlist, CK_OBJECT_HANDLE *key)
c197cb9db36685d2808c057fdbe5700734483ab2hylee{
c197cb9db36685d2808c057fdbe5700734483ab2hylee KMF_RETURN rv = KMF_OK;
c197cb9db36685d2808c057fdbe5700734483ab2hylee KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_RV ckrv;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_SESSION_HANDLE hSession = kmfh->pk11handle;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_OBJECT_CLASS class = CKO_SECRET_KEY;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_ULONG secKeyType = CKK_GENERIC_SECRET;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_ULONG secKeyLen;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_BBOOL true = TRUE;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_BBOOL false = FALSE;
c197cb9db36685d2808c057fdbe5700734483ab2hylee CK_ATTRIBUTE templ[15];
c197cb9db36685d2808c057fdbe5700734483ab2hylee int i;
c197cb9db36685d2808c057fdbe5700734483ab2hylee int random_fd = -1;
c197cb9db36685d2808c057fdbe5700734483ab2hylee int nread;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int freebuf = 0;
c197cb9db36685d2808c057fdbe5700734483ab2hylee char *buf = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t keylen = 0, attrkeylen = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *keylabel = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CREDENTIAL *cred;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t is_sensitive, is_not_extractable;
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylabel == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (cred == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_SENSITIVE_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&is_sensitive, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_NON_EXTRACTABLE_BOOL_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&is_not_extractable, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_KEY_DATA_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys NULL, &attrkeylen);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_OK && attrkeylen > 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys buf = kmf_get_attr_ptr(KMF_KEY_DATA_ATTR, attrlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys secKeyLen = attrkeylen;
c197cb9db36685d2808c057fdbe5700734483ab2hylee } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys buf = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (buf == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * If the key data was not given, key length must
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * be provided.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &keylen, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Check the key size.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((keylen % 8) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_KEY_SIZE);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys secKeyLen = keylen/8; /* in bytes */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Generate a random number with the key size first.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys buf = malloc(secKeyLen);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (buf == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_MEMORY);
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys freebuf = 1;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys while ((random_fd = open(DEV_RANDOM, O_RDONLY)) < 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (errno != EINTR)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys break;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (random_fd < 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_KEYGEN_FAILED;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto out;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nread = read(random_fd, buf, secKeyLen);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nread <= 0 || nread != secKeyLen) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_KEYGEN_FAILED;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto out;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
c197cb9db36685d2808c057fdbe5700734483ab2hylee
c197cb9db36685d2808c057fdbe5700734483ab2hylee /*
c197cb9db36685d2808c057fdbe5700734483ab2hylee * Authenticate into the token and call C_CreateObject to generate
c197cb9db36685d2808c057fdbe5700734483ab2hylee * a generic secret token key.
c197cb9db36685d2808c057fdbe5700734483ab2hylee */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = pk11_authenticate(handle, cred);
c197cb9db36685d2808c057fdbe5700734483ab2hylee if (rv != KMF_OK) {
c197cb9db36685d2808c057fdbe5700734483ab2hylee goto out;
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
c197cb9db36685d2808c057fdbe5700734483ab2hylee
c197cb9db36685d2808c057fdbe5700734483ab2hylee i = 0;
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_CLASS, &class, sizeof (class));
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_KEY_TYPE, &secKeyType, sizeof (secKeyType));
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_VALUE, buf, secKeyLen);
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylabel != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(templ, i, CKA_LABEL, keylabel, strlen(keylabel));
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_sensitive == B_TRUE) {
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_SENSITIVE, &true, sizeof (true));
c197cb9db36685d2808c057fdbe5700734483ab2hylee } else {
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_SENSITIVE, &false, sizeof (false));
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_not_extractable == B_TRUE) {
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_EXTRACTABLE, &false, sizeof (false));
c197cb9db36685d2808c057fdbe5700734483ab2hylee } else {
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_EXTRACTABLE, &true, sizeof (true));
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_TOKEN, &true, sizeof (true));
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_PRIVATE, &true, sizeof (true));
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee SETATTR(templ, i, CKA_SIGN, &true, sizeof (true));
c197cb9db36685d2808c057fdbe5700734483ab2hylee i++;
c197cb9db36685d2808c057fdbe5700734483ab2hylee
c197cb9db36685d2808c057fdbe5700734483ab2hylee ckrv = C_CreateObject(hSession, templ, i, key);
c197cb9db36685d2808c057fdbe5700734483ab2hylee if (ckrv != CKR_OK) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (ckrv == CKR_USER_NOT_LOGGED_IN ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_INCORRECT ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_INVALID ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_EXPIRED ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_PIN_LOCKED ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys ckrv == CKR_SESSION_READ_ONLY)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = KMF_ERR_AUTH_FAILED;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys else
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys rv = KMF_ERR_KEYGEN_FAILED;
c197cb9db36685d2808c057fdbe5700734483ab2hylee SET_ERROR(kmfh, ckrv);
c197cb9db36685d2808c057fdbe5700734483ab2hylee }
c197cb9db36685d2808c057fdbe5700734483ab2hylee
c197cb9db36685d2808c057fdbe5700734483ab2hyleeout:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (buf != NULL && freebuf)
c197cb9db36685d2808c057fdbe5700734483ab2hylee free(buf);
c197cb9db36685d2808c057fdbe5700734483ab2hylee
c197cb9db36685d2808c057fdbe5700734483ab2hylee if (random_fd != -1)
c197cb9db36685d2808c057fdbe5700734483ab2hylee (void) close(random_fd);
c197cb9db36685d2808c057fdbe5700734483ab2hylee
c197cb9db36685d2808c057fdbe5700734483ab2hylee return (rv);
c197cb9db36685d2808c057fdbe5700734483ab2hylee}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_StoreKey(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attlist)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_CREDENTIAL cred = { NULL, 0 };
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE *key;
646cf3c6c5f9a3403fe9d15809bbbb2441deb1e2wyllys KMF_RAW_KEY_DATA *rawkey = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_BBOOL btrue = TRUE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_ATTRIBUTE tokenattr[1];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_OBJECT_HANDLE newobj;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CK_RV ckrv;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_UNINITIALIZED);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_NO_TOKEN_SELECTED);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attlist, numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void *)&cred, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = pk11_authenticate(handle, &cred);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (key == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (key == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rawkey = kmf_get_attr_ptr(KMF_RAW_KEY_ATTR, attlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (key == NULL && rawkey == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_ATTR_NOT_FOUND);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rawkey != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = store_raw_key(handle, attlist, numattr, rawkey);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (key && key->kstype == KMF_KEYSTORE_PK11TOKEN) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SETATTR(tokenattr, 0, CKA_TOKEN, &btrue, sizeof (btrue));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Copy the key object to the token */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ckrv = C_CopyObject(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)key->keyp, tokenattr, 1, &newobj);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ckrv != CKR_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SET_ERROR(kmfh, ckrv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_INTERNAL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Replace the object handle with the new token-based one */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ckrv = C_DestroyObject(kmfh->pk11handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (CK_OBJECT_HANDLE)key->keyp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ckrv != CKR_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys SET_ERROR(kmfh, ckrv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_INTERNAL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys key->keyp = (void *)newobj;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_BAD_PARAMETER;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMFPK11_ExportPK12(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CREDENTIAL *cred = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CREDENTIAL *p12cred = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *filename = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_X509_DER_CERT *certlist = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE *keylist = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t numcerts;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t numkeys;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *certlabel = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *issuer = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *subject = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_BIGINT *serial = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE fc_attrlist[16];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfh->pk11handle == CK_INVALID_HANDLE)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_NO_TOKEN_SELECTED);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* First get the required attributes */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (cred == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys p12cred = kmf_get_attr_ptr(KMF_PK12CRED_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (p12cred == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys filename = kmf_get_attr_ptr(KMF_OUTPUT_FILENAME_ATTR, attrlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (filename == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Find all the certificates that match the searching criteria */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fc_attrlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fc_attrlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (certlabel != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fc_attrlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CERT_LABEL_ATTR, certlabel, strlen(certlabel));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (issuer != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fc_attrlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ISSUER_NAME_ATTR, issuer, strlen(issuer));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (subject != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fc_attrlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_SUBJECT_NAME_ATTR, subject, strlen(subject));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (serial != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fc_attrlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_BIGINT_ATTR, serial, sizeof (KMF_BIGINT));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMFPK11_FindCert(handle, i, fc_attrlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_OK && numcerts > 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_X509_DER_CERT));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (certlist == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_MEMORY);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memset(certlist, 0, numcerts *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_X509_DER_CERT));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fc_attrlist, i, KMF_X509_DER_CERT_ATTR,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys certlist, sizeof (KMF_X509_DER_CERT));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_find_cert(handle, i, fc_attrlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys free(certlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* For each certificate, find the matching private key */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numkeys = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < numcerts; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE fk_attrlist[16];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int j = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE newkey;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ENCODE_FORMAT format = KMF_FORMAT_RAWKEY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fk_attrlist, j,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys j++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fk_attrlist, j,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ENCODE_FORMAT_ATTR, &format, sizeof (format));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys j++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fk_attrlist, j,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CREDENTIAL_ATTR, cred, sizeof (KMF_CREDENTIAL));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys j++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fk_attrlist, j,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_CERT_DATA_ATTR, &certlist[i].certificate,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_DATA));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys j++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(fk_attrlist, j,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE_ATTR, &newkey, sizeof (KMF_KEY_HANDLE));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys j++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMFPK11_FindPrikeyByCert(handle, j, fk_attrlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv == KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numkeys++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keylist = realloc(keylist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys numkeys * sizeof (KMF_KEY_HANDLE));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylist == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_ERR_MEMORY;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto out;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys keylist[numkeys - 1] = newkey;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else if (rv == KMF_ERR_KEY_NOT_FOUND) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* it is OK if a key is not found */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys goto out;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_build_pk12(handle, numcerts, certlist, numkeys, keylist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys p12cred, filename);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysout:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (certlist != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < numcerts; i++)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_kmf_cert(handle, &certlist[i]);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys free(certlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (keylist != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < numkeys; i++)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_kmf_key(handle, &keylist[i]);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys free(keylist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}