4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
21 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
27 #include <kmfpolicy.h>
33 /* Plugin function table */
36 KMF_RETURN (*ConfigureKeystore
) (
41 KMF_RETURN (*FindCert
) (
50 KMF_RETURN (*StoreCert
) (
52 int, KMF_ATTRIBUTE
*);
54 KMF_RETURN (*ImportCert
) (
56 int, KMF_ATTRIBUTE
*);
58 KMF_RETURN (*ImportCRL
) (
60 int, KMF_ATTRIBUTE
*);
62 KMF_RETURN (*DeleteCert
) (
64 int, KMF_ATTRIBUTE
*);
66 KMF_RETURN (*DeleteCRL
) (
68 int, KMF_ATTRIBUTE
*);
70 KMF_RETURN (*CreateKeypair
) (
75 KMF_RETURN (*FindKey
) (
80 KMF_RETURN (*EncodePubkeyData
) (
85 KMF_RETURN (*SignData
) (
92 KMF_RETURN (*DeleteKey
) (
97 KMF_RETURN (*ListCRL
) (
99 int, KMF_ATTRIBUTE
*);
101 KMF_RETURN (*FindCRL
) (
103 int, KMF_ATTRIBUTE
*);
105 KMF_RETURN (*FindCertInCRL
) (
107 int, KMF_ATTRIBUTE
*);
109 KMF_RETURN (*GetErrorString
) (
113 KMF_RETURN (*FindPrikeyByCert
) (
118 KMF_RETURN (*DecryptData
) (
125 KMF_RETURN (*ExportPK12
)(
130 KMF_RETURN (*CreateSymKey
) (
135 KMF_RETURN (*GetSymKeyValue
) (
140 KMF_RETURN (*SetTokenPin
) (
142 int, KMF_ATTRIBUTE
*);
144 KMF_RETURN (*StoreKey
) (
151 } KMF_PLUGIN_FUNCLIST
;
155 boolean_t null_value_ok
; /* Is the pValue required */
158 } KMF_ATTRIBUTE_TESTER
;
161 KMF_KEYSTORE_TYPE type
;
165 KMF_PLUGIN_FUNCLIST
*funclist
;
168 typedef struct _KMF_PLUGIN_LIST
{
170 struct _KMF_PLUGIN_LIST
*next
;
173 typedef struct _kmf_handle
{
175 * session handle opened by kmf_select_token() to talk
176 * to a specific slot in Crypto framework. It is used
177 * by pkcs11 plugin module.
179 CK_SESSION_HANDLE pk11handle
;
181 KMF_POLICY_RECORD
*policy
;
182 KMF_PLUGIN_LIST
*plugins
;
183 KMF_MAPPER_STATE
*mapstate
;
186 #define CLEAR_ERROR(h, rv) { \
188 rv = KMF_ERR_BAD_PARAMETER; \
190 h->lasterr.errcode = 0; \
191 h->lasterr.kstype = 0; \
196 #define KMF_PLUGIN_INIT_SYMBOL "KMF_Plugin_Initialize"
198 #ifndef KMF_PLUGIN_PATH
199 #if defined(__sparcv9)
200 #define KMF_PLUGIN_PATH "/lib/crypto/sparcv9/"
201 #elif defined(__sparc)
202 #define KMF_PLUGIN_PATH "/lib/crypto/"
203 #elif defined(__i386)
204 #define KMF_PLUGIN_PATH "/lib/crypto/"
205 #elif defined(__amd64)
206 #define KMF_PLUGIN_PATH "/lib/crypto/amd64/"
208 #endif /* !KMF_PLUGIN_PATH */
210 KMF_PLUGIN_FUNCLIST
*KMF_Plugin_Initialize();
213 VerifyDataWithKey(KMF_HANDLE_T
, KMF_DATA
*, KMF_ALGORITHM_INDEX
,
214 KMF_DATA
*, KMF_DATA
*);
216 extern KMF_BOOL
pkcs_algid_to_keytype(
217 KMF_ALGORITHM_INDEX
, CK_KEY_TYPE
*);
219 extern KMF_RETURN
PKCS_DigestData(KMF_HANDLE_T
,
220 CK_SESSION_HANDLE
, CK_MECHANISM_TYPE
,
221 KMF_DATA
*, KMF_DATA
*, boolean_t
);
223 extern KMF_RETURN
PKCS_VerifyData(
227 KMF_DATA
*, KMF_DATA
*);
229 extern KMF_RETURN
PKCS_EncryptData(
236 extern KMF_PLUGIN
*FindPlugin(KMF_HANDLE_T
, KMF_KEYSTORE_TYPE
);
238 extern KMF_BOOL
IsEqualOid(KMF_OID
*, KMF_OID
*);
240 extern KMF_RETURN
copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER
*destid
,
241 KMF_X509_ALGORITHM_IDENTIFIER
*srcid
);
243 extern KMF_OID
*x509_algid_to_algoid(KMF_ALGORITHM_INDEX
);
244 extern KMF_ALGORITHM_INDEX
x509_algoid_to_algid(KMF_OID
*);
246 extern KMF_RETURN
GetIDFromSPKI(KMF_X509_SPKI
*, KMF_DATA
*);
247 extern KMF_RETURN
kmf_select_token(KMF_HANDLE_T
, char *, int);
248 extern KMF_RETURN
kmf_set_altname(KMF_X509_EXTENSIONS
*,
249 KMF_OID
*, int, KMF_GENERALNAMECHOICES
, char *);
250 extern KMF_RETURN
GetSequenceContents(char *, size_t, char **, size_t *);
251 extern KMF_X509_EXTENSION
*FindExtn(KMF_X509_EXTENSIONS
*, KMF_OID
*);
252 extern KMF_RETURN
add_an_extension(KMF_X509_EXTENSIONS
*exts
,
253 KMF_X509_EXTENSION
*newextn
);
254 extern KMF_RETURN
set_integer(KMF_DATA
*, void *, int);
255 extern void free_keyidlist(KMF_OID
*, int);
256 extern KMF_RETURN
copy_data(KMF_DATA
*, KMF_DATA
*);
257 extern void Cleanup_PK11_Session(KMF_HANDLE_T handle
);
258 extern void free_dp_name(KMF_CRL_DIST_POINT
*);
259 extern void free_dp(KMF_CRL_DIST_POINT
*);
260 extern KMF_RETURN
set_key_usage_extension(KMF_X509_EXTENSIONS
*,
262 extern KMF_RETURN
init_pk11();
263 extern KMF_RETURN
test_attributes(int, KMF_ATTRIBUTE_TESTER
*,
264 int, KMF_ATTRIBUTE_TESTER
*, int, KMF_ATTRIBUTE
*);
266 /* Indexes into the key parts array for RSA keys */
267 #define KMF_RSA_MODULUS (0)
268 #define KMF_RSA_PUBLIC_EXPONENT (1)
269 #define KMF_RSA_PRIVATE_EXPONENT (2)
270 #define KMF_RSA_PRIME1 (3)
271 #define KMF_RSA_PRIME2 (4)
272 #define KMF_RSA_EXPONENT1 (5)
273 #define KMF_RSA_EXPONENT2 (6)
274 #define KMF_RSA_COEFFICIENT (7)
276 /* Key part counts for RSA keys */
277 #define KMF_NUMBER_RSA_PUBLIC_KEY_PARTS (2)
278 #define KMF_NUMBER_RSA_PRIVATE_KEY_PARTS (8)
280 /* Key part counts for DSA keys */
281 #define KMF_NUMBER_DSA_PUBLIC_KEY_PARTS (4)
282 #define KMF_NUMBER_DSA_PRIVATE_KEY_PARTS (4)
284 /* Indexes into the key parts array for DSA keys */
285 #define KMF_DSA_PRIME (0)
286 #define KMF_DSA_SUB_PRIME (1)
287 #define KMF_DSA_BASE (2)
288 #define KMF_DSA_PUBLIC_VALUE (3)
290 #define KMF_ECDSA_PARAMS (0)
291 #define KMF_ECDSA_POINT (1)
294 #define max(a, b) ((a) < (b) ? (b) : (a))
297 /* Maximum key parts for all algorithms */
298 #define KMF_MAX_PUBLIC_KEY_PARTS \
299 (max(KMF_NUMBER_RSA_PUBLIC_KEY_PARTS, \
300 KMF_NUMBER_DSA_PUBLIC_KEY_PARTS))
302 #define KMF_MAX_PRIVATE_KEY_PARTS \
303 (max(KMF_NUMBER_RSA_PRIVATE_KEY_PARTS, \
304 KMF_NUMBER_DSA_PRIVATE_KEY_PARTS))
306 #define KMF_MAX_KEY_PARTS \
307 (max(KMF_MAX_PUBLIC_KEY_PARTS, KMF_MAX_PRIVATE_KEY_PARTS))
310 KMF_ALGMODE_NONE
= 0,
312 KMF_ALGMODE_PUBLIC_KEY
,
313 KMF_ALGMODE_PRIVATE_KEY
,
314 KMF_ALGMODE_PKCS1_EMSA_V15
315 } KMF_SIGNATURE_MODE
;
317 #define KMF_CERT_PRINTABLE_LEN 1024
318 #define SHA1_HASH_LENGTH 20
320 #define OCSPREQ_TEMPNAME "/tmp/ocsp.reqXXXXXX"
321 #define OCSPRESP_TEMPNAME "/tmp/ocsp.respXXXXXX"
323 #define _PATH_KMF_CONF "/etc/crypto/kmf.conf"
324 #define CONF_MODULEPATH "modulepath="
325 #define CONF_OPTION "option="
331 KMF_KEYSTORE_TYPE kstype
;
334 typedef struct conf_entrylist
{
336 struct conf_entrylist
*next
;
339 extern KMF_RETURN
get_pk11_data(KMF_ALGORITHM_INDEX
,
340 CK_KEY_TYPE
*, CK_MECHANISM_TYPE
*, CK_MECHANISM_TYPE
*, boolean_t
);
341 extern KMF_RETURN
kmf_create_pk11_session(CK_SESSION_HANDLE
*,
342 CK_MECHANISM_TYPE
, CK_FLAGS
);
343 extern KMF_RETURN
get_entrylist(conf_entrylist_t
**);
344 extern void free_entrylist(conf_entrylist_t
*);
345 extern void free_entry(conf_entry_t
*);
346 extern conf_entry_t
*dup_entry(conf_entry_t
*);
347 extern boolean_t
is_valid_keystore_type(KMF_KEYSTORE_TYPE
);
348 extern KMF_BOOL
is_eku_present(KMF_X509EXT_EKU
*, KMF_OID
*);
349 extern KMF_RETURN
parse_eku_data(const KMF_DATA
*, KMF_X509EXT_EKU
*);
350 extern KMF_RETURN
copy_extension_data(KMF_X509_EXTENSION
*,
351 KMF_X509_EXTENSION
*);
352 extern char *get_mapper_pathname(char *, char *);
357 #endif /* _KMFAPIP_H */