1 /*
2  * CDDL HEADER START
3  *
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.
7  *
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.
12  *
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]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.   All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_CRYPTOKI_H
27 #define	_CRYPTOKI_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #ifndef	CK_PTR
36 #define	CK_PTR *
37 #endif
38 
39 #ifndef CK_DEFINE_FUNCTION
40 #define	CK_DEFINE_FUNCTION(returnType, name) returnType name
41 #endif
42 
43 #ifndef CK_DECLARE_FUNCTION
44 #define	CK_DECLARE_FUNCTION(returnType, name) returnType name
45 #endif
46 
47 #ifndef CK_DECLARE_FUNCTION_POINTER
48 #define	CK_DECLARE_FUNCTION_POINTER(returnType, name) returnType (* name)
49 #endif
50 
51 #ifndef CK_CALLBACK_FUNCTION
52 #define	CK_CALLBACK_FUNCTION(returnType, name) returnType (* name)
53 #endif
54 
55 #ifndef NULL_PTR
56 #include <unistd.h>	/* For NULL */
57 #define	NULL_PTR NULL
58 #endif
59 
60 /*
61  * pkcs11t.h defines TRUE and FALSE in a way that upsets lint
62  */
63 #ifndef	CK_DISABLE_TRUE_FALSE
64 #define	CK_DISABLE_TRUE_FALSE
65 #ifndef	TRUE
66 #define	TRUE	1
67 #endif /* TRUE */
68 #ifndef	FALSE
69 #define	FALSE	0
70 #endif /* FALSE */
71 #endif /* CK_DISABLE_TRUE_FALSE */
72 
73 #undef CK_PKCS11_FUNCTION_INFO
74 
75 #include <security/pkcs11.h>
76 
77 /* Default salt len to generate PKCS#5 key */
78 #define	CK_PKCS5_PBKD2_SALT_SIZE	(16UL)
79 
80 /* Default number of iterations to generate PKCS#5 key */
81 #define	CK_PKCS5_PBKD2_ITERATIONS	(1000UL)
82 
83 /* Solaris specific functions */
84 
85 #include <stdlib.h>
86 
87 /*
88  * pkcs11_GetCriteriaSession will initialize the framework and do all
89  * the necessary work of calling C_GetSlotList(), C_GetMechanismInfo()
90  * C_OpenSession() to create a session that meets all the criteria in
91  * the given function pointer.
92  */
93 CK_RV pkcs11_GetCriteriaSession(
94     boolean_t (*criteria)(CK_SLOT_ID slot_id, void *args, CK_RV *rv),
95     void *args, CK_SESSION_HANDLE_PTR hSession);
96 
97 /*
98  * SUNW_C_GetMechSession will initialize the framework and do all
99  * the necessary PKCS#11 calls to create a session capable of
100  * providing operations on the requested mechanism
101  */
102 CK_RV SUNW_C_GetMechSession(CK_MECHANISM_TYPE mech,
103     CK_SESSION_HANDLE_PTR hSession);
104 
105 /*
106  * SUNW_C_KeyToObject will create a secret key object for the given
107  * mechanism from the rawkey data.
108  */
109 CK_RV SUNW_C_KeyToObject(CK_SESSION_HANDLE hSession,
110     CK_MECHANISM_TYPE mech, const void *rawkey, size_t rawkey_len,
111     CK_OBJECT_HANDLE_PTR obj);
112 
113 /*
114  * pkcs11_PasswdToPBKD2Object will create a secret key from the given string
115  * (e.g. passphrase) using PKCS#5 Password-Based Key Derivation Function 2
116  * (PBKD2).
117  */
118 CK_RV
119 pkcs11_PasswdToPBKD2Object(CK_SESSION_HANDLE hSession, char *passphrase,
120     size_t passphrase_len, void *salt, size_t salt_len, CK_ULONG iterations,
121     CK_KEY_TYPE key_type, CK_ULONG key_len, CK_FLAGS key_flags,
122     CK_OBJECT_HANDLE_PTR obj);
123 
124 /*
125  * pkcs11_ObjectToKey gets the rawkey data from a secret key object.
126  * The caller is responsible to free the allocated rawkey data.
127  */
128 CK_RV
129 pkcs11_ObjectToKey(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE obj,
130     void **rawkey, size_t *rawkey_len, boolean_t destroy_obj);
131 
132 /*
133  * pkcs11_PasswdToKey will create PKCS#5 PBKD2 rawkey data from the
134  * given passphrase.  The caller is responsible to free the allocated
135  * rawkey data.
136  */
137 CK_RV
138 pkcs11_PasswdToKey(CK_SESSION_HANDLE hSession, char *passphrase,
139     size_t passphrase_len, void *salt, size_t salt_len, CK_KEY_TYPE key_type,
140     CK_ULONG key_len, void **rawkey, size_t *rawkey_len);
141 
142 #ifdef	__cplusplus
143 }
144 #endif
145 
146 #endif	/* _CRYPTOKI_H */
147