Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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/.
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 ';
13 $count = -1;
14 $i = 0;
16 open(INPUT, "<$ARGV[0]") || die "Can't open $ARGV[0]: $!";
18 while(<INPUT>) {
19 s/^((?:[^"#]+|"[^"]*")*)(\s*#.*$)/$1/;
20 next if (/^\s*$/);
22 # print;
24 /^([\S]+)\s+([^"][\S]*|"[^"]*")/;
25 $name = $1;
26 $value = $2;
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 }
45 close INPUT;
47 # dodump();
48 doprint();
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 }
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: $!";
70 select PROTOTYPE;
72 print $copyright;
73 print <<EOD
74 #ifndef NSSCKG_H
75 #define NSSCKG_H
77 /*
78 * nssckg.h
79 *
80 * This automatically-generated header file prototypes the Cryptoki
81 * functions specified by PKCS#11.
82 */
84 #ifndef NSSCKT_H
85 #include "nssckt.h"
86 #endif /* NSSCKT_H */
88 EOD
89 ;
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 }
105 print <<EOD
106 #endif /* NSSCKG_H */
107 EOD
108 ;
110 select TYPEDEF;
112 print $copyright;
113 print <<EOD
114 #ifndef NSSCKFT_H
115 #define NSSCKFT_H
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 */
124 #ifndef NSSCKT_H
125 #include "nssckt.h"
126 #endif /* NSSCKT_H */
128 EOD
129 ;
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 }
145 print <<EOD
146 #endif /* NSSCKFT_H */
147 EOD
148 ;
150 select EPV;
152 print $copyright;
153 print <<EOD
154 #ifndef NSSCKEPV_H
155 #define NSSCKEPV_H
157 /*
158 * nssckepv.h
159 *
160 * This automatically-generated header file defines the type
161 * CK_FUNCTION_LIST specified by PKCS#11.
162 */
164 #ifndef NSSCKT_H
165 #include "nssckt.h"
166 #endif /* NSSCKT_H */
168 #ifndef NSSCKFT_H
169 #include "nssckft.h"
170 #endif /* NSSCKFT_H */
172 #include "nssckp.h"
174 struct CK_FUNCTION_LIST {
175 CK_VERSION version;
176 EOD
177 ;
179 for( $j = 0; $j <= $count; $j++ ) {
180 print " CK_$x[$j]{name} $x[$j]{name};\n";
181 }
183 print <<EOD
184 };
186 #include "nsscku.h"
188 #endif /* NSSCKEPV_H */
189 EOD
190 ;
192 select API;
194 print $copyright;
195 print <<EOD
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 */
230 #ifndef MODULE_NAME
231 #error "Error: MODULE_NAME must be defined."
232 #endif /* MODULE_NAME */
234 #ifndef INSTANCE_NAME
235 #error "Error: INSTANCE_NAME must be defined."
236 #endif /* INSTANCE_NAME */
238 #ifndef NSSCKT_H
239 #include "nssckt.h"
240 #endif /* NSSCKT_H */
242 #ifndef NSSCKFWT_H
243 #include "nssckfwt.h"
244 #endif /* NSSCKFWT_H */
246 #ifndef NSSCKFWC_H
247 #include "nssckfwc.h"
248 #endif /* NSSCKFWC_H */
250 #ifndef NSSCKEPV_H
251 #include "nssckepv.h"
252 #endif /* NSSCKEPV_H */
254 #define ADJOIN(x,y) x##y
256 #define __ADJOIN(x,y) ADJOIN(x,y)
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 */
264 static NSSCKFWInstance *fwInstance = (NSSCKFWInstance *)0;
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 }
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 */
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 }
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 */
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 }
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 */
326 /*
327 * C_GetFunctionList is defined at the end.
328 */
330 EOD
331 ;
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";
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 }
385 print <<EOD
386 static CK_RV CK_ENTRY
387 __ADJOIN(MODULE_NAME,C_GetFunctionList)
388 (
389 CK_FUNCTION_LIST_PTR_PTR ppFunctionList
390 );
392 static CK_FUNCTION_LIST FunctionList = {
393 { 2, 1 },
394 EOD
395 ;
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 }
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 }
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 }
427 #undef __ADJOIN
429 EOD
430 ;
432 select STDOUT;
434 }