|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 /* |
|
5 * Copyright (C) 1994-1999 RSA Security Inc. Licence to copy this document |
|
6 * is granted provided that it is identified as "RSA Security In.c Public-Key |
|
7 * Cryptography Standards (PKCS)" in all material mentioning or referencing |
|
8 * this document. |
|
9 * |
|
10 * The latest version of this header can be found at: |
|
11 * http://www.rsalabs.com/pkcs/pkcs-11/index.html |
|
12 */ |
|
13 #ifndef _PKCS11_H_ |
|
14 #define _PKCS11_H_ 1 |
|
15 |
|
16 #ifdef __cplusplus |
|
17 extern "C" { |
|
18 #endif |
|
19 |
|
20 /* Before including this file (pkcs11.h) (or pkcs11t.h by |
|
21 * itself), 6 platform-specific macros must be defined. These |
|
22 * macros are described below, and typical definitions for them |
|
23 * are also given. Be advised that these definitions can depend |
|
24 * on both the platform and the compiler used (and possibly also |
|
25 * on whether a PKCS #11 library is linked statically or |
|
26 * dynamically). |
|
27 * |
|
28 * In addition to defining these 6 macros, the packing convention |
|
29 * for PKCS #11 structures should be set. The PKCS #11 |
|
30 * convention on packing is that structures should be 1-byte |
|
31 * aligned. |
|
32 * |
|
33 * In a Win32 environment, this might be done by using the |
|
34 * following preprocessor directive before including pkcs11.h |
|
35 * or pkcs11t.h: |
|
36 * |
|
37 * #pragma pack(push, cryptoki, 1) |
|
38 * |
|
39 * and using the following preprocessor directive after including |
|
40 * pkcs11.h or pkcs11t.h: |
|
41 * |
|
42 * #pragma pack(pop, cryptoki) |
|
43 * |
|
44 * In a UNIX environment, you're on your own here. You might |
|
45 * not need to do anything. |
|
46 * |
|
47 * |
|
48 * Now for the macros: |
|
49 * |
|
50 * |
|
51 * 1. CK_PTR: The indirection string for making a pointer to an |
|
52 * object. It can be used like this: |
|
53 * |
|
54 * typedef CK_BYTE CK_PTR CK_BYTE_PTR; |
|
55 * |
|
56 * In a Win32 environment, it might be defined by |
|
57 * |
|
58 * #define CK_PTR * |
|
59 * |
|
60 * In a UNIX environment, it might be defined by |
|
61 * |
|
62 * #define CK_PTR * |
|
63 * |
|
64 * |
|
65 * 2. CK_DEFINE_FUNCTION(returnType, name): A macro which makes |
|
66 * an exportable PKCS #11 library function definition out of a |
|
67 * return type and a function name. It should be used in the |
|
68 * following fashion to define the exposed PKCS #11 functions in |
|
69 * a PKCS #11 library: |
|
70 * |
|
71 * CK_DEFINE_FUNCTION(CK_RV, C_Initialize)( |
|
72 * CK_VOID_PTR pReserved |
|
73 * ) |
|
74 * { |
|
75 * ... |
|
76 * } |
|
77 * |
|
78 * For defining a function in a Win32 PKCS #11 .dll, it might be |
|
79 * defined by |
|
80 * |
|
81 * #define CK_DEFINE_FUNCTION(returnType, name) \ |
|
82 * returnType __declspec(dllexport) name |
|
83 * |
|
84 * In a UNIX environment, it might be defined by |
|
85 * |
|
86 * #define CK_DEFINE_FUNCTION(returnType, name) \ |
|
87 * returnType name |
|
88 * |
|
89 * |
|
90 * 3. CK_DECLARE_FUNCTION(returnType, name): A macro which makes |
|
91 * an importable PKCS #11 library function declaration out of a |
|
92 * return type and a function name. It should be used in the |
|
93 * following fashion: |
|
94 * |
|
95 * extern CK_DECLARE_FUNCTION(CK_RV, C_Initialize)( |
|
96 * CK_VOID_PTR pReserved |
|
97 * ); |
|
98 * |
|
99 * For declaring a function in a Win32 PKCS #11 .dll, it might |
|
100 * be defined by |
|
101 * |
|
102 * #define CK_DECLARE_FUNCTION(returnType, name) \ |
|
103 * returnType __declspec(dllimport) name |
|
104 * |
|
105 * In a UNIX environment, it might be defined by |
|
106 * |
|
107 * #define CK_DECLARE_FUNCTION(returnType, name) \ |
|
108 * returnType name |
|
109 * |
|
110 * |
|
111 * 4. CK_DECLARE_FUNCTION_POINTER(returnType, name): A macro |
|
112 * which makes a PKCS #11 API function pointer declaration or |
|
113 * function pointer type declaration out of a return type and a |
|
114 * function name. It should be used in the following fashion: |
|
115 * |
|
116 * // Define funcPtr to be a pointer to a PKCS #11 API function |
|
117 * // taking arguments args and returning CK_RV. |
|
118 * CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtr)(args); |
|
119 * |
|
120 * or |
|
121 * |
|
122 * // Define funcPtrType to be the type of a pointer to a |
|
123 * // PKCS #11 API function taking arguments args and returning |
|
124 * // CK_RV, and then define funcPtr to be a variable of type |
|
125 * // funcPtrType. |
|
126 * typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtrType)(args); |
|
127 * funcPtrType funcPtr; |
|
128 * |
|
129 * For accessing functions in a Win32 PKCS #11 .dll, in might be |
|
130 * defined by |
|
131 * |
|
132 * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \ |
|
133 * returnType __declspec(dllimport) (* name) |
|
134 * |
|
135 * In a UNIX environment, it might be defined by |
|
136 * |
|
137 * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \ |
|
138 * returnType (* name) |
|
139 * |
|
140 * |
|
141 * 5. CK_CALLBACK_FUNCTION(returnType, name): A macro which makes |
|
142 * a function pointer type for an application callback out of |
|
143 * a return type for the callback and a name for the callback. |
|
144 * It should be used in the following fashion: |
|
145 * |
|
146 * CK_CALLBACK_FUNCTION(CK_RV, myCallback)(args); |
|
147 * |
|
148 * to declare a function pointer, myCallback, to a callback |
|
149 * which takes arguments args and returns a CK_RV. It can also |
|
150 * be used like this: |
|
151 * |
|
152 * typedef CK_CALLBACK_FUNCTION(CK_RV, myCallbackType)(args); |
|
153 * myCallbackType myCallback; |
|
154 * |
|
155 * In a Win32 environment, it might be defined by |
|
156 * |
|
157 * #define CK_CALLBACK_FUNCTION(returnType, name) \ |
|
158 * returnType (* name) |
|
159 * |
|
160 * In a UNIX environment, it might be defined by |
|
161 * |
|
162 * #define CK_CALLBACK_FUNCTION(returnType, name) \ |
|
163 * returnType (* name) |
|
164 * |
|
165 * |
|
166 * 6. NULL_PTR: This macro is the value of a NULL pointer. |
|
167 * |
|
168 * In any ANSI/ISO C environment (and in many others as well), |
|
169 * this should be defined by |
|
170 * |
|
171 * #ifndef NULL_PTR |
|
172 * #define NULL_PTR 0 |
|
173 * #endif |
|
174 */ |
|
175 |
|
176 |
|
177 /* All the various PKCS #11 types and #define'd values are in the |
|
178 * file pkcs11t.h. */ |
|
179 #include "pkcs11t.h" |
|
180 |
|
181 #define __PASTE(x,y) x##y |
|
182 |
|
183 |
|
184 /* packing defines */ |
|
185 #include "pkcs11p.h" |
|
186 /* ============================================================== |
|
187 * Define the "extern" form of all the entry points. |
|
188 * ============================================================== |
|
189 */ |
|
190 |
|
191 #define CK_NEED_ARG_LIST 1 |
|
192 #define CK_PKCS11_FUNCTION_INFO(name) \ |
|
193 CK_DECLARE_FUNCTION(CK_RV, name) |
|
194 |
|
195 /* pkcs11f.h has all the information about the PKCS #11 |
|
196 * function prototypes. */ |
|
197 #include "pkcs11f.h" |
|
198 |
|
199 #undef CK_NEED_ARG_LIST |
|
200 #undef CK_PKCS11_FUNCTION_INFO |
|
201 |
|
202 |
|
203 /* ============================================================== |
|
204 * Define the typedef form of all the entry points. That is, for |
|
205 * each PKCS #11 function C_XXX, define a type CK_C_XXX which is |
|
206 * a pointer to that kind of function. |
|
207 * ============================================================== |
|
208 */ |
|
209 |
|
210 #define CK_NEED_ARG_LIST 1 |
|
211 #define CK_PKCS11_FUNCTION_INFO(name) \ |
|
212 typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, __PASTE(CK_,name)) |
|
213 |
|
214 /* pkcs11f.h has all the information about the PKCS #11 |
|
215 * function prototypes. */ |
|
216 #include "pkcs11f.h" |
|
217 |
|
218 #undef CK_NEED_ARG_LIST |
|
219 #undef CK_PKCS11_FUNCTION_INFO |
|
220 |
|
221 |
|
222 /* ============================================================== |
|
223 * Define structed vector of entry points. A CK_FUNCTION_LIST |
|
224 * contains a CK_VERSION indicating a library's PKCS #11 version |
|
225 * and then a whole slew of function pointers to the routines in |
|
226 * the library. This type was declared, but not defined, in |
|
227 * pkcs11t.h. |
|
228 * ============================================================== |
|
229 */ |
|
230 |
|
231 #define CK_PKCS11_FUNCTION_INFO(name) \ |
|
232 __PASTE(CK_,name) name; |
|
233 |
|
234 struct CK_FUNCTION_LIST { |
|
235 |
|
236 CK_VERSION version; /* PKCS #11 version */ |
|
237 |
|
238 /* Pile all the function pointers into the CK_FUNCTION_LIST. */ |
|
239 /* pkcs11f.h has all the information about the PKCS #11 |
|
240 * function prototypes. */ |
|
241 #include "pkcs11f.h" |
|
242 |
|
243 }; |
|
244 |
|
245 #undef CK_PKCS11_FUNCTION_INFO |
|
246 |
|
247 |
|
248 #undef __PASTE |
|
249 |
|
250 /* unpack */ |
|
251 #include "pkcs11u.h" |
|
252 |
|
253 #ifdef __cplusplus |
|
254 } |
|
255 #endif |
|
256 |
|
257 #endif |