|
1 #!perl |
|
2 # |
|
3 # This Source Code Form is subject to the terms of the Mozilla Public |
|
4 # License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
|
6 |
|
7 $copyright = '/* THIS IS A GENERATED FILE */ |
|
8 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
9 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
10 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
11 '; |
|
12 |
|
13 $count = -1; |
|
14 $i = 0; |
|
15 |
|
16 open(INPUT, "<$ARGV[0]") || die "Can't open $ARGV[0]: $!"; |
|
17 |
|
18 while(<INPUT>) { |
|
19 s/^((?:[^"#]+|"[^"]*")*)(\s*#.*$)/$1/; |
|
20 next if (/^\s*$/); |
|
21 |
|
22 # print; |
|
23 |
|
24 /^([\S]+)\s+([^"][\S]*|"[^"]*")/; |
|
25 $name = $1; |
|
26 $value = $2; |
|
27 |
|
28 if( ($name =~ "FUNCTION") && !($name =~ "CK_FUNCTION") ) { |
|
29 $count++; |
|
30 $x[$count]{name} = $value; |
|
31 $i = 0; |
|
32 } else { |
|
33 if( $count < 0 ) { |
|
34 $value =~ s/"//g; |
|
35 $g{$name} = $value; |
|
36 } else { |
|
37 $x[$count]{args}[$i]{type} = $name; |
|
38 $x[$count]{args}[$i]{name} = $value; |
|
39 $i++; |
|
40 $x[$count]{nargs} = $i; # rewritten each time, oh well |
|
41 } |
|
42 } |
|
43 } |
|
44 |
|
45 close INPUT; |
|
46 |
|
47 # dodump(); |
|
48 doprint(); |
|
49 |
|
50 sub dodump { |
|
51 for( $j = 0; $j <= $count; $j++ ) { |
|
52 print "CK_RV CK_ENTRY $x[$j]{name}\n"; |
|
53 for( $i = 0; $i < $x[$j]{nargs}; $i++ ) { |
|
54 print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}"; |
|
55 if( $i == ($x[$j]{nargs} - 1) ) { |
|
56 print "\n"; |
|
57 } else { |
|
58 print ",\n"; |
|
59 } |
|
60 } |
|
61 } |
|
62 } |
|
63 |
|
64 sub doprint { |
|
65 open(PROTOTYPE, ">nssckg.h") || die "Can't open nssckg.h: $!"; |
|
66 open(TYPEDEF, ">nssckft.h") || die "Can't open nssckft.h: $!"; |
|
67 open(EPV, ">nssckepv.h") || die "Can't open nssckepv.h: $!"; |
|
68 open(API, ">nssck.api") || die "Can't open nssck.api: $!"; |
|
69 |
|
70 select PROTOTYPE; |
|
71 |
|
72 print $copyright; |
|
73 print <<EOD |
|
74 #ifndef NSSCKG_H |
|
75 #define NSSCKG_H |
|
76 |
|
77 /* |
|
78 * nssckg.h |
|
79 * |
|
80 * This automatically-generated header file prototypes the Cryptoki |
|
81 * functions specified by PKCS#11. |
|
82 */ |
|
83 |
|
84 #ifndef NSSCKT_H |
|
85 #include "nssckt.h" |
|
86 #endif /* NSSCKT_H */ |
|
87 |
|
88 EOD |
|
89 ; |
|
90 |
|
91 for( $j = 0; $j <= $count; $j++ ) { |
|
92 print "CK_RV CK_ENTRY $x[$j]{name}\n"; |
|
93 print "(\n"; |
|
94 for( $i = 0; $i < $x[$j]{nargs}; $i++ ) { |
|
95 print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}"; |
|
96 if( $i == ($x[$j]{nargs} - 1) ) { |
|
97 print "\n"; |
|
98 } else { |
|
99 print ",\n"; |
|
100 } |
|
101 } |
|
102 print ");\n\n"; |
|
103 } |
|
104 |
|
105 print <<EOD |
|
106 #endif /* NSSCKG_H */ |
|
107 EOD |
|
108 ; |
|
109 |
|
110 select TYPEDEF; |
|
111 |
|
112 print $copyright; |
|
113 print <<EOD |
|
114 #ifndef NSSCKFT_H |
|
115 #define NSSCKFT_H |
|
116 |
|
117 /* |
|
118 * nssckft.h |
|
119 * |
|
120 * The automatically-generated header file declares a typedef |
|
121 * each of the Cryptoki functions specified by PKCS#11. |
|
122 */ |
|
123 |
|
124 #ifndef NSSCKT_H |
|
125 #include "nssckt.h" |
|
126 #endif /* NSSCKT_H */ |
|
127 |
|
128 EOD |
|
129 ; |
|
130 |
|
131 for( $j = 0; $j <= $count; $j++ ) { |
|
132 # print "typedef CK_RV (CK_ENTRY *CK_$x[$j]{name})(\n"; |
|
133 print "typedef CK_CALLBACK_FUNCTION(CK_RV, CK_$x[$j]{name})(\n"; |
|
134 for( $i = 0; $i < $x[$j]{nargs}; $i++ ) { |
|
135 print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}"; |
|
136 if( $i == ($x[$j]{nargs} - 1) ) { |
|
137 print "\n"; |
|
138 } else { |
|
139 print ",\n"; |
|
140 } |
|
141 } |
|
142 print ");\n\n"; |
|
143 } |
|
144 |
|
145 print <<EOD |
|
146 #endif /* NSSCKFT_H */ |
|
147 EOD |
|
148 ; |
|
149 |
|
150 select EPV; |
|
151 |
|
152 print $copyright; |
|
153 print <<EOD |
|
154 #ifndef NSSCKEPV_H |
|
155 #define NSSCKEPV_H |
|
156 |
|
157 /* |
|
158 * nssckepv.h |
|
159 * |
|
160 * This automatically-generated header file defines the type |
|
161 * CK_FUNCTION_LIST specified by PKCS#11. |
|
162 */ |
|
163 |
|
164 #ifndef NSSCKT_H |
|
165 #include "nssckt.h" |
|
166 #endif /* NSSCKT_H */ |
|
167 |
|
168 #ifndef NSSCKFT_H |
|
169 #include "nssckft.h" |
|
170 #endif /* NSSCKFT_H */ |
|
171 |
|
172 #include "nssckp.h" |
|
173 |
|
174 struct CK_FUNCTION_LIST { |
|
175 CK_VERSION version; |
|
176 EOD |
|
177 ; |
|
178 |
|
179 for( $j = 0; $j <= $count; $j++ ) { |
|
180 print " CK_$x[$j]{name} $x[$j]{name};\n"; |
|
181 } |
|
182 |
|
183 print <<EOD |
|
184 }; |
|
185 |
|
186 #include "nsscku.h" |
|
187 |
|
188 #endif /* NSSCKEPV_H */ |
|
189 EOD |
|
190 ; |
|
191 |
|
192 select API; |
|
193 |
|
194 print $copyright; |
|
195 print <<EOD |
|
196 |
|
197 /* |
|
198 * nssck.api |
|
199 * |
|
200 * This automatically-generated file is used to generate a set of |
|
201 * Cryptoki entry points within the object space of a Module using |
|
202 * the NSS Cryptoki Framework. |
|
203 * |
|
204 * The Module should have a .c file with the following: |
|
205 * |
|
206 * #define MODULE_NAME name |
|
207 * #define INSTANCE_NAME instance |
|
208 * #include "nssck.api" |
|
209 * |
|
210 * where "name" is some module-specific name that can be used to |
|
211 * disambiguate various modules. This included file will then |
|
212 * define the actual Cryptoki routines which pass through to the |
|
213 * Framework calls. All routines, except C_GetFunctionList, will |
|
214 * be prefixed with the name; C_GetFunctionList will be generated |
|
215 * to return an entry-point vector with these routines. The |
|
216 * instance specified should be the basic instance of NSSCKMDInstance. |
|
217 * |
|
218 * If, prior to including nssck.api, the .c file also specifies |
|
219 * |
|
220 * #define DECLARE_STRICT_CRYTPOKI_NAMES |
|
221 * |
|
222 * Then a set of "stub" routines not prefixed with the name will |
|
223 * be included. This would allow the combined module and framework |
|
224 * to be used in applications which are hard-coded to use the |
|
225 * PKCS#11 names (instead of going through the EPV). Please note |
|
226 * that such applications should be careful resolving symbols when |
|
227 * more than one PKCS#11 module is loaded. |
|
228 */ |
|
229 |
|
230 #ifndef MODULE_NAME |
|
231 #error "Error: MODULE_NAME must be defined." |
|
232 #endif /* MODULE_NAME */ |
|
233 |
|
234 #ifndef INSTANCE_NAME |
|
235 #error "Error: INSTANCE_NAME must be defined." |
|
236 #endif /* INSTANCE_NAME */ |
|
237 |
|
238 #ifndef NSSCKT_H |
|
239 #include "nssckt.h" |
|
240 #endif /* NSSCKT_H */ |
|
241 |
|
242 #ifndef NSSCKFWT_H |
|
243 #include "nssckfwt.h" |
|
244 #endif /* NSSCKFWT_H */ |
|
245 |
|
246 #ifndef NSSCKFWC_H |
|
247 #include "nssckfwc.h" |
|
248 #endif /* NSSCKFWC_H */ |
|
249 |
|
250 #ifndef NSSCKEPV_H |
|
251 #include "nssckepv.h" |
|
252 #endif /* NSSCKEPV_H */ |
|
253 |
|
254 #define ADJOIN(x,y) x##y |
|
255 |
|
256 #define __ADJOIN(x,y) ADJOIN(x,y) |
|
257 |
|
258 /* |
|
259 * The anchor. This object is used to store an "anchor" pointer in |
|
260 * the Module's object space, so the wrapper functions can relate |
|
261 * back to this instance. |
|
262 */ |
|
263 |
|
264 static NSSCKFWInstance *fwInstance = (NSSCKFWInstance *)0; |
|
265 |
|
266 static CK_RV CK_ENTRY |
|
267 __ADJOIN(MODULE_NAME,C_Initialize) |
|
268 ( |
|
269 CK_VOID_PTR pInitArgs |
|
270 ) |
|
271 { |
|
272 return NSSCKFWC_Initialize(&fwInstance, INSTANCE_NAME, pInitArgs); |
|
273 } |
|
274 |
|
275 #ifdef DECLARE_STRICT_CRYPTOKI_NAMES |
|
276 CK_RV CK_ENTRY |
|
277 C_Initialize |
|
278 ( |
|
279 CK_VOID_PTR pInitArgs |
|
280 ) |
|
281 { |
|
282 return __ADJOIN(MODULE_NAME,C_Initialize)(pInitArgs); |
|
283 } |
|
284 #endif /* DECLARE_STRICT_CRYPTOKI_NAMES */ |
|
285 |
|
286 static CK_RV CK_ENTRY |
|
287 __ADJOIN(MODULE_NAME,C_Finalize) |
|
288 ( |
|
289 CK_VOID_PTR pReserved |
|
290 ) |
|
291 { |
|
292 return NSSCKFWC_Finalize(&fwInstance); |
|
293 } |
|
294 |
|
295 #ifdef DECLARE_STRICT_CRYPTOKI_NAMES |
|
296 CK_RV CK_ENTRY |
|
297 C_Finalize |
|
298 ( |
|
299 CK_VOID_PTR pReserved |
|
300 ) |
|
301 { |
|
302 return __ADJOIN(MODULE_NAME,C_Finalize)(pReserved); |
|
303 } |
|
304 #endif /* DECLARE_STRICT_CRYPTOKI_NAMES */ |
|
305 |
|
306 static CK_RV CK_ENTRY |
|
307 __ADJOIN(MODULE_NAME,C_GetInfo) |
|
308 ( |
|
309 CK_INFO_PTR pInfo |
|
310 ) |
|
311 { |
|
312 return NSSCKFWC_GetInfo(fwInstance, pInfo); |
|
313 } |
|
314 |
|
315 #ifdef DECLARE_STRICT_CRYPTOKI_NAMES |
|
316 CK_RV CK_ENTRY |
|
317 C_GetInfo |
|
318 ( |
|
319 CK_INFO_PTR pInfo |
|
320 ) |
|
321 { |
|
322 return __ADJOIN(MODULE_NAME,C_GetInfo)(pInfo); |
|
323 } |
|
324 #endif /* DECLARE_STRICT_CRYPTOKI_NAMES */ |
|
325 |
|
326 /* |
|
327 * C_GetFunctionList is defined at the end. |
|
328 */ |
|
329 |
|
330 EOD |
|
331 ; |
|
332 |
|
333 for( $j = 4; $j <= $count; $j++ ) { |
|
334 print "static CK_RV CK_ENTRY\n"; |
|
335 print "__ADJOIN(MODULE_NAME,$x[$j]{name})\n"; |
|
336 print "(\n"; |
|
337 for( $i = 0; $i < $x[$j]{nargs}; $i++ ) { |
|
338 print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}"; |
|
339 if( $i == ($x[$j]{nargs} - 1) ) { |
|
340 print "\n"; |
|
341 } else { |
|
342 print ",\n"; |
|
343 } |
|
344 } |
|
345 print ")\n"; |
|
346 print "{\n"; |
|
347 print " return NSSCKFW$x[$j]{name}(fwInstance, "; |
|
348 for( $i = 0; $i < $x[$j]{nargs}; $i++ ) { |
|
349 print "$x[$j]{args}[$i]{name}"; |
|
350 if( $i == ($x[$j]{nargs} - 1) ) { |
|
351 print ");\n"; |
|
352 } else { |
|
353 print ", "; |
|
354 } |
|
355 } |
|
356 print "}\n\n"; |
|
357 |
|
358 print "#ifdef DECLARE_STRICT_CRYPTOKI_NAMES\n"; |
|
359 print "CK_RV CK_ENTRY\n"; |
|
360 print "$x[$j]{name}\n"; |
|
361 print "(\n"; |
|
362 for( $i = 0; $i < $x[$j]{nargs}; $i++ ) { |
|
363 print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}"; |
|
364 if( $i == ($x[$j]{nargs} - 1) ) { |
|
365 print "\n"; |
|
366 } else { |
|
367 print ",\n"; |
|
368 } |
|
369 } |
|
370 print ")\n"; |
|
371 print "{\n"; |
|
372 print " return __ADJOIN(MODULE_NAME,$x[$j]{name})("; |
|
373 for( $i = 0; $i < $x[$j]{nargs}; $i++ ) { |
|
374 print "$x[$j]{args}[$i]{name}"; |
|
375 if( $i == ($x[$j]{nargs} - 1) ) { |
|
376 print ");\n"; |
|
377 } else { |
|
378 print ", "; |
|
379 } |
|
380 } |
|
381 print "}\n"; |
|
382 print "#endif /* DECLARE_STRICT_CRYPTOKI_NAMES */\n\n"; |
|
383 } |
|
384 |
|
385 print <<EOD |
|
386 static CK_RV CK_ENTRY |
|
387 __ADJOIN(MODULE_NAME,C_GetFunctionList) |
|
388 ( |
|
389 CK_FUNCTION_LIST_PTR_PTR ppFunctionList |
|
390 ); |
|
391 |
|
392 static CK_FUNCTION_LIST FunctionList = { |
|
393 { 2, 1 }, |
|
394 EOD |
|
395 ; |
|
396 |
|
397 for( $j = 0; $j <= $count; $j++ ) { |
|
398 print "__ADJOIN(MODULE_NAME,$x[$j]{name})"; |
|
399 if( $j < $count ) { |
|
400 print ",\n"; |
|
401 } else { |
|
402 print "\n};\n\n"; |
|
403 } |
|
404 } |
|
405 |
|
406 print <<EOD |
|
407 static CK_RV CK_ENTRY |
|
408 __ADJOIN(MODULE_NAME,C_GetFunctionList) |
|
409 ( |
|
410 CK_FUNCTION_LIST_PTR_PTR ppFunctionList |
|
411 ) |
|
412 { |
|
413 *ppFunctionList = &FunctionList; |
|
414 return CKR_OK; |
|
415 } |
|
416 |
|
417 /* This one is always present */ |
|
418 CK_RV CK_ENTRY |
|
419 C_GetFunctionList |
|
420 ( |
|
421 CK_FUNCTION_LIST_PTR_PTR ppFunctionList |
|
422 ) |
|
423 { |
|
424 return __ADJOIN(MODULE_NAME,C_GetFunctionList)(ppFunctionList); |
|
425 } |
|
426 |
|
427 #undef __ADJOIN |
|
428 |
|
429 EOD |
|
430 ; |
|
431 |
|
432 select STDOUT; |
|
433 |
|
434 } |