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
9f0bc604621fbb9b9b038e6de7da8f9c46e28608Wyllys Ingersoll *
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <stdio.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <dlfcn.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <link.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <fcntl.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <ctype.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <sys/param.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <sys/types.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <sys/stat.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <errno.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <sys/socket.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <netinet/in.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <arpa/inet.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <thread.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <ber_der.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <kmfapiP.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <pem_encode.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <rdn_parser.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <libxml2/libxml/uri.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <libgen.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys#include <cryptoutil.h>
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic uchar_t pkcs11_initialized = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysmutex_t init_lock = DEFAULTMUTEX;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysextern int errno;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllystypedef struct {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN code;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *message;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys} kmf_error_map;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic kmf_error_map kmf_errcodes[] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_OK, "KMF_OK"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_PARAMETER, "KMF_ERR_BAD_PARAMETER"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_KEY_FORMAT, "KMF_ERR_BAD_KEY_FORMAT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_ALGORITHM, "KMF_ERR_BAD_ALGORITHM"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_MEMORY, "KMF_ERR_MEMORY"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_ENCODING, "KMF_ERR_ENCODING"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_PLUGIN_INIT, "KMF_ERR_PLUGIN_INIT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_PLUGIN_NOTFOUND, "KMF_ERR_PLUGIN_NOTFOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_INTERNAL, "KMF_ERR_INTERNAL"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_CERT_FORMAT, "KMF_ERR_BAD_CERT_FORMAT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_KEYGEN_FAILED, "KMF_ERR_KEYGEN_FAILED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_UNINITIALIZED, "KMF_ERR_UNINITIALIZED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_ISSUER, "KMF_ERR_ISSUER"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_NOT_REVOKED, "KMF_ERR_NOT_REVOKED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_CERT_NOT_FOUND, "KMF_ERR_CERT_NOT_FOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_CRL_NOT_FOUND, "KMF_ERR_CRL_NOT_FOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_RDN_PARSER, "KMF_ERR_RDN_PARSER"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_RDN_ATTR, "KMF_ERR_RDN_ATTR"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_SLOTNAME, "KMF_ERR_SLOTNAME"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_EMPTY_CRL, "KMF_ERR_EMPTY_CRL"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BUFFER_SIZE, "KMF_ERR_BUFFER_SIZE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_AUTH_FAILED, "KMF_ERR_AUTH_FAILED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_TOKEN_SELECTED, "KMF_ERR_TOKEN_SELECTED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_NO_TOKEN_SELECTED, "KMF_ERR_NO_TOKEN_SELECTED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_TOKEN_NOT_PRESENT, "KMF_ERR_TOKEN_NOT_PRESENT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_EXTENSION_NOT_FOUND, "KMF_ERR_EXTENSION_NOT_FOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_POLICY_ENGINE, "KMF_ERR_POLICY_ENGINE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_POLICY_DB_FORMAT, "KMF_ERR_POLICY_DB_FORMAT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_POLICY_NOT_FOUND, "KMF_ERR_POLICY_NOT_FOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_POLICY_DB_FILE, "KMF_ERR_POLICY_DB_FILE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_POLICY_NAME, "KMF_ERR_POLICY_NAME"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_POLICY, "KMF_ERR_OCSP_POLICY"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_TA_POLICY, "KMF_ERR_TA_POLICY"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_KEY_NOT_FOUND, "KMF_ERR_KEY_NOT_FOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OPEN_FILE, "KMF_ERR_OPEN_FILE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_BAD_ISSUER, "KMF_ERR_OCSP_BAD_ISSUER"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_BAD_CERT, "KMF_ERR_OCSP_BAD_CERT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_CREATE_REQUEST, "KMF_ERR_OCSP_CREATE_REQUEST"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_CONNECT_SERVER, "KMF_ERR_CONNECT_SERVER"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_SEND_REQUEST, "KMF_ERR_SEND_REQUEST"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_CERTID, "KMF_ERR_OCSP_CERTID"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_MALFORMED_RESPONSE, "KMF_ERR_OCSP_MALFORMED_RESPONSE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_RESPONSE_STATUS, "KMF_ERR_OCSP_RESPONSE_STATUS"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_NO_BASIC_RESPONSE, "KMF_ERR_OCSP_NO_BASIC_RESPONSE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_BAD_SIGNER, "KMF_ERR_OCSP_BAD_SIGNER"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_RESPONSE_SIGNATURE, "KMF_ERR_OCSP_RESPONSE_SIGNATURE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_UNKNOWN_CERT, "KMF_ERR_OCSP_UNKNOWN_CERT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_STATUS_TIME_INVALID, "KMF_ERR_OCSP_STATUS_TIME_INVALID"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_HTTP_RESPONSE, "KMF_ERR_BAD_HTTP_RESPONSE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_RECV_RESPONSE, "KMF_ERR_RECV_RESPONSE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_RECV_TIMEOUT, "KMF_ERR_RECV_TIMEOUT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_DUPLICATE_KEYFILE, "KMF_ERR_DUPLICATE_KEYFILE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_AMBIGUOUS_PATHNAME, "KMF_ERR_AMBIGUOUS_PATHNAME"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_FUNCTION_NOT_FOUND, "KMF_ERR_FUNCTION_NOT_FOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_PKCS12_FORMAT, "KMF_ERR_PKCS12_FORMAT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_KEY_TYPE, "KMF_ERR_BAD_KEY_TYPE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_KEY_CLASS, "KMF_ERR_BAD_KEY_CLASS"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_KEY_SIZE, "KMF_ERR_BAD_KEY_SIZE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_HEX_STRING, "KMF_ERR_BAD_HEX_STRING"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_KEYUSAGE, "KMF_ERR_KEYUSAGE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_VALIDITY_PERIOD, "KMF_ERR_VALIDITY_PERIOD"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_REVOKED, "KMF_ERR_OCSP_REVOKED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_CERT_MULTIPLE_FOUND, "KMF_ERR_CERT_MULTIPLE_FOUND"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_WRITE_FILE, "KMF_ERR_WRITE_FILE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_URI, "KMF_ERR_BAD_URI"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_CRLFILE, "KMF_ERR_BAD_CRLFILE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_CERTFILE, "KMF_ERR_BAD_CERTFILE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_GETKEYVALUE_FAILED, "KMF_ERR_GETKEYVALUE_FAILED"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_KEYHANDLE, "KMF_ERR_BAD_KEYHANDLE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_BAD_OBJECT_TYPE, "KMF_ERR_BAD_OBJECT_TYPE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_OCSP_RESPONSE_LIFETIME, "KMF_ERR_OCSP_RESPONSE_LIFETIME"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_UNKNOWN_CSR_ATTRIBUTE, "KMF_ERR_UNKNOWN_CSR_ATTRIBUTE"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_UNINITIALIZED_TOKEN, "KMF_ERR_UNINITIALIZED_TOKEN"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_INCOMPLETE_TBS_CERT, "KMF_ERR_INCOMPLETE_TBS_CERT"},
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys {KMF_ERR_MISSING_ERRCODE, "KMF_ERR_MISSING_ERRCODE"},
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys {KMF_KEYSTORE_ALREADY_INITIALIZED, "KMF_KEYSTORE_ALREADY_INITIALIZED"},
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys {KMF_ERR_SENSITIVE_KEY, "KMF_ERR_SENSITIVE_KEY"},
71593db26bb6ef7b739cffe06d53bf990cac112cwyllys {KMF_ERR_UNEXTRACTABLE_KEY, "KMF_ERR_UNEXTRACTABLE_KEY"},
d00756ccb34596a328f8a15d1965da5412d366d0wyllys {KMF_ERR_KEY_MISMATCH, "KMF_ERR_KEY_MISMATCH"},
d00756ccb34596a328f8a15d1965da5412d366d0wyllys {KMF_ERR_ATTR_NOT_FOUND, "KMF_ERR_ATTR_NOT_FOUND"},
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec {KMF_ERR_KMF_CONF, "KMF_ERR_KMF_CONF"},
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec {KMF_ERR_NAME_NOT_MATCHED, "KMF_ERR_NAME_NOT_MATCHED"},
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec {KMF_ERR_MAPPER_OPEN, "KMF_ERR_MAPPER_OPEN"},
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec {KMF_ERR_MAPPER_NOT_FOUND, "KMF_ERR_MAPPER_NOT_FOUND"},
fc2613b0a10c787c0f90e9b36f170183746c63f8Wyllys Ingersoll {KMF_ERR_MAPPING_FAILED, "KMF_ERR_MAPPING_FAILED"},
fc2613b0a10c787c0f90e9b36f170183746c63f8Wyllys Ingersoll {KMF_ERR_CERT_VALIDATION, "KMF_ERR_CERT_VALIDATION"}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllystypedef struct {
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys KMF_KEYSTORE_TYPE kstype;
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys char *path;
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys boolean_t critical;
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys} KMF_PLUGIN_ITEM;
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllysKMF_PLUGIN_ITEM plugin_list[] = {
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys {KMF_KEYSTORE_OPENSSL, KMF_PLUGIN_PATH "kmf_openssl.so.1", TRUE},
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys {KMF_KEYSTORE_PK11TOKEN, KMF_PLUGIN_PATH "kmf_pkcs11.so.1", TRUE},
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys {KMF_KEYSTORE_NSS, KMF_PLUGIN_PATH "kmf_nss.so.1", FALSE}
85b65b39e9a6fea849facdcfc7d06f5ece340e36wyllys};
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
90c85bf889e3af34323084f00e344a82f120b409wyllysstatic KMF_RETURN InitializePlugin(KMF_KEYSTORE_TYPE, char *, KMF_PLUGIN **);
90c85bf889e3af34323084f00e344a82f120b409wyllysstatic KMF_RETURN AddPlugin(KMF_HANDLE_T, KMF_PLUGIN *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void free_extensions(KMF_X509_EXTENSIONS *extns);
90c85bf889e3af34323084f00e344a82f120b409wyllysstatic void DestroyPlugin(KMF_PLUGIN *);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#if defined(__sparcv9)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#define ISA_PATH "/sparcv9"
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#elif defined(__sparc)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#define ISA_PATH "/"
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#elif defined(__i386)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#define ISA_PATH "/"
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#elif defined(__amd64)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#define ISA_PATH "/amd64"
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#endif
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee#define DEFAULT_KEYSTORE_NUM 3
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleestatic int kstore_num = DEFAULT_KEYSTORE_NUM;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeconf_entrylist_t *extra_plugin_list = NULL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleestatic boolean_t check_extra_plugin = B_FALSE;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleemutex_t extra_plugin_lock = DEFAULTMUTEX;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllysKMF_RETURN
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllysinit_pk11()
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys (void) mutex_lock(&init_lock);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys if (!pkcs11_initialized) {
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys CK_RV rv = C_Initialize(NULL);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys if ((rv != CKR_OK) &&
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys (rv != CKR_CRYPTOKI_ALREADY_INITIALIZED)) {
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys (void) mutex_unlock(&init_lock);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys return (KMF_ERR_UNINITIALIZED);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys } else {
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys pkcs11_initialized = 1;
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys }
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys }
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys (void) mutex_unlock(&init_lock);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Private method for searching the plugin list for the correct
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Plugin to use.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_PLUGIN *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysFindPlugin(KMF_HANDLE_T handle, KMF_KEYSTORE_TYPE kstype)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN_LIST *node;
90c85bf889e3af34323084f00e344a82f120b409wyllys KMF_RETURN ret = KMF_OK;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee KMF_PLUGIN *pluginrec = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = handle->plugins;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
90c85bf889e3af34323084f00e344a82f120b409wyllys /* See if the desired plugin was already initialized. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (node != NULL && node->plugin->type != kstype)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys node = node->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (node != NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (node->plugin);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /* The plugin was not found, try to initialize it here. */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (VALID_DEFAULT_KEYSTORE_TYPE(kstype)) {
90c85bf889e3af34323084f00e344a82f120b409wyllys int i;
90c85bf889e3af34323084f00e344a82f120b409wyllys int numitems = sizeof (plugin_list)/sizeof (KMF_PLUGIN_ITEM);
90c85bf889e3af34323084f00e344a82f120b409wyllys for (i = 0; i < numitems; i++) {
90c85bf889e3af34323084f00e344a82f120b409wyllys if (plugin_list[i].kstype == kstype) {
90c85bf889e3af34323084f00e344a82f120b409wyllys ret = InitializePlugin(plugin_list[i].kstype,
90c85bf889e3af34323084f00e344a82f120b409wyllys plugin_list[i].path, &pluginrec);
90c85bf889e3af34323084f00e344a82f120b409wyllys break;
90c85bf889e3af34323084f00e344a82f120b409wyllys }
90c85bf889e3af34323084f00e344a82f120b409wyllys }
90c85bf889e3af34323084f00e344a82f120b409wyllys
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * Not a built-in plugin. Check if it is in the
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * extra_plugin_list. If it is, try to initialize it here.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entrylist_t *phead = extra_plugin_list;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char realpath[MAXPATHLEN];
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee while (phead != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (phead->entry->kstype == kstype)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee break;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee else
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee phead = phead->next;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (phead == NULL)
90c85bf889e3af34323084f00e344a82f120b409wyllys return (NULL);
90c85bf889e3af34323084f00e344a82f120b409wyllys
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * Get the absolute path of the module.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * - If modulepath is not a full path, then prepend it
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * with KMF_PLUGIN_PATH.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * - If modulepath is a full path and contain $ISA, then
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * subsitute the architecture dependent path.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) memset(realpath, 0, sizeof (realpath));
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (strncmp(phead->entry->modulepath, "/", 1) != 0) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) snprintf(realpath, MAXPATHLEN, "%s%s",
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee KMF_PLUGIN_PATH, phead->entry->modulepath);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *buf = phead->entry->modulepath;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *isa;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((isa = strstr(buf, PKCS11_ISA)) != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *isa_str;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) strncpy(realpath, buf, isa - buf);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee isa_str = strdup(ISA_PATH);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (isa_str == NULL) /* not enough memory */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (NULL);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) strncat(realpath, isa_str,
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee strlen(isa_str));
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free(isa_str);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee isa += strlen(PKCS11_ISA);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) strlcat(realpath, isa, MAXPATHLEN);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) snprintf(realpath, MAXPATHLEN, "%s",
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee phead->entry->modulepath);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
90c85bf889e3af34323084f00e344a82f120b409wyllys }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = InitializePlugin(phead->entry->kstype, realpath,
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee &pluginrec);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeout:
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (ret != KMF_OK || pluginrec == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /* No matching plugins found in the built-in list */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (NULL);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = AddPlugin(handle, pluginrec);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (ret != KMF_OK) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee DestroyPlugin(pluginrec);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee pluginrec = NULL;
90c85bf889e3af34323084f00e344a82f120b409wyllys }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (pluginrec);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysInitializePlugin(KMF_KEYSTORE_TYPE kstype, char *path, KMF_PLUGIN **plugin)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN *p = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN_FUNCLIST *(*sym)();
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (path == NULL || plugin == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *plugin = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p = (KMF_PLUGIN *)malloc(sizeof (KMF_PLUGIN));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (p == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p->type = kstype;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys p->path = strdup(path);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (p->path == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
2225707c7e7edf7c636ed349df2592ef85329cddValerie Bubb Fenwick /*
2225707c7e7edf7c636ed349df2592ef85329cddValerie Bubb Fenwick * Do not use RTLD_GROUP here, or this will cause a circular
2225707c7e7edf7c636ed349df2592ef85329cddValerie Bubb Fenwick * dependency when kmf_pkcs11.so.1 gets its PKCS#11 functions
2225707c7e7edf7c636ed349df2592ef85329cddValerie Bubb Fenwick * from libpkcs11.so.1 when kmf is used via libelfsign.so.1
2225707c7e7edf7c636ed349df2592ef85329cddValerie Bubb Fenwick * called from kcfd.
2225707c7e7edf7c636ed349df2592ef85329cddValerie Bubb Fenwick */
2225707c7e7edf7c636ed349df2592ef85329cddValerie Bubb Fenwick p->dldesc = dlopen(path, RTLD_LAZY | RTLD_PARENT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (p->dldesc == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p->path);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_PLUGIN_INIT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys sym = (KMF_PLUGIN_FUNCLIST *(*)())dlsym(p->dldesc,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_PLUGIN_INIT_SYMBOL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (sym == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) dlclose(p->dldesc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p->path);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_PLUGIN_INIT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Get the function list */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((p->funclist = (*sym)()) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) dlclose(p->dldesc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p->path);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(p);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_PLUGIN_INIT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *plugin = p;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysAddPlugin(KMF_HANDLE_T handle, KMF_PLUGIN *plugin)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN_LIST *n;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle == NULL || plugin == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* If the head is NULL, create it */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle->plugins == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->plugins = (KMF_PLUGIN_LIST *)malloc(
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_PLUGIN_LIST));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle->plugins == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->plugins->plugin = plugin;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->plugins->next = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* walk the list to find the tail */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys n = handle->plugins;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (n->next != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys n = n->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys n->next = (KMF_PLUGIN_LIST *)malloc(sizeof (KMF_PLUGIN_LIST));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (n->next == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys n->next->plugin = plugin;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys n->next->next = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (0);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysDestroyPlugin(KMF_PLUGIN *plugin)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin->path)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(plugin->path);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(plugin);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysCleanup_KMF_Handle(KMF_HANDLE_T handle)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (handle->plugins != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN_LIST *next = handle->plugins->next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys DestroyPlugin(handle->plugins->plugin);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(handle->plugins);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->plugins = next;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_policy_record(handle->policy);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(handle->policy);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysCleanup_PK11_Session(KMF_HANDLE_T handle)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Close active session on a pkcs11 token */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle->pk11handle != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) C_CloseSession(handle->pk11handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->pk11handle = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_HANDLE *handle = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (outhandle == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outhandle = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle = (KMF_HANDLE *)malloc(sizeof (KMF_HANDLE));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(handle, 0, sizeof (KMF_HANDLE));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle->plugins = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * When this function is called the first time, get the additional
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * plugins from the config file.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) mutex_lock(&extra_plugin_lock);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (!check_extra_plugin) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = get_entrylist(&extra_plugin_list);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee check_extra_plugin = B_TRUE;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * Assign the kstype number to the additional plugins here.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * The global kstore_num will be protected by the mutex lock.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (ret == KMF_OK) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entrylist_t *phead = extra_plugin_list;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee while (phead != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee phead->entry->kstype = ++kstore_num;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee phead = phead->next;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * If the KMF configuration file does not exist or cannot be
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * parsed correctly, we will give a warning in syslog and
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * continue on as there is no extra plugins in the system.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (ret == KMF_ERR_KMF_CONF) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee cryptoerror(LOG_WARNING, "KMF was unable to parse "
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee "the private KMF config file.\n");
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_OK;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (ret != KMF_OK) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) mutex_unlock(&extra_plugin_lock);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto errout;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) mutex_unlock(&extra_plugin_lock);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Initialize the handle with the policy */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = kmf_set_policy((void *)handle,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys policyfile == NULL ? KMF_DEFAULT_POLICY_FILE : policyfile,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys policyname == NULL ? KMF_DEFAULT_POLICY_NAME : policyname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto errout;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec /*
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec * Let's have the mapper status structure even if no cert-to-name
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec * mapping is initialized. It's better not to coredump in the
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec * kmf_get_mapper_lasterror function, for example, when there is no
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec * mapping initialized.
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec */
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec handle->mapstate = malloc(sizeof (KMF_MAPPER_STATE));
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec if (handle->mapstate == NULL) {
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec ret = KMF_ERR_MEMORY;
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec goto errout;
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec }
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec handle->mapstate->lastmappererr = KMF_OK;
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec handle->mapstate->options = NULL;
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec /*
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec * Initialize the mapping scheme according to the policy. If no mapping
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec * is set in the policy database we silently ignore the error.
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec */
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec (void) kmf_cert_to_name_mapping_initialize(handle, 0, NULL);
269e59f9a28bf47e0f463e64fc5af4a408b73b21Jan Pechanec
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CLEAR_ERROR(handle, ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyserrout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Cleanup_KMF_Handle(handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys handle = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outhandle = (KMF_HANDLE_T)handle;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_configure_keystore(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int num_args,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN *plugin;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEYSTORE_TYPE kstype;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE_TESTER required_attrs[] = {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys };
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int num_req_attrs = sizeof (required_attrs) /
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_ATTRIBUTE_TESTER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (handle == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CLEAR_ERROR(handle, ret);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = test_attributes(num_req_attrs, required_attrs,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys 0, NULL, num_args, attrlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys len = sizeof (kstype);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &kstype, &len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ret != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys plugin = FindPlugin(handle, kstype);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (plugin != NULL && plugin->funclist->ConfigureKeystore != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (plugin->funclist->ConfigureKeystore(handle, num_args,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attrlist));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* return KMF_OK, if the plugin does not have an entry */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_finalize(KMF_HANDLE_T handle)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CLEAR_ERROR(handle, ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pkcs11_initialized) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Cleanup_PK11_Session(handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys Cleanup_KMF_Handle(handle);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_get_kmf_error_str(KMF_RETURN errcode, char **errmsg)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i, maxerr;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (errmsg == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *errmsg = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys maxerr = sizeof (kmf_errcodes) / sizeof (kmf_error_map);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < maxerr && errcode != kmf_errcodes[i].code; i++)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* empty body */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (i == maxerr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MISSING_ERRCODE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *errmsg = strdup(kmf_errcodes[i].message);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((*errmsg) == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_get_plugin_error_str(KMF_HANDLE_T handle, char **msgstr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN *plugin;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle == NULL || msgstr == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *msgstr = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle->lasterr.errcode == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MISSING_ERRCODE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (handle->lasterr.kstype == -1) { /* System error */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *str = strerror(handle->lasterr.errcode);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (str != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *msgstr = strdup(str);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((*msgstr) == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys plugin = FindPlugin(handle, handle->lasterr.kstype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_PLUGIN_NOTFOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin->funclist->GetErrorString != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = plugin->funclist->GetErrorString(handle, msgstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_FUNCTION_NOT_FOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys#define SET_SYS_ERROR(h, c) if (h) {\
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys h->lasterr.kstype = -1;\
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys h->lasterr.errcode = c;\
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_read_input_file(KMF_HANDLE_T handle, char *filename, KMF_DATA *pdata)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys struct stat s;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys long nread, total = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int fd;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char *buf = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys if (handle) {
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys CLEAR_ERROR(handle, ret);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys if (ret != KMF_OK)
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys return (ret);
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (filename == NULL || pdata == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((fd = open(filename, O_RDONLY)) < 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_SYS_ERROR(handle, errno);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_OPEN_FILE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (fstat(fd, &s) < 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_SYS_ERROR(handle, errno);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) close(fd);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_OPEN_FILE);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((buf = (unsigned char *) malloc(s.st_size)) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) close(fd);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys do {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nread = read(fd, buf+total, s.st_size-total);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nread < 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys SET_SYS_ERROR(handle, errno);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) close(fd);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(buf);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys total += nread;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } while (total < s.st_size);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pdata->Data = buf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys pdata->Length = s.st_size;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) close(fd);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_OK);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Name: kmf_der_to_pem
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Description:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Function for converting DER encoded format to PEM encoded format
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Parameters:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * type(input) - CERTIFICATE or CSR
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * data(input) - pointer to the DER encoded data
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * len(input) - length of input data
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * out(output) - contains the output buffer address to be returned
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * outlen(output) - pointer to the returned output length
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Returns:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * A KMF_RETURN value indicating success or specifying a particular
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * error condition.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The value KMF_OK indicates success. All other values represent
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * an error condition.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_der_to_pem(KMF_OBJECT_TYPE type, unsigned char *data,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int len, unsigned char **out, int *outlen)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN err;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (data == NULL || out == NULL || outlen == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys err = Der2Pem(type, data, len, out, outlen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (err);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Name: kmf_pem_to_der
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Description:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Function for converting PEM encoded format to DER encoded format
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Parameters:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * in(input) - pointer to the PEM encoded data
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * inlen(input) - length of input data
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * out(output) - contains the output buffer address to be returned
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * outlen(output) - pointer to the returned output length
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Returns:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * A KMF_RETURN value indicating success or specifying a particular
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * error condition.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The value KMF_OK indicates success. All other values represent
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * an error condition.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_pem_to_der(unsigned char *in, int inlen,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char **out, int *outlen)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN err;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (in == NULL || out == NULL || outlen == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys err = Pem2Der(in, inlen, out, outlen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (err);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyschar *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_oid_to_string(KMF_OID *oid)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char numstr[128];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t number;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int numshift;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint32_t i, string_length;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uchar_t *cp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *bp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* First determine the size of the string */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys string_length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys numshift = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cp = (unsigned char *)oid->Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = (uint32_t)cp[0];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sprintf(numstr, "%d ", number/40);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys string_length += strlen(numstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sprintf(numstr, "%d ", number%40);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys string_length += strlen(numstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 1; i < oid->Length; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((uint32_t)(numshift+7) < (sizeof (uint32_t)*8)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = (number << 7) | (cp[i] & 0x7f);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys numshift += 7;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((cp[i] & 0x80) == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sprintf(numstr, "%d ", number);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys string_length += strlen(numstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys numshift = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If we get here, we've calculated the length of "n n n ... n ". Add 4
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * here for "{ " and "}\0".
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys string_length += 4;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((bp = (char *)malloc(string_length))) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = (uint32_t)cp[0];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sprintf(numstr, "%d.", number/40);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strcpy(bp, numstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sprintf(numstr, "%d.", number%40);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strcat(bp, numstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cp = (unsigned char *) oid->Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 1; i < oid->Length; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = (number << 7) | (cp[i] & 0x7f);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((cp[i] & 0x80) == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sprintf(numstr, "%d", number);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strcat(bp, numstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys number = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (i+1 < oid->Length)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strcat(bp, ".");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (bp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
02744e811b15322c5f109827a116c33bfe3438b5wyllysstatic boolean_t
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhyleecheck_for_pem(uchar_t *buf, KMF_ENCODE_FORMAT *fmt)
02744e811b15322c5f109827a116c33bfe3438b5wyllys{
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys char *p;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys int i;
02744e811b15322c5f109827a116c33bfe3438b5wyllys
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (buf == NULL)
02744e811b15322c5f109827a116c33bfe3438b5wyllys return (FALSE);
02744e811b15322c5f109827a116c33bfe3438b5wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys for (i = 0; i < 8 && isascii(buf[i]); i++)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys /* loop to make sure this is ascii */;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (i != 8)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (FALSE);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (memcmp(buf, "Bag Attr", 8) == 0) {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee *fmt = KMF_FORMAT_PEM_KEYPAIR;
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (TRUE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee }
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys /* Look for "-----BEGIN" right after a newline */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee p = strtok((char *)buf, "\n");
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys while (p != NULL) {
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys if (strstr(p, "-----BEGIN") != NULL) {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee *fmt = KMF_FORMAT_PEM;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys /* Restore the buffer */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys buf[strlen(p)] = '\n';
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys return (TRUE);
02744e811b15322c5f109827a116c33bfe3438b5wyllys }
d00756ccb34596a328f8a15d1965da5412d366d0wyllys buf[strlen(p)] = '\n';
9b37d29632d2cb262ba42f1d804f85fcb0aa3709wyllys p = strtok(NULL, "\n");
02744e811b15322c5f109827a116c33bfe3438b5wyllys }
02744e811b15322c5f109827a116c33bfe3438b5wyllys return (FALSE);
02744e811b15322c5f109827a116c33bfe3438b5wyllys}
02744e811b15322c5f109827a116c33bfe3438b5wyllys
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhyleestatic unsigned char pkcs12_version[3] = {0x02, 0x01, 0x03};
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhyleestatic unsigned char pkcs12_oid[11] =
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee{0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01};
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee/*
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * This function takes a BER encoded string as input and checks the version
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * and the oid in the the top-level ASN.1 structure to see if it complies to
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * the PKCS#12 Syntax.
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhyleestatic boolean_t
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhyleecheck_for_pkcs12(uchar_t *buf, int buf_len)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee{
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee int index = 0;
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee int length_octets;
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (buf == NULL || buf_len <= 0)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee /*
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * The top level structure for a PKCS12 string:
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee *
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * PFX ::= SEQUENCE {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * version INTEGER {v3(3)}(v3,...)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * authSafe ContentInfo
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * macData MacData OPTIONAL
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * }
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee *
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * ContentInfo
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * FROM PKCS-7 {iso(1) member-body(2) us(840) rsadsi(113549)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * pkcs(1) pkcs-7(7) modules(0) pkcs-7(1)}
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee *
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * Therefore, the BER/DER dump of a PKCS#12 file for the first 2
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * sequences up to the oid part is as following:
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee *
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * SEQUENCE {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * INTEGER 3
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * SEQUENCE {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee /*
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * Check the first sequence and calculate the number of bytes used
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * to store the length.
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (buf[index++] != 0x30)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (buf[index] & 0x80) {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee length_octets = buf[index++] & 0x0F; /* long form */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee } else {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee length_octets = 1; /* short form */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee }
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee index += length_octets;
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (index >= buf_len)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee /* Skip the length octets and check the pkcs12 version */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (memcmp(buf + index, pkcs12_version, sizeof (pkcs12_version)) != 0)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee index += sizeof (pkcs12_version);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (index >= buf_len)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee /*
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * Check the 2nd sequence and calculate the number of bytes used
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee * to store the length.
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if ((buf[index++] & 0xFF) != 0x30)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (buf[index] & 0x80) {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee length_octets = buf[index++] & 0x0F;
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee } else {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee length_octets = 1;
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee }
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee index += length_octets;
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (index + sizeof (pkcs12_oid) >= buf_len)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee /* Skip the length octets and check the oid */
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (memcmp(buf + index, pkcs12_oid, sizeof (pkcs12_oid)) != 0)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (FALSE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee else
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (TRUE);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee}
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee
d00756ccb34596a328f8a15d1965da5412d366d0wyllysKMF_RETURN
d00756ccb34596a328f8a15d1965da5412d366d0wyllyskmf_get_data_format(KMF_DATA *data, KMF_ENCODE_FORMAT *fmt)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys{
d00756ccb34596a328f8a15d1965da5412d366d0wyllys uchar_t *buf = data->Data;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (check_for_pkcs12(buf, data->Length) == TRUE) {
d00756ccb34596a328f8a15d1965da5412d366d0wyllys *fmt = KMF_FORMAT_PKCS12;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys } else if (buf[0] == 0x30 && (buf[1] & 0x80)) {
d00756ccb34596a328f8a15d1965da5412d366d0wyllys /* It is most likely a generic ASN.1 encoded file */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys *fmt = KMF_FORMAT_ASN1;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys } else if (check_for_pem(buf, fmt) != TRUE) {
d00756ccb34596a328f8a15d1965da5412d366d0wyllys /* Cannot determine this file format */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys *fmt = KMF_FORMAT_UNDEF;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (KMF_ERR_ENCODING);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys }
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (KMF_OK);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys}
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_get_file_format(char *filename, KMF_ENCODE_FORMAT *fmt)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA filebuf = { 0, NULL };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (filename == NULL || !strlen(filename) || fmt == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *fmt = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = kmf_read_input_file(NULL, filename, &filebuf);
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (ret != KMF_OK)
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee if (filebuf.Length < 8) {
08ec4bd3f3c5e7a69bbb5c947fe80efe2e433c2fhylee ret = KMF_ERR_ENCODING; /* too small */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto end;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys ret = kmf_get_data_format(&filebuf, fmt);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysend:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&filebuf);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_hexstr_to_bytes(unsigned char *hexstr, unsigned char **bytes,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys size_t *outlen)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char *buf = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int len, stringlen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char ch;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (hexstr == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (hexstr[0] == '0' && ((hexstr[1] == 'x') || (hexstr[1] == 'X')))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys hexstr += 2;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < strlen((char *)hexstr) && isxdigit(hexstr[i]); i++)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* empty body */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If all the characters are not legitimate hex chars,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * return an error.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (i != strlen((char *)hexstr))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_HEX_STRING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys stringlen = i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys len = (i / 2) + (i % 2);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys buf = malloc(len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (buf == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(buf, 0, len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < stringlen; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ch = (unsigned char) *hexstr;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys hexstr++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((ch >= '0') && (ch <= '9'))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ch -= '0';
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if ((ch >= 'A') && (ch <= 'F'))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ch = ch - 'A' + 10;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else if ((ch >= 'a') && (ch <= 'f'))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ch = ch - 'a' + 10;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_HEX_STRING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (i & 1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys buf[i/2] |= ch;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys buf[i/2] = (ch << 4);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *bytes = buf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outlen = len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (buf != NULL && ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(buf);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_dn(KMF_X509_NAME *name)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_RDN *newrdn = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_TYPE_VALUE_PAIR *av = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i, j;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (name && name->numberOfRDNs) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < name->numberOfRDNs; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newrdn = &name->RelativeDistinguishedName[i];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (j = 0; j < newrdn->numberOfPairs; j++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys av = &newrdn->AttributeTypeAndValue[j];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&av->type);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&av->value);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(newrdn->AttributeTypeAndValue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newrdn->numberOfPairs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys newrdn->AttributeTypeAndValue = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(name->RelativeDistinguishedName);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name->numberOfRDNs = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys name->RelativeDistinguishedName = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_kmf_cert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN *plugin;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CLEAR_ERROR(handle, ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmf_cert == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys plugin = FindPlugin(handle, kmf_cert->kmf_private.keystore_type);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin != NULL && plugin->funclist->FreeKMFCert != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys plugin->funclist->FreeKMFCert(handle, kmf_cert);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_data(KMF_DATA *datablock)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (datablock != NULL && datablock->Data != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(datablock->Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys datablock->Data = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys datablock->Length = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_algoid(KMF_X509_ALGORITHM_IDENTIFIER *algoid)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (algoid == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&algoid->algorithm);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&algoid->parameters);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_extn(KMF_X509_EXTENSION *exptr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (exptr == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data((KMF_DATA *)&exptr->extnId);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&exptr->BERvalue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (exptr->value.tagAndValue) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&exptr->value.tagAndValue->value);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(exptr->value.tagAndValue);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_tbs_csr(KMF_TBS_CSR *tbscsr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (tbscsr) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscsr->version);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_dn(&tbscsr->subject);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_algoid(&tbscsr->subjectPublicKeyInfo.algorithm);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscsr->subjectPublicKeyInfo.subjectPublicKey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_extensions(&tbscsr->extensions);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_signed_csr(KMF_CSR_DATA *csr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (csr) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_tbs_csr(&csr->csr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_algoid(&csr->signature.algorithmIdentifier);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&csr->signature.encrypted);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_validity(KMF_X509_VALIDITY *validity)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (validity == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&validity->notBefore.time);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&validity->notAfter.time);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_extensions(KMF_X509_EXTENSIONS *extns)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_EXTENSION *exptr;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (extns && extns->numberOfExtensions > 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < extns->numberOfExtensions; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys exptr = &extns->extensions[i];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_extn(exptr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(extns->extensions);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys extns->numberOfExtensions = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys extns->extensions = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_tbs_cert(KMF_X509_TBS_CERT *tbscert)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (tbscert) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscert->version);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&tbscert->serialNumber);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_algoid(&tbscert->signature);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_dn(&tbscert->issuer);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_dn(&tbscert->subject);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_validity(&tbscert->validity);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscert->issuerUniqueIdentifier);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscert->subjectUniqueIdentifier);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_algoid(&tbscert->subjectPublicKeyInfo.algorithm);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscert->subjectPublicKeyInfo.subjectPublicKey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_extensions(&tbscert->extensions);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscert->issuerUniqueIdentifier);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&tbscert->subjectUniqueIdentifier);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_signed_cert(KMF_X509_CERTIFICATE *certptr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (!certptr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_tbs_cert(&certptr->certificate);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_algoid(&certptr->signature.algorithmIdentifier);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&certptr->signature.encrypted);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_str(char *pstr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (pstr != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(pstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_keyidlist(KMF_OID *oidlist, int len)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < len; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data((KMF_DATA *)&oidlist[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(oidlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_eku(KMF_X509EXT_EKU *eptr)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (eptr && eptr->nEKUs > 0 && eptr->keyPurposeIdList != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_keyidlist(eptr->keyPurposeIdList, eptr->nEKUs);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_spki(KMF_X509_SPKI *spki)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (spki != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_algoid(&spki->algorithm);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&spki->subjectPublicKey);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_kmf_key(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN *plugin;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE attlist[2]; /* only 2 attributes for DeleteKey op */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys boolean_t token_destroy = B_FALSE;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (key == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CLEAR_ERROR(handle, ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(attlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_set_attr_at_index(attlist, i,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_DESTROY_BOOL_ATTR, &token_destroy, sizeof (boolean_t));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys plugin = FindPlugin(handle, key->kstype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin != NULL && plugin->funclist->DeleteKey != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) plugin->funclist->DeleteKey(handle, i, attlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key->keylabel)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(key->keylabel);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key->israw) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_raw_key(key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(key->keyp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(key, 0, sizeof (KMF_KEY_HANDLE));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_bigint(KMF_BIGINT *big)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (big != NULL && big->val != NULL) {
02744e811b15322c5f109827a116c33bfe3438b5wyllys /* Clear it out before returning it to the pool */
02744e811b15322c5f109827a116c33bfe3438b5wyllys (void) memset(big->val, 0x00, big->len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(big->val);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys big->val = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys big->len = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_raw_rsa(KMF_RAW_RSA_KEY *key)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->mod);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->pubexp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->priexp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->prime1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->prime2);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->exp1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->exp2);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->coef);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_raw_dsa(KMF_RAW_DSA_KEY *key)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->prime);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->subprime);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->base);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->value);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic void
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_raw_sym(KMF_RAW_SYM_KEY *key)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->keydata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_raw_key(KMF_RAW_KEY_DATA *key)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (key->keytype) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_RSA:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_raw_rsa(&key->rawdata.rsa);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DSA:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_raw_dsa(&key->rawdata.dsa);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_AES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_RC4:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DES:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case KMF_DES3:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_raw_sym(&key->rawdata.sym);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys if (key->label) {
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys free(key->label);
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys key->label = NULL;
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys }
5b3e1433c6213363bcb6387e66fc84ee9ff21a5dwyllys kmf_free_data(&key->id);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_raw_sym_key(KMF_RAW_SYM_KEY *key)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (key == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_bigint(&key->keydata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(key);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This function frees the space allocated for the name portion of a
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * KMF_CRL_DIST_POINT.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_dp_name(KMF_CRL_DIST_POINT *dp)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_GENERALNAMES *fullname;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_DATA *urldata;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (dp == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* For phase 1, we only need to free the fullname space. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fullname = &(dp->name.full_name);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (fullname->number == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < fullname->number; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys urldata = &(fullname->namelist[fullname->number - 1].name);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(urldata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(fullname->namelist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This function frees the space allocated for a KMF_CRL_DIST_POINT.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfree_dp(KMF_CRL_DIST_POINT *dp)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (dp == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_dp_name(dp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&(dp->reasons));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Need not to free crl_issuer space at phase 1 */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This function frees space for a KMF_X509EXT_CRLDISTPOINTS internally.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_free_crl_dist_pts(KMF_X509EXT_CRLDISTPOINTS *crl_dps)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (crl_dps == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < crl_dps->number; i++)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free_dp(&(crl_dps->dplist[i]));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(crl_dps->dplist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_create_ocsp_request(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int num_args,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN *plugin;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN (*createReqFn)(void *, int num_args,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attrlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE_TESTER required_attrs[] = {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_OCSP_REQUEST_FILENAME_ATTR, FALSE, 1, 0},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_USER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_DATA)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_ISSUER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_DATA)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int num_req_attrs = sizeof (required_attrs) /
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_ATTRIBUTE_TESTER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (handle == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys CLEAR_ERROR(handle, ret);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = test_attributes(num_req_attrs, required_attrs,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys 0, NULL, num_args, attrlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ret != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (ret);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This framework function is actually implemented in the openssl
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * plugin library, so we find the function address and call it.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin == NULL || plugin->dldesc == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_PLUGIN_NOTFOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys createReqFn = (KMF_RETURN(*)())dlsym(plugin->dldesc,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys "OpenSSL_CreateOCSPRequest");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (createReqFn == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_FUNCTION_NOT_FOUND);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (createReqFn(handle, num_args, attrlist));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_get_ocsp_status_for_cert(KMF_HANDLE_T handle,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int num_args,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attrlist)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_PLUGIN *plugin;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN (*getCertStatusFn)(void *, int num_args,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE *attrlist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE_TESTER required_attrs[] = {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_USER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_DATA)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_ISSUER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_DATA)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_OCSP_RESPONSE_DATA_ATTR, FALSE, sizeof (KMF_DATA),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_DATA)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_OCSP_RESPONSE_STATUS_ATTR, FALSE, sizeof (int),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (uint32_t)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_OCSP_RESPONSE_REASON_ATTR, FALSE, sizeof (int),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (uint32_t)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys {KMF_OCSP_RESPONSE_CERT_STATUS_ATTR, FALSE, sizeof (int),
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (uint32_t)},
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys };
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int num_req_attrs = sizeof (required_attrs) /
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_ATTRIBUTE_TESTER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (handle == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys CLEAR_ERROR(handle, ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = test_attributes(num_req_attrs, required_attrs,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys 0, NULL, num_args, attrlist);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (ret != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This framework function is actually implemented in the openssl
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * plugin library, so we find the function address and call it.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (plugin == NULL || plugin->dldesc == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys getCertStatusFn = (KMF_RETURN(*)())dlsym(plugin->dldesc,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys "OpenSSL_GetOCSPStatusForCert");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (getCertStatusFn == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_INTERNAL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (getCertStatusFn(handle, num_args, attrlist));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_string_to_oid(char *oidstring, KMF_OID *oid)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *cp, *bp, *startp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int numbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int onumbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int nbytes, index;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys unsigned char *op;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (oidstring == NULL || oid == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys len = strlen(oidstring);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp = oidstring;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys cp = bp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Skip over leading space */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((bp < &cp[len]) && isspace(*bp))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys startp = bp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nbytes = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The first two numbers are chewed up by the first octet.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (sscanf(bp, "%d", &numbuf) != 1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((bp < &cp[len]) && isdigit(*bp))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (sscanf(bp, "%d", &numbuf) != 1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((bp < &cp[len]) && isdigit(*bp))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nbytes++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isdigit(*bp)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (sscanf(bp, "%d", &numbuf) != 1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (numbuf) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nbytes++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys numbuf >>= 7;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((bp < &cp[len]) && isdigit(*bp))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys oid->Length = nbytes;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys oid->Data = malloc(oid->Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (oid->Data == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(oid->Data, 0, oid->Length);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys op = oid->Data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys bp = startp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sscanf(bp, "%d", &numbuf);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isdigit(*bp)) bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isspace(*bp) || *bp == '.') bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys onumbuf = 40 * numbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sscanf(bp, "%d", &numbuf);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys onumbuf += numbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *op = (unsigned char) onumbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys op++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isdigit(*bp)) bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isspace(*bp) || *bp == '.') bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isdigit(*bp)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) sscanf(bp, "%d", &numbuf);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nbytes = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Have to fill in the bytes msb-first */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys onumbuf = numbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (numbuf) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nbytes++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys numbuf >>= 7;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys numbuf = onumbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys op += nbytes;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys index = -1;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (numbuf) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys op[index] = (unsigned char)numbuf & 0x7f;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (index != -1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys op[index] |= 0x80;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys index--;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys numbuf >>= 7;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isdigit(*bp)) bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys while (isspace(*bp) || *bp == '.') bp++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysencode_rid(char *name, KMF_DATA *derdata)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (name == NULL || derdata == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_string_to_oid(name, (KMF_OID *)derdata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysencode_ipaddr(char *name, KMF_DATA *derdata)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN rv = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys size_t len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys in_addr_t v4;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys in6_addr_t v6;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint8_t *ptr;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (name == NULL || derdata == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys v4 = inet_addr(name);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (v4 == (in_addr_t)-1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ptr = (uint8_t *)&v6;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (inet_pton(AF_INET6, name, ptr) != 1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_ENCODING);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys len = sizeof (v6);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ptr = (uint8_t *)&v4;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys len = sizeof (v4);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys derdata->Data = malloc(len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (derdata->Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(derdata->Data, ptr, len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys derdata->Length = len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rv);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllysstatic KMF_RETURN
d00756ccb34596a328f8a15d1965da5412d366d0wyllysencode_krb5(char *name, KMF_DATA *derdata)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys{
d00756ccb34596a328f8a15d1965da5412d366d0wyllys KMF_RETURN rv = KMF_OK;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys char *at, *realm;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll char *slash, *inst = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys BerElement *asn1 = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys BerValue *extdata = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys at = strchr(name, '@');
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (at == NULL)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (KMF_ERR_ENCODING);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll realm = at + 1;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys *at = 0;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll /*
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * KRB5PrincipalName ::= SEQUENCE {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * realm [0] Realm,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * principalName [1] PrincipalName
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll *
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * KerberosString ::= GeneralString (IA5String)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * Realm ::= KerberosString
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * PrincipalName ::= SEQUENCE {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * name-type [0] Int32,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * name-string [1] SEQUENCE OF KerberosString
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll */
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll /*
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * Construct the "principalName" first.
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll *
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * The name may be split with a "/" to indicate a new instance.
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * This must be separated in the ASN.1
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll */
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll slash = strchr(name, '/');
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (slash != NULL) {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll inst = name;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll name = slash + 1;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll *slash = 0;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if ((asn1 = kmfder_alloc()) == NULL) {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll rv = KMF_ERR_MEMORY;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "{Tli", 0xa0, 3, 0x01) == -1)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (inst != NULL) {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "Tl{Tl", 0xA1,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll strlen(inst) + strlen(name) + 6,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll BER_GENERALSTRING, strlen(inst)) == -1)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_write(asn1, inst, strlen(inst), 0) != strlen(inst))
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "Tl", BER_GENERALSTRING,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll strlen(name)) == -1)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_write(asn1, name, strlen(name), 0) != strlen(name))
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll } else {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "Tl{Tl", 0xA1,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll strlen(name) + 4, BER_GENERALSTRING, strlen(name)) == -1)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_write(asn1, name, strlen(name), 0) != strlen(name))
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll }
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "}}") == -1)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_flatten(asn1, &extdata) == -1) {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll rv = KMF_ERR_ENCODING;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_free(asn1, 1);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll asn1 = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll /* Next construct the KRB5PrincipalNameSeq */
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if ((asn1 = kmfder_alloc()) == NULL) {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_bvfree(extdata);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll rv = KMF_ERR_MEMORY;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "{TlTl", 0xA0, strlen(realm) + 2,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll BER_GENERALSTRING, strlen(realm)) == -1)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (kmfber_write(asn1, realm, strlen(realm), 0) != strlen(realm))
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "Tl", 0xA1, extdata->bv_len) == -1)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_write(asn1, extdata->bv_val,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll extdata->bv_len, 0) != extdata->bv_len)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "}") == -1)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_bvfree(extdata);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll extdata = NULL;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_flatten(asn1, &extdata) == -1) {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll rv = KMF_ERR_ENCODING;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_free(asn1, 1);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll asn1 = NULL;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll /*
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * GeneralName ::= CHOICE {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * otherName [0] OtherName,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * ...
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll *
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * OtherName ::= SEQUENCE {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * type-id OBJECT IDENTIFIER,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * value [0] EXPLICIT ANY DEFINED BY type-id
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll * }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll /* Now construct the SAN: OID + typed data. */
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if ((asn1 = kmfder_alloc()) == NULL) {
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_bvfree(extdata);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll rv = KMF_ERR_MEMORY;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "D", &KMFOID_PKINIT_san) == -1)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_printf(asn1, "Tl", 0xA0, extdata->bv_len) == -1)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (kmfber_write(asn1, extdata->bv_val,
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll extdata->bv_len, 0) != extdata->bv_len)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll goto cleanup;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_bvfree(extdata);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll extdata = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (kmfber_flatten(asn1, &extdata) == -1) {
d00756ccb34596a328f8a15d1965da5412d366d0wyllys rv = KMF_ERR_ENCODING;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys }
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_free(asn1, 1);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll asn1 = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys derdata->Data = (uchar_t *)extdata->bv_val;
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll extdata->bv_val = NULL; /* clear it so it is not freed later */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys derdata->Length = extdata->bv_len;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllyscleanup:
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (asn1 != NULL)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys kmfber_free(asn1, 1);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (extdata != NULL)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll kmfber_bvfree(extdata);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (*at == 0)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys *at = '@';
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll if (inst != NULL)
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll *slash = '/';
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (rv);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys}
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllysstatic KMF_RETURN
d00756ccb34596a328f8a15d1965da5412d366d0wyllysencode_sclogon(char *name, KMF_DATA *derdata)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys{
d00756ccb34596a328f8a15d1965da5412d366d0wyllys KMF_RETURN rv = KMF_OK;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys BerElement *asn1 = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys BerValue *extdata = NULL;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if ((asn1 = kmfder_alloc()) == NULL)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (KMF_ERR_MEMORY);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys /* The name is encoded as a KerberosString (IA5STRING) */
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (kmfber_printf(asn1, "{Ds}",
d00756ccb34596a328f8a15d1965da5412d366d0wyllys &KMFOID_MS_KP_SCLogon, name) == -1)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (kmfber_flatten(asn1, &extdata) == -1) {
d00756ccb34596a328f8a15d1965da5412d366d0wyllys rv = KMF_ERR_ENCODING;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys goto cleanup;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys }
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys derdata->Data = (uchar_t *)extdata->bv_val;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys derdata->Length = extdata->bv_len;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys free(extdata);
d00756ccb34596a328f8a15d1965da5412d366d0wyllyscleanup:
d00756ccb34596a328f8a15d1965da5412d366d0wyllys if (asn1 != NULL)
d00756ccb34596a328f8a15d1965da5412d366d0wyllys kmfber_free(asn1, 1);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
d00756ccb34596a328f8a15d1965da5412d366d0wyllys return (rv);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys}
d00756ccb34596a328f8a15d1965da5412d366d0wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysverify_uri_format(char *uristring)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys xmlURIPtr uriptr = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Parse the URI string; get the hostname and port */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uriptr = xmlParseURI(uristring);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (uriptr == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_URI;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (uriptr->scheme == NULL || !strlen(uriptr->scheme)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_URI;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (uriptr->server == NULL || !strlen(uriptr->server)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_BAD_URI;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (uriptr != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys xmlFreeURI(uriptr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysstatic KMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysencode_altname(char *namedata,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_GENERALNAMECHOICES nametype, KMF_DATA *encodedname)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_NAME dnname;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uchar_t tagval;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerElement *asn1 = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerValue *extdata;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (namedata == NULL || encodedname == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Encode the namedata according to rules in RFC 3280 for GeneralName.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * The input "namedata" is assumed to be an ASCII string representation
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * of the AltName, we need to convert it to correct ASN.1 here before
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * adding it to the cert.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys switch (nametype) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case GENNAME_RFC822NAME: /* rfc 822 */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* IA5String, no encoding needed */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Data = (uchar_t *)strdup(namedata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (encodedname->Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Length = strlen(namedata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tagval = (0x80 | nametype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case GENNAME_DNSNAME: /* rfc 1034 */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Data = (uchar_t *)strdup(namedata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (encodedname->Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Length = strlen(namedata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tagval = (0x80 | nametype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case GENNAME_URI: /* rfc 1738 */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = verify_uri_format(namedata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* IA5String, no encoding needed */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Data = (uchar_t *)strdup(namedata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (encodedname->Data == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Length = strlen(namedata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tagval = (0x80 | nametype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case GENNAME_IPADDRESS:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = encode_ipaddr(namedata, encodedname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tagval = (0x80 | nametype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case GENNAME_REGISTEREDID:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = encode_rid(namedata, encodedname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tagval = (0x80 | nametype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys case GENNAME_DIRECTORYNAME:
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = kmf_dn_parser(namedata, &dnname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret == KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = DerEncodeName(&dnname, encodedname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) kmf_free_dn(&dnname);
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll tagval = (0x80 | nametype);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys case GENNAME_KRB5PRINC:
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll tagval = (0xA0 | GENNAME_OTHERNAME);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys ret = encode_krb5(namedata, encodedname);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys break;
d00756ccb34596a328f8a15d1965da5412d366d0wyllys case GENNAME_SCLOGON_UPN:
56664548661c43ae04de4a32bce3510ed36aeaf9Wyllys Ingersoll tagval = (0xA0 | GENNAME_OTHERNAME);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys ret = encode_sclogon(namedata, encodedname);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys default:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* unsupported */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(encodedname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((asn1 = kmfder_alloc()) == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (kmfber_printf(asn1, "Tl", tagval, encodedname->Length) == -1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_write(asn1, (char *)encodedname->Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys encodedname->Length, 0) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_flatten(asn1, &extdata) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto cleanup;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(encodedname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Data = (uchar_t *)extdata->bv_val;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys encodedname->Length = extdata->bv_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(extdata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscleanup:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (asn1)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(encodedname);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_X509_EXTENSION *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysFindExtn(KMF_X509_EXTENSIONS *exts, KMF_OID *oid)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_EXTENSION *foundextn = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (exts == NULL || oid == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < exts->numberOfExtensions; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (IsEqualOid(oid, &exts->extensions[i].extnId)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys foundextn = &exts->extensions[i];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys break;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (foundextn);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysGetSequenceContents(char *data, size_t len,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char **contents, size_t *outlen)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerElement *exasn1 = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerValue oldextn;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int tag;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys size_t oldsize;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *olddata = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (data == NULL || contents == NULL || outlen == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Decode the sequence of general names
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys oldextn.bv_val = data;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys oldextn.bv_len = len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((exasn1 = kmfder_init(&oldextn)) == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Unwrap the sequence to find the size of the block
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * of GeneralName items in the set.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Peek at the tag and length ("tl"),
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * then consume them ("{").
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_scanf(exasn1, "tl{", &tag, &oldsize) == KMFBER_DEFAULT ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys oldsize == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys olddata = malloc(oldsize);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (olddata == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_MEMORY;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(olddata, 0, oldsize);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Read the entire blob of GeneralNames, we don't
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * need to interpret them now.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_read(exasn1, olddata, oldsize) != oldsize) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (exasn1 != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(exasn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *contents = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outlen = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (olddata != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(olddata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *contents = olddata;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *outlen = oldsize;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysadd_an_extension(KMF_X509_EXTENSIONS *exts, KMF_X509_EXTENSION *newextn)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_EXTENSION *extlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (exts == NULL || newextn == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys extlist = malloc(sizeof (KMF_X509_EXTENSION) *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (exts->numberOfExtensions + 1));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (extlist == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(extlist, exts->extensions,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys exts->numberOfExtensions * sizeof (KMF_X509_EXTENSION));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memcpy(&extlist[exts->numberOfExtensions], newextn,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys sizeof (KMF_X509_EXTENSION));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(exts->extensions);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys exts->numberOfExtensions++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys exts->extensions = extlist;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_set_altname(KMF_X509_EXTENSIONS *extensions,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_OID *oid,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int critical,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_GENERALNAMECHOICES nametype,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *namedata)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_RETURN ret = KMF_OK;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_EXTENSION subjAltName;
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO KMF_DATA dername = { 0, NULL };
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerElement *asn1 = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys BerValue *extdata;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *olddata = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys KMF_X509_EXTENSION *foundextn = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys size_t oldsize = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (extensions == NULL || oid == NULL || namedata == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_BAD_PARAMETER);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = encode_altname(namedata, nametype, &dername);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) memset(&subjAltName, 0, sizeof (subjAltName));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = copy_data(&subjAltName.extnId, oid);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Check to see if this cert already has a subjectAltName.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys foundextn = FindExtn(extensions, oid);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (foundextn != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = GetSequenceContents(
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (char *)foundextn->BERvalue.Data,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys foundextn->BERvalue.Length,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &olddata, &oldsize);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Assume (!!) that the namedata given is already properly encoded.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((asn1 = kmfder_alloc()) == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (KMF_ERR_MEMORY);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_printf(asn1, "{") == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Write the old extension data first */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (olddata != NULL && oldsize > 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_write(asn1, olddata, oldsize, 0) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now add the new name to the list */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_write(asn1, (char *)dername.Data, dername.Length, 0) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Now close the sequence */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_printf(asn1, "}") == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (kmfber_flatten(asn1, &extdata) == -1) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = KMF_ERR_ENCODING;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys goto out;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * If we are just adding to an existing list of altNames,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * just replace the BER data associated with the found extension.
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (foundextn != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(foundextn->BERvalue.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys foundextn->critical = critical;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys foundextn->BERvalue.Data = (uchar_t *)extdata->bv_val;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys foundextn->BERvalue.Length = extdata->bv_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subjAltName.critical = critical;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subjAltName.format = KMF_X509_DATAFORMAT_ENCODED;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subjAltName.BERvalue.Data = (uchar_t *)extdata->bv_val;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys subjAltName.BERvalue.Length = extdata->bv_len;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys ret = add_an_extension(extensions, &subjAltName);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(subjAltName.BERvalue.Data);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(extdata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysout:
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (olddata != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys free(olddata);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&dername);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (ret != KMF_OK)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys kmf_free_data(&subjAltName.extnId);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (asn1 != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys kmfber_free(asn1, 1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (ret);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Search a list of attributes for one that matches the given type.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Return a pointer into the attribute list. This does not
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * return a copy of the value, it returns a reference into the
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * given list.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysint
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_find_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist, int numattrs)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < numattrs; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (attlist[i].type == type)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (i);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (-1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Verify that a given attribute is consistent with the
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * "test" attribute.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysstatic KMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysverify_attribute(KMF_ATTRIBUTE *givenattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTRIBUTE_TESTER *testattr)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* A NULL pValue was found where one is required */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (testattr->null_value_ok == FALSE &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys givenattr->pValue == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* If the given valueLen is too small, return error */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (givenattr->pValue != NULL &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys testattr->minlen > 0 &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (givenattr->valueLen < testattr->minlen))
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* If the given valueLen is too big, return error */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (givenattr->pValue != NULL &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys testattr->maxlen > 0 &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (givenattr->valueLen > testattr->maxlen))
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_OK);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Given a set of required attribute tests and optional
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * attributes, make sure that the actual attributes
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * being tested (attrlist below) are allowed and are
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * properly specified.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllystest_attributes(int reqnum, KMF_ATTRIBUTE_TESTER *reqattrs,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int optnum, KMF_ATTRIBUTE_TESTER *optattrs,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattrs, KMF_ATTRIBUTE *attrlist)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN ret = KMF_OK;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i, idx;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * If the caller didn't supply enough attributes,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * return an error.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (numattrs < reqnum || attrlist == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Make sure all required attrs are present and
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * correct.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < reqnum && ret == KMF_OK; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys idx = kmf_find_attr(reqattrs[i].type, attrlist, numattrs);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* If a required attr is not found, return error */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (idx == -1) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = verify_attribute(&attrlist[idx], &reqattrs[i]);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Now test the optional parameters.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < optnum && ret == KMF_OK; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys idx = kmf_find_attr(optattrs[i].type, attrlist, numattrs);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* If a optional attr is not found, continue. */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (idx == -1) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys continue;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys ret = verify_attribute(&attrlist[idx], &optattrs[i]);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (ret);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Given an already allocated attribute list, insert
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * the given attribute information at a specific index
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * in the list.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysvoid
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_set_attr_at_index(KMF_ATTRIBUTE *attlist, int index,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTR_TYPE type, void *pValue, uint32_t len)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (attlist == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attlist[index].type = type;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attlist[index].pValue = pValue;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attlist[index].valueLen = len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Find an attribute matching a particular type and set
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * the pValue and length fields to the given values.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_set_attr(KMF_ATTRIBUTE *attlist, int numattr,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_ATTR_TYPE type, void *pValue, uint32_t len)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int idx;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (attlist == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys idx = kmf_find_attr(type, attlist, numattr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (idx == -1)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_ATTR_NOT_FOUND);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attlist[idx].type = type;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* Assumes the attribute pValue can hold the result */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (attlist[idx].pValue != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (attlist[idx].valueLen >= len)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memcpy(attlist[idx].pValue, pValue, len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys else
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BUFFER_SIZE);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attlist[idx].valueLen = len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_OK);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Find a particular attribute in a list and return
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * a pointer to its value.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysvoid *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_get_attr_ptr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattrs)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i = kmf_find_attr(type, attlist, numattrs);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (i == -1)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (attlist[i].pValue);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Find a particular attribute in a list and return
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * the value and length values. Value and length
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * may be NULL if the caller doesn't want their values
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * to be filled in.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_get_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattrs, void *outValue, uint32_t *outlen)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t len = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t *lenptr = outlen;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (lenptr == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys lenptr = &len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys i = kmf_find_attr(type, attlist, numattrs);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (i == -1)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_ATTR_NOT_FOUND);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /* This assumes that the ptr passed in is pre-allocated space */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (attlist[i].pValue != NULL && outValue != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * If the caller did not specify a length,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * assume "outValue" is big enough.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (outlen != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (*outlen >= attlist[i].valueLen)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memcpy(outValue, attlist[i].pValue,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attlist[i].valueLen);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys else
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BUFFER_SIZE);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memcpy(outValue, attlist[i].pValue,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys attlist[i].valueLen);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (outlen != NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys *outlen = attlist[i].valueLen;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_OK);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * Utility routine to find a string type attribute, allocate it
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * and return the value to the caller. This simplifies the
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * operation by doing both "kmf_get_attr" calls and avoids
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * duplicating this block of code in lots of places.
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysKMF_RETURN
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyskmf_get_string_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attrlist,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int numattrs, char **outstr)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_RETURN rv;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (outstr == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_BAD_PARAMETER);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((rv = kmf_get_attr(type, attrlist, numattrs, NULL, &len)) ==
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys *outstr = malloc(len + 1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((*outstr) == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (KMF_ERR_MEMORY);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) memset((*outstr), 0, len + 1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rv = kmf_get_attr(type, attrlist, numattrs, (*outstr), &len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (rv != KMF_OK) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys free(*outstr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys *outstr = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rv);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleevoid
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleefree_entry(conf_entry_t *entry)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee{
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (entry == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free(entry->keystore);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free(entry->modulepath);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free(entry->option);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee}
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleevoid
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleefree_entrylist(conf_entrylist_t *list)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee{
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entrylist_t *next;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee while (list != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee next = list->next;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free_entry(list->entry);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free(list);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee list = next;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee}
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleestatic KMF_RETURN
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeparse_entry(char *buf, conf_entry_t **entry)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee{
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee KMF_RETURN ret = KMF_OK;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entry_t *tmp = NULL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *token1;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *token2;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *token3;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *lasts;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char *value;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((token1 = strtok_r(buf, SEP_COLON, &lasts)) == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (KMF_ERR_KMF_CONF);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((tmp = calloc(sizeof (conf_entry_t), 1)) == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (KMF_ERR_MEMORY);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((tmp->keystore = strdup(token1)) == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_MEMORY;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((token2 = strtok_r(NULL, SEP_SEMICOLON, &lasts)) == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_KMF_CONF;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /* need to get token3 first to satisfy nested strtok invocations */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee token3 = strtok_r(NULL, SEP_SEMICOLON, &lasts);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /* parse token2 */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (strncmp(token2, CONF_MODULEPATH, strlen(CONF_MODULEPATH)) != 0) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_KMF_CONF;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (value = strpbrk(token2, SEP_EQUAL)) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee value++; /* get rid of = */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_KMF_CONF;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((tmp->modulepath = strdup(value)) == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_MEMORY;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /* parse token3, if it exists */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (token3 != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (strncmp(token3, CONF_OPTION, strlen(CONF_OPTION))
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee != 0) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_KMF_CONF;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (value = strpbrk(token3, SEP_EQUAL)) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee value++; /* get rid of = */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_KMF_CONF;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((tmp->option = strdup(value)) == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_MEMORY;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *entry = tmp;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeend:
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (ret != KMF_OK) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free_entry(tmp);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free(tmp);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (ret);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee}
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeconf_entry_t *
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleedup_entry(conf_entry_t *entry)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee{
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entry_t *rtn_entry;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (entry == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (NULL);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee rtn_entry = malloc(sizeof (conf_entry_t));
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (rtn_entry == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (NULL);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((rtn_entry->keystore = strdup(entry->keystore)) == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((rtn_entry->modulepath = strdup(entry->modulepath)) == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (entry->option != NULL &&
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (rtn_entry->option = strdup(entry->modulepath)) == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (rtn_entry);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeout:
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free_entry(rtn_entry);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (NULL);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee}
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee/*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * This function takes a keystore_name as input and returns
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * the KMF_KEYSTORE_TYPE value assigned to it. If the "option"
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * argument is not NULL, this function also returns the option string
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * if there is an option string for the plugin module.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeKMF_RETURN
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleekmf_get_plugin_info(KMF_HANDLE_T handle, char *keystore_name,
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee KMF_KEYSTORE_TYPE *kstype, char **option)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee{
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee KMF_RETURN ret = KMF_OK;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entrylist_t *phead = extra_plugin_list;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee boolean_t is_default = B_TRUE;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * Although handle is not really used in the function, we will
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * check the handle to make sure that kmf_intialize() is called
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * before this function.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (handle == NULL || keystore_name == NULL || kstype == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (KMF_ERR_BAD_PARAMETER);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (strcmp(keystore_name, "pkcs11") == 0) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *kstype = KMF_KEYSTORE_PK11TOKEN;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else if (strcmp(keystore_name, "file") == 0) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *kstype = KMF_KEYSTORE_OPENSSL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else if (strcmp(keystore_name, "nss") == 0) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *kstype = KMF_KEYSTORE_NSS;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee is_default = B_FALSE;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (is_default) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (option != NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *option = NULL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /* Not a built-in plugin; check if it is in extra_plugin_list. */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee while (phead != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (strcmp(phead->entry->keystore, keystore_name) == 0)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee break;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee phead = phead->next;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (phead == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_PLUGIN_NOTFOUND;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee /* found it */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *kstype = phead->entry->kstype;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (option != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (phead->entry->option == NULL)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *option = NULL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *option = strdup(phead->entry->option);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (*option == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ret = KMF_ERR_MEMORY;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto out;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeout:
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (ret);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee}
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee/*
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee * Retrieve the non-default plugin list from the kmf.conf file.
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeKMF_RETURN
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeget_entrylist(conf_entrylist_t **entlist)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee{
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee KMF_RETURN rv = KMF_OK;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee FILE *pfile;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entry_t *entry;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entrylist_t *rtnlist = NULL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entrylist_t *ptmp;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee conf_entrylist_t *pcur;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee char buffer[MAXPATHLEN];
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee size_t len;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((pfile = fopen(_PATH_KMF_CONF, "rF")) == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee cryptoerror(LOG_ERR, "failed to open %s.\n", _PATH_KMF_CONF);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (KMF_ERR_KMF_CONF);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee while (fgets(buffer, MAXPATHLEN, pfile) != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (buffer[0] == '#' || buffer[0] == ' ' ||
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee buffer[0] == '\n'|| buffer[0] == '\t') {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee continue; /* ignore comment lines */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee len = strlen(buffer);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (buffer[len-1] == '\n') { /* get rid of trailing '\n' */
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee len--;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee buffer[len] = '\0';
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee rv = parse_entry(buffer, &entry);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (rv != KMF_OK) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((ptmp = malloc(sizeof (conf_entrylist_t))) == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee rv = KMF_ERR_MEMORY;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee goto end;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ptmp->entry = entry;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee ptmp->next = NULL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (rtnlist == NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee rtnlist = pcur = ptmp;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee pcur->next = ptmp;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee pcur = ptmp;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeend:
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee (void) fclose(pfile);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (rv == KMF_OK) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *entlist = rtnlist;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee } else if (rtnlist != NULL) {
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee free_entrylist(rtnlist);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee *entlist = NULL;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee kstore_num = DEFAULT_KEYSTORE_NUM;
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee }
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (rv);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee}
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeboolean_t
431deaa01ac039d796fdfaf86b909a75e7d9ac48hyleeis_valid_keystore_type(KMF_KEYSTORE_TYPE kstype)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee{
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if (kstype > 0 && kstype <= kstore_num)
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (B_TRUE);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee else
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee return (B_FALSE);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee}