oidgen.perl
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:8k
源码类别:

CA认证

开发平台:

WINDOWS

  1. #!perl
  2. # The contents of this file are subject to the Mozilla Public
  3. # License Version 1.1 (the "License"); you may not use this file
  4. # except in compliance with the License. You may obtain a copy of
  5. # the License at http://www.mozilla.org/MPL/
  6. # Software distributed under the License is distributed on an "AS
  7. # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  8. # implied. See the License for the specific language governing
  9. # rights and limitations under the License.
  10. # The Original Code is the Netscape security libraries.
  11. # The Initial Developer of the Original Code is Netscape
  12. # Communications Corporation.  Portions created by Netscape are 
  13. # Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  14. # Rights Reserved.
  15. # Contributor(s):
  16. # Alternatively, the contents of this file may be used under the
  17. # terms of the GNU General Public License Version 2 or later (the
  18. # "GPL"), in which case the provisions of the GPL are applicable 
  19. # instead of those above.  If you wish to allow use of your 
  20. # version of this file only under the terms of the GPL and not to
  21. # allow others to use your version of this file under the MPL,
  22. # indicate your decision by deleting the provisions above and
  23. # replace them with the notice and other provisions required by
  24. # the GPL.  If you do not delete the provisions above, a recipient
  25. # may use your version of this file under either the MPL or the
  26. # GPL.
  27. #
  28. $cvs_id = '@(#) $RCSfile: oidgen.perl,v $ $Revision: 1.1 $ $Date: 2000/03/31 19:16:22 $ $Name: NSS_3_1_1_RTM $';
  29. $count = -1;
  30. while(<>) {
  31.   s/^((?:[^"#]+|"[^"]*")*)(s*#.*$)/$1/;
  32.   next if (/^s*$/);
  33.   /^([S]+)s+([^"][S]*|"[^"]*")/;
  34.   $name = $1;
  35.   $value = $2;
  36.   # This is certainly not the best way to dequote the data.
  37.   $value =~ s/"//g;
  38.   if( $name =~ "OID" ) {
  39.     $count++;
  40.     $x[$count]{$name} = $value;
  41.     $enc = encodeoid($value);
  42.     $x[$count]{" encoding"} = escapeoid($enc);
  43.     $x[$count]{" encoding length"} = length($enc);
  44.   } else {
  45.     if( $count < 0 ) {
  46.       $g{$name} = $value;
  47.     } else {
  48.       $x[$count]{$name} = $value;
  49.     }
  50.   }
  51. }
  52. # dodump();
  53. doprint();
  54. sub dodump {
  55. for( $i = 0; $i <= $count; $i++ ) {
  56.   print "number $i:n";
  57.   %y = %{$x[$i]};
  58.   while(($n,$v) = each(%y)) {
  59.     print "t$n ==> $vn";
  60.   }
  61. }
  62. }
  63. sub doprint {
  64. open(CFILE, ">oiddata.c") || die "Can't open oiddata.c: $!"; 
  65. open(HFILE, ">oiddata.h") || die "Can't open oiddata.h: $!";
  66. print CFILE <<EOD
  67. /* THIS IS A GENERATED FILE */
  68. /* 
  69.  * The contents of this file are subject to the Mozilla Public
  70.  * License Version 1.1 (the "License"); you may not use this file
  71.  * except in compliance with the License. You may obtain a copy of
  72.  * the License at http://www.mozilla.org/MPL/
  73.  * 
  74.  * Software distributed under the License is distributed on an "AS
  75.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  76.  * implied. See the License for the specific language governing
  77.  * rights and limitations under the License.
  78.  * 
  79.  * The Original Code is the Netscape security libraries.
  80.  * 
  81.  * The Initial Developer of the Original Code is Netscape
  82.  * Communications Corporation.  Portions created by Netscape are 
  83.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  84.  * Rights Reserved.
  85.  * 
  86.  * Contributor(s):
  87.  * 
  88.  * Alternatively, the contents of this file may be used under the
  89.  * terms of the GNU General Public License Version 2 or later (the
  90.  * "GPL"), in which case the provisions of the GPL are applicable 
  91.  * instead of those above.  If you wish to allow use of your 
  92.  * version of this file only under the terms of the GPL and not to
  93.  * allow others to use your version of this file under the MPL,
  94.  * indicate your decision by deleting the provisions above and
  95.  * replace them with the notice and other provisions required by
  96.  * the GPL.  If you do not delete the provisions above, a recipient
  97.  * may use your version of this file under either the MPL or the
  98.  * GPL.
  99.  */
  100. #ifdef DEBUG
  101. static const char CVS_ID[] = "$g{CVS_ID} ; $cvs_id";
  102. #endif /* DEBUG */
  103. #ifndef PKI1T_H
  104. #include "pki1t.h"
  105. #endif /* PKI1T_H */
  106. const NSSOID nss_builtin_oids[] = {
  107. EOD
  108.     ;
  109. for( $i = 0; $i <= $count; $i++ ) {
  110.   %y = %{$x[$i]};
  111.   print CFILE "  {n";
  112.   print CFILE "#ifdef DEBUGn";
  113.   print CFILE "    "$y{TAG}",n";
  114.   print CFILE "    "$y{EXPL}",n";
  115.   print CFILE "#endif /* DEBUG */n";
  116.   print CFILE "    { "", $y{" encoding"};
  117.   print CFILE "", ", $y{" encoding length"}, " }n";
  118.   if( $i == $count ) {
  119.     print CFILE "  }n";
  120.   } else {
  121.     print CFILE "  },n";
  122.   }
  123. }
  124. print CFILE "};nn";
  125. print CFILE "const PRUint32 nss_builtin_oid_count = ", ($count+1), ";nn";
  126. for( $i = 0; $i <= $count; $i++ ) {
  127.   %y = %{$x[$i]};
  128.   if( defined($y{NAME}) ) {
  129.     print CFILE "const NSSOID *$y{NAME} = (NSSOID *)&nss_builtin_oids[$i];n";
  130.   }
  131. }
  132. print CFILE "n";
  133. $attrcount = -1;
  134. for( $i = 0; $i <= $count; $i++ ) {
  135.   %y = %{$x[$i]};
  136.   if( defined($y{ATTR}) ) {
  137.     if( defined($y{NAME}) ) {
  138.       $attrcount++;
  139.       $attr[$attrcount]{ATTR} = $y{ATTR};
  140.       $attr[$attrcount]{NAME} = $y{NAME};
  141.     } else {
  142.       warn "Attribute $y{ATTR} has no name, and will be omitted!";
  143.     }
  144.   }
  145. }
  146. print CFILE "const nssAttributeTypeAliasTable nss_attribute_type_aliases[] = {n";
  147. for( $i = 0; $i <= $attrcount; $i++ ) {
  148.   %y = %{$attr[$i]};
  149.   print CFILE "  {n";
  150.   print CFILE "    "$y{ATTR}",n";
  151.   print CFILE "    &$y{NAME}n";
  152.   if( $i == $attrcount ) {
  153.     print CFILE "  }n";
  154.   } else {
  155.     print CFILE "  },n";
  156.   }
  157. }
  158. print CFILE "};nn";
  159. print CFILE "const PRUint32 nss_attribute_type_alias_count = ", ($attrcount+1), ";nn";
  160. print HFILE <<EOD
  161. /* THIS IS A GENERATED FILE */
  162. /* 
  163.  * The contents of this file are subject to the Mozilla Public
  164.  * License Version 1.1 (the "License"); you may not use this file
  165.  * except in compliance with the License. You may obtain a copy of
  166.  * the License at http://www.mozilla.org/MPL/
  167.  * 
  168.  * Software distributed under the License is distributed on an "AS
  169.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  170.  * implied. See the License for the specific language governing
  171.  * rights and limitations under the License.
  172.  * 
  173.  * The Original Code is the Netscape security libraries.
  174.  * 
  175.  * The Initial Developer of the Original Code is Netscape
  176.  * Communications Corporation.  Portions created by Netscape are 
  177.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  178.  * Rights Reserved.
  179.  * 
  180.  * Contributor(s):
  181.  * 
  182.  * Alternatively, the contents of this file may be used under the
  183.  * terms of the GNU General Public License Version 2 or later (the
  184.  * "GPL"), in which case the provisions of the GPL are applicable 
  185.  * instead of those above.  If you wish to allow use of your 
  186.  * version of this file only under the terms of the GPL and not to
  187.  * allow others to use your version of this file under the MPL,
  188.  * indicate your decision by deleting the provisions above and
  189.  * replace them with the notice and other provisions required by
  190.  * the GPL.  If you do not delete the provisions above, a recipient
  191.  * may use your version of this file under either the MPL or the
  192.  * GPL.
  193.  */
  194. #ifndef OIDDATA_H
  195. #define OIDDATA_H
  196. #ifdef DEBUG
  197. static const char OIDDATA_CVS_ID[] = "$g{CVS_ID} ; $cvs_id";
  198. #endif /* DEBUG */
  199. #ifndef NSSPKI1T_H
  200. #include "nsspki1t.h"
  201. #endif /* NSSPKI1T_H */
  202. extern const NSSOID nss_builtin_oids[];
  203. extern const PRUint32 nss_builtin_oid_count;
  204. /*extern const nssAttributeTypeAliasTable nss_attribute_type_aliases[];*/
  205. /*extern const PRUint32 nss_attribute_type_alias_count;*/
  206. EOD
  207.     ;
  208. for( $i = 0; $i <= $count; $i++ ) {
  209.   %y = %{$x[$i]};
  210.   if( defined($y{NAME}) ) {
  211.     print HFILE "extern const NSSOID *$y{NAME};n";
  212.   }
  213. }
  214. print HFILE <<EOD
  215. #endif /* OIDDATA_H */
  216. EOD
  217.     ;
  218. close CFILE;
  219. close HFILE;
  220. }
  221. sub encodenum {
  222.     my $v = $_[0];
  223.     my @d;
  224.     my $i;
  225.     my $rv = "";
  226.     while( $v > 128 ) {
  227.         push @d, ($v % 128);
  228.         $v /= 128;
  229.     };
  230.     push @d, ($v%128);
  231.     for( $i = @d-1; $i > 0; $i-- ) {
  232.         $rv = $rv . chr(128 + $d[$i]);
  233.     }
  234.     $rv = $rv . chr($d[0]);
  235.     return $rv;
  236. }
  237. sub encodeoid {
  238.     my @o = split(/./, $_[0]);
  239.     my $rv = "";
  240.     my $i;
  241.     if( @o < 2 ) {
  242.         # NSS's special "illegal" encoding
  243.         return chr(128) . encodenum($o[0]);
  244.     }
  245.     $rv = encodenum($o[0] * 40 + $o[1]);
  246.     shift @o; shift @o;
  247.     foreach $i (@o) {
  248.         $rv = $rv . encodenum($i);
  249.     }
  250.     return $rv;
  251. }
  252. sub escapeoid {
  253.   my @v = unpack("C*", $_[0]);
  254.   my $a;
  255.   my $rv = "";
  256.   foreach $a (@v) {
  257.     $rv = $rv . sprintf("\x%02x", $a);
  258.   }
  259.   return $rv;
  260. }