nss_spi.c revision 5363b1129db4ee42d2c9736898eab4670580bec7
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
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * NSS keystore wrapper
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
5363b1129db4ee42d2c9736898eab4670580bec7hylee * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Use is subject to license terms.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#pragma ident "%Z%%M% %I% %E% SMI"
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <sys/types.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <sys/stat.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <errno.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <fcntl.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <synch.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <kmfapiP.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <ber_der.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <oidsalg.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* NSS related headers */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/nss.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/cert.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/certdb.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/secoid.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/secder.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/secerr.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/cryptohi.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/keyhi.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/keythi.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/pk11func.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/pk11pqg.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/pkcs12.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/p12plcy.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <mps/prerror.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#define NSS_OK 0
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysmutex_t init_lock = DEFAULTMUTEX;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic int nss_initialized = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ConfigureKeystore(KMF_HANDLE_T, KMF_CONFIG_PARAMS *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindCert(KMF_HANDLE_T,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_FINDCERT_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_DER_CERT *kmf_cert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t *num_certs);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FreeKMFCert(KMF_HANDLE_T, KMF_X509_DER_CERT *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_StoreCert(KMF_HANDLE_T, KMF_STORECERT_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA * pcert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ImportCert(KMF_HANDLE_T, KMF_IMPORTCERT_PARAMS *params);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DeleteCert(KMF_HANDLE_T, KMF_DELETECERT_PARAMS *params);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_CreateKeypair(KMF_HANDLE_T, KMF_CREATEKEYPAIR_PARAMS *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *, KMF_KEY_HANDLE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_EncodePubKeyData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_DATA *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_SignData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *, KMF_DATA *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ImportCRL(KMF_HANDLE_T, KMF_IMPORTCRL_PARAMS *params);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DeleteCRL(KMF_HANDLE_T, KMF_DELETECRL_PARAMS *params);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindCRL(KMF_HANDLE_T, KMF_FINDCRL_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char **CRLNameList, int *CRLCount);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindKey(KMF_HANDLE_T, KMF_FINDKEY_PARAMS *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *, uint32_t *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindCertInCRL(KMF_HANDLE_T, KMF_FINDCERTINCRL_PARAMS *params);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_GetErrorString(KMF_HANDLE_T, char **);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DeleteKey(KMF_HANDLE_T, KMF_DELETEKEY_PARAMS *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *, boolean_t);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_GetPrikeyByCert(KMF_HANDLE_T, KMF_CRYPTOWITHCERT_PARAMS *, KMF_DATA *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *, KMF_KEY_ALG);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DecryptData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *, KMF_DATA *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ExportP12(KMF_HANDLE_T,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_EXPORTP12_PARAMS *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int, KMF_X509_DER_CERT *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int, KMF_KEY_HANDLE *,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_StorePrivateKey(KMF_HANDLE_T, KMF_STOREKEY_PARAMS *, KMF_RAW_KEY_DATA *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_CreateSymKey(KMF_HANDLE_T, KMF_CREATESYMKEY_PARAMS *, KMF_KEY_HANDLE *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_GetSymKeyValue(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_SYM_KEY *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_SetTokenPin(KMF_HANDLE_T, KMF_SETPIN_PARAMS *, KMF_CREDENTIAL *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_PLUGIN_FUNCLIST nss_plugin_table =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys 1, /* Version */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_ConfigureKeystore,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_FindCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_FreeKMFCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_StoreCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_ImportCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_ImportCRL,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_DeleteCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_DeleteCRL,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_CreateKeypair,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_FindKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_EncodePubKeyData,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_SignData,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_DeleteKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL /* ListCRL */,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_FindCRL,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_FindCertInCRL,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_GetErrorString,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_GetPrikeyByCert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_DecryptData,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_ExportP12,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_StorePrivateKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_CreateSymKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_GetSymKeyValue,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_SetTokenPin,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL /* Finalize */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* additions for importing and exporting PKCS 12 files */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllystypedef struct p12uContextStr {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *filename; /* name of file */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRFileDesc *file; /* pointer to file */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRBool error; /* error occurred? */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int errorValue; /* which error occurred? */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys} p12uContext;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#define SET_ERROR(h, c) h->lasterr.kstype = KMF_KEYSTORE_NSS; \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys h->lasterr.errcode = c;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_PLUGIN_FUNCLIST *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_Plugin_Initialize()
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12EnableCipher(PKCS12_RC4_40, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12EnableCipher(PKCS12_RC4_128, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12EnableCipher(PKCS12_RC2_CBC_40, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12EnableCipher(PKCS12_RC2_CBC_128, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12EnableCipher(PKCS12_DES_56, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12EnableCipher(PKCS12_DES_EDE3_168, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12SetPreferredCipher(PKCS12_DES_EDE3_168, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (&nss_plugin_table);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic char *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*ARGSUSED*/
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysnss_getpassword(PK11SlotInfo *slot, PRBool retry, void *arg)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (retry)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (arg != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return ((char *)strdup(arg));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysnss_authenticate(KMF_HANDLE_T handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot, KMF_CREDENTIAL *cred)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus nssrv = SECSuccess;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* If a password was given, try to login to the slot */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (cred == NULL || cred->cred == NULL || cred->credlen == 0 ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_slot == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (PK11_IsLoggedIn(nss_slot, NULL)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_SetPasswordFunc(nss_getpassword);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = PK11_Authenticate(nss_slot, PR_TRUE,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void *)cred->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, nssrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_AUTH_FAILED);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic SECStatus
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysInit_NSS_DBs(const char *configdir,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys const char *certPrefix,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys const char *keyPrefix,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys const char *secmodName)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus rv = NSS_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) mutex_lock(&init_lock);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* If another thread already did it, return OK. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_initialized) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) mutex_unlock(&init_lock);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (SECSuccess);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = NSS_Initialize((configdir && strlen(configdir)) ?
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys configdir : "./", certPrefix,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyPrefix, secmodName ? secmodName : "secmod.db",
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSS_INIT_COOPERATE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_initialized++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysend:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) mutex_unlock(&init_lock);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * When it is called the first time, it will intialize NSS. Once the NSS
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * is initialized, this function returns KMF_KEYSTORE_ALREADY_INITIALIZED
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * if it is called again.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) mutex_lock(&init_lock);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_initialized == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus err;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) mutex_unlock(&init_lock);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys err = Init_NSS_DBs(params->nssconfig.configdir,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->nssconfig.certPrefix,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->nssconfig.keyPrefix,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->nssconfig.secModName);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (err != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, err);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_KEYSTORE_ALREADY_INITIALIZED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) mutex_unlock(&init_lock);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This function sets up the slot to be used for other operations.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This function is basically called by every NSS SPI function.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * For those functions that can only be performed in the internal slot, the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * boolean "internal_slot_only" argument needs to be TRUE.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * A slot pointer will be returned when this function is executed successfully.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysDo_NSS_Init(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys void *handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_NSS_PARAMS nss_opts,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t internal_slot_only,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo **nss_slot)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!nss_initialized)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_PLUGIN_INIT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * NSS Is already initialized, but we need to find
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * the right slot.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_opts.slotlabel == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys strcmp(nss_opts.slotlabel, "internal") == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *nss_slot = PK11_GetInternalKeySlot();
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (internal_slot_only == TRUE) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_SLOTNAME);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *nss_slot = PK11_FindSlotByName(nss_opts.slotlabel);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (*nss_slot == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_SLOTNAME);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If the token was not yet initialized, return an error.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (PK11_NeedUserInit(*nss_slot)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED_TOKEN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysnss2kmf_cert(CERTCertificate *nss_cert, KMF_X509_DER_CERT *kmf_cert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->kmf_private.keystore_type = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->kmf_private.flags = KMF_FLAG_CERT_VALID;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->certificate.Length = nss_cert->derCert.len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((kmf_cert->certificate.Data = malloc(nss_cert->derCert.len)) ==
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->certificate.Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(kmf_cert->certificate.Data, nss_cert->derCert.data,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_cert->derCert.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_cert->nickname != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmf_cert->kmf_private.label =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (char *)strdup(nss_cert->nickname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysnss_getcert_by_label(KMF_HANDLE *kmfh,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *name, KMF_X509_DER_CERT *kmf_cert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t *num_certs, KMF_CERT_VALIDITY find_criteria)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *nss_cert;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECCertTimeValidity validity;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_cert = PK11_FindCertFromNickname(name, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_cert == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_CERT_NOT_FOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (find_criteria) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_ALL_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_NONEXPIRED_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys validity = CERT_CheckCertValidTimes(nss_cert, PR_Now(),
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (validity != secCertTimeValid) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* this is an invalid cert, reject it */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(nss_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_EXPIRED_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys validity = CERT_CheckCertValidTimes(nss_cert, PR_Now(),
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (validity == secCertTimeValid) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* this is a valid cert, reject it in this case. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(nss_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys default:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmf_cert != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss2kmf_cert(nss_cert, kmf_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* We copied the data we need, so cleanup the internal record */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(nss_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysnss_find_matching_certs(PK11SlotInfo *slot,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *issuer, char *subject, KMF_BIGINT *serial,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertList **certlist, KMF_CERT_VALIDITY find_criteria)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus ret;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertList *list;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertListNode *node;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_NAME issuerDN, subjectDN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t findIssuer = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t findSubject = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t findSerial = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (issuer != NULL && strlen(issuer)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_DNParser(issuer, &issuerDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys findIssuer = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (subject != NULL && strlen(subject)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_DNParser(subject, &subjectDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys findSubject = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (serial != 0 && serial->val != NULL && serial->len > 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys findSerial = TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys list = PK11_ListCertsInSlot(slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (list) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = CERT_LIST_HEAD(list);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (!CERT_LIST_END(node, list)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_NAME cmpDN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA der;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t match;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertListNode *freenode;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (findIssuer) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys der.Data = node->cert->derIssuer.data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys der.Length = node->cert->derIssuer.len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerDecodeName(&der, &cmpDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys match = !KMF_CompareRDNs(&issuerDN,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &cmpDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_FreeDN(&cmpDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!match)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto delete_and_cont;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto delete_and_cont;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (findSubject) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys der.Data = node->cert->derSubject.data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys der.Length = node->cert->derSubject.len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerDecodeName(&der, &cmpDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys match = !KMF_CompareRDNs(&subjectDN,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &cmpDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_FreeDN(&cmpDN);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!match)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto delete_and_cont;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto delete_and_cont;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (findSerial) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem *sernum;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sernum = &node->cert->serialNumber;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (serial->len != sernum->len)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto delete_and_cont;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (memcmp(sernum->data, serial->val,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys serial->len))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto delete_and_cont;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* select the certs using find criteria */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (find_criteria) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_ALL_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_NONEXPIRED_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = CERT_CertTimesValid(node->cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret == SECFailure) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* this is an invalid cert */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto skip;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_EXPIRED_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = CERT_CertTimesValid(node->cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != SECFailure) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* this is a valid cert */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto skip;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysskip:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = CERT_LIST_NEXT(node);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys continue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysdelete_and_cont:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys freenode = node;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = CERT_LIST_NEXT(node);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_RemoveCertListNode(freenode);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && certlist != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *certlist = list;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertList(list);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysconvertCertList(void *kmfhandle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertList *nsscerts, KMF_X509_DER_CERT *kmfcerts,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t *numcerts)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertListNode *node;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numcerts = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (node = CERT_LIST_HEAD(nsscerts);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys !CERT_LIST_END(node, nsscerts) && rv == KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = CERT_LIST_NEXT(node), (*numcerts)++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfcerts != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss2kmf_cert(node->cert, &kmfcerts[*numcerts]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If we failed, delete any certs allocated so far.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < *numcerts; i++)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_FreeKMFCert(kmfhandle, &kmfcerts[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_DER_CERT *kmfcerts,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t *num_certs)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertList *certlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *num_certs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->certLabel) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_getcert_by_label(kmfh,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->certLabel,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfcerts, num_certs, params->find_cert_validity);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_find_matching_certs(nss_slot,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->issuer, params->subject, params->serial,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &certlist, params->find_cert_validity);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && certlist != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = convertCertList(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certlist, kmfcerts, num_certs);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertList(certlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && *num_certs == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CERT_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*ARGSUSED*/
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FreeKMFCert(KMF_HANDLE_T handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_DER_CERT *kmf_cert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmf_cert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (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
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_StoreCert(KMF_HANDLE_T handle, KMF_STORECERT_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *pcert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus nss_rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *nss_cert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertTrust *nss_trust = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pcert == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* NSS only support DER format */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_cert = CERT_DecodeCertFromPackage((char *)pcert->Data,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pcert->Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_cert == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_CERT_FORMAT;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_rv = PK11_ImportCert(nss_slot, nss_cert, CK_INVALID_HANDLE,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->certLabel, 0);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_rv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, nss_rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_CERT_FORMAT;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->ks_opt_u.nss_opts.trustflag != NULL &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys strlen(params->ks_opt_u.nss_opts.trustflag)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_trust = (CERTCertTrust *) malloc(sizeof (CERTCertTrust));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_trust == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_rv = CERT_DecodeTrustString(nss_trust,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts.trustflag);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_rv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, nss_rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_PARAMETER;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_rv = CERT_ChangeCertTrust(certHandle, nss_cert, nss_trust);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_rv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, nss_rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_PARAMETER;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_trust != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(nss_trust);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_cert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(nss_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ImportCert(KMF_HANDLE_T handle, KMF_IMPORTCERT_PARAMS *params)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_STORECERT_PARAMS scparams;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA cert = {NULL, 0};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA cert_der = {NULL, 0};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *cptr = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_ENCODE_FORMAT format;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL || params->certfile == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Check if the input cert file is a valid certificate and
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * auto-detect the file format of it.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_IsCertFile(handle, params->certfile, &format);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ReadInputFile(handle, params->certfile, &cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If the imported cert is in PEM format, convert it to
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * DER format in order to store it in NSS token.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (format == KMF_FORMAT_PEM) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int derlen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_Pem2Der(cert.Data, cert.Length,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &cert_der.Data, &derlen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cert_der.Length = (size_t)derlen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cptr = &cert_der;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cptr = &cert;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&scparams, 0, sizeof (scparams));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys scparams.kstype = params->kstype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys scparams.certLabel = params->certLabel;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys scparams.nssparms = params->nssparms;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = NSS_StoreCert(handle, &scparams, cptr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (format == KMF_FORMAT_PEM) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_FreeData(&cert_der);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_FreeData(&cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *params)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int nssrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *cert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* check params */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->certLabel) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cert = PK11_FindCertFromNickname(params->certLabel, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (cert == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_CERT_NOT_FOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (params->find_cert_validity) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_ALL_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_NONEXPIRED_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = CERT_CertTimesValid(cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv == SECFailure) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* this is an invalid cert - skip it */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_EXPIRED_CERTS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = CERT_CertTimesValid(cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv != SECFailure) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* this is a valid cert - skip it */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* delete it from database */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = SEC_DeletePermCertificate(cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, nssrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertListNode *node;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertList *certlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_find_matching_certs(nss_slot,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->issuer, params->subject, params->serial,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &certlist, params->find_cert_validity);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (node = CERT_LIST_HEAD(certlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys !CERT_LIST_END(node, certlist) && rv == KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = CERT_LIST_NEXT(node)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = SEC_DeletePermCertificate(node->cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, nssrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && certlist != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertList(certlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (rv == KMF_OK && certlist == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CERT_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (cert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysInitRandom(char *filename)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char buf[2048];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int fd;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRInt32 count;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fd = open(filename, O_RDONLY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!fd)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys count = read(fd, buf, sizeof (buf));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (count > 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_RandomUpdate(buf, count);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) close(fd);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_CreateKeypair(KMF_HANDLE_T handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_CREATEKEYPAIR_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *privkey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *pubkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11RSAGenParams rsaparams;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys void *nssparams;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_MECHANISM_TYPE mechanism;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ulong_t publicExponent = 0x010001;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPrivateKey *NSSprivkey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPublicKey *NSSpubkey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PQGParams *pqgParams = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_authenticate(handle, nss_slot, &params->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get some random bits */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys InitRandom("/dev/urandom");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->keytype == KMF_RSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rsaparams.keySizeInBits = params->keylength;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * NSS only allows for a 4 byte exponent.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Ignore the exponent parameter if it is too big.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->rsa_exponent.len > 0 &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->rsa_exponent.len <= sizeof (publicExponent) &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->rsa_exponent.val != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(&publicExponent,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->rsa_exponent.val,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->rsa_exponent.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rsaparams.pe = publicExponent;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssparams = &rsaparams;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (params->keytype == KMF_DSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PQGVerify *pqgVerify = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int ks;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus nssrv, passed;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys mechanism = CKM_DSA_KEY_PAIR_GEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ks = PQG_PBITS_TO_INDEX(params->keylength);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = PK11_PQG_ParamGen(ks, &pqgParams, &pqgVerify);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_PQG_DestroyVerify(pqgVerify);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEYGEN_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = PK11_PQG_VerifyParams(pqgParams, pqgVerify, &passed);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv != SECSuccess || passed != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEYGEN_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_PQG_DestroyVerify(pqgVerify);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssparams = pqgParams;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_BAD_PARAMETER;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSSprivkey = PK11_GenerateKeyPair(nss_slot,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys mechanism, nssparams, &NSSpubkey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_TRUE, /* isPermanent */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_TRUE, /* isSensitive */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void *)params->cred.cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (NSSprivkey == NULL || NSSpubkey == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEYGEN_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->keylabel != NULL &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys strlen(params->keylabel)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) PK11_SetPrivateKeyNickname(NSSprivkey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->keylabel);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) PK11_SetPublicKeyNickname(NSSpubkey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->keylabel);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now, convert it to a KMF_KEY object for the framework */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (privkey != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys privkey->kstype = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys privkey->keyalg = params->keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys privkey->keyclass = KMF_ASYM_PRI;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys privkey->keylabel =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_GetPrivateKeyNickname(NSSprivkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys privkey->keyp = (void *)NSSprivkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pubkey != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubkey->kstype = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubkey->keyalg = params->keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubkey->keyp = (void *)NSSpubkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubkey->keyclass = KMF_ASYM_PUB;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubkey->keylabel =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_GetPublicKeyNickname(NSSpubkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (NSSpubkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_DeleteTokenPublicKey(NSSpubkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (NSSprivkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_DeleteTokenPrivateKey(NSSprivkey, PR_TRUE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys privkey->keyp = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubkey->keyp = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pqgParams != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_PQG_DestroyParams(pqgParams);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_OID *AlgOID, KMF_DATA *tobesigned,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *output)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_ALGORITHM_INDEX AlgId;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECOidTag signAlgTag;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPrivateKey *NSSprivkey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem signed_data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys signed_data.data = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL || AlgOID == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tobesigned == NULL || output == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tobesigned->Data == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys output->Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Map the OID to a NSS algorithm */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys AlgId = X509_AlgorithmOidToAlgId(AlgOID);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (AlgId == KMF_ALGID_NONE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSSprivkey = (SECKEYPrivateKey *)key->keyp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (AlgId == KMF_ALGID_MD5WithRSA)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys signAlgTag = SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if (AlgId == KMF_ALGID_MD2WithRSA)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys signAlgTag = SEC_OID_PKCS1_MD2_WITH_RSA_ENCRYPTION;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if (AlgId == KMF_ALGID_SHA1WithRSA)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys signAlgTag = SEC_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if (AlgId == KMF_ALGID_SHA1WithDSA)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys signAlgTag = SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = SEC_SignData(&signed_data, tobesigned->Data,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tobesigned->Length, NSSprivkey, signAlgTag);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (signed_data.len <= output->Length) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(output->Data, signed_data.data, signed_data.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys output->Length = signed_data.len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys output->Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_PARAMETER;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(signed_data.data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *keyp,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *encoded)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem *rvitem;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTSubjectPublicKeyInfo *spki = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keyp == NULL || encoded == NULL || keyp->keyp == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys spki = SECKEY_CreateSubjectPublicKeyInfo(keyp->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (spki == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rvitem = SEC_ASN1EncodeItem(NULL, NULL, spki,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_SubjectPublicKeyInfoTemplate);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rvitem != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encoded->Data = malloc(rvitem->len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (encoded->Data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(encoded->Data, rvitem->data, rvitem->len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encoded->Length = rvitem->len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECITEM_FreeItem(rvitem, TRUE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encoded->Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encoded->Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEY_DestroySubjectPublicKeyInfo(spki);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DeleteKey(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *key, boolean_t delete_token)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * "delete_token" means to clear it from the token storage as well
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * as from memory.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL || key->keyp == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (delete_token) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus nssrv = SECSuccess;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key->keyclass != KMF_ASYM_PUB &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyclass != KMF_ASYM_PRI &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyclass != KMF_SYMMETRIC)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_CLASS);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_authenticate(handle, nss_slot, &params->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key->keyclass == KMF_ASYM_PUB) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = PK11_DeleteTokenPublicKey(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (SECKEYPublicKey *)key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (key->keyclass == KMF_ASYM_PRI) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = PK11_DeleteTokenPrivateKey(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (SECKEYPrivateKey *)key->keyp, PR_TRUE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (key->keyclass == KMF_SYMMETRIC) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = PK11_DeleteTokenSymKey(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (PK11SymKey *) key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv == SECSuccess)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSymKey(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (PK11SymKey *) key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(handle, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key->keyclass == KMF_ASYM_PUB) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEY_DestroyPublicKey((SECKEYPublicKey *)key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (key->keyclass == KMF_ASYM_PRI) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEY_DestroyPrivateKey((SECKEYPrivateKey *)key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (key->keyclass == KMF_SYMMETRIC) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSymKey((PK11SymKey *) key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_CLASS);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyp = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ImportCRL(KMF_HANDLE_T handle, KMF_IMPORTCRL_PARAMS *params)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTSignedCrl *nss_crl = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_ENCODE_FORMAT format;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int importOptions;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem crlDER;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA crl1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA crl2;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL || params->ks_opt_u.nss_opts.crlfile == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Check if the input CRL file is a valid CRL file and auto-detect
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * the encoded format of the file.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_IsCRLFile(handle, params->ks_opt_u.nss_opts.crlfile,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &format);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, TRUE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* set importOptions */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->ks_opt_u.nss_opts.crl_check == B_FALSE) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys importOptions = CRL_IMPORT_DEFAULT_OPTIONS |
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CRL_IMPORT_BYPASS_CHECKS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys importOptions = CRL_IMPORT_DEFAULT_OPTIONS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Read in the CRL file */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl1.Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl2.Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ReadInputFile(handle, params->ks_opt_u.nss_opts.crlfile,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &crl1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* If the input CRL is in PEM format, convert it to DER first. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (format == KMF_FORMAT_PEM) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_Pem2Der(crl1.Data, crl1.Length,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &crl2.Data, &len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl2.Length = (size_t)len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crlDER.data = format == KMF_FORMAT_ASN1 ? crl1.Data : crl2.Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crlDER.len = format == KMF_FORMAT_ASN1 ? crl1.Length : crl2.Length;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_crl = PK11_ImportCRL(nss_slot, &crlDER, NULL, SEC_CRL_TYPE,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL, importOptions, NULL, CRL_DECODE_DEFAULT_OPTIONS);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_crl == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_CRLFILE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl1.Data != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(crl1.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl2.Data != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(crl2.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_crl != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_DestroyCrl(nss_crl);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DeleteCRL(KMF_HANDLE_T handle, KMF_DELETECRL_PARAMS *params)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTSignedCrl *crl = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *cert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCrlHeadNode *crlList = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCrlNode *crlNode = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRArenaPool *arena = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTName *name = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* check params */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (params->ks_opt_u.nss_opts.crl_issuerName == NULL &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts.crl_subjName == NULL) ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (params->ks_opt_u.nss_opts.crl_issuerName != NULL &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts.crl_subjName != NULL)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, TRUE,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Find the CRL based on the deletion criteria. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->ks_opt_u.nss_opts.crl_issuerName != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If the deletion is based on the issuer's certificate
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * nickname, we will get the issuer's cert first, then
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * get the CRL from the cert.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cert = CERT_FindCertByNicknameOrEmailAddr(certHandle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts.crl_issuerName);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!cert) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CERT_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl = SEC_FindCrlByName(certHandle, &cert->derSubject,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_CRL_TYPE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If the deletion is based on the CRL's subject name, we will
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * get all the CRLs from the internal database and search
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * for the CRL with the same subject name.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t found = B_FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int nssrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = SEC_LookupCrls(certHandle, &crlList, SEC_CRL_TYPE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, nssrv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crlList == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Allocate space for name */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (arena == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name = PORT_ArenaZAlloc(arena, sizeof (*name));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (name == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name->arena = arena;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crlNode = crlList->first;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (crlNode && !found) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *asciiname = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem* issuer;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name = &crlNode->crl->crl.name;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!name) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys asciiname = CERT_NameToAscii(name);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (asciiname == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (strcmp(params->ks_opt_u.nss_opts.crl_subjName,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys asciiname) == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys found = B_TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys issuer = &crlNode->crl->crl.derName;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl = SEC_FindCrlByName(certHandle, issuer,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_CRL_TYPE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* We found a cert but no CRL */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PORT_Free(asciiname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crlNode = crlNode->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) SEC_DeletePermCRL(crl);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crlList != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PORT_FreeArena(crlList->arena, PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (arena != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PORT_FreeArena(arena, PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (cert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_DestroyCrl(crl);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindCRL(KMF_HANDLE_T handle, KMF_FINDCRL_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char **CRLNameList, int *CRLCount)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCrlHeadNode *crlList = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCrlNode *crlNode = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRArenaPool *arena = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTName *name = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus nssrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *asciiname = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int crl_num;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (CRLCount == NULL || params == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *CRLCount = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, TRUE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Look up Crls */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = SEC_LookupCrls(certHandle, &crlList, SEC_CRL_TYPE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Allocate space for name first */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (arena == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name = PORT_ArenaZAlloc(arena, sizeof (*name));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (name == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name->arena = arena;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Loop thru the crlList and create a crl list with CRL's subject name.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crlNode = crlList->first;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl_num = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (crlNode) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *subj_name;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the CRL subject name */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name = &crlNode->crl->crl.name;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!name) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (CRLNameList != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys asciiname = CERT_NameToAscii(name);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (asciiname == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subj_name = strdup(asciiname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PORT_Free(asciiname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (subj_name == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CRLNameList[crl_num] = subj_name;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl_num++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crlNode = crlNode->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* success */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *CRLCount = crl_num;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crlList != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PORT_FreeArena(crlList->arena, PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (arena != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PORT_FreeArena(arena, PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* If failed, free memory allocated for the returning rlist */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv && (CRLNameList != NULL)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < crl_num; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(CRLNameList[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindCertInCRL(KMF_HANDLE_T handle, KMF_FINDCERTINCRL_PARAMS *params)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *cert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTSignedCrl *crl = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCrlEntry *entry;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys boolean_t match = B_FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* check params */
5363b1129db4ee42d2c9736898eab4670580bec7hylee if (params == NULL ||
5363b1129db4ee42d2c9736898eab4670580bec7hylee (params->ks_opt_u.nss_opts.certLabel == NULL &&
5363b1129db4ee42d2c9736898eab4670580bec7hylee params->ks_opt_u.nss_opts.certificate == NULL)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, TRUE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
5363b1129db4ee42d2c9736898eab4670580bec7hylee /* Find the certificate first */
5363b1129db4ee42d2c9736898eab4670580bec7hylee if (params->ks_opt_u.nss_opts.certLabel != NULL) {
5363b1129db4ee42d2c9736898eab4670580bec7hylee cert = CERT_FindCertByNicknameOrEmailAddr(certHandle,
5363b1129db4ee42d2c9736898eab4670580bec7hylee params->ks_opt_u.nss_opts.certLabel);
5363b1129db4ee42d2c9736898eab4670580bec7hylee } else {
5363b1129db4ee42d2c9736898eab4670580bec7hylee SECItem derCert = { NULL, 0};
5363b1129db4ee42d2c9736898eab4670580bec7hylee
5363b1129db4ee42d2c9736898eab4670580bec7hylee derCert.data = params->ks_opt_u.nss_opts.certificate->Data;
5363b1129db4ee42d2c9736898eab4670580bec7hylee derCert.len = params->ks_opt_u.nss_opts.certificate->Length;
5363b1129db4ee42d2c9736898eab4670580bec7hylee cert = CERT_FindCertByDERCert(certHandle, &derCert);
5363b1129db4ee42d2c9736898eab4670580bec7hylee }
5363b1129db4ee42d2c9736898eab4670580bec7hylee
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!cert) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CERT_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Find the CRL with the same issuer as the given certificate. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys crl = SEC_FindCrlByName(certHandle, &cert->derIssuer, SEC_CRL_TYPE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Could not find the CRL issued by the same issuer. This
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * usually means that the CRL is not installed in the DB.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_CRL_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Check if the certificate's serialNumber is revoked in the CRL */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((entry = (crl->crl).entries[i++]) != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (SECITEM_CompareItem(&(cert->serialNumber),
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &(entry->serialNumber)) == SECEqual) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys match = B_TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!match) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_NOT_REVOKED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (cert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_DestroyCrl(crl);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_GetErrorString(KMF_HANDLE_T handle, char **msgstr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *str;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the error string in the default language */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys str = (char *)PR_ErrorToName((PRErrorCode)kmfh->lasterr.errcode);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (str != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *msgstr = (char *)strdup(str);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((*msgstr) == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *msgstr = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_GetPrikeyByCert(KMF_HANDLE_T handle, KMF_CRYPTOWITHCERT_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *SignerCertData, KMF_KEY_HANDLE *key,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_ALG keytype)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *nss_cert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPrivateKey* privkey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->nssparms, FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_authenticate(handle, nss_slot, &params->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_cert = CERT_DecodeCertFromPackage((char *)SignerCertData->Data,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SignerCertData->Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_cert == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_CERT_FORMAT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys privkey = PK11_FindPrivateKeyFromCert(nss_slot, nss_cert, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (privkey == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_KEY_NOT_FOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->kstype = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyclass = KMF_ASYM_PRI;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyalg = keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keyp = (void *)privkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys key->keylabel = PK11_GetPrivateKeyNickname(privkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(nss_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_DecryptData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_OID *AlgOID, KMF_DATA *ciphertext,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *output)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPrivateKey *NSSprivkey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned int in_len = 0, out_len = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned int total_decrypted = 0, modulus_len = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint8_t *in_data, *out_data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i, blocks;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL || AlgOID == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ciphertext == NULL || output == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ciphertext->Data == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys output->Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NSSprivkey = (SECKEYPrivateKey *)key->keyp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys modulus_len = PK11_GetPrivateModulusLen(NSSprivkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys blocks = ciphertext->Length/modulus_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys out_data = output->Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys in_data = ciphertext->Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys out_len = modulus_len - 11;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys in_len = modulus_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < blocks; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = PK11_PrivDecryptPKCS1(NSSprivkey, out_data,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &out_len, ciphertext->Length, in_data, in_len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys out_data += out_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys total_decrypted += out_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys in_data += in_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys output->Length = total_decrypted;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_KEY_ALG
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyspk11keytype2kmf(CK_KEY_TYPE type)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (type) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case CKK_RSA:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_RSA);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case CKK_DSA:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_RSA);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case CKK_AES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_AES);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case CKK_RC4:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_RC4);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case CKK_DES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_DES);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case CKK_DES3:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_DES3);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys default:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* not supported */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_KEYALG_NONE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *keys, uint32_t *numkeys)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPrivateKeyList *prilist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPrivateKeyListNode *prinode;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPublicKeyList *publist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPublicKeyListNode *pubnode;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SymKey *symlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int count;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle == NULL || parms == NULL || numkeys == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys parms->ks_opt_u.nss_opts, FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_authenticate(handle, nss_slot, &parms->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numkeys = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (parms->keyclass == KMF_ASYM_PUB) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys publist = PK11_ListPublicKeysInSlot(nss_slot, parms->findLabel);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (publist == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEY_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (parms->keyclass == KMF_ASYM_PRI) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys prilist = PK11_ListPrivKeysInSlot(nss_slot,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys parms->findLabel, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (prilist == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEY_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (parms->keyclass == KMF_SYMMETRIC) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symlist = PK11_ListFixedKeysInSlot(nss_slot, parms->findLabel,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (symlist == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEY_NOT_FOUND;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_BAD_KEY_CLASS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (parms->keyclass == KMF_ASYM_PUB) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (count = 0, pubnode = PUBKEY_LIST_HEAD(publist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys !PUBKEY_LIST_END(pubnode, publist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubnode = PUBKEY_LIST_NEXT(pubnode), count++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keys != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].kstype = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyclass = KMF_ASYM_PUB;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyp = (void *)pubnode->key;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keylabel =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_GetPublicKeyNickname(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pubnode->key);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pubnode->key->keyType == rsaKey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyalg = KMF_RSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if (pubnode->key->keyType == dsaKey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyalg = KMF_DSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numkeys = count;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (parms->keyclass == KMF_ASYM_PRI) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (count = 0, prinode = PRIVKEY_LIST_HEAD(prilist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys !PRIVKEY_LIST_END(prinode, prilist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys prinode = PRIVKEY_LIST_NEXT(prinode), count++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keys != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].kstype = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyclass = KMF_ASYM_PRI;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyp = (void *)prinode->key;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keylabel =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_GetPrivateKeyNickname(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys prinode->key);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (prinode->key->keyType == rsaKey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyalg = KMF_RSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if (prinode->key->keyType == dsaKey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyalg = KMF_DSA;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numkeys = count;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (parms->keyclass == KMF_SYMMETRIC) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys count = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (symlist) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SymKey *symkey = symlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_KEY_TYPE type;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_ALG keyalg;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys type = PK11_GetSymKeyType(symkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyalg = pk11keytype2kmf(type);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If keytype is specified in the searching parameter,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * check the keytype and skip the key if its keytype
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * doesn't match.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symlist = PK11_GetNextSymKey(symkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (parms->keytype != KMF_KEYALG_NONE &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys parms->keytype != keyalg) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys continue;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keys != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].kstype = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyclass = KMF_SYMMETRIC;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyp = (void *) symkey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keylabel =
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_GetSymKeyNickname(symkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keys[count].keyalg = keyalg;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSymKey(symkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys count++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *numkeys = count;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic SECStatus
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysp12u_SwapUnicodeBytes(SECItem *uniItem)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char a;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((uniItem == NULL) || (uniItem->len % 2)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (SECFailure);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < uniItem->len; i += 2) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys a = uniItem->data[i];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uniItem->data[i] = uniItem->data[i+1];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uniItem->data[i+1] = a;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (SECSuccess);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic PRBool
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysp12u_ucs2_ascii_conversion_function(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRBool toUnicode,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char *inBuf,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned int inBufLen,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char *outBuf,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned int maxOutBufLen,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned int *outBufLen,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRBool swapBytes)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem it = { 0 };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem *dup = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PRBool ret;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys it.data = inBuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys it.len = inBufLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys dup = SECITEM_DupItem(&it);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If converting Unicode to ASCII, swap bytes before conversion
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * as neccessary.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!toUnicode && swapBytes) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (p12u_SwapUnicodeBytes(dup) != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECITEM_ZfreeItem(dup, PR_TRUE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Perform the conversion. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = PORT_UCS2_UTF8Conversion(toUnicode, dup->data, dup->len,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys outBuf, maxOutBufLen, outBufLen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (dup)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECITEM_ZfreeItem(dup, PR_TRUE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic PRBool
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysp12u_OpenFile(p12uContext *p12ctx, PRBool fileRead)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!p12ctx || !p12ctx->filename) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (fileRead) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx->file = PR_Open(p12ctx->filename,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_RDONLY, 0400);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx->file = PR_Open(p12ctx->filename,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_CREATE_FILE | PR_RDWR | PR_TRUNCATE, 0600);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!p12ctx->file) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx->error = PR_TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (PR_TRUE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysp12u_DestroyContext(p12uContext **ppCtx, PRBool removeFile)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!ppCtx || !(*ppCtx)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((*ppCtx)->file != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_Close((*ppCtx)->file);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((*ppCtx)->filename != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (removeFile) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_Delete((*ppCtx)->filename);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free((*ppCtx)->filename);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(*ppCtx);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *ppCtx = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic p12uContext *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysp12u_InitContext(PRBool fileImport, char *filename)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12uContext *p12ctx;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx = PORT_ZNew(p12uContext);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!p12ctx) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx->error = PR_FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx->errorValue = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx->filename = strdup(filename);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!p12u_OpenFile(p12ctx, fileImport)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12u_DestroyContext(&p12ctx, PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (p12ctx);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysp12u_WriteToExportFile(void *arg, const char *buf, unsigned long len)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12uContext *p12cxt = arg;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int writeLen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!p12cxt || (p12cxt->error == PR_TRUE)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (p12cxt->file == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12cxt->errorValue = SEC_ERROR_PKCS12_UNABLE_TO_WRITE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12cxt->error = PR_TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys writeLen = PR_Write(p12cxt->file, (unsigned char *)buf, (int32)len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (writeLen != (int)len) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_Close(p12cxt->file);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p12cxt->filename);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12cxt->filename = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12cxt->file = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12cxt->errorValue = SEC_ERROR_PKCS12_UNABLE_TO_WRITE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12cxt->error = PR_TRUE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#define HANDLE_NSS_ERROR(r) {\
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError()); \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = r; \
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out; }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysadd_cert_to_bag(SEC_PKCS12ExportContext *p12ecx,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *cert, SECItem *pwitem)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12SafeInfo *keySafe = NULL, *certSafe = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keySafe = SEC_PKCS12CreateUnencryptedSafe(p12ecx);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (PK11_IsFIPS()) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certSafe = keySafe;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys certSafe = SEC_PKCS12CreatePasswordPrivSafe(p12ecx, pwitem,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_OID_PKCS12_V2_PBE_WITH_SHA1_AND_40_BIT_RC2_CBC);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!certSafe || !keySafe) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (SEC_PKCS12AddCertAndKey(p12ecx, certSafe, NULL, cert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_GetDefaultCertDB(), keySafe, NULL, PR_TRUE, pwitem,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_OID_PKCS12_V2_PBE_WITH_SHA1_AND_3KEY_TRIPLE_DES_CBC)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*ARGSUSED*/
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_ExportP12(KMF_HANDLE_T handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_EXPORTP12_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int numcerts, KMF_X509_DER_CERT *certs,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int numkeys, KMF_KEY_HANDLE *keylist,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *filename)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12ExportContext *p12ecx = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12uContext *p12ctx = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertList *certlist = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *nsscert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertListNode* node = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem pwitem = {NULL, 0};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->nssparms, FALSE, &slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_authenticate(handle, slot, &params->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Find the certificate(s) first.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params->certLabel) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nsscert = PK11_FindCertFromNickname(params->certLabel,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nsscert == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys HANDLE_NSS_ERROR(KMF_ERR_CERT_NOT_FOUND)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_find_matching_certs(slot,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->issuer,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->subject,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->serial,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &certlist, 0);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv == KMF_OK && certlist == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_CERT_NOT_FOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The KMF_CREDENTIAL holds the password to use for
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * encrypting the PKCS12 key information.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pwitem.data = (uchar_t *)params->p12cred.cred;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pwitem.len = params->p12cred.credlen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ctx = p12u_InitContext(PR_FALSE, filename);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!p12ctx) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys HANDLE_NSS_ERROR(KMF_ERR_OPEN_FILE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PORT_SetUCS2_ASCIIConversionFunction(
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12u_ucs2_ascii_conversion_function);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12ecx = SEC_PKCS12CreateExportContext(NULL, NULL,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys slot, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!p12ecx) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys HANDLE_NSS_ERROR(KMF_ERR_OPEN_FILE)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (SEC_PKCS12AddPasswordIntegrity(p12ecx, &pwitem, SEC_OID_SHA1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys HANDLE_NSS_ERROR(KMF_ERR_INTERNAL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * NSS actually supports storing a list of keys and certs
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * in the PKCS#12 PDU. Nice feature.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (certlist != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (node = CERT_LIST_HEAD(certlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys !CERT_LIST_END(node, certlist) && rv == KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = CERT_LIST_NEXT(node)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = add_cert_to_bag(p12ecx, node->cert, &pwitem);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (nsscert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = add_cert_to_bag(p12ecx, nsscert, &pwitem);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (SEC_PKCS12Encode(p12ecx, p12u_WriteToExportFile, p12ctx)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys HANDLE_NSS_ERROR(KMF_ERR_ENCODING)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nsscert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(nsscert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (certlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertList(certlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (p12ctx)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p12u_DestroyContext(&p12ctx, PR_FALSE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (p12ecx)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SEC_PKCS12DestroyExportContext(p12ecx);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
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
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_KEY_DATA *rawkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus ckrv = SECSuccess;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERTCertificate *nss_cert = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECKEYPrivateKeyInfo rpk;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECItem nickname;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA derkey = { NULL, 0 };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uchar_t ver = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!kmfh)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL || params->certificate == NULL || rawkey == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->nssparms, FALSE, &slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_authenticate(handle, slot, &params->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Decode the cert into an NSS CERT object so we can access the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * SPKI and KeyUsage data later.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_cert = CERT_DecodeCertFromPackage((char *)params->certificate->Data,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->certificate->Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_cert == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_BAD_CERT_FORMAT;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&rpk, 0, sizeof (rpk));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.arena = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.version.type = siUnsignedInteger;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.version.data = &ver;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.version.len = 1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey->keytype == KMF_RSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerEncodeRSAPrivateKey(&derkey, &rawkey->rawdata.rsa);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.algorithm = nss_cert->subjectPublicKeyInfo.algorithm;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.privateKey.data = derkey.Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.privateKey.len = derkey.Length;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.attributes = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (rawkey->keytype == KMF_DSA) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = DerEncodeDSAPrivateKey(&derkey, &rawkey->rawdata.dsa);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.algorithm = nss_cert->subjectPublicKeyInfo.algorithm;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.privateKey.data = derkey.Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.privateKey.len = derkey.Length;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rpk.attributes = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nickname.data = (uchar_t *)params->label;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nickname.len = (params->label ? strlen(params->label) : 0);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ckrv = PK11_ImportPrivateKeyInfo(slot, &rpk,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys &nickname, &nss_cert->subjectPublicKeyInfo.subjectPublicKey,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys TRUE, TRUE, nss_cert->keyUsage, NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ckrv != CKR_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_INTERNAL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_cert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CERT_DestroyCertificate(nss_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_FreeData(&derkey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_CreateSymKey(KMF_HANDLE_T handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_CREATESYMKEY_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_KEY_HANDLE *symkey)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SymKey *nsskey = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CK_MECHANISM_TYPE keyType;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus nssrv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int keySize;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (params == NULL || symkey == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (params->keytype) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_AES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyType = CKM_AES_KEY_GEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keySize = params->keylength;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keySize == 0 || (keySize % 8) != 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_SIZE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_RC4:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyType = CKM_RC4_KEY_GEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keySize = params->keylength;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (keySize == 0 || (keySize % 8) != 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEY_SIZE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyType = CKM_DES_KEY_GEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keySize = 0; /* required by PK11_TokenKeyGen() */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DES3:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keyType = CKM_DES3_KEY_GEN;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys keySize = 0; /* required by PK11_TokenKeyGen() */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys default:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_BAD_KEY_TYPE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts, FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = nss_authenticate(handle, nss_slot, &params->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nsskey = PK11_TokenKeyGen(nss_slot, keyType, NULL, keySize, NULL,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PR_TRUE, (void *)params->cred.cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nsskey == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEYGEN_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nssrv = PK11_SetSymKeyNickname(nsskey, params->keylabel);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nssrv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_KEYGEN_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->kstype = KMF_KEYSTORE_NSS;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->keyalg = params->keytype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->keyclass = KMF_SYMMETRIC;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->israw = FALSE;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys symkey->keyp = (void *)nsskey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_slot != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSlot(nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != KMF_OK && nsskey != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_DeleteTokenSymKey(nsskey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11_FreeSymKey(nsskey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_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 SECItem *value = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SymKey *nsskey;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECStatus nss_rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfh == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_UNINITIALIZED);
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
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (symkey->israw) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RAW_KEY_DATA *rawkey = (KMF_RAW_KEY_DATA *)symkey->keyp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rawkey == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rawkey->rawdata.sym.keydata.val == NULL ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rawkey->rawdata.sym.keydata.len == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEYHANDLE);
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,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rawkey->rawdata.sym.keydata.val, rkey->keydata.len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nsskey = (PK11SymKey *)(symkey->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nsskey == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_KEYHANDLE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nss_rv = PK11_ExtractKeyValue(nsskey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nss_rv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_GETKEYVALUE_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys value = PK11_GetKeyData(nsskey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (value == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_GETKEYVALUE_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (value->len == 0 || value->data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_GETKEYVALUE_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rkey->keydata.val = malloc(value->len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rkey->keydata.val == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(rkey->keydata.val, value->data, value->len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rkey->keydata.len = value->len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(value->data, 0, value->len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (value != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SECITEM_FreeItem(value, PR_TRUE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysNSS_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_CREDENTIAL *newpin)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int rv;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys PK11SlotInfo *nss_slot = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle == NULL || params == NULL || newpin == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = Do_NSS_Init(handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->ks_opt_u.nss_opts,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys FALSE, &nss_slot);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* If it was uninitialized, set it */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret == KMF_ERR_UNINITIALIZED_TOKEN) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = PK11_InitPin(nss_slot, NULL, newpin->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_AUTH_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else if (ret == KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = nss_authenticate(handle, nss_slot, &params->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rv = PK11_ChangePW(nss_slot,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys params->cred.cred, newpin->cred);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (rv != SECSuccess) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_ERROR(kmfh, PORT_GetError());
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_AUTH_FAILED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}