tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ckapi.perl (8797B)


      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 }