123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 |
- #!perl
- #
- # This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- $copyright = '/* THIS IS A GENERATED FILE */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- ';
- $count = -1;
- $i = 0;
- open(INPUT, "<$ARGV[0]") || die "Can't open $ARGV[0]: $!";
- while(<INPUT>) {
- s/^((?:[^"#]+|"[^"]*")*)(\s*#.*$)/$1/;
- next if (/^\s*$/);
- # print;
- /^([\S]+)\s+([^"][\S]*|"[^"]*")/;
- $name = $1;
- $value = $2;
- if( ($name =~ "FUNCTION") && !($name =~ "CK_FUNCTION") ) {
- $count++;
- $x[$count]{name} = $value;
- $i = 0;
- } else {
- if( $count < 0 ) {
- $value =~ s/"//g;
- $g{$name} = $value;
- } else {
- $x[$count]{args}[$i]{type} = $name;
- $x[$count]{args}[$i]{name} = $value;
- $i++;
- $x[$count]{nargs} = $i; # rewritten each time, oh well
- }
- }
- }
- close INPUT;
- # dodump();
- doprint();
- sub dodump {
- for( $j = 0; $j <= $count; $j++ ) {
- print "CK_RV CK_ENTRY $x[$j]{name}\n";
- for( $i = 0; $i < $x[$j]{nargs}; $i++ ) {
- print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}";
- if( $i == ($x[$j]{nargs} - 1) ) {
- print "\n";
- } else {
- print ",\n";
- }
- }
- }
- }
- sub doprint {
- open(PROTOTYPE, ">nssckg.h") || die "Can't open nssckg.h: $!";
- open(TYPEDEF, ">nssckft.h") || die "Can't open nssckft.h: $!";
- open(EPV, ">nssckepv.h") || die "Can't open nssckepv.h: $!";
- open(API, ">nssck.api") || die "Can't open nssck.api: $!";
- select PROTOTYPE;
- print $copyright;
- print <<EOD
- #ifndef NSSCKG_H
- #define NSSCKG_H
- /*
- * nssckg.h
- *
- * This automatically-generated header file prototypes the Cryptoki
- * functions specified by PKCS#11.
- */
- #ifndef NSSCKT_H
- #include "nssckt.h"
- #endif /* NSSCKT_H */
- EOD
- ;
- for( $j = 0; $j <= $count; $j++ ) {
- print "CK_RV CK_ENTRY $x[$j]{name}\n";
- print "(\n";
- for( $i = 0; $i < $x[$j]{nargs}; $i++ ) {
- print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}";
- if( $i == ($x[$j]{nargs} - 1) ) {
- print "\n";
- } else {
- print ",\n";
- }
- }
- print ");\n\n";
- }
- print <<EOD
- #endif /* NSSCKG_H */
- EOD
- ;
- select TYPEDEF;
- print $copyright;
- print <<EOD
- #ifndef NSSCKFT_H
- #define NSSCKFT_H
- /*
- * nssckft.h
- *
- * The automatically-generated header file declares a typedef
- * each of the Cryptoki functions specified by PKCS#11.
- */
- #ifndef NSSCKT_H
- #include "nssckt.h"
- #endif /* NSSCKT_H */
- EOD
- ;
- for( $j = 0; $j <= $count; $j++ ) {
- # print "typedef CK_RV (CK_ENTRY *CK_$x[$j]{name})(\n";
- print "typedef CK_CALLBACK_FUNCTION(CK_RV, CK_$x[$j]{name})(\n";
- for( $i = 0; $i < $x[$j]{nargs}; $i++ ) {
- print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}";
- if( $i == ($x[$j]{nargs} - 1) ) {
- print "\n";
- } else {
- print ",\n";
- }
- }
- print ");\n\n";
- }
- print <<EOD
- #endif /* NSSCKFT_H */
- EOD
- ;
- select EPV;
- print $copyright;
- print <<EOD
- #ifndef NSSCKEPV_H
- #define NSSCKEPV_H
- /*
- * nssckepv.h
- *
- * This automatically-generated header file defines the type
- * CK_FUNCTION_LIST specified by PKCS#11.
- */
- #ifndef NSSCKT_H
- #include "nssckt.h"
- #endif /* NSSCKT_H */
- #ifndef NSSCKFT_H
- #include "nssckft.h"
- #endif /* NSSCKFT_H */
- #include "nssckp.h"
- struct CK_FUNCTION_LIST {
- CK_VERSION version;
- EOD
- ;
- for( $j = 0; $j <= $count; $j++ ) {
- print " CK_$x[$j]{name} $x[$j]{name};\n";
- }
- print <<EOD
- };
- #include "nsscku.h"
- #endif /* NSSCKEPV_H */
- EOD
- ;
- select API;
- print $copyright;
- print <<EOD
- /*
- * nssck.api
- *
- * This automatically-generated file is used to generate a set of
- * Cryptoki entry points within the object space of a Module using
- * the NSS Cryptoki Framework.
- *
- * The Module should have a .c file with the following:
- *
- * #define MODULE_NAME name
- * #define INSTANCE_NAME instance
- * #include "nssck.api"
- *
- * where "name" is some module-specific name that can be used to
- * disambiguate various modules. This included file will then
- * define the actual Cryptoki routines which pass through to the
- * Framework calls. All routines, except C_GetFunctionList, will
- * be prefixed with the name; C_GetFunctionList will be generated
- * to return an entry-point vector with these routines. The
- * instance specified should be the basic instance of NSSCKMDInstance.
- *
- * If, prior to including nssck.api, the .c file also specifies
- *
- * #define DECLARE_STRICT_CRYTPOKI_NAMES
- *
- * Then a set of "stub" routines not prefixed with the name will
- * be included. This would allow the combined module and framework
- * to be used in applications which are hard-coded to use the
- * PKCS#11 names (instead of going through the EPV). Please note
- * that such applications should be careful resolving symbols when
- * more than one PKCS#11 module is loaded.
- */
- #ifndef MODULE_NAME
- #error "Error: MODULE_NAME must be defined."
- #endif /* MODULE_NAME */
- #ifndef INSTANCE_NAME
- #error "Error: INSTANCE_NAME must be defined."
- #endif /* INSTANCE_NAME */
- #ifndef NSSCKT_H
- #include "nssckt.h"
- #endif /* NSSCKT_H */
- #ifndef NSSCKFWT_H
- #include "nssckfwt.h"
- #endif /* NSSCKFWT_H */
- #ifndef NSSCKFWC_H
- #include "nssckfwc.h"
- #endif /* NSSCKFWC_H */
- #ifndef NSSCKEPV_H
- #include "nssckepv.h"
- #endif /* NSSCKEPV_H */
- #define ADJOIN(x,y) x##y
- #define __ADJOIN(x,y) ADJOIN(x,y)
- /*
- * The anchor. This object is used to store an "anchor" pointer in
- * the Module's object space, so the wrapper functions can relate
- * back to this instance.
- */
- static NSSCKFWInstance *fwInstance = (NSSCKFWInstance *)0;
- static CK_RV CK_ENTRY
- __ADJOIN(MODULE_NAME,C_Initialize)
- (
- CK_VOID_PTR pInitArgs
- )
- {
- return NSSCKFWC_Initialize(&fwInstance, INSTANCE_NAME, pInitArgs);
- }
- #ifdef DECLARE_STRICT_CRYPTOKI_NAMES
- CK_RV CK_ENTRY
- C_Initialize
- (
- CK_VOID_PTR pInitArgs
- )
- {
- return __ADJOIN(MODULE_NAME,C_Initialize)(pInitArgs);
- }
- #endif /* DECLARE_STRICT_CRYPTOKI_NAMES */
- static CK_RV CK_ENTRY
- __ADJOIN(MODULE_NAME,C_Finalize)
- (
- CK_VOID_PTR pReserved
- )
- {
- return NSSCKFWC_Finalize(&fwInstance);
- }
- #ifdef DECLARE_STRICT_CRYPTOKI_NAMES
- CK_RV CK_ENTRY
- C_Finalize
- (
- CK_VOID_PTR pReserved
- )
- {
- return __ADJOIN(MODULE_NAME,C_Finalize)(pReserved);
- }
- #endif /* DECLARE_STRICT_CRYPTOKI_NAMES */
- static CK_RV CK_ENTRY
- __ADJOIN(MODULE_NAME,C_GetInfo)
- (
- CK_INFO_PTR pInfo
- )
- {
- return NSSCKFWC_GetInfo(fwInstance, pInfo);
- }
- #ifdef DECLARE_STRICT_CRYPTOKI_NAMES
- CK_RV CK_ENTRY
- C_GetInfo
- (
- CK_INFO_PTR pInfo
- )
- {
- return __ADJOIN(MODULE_NAME,C_GetInfo)(pInfo);
- }
- #endif /* DECLARE_STRICT_CRYPTOKI_NAMES */
- /*
- * C_GetFunctionList is defined at the end.
- */
- EOD
- ;
- for( $j = 4; $j <= $count; $j++ ) {
- print "static CK_RV CK_ENTRY\n";
- print "__ADJOIN(MODULE_NAME,$x[$j]{name})\n";
- print "(\n";
- for( $i = 0; $i < $x[$j]{nargs}; $i++ ) {
- print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}";
- if( $i == ($x[$j]{nargs} - 1) ) {
- print "\n";
- } else {
- print ",\n";
- }
- }
- print ")\n";
- print "{\n";
- print " return NSSCKFW$x[$j]{name}(fwInstance, ";
- for( $i = 0; $i < $x[$j]{nargs}; $i++ ) {
- print "$x[$j]{args}[$i]{name}";
- if( $i == ($x[$j]{nargs} - 1) ) {
- print ");\n";
- } else {
- print ", ";
- }
- }
- print "}\n\n";
- print "#ifdef DECLARE_STRICT_CRYPTOKI_NAMES\n";
- print "CK_RV CK_ENTRY\n";
- print "$x[$j]{name}\n";
- print "(\n";
- for( $i = 0; $i < $x[$j]{nargs}; $i++ ) {
- print " $x[$j]{args}[$i]{type} $x[$j]{args}[$i]{name}";
- if( $i == ($x[$j]{nargs} - 1) ) {
- print "\n";
- } else {
- print ",\n";
- }
- }
- print ")\n";
- print "{\n";
- print " return __ADJOIN(MODULE_NAME,$x[$j]{name})(";
- for( $i = 0; $i < $x[$j]{nargs}; $i++ ) {
- print "$x[$j]{args}[$i]{name}";
- if( $i == ($x[$j]{nargs} - 1) ) {
- print ");\n";
- } else {
- print ", ";
- }
- }
- print "}\n";
- print "#endif /* DECLARE_STRICT_CRYPTOKI_NAMES */\n\n";
- }
- print <<EOD
- static CK_RV CK_ENTRY
- __ADJOIN(MODULE_NAME,C_GetFunctionList)
- (
- CK_FUNCTION_LIST_PTR_PTR ppFunctionList
- );
- static CK_FUNCTION_LIST FunctionList = {
- { 2, 1 },
- EOD
- ;
- for( $j = 0; $j <= $count; $j++ ) {
- print "__ADJOIN(MODULE_NAME,$x[$j]{name})";
- if( $j < $count ) {
- print ",\n";
- } else {
- print "\n};\n\n";
- }
- }
- print <<EOD
- static CK_RV CK_ENTRY
- __ADJOIN(MODULE_NAME,C_GetFunctionList)
- (
- CK_FUNCTION_LIST_PTR_PTR ppFunctionList
- )
- {
- *ppFunctionList = &FunctionList;
- return CKR_OK;
- }
- /* This one is always present */
- CK_RV CK_ENTRY
- C_GetFunctionList
- (
- CK_FUNCTION_LIST_PTR_PTR ppFunctionList
- )
- {
- return __ADJOIN(MODULE_NAME,C_GetFunctionList)(ppFunctionList);
- }
- #undef __ADJOIN
- EOD
- ;
- select STDOUT;
- }
|