usr/src/lib/libkmf/libkmf/common/generalop.c
author Wyllys Ingersoll <wyllys.ingersoll@sun.com>
Tue, 20 Oct 2009 09:39:20 -0700
changeset 10818 89e8703947be
parent 10123 d9be114e78c4
child 11462 0e7751e37640
permissions -rw-r--r--
6889197 libkmf uses realloc incorrectly 6889730 pktool fails to add EKUs to CSR and Cert requests 6889224 pktool incorrectly generates SAN
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     1
/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     2
 * CDDL HEADER START
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     3
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     7
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    11
 * and limitations under the License.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    12
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    18
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    19
 * CDDL HEADER END
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    20
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    21
/*
10123
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    23
 * Use is subject to license terms.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    24
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    25
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    26
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    27
#include <stdio.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    28
#include <dlfcn.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    29
#include <link.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    30
#include <fcntl.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    31
#include <ctype.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    32
#include <sys/param.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    33
#include <sys/types.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    34
#include <sys/stat.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    35
#include <errno.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    36
#include <sys/socket.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    37
#include <netinet/in.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    38
#include <arpa/inet.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    39
#include <thread.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    40
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    41
#include <ber_der.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    42
#include <kmfapiP.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    43
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    44
#include <pem_encode.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    45
#include <rdn_parser.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    46
#include <libxml2/libxml/uri.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    47
#include <libgen.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    48
#include <cryptoutil.h>
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    49
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    50
static uchar_t pkcs11_initialized = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    51
mutex_t init_lock = DEFAULTMUTEX;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    52
extern int errno;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    53
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    54
typedef struct {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    55
	KMF_RETURN code;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    56
	char	*message;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    57
} kmf_error_map;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    58
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    59
static kmf_error_map kmf_errcodes[] = {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    60
	{KMF_OK,	"KMF_OK"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    61
	{KMF_ERR_BAD_PARAMETER,	"KMF_ERR_BAD_PARAMETER"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    62
	{KMF_ERR_BAD_KEY_FORMAT,	"KMF_ERR_BAD_KEY_FORMAT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    63
	{KMF_ERR_BAD_ALGORITHM,	"KMF_ERR_BAD_ALGORITHM"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    64
	{KMF_ERR_MEMORY,	"KMF_ERR_MEMORY"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    65
	{KMF_ERR_ENCODING,	"KMF_ERR_ENCODING"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    66
	{KMF_ERR_PLUGIN_INIT,	"KMF_ERR_PLUGIN_INIT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    67
	{KMF_ERR_PLUGIN_NOTFOUND,	"KMF_ERR_PLUGIN_NOTFOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    68
	{KMF_ERR_INTERNAL,	"KMF_ERR_INTERNAL"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    69
	{KMF_ERR_BAD_CERT_FORMAT,	"KMF_ERR_BAD_CERT_FORMAT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    70
	{KMF_ERR_KEYGEN_FAILED,	"KMF_ERR_KEYGEN_FAILED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    71
	{KMF_ERR_UNINITIALIZED,	"KMF_ERR_UNINITIALIZED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    72
	{KMF_ERR_ISSUER,	"KMF_ERR_ISSUER"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    73
	{KMF_ERR_NOT_REVOKED,	"KMF_ERR_NOT_REVOKED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    74
	{KMF_ERR_CERT_NOT_FOUND,	"KMF_ERR_CERT_NOT_FOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    75
	{KMF_ERR_CRL_NOT_FOUND,	"KMF_ERR_CRL_NOT_FOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    76
	{KMF_ERR_RDN_PARSER,	"KMF_ERR_RDN_PARSER"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    77
	{KMF_ERR_RDN_ATTR,	"KMF_ERR_RDN_ATTR"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    78
	{KMF_ERR_SLOTNAME,	"KMF_ERR_SLOTNAME"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    79
	{KMF_ERR_EMPTY_CRL,	"KMF_ERR_EMPTY_CRL"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    80
	{KMF_ERR_BUFFER_SIZE,	"KMF_ERR_BUFFER_SIZE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    81
	{KMF_ERR_AUTH_FAILED,	"KMF_ERR_AUTH_FAILED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    82
	{KMF_ERR_TOKEN_SELECTED,	"KMF_ERR_TOKEN_SELECTED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    83
	{KMF_ERR_NO_TOKEN_SELECTED,	"KMF_ERR_NO_TOKEN_SELECTED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    84
	{KMF_ERR_TOKEN_NOT_PRESENT,	"KMF_ERR_TOKEN_NOT_PRESENT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    85
	{KMF_ERR_EXTENSION_NOT_FOUND,	"KMF_ERR_EXTENSION_NOT_FOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    86
	{KMF_ERR_POLICY_ENGINE,	"KMF_ERR_POLICY_ENGINE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    87
	{KMF_ERR_POLICY_DB_FORMAT,	"KMF_ERR_POLICY_DB_FORMAT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    88
	{KMF_ERR_POLICY_NOT_FOUND,	"KMF_ERR_POLICY_NOT_FOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    89
	{KMF_ERR_POLICY_DB_FILE,	"KMF_ERR_POLICY_DB_FILE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    90
	{KMF_ERR_POLICY_NAME,	"KMF_ERR_POLICY_NAME"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    91
	{KMF_ERR_OCSP_POLICY,	"KMF_ERR_OCSP_POLICY"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    92
	{KMF_ERR_TA_POLICY,	"KMF_ERR_TA_POLICY"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    93
	{KMF_ERR_KEY_NOT_FOUND,	"KMF_ERR_KEY_NOT_FOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    94
	{KMF_ERR_OPEN_FILE,	"KMF_ERR_OPEN_FILE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    95
	{KMF_ERR_OCSP_BAD_ISSUER,	"KMF_ERR_OCSP_BAD_ISSUER"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    96
	{KMF_ERR_OCSP_BAD_CERT,	"KMF_ERR_OCSP_BAD_CERT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    97
	{KMF_ERR_OCSP_CREATE_REQUEST,	"KMF_ERR_OCSP_CREATE_REQUEST"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    98
	{KMF_ERR_CONNECT_SERVER,	"KMF_ERR_CONNECT_SERVER"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
    99
	{KMF_ERR_SEND_REQUEST,	"KMF_ERR_SEND_REQUEST"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   100
	{KMF_ERR_OCSP_CERTID,	"KMF_ERR_OCSP_CERTID"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   101
	{KMF_ERR_OCSP_MALFORMED_RESPONSE, "KMF_ERR_OCSP_MALFORMED_RESPONSE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   102
	{KMF_ERR_OCSP_RESPONSE_STATUS,	"KMF_ERR_OCSP_RESPONSE_STATUS"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   103
	{KMF_ERR_OCSP_NO_BASIC_RESPONSE, "KMF_ERR_OCSP_NO_BASIC_RESPONSE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   104
	{KMF_ERR_OCSP_BAD_SIGNER,	"KMF_ERR_OCSP_BAD_SIGNER"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   105
	{KMF_ERR_OCSP_RESPONSE_SIGNATURE, "KMF_ERR_OCSP_RESPONSE_SIGNATURE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   106
	{KMF_ERR_OCSP_UNKNOWN_CERT,	"KMF_ERR_OCSP_UNKNOWN_CERT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   107
	{KMF_ERR_OCSP_STATUS_TIME_INVALID, "KMF_ERR_OCSP_STATUS_TIME_INVALID"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   108
	{KMF_ERR_BAD_HTTP_RESPONSE,	"KMF_ERR_BAD_HTTP_RESPONSE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   109
	{KMF_ERR_RECV_RESPONSE,	"KMF_ERR_RECV_RESPONSE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   110
	{KMF_ERR_RECV_TIMEOUT,	"KMF_ERR_RECV_TIMEOUT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   111
	{KMF_ERR_DUPLICATE_KEYFILE,	"KMF_ERR_DUPLICATE_KEYFILE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   112
	{KMF_ERR_AMBIGUOUS_PATHNAME,	"KMF_ERR_AMBIGUOUS_PATHNAME"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   113
	{KMF_ERR_FUNCTION_NOT_FOUND,	"KMF_ERR_FUNCTION_NOT_FOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   114
	{KMF_ERR_PKCS12_FORMAT,	"KMF_ERR_PKCS12_FORMAT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   115
	{KMF_ERR_BAD_KEY_TYPE,	"KMF_ERR_BAD_KEY_TYPE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   116
	{KMF_ERR_BAD_KEY_CLASS,	"KMF_ERR_BAD_KEY_CLASS"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   117
	{KMF_ERR_BAD_KEY_SIZE,	"KMF_ERR_BAD_KEY_SIZE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   118
	{KMF_ERR_BAD_HEX_STRING,	"KMF_ERR_BAD_HEX_STRING"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   119
	{KMF_ERR_KEYUSAGE,	"KMF_ERR_KEYUSAGE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   120
	{KMF_ERR_VALIDITY_PERIOD,	"KMF_ERR_VALIDITY_PERIOD"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   121
	{KMF_ERR_OCSP_REVOKED,	"KMF_ERR_OCSP_REVOKED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   122
	{KMF_ERR_CERT_MULTIPLE_FOUND,	"KMF_ERR_CERT_MULTIPLE_FOUND"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   123
	{KMF_ERR_WRITE_FILE,	"KMF_ERR_WRITE_FILE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   124
	{KMF_ERR_BAD_URI,	"KMF_ERR_BAD_URI"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   125
	{KMF_ERR_BAD_CRLFILE,	"KMF_ERR_BAD_CRLFILE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   126
	{KMF_ERR_BAD_CERTFILE,	"KMF_ERR_BAD_CERTFILE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   127
	{KMF_ERR_GETKEYVALUE_FAILED,	"KMF_ERR_GETKEYVALUE_FAILED"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   128
	{KMF_ERR_BAD_KEYHANDLE,	"KMF_ERR_BAD_KEYHANDLE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   129
	{KMF_ERR_BAD_OBJECT_TYPE,	"KMF_ERR_BAD_OBJECT_TYPE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   130
	{KMF_ERR_OCSP_RESPONSE_LIFETIME, "KMF_ERR_OCSP_RESPONSE_LIFETIME"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   131
	{KMF_ERR_UNKNOWN_CSR_ATTRIBUTE,	"KMF_ERR_UNKNOWN_CSR_ATTRIBUTE"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   132
	{KMF_ERR_UNINITIALIZED_TOKEN,	"KMF_ERR_UNINITIALIZED_TOKEN"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   133
	{KMF_ERR_INCOMPLETE_TBS_CERT,	"KMF_ERR_INCOMPLETE_TBS_CERT"},
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   134
	{KMF_ERR_MISSING_ERRCODE,	"KMF_ERR_MISSING_ERRCODE"},
3408
67ca9373b99e 6501154 kssladm could use KMF
wyllys
parents: 3089
diff changeset
   135
	{KMF_KEYSTORE_ALREADY_INITIALIZED, "KMF_KEYSTORE_ALREADY_INITIALIZED"},
67ca9373b99e 6501154 kssladm could use KMF
wyllys
parents: 3089
diff changeset
   136
	{KMF_ERR_SENSITIVE_KEY,		"KMF_ERR_SENSITIVE_KEY"},
67ca9373b99e 6501154 kssladm could use KMF
wyllys
parents: 3089
diff changeset
   137
	{KMF_ERR_UNEXTRACTABLE_KEY,	"KMF_ERR_UNEXTRACTABLE_KEY"},
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   138
	{KMF_ERR_KEY_MISMATCH,		"KMF_ERR_KEY_MISMATCH"},
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   139
	{KMF_ERR_ATTR_NOT_FOUND,	"KMF_ERR_ATTR_NOT_FOUND"},
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   140
	{KMF_ERR_KMF_CONF,		"KMF_ERR_KMF_CONF"}
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   141
};
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   142
4122
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   143
typedef struct {
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   144
	KMF_KEYSTORE_TYPE	kstype;
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   145
	char			*path;
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   146
	boolean_t		critical;
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   147
} KMF_PLUGIN_ITEM;
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   148
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   149
KMF_PLUGIN_ITEM plugin_list[] = {
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   150
	{KMF_KEYSTORE_OPENSSL,	KMF_PLUGIN_PATH "kmf_openssl.so.1",  TRUE},
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   151
	{KMF_KEYSTORE_PK11TOKEN, KMF_PLUGIN_PATH "kmf_pkcs11.so.1",  TRUE},
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   152
	{KMF_KEYSTORE_NSS,	KMF_PLUGIN_PATH "kmf_nss.so.1",  FALSE}
ff19cef282d8 6550297 elfsign mysteriously fails with missing packages
wyllys
parents: 3951
diff changeset
   153
};
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   154
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   155
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   156
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   157
static KMF_RETURN InitializePlugin(KMF_KEYSTORE_TYPE, char *, KMF_PLUGIN **);
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   158
static KMF_RETURN AddPlugin(KMF_HANDLE_T, KMF_PLUGIN *);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   159
static void free_extensions(KMF_X509_EXTENSIONS *extns);
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   160
static void DestroyPlugin(KMF_PLUGIN *);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   161
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   162
#if defined(__sparcv9)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   163
#define	ISA_PATH	"/sparcv9"
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   164
#elif defined(__sparc)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   165
#define	ISA_PATH	"/"
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   166
#elif defined(__i386)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   167
#define	ISA_PATH	"/"
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   168
#elif defined(__amd64)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   169
#define	ISA_PATH	"/amd64"
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   170
#endif
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   171
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   172
#define	DEFAULT_KEYSTORE_NUM	3
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   173
static int kstore_num = DEFAULT_KEYSTORE_NUM;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   174
conf_entrylist_t *extra_plugin_list = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   175
static boolean_t check_extra_plugin = B_FALSE;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   176
mutex_t extra_plugin_lock = DEFAULTMUTEX;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   177
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   178
KMF_RETURN
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   179
init_pk11()
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   180
{
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   181
	(void) mutex_lock(&init_lock);
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   182
	if (!pkcs11_initialized) {
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   183
		CK_RV rv = C_Initialize(NULL);
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   184
		if ((rv != CKR_OK) &&
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   185
		    (rv != CKR_CRYPTOKI_ALREADY_INITIALIZED)) {
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   186
			(void) mutex_unlock(&init_lock);
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   187
			return (KMF_ERR_UNINITIALIZED);
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   188
		} else {
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   189
			pkcs11_initialized = 1;
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   190
		}
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   191
	}
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   192
	(void) mutex_unlock(&init_lock);
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   193
	return (KMF_OK);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   194
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   195
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   196
/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   197
 * Private method for searching the plugin list for the correct
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   198
 * Plugin to use.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   199
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   200
KMF_PLUGIN *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   201
FindPlugin(KMF_HANDLE_T handle, KMF_KEYSTORE_TYPE kstype)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   202
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   203
	KMF_PLUGIN_LIST *node;
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   204
	KMF_RETURN ret = KMF_OK;
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   205
	KMF_PLUGIN *pluginrec = NULL;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   206
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   207
	if (handle == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   208
		return (NULL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   209
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   210
	node = handle->plugins;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   211
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   212
	/* See if the desired plugin was already initialized. */
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   213
	while (node != NULL && node->plugin->type != kstype)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   214
		node = node->next;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   215
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   216
	if (node != NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   217
		return (node->plugin);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   218
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   219
	/* The plugin was not found, try to initialize it here. */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   220
	if (VALID_DEFAULT_KEYSTORE_TYPE(kstype)) {
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   221
		int i;
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   222
		int numitems = sizeof (plugin_list)/sizeof (KMF_PLUGIN_ITEM);
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   223
		for (i = 0; i < numitems; i++) {
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   224
			if (plugin_list[i].kstype == kstype) {
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   225
				ret = InitializePlugin(plugin_list[i].kstype,
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   226
				    plugin_list[i].path, &pluginrec);
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   227
				break;
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   228
			}
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   229
		}
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   230
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   231
		goto out;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   232
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   233
	} else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   234
		/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   235
		 * Not a built-in plugin. Check if it is in the
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   236
		 * extra_plugin_list.  If it is, try to initialize it here.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   237
		 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   238
		conf_entrylist_t *phead = extra_plugin_list;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   239
		char realpath[MAXPATHLEN];
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   240
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   241
		while (phead != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   242
			if (phead->entry->kstype == kstype)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   243
				break;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   244
			else
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   245
				phead = phead->next;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   246
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   247
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   248
		if (phead == NULL)
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   249
			return (NULL);
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   250
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   251
		/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   252
		 * Get the absolute path of the module.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   253
		 * - If modulepath is not a full path, then prepend it
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   254
		 *   with KMF_PLUGIN_PATH.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   255
		 * - If modulepath is a full path and contain $ISA, then
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   256
		 *   subsitute the architecture dependent path.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   257
		 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   258
		(void) memset(realpath, 0, sizeof (realpath));
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   259
		if (strncmp(phead->entry->modulepath, "/", 1) != 0) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   260
			(void) snprintf(realpath, MAXPATHLEN, "%s%s",
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   261
			    KMF_PLUGIN_PATH, phead->entry->modulepath);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   262
		} else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   263
			char *buf = phead->entry->modulepath;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   264
			char *isa;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   265
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   266
			if ((isa = strstr(buf, PKCS11_ISA)) != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   267
				char *isa_str;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   268
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   269
				(void) strncpy(realpath, buf, isa - buf);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   270
				isa_str = strdup(ISA_PATH);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   271
				if (isa_str == NULL) /* not enough memory */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   272
					return (NULL);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   273
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   274
				(void) strncat(realpath, isa_str,
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   275
				    strlen(isa_str));
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   276
				free(isa_str);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   277
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   278
				isa += strlen(PKCS11_ISA);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   279
				(void) strlcat(realpath, isa, MAXPATHLEN);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   280
			} else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   281
				(void) snprintf(realpath, MAXPATHLEN, "%s",
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   282
				    phead->entry->modulepath);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   283
			}
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   284
		}
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   285
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   286
		ret = InitializePlugin(phead->entry->kstype, realpath,
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   287
		    &pluginrec);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   288
		goto out;
5301
4856fb4fc3d6 6614385 libkmf should be able to open plugins on demand
wyllys
parents: 5051
diff changeset
   289
	}
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   290
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   291
out:
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   292
	if (ret != KMF_OK || pluginrec == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   293
		/* No matching plugins found in the built-in list */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   294
		return (NULL);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   295
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   296
	ret = AddPlugin(handle, pluginrec);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   297
	if (ret != KMF_OK) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   298
		DestroyPlugin(pluginrec);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   299
		pluginrec = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   300
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   301
	return (pluginrec);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   302
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   303
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   304
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   305
static KMF_RETURN
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   306
InitializePlugin(KMF_KEYSTORE_TYPE kstype, char *path, KMF_PLUGIN **plugin)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   307
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   308
	KMF_PLUGIN *p = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   309
	KMF_PLUGIN_FUNCLIST *(*sym)();
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   310
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   311
	if (path == NULL || plugin == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   312
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   313
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   314
	*plugin = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   315
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   316
	p = (KMF_PLUGIN *)malloc(sizeof (KMF_PLUGIN));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   317
	if (p == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   318
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   319
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   320
	p->type = kstype;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   321
	p->path = strdup(path);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   322
	if (p->path == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   323
		free(p);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   324
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   325
	}
10123
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
   326
	/*
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
   327
	 * Do not use RTLD_GROUP here, or this will cause a circular
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
   328
	 * dependency when kmf_pkcs11.so.1 gets its PKCS#11 functions
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
   329
	 * from libpkcs11.so.1 when kmf is used via libelfsign.so.1
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
   330
	 * called from kcfd.
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
   331
	 */
d9be114e78c4 6852240 libelfsign should use pkcs11_softtoken instead of OpenSSL for FIPS-140 integrity checking
Valerie Bubb Fenwick <Valerie.Fenwick@Sun.COM>
parents: 6051
diff changeset
   332
	p->dldesc = dlopen(path, RTLD_LAZY | RTLD_PARENT);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   333
	if (p->dldesc == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   334
		free(p->path);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   335
		free(p);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   336
		return (KMF_ERR_PLUGIN_INIT);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   337
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   338
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   339
	sym = (KMF_PLUGIN_FUNCLIST *(*)())dlsym(p->dldesc,
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   340
	    KMF_PLUGIN_INIT_SYMBOL);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   341
	if (sym == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   342
		(void) dlclose(p->dldesc);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   343
		free(p->path);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   344
		free(p);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   345
		return (KMF_ERR_PLUGIN_INIT);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   346
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   347
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   348
	/* Get the function list */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   349
	if ((p->funclist = (*sym)()) == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   350
		(void) dlclose(p->dldesc);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   351
		free(p->path);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   352
		free(p);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   353
		return (KMF_ERR_PLUGIN_INIT);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   354
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   355
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   356
	*plugin = p;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   357
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   358
	return (KMF_OK);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   359
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   360
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   361
static KMF_RETURN
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   362
AddPlugin(KMF_HANDLE_T handle, KMF_PLUGIN *plugin)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   363
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   364
	KMF_PLUGIN_LIST *n;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   365
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   366
	if (handle == NULL || plugin == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   367
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   368
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   369
	/* If the head is NULL, create it */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   370
	if (handle->plugins == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   371
		handle->plugins = (KMF_PLUGIN_LIST *)malloc(
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   372
		    sizeof (KMF_PLUGIN_LIST));
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   373
		if (handle->plugins == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   374
			return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   375
		handle->plugins->plugin = plugin;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   376
		handle->plugins->next = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   377
	} else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   378
		/* walk the list to find the tail */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   379
		n = handle->plugins;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   380
		while (n->next != NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   381
			n = n->next;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   382
		n->next = (KMF_PLUGIN_LIST *)malloc(sizeof (KMF_PLUGIN_LIST));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   383
		if (n->next == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   384
			return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   385
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   386
		n->next->plugin = plugin;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   387
		n->next->next = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   388
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   389
	return (0);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   390
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   391
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   392
static void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   393
DestroyPlugin(KMF_PLUGIN *plugin)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   394
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   395
	if (plugin) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   396
		if (plugin->path)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   397
			free(plugin->path);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   398
		free(plugin);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   399
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   400
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   401
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   402
static void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   403
Cleanup_KMF_Handle(KMF_HANDLE_T handle)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   404
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   405
	if (handle != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   406
		while (handle->plugins != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   407
			KMF_PLUGIN_LIST *next = handle->plugins->next;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   408
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   409
			DestroyPlugin(handle->plugins->plugin);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   410
			free(handle->plugins);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   411
			handle->plugins = next;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   412
		}
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   413
		kmf_free_policy_record(handle->policy);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   414
		free(handle->policy);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   415
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   416
	free(handle);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   417
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   418
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   419
void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   420
Cleanup_PK11_Session(KMF_HANDLE_T handle)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   421
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   422
	if (handle != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   423
		/* Close active session on a pkcs11 token */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   424
		if (handle->pk11handle != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   425
			(void) C_CloseSession(handle->pk11handle);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   426
			handle->pk11handle = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   427
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   428
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   429
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   430
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   431
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   432
kmf_initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   433
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   434
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   435
	KMF_HANDLE *handle = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   436
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   437
	if (outhandle == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   438
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   439
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   440
	*outhandle = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   441
	handle = (KMF_HANDLE *)malloc(sizeof (KMF_HANDLE));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   442
	if (handle == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   443
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   444
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   445
	(void) memset(handle, 0, sizeof (KMF_HANDLE));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   446
	handle->plugins = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   447
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   448
	/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   449
	 * When this function is called the first time, get the additional
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   450
	 * plugins from the config file.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   451
	 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   452
	(void) mutex_lock(&extra_plugin_lock);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   453
	if (!check_extra_plugin) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   454
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   455
		ret = get_entrylist(&extra_plugin_list);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   456
		check_extra_plugin = B_TRUE;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   457
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   458
		/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   459
		 * Assign the kstype number to the additional plugins here.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   460
		 * The global kstore_num will be protected by the mutex lock.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   461
		 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   462
		if (ret == KMF_OK) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   463
			conf_entrylist_t *phead = extra_plugin_list;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   464
			while (phead != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   465
				phead->entry->kstype = ++kstore_num;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   466
				phead = phead->next;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   467
			}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   468
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   469
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   470
		/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   471
		 * If the KMF configuration file does not exist or cannot be
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   472
		 * parsed correctly, we will give a warning in syslog and
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   473
		 * continue on as there is no extra plugins in the system.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   474
		 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   475
		if (ret == KMF_ERR_KMF_CONF) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   476
			cryptoerror(LOG_WARNING, "KMF was unable to parse "
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   477
			    "the private KMF config file.\n");
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   478
			ret = KMF_OK;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   479
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   480
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   481
		if (ret != KMF_OK) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   482
			(void) mutex_unlock(&extra_plugin_lock);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   483
			goto errout;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   484
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   485
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   486
	(void) mutex_unlock(&extra_plugin_lock);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
   487
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   488
	/* Initialize the handle with the policy */
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   489
	ret = kmf_set_policy((void *)handle,
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   490
	    policyfile == NULL ? KMF_DEFAULT_POLICY_FILE : policyfile,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   491
	    policyname == NULL ? KMF_DEFAULT_POLICY_NAME : policyname);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   492
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   493
		goto errout;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   494
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   495
	CLEAR_ERROR(handle, ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   496
errout:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   497
	if (ret != KMF_OK) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   498
		Cleanup_KMF_Handle(handle);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   499
		handle = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   500
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   501
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   502
	*outhandle = (KMF_HANDLE_T)handle;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   503
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   504
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   505
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   506
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   507
kmf_configure_keystore(KMF_HANDLE_T handle,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   508
	int	num_args,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   509
	KMF_ATTRIBUTE	*attrlist)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   510
{
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   511
	KMF_RETURN ret = KMF_OK;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   512
	KMF_PLUGIN *plugin;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   513
	KMF_KEYSTORE_TYPE kstype;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   514
	uint32_t len;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   515
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   516
	KMF_ATTRIBUTE_TESTER required_attrs[] = {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   517
		{KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   518
	};
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   519
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   520
	int num_req_attrs = sizeof (required_attrs) /
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   521
	    sizeof (KMF_ATTRIBUTE_TESTER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   522
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   523
	if (handle == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   524
		return (KMF_ERR_BAD_PARAMETER);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   525
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   526
	CLEAR_ERROR(handle, ret);
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   527
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   528
	ret = test_attributes(num_req_attrs, required_attrs,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   529
	    0, NULL, num_args, attrlist);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   530
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   531
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   532
		return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   533
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   534
	len = sizeof (kstype);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   535
	ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   536
	    &kstype, &len);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   537
	if (ret != KMF_OK)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   538
		return (ret);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   539
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   540
	plugin = FindPlugin(handle, kstype);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   541
	if (plugin != NULL && plugin->funclist->ConfigureKeystore != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   542
		return (plugin->funclist->ConfigureKeystore(handle, num_args,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   543
		    attrlist));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   544
	} else {
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   545
		/* return KMF_OK, if the plugin does not have an entry */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   546
		return (KMF_OK);
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   547
	}
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   548
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   549
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   550
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   551
kmf_finalize(KMF_HANDLE_T handle)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   552
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   553
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   554
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   555
	CLEAR_ERROR(handle, ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   556
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   557
		return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   558
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   559
	if (pkcs11_initialized) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   560
		Cleanup_PK11_Session(handle);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   561
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   562
	Cleanup_KMF_Handle(handle);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   563
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   564
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   565
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   566
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   567
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   568
kmf_get_kmf_error_str(KMF_RETURN errcode, char **errmsg)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   569
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   570
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   571
	int i, maxerr;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   572
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   573
	if (errmsg == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   574
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   575
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   576
	*errmsg = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   577
	maxerr = sizeof (kmf_errcodes) / sizeof (kmf_error_map);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   578
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   579
	for (i = 0; i < maxerr && errcode != kmf_errcodes[i].code; i++)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   580
		/* empty body */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   581
		;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   582
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   583
	if (i == maxerr)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   584
		return (KMF_ERR_MISSING_ERRCODE);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   585
	else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   586
		*errmsg = strdup(kmf_errcodes[i].message);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   587
		if ((*errmsg) == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   588
			return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   589
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   590
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   591
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   592
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   593
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   594
kmf_get_plugin_error_str(KMF_HANDLE_T handle, char **msgstr)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   595
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   596
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   597
	KMF_PLUGIN *plugin;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   598
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   599
	if (handle == NULL || msgstr == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   600
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   601
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   602
	*msgstr = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   603
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   604
	if (handle->lasterr.errcode == 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   605
		return (KMF_ERR_MISSING_ERRCODE);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   606
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   607
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   608
	if (handle->lasterr.kstype == -1) { /* System error */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   609
		char *str = strerror(handle->lasterr.errcode);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   610
		if (str != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   611
			*msgstr = strdup(str);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   612
			if ((*msgstr) == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   613
				return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   614
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   615
		return (KMF_OK);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   616
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   617
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   618
	plugin = FindPlugin(handle, handle->lasterr.kstype);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   619
	if (plugin == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   620
		return (KMF_ERR_PLUGIN_NOTFOUND);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   621
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   622
	if (plugin->funclist->GetErrorString != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   623
		ret = plugin->funclist->GetErrorString(handle, msgstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   624
	} else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   625
		return (KMF_ERR_FUNCTION_NOT_FOUND);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   626
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   627
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   628
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   629
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   630
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   631
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   632
#define	SET_SYS_ERROR(h, c) if (h) {\
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   633
	h->lasterr.kstype = -1;\
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   634
	h->lasterr.errcode = c;\
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   635
}
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   636
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   637
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   638
kmf_read_input_file(KMF_HANDLE_T handle, char *filename,  KMF_DATA *pdata)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   639
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   640
	struct stat s;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   641
	long nread, total = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   642
	int fd;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   643
	unsigned char *buf = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   644
	KMF_RETURN ret;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   645
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   646
	if (handle) {
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   647
		CLEAR_ERROR(handle, ret);
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   648
		if (ret != KMF_OK)
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   649
			return (ret);
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   650
	}
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   651
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   652
	if (filename == NULL || pdata == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   653
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   654
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   655
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   656
	if ((fd = open(filename, O_RDONLY)) < 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   657
		SET_SYS_ERROR(handle, errno);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   658
		return (KMF_ERR_OPEN_FILE);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   659
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   660
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   661
	if (fstat(fd, &s) < 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   662
		SET_SYS_ERROR(handle, errno);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   663
		(void) close(fd);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   664
		return (KMF_ERR_OPEN_FILE);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   665
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   666
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   667
	if ((buf = (unsigned char *) malloc(s.st_size)) == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   668
		(void) close(fd);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   669
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   670
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   671
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   672
	do {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   673
		nread = read(fd, buf+total, s.st_size-total);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   674
		if (nread < 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   675
			SET_SYS_ERROR(handle, errno);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   676
			(void) close(fd);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   677
			free(buf);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   678
			return (KMF_ERR_INTERNAL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   679
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   680
		total += nread;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   681
	} while (total < s.st_size);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   682
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   683
	pdata->Data = buf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   684
	pdata->Length = s.st_size;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   685
	(void) close(fd);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   686
	return (KMF_OK);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   687
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   688
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   689
/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   690
 *
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   691
 * Name: kmf_der_to_pem
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   692
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   693
 * Description:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   694
 *   Function for converting DER encoded format to PEM encoded format
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   695
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   696
 * Parameters:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   697
 *   type(input) - CERTIFICATE or CSR
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   698
 *   data(input) - pointer to the DER encoded data
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   699
 *   len(input)  - length of input data
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   700
 *   out(output) - contains the output buffer address to be returned
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   701
 *   outlen(output) - pointer to the returned output length
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   702
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   703
 * Returns:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   704
 *   A KMF_RETURN value indicating success or specifying a particular
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   705
 * error condition.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   706
 *   The value KMF_OK indicates success. All other values represent
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   707
 * an error condition.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   708
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   709
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   710
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   711
kmf_der_to_pem(KMF_OBJECT_TYPE type, unsigned char *data,
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   712
	int len, unsigned char **out, int *outlen)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   713
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   714
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   715
	KMF_RETURN err;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   716
	if (data == NULL || out == NULL || outlen == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   717
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   718
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   719
	err = Der2Pem(type, data, len, out, outlen);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   720
	return (err);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   721
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   722
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   723
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   724
/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   725
 *
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   726
 * Name: kmf_pem_to_der
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   727
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   728
 * Description:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   729
 *   Function for converting PEM encoded format to DER encoded format
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   730
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   731
 * Parameters:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   732
 *   in(input) - pointer to the PEM encoded data
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   733
 *   inlen(input)  - length of input data
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   734
 *   out(output) - contains the output buffer address to be returned
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   735
 *   outlen(output) - pointer to the returned output length
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   736
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   737
 * Returns:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   738
 *   A KMF_RETURN value indicating success or specifying a particular
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   739
 *   error condition.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   740
 *   The value KMF_OK indicates success. All other values represent
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   741
 *   an error condition.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   742
 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   743
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   744
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   745
kmf_pem_to_der(unsigned char *in, int inlen,
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   746
	unsigned char **out, int *outlen)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   747
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   748
	KMF_RETURN err;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   749
	if (in == NULL || out == NULL || outlen == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   750
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   751
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   752
	err = Pem2Der(in, inlen, out, outlen);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   753
	return (err);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   754
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   755
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   756
char *
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   757
kmf_oid_to_string(KMF_OID *oid)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   758
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   759
	char numstr[128];
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   760
	uint32_t number;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   761
	int numshift;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   762
	uint32_t i, string_length;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   763
	uchar_t *cp;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   764
	char *bp;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   765
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   766
	/* First determine the size of the string */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   767
	string_length = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   768
	number = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   769
	numshift = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   770
	cp = (unsigned char *)oid->Data;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   771
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   772
	number = (uint32_t)cp[0];
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   773
	(void) sprintf(numstr, "%d ", number/40);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   774
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   775
	string_length += strlen(numstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   776
	(void) sprintf(numstr, "%d ", number%40);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   777
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   778
	string_length += strlen(numstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   779
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   780
	for (i = 1; i < oid->Length; i++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   781
		if ((uint32_t)(numshift+7) < (sizeof (uint32_t)*8)) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   782
			number = (number << 7) | (cp[i] & 0x7f);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   783
			numshift += 7;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   784
		} else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   785
			return (NULL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   786
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   787
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   788
		if ((cp[i] & 0x80) == 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   789
			(void) sprintf(numstr, "%d ", number);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   790
			string_length += strlen(numstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   791
			number = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   792
			numshift = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   793
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   794
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   795
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   796
	 * If we get here, we've calculated the length of "n n n ... n ".  Add 4
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   797
	 * here for "{ " and "}\0".
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   798
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   799
	string_length += 4;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   800
	if ((bp = (char *)malloc(string_length))) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   801
		number = (uint32_t)cp[0];
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   802
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   803
		(void) sprintf(numstr, "%d.", number/40);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   804
		(void) strcpy(bp, numstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   805
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   806
		(void) sprintf(numstr, "%d.", number%40);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   807
		(void) strcat(bp, numstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   808
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   809
		number = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   810
		cp = (unsigned char *) oid->Data;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   811
		for (i = 1; i < oid->Length; i++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   812
			number = (number << 7) | (cp[i] & 0x7f);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   813
			if ((cp[i] & 0x80) == 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   814
				(void) sprintf(numstr, "%d", number);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   815
				(void) strcat(bp, numstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   816
				number = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   817
				if (i+1 < oid->Length)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   818
					(void) strcat(bp, ".");
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   819
			}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   820
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   821
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   822
	return (bp);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   823
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   824
3754
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   825
static boolean_t
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   826
check_for_pem(uchar_t *buf, KMF_ENCODE_FORMAT *fmt)
3754
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   827
{
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   828
	char *p;
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   829
	int i;
3754
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   830
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   831
	if (buf == NULL)
3754
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   832
		return (FALSE);
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   833
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   834
	for (i = 0; i < 8 && isascii(buf[i]); i++)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   835
		/* loop to make sure this is ascii */;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   836
	if (i != 8)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   837
		return (FALSE);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   838
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   839
	if (memcmp(buf, "Bag Attr", 8) == 0) {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   840
		*fmt = KMF_FORMAT_PEM_KEYPAIR;
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   841
		return (TRUE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   842
	}
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   843
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   844
	/* Look for "-----BEGIN" right after a newline */
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   845
	p = strtok((char *)buf, "\n");
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   846
	while (p != NULL) {
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   847
		if (strstr(p, "-----BEGIN") != NULL) {
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   848
			*fmt = KMF_FORMAT_PEM;
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   849
			/* Restore the buffer */
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   850
			buf[strlen(p)] = '\n';
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   851
			return (TRUE);
3754
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   852
		}
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   853
		buf[strlen(p)] = '\n';
3825
3d0d37b7e5af 6531818 libkmf has too many dependencies on libpkcs11
wyllys
parents: 3754
diff changeset
   854
		p = strtok(NULL, "\n");
3754
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   855
	}
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   856
	return (FALSE);
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   857
}
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
   858
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   859
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   860
static unsigned char pkcs12_version[3] = {0x02, 0x01, 0x03};
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   861
static unsigned char pkcs12_oid[11] =
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   862
{0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01};
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   863
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   864
/*
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   865
 * This function takes a BER encoded string as input and checks the version
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   866
 * and the oid in the the top-level ASN.1 structure to see if it complies to
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   867
 * the PKCS#12 Syntax.
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   868
 */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   869
static boolean_t
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   870
check_for_pkcs12(uchar_t *buf, int buf_len)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   871
{
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   872
	int index = 0;
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   873
	int length_octets;
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   874
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   875
	if (buf == NULL || buf_len <= 0)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   876
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   877
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   878
	/*
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   879
	 * The top level structure for a PKCS12 string:
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   880
	 *
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   881
	 * PFX ::= SEQUENCE {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   882
	 *	version		INTEGER {v3(3)}(v3,...)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   883
	 *	authSafe	ContentInfo
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   884
	 *	macData		MacData OPTIONAL
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   885
	 * }
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   886
	 *
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   887
	 * ContentInfo
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   888
	 *	FROM PKCS-7 {iso(1) member-body(2) us(840) rsadsi(113549)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   889
	 *		pkcs(1) pkcs-7(7) modules(0) pkcs-7(1)}
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   890
	 *
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   891
	 * Therefore, the BER/DER dump of a PKCS#12 file for the first 2
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   892
	 * sequences up to the oid part is as following:
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   893
	 *
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   894
	 *	SEQUENCE {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   895
	 *	    INTEGER 3
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   896
	 *	    SEQUENCE {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   897
	 *		OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   898
	 */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   899
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   900
	/*
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   901
	 * Check the first sequence and calculate the number of bytes used
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   902
	 * to store the length.
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   903
	 */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   904
	if (buf[index++] != 0x30)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   905
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   906
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   907
	if (buf[index] & 0x80) {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   908
		length_octets = buf[index++] & 0x0F;  /* long form */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   909
	} else {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   910
		length_octets = 1; /* short form */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   911
	}
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   912
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   913
	index += length_octets;
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   914
	if (index  >= buf_len)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   915
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   916
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   917
	/* Skip the length octets and check the pkcs12 version */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   918
	if (memcmp(buf + index, pkcs12_version, sizeof (pkcs12_version)) != 0)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   919
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   920
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   921
	index += sizeof (pkcs12_version);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   922
	if (index  >= buf_len)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   923
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   924
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   925
	/*
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   926
	 * Check the 2nd sequence and calculate the number of bytes used
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   927
	 * to store the length.
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   928
	 */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   929
	if ((buf[index++] & 0xFF) != 0x30)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   930
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   931
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   932
	if (buf[index] & 0x80) {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   933
		length_octets = buf[index++] & 0x0F;
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   934
	} else {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   935
		length_octets = 1;
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   936
	}
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   937
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   938
	index += length_octets;
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   939
	if (index + sizeof (pkcs12_oid) >= buf_len)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   940
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   941
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   942
	/* Skip the length octets and check the oid */
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   943
	if (memcmp(buf + index, pkcs12_oid, sizeof (pkcs12_oid)) != 0)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   944
		return (FALSE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   945
	else
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   946
		return (TRUE);
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   947
}
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   948
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   949
KMF_RETURN
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   950
kmf_get_data_format(KMF_DATA *data, KMF_ENCODE_FORMAT *fmt)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   951
{
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   952
	uchar_t *buf = data->Data;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   953
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   954
	if (check_for_pkcs12(buf, data->Length) == TRUE) {
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   955
		*fmt = KMF_FORMAT_PKCS12;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   956
	} else if (buf[0] == 0x30 && (buf[1] & 0x80)) {
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   957
		/* It is most likely a generic ASN.1 encoded file */
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   958
		*fmt = KMF_FORMAT_ASN1;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   959
	} else if (check_for_pem(buf, fmt) != TRUE) {
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   960
		/* Cannot determine this file format */
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   961
		*fmt = KMF_FORMAT_UNDEF;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   962
		return (KMF_ERR_ENCODING);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   963
	}
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   964
	return (KMF_OK);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   965
}
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   966
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   967
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   968
kmf_get_file_format(char *filename, KMF_ENCODE_FORMAT *fmt)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   969
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   970
	KMF_RETURN ret = KMF_OK;
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   971
	KMF_DATA filebuf = {NULL, 0};
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   972
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   973
	if (filename == NULL || !strlen(filename) || fmt == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   974
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   975
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   976
	*fmt = 0;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   977
	ret = kmf_read_input_file(NULL, filename, &filebuf);
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   978
	if (ret != KMF_OK)
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   979
		return (ret);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   980
3951
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   981
	if (filebuf.Length < 8) {
7c819a7ade91 6527799 KMF_GetFileFormat() can not recognize a valid P12 file
hylee
parents: 3825
diff changeset
   982
		ret = KMF_ERR_ENCODING; /* too small */
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   983
		goto end;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   984
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   985
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
   986
	ret = kmf_get_data_format(&filebuf, fmt);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   987
end:
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   988
	kmf_free_data(&filebuf);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   989
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   990
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   991
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   992
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
   993
kmf_hexstr_to_bytes(unsigned char *hexstr, unsigned char **bytes,
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   994
	size_t *outlen)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   995
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   996
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   997
	unsigned char *buf = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   998
	int len, stringlen;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
   999
	int i;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1000
	unsigned char ch;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1001
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1002
	if (hexstr == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1003
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1004
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1005
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1006
	if (hexstr[0] == '0' && ((hexstr[1] == 'x') || (hexstr[1] == 'X')))
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1007
		hexstr += 2;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1008
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1009
	for (i = 0; i < strlen((char *)hexstr) && isxdigit(hexstr[i]); i++)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1010
		/* empty body */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1011
		;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1012
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1013
	 * If all the characters are not legitimate hex chars,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1014
	 * return an error.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1015
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1016
	if (i != strlen((char *)hexstr))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1017
		return (KMF_ERR_BAD_HEX_STRING);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1018
	stringlen = i;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1019
	len = (i / 2) + (i % 2);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1020
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1021
	buf = malloc(len);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1022
	if (buf == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1023
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1024
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1025
	(void) memset(buf, 0, len);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1026
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1027
	for (i = 0; i < stringlen; i++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1028
		ch = (unsigned char) *hexstr;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1029
		hexstr++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1030
		if ((ch >= '0') && (ch <= '9'))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1031
			ch -= '0';
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1032
		else if ((ch >= 'A') && (ch <= 'F'))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1033
			ch = ch - 'A' + 10;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1034
		else if ((ch >= 'a') && (ch <= 'f'))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1035
			ch = ch - 'a' + 10;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1036
		else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1037
			ret = KMF_ERR_BAD_HEX_STRING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1038
			goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1039
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1040
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1041
		if (i & 1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1042
			buf[i/2] |= ch;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1043
		} else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1044
			buf[i/2] = (ch << 4);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1045
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1046
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1047
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1048
	*bytes = buf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1049
	*outlen = len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1050
out:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1051
	if (buf != NULL && ret != KMF_OK) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1052
		free(buf);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1053
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1054
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1055
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1056
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1057
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1058
kmf_free_dn(KMF_X509_NAME *name)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1059
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1060
	KMF_X509_RDN 		*newrdn = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1061
	KMF_X509_TYPE_VALUE_PAIR *av = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1062
	int i, j;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1063
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1064
	if (name && name->numberOfRDNs) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1065
		for (i = 0; i < name->numberOfRDNs; i++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1066
			newrdn = &name->RelativeDistinguishedName[i];
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1067
			for (j = 0; j < newrdn->numberOfPairs; j++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1068
				av = &newrdn->AttributeTypeAndValue[j];
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1069
				kmf_free_data(&av->type);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1070
				kmf_free_data(&av->value);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1071
			}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1072
			free(newrdn->AttributeTypeAndValue);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1073
			newrdn->numberOfPairs = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1074
			newrdn->AttributeTypeAndValue = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1075
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1076
		free(name->RelativeDistinguishedName);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1077
		name->numberOfRDNs = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1078
		name->RelativeDistinguishedName = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1079
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1080
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1081
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1082
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1083
kmf_free_kmf_cert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1084
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1085
	KMF_PLUGIN *plugin;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1086
	KMF_RETURN ret;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1087
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1088
	CLEAR_ERROR(handle, ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1089
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1090
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1091
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1092
	if (kmf_cert == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1093
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1094
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1095
	plugin = FindPlugin(handle, kmf_cert->kmf_private.keystore_type);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1096
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1097
	if (plugin != NULL && plugin->funclist->FreeKMFCert != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1098
		plugin->funclist->FreeKMFCert(handle, kmf_cert);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1099
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1100
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1101
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1102
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1103
kmf_free_data(KMF_DATA *datablock)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1104
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1105
	if (datablock != NULL && datablock->Data != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1106
		free(datablock->Data);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1107
		datablock->Data = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1108
		datablock->Length = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1109
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1110
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1111
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1112
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1113
kmf_free_algoid(KMF_X509_ALGORITHM_IDENTIFIER *algoid)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1114
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1115
	if (algoid == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1116
		return;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1117
	kmf_free_data(&algoid->algorithm);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1118
	kmf_free_data(&algoid->parameters);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1119
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1120
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1121
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1122
kmf_free_extn(KMF_X509_EXTENSION *exptr)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1123
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1124
	if (exptr == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1125
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1126
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1127
	kmf_free_data((KMF_DATA *)&exptr->extnId);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1128
	kmf_free_data(&exptr->BERvalue);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1129
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1130
	if (exptr->value.tagAndValue) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1131
		kmf_free_data(&exptr->value.tagAndValue->value);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1132
		free(exptr->value.tagAndValue);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1133
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1134
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1135
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1136
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1137
kmf_free_tbs_csr(KMF_TBS_CSR *tbscsr)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1138
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1139
	if (tbscsr) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1140
		kmf_free_data(&tbscsr->version);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1141
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1142
		kmf_free_dn(&tbscsr->subject);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1143
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1144
		kmf_free_algoid(&tbscsr->subjectPublicKeyInfo.algorithm);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1145
		kmf_free_data(&tbscsr->subjectPublicKeyInfo.subjectPublicKey);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1146
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1147
		free_extensions(&tbscsr->extensions);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1148
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1149
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1150
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1151
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1152
kmf_free_signed_csr(KMF_CSR_DATA *csr)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1153
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1154
	if (csr) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1155
		kmf_free_tbs_csr(&csr->csr);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1156
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1157
		kmf_free_algoid(&csr->signature.algorithmIdentifier);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1158
		kmf_free_data(&csr->signature.encrypted);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1159
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1160
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1161
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1162
static void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1163
free_validity(KMF_X509_VALIDITY *validity)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1164
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1165
	if (validity == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1166
		return;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1167
	kmf_free_data(&validity->notBefore.time);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1168
	kmf_free_data(&validity->notAfter.time);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1169
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1170
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1171
static void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1172
free_extensions(KMF_X509_EXTENSIONS *extns)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1173
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1174
	int i;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1175
	KMF_X509_EXTENSION *exptr;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1176
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1177
	if (extns && extns->numberOfExtensions > 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1178
		for (i = 0; i < extns->numberOfExtensions; i++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1179
			exptr = &extns->extensions[i];
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1180
			kmf_free_extn(exptr);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1181
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1182
		free(extns->extensions);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1183
		extns->numberOfExtensions = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1184
		extns->extensions = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1185
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1186
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1187
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1188
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1189
kmf_free_tbs_cert(KMF_X509_TBS_CERT *tbscert)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1190
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1191
	if (tbscert) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1192
		kmf_free_data(&tbscert->version);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1193
		kmf_free_bigint(&tbscert->serialNumber);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1194
		kmf_free_algoid(&tbscert->signature);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1195
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1196
		kmf_free_dn(&tbscert->issuer);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1197
		kmf_free_dn(&tbscert->subject);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1198
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1199
		free_validity(&tbscert->validity);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1200
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1201
		kmf_free_data(&tbscert->issuerUniqueIdentifier);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1202
		kmf_free_data(&tbscert->subjectUniqueIdentifier);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1203
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1204
		kmf_free_algoid(&tbscert->subjectPublicKeyInfo.algorithm);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1205
		kmf_free_data(&tbscert->subjectPublicKeyInfo.subjectPublicKey);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1206
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1207
		free_extensions(&tbscert->extensions);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1208
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1209
		kmf_free_data(&tbscert->issuerUniqueIdentifier);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1210
		kmf_free_data(&tbscert->subjectUniqueIdentifier);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1211
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1212
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1213
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1214
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1215
kmf_free_signed_cert(KMF_X509_CERTIFICATE *certptr)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1216
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1217
	if (!certptr)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1218
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1219
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1220
	kmf_free_tbs_cert(&certptr->certificate);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1221
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1222
	kmf_free_algoid(&certptr->signature.algorithmIdentifier);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1223
	kmf_free_data(&certptr->signature.encrypted);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1224
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1225
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1226
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1227
kmf_free_str(char *pstr)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1228
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1229
	if (pstr != NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1230
		free(pstr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1231
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1232
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1233
void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1234
free_keyidlist(KMF_OID *oidlist, int len)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1235
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1236
	int i;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1237
	for (i = 0; i < len; i++) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1238
		kmf_free_data((KMF_DATA *)&oidlist[i]);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1239
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1240
	free(oidlist);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1241
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1242
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1243
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1244
kmf_free_eku(KMF_X509EXT_EKU *eptr)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1245
{
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1246
	if (eptr && eptr->nEKUs > 0 && eptr->keyPurposeIdList != NULL)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1247
		free_keyidlist(eptr->keyPurposeIdList, eptr->nEKUs);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1248
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1249
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1250
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1251
kmf_free_spki(KMF_X509_SPKI *spki)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1252
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1253
	if (spki != NULL) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1254
		kmf_free_algoid(&spki->algorithm);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1255
		kmf_free_data(&spki->subjectPublicKey);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1256
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1257
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1258
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1259
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1260
kmf_free_kmf_key(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1261
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1262
	KMF_PLUGIN *plugin;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1263
	KMF_RETURN ret;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1264
	KMF_ATTRIBUTE attlist[2]; /* only 2 attributes for DeleteKey op */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1265
	int i = 0;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1266
	boolean_t token_destroy = B_FALSE;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1267
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1268
	if (key == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1269
		return;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1270
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1271
	CLEAR_ERROR(handle, ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1272
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1273
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1274
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1275
	kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1276
	    KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1277
	i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1278
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1279
	kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1280
	    KMF_DESTROY_BOOL_ATTR, &token_destroy, sizeof (boolean_t));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1281
	i++;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1282
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1283
	plugin = FindPlugin(handle, key->kstype);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1284
	if (plugin != NULL && plugin->funclist->DeleteKey != NULL) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1285
		(void) plugin->funclist->DeleteKey(handle, i, attlist);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1286
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1287
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1288
	if (key->keylabel)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1289
		free(key->keylabel);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1290
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1291
	if (key->israw) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1292
		kmf_free_raw_key(key->keyp);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1293
		free(key->keyp);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1294
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1295
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1296
	(void) memset(key, 0, sizeof (KMF_KEY_HANDLE));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1297
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1298
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1299
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1300
kmf_free_bigint(KMF_BIGINT *big)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1301
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1302
	if (big != NULL && big->val != NULL) {
3754
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
  1303
		/* Clear it out before returning it to the pool */
79eeec53e95c 6523959 KMF needs keystore specific Verify operations
wyllys
parents: 3408
diff changeset
  1304
		(void) memset(big->val, 0x00, big->len);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1305
		free(big->val);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1306
		big->val = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1307
		big->len = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1308
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1309
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1310
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1311
static void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1312
free_raw_rsa(KMF_RAW_RSA_KEY *key)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1313
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1314
	if (key == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1315
		return;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1316
	kmf_free_bigint(&key->mod);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1317
	kmf_free_bigint(&key->pubexp);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1318
	kmf_free_bigint(&key->priexp);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1319
	kmf_free_bigint(&key->prime1);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1320
	kmf_free_bigint(&key->prime2);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1321
	kmf_free_bigint(&key->exp1);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1322
	kmf_free_bigint(&key->exp2);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1323
	kmf_free_bigint(&key->coef);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1324
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1325
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1326
static void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1327
free_raw_dsa(KMF_RAW_DSA_KEY *key)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1328
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1329
	if (key == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1330
		return;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1331
	kmf_free_bigint(&key->prime);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1332
	kmf_free_bigint(&key->subprime);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1333
	kmf_free_bigint(&key->base);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1334
	kmf_free_bigint(&key->value);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1335
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1336
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1337
static void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1338
free_raw_sym(KMF_RAW_SYM_KEY *key)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1339
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1340
	if (key == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1341
		return;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1342
	kmf_free_bigint(&key->keydata);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1343
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1344
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1345
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1346
kmf_free_raw_key(KMF_RAW_KEY_DATA *key)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1347
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1348
	if (key == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1349
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1350
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1351
	switch (key->keytype) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1352
	case KMF_RSA:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1353
		free_raw_rsa(&key->rawdata.rsa);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1354
		break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1355
	case KMF_DSA:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1356
		free_raw_dsa(&key->rawdata.dsa);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1357
		break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1358
	case KMF_AES:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1359
	case KMF_RC4:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1360
	case KMF_DES:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1361
	case KMF_DES3:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1362
		free_raw_sym(&key->rawdata.sym);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1363
		break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1364
	}
5536
865d075cefb7 6620497 KMF does not build proper PKCS12 PDUs
wyllys
parents: 5301
diff changeset
  1365
	if (key->label) {
865d075cefb7 6620497 KMF does not build proper PKCS12 PDUs
wyllys
parents: 5301
diff changeset
  1366
		free(key->label);
865d075cefb7 6620497 KMF does not build proper PKCS12 PDUs
wyllys
parents: 5301
diff changeset
  1367
		key->label = NULL;
865d075cefb7 6620497 KMF does not build proper PKCS12 PDUs
wyllys
parents: 5301
diff changeset
  1368
	}
865d075cefb7 6620497 KMF does not build proper PKCS12 PDUs
wyllys
parents: 5301
diff changeset
  1369
	kmf_free_data(&key->id);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1370
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1371
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1372
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1373
kmf_free_raw_sym_key(KMF_RAW_SYM_KEY *key)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1374
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1375
	if (key == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1376
		return;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1377
	kmf_free_bigint(&key->keydata);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1378
	free(key);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1379
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1380
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1381
/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1382
 * This function frees the space allocated for the name portion of a
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1383
 * KMF_CRL_DIST_POINT.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1384
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1385
void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1386
free_dp_name(KMF_CRL_DIST_POINT *dp)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1387
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1388
	KMF_GENERALNAMES *fullname;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1389
	KMF_DATA *urldata;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1390
	int i;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1391
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1392
	if (dp == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1393
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1394
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1395
	/* For phase 1, we only need to free the fullname space. */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1396
	fullname = &(dp->name.full_name);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1397
	if (fullname->number == 0)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1398
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1399
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1400
	for (i = 0; i < fullname->number; i++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1401
		urldata = &(fullname->namelist[fullname->number - 1].name);
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1402
		kmf_free_data(urldata);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1403
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1404
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1405
	free(fullname->namelist);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1406
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1407
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1408
/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1409
 * This function frees the space allocated for a KMF_CRL_DIST_POINT.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1410
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1411
void
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1412
free_dp(KMF_CRL_DIST_POINT *dp)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1413
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1414
	if (dp == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1415
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1416
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1417
	free_dp_name(dp);
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1418
	kmf_free_data(&(dp->reasons));
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1419
	/* Need not to free crl_issuer space at phase 1 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1420
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1421
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1422
/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1423
 * This function frees space for a KMF_X509EXT_CRLDISTPOINTS internally.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1424
 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1425
void
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1426
kmf_free_crl_dist_pts(KMF_X509EXT_CRLDISTPOINTS *crl_dps)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1427
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1428
	int i;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1429
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1430
	if (crl_dps == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1431
		return;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1432
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1433
	for (i = 0; i < crl_dps->number; i++)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1434
		free_dp(&(crl_dps->dplist[i]));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1435
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1436
	free(crl_dps->dplist);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1437
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1438
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1439
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1440
kmf_create_ocsp_request(KMF_HANDLE_T handle,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1441
	int	num_args,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1442
	KMF_ATTRIBUTE	*attrlist)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1443
{
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1444
	KMF_RETURN ret = KMF_OK;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1445
	KMF_PLUGIN *plugin;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1446
	KMF_RETURN (*createReqFn)(void *, int num_args,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1447
	    KMF_ATTRIBUTE *attrlist);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1448
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1449
	KMF_ATTRIBUTE_TESTER required_attrs[] = {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1450
		{KMF_OCSP_REQUEST_FILENAME_ATTR, FALSE, 1, 0},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1451
		{KMF_USER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1452
			sizeof (KMF_DATA)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1453
		{KMF_ISSUER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1454
			sizeof (KMF_DATA)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1455
	};
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1456
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1457
	int num_req_attrs = sizeof (required_attrs) /
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1458
	    sizeof (KMF_ATTRIBUTE_TESTER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1459
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1460
	if (handle == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1461
		return (KMF_ERR_BAD_PARAMETER);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1462
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1463
	CLEAR_ERROR(handle, ret);
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1464
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1465
	ret = test_attributes(num_req_attrs, required_attrs,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1466
	    0, NULL, num_args, attrlist);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1467
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1468
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1469
		return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1470
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1471
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1472
	 * This framework function is actually implemented in the openssl
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1473
	 * plugin library, so we find the function address and call it.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1474
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1475
	plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1476
	if (plugin == NULL || plugin->dldesc == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1477
		return (KMF_ERR_PLUGIN_NOTFOUND);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1478
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1479
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1480
	createReqFn = (KMF_RETURN(*)())dlsym(plugin->dldesc,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1481
	    "OpenSSL_CreateOCSPRequest");
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1482
	if (createReqFn == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1483
		return (KMF_ERR_FUNCTION_NOT_FOUND);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1484
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1485
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1486
	return (createReqFn(handle, num_args, attrlist));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1487
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1488
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1489
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1490
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1491
kmf_get_ocsp_status_for_cert(KMF_HANDLE_T handle,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1492
	int	num_args,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1493
	KMF_ATTRIBUTE	*attrlist)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1494
{
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1495
	KMF_RETURN ret = KMF_OK;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1496
	KMF_PLUGIN *plugin;
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1497
	KMF_RETURN (*getCertStatusFn)(void *, int num_args,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1498
	    KMF_ATTRIBUTE *attrlist);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1499
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1500
	KMF_ATTRIBUTE_TESTER required_attrs[] = {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1501
		{KMF_USER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1502
			sizeof (KMF_DATA)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1503
		{KMF_ISSUER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1504
			sizeof (KMF_DATA)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1505
		{KMF_OCSP_RESPONSE_DATA_ATTR, FALSE, sizeof (KMF_DATA),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1506
			sizeof (KMF_DATA)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1507
		{KMF_OCSP_RESPONSE_STATUS_ATTR, FALSE, sizeof (int),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1508
			sizeof (uint32_t)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1509
		{KMF_OCSP_RESPONSE_REASON_ATTR, FALSE, sizeof (int),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1510
			sizeof (uint32_t)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1511
		{KMF_OCSP_RESPONSE_CERT_STATUS_ATTR, FALSE, sizeof (int),
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1512
			sizeof (uint32_t)},
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1513
	};
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1514
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1515
	int num_req_attrs = sizeof (required_attrs) /
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1516
	    sizeof (KMF_ATTRIBUTE_TESTER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1517
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1518
	if (handle == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1519
		return (KMF_ERR_BAD_PARAMETER);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1520
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1521
	CLEAR_ERROR(handle, ret);
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1522
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1523
	ret = test_attributes(num_req_attrs, required_attrs,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1524
	    0, NULL, num_args, attrlist);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1525
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1526
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1527
		return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1528
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1529
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1530
	 * This framework function is actually implemented in the openssl
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1531
	 * plugin library, so we find the function address and call it.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1532
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1533
	plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1534
	if (plugin == NULL || plugin->dldesc == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1535
		return (KMF_ERR_INTERNAL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1536
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1537
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1538
	getCertStatusFn = (KMF_RETURN(*)())dlsym(plugin->dldesc,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1539
	    "OpenSSL_GetOCSPStatusForCert");
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1540
	if (getCertStatusFn == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1541
		return (KMF_ERR_INTERNAL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1542
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1543
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1544
	return (getCertStatusFn(handle, num_args, attrlist));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1545
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1546
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1547
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1548
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1549
kmf_string_to_oid(char *oidstring, KMF_OID *oid)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1550
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1551
	KMF_RETURN rv = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1552
	char *cp, *bp, *startp;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1553
	int numbuf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1554
	int onumbuf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1555
	int nbytes, index;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1556
	int len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1557
	unsigned char *op;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1558
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1559
	if (oidstring == NULL || oid == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1560
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1561
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1562
	len = strlen(oidstring);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1563
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1564
	bp = oidstring;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1565
	cp = bp;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1566
	/* Skip over leading space */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1567
	while ((bp < &cp[len]) && isspace(*bp))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1568
		bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1569
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1570
	startp = bp;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1571
	nbytes = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1572
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1573
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1574
	 * The first two numbers are chewed up by the first octet.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1575
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1576
	if (sscanf(bp, "%d", &numbuf) != 1)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1577
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1578
	while ((bp < &cp[len]) && isdigit(*bp))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1579
		bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1580
	while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1581
		bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1582
	if (sscanf(bp, "%d", &numbuf) != 1)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1583
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1584
	while ((bp < &cp[len]) && isdigit(*bp))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1585
		bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1586
	while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1587
		bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1588
	nbytes++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1589
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1590
	while (isdigit(*bp)) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1591
		if (sscanf(bp, "%d", &numbuf) != 1)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1592
			return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1593
		while (numbuf) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1594
			nbytes++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1595
			numbuf >>= 7;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1596
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1597
		while ((bp < &cp[len]) && isdigit(*bp))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1598
			bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1599
		while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1600
			bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1601
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1602
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1603
	oid->Length = nbytes;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1604
	oid->Data = malloc(oid->Length);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1605
	if (oid->Data == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1606
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1607
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1608
	(void) memset(oid->Data, 0, oid->Length);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1609
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1610
	op = oid->Data;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1611
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1612
	bp = startp;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1613
	(void) sscanf(bp, "%d", &numbuf);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1614
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1615
	while (isdigit(*bp)) bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1616
	while (isspace(*bp) || *bp == '.') bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1617
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1618
	onumbuf = 40 * numbuf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1619
	(void) sscanf(bp, "%d", &numbuf);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1620
	onumbuf += numbuf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1621
	*op = (unsigned char) onumbuf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1622
	op++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1623
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1624
	while (isdigit(*bp)) bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1625
	while (isspace(*bp) || *bp == '.') bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1626
	while (isdigit(*bp)) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1627
		(void) sscanf(bp, "%d", &numbuf);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1628
		nbytes = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1629
		/* Have to fill in the bytes msb-first */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1630
		onumbuf = numbuf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1631
		while (numbuf) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1632
			nbytes++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1633
			numbuf >>= 7;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1634
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1635
		numbuf = onumbuf;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1636
		op += nbytes;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1637
		index = -1;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1638
		while (numbuf) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1639
			op[index] = (unsigned char)numbuf & 0x7f;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1640
			if (index != -1)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1641
				op[index] |= 0x80;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1642
			index--;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1643
			numbuf >>= 7;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1644
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1645
		while (isdigit(*bp)) bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1646
		while (isspace(*bp) || *bp == '.') bp++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1647
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1648
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1649
	return (rv);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1650
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1651
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1652
static KMF_RETURN
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1653
encode_rid(char *name, KMF_DATA *derdata)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1654
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1655
	KMF_RETURN rv = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1656
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1657
	if (name == NULL || derdata == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1658
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1659
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1660
	rv = kmf_string_to_oid(name, (KMF_OID *)derdata);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1661
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1662
	return (rv);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1663
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1664
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1665
static KMF_RETURN
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1666
encode_ipaddr(char *name, KMF_DATA *derdata)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1667
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1668
	KMF_RETURN rv = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1669
	size_t len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1670
	in_addr_t v4;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1671
	in6_addr_t v6;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1672
	uint8_t *ptr;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1673
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1674
	if (name == NULL || derdata == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1675
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1676
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1677
	v4 = inet_addr(name);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1678
	if (v4 == (in_addr_t)-1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1679
		ptr = (uint8_t *)&v6;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1680
		if (inet_pton(AF_INET6, name, ptr) != 1)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1681
			return (KMF_ERR_ENCODING);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1682
		len = sizeof (v6);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1683
	} else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1684
		ptr = (uint8_t *)&v4;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1685
		len = sizeof (v4);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1686
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1687
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1688
	derdata->Data = malloc(len);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1689
	if (derdata->Data == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1690
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1691
	(void) memcpy(derdata->Data, ptr, len);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1692
	derdata->Length = len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1693
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1694
	return (rv);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1695
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1696
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1697
static KMF_RETURN
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1698
encode_krb5(char *name, KMF_DATA *derdata)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1699
{
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1700
	KMF_RETURN rv = KMF_OK;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1701
	char *at, *realm;
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1702
	char *slash, *inst = NULL;
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1703
	BerElement *asn1 = NULL;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1704
	BerValue *extdata = NULL;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1705
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1706
	at = strchr(name, '@');
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1707
	if (at == NULL)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1708
		return (KMF_ERR_ENCODING);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1709
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1710
	realm = at + 1;
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1711
	*at = 0;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1712
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1713
	/*
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1714
	 * KRB5PrincipalName ::= SEQUENCE {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1715
	 *	realm		[0] Realm,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1716
	 *	principalName	[1] PrincipalName
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1717
	 * }
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1718
	 *
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1719
	 * KerberosString	::= GeneralString (IA5String)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1720
	 * Realm	::= KerberosString
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1721
	 * PrincipalName	::= SEQUENCE {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1722
	 *	name-type	[0] Int32,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1723
	 *	name-string	[1] SEQUENCE OF KerberosString
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1724
	 * }
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1725
	 */
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1726
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1727
	/*
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1728
	 * Construct the "principalName" first.
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1729
	 *
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1730
	 * The name may be split with a "/" to indicate a new instance.
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1731
	 * This must be separated in the ASN.1
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1732
	 */
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1733
	slash = strchr(name, '/');
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1734
	if (slash != NULL) {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1735
		inst = name;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1736
		name = slash + 1;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1737
		*slash = 0;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1738
	}
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1739
	if ((asn1 = kmfder_alloc()) == NULL) {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1740
		rv = KMF_ERR_MEMORY;
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1741
		goto cleanup;
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1742
	}
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1743
	if (kmfber_printf(asn1, "{Tli", 0xa0, 3, 0x01) == -1)
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1744
		goto cleanup;
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1745
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1746
	if (inst != NULL) {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1747
		if (kmfber_printf(asn1, "Tl{Tl", 0xA1,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1748
		    strlen(inst) + strlen(name) + 6,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1749
		    BER_GENERALSTRING, strlen(inst)) == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1750
			goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1751
		if (kmfber_write(asn1, inst, strlen(inst), 0) != strlen(inst))
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1752
			goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1753
		if (kmfber_printf(asn1, "Tl", BER_GENERALSTRING,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1754
		    strlen(name)) == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1755
			goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1756
		if (kmfber_write(asn1, name, strlen(name), 0) != strlen(name))
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1757
			goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1758
	} else {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1759
		if (kmfber_printf(asn1, "Tl{Tl", 0xA1,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1760
		    strlen(name) + 4, BER_GENERALSTRING, strlen(name)) == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1761
			goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1762
		if (kmfber_write(asn1, name, strlen(name), 0) != strlen(name))
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1763
			goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1764
	}
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1765
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1766
	if (kmfber_printf(asn1, "}}") == -1)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1767
		goto cleanup;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1768
	if (kmfber_flatten(asn1, &extdata) == -1) {
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1769
		rv = KMF_ERR_ENCODING;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1770
		goto cleanup;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1771
	}
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1772
	kmfber_free(asn1, 1);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1773
	asn1 = NULL;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1774
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1775
	/* Next construct the KRB5PrincipalNameSeq */
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1776
	if ((asn1 = kmfder_alloc()) == NULL) {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1777
		kmfber_bvfree(extdata);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1778
		rv = KMF_ERR_MEMORY;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1779
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1780
	}
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1781
	if (kmfber_printf(asn1, "{TlTl", 0xA0, strlen(realm) + 2,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1782
	    BER_GENERALSTRING, strlen(realm)) == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1783
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1784
	if (kmfber_write(asn1, realm, strlen(realm), 0) != strlen(realm))
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1785
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1786
	if (kmfber_printf(asn1, "Tl", 0xA1, extdata->bv_len) == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1787
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1788
	if (kmfber_write(asn1, extdata->bv_val,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1789
	    extdata->bv_len, 0) != extdata->bv_len)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1790
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1791
	if (kmfber_printf(asn1, "}") == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1792
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1793
	kmfber_bvfree(extdata);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1794
	extdata = NULL;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1795
	if (kmfber_flatten(asn1, &extdata) == -1) {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1796
		rv = KMF_ERR_ENCODING;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1797
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1798
	}
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1799
	kmfber_free(asn1, 1);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1800
	asn1 = NULL;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1801
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1802
	/*
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1803
	 * GeneralName ::= CHOICE {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1804
	 *	otherName	[0]	OtherName,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1805
	 *	...
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1806
	 * }
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1807
	 *
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1808
	 * OtherName ::= SEQUENCE {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1809
	 *	type-id	OBJECT IDENTIFIER,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1810
	 *	value	[0] EXPLICIT ANY DEFINED BY type-id
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1811
	 * }
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1812
	 */
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1813
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1814
	/* Now construct the SAN: OID + typed data. */
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1815
	if ((asn1 = kmfder_alloc()) == NULL) {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1816
		kmfber_bvfree(extdata);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1817
		rv = KMF_ERR_MEMORY;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1818
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1819
	}
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1820
	if (kmfber_printf(asn1, "D", &KMFOID_PKINIT_san) == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1821
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1822
	if (kmfber_printf(asn1, "Tl", 0xA0, extdata->bv_len) == -1)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1823
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1824
	if (kmfber_write(asn1, extdata->bv_val,
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1825
	    extdata->bv_len, 0) != extdata->bv_len)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1826
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1827
	kmfber_bvfree(extdata);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1828
	extdata = NULL;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1829
	if (kmfber_flatten(asn1, &extdata) == -1) {
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1830
		rv = KMF_ERR_ENCODING;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1831
		goto cleanup;
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1832
	}
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1833
	kmfber_free(asn1, 1);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1834
	asn1 = NULL;
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1835
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1836
	derdata->Data = (uchar_t *)extdata->bv_val;
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1837
	extdata->bv_val = NULL; /* clear it so it is not freed later */
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1838
	derdata->Length = extdata->bv_len;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1839
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1840
cleanup:
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1841
	if (asn1 != NULL)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1842
		kmfber_free(asn1, 1);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1843
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1844
	if (extdata != NULL)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1845
		kmfber_bvfree(extdata);
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1846
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1847
	if (*at == 0)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1848
		*at = '@';
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1849
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1850
	if (inst != NULL)
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1851
		*slash = '/';
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1852
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1853
	return (rv);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1854
}
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1855
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1856
static KMF_RETURN
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1857
encode_sclogon(char *name, KMF_DATA *derdata)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1858
{
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1859
	KMF_RETURN rv = KMF_OK;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1860
	BerElement *asn1 = NULL;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1861
	BerValue *extdata = NULL;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1862
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1863
	if ((asn1 = kmfder_alloc()) == NULL)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1864
		return (KMF_ERR_MEMORY);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1865
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1866
	/* The name is encoded as a KerberosString (IA5STRING) */
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1867
	if (kmfber_printf(asn1, "{Ds}",
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1868
	    &KMFOID_MS_KP_SCLogon, name) == -1)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1869
		goto cleanup;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1870
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1871
	if (kmfber_flatten(asn1, &extdata) == -1) {
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1872
		rv = KMF_ERR_ENCODING;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1873
		goto cleanup;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1874
	}
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1875
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1876
	derdata->Data = (uchar_t *)extdata->bv_val;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1877
	derdata->Length = extdata->bv_len;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1878
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1879
	free(extdata);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1880
cleanup:
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1881
	if (asn1 != NULL)
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1882
		kmfber_free(asn1, 1);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1883
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1884
	return (rv);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1885
}
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1886
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1887
static KMF_RETURN
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1888
verify_uri_format(char *uristring)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1889
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1890
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1891
	xmlURIPtr   uriptr = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1892
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1893
	/* Parse the URI string; get the hostname and port */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1894
	uriptr = xmlParseURI(uristring);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1895
	if (uriptr == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1896
		ret = KMF_ERR_BAD_URI;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1897
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1898
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1899
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1900
	if (uriptr->scheme == NULL || !strlen(uriptr->scheme)) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1901
		ret = KMF_ERR_BAD_URI;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1902
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1903
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1904
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1905
	if (uriptr->server == NULL || !strlen(uriptr->server)) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1906
		ret = KMF_ERR_BAD_URI;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1907
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1908
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1909
out:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1910
	if (uriptr != NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1911
		xmlFreeURI(uriptr);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1912
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1913
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1914
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1915
static KMF_RETURN
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1916
encode_altname(char *namedata,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1917
	KMF_GENERALNAMECHOICES nametype, KMF_DATA *encodedname)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1918
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1919
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1920
	KMF_X509_NAME dnname;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1921
	uchar_t tagval;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1922
	BerElement *asn1 = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1923
	BerValue *extdata;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1924
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1925
	if (namedata == NULL || encodedname == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1926
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1927
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1928
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1929
	 * Encode the namedata according to rules in RFC 3280 for GeneralName.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1930
	 * The input "namedata" is assumed to be an ASCII string representation
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1931
	 * of the AltName, we need to convert it to correct ASN.1 here before
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1932
	 * adding it to the cert.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1933
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1934
	switch (nametype) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1935
		case GENNAME_RFC822NAME: /* rfc 822 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1936
			/* IA5String, no encoding needed */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1937
			encodedname->Data = (uchar_t *)strdup(namedata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1938
			if (encodedname->Data == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1939
				return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1940
			encodedname->Length = strlen(namedata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1941
			tagval = (0x80 | nametype);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1942
			break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1943
		case GENNAME_DNSNAME: /* rfc 1034 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1944
			encodedname->Data = (uchar_t *)strdup(namedata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1945
			if (encodedname->Data == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1946
				return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1947
			encodedname->Length = strlen(namedata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1948
			tagval = (0x80 | nametype);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1949
			break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1950
		case GENNAME_URI: /* rfc 1738 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1951
			ret = verify_uri_format(namedata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1952
			if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1953
				return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1954
			/* IA5String, no encoding needed */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1955
			encodedname->Data = (uchar_t *)strdup(namedata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1956
			if (encodedname->Data == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1957
				return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1958
			encodedname->Length = strlen(namedata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1959
			tagval = (0x80 | nametype);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1960
			break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1961
		case GENNAME_IPADDRESS:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1962
			ret =  encode_ipaddr(namedata, encodedname);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1963
			tagval = (0x80 | nametype);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1964
			break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1965
		case GENNAME_REGISTEREDID:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1966
			ret = encode_rid(namedata, encodedname);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1967
			tagval = (0x80 | nametype);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1968
			break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1969
		case GENNAME_DIRECTORYNAME:
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1970
			ret = kmf_dn_parser(namedata, &dnname);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1971
			if (ret == KMF_OK) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1972
				ret = DerEncodeName(&dnname, encodedname);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1973
			}
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1974
			(void) kmf_free_dn(&dnname);
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1975
			tagval = (0x80 | nametype);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1976
			break;
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1977
		case GENNAME_KRB5PRINC:
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1978
			tagval = (0xA0 | GENNAME_OTHERNAME);
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1979
			ret = encode_krb5(namedata, encodedname);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1980
			break;
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1981
		case GENNAME_SCLOGON_UPN:
10818
89e8703947be 6889197 libkmf uses realloc incorrectly
Wyllys Ingersoll <wyllys.ingersoll@sun.com>
parents: 10123
diff changeset
  1982
			tagval = (0xA0 | GENNAME_OTHERNAME);
6051
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1983
			ret = encode_sclogon(namedata, encodedname);
7b29d160facb PSARC 2008/037 new EKU support for pktool and kmfcfg
wyllys
parents: 5626
diff changeset
  1984
			break;
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1985
		default:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1986
			/* unsupported */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1987
			return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1988
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1989
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1990
	if (ret != KMF_OK) {
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1991
		kmf_free_data(encodedname);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1992
		return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1993
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1994
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1995
	if ((asn1 = kmfder_alloc()) == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1996
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1997
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  1998
	if (kmfber_printf(asn1, "Tl", tagval, encodedname->Length) == -1)
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  1999
		goto cleanup;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2000
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2001
	if (kmfber_write(asn1, (char *)encodedname->Data,
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2002
	    encodedname->Length, 0) == -1) {
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2003
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2004
		goto cleanup;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2005
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2006
	if (kmfber_flatten(asn1, &extdata) == -1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2007
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2008
		goto cleanup;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2009
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2010
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2011
	kmf_free_data(encodedname);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2012
	encodedname->Data = (uchar_t *)extdata->bv_val;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2013
	encodedname->Length = extdata->bv_len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2014
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2015
	free(extdata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2016
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2017
cleanup:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2018
	if (asn1)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2019
		kmfber_free(asn1, 1);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2020
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2021
	if (ret != KMF_OK)
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2022
		kmf_free_data(encodedname);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2023
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2024
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2025
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2026
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2027
KMF_X509_EXTENSION *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2028
FindExtn(KMF_X509_EXTENSIONS *exts, KMF_OID *oid)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2029
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2030
	KMF_X509_EXTENSION *foundextn = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2031
	int i;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2032
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2033
	if (exts == NULL || oid == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2034
		return (NULL);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2035
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2036
	for (i = 0; i < exts->numberOfExtensions; i++) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2037
		if (IsEqualOid(oid, &exts->extensions[i].extnId))  {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2038
			foundextn = &exts->extensions[i];
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2039
			break;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2040
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2041
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2042
	return (foundextn);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2043
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2044
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2045
KMF_RETURN
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2046
GetSequenceContents(char *data, size_t len,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2047
	char **contents, size_t *outlen)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2048
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2049
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2050
	BerElement *exasn1 = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2051
	BerValue oldextn;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2052
	int tag;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2053
	size_t oldsize;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2054
	char *olddata = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2055
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2056
	if (data == NULL || contents == NULL || outlen == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2057
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2058
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2059
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2060
	 * Decode the sequence of general names
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2061
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2062
	oldextn.bv_val = data;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2063
	oldextn.bv_len = len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2064
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2065
	if ((exasn1 = kmfder_init(&oldextn)) == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2066
		ret = KMF_ERR_MEMORY;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2067
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2068
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2069
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2070
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2071
	 * Unwrap the sequence to find the size of the block
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2072
	 * of GeneralName items in the set.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2073
	 *
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2074
	 * Peek at the tag and length ("tl"),
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2075
	 * then consume them ("{").
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2076
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2077
	if (kmfber_scanf(exasn1, "tl{", &tag, &oldsize) == KMFBER_DEFAULT ||
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2078
	    oldsize == 0) {
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2079
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2080
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2081
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2082
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2083
	olddata = malloc(oldsize);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2084
	if (olddata == NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2085
		ret = KMF_ERR_MEMORY;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2086
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2087
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2088
	(void) memset(olddata, 0, oldsize);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2089
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2090
	 * Read the entire blob of GeneralNames, we don't
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2091
	 * need to interpret them now.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2092
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2093
	if (kmfber_read(exasn1, olddata, oldsize) != oldsize) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2094
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2095
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2096
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2097
out:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2098
	if (exasn1 != NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2099
		kmfber_free(exasn1, 1);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2100
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2101
	if (ret != KMF_OK) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2102
		*contents = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2103
		*outlen = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2104
		if (olddata != NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2105
			free(olddata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2106
	} else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2107
		*contents = olddata;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2108
		*outlen = oldsize;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2109
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2110
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2111
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2112
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2113
KMF_RETURN
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2114
add_an_extension(KMF_X509_EXTENSIONS *exts, KMF_X509_EXTENSION *newextn)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2115
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2116
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2117
	KMF_X509_EXTENSION *extlist;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2118
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2119
	if (exts == NULL || newextn == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2120
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2121
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2122
	extlist = malloc(sizeof (KMF_X509_EXTENSION) *
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2123
	    (exts->numberOfExtensions + 1));
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2124
	if (extlist == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2125
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2126
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2127
	(void) memcpy(extlist, exts->extensions,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2128
	    exts->numberOfExtensions * sizeof (KMF_X509_EXTENSION));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2129
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2130
	(void) memcpy(&extlist[exts->numberOfExtensions], newextn,
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2131
	    sizeof (KMF_X509_EXTENSION));
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2132
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2133
	free(exts->extensions);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2134
	exts->numberOfExtensions++;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2135
	exts->extensions = extlist;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2136
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2137
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2138
}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2139
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2140
KMF_RETURN
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2141
kmf_set_altname(KMF_X509_EXTENSIONS *extensions,
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2142
	KMF_OID *oid,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2143
	int critical,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2144
	KMF_GENERALNAMECHOICES nametype,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2145
	char *namedata)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2146
{
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2147
	KMF_RETURN ret = KMF_OK;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2148
	KMF_X509_EXTENSION subjAltName;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2149
	KMF_DATA dername = { NULL, 0 };
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2150
	BerElement *asn1 = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2151
	BerValue *extdata;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2152
	char *olddata = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2153
	KMF_X509_EXTENSION *foundextn = NULL;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2154
	size_t	oldsize = 0;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2155
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2156
	if (extensions == NULL || oid == NULL || namedata == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2157
		return (KMF_ERR_BAD_PARAMETER);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2158
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2159
	ret = encode_altname(namedata, nametype, &dername);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2160
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2161
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2162
		return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2163
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2164
	(void) memset(&subjAltName, 0, sizeof (subjAltName));
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2165
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2166
	ret = copy_data(&subjAltName.extnId, oid);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2167
	if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2168
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2169
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2170
	 * Check to see if this cert already has a subjectAltName.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2171
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2172
	foundextn = FindExtn(extensions, oid);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2173
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2174
	if (foundextn != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2175
		ret = GetSequenceContents(
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2176
		    (char *)foundextn->BERvalue.Data,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2177
		    foundextn->BERvalue.Length,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2178
		    &olddata, &oldsize);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2179
		if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2180
			goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2181
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2182
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2183
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2184
	 * Assume (!!) that the namedata given is already properly encoded.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2185
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2186
	if ((asn1 = kmfder_alloc()) == NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2187
		return (KMF_ERR_MEMORY);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2188
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2189
	if (kmfber_printf(asn1, "{") == -1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2190
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2191
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2192
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2193
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2194
	/* Write the old extension data first */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2195
	if (olddata != NULL && oldsize > 0) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2196
		if (kmfber_write(asn1, olddata, oldsize, 0) == -1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2197
			ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2198
			goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2199
		}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2200
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2201
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2202
	/* Now add the new name to the list */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2203
	if (kmfber_write(asn1, (char *)dername.Data, dername.Length, 0) == -1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2204
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2205
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2206
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2207
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2208
	/* Now close the sequence */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2209
	if (kmfber_printf(asn1, "}") == -1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2210
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2211
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2212
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2213
	if (kmfber_flatten(asn1, &extdata) == -1) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2214
		ret = KMF_ERR_ENCODING;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2215
		goto out;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2216
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2217
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2218
	/*
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2219
	 * If we are just adding to an existing list of altNames,
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2220
	 * just replace the BER data associated with the found extension.
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2221
	 */
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2222
	if (foundextn != NULL) {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2223
		free(foundextn->BERvalue.Data);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2224
		foundextn->critical = critical;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2225
		foundextn->BERvalue.Data = (uchar_t *)extdata->bv_val;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2226
		foundextn->BERvalue.Length = extdata->bv_len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2227
	} else {
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2228
		subjAltName.critical = critical;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2229
		subjAltName.format = KMF_X509_DATAFORMAT_ENCODED;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2230
		subjAltName.BERvalue.Data = (uchar_t *)extdata->bv_val;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2231
		subjAltName.BERvalue.Length = extdata->bv_len;
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2232
		ret = add_an_extension(extensions, &subjAltName);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2233
		if (ret != KMF_OK)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2234
			free(subjAltName.BERvalue.Data);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2235
	}
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2236
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2237
	free(extdata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2238
out:
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2239
	if (olddata != NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2240
		free(olddata);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2241
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2242
	kmf_free_data(&dername);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2243
	if (ret != KMF_OK)
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2244
		kmf_free_data(&subjAltName.extnId);
3089
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2245
	if (asn1 != NULL)
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2246
		kmfber_free(asn1, 1);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2247
	return (ret);
8ddeb2ace8aa PSARC 2005/074 Solaris Key Management Framework
wyllys
parents:
diff changeset
  2248
}
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2249
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2250
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2251
 * Search a list of attributes for one that matches the given type.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2252
 * Return a pointer into the attribute list.  This does not
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2253
 * return a copy of the value, it returns a reference into the
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2254
 * given list.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2255
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2256
int
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2257
kmf_find_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist, int numattrs)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2258
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2259
	int i;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2260
	for (i = 0; i < numattrs; i++) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2261
		if (attlist[i].type == type)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2262
			return (i);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2263
	}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2264
	return (-1);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2265
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2266
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2267
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2268
 * Verify that a given attribute is consistent with the
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2269
 * "test" attribute.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2270
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2271
static KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2272
verify_attribute(KMF_ATTRIBUTE *givenattr,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2273
	KMF_ATTRIBUTE_TESTER *testattr)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2274
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2275
	/* A NULL pValue was found where one is required */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2276
	if (testattr->null_value_ok == FALSE &&
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2277
	    givenattr->pValue == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2278
		return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2279
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2280
	/* If the given valueLen is too small, return error */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2281
	if (givenattr->pValue != NULL &&
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2282
	    testattr->minlen > 0 &&
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2283
	    (givenattr->valueLen < testattr->minlen))
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2284
		return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2285
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2286
	/* If the given valueLen is too big, return error */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2287
	if (givenattr->pValue != NULL &&
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2288
	    testattr->maxlen > 0 &&
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2289
	    (givenattr->valueLen > testattr->maxlen))
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2290
		return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2291
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2292
	return (KMF_OK);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2293
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2294
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2295
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2296
 * Given a set of required attribute tests and optional
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2297
 * attributes, make sure that the actual attributes
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2298
 * being tested (attrlist below) are allowed and are
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2299
 * properly specified.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2300
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2301
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2302
test_attributes(int reqnum, KMF_ATTRIBUTE_TESTER *reqattrs,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2303
	int optnum, KMF_ATTRIBUTE_TESTER *optattrs,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2304
	int numattrs, KMF_ATTRIBUTE *attrlist)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2305
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2306
	KMF_RETURN ret = KMF_OK;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2307
	int i, idx;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2308
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2309
	/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2310
	 * If the caller didn't supply enough attributes,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2311
	 * return an error.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2312
	 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2313
	if (numattrs < reqnum || attrlist == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2314
		return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2315
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2316
	/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2317
	 * Make sure all required attrs are present and
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2318
	 * correct.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2319
	 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2320
	for (i = 0; i < reqnum && ret == KMF_OK; i++) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2321
		idx = kmf_find_attr(reqattrs[i].type, attrlist, numattrs);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2322
		/* If a required attr is not found, return error */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2323
		if (idx == -1) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2324
			return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2325
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2326
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2327
		ret = verify_attribute(&attrlist[idx], &reqattrs[i]);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2328
	}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2329
	/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2330
	 * Now test the optional parameters.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2331
	 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2332
	for (i = 0; i < optnum && ret == KMF_OK; i++) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2333
		idx = kmf_find_attr(optattrs[i].type, attrlist, numattrs);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2334
		/* If a optional attr is not found, continue. */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2335
		if (idx == -1) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2336
			continue;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2337
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2338
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2339
		ret = verify_attribute(&attrlist[idx], &optattrs[i]);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2340
	}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2341
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2342
	return (ret);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2343
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2344
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2345
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2346
 * Given an already allocated attribute list, insert
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2347
 * the given attribute information at a specific index
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2348
 * in the list.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2349
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2350
void
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2351
kmf_set_attr_at_index(KMF_ATTRIBUTE *attlist, int index,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2352
	KMF_ATTR_TYPE type,  void *pValue, uint32_t len)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2353
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2354
	if (attlist == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2355
		return;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2356
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2357
	attlist[index].type = type;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2358
	attlist[index].pValue = pValue;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2359
	attlist[index].valueLen = len;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2360
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2361
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2362
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2363
 * Find an attribute matching a particular type and set
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2364
 * the pValue and length fields to the given values.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2365
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2366
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2367
kmf_set_attr(KMF_ATTRIBUTE *attlist, int numattr,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2368
	KMF_ATTR_TYPE type,  void *pValue, uint32_t len)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2369
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2370
	int idx;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2371
	if (attlist == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2372
		return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2373
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2374
	idx = kmf_find_attr(type, attlist, numattr);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2375
	if (idx == -1)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2376
		return (KMF_ERR_ATTR_NOT_FOUND);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2377
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2378
	attlist[idx].type = type;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2379
	/* Assumes the attribute pValue can hold the result */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2380
	if (attlist[idx].pValue != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2381
		if (attlist[idx].valueLen >= len)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2382
			(void) memcpy(attlist[idx].pValue, pValue, len);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2383
		else
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2384
			return (KMF_ERR_BUFFER_SIZE);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2385
	}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2386
	attlist[idx].valueLen = len;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2387
	return (KMF_OK);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2388
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2389
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2390
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2391
 * Find a particular attribute in a list and return
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2392
 * a pointer to its value.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2393
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2394
void *
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2395
kmf_get_attr_ptr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2396
	int numattrs)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2397
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2398
	int i;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2399
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2400
	i = kmf_find_attr(type, attlist, numattrs);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2401
	if (i == -1)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2402
		return (NULL);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2403
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2404
	return (attlist[i].pValue);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2405
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2406
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2407
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2408
 * Find a particular attribute in a list and return
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2409
 * the value and length values.  Value and length
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2410
 * may be NULL if the caller doesn't want their values
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2411
 * to be filled in.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2412
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2413
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2414
kmf_get_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2415
	int numattrs, void *outValue, uint32_t *outlen)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2416
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2417
	int i;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2418
	uint32_t len = 0;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2419
	uint32_t *lenptr = outlen;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2420
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2421
	if (lenptr == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2422
		lenptr = &len;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2423
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2424
	i = kmf_find_attr(type, attlist, numattrs);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2425
	if (i == -1)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2426
		return (KMF_ERR_ATTR_NOT_FOUND);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2427
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2428
	/* This assumes that the ptr passed in is pre-allocated space */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2429
	if (attlist[i].pValue != NULL && outValue != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2430
		/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2431
		 * If the caller did not specify a length,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2432
		 * assume "outValue" is big enough.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2433
		 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2434
		if (outlen != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2435
			if (*outlen >= attlist[i].valueLen)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2436
				(void) memcpy(outValue, attlist[i].pValue,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2437
				    attlist[i].valueLen);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2438
			else
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2439
				return (KMF_ERR_BUFFER_SIZE);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2440
		} else {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2441
			(void) memcpy(outValue, attlist[i].pValue,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2442
			    attlist[i].valueLen);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2443
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2444
	}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2445
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2446
	if (outlen != NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2447
		*outlen = attlist[i].valueLen;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2448
	return (KMF_OK);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2449
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2450
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2451
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2452
 * Utility routine to find a string type attribute, allocate it
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2453
 * and return the value to the caller.  This simplifies the
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2454
 * operation by doing both "kmf_get_attr" calls and avoids
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2455
 * duplicating this block of code in lots of places.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2456
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2457
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2458
kmf_get_string_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attrlist,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2459
	int numattrs, char **outstr)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2460
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2461
	KMF_RETURN rv;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2462
	uint32_t len;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2463
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2464
	if (outstr == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2465
		return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2466
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2467
	if ((rv = kmf_get_attr(type, attrlist, numattrs, NULL, &len)) ==
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2468
	    KMF_OK) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2469
		*outstr = malloc(len + 1);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2470
		if ((*outstr) == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2471
			return (KMF_ERR_MEMORY);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2472
		(void) memset((*outstr), 0, len + 1);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2473
		rv = kmf_get_attr(type, attrlist, numattrs, (*outstr), &len);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2474
		if (rv != KMF_OK) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2475
			free(*outstr);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2476
			*outstr = NULL;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2477
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2478
	}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2479
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2480
	return (rv);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2481
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2482
5626
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2483
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2484
void
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2485
free_entry(conf_entry_t *entry)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2486
{
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2487
	if (entry == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2488
		return;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2489
	free(entry->keystore);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2490
	free(entry->modulepath);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2491
	free(entry->option);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2492
}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2493
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2494
void
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2495
free_entrylist(conf_entrylist_t *list)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2496
{
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2497
	conf_entrylist_t *next;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2498
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2499
	while (list != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2500
		next = list->next;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2501
		free_entry(list->entry);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2502
		free(list);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2503
		list = next;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2504
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2505
}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2506
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2507
static KMF_RETURN
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2508
parse_entry(char *buf, conf_entry_t **entry)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2509
{
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2510
	KMF_RETURN ret = KMF_OK;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2511
	conf_entry_t *tmp = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2512
	char *token1;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2513
	char *token2;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2514
	char *token3;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2515
	char *lasts;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2516
	char *value;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2517
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2518
	if ((token1 = strtok_r(buf, SEP_COLON, &lasts)) == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2519
		return (KMF_ERR_KMF_CONF);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2520
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2521
	if ((tmp = calloc(sizeof (conf_entry_t), 1)) == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2522
		return (KMF_ERR_MEMORY);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2523
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2524
	if ((tmp->keystore = strdup(token1)) == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2525
		ret = KMF_ERR_MEMORY;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2526
		goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2527
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2528
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2529
	if ((token2 = strtok_r(NULL, SEP_SEMICOLON, &lasts)) == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2530
		ret = KMF_ERR_KMF_CONF;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2531
		goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2532
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2533
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2534
	/* need to get token3 first to satisfy nested strtok invocations */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2535
	token3 = strtok_r(NULL, SEP_SEMICOLON, &lasts);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2536
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2537
	/* parse token2 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2538
	if (strncmp(token2, CONF_MODULEPATH, strlen(CONF_MODULEPATH)) != 0) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2539
		ret = KMF_ERR_KMF_CONF;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2540
		goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2541
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2542
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2543
	if (value = strpbrk(token2, SEP_EQUAL)) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2544
		value++; /* get rid of = */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2545
	} else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2546
		ret = KMF_ERR_KMF_CONF;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2547
		goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2548
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2549
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2550
	if ((tmp->modulepath = strdup(value)) == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2551
		ret = KMF_ERR_MEMORY;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2552
		goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2553
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2554
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2555
	/* parse token3, if it exists */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2556
	if (token3 != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2557
		if (strncmp(token3, CONF_OPTION, strlen(CONF_OPTION))
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2558
		    != 0) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2559
			ret = KMF_ERR_KMF_CONF;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2560
			goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2561
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2562
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2563
		if (value = strpbrk(token3, SEP_EQUAL)) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2564
			value++; /* get rid of = */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2565
		} else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2566
			ret = KMF_ERR_KMF_CONF;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2567
			goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2568
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2569
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2570
		if ((tmp->option = strdup(value)) == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2571
			ret = KMF_ERR_MEMORY;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2572
			goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2573
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2574
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2575
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2576
	*entry = tmp;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2577
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2578
end:
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2579
	if (ret != KMF_OK) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2580
		free_entry(tmp);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2581
		free(tmp);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2582
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2583
	return (ret);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2584
}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2585
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2586
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2587
conf_entry_t *
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2588
dup_entry(conf_entry_t *entry)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2589
{
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2590
	conf_entry_t *rtn_entry;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2591
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2592
	if (entry == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2593
		return (NULL);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2594
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2595
	rtn_entry = malloc(sizeof (conf_entry_t));
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2596
	if (rtn_entry == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2597
		return (NULL);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2598
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2599
	if ((rtn_entry->keystore = strdup(entry->keystore)) == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2600
		goto out;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2601
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2602
	if ((rtn_entry->modulepath = strdup(entry->modulepath)) == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2603
		goto out;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2604
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2605
	if (entry->option != NULL &&
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2606
	    (rtn_entry->option = strdup(entry->modulepath)) == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2607
		goto out;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2608
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2609
	return (rtn_entry);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2610
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2611
out:
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2612
	free_entry(rtn_entry);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2613
	return (NULL);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2614
}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2615
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2616
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2617
/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2618
 * This function takes a keystore_name as input and returns
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2619
 * the KMF_KEYSTORE_TYPE value assigned to it.  If the "option"
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2620
 * argument is not NULL, this function also returns the option string
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2621
 * if there is an option string for the plugin module.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2622
 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2623
KMF_RETURN
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2624
kmf_get_plugin_info(KMF_HANDLE_T handle, char *keystore_name,
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2625
    KMF_KEYSTORE_TYPE *kstype, char **option)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2626
{
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2627
	KMF_RETURN ret = KMF_OK;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2628
	conf_entrylist_t  *phead = extra_plugin_list;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2629
	boolean_t is_default = B_TRUE;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2630
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2631
	/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2632
	 * Although handle is not really used in the function, we will
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2633
	 * check the handle to make sure that kmf_intialize() is called
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2634
	 * before this function.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2635
	 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2636
	if (handle == NULL || keystore_name == NULL || kstype == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2637
		return (KMF_ERR_BAD_PARAMETER);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2638
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2639
	if (strcmp(keystore_name, "pkcs11") == 0) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2640
		*kstype = KMF_KEYSTORE_PK11TOKEN;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2641
	} else if (strcmp(keystore_name, "file") == 0) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2642
		*kstype = KMF_KEYSTORE_OPENSSL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2643
	} else if (strcmp(keystore_name, "nss") == 0) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2644
		*kstype = KMF_KEYSTORE_NSS;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2645
	} else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2646
		is_default = B_FALSE;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2647
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2648
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2649
	if (is_default) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2650
		if (option != NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2651
			*option = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2652
		goto out;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2653
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2654
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2655
	/* Not a built-in plugin; check if it is in extra_plugin_list. */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2656
	while (phead != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2657
		if (strcmp(phead->entry->keystore, keystore_name) == 0)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2658
			break;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2659
		phead = phead->next;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2660
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2661
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2662
	if (phead == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2663
		ret = KMF_ERR_PLUGIN_NOTFOUND;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2664
		goto out;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2665
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2666
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2667
	/* found it */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2668
	*kstype = phead->entry->kstype;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2669
	if (option != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2670
		if (phead->entry->option == NULL)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2671
			*option = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2672
		else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2673
			*option = strdup(phead->entry->option);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2674
			if (*option == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2675
				ret = KMF_ERR_MEMORY;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2676
				goto out;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2677
			}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2678
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2679
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2680
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2681
out:
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2682
	return (ret);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2683
}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2684
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2685
/*
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2686
 * Retrieve the non-default plugin list from the kmf.conf file.
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2687
 */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2688
KMF_RETURN
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2689
get_entrylist(conf_entrylist_t **entlist)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2690
{
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2691
	KMF_RETURN rv = KMF_OK;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2692
	FILE *pfile;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2693
	conf_entry_t *entry;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2694
	conf_entrylist_t *rtnlist = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2695
	conf_entrylist_t *ptmp;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2696
	conf_entrylist_t *pcur;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2697
	char buffer[MAXPATHLEN];
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2698
	size_t len;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2699
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2700
	if ((pfile = fopen(_PATH_KMF_CONF, "rF")) == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2701
		cryptoerror(LOG_ERR, "failed to open %s.\n", _PATH_KMF_CONF);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2702
		return (KMF_ERR_KMF_CONF);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2703
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2704
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2705
	while (fgets(buffer, MAXPATHLEN, pfile) != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2706
		if (buffer[0] == '#' || buffer[0] == ' ' ||
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2707
		    buffer[0] == '\n'|| buffer[0] == '\t') {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2708
			continue;   /* ignore comment lines */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2709
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2710
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2711
		len = strlen(buffer);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2712
		if (buffer[len-1] == '\n') { /* get rid of trailing '\n' */
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2713
			len--;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2714
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2715
		buffer[len] = '\0';
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2716
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2717
		rv = parse_entry(buffer, &entry);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2718
		if (rv != KMF_OK) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2719
			goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2720
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2721
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2722
		if ((ptmp = malloc(sizeof (conf_entrylist_t))) == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2723
			rv = KMF_ERR_MEMORY;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2724
			goto end;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2725
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2726
		ptmp->entry = entry;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2727
		ptmp->next = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2728
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2729
		if (rtnlist == NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2730
			rtnlist = pcur = ptmp;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2731
		} else {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2732
			pcur->next = ptmp;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2733
			pcur = ptmp;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2734
		}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2735
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2736
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2737
end:
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2738
	(void) fclose(pfile);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2739
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2740
	if (rv == KMF_OK) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2741
		*entlist = rtnlist;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2742
	} else if (rtnlist != NULL) {
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2743
		free_entrylist(rtnlist);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2744
		*entlist = NULL;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2745
		kstore_num = DEFAULT_KEYSTORE_NUM;
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2746
	}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2747
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2748
	return (rv);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2749
}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2750
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2751
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2752
boolean_t
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2753
is_valid_keystore_type(KMF_KEYSTORE_TYPE kstype)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2754
{
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2755
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2756
	if (kstype > 0 && kstype <= kstore_num)
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2757
		return (B_TRUE);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2758
	else
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2759
		return (B_FALSE);
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2760
}
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2761
1f8878c75f54 PSARC 2007/604 KMF Pluggability Enhancements
hylee
parents: 5536
diff changeset
  2762
5051
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2763
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2764
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2765
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2766
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2767
KMF_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2768
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2769
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2770
	KMF_ATTRIBUTE attlist[32];
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2771
	int i = 0;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2772
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2773
	if (params == NULL)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2774
		return (KMF_ERR_BAD_PARAMETER);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2775
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2776
	kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2777
	    KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2778
	i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2779
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2780
	if (params->kstype == KMF_KEYSTORE_NSS) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2781
		if (params->nssconfig.configdir != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2782
			kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2783
			    KMF_DIRPATH_ATTR,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2784
			    params->nssconfig.configdir,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2785
			    strlen(params->nssconfig.configdir));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2786
			i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2787
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2788
		if (params->nssconfig.certPrefix != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2789
			kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2790
			    KMF_CERTPREFIX_ATTR,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2791
			    params->nssconfig.certPrefix,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2792
			    strlen(params->nssconfig.certPrefix));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2793
			i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2794
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2795
		if (params->nssconfig.keyPrefix != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2796
			kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2797
			    KMF_KEYPREFIX_ATTR,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2798
			    params->nssconfig.keyPrefix,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2799
			    strlen(params->nssconfig.keyPrefix));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2800
			i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2801
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2802
		if (params->nssconfig.secModName != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2803
			kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2804
			    KMF_SECMODNAME_ATTR,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2805
			    params->nssconfig.secModName,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2806
			    strlen(params->nssconfig.secModName));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2807
			i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2808
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2809
	} else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2810
		if (params->pkcs11config.label != NULL) {
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2811
			kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2812
			    KMF_TOKEN_LABEL_ATTR,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2813
			    params->pkcs11config.label,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2814
			    strlen(params->pkcs11config.label));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2815
			i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2816
		}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2817
		kmf_set_attr_at_index(attlist, i,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2818
		    KMF_READONLY_ATTR,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2819
		    &params->pkcs11config.readonly,
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2820
		    sizeof (params->pkcs11config.readonly));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2821
		i++;
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2822
	}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2823
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2824
	return (kmf_configure_keystore(handle, i, attlist));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2825
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2826
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2827
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2828
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2829
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2830
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2831
KMF_Initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2832
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2833
	return (kmf_initialize(outhandle, policyfile, policyname));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2834
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2835
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2836
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2837
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2838
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2839
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2840
KMF_Finalize(KMF_HANDLE_T handle)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2841
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2842
	return (kmf_finalize(handle));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2843
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2844
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2845
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2846
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2847
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2848
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2849
KMF_GetKMFErrorString(KMF_RETURN errcode, char **errmsg)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2850
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2851
	return (kmf_get_kmf_error_str(errcode, errmsg));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2852
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2853
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2854
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2855
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2856
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2857
KMF_RETURN
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2858
KMF_ReadInputFile(KMF_HANDLE_T handle, char *filename,  KMF_DATA *pdata)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2859
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2860
	return (kmf_read_input_file(handle, filename, pdata));
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2861
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2862
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2863
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2864
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2865
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2866
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2867
void
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2868
KMF_FreeKMFCert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2869
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2870
	kmf_free_kmf_cert(handle, kmf_cert);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2871
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2872
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2873
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2874
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2875
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2876
void
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2877
KMF_FreeData(KMF_DATA *datablock)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2878
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2879
	kmf_free_data(datablock);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2880
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2881
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2882
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2883
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2884
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2885
void
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2886
KMF_FreeKMFKey(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2887
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2888
	kmf_free_kmf_key(handle, key);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2889
}
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2890
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2891
/*
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2892
 * This API is used by elfsign. We must keep it in old API form.
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2893
 */
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2894
void
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2895
KMF_FreeSignedCSR(KMF_CSR_DATA *csr)
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2896
{
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2897
	kmf_free_signed_csr(csr);
cbbb7c8b40a9 PSARC 2007/426 KMFAPI Interface Taxonomy Change
wyllys
parents: 4122
diff changeset
  2898
}