Aurora
Adminer
Auto Root
WP Admin
cPanel Reset
Anti Backdoor
Root
usr
share
perl5
vendor_perl
Convert
ASN1
Upload
New Folder
New File
Name
Size
Permissions
Actions
..
-
-
-
Upload File
Select File
New Folder
Folder Name
New File
File Name
Add WordPress Admin
Database Host
Database Name
Database User
Database Password
Admin Username
Admin Password
cPanel Password Reset
Email Address
Edit: parser.pm
#$yysccsid = "@(#)yaccpar 1.8 (Berkeley) 01/20/91 (Perl 2.0 12/31/92)"; # 24 "parser.y" ;# Copyright (c) 2000-2005 Graham Barr <gbarr@pobox.com>. All rights reserved. ;# This program is free software; you can redistribute it and/or ;# modify it under the same terms as Perl itself. package Convert::ASN1::parser; { $Convert::ASN1::parser::VERSION = '0.27'; } use strict; use Convert::ASN1 qw(:all); use vars qw( $asn $yychar $yyerrflag $yynerrs $yyn @yyss $yyssp $yystate @yyvs $yyvsp $yylval $yys $yym $yyval ); BEGIN { Convert::ASN1->_internal_syms } my $yydebug=0; my %yystate; my %base_type = ( BOOLEAN => [ asn_encode_tag(ASN_BOOLEAN), opBOOLEAN ], INTEGER => [ asn_encode_tag(ASN_INTEGER), opINTEGER ], BIT_STRING => [ asn_encode_tag(ASN_BIT_STR), opBITSTR ], OCTET_STRING => [ asn_encode_tag(ASN_OCTET_STR), opSTRING ], STRING => [ asn_encode_tag(ASN_OCTET_STR), opSTRING ], NULL => [ asn_encode_tag(ASN_NULL), opNULL ], OBJECT_IDENTIFIER => [ asn_encode_tag(ASN_OBJECT_ID), opOBJID ], REAL => [ asn_encode_tag(ASN_REAL), opREAL ], ENUMERATED => [ asn_encode_tag(ASN_ENUMERATED), opINTEGER ], ENUM => [ asn_encode_tag(ASN_ENUMERATED), opINTEGER ], 'RELATIVE-OID' => [ asn_encode_tag(ASN_RELATIVE_OID), opROID ], SEQUENCE => [ asn_encode_tag(ASN_SEQUENCE | ASN_CONSTRUCTOR), opSEQUENCE ], EXPLICIT => [ asn_encode_tag(ASN_SEQUENCE | ASN_CONSTRUCTOR), opEXPLICIT ], SET => [ asn_encode_tag(ASN_SET | ASN_CONSTRUCTOR), opSET ], ObjectDescriptor => [ asn_encode_tag(ASN_UNIVERSAL | 7), opSTRING ], UTF8String => [ asn_encode_tag(ASN_UNIVERSAL | 12), opUTF8 ], NumericString => [ asn_encode_tag(ASN_UNIVERSAL | 18), opSTRING ], PrintableString => [ asn_encode_tag(ASN_UNIVERSAL | 19), opSTRING ], TeletexString => [ asn_encode_tag(ASN_UNIVERSAL | 20), opSTRING ], T61String => [ asn_encode_tag(ASN_UNIVERSAL | 20), opSTRING ], VideotexString => [ asn_encode_tag(ASN_UNIVERSAL | 21), opSTRING ], IA5String => [ asn_encode_tag(ASN_UNIVERSAL | 22), opSTRING ], UTCTime => [ asn_encode_tag(ASN_UNIVERSAL | 23), opUTIME ], GeneralizedTime => [ asn_encode_tag(ASN_UNIVERSAL | 24), opGTIME ], GraphicString => [ asn_encode_tag(ASN_UNIVERSAL | 25), opSTRING ], VisibleString => [ asn_encode_tag(ASN_UNIVERSAL | 26), opSTRING ], ISO646String => [ asn_encode_tag(ASN_UNIVERSAL | 26), opSTRING ], GeneralString => [ asn_encode_tag(ASN_UNIVERSAL | 27), opSTRING ], CharacterString => [ asn_encode_tag(ASN_UNIVERSAL | 28), opSTRING ], UniversalString => [ asn_encode_tag(ASN_UNIVERSAL | 28), opSTRING ], BMPString => [ asn_encode_tag(ASN_UNIVERSAL | 30), opSTRING ], BCDString => [ asn_encode_tag(ASN_OCTET_STR), opBCD ], CHOICE => [ '', opCHOICE ], ANY => [ '', opANY ], EXTENSION_MARKER => [ '', opEXTENSIONS ], ); my $tagdefault = 1; # 0:IMPLICIT , 1:EXPLICIT default ;# args: class,plicit sub need_explicit { (defined($_[0]) && (defined($_[1])?$_[1]:$tagdefault)); } ;# Given an OP, wrap it in a SEQUENCE sub explicit { my $op = shift; my @seq = @$op; @seq[cTYPE,cCHILD,cVAR,cLOOP] = ('EXPLICIT',[$op],undef,undef); @{$op}[cTAG,cOPT] = (); \@seq; } sub constWORD () { 1 } sub constCLASS () { 2 } sub constSEQUENCE () { 3 } sub constSET () { 4 } sub constCHOICE () { 5 } sub constOF () { 6 } sub constIMPLICIT () { 7 } sub constEXPLICIT () { 8 } sub constOPTIONAL () { 9 } sub constLBRACE () { 10 } sub constRBRACE () { 11 } sub constCOMMA () { 12 } sub constANY () { 13 } sub constASSIGN () { 14 } sub constNUMBER () { 15 } sub constENUM () { 16 } sub constCOMPONENTS () { 17 } sub constPOSTRBRACE () { 18 } sub constDEFINED () { 19 } sub constBY () { 20 } sub constEXTENSION_MARKER () { 21 } sub constYYERRCODE () { 256 } my @yylhs = ( -1, 0, 0, 2, 2, 3, 3, 6, 6, 6, 6, 8, 13, 13, 12, 14, 14, 14, 9, 9, 9, 10, 18, 18, 18, 18, 18, 19, 19, 11, 16, 16, 20, 20, 20, 21, 21, 1, 1, 1, 22, 22, 22, 24, 24, 24, 24, 23, 23, 23, 23, 15, 15, 4, 4, 5, 5, 5, 17, 17, 25, 7, 7, ); my @yylen = ( 2, 1, 1, 3, 4, 4, 1, 1, 1, 1, 1, 3, 1, 1, 6, 1, 1, 1, 4, 4, 4, 4, 1, 1, 1, 2, 1, 0, 3, 1, 1, 2, 1, 3, 3, 4, 1, 0, 1, 2, 1, 3, 3, 2, 1, 1, 1, 4, 1, 3, 1, 0, 1, 0, 1, 0, 1, 1, 1, 3, 2, 0, 1, ); my @yydefred = ( 0, 0, 54, 0, 50, 0, 1, 0, 0, 48, 0, 40, 0, 0, 0, 0, 57, 56, 0, 0, 0, 3, 0, 6, 0, 11, 0, 0, 0, 0, 49, 0, 41, 42, 0, 22, 0, 0, 0, 0, 46, 44, 0, 45, 0, 29, 47, 4, 0, 0, 0, 0, 7, 8, 9, 10, 0, 25, 0, 52, 43, 0, 0, 0, 0, 36, 0, 0, 32, 62, 5, 0, 0, 0, 58, 0, 18, 19, 0, 20, 0, 0, 28, 60, 21, 0, 0, 0, 34, 33, 59, 0, 0, 17, 15, 16, 0, 35, 14, ); my @yydgoto = ( 5, 6, 7, 21, 8, 18, 51, 70, 9, 52, 53, 54, 55, 44, 96, 60, 66, 73, 45, 57, 67, 68, 10, 11, 46, 74, ); my @yysindex = ( 2, 58, 0, 8, 0, 0, 0, 11, 123, 0, 3, 0, 59, 123, 19, 73, 0, 0, 92, 7, 7, 0, 123, 0, 119, 0, 59, 107, 109, 116, 0, 82, 0, 0, 119, 0, 107, 109, 84, 126, 0, 0, 90, 0, 132, 0, 0, 0, 7, 7, 10, 139, 0, 0, 0, 0, 141, 0, 143, 0, 0, 82, 156, 159, 82, 0, 160, 4, 0, 0, 0, 171, 158, 6, 0, 123, 0, 0, 123, 0, 10, 10, 0, 0, 0, 143, 124, 119, 0, 0, 0, 107, 109, 0, 0, 0, 90, 0, 0, ); my @yyrindex = ( 155, 105, 0, 0, 0, 0, 0, 174, 111, 0, 80, 0, 105, 138, 0, 0, 0, 0, 0, 161, 145, 0, 138, 0, 0, 0, 105, 0, 0, 0, 0, 105, 0, 0, 0, 0, 29, 33, 70, 74, 0, 0, 46, 0, 0, 0, 0, 0, 45, 45, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 105, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 138, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 93, 0, 0, 0, 25, 0, 0, ); my @yygindex = ( 0, 85, 0, 151, 1, -12, 91, 0, 47, -18, -19, -17, 157, 0, 0, 83, 0, 0, 0, 0, 0, -3, 0, 127, 0, 95, ); sub constYYTABLESIZE () { 181 } my @yytable = ( 30, 24, 13, 1, 2, 41, 40, 42, 31, 2, 34, 64, 15, 22, 14, 19, 80, 84, 85, 3, 25, 20, 81, 4, 3, 51, 51, 22, 4, 23, 23, 65, 13, 24, 24, 12, 51, 51, 23, 13, 23, 23, 24, 51, 24, 24, 51, 23, 53, 53, 53, 24, 53, 53, 61, 61, 37, 51, 51, 23, 2, 2, 75, 86, 51, 78, 87, 94, 93, 95, 27, 27, 12, 23, 26, 26, 3, 88, 89, 27, 38, 27, 27, 26, 2, 26, 26, 26, 27, 23, 23, 38, 26, 24, 24, 27, 28, 29, 23, 59, 23, 23, 24, 56, 24, 24, 53, 23, 53, 53, 53, 24, 53, 53, 55, 55, 55, 48, 53, 49, 35, 53, 36, 37, 29, 35, 50, 91, 92, 29, 16, 17, 38, 62, 63, 39, 58, 38, 61, 55, 39, 55, 55, 55, 72, 39, 32, 33, 53, 53, 53, 55, 53, 53, 55, 37, 39, 69, 53, 53, 53, 71, 53, 53, 53, 53, 53, 76, 53, 53, 77, 79, 82, 83, 2, 30, 31, 47, 97, 98, 90, 43, ); my @yycheck = ( 18, 13, 1, 1, 2, 24, 24, 24, 1, 2, 22, 1, 1, 12, 6, 12, 12, 11, 12, 17, 1, 18, 18, 21, 17, 0, 1, 26, 21, 0, 1, 21, 31, 0, 1, 6, 11, 12, 9, 6, 11, 12, 9, 18, 11, 12, 0, 18, 3, 4, 5, 18, 7, 8, 0, 1, 11, 11, 12, 12, 2, 2, 61, 75, 18, 64, 78, 86, 86, 86, 0, 1, 14, 26, 0, 1, 17, 80, 81, 9, 0, 11, 12, 9, 2, 11, 12, 14, 18, 0, 1, 11, 18, 0, 1, 3, 4, 5, 9, 9, 11, 12, 9, 19, 11, 12, 1, 18, 3, 4, 5, 18, 7, 8, 3, 4, 5, 10, 13, 10, 1, 16, 3, 4, 5, 1, 10, 3, 4, 5, 7, 8, 13, 48, 49, 16, 10, 13, 6, 1, 16, 3, 4, 5, 1, 0, 19, 20, 3, 4, 5, 13, 7, 8, 16, 0, 11, 18, 3, 4, 5, 20, 7, 8, 3, 4, 5, 11, 7, 8, 11, 11, 1, 15, 0, 11, 11, 26, 87, 96, 85, 24, ); sub constYYFINAL () { 5 } sub constYYMAXTOKEN () { 21 } sub yyclearin { $yychar = -1; } sub yyerrok { $yyerrflag = 0; } sub YYERROR { ++$yynerrs; &yy_err_recover; } sub yy_err_recover { if ($yyerrflag < 3) { $yyerrflag = 3; while (1) { if (($yyn = $yysindex[$yyss[$yyssp]]) && ($yyn += constYYERRCODE()) >= 0 && $yyn <= $#yycheck && $yycheck[$yyn] == constYYERRCODE()) { $yyss[++$yyssp] = $yystate = $yytable[$yyn]; $yyvs[++$yyvsp] = $yylval; next yyloop; } else { return(1) if $yyssp <= 0; --$yyssp; --$yyvsp; } } } else { return (1) if $yychar == 0; $yychar = -1; next yyloop; } 0; } # yy_err_recover sub yyparse { if ($yys = $ENV{'YYDEBUG'}) { $yydebug = int($1) if $yys =~ /^(\d)/; } $yynerrs = 0; $yyerrflag = 0; $yychar = (-1); $yyssp = 0; $yyvsp = 0; $yyss[$yyssp] = $yystate = 0; yyloop: while(1) { yyreduce: { last yyreduce if ($yyn = $yydefred[$yystate]); if ($yychar < 0) { if (($yychar = &yylex) < 0) { $yychar = 0; } } if (($yyn = $yysindex[$yystate]) && ($yyn += $yychar) >= 0 && $yyn <= $#yycheck && $yycheck[$yyn] == $yychar) { $yyss[++$yyssp] = $yystate = $yytable[$yyn]; $yyvs[++$yyvsp] = $yylval; $yychar = (-1); --$yyerrflag if $yyerrflag > 0; next yyloop; } if (($yyn = $yyrindex[$yystate]) && ($yyn += $yychar) >= 0 && $yyn <= $#yycheck && $yycheck[$yyn] == $yychar) { $yyn = $yytable[$yyn]; last yyreduce; } if (! $yyerrflag) { &yyerror('syntax error'); ++$yynerrs; } return undef if &yy_err_recover; } # yyreduce $yym = $yylen[$yyn]; $yyval = $yyvs[$yyvsp+1-$yym]; switch: { my $label = "State$yyn"; goto $label if exists $yystate{$label}; last switch; State1: { # 107 "parser.y" { $yyval = { '' => $yyvs[$yyvsp-0] }; last switch; } } State3: { # 112 "parser.y" { $yyval = { $yyvs[$yyvsp-2], [$yyvs[$yyvsp-0]] }; last switch; } } State4: { # 116 "parser.y" { $yyval=$yyvs[$yyvsp-3]; $yyval->{$yyvs[$yyvsp-2]} = [$yyvs[$yyvsp-0]]; last switch; } } State5: { # 123 "parser.y" { $yyvs[$yyvsp-1]->[cTAG] = $yyvs[$yyvsp-3]; $yyval = need_explicit($yyvs[$yyvsp-3],$yyvs[$yyvsp-2]) ? explicit($yyvs[$yyvsp-1]) : $yyvs[$yyvsp-1]; last switch; } } State11: { # 137 "parser.y" { @{$yyval = []}[cTYPE,cCHILD] = ('COMPONENTS', $yyvs[$yyvsp-0]); last switch; } } State14: { # 147 "parser.y" { $yyvs[$yyvsp-1]->[cTAG] = $yyvs[$yyvsp-3]; @{$yyval = []}[cTYPE,cCHILD,cLOOP,cOPT] = ($yyvs[$yyvsp-5], [$yyvs[$yyvsp-1]], 1, $yyvs[$yyvsp-0]); $yyval = explicit($yyval) if need_explicit($yyvs[$yyvsp-3],$yyvs[$yyvsp-2]); last switch; } } State18: { # 160 "parser.y" { @{$yyval = []}[cTYPE,cCHILD] = ('SEQUENCE', $yyvs[$yyvsp-1]); last switch; } } State19: { # 164 "parser.y" { @{$yyval = []}[cTYPE,cCHILD] = ('SET', $yyvs[$yyvsp-1]); last switch; } } State20: { # 168 "parser.y" { @{$yyval = []}[cTYPE,cCHILD] = ('CHOICE', $yyvs[$yyvsp-1]); last switch; } } State21: { # 174 "parser.y" { @{$yyval = []}[cTYPE] = ('ENUM'); last switch; } } State22: { # 179 "parser.y" { @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-0]; last switch; } } State23: { # 180 "parser.y" { @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-0]; last switch; } } State24: { # 181 "parser.y" { @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-0]; last switch; } } State25: { # 183 "parser.y" { @{$yyval = []}[cTYPE,cCHILD,cDEFINE] = ('ANY',undef,$yyvs[$yyvsp-0]); last switch; } } State26: { # 186 "parser.y" { @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-0]; last switch; } } State27: { # 189 "parser.y" { $yyval=undef; last switch; } } State28: { # 190 "parser.y" { $yyval=$yyvs[$yyvsp-0]; last switch; } } State30: { # 196 "parser.y" { $yyval = $yyvs[$yyvsp-0]; last switch; } } State31: { # 197 "parser.y" { $yyval = $yyvs[$yyvsp-1]; last switch; } } State32: { # 201 "parser.y" { $yyval = [ $yyvs[$yyvsp-0] ]; last switch; } } State33: { # 205 "parser.y" { push @{$yyval=$yyvs[$yyvsp-2]}, $yyvs[$yyvsp-0]; last switch; } } State34: { # 209 "parser.y" { push @{$yyval=$yyvs[$yyvsp-2]}, $yyvs[$yyvsp-0]; last switch; } } State35: { # 215 "parser.y" { @{$yyval=$yyvs[$yyvsp-0]}[cVAR,cTAG] = ($yyvs[$yyvsp-3],$yyvs[$yyvsp-2]); $yyval = explicit($yyval) if need_explicit($yyvs[$yyvsp-2],$yyvs[$yyvsp-1]); last switch; } } State36: { # 220 "parser.y" { @{$yyval=[]}[cTYPE] = 'EXTENSION_MARKER'; last switch; } } State37: { # 226 "parser.y" { $yyval = []; last switch; } } State38: { # 228 "parser.y" { my $extension = 0; $yyval = []; for my $i (@{$yyvs[$yyvsp-0]}) { $extension = 1 if $i->[cTYPE] eq 'EXTENSION_MARKER'; $i->[cEXT] = $i->[cOPT]; $i->[cEXT] = 1 if $extension; push @{$yyval}, $i unless $i->[cTYPE] eq 'EXTENSION_MARKER'; } my $e = []; $e->[cTYPE] = 'EXTENSION_MARKER'; push @{$yyval}, $e if $extension; last switch; } } State39: { # 241 "parser.y" { my $extension = 0; $yyval = []; for my $i (@{$yyvs[$yyvsp-1]}) { $extension = 1 if $i->[cTYPE] eq 'EXTENSION_MARKER'; $i->[cEXT] = $i->[cOPT]; $i->[cEXT] = 1 if $extension; push @{$yyval}, $i unless $i->[cTYPE] eq 'EXTENSION_MARKER'; } my $e = []; $e->[cTYPE] = 'EXTENSION_MARKER'; push @{$yyval}, $e if $extension; last switch; } } State40: { # 256 "parser.y" { $yyval = [ $yyvs[$yyvsp-0] ]; last switch; } } State41: { # 260 "parser.y" { push @{$yyval=$yyvs[$yyvsp-2]}, $yyvs[$yyvsp-0]; last switch; } } State42: { # 264 "parser.y" { push @{$yyval=$yyvs[$yyvsp-2]}, $yyvs[$yyvsp-0]; last switch; } } State43: { # 270 "parser.y" { @{$yyval=$yyvs[$yyvsp-1]}[cOPT] = ($yyvs[$yyvsp-0]); last switch; } } State47: { # 279 "parser.y" { @{$yyval=$yyvs[$yyvsp-0]}[cVAR,cTAG] = ($yyvs[$yyvsp-3],$yyvs[$yyvsp-2]); $yyval->[cOPT] = $yyvs[$yyvsp-3] if $yyval->[cOPT]; $yyval = explicit($yyval) if need_explicit($yyvs[$yyvsp-2],$yyvs[$yyvsp-1]); last switch; } } State49: { # 286 "parser.y" { @{$yyval=$yyvs[$yyvsp-0]}[cTAG] = ($yyvs[$yyvsp-2]); $yyval = explicit($yyval) if need_explicit($yyvs[$yyvsp-2],$yyvs[$yyvsp-1]); last switch; } } State50: { # 291 "parser.y" { @{$yyval=[]}[cTYPE] = 'EXTENSION_MARKER'; last switch; } } State51: { # 296 "parser.y" { $yyval = undef; last switch; } } State52: { # 297 "parser.y" { $yyval = 1; last switch; } } State53: { # 301 "parser.y" { $yyval = undef; last switch; } } State55: { # 305 "parser.y" { $yyval = undef; last switch; } } State56: { # 306 "parser.y" { $yyval = 1; last switch; } } State57: { # 307 "parser.y" { $yyval = 0; last switch; } } State58: { # 310 "parser.y" { last switch; } } State59: { # 311 "parser.y" { last switch; } } State60: { # 314 "parser.y" { last switch; } } State61: { # 317 "parser.y" { last switch; } } State62: { # 318 "parser.y" { last switch; } } } # switch $yyssp -= $yym; $yystate = $yyss[$yyssp]; $yyvsp -= $yym; $yym = $yylhs[$yyn]; if ($yystate == 0 && $yym == 0) { $yystate = constYYFINAL(); $yyss[++$yyssp] = constYYFINAL(); $yyvs[++$yyvsp] = $yyval; if ($yychar < 0) { if (($yychar = &yylex) < 0) { $yychar = 0; } } return $yyvs[$yyvsp] if $yychar == 0; next yyloop; } if (($yyn = $yygindex[$yym]) && ($yyn += $yystate) >= 0 && $yyn <= $#yycheck && $yycheck[$yyn] == $yystate) { $yystate = $yytable[$yyn]; } else { $yystate = $yydgoto[$yym]; } $yyss[++$yyssp] = $yystate; $yyvs[++$yyvsp] = $yyval; } # yyloop } # yyparse # 322 "parser.y" my %reserved = ( 'OPTIONAL' => constOPTIONAL(), 'CHOICE' => constCHOICE(), 'OF' => constOF(), 'IMPLICIT' => constIMPLICIT(), 'EXPLICIT' => constEXPLICIT(), 'SEQUENCE' => constSEQUENCE(), 'SET' => constSET(), 'ANY' => constANY(), 'ENUM' => constENUM(), 'ENUMERATED' => constENUM(), 'COMPONENTS' => constCOMPONENTS(), '{' => constLBRACE(), '}' => constRBRACE(), ',' => constCOMMA(), '::=' => constASSIGN(), 'DEFINED' => constDEFINED(), 'BY' => constBY() ); my $reserved = join("|", reverse sort grep { /\w/ } keys %reserved); my %tag_class = ( APPLICATION => ASN_APPLICATION, UNIVERSAL => ASN_UNIVERSAL, PRIVATE => ASN_PRIVATE, CONTEXT => ASN_CONTEXT, '' => ASN_CONTEXT # if not specified, its CONTEXT ); ;## ;## This is NOT thread safe !!!!!! ;## my $pos; my $last_pos; my @stacked; sub parse { local(*asn) = \($_[0]); $tagdefault = $_[1] eq 'EXPLICIT' ? 1 : 0; ($pos,$last_pos,@stacked) = (); eval { local $SIG{__DIE__}; compile(verify(yyparse())); } } sub compile_one { my $tree = shift; my $ops = shift; my $name = shift; foreach my $op (@$ops) { next unless ref($op) eq 'ARRAY'; bless $op; my $type = $op->[cTYPE]; if (exists $base_type{$type}) { $op->[cTYPE] = $base_type{$type}->[1]; $op->[cTAG] = defined($op->[cTAG]) ? asn_encode_tag($op->[cTAG]): $base_type{$type}->[0]; } else { die "Unknown type '$type'\n" unless exists $tree->{$type}; my $ref = compile_one( $tree, $tree->{$type}, defined($op->[cVAR]) ? $name . "." . $op->[cVAR] : $name ); if (defined($op->[cTAG]) && $ref->[0][cTYPE] == opCHOICE) { @{$op}[cTYPE,cCHILD] = (opSEQUENCE,$ref); } else { @{$op}[cTYPE,cCHILD,cLOOP] = @{$ref->[0]}[cTYPE,cCHILD,cLOOP]; } $op->[cTAG] = defined($op->[cTAG]) ? asn_encode_tag($op->[cTAG]): $ref->[0][cTAG]; } $op->[cTAG] |= pack("C",ASN_CONSTRUCTOR) if length $op->[cTAG] && ($op->[cTYPE] == opSET || $op->[cTYPE] == opEXPLICIT || $op->[cTYPE] == opSEQUENCE); if ($op->[cCHILD]) { ;# If we have children we are one of ;# opSET opSEQUENCE opCHOICE opEXPLICIT compile_one($tree, $op->[cCHILD], defined($op->[cVAR]) ? $name . "." . $op->[cVAR] : $name); ;# If a CHOICE is given a tag, then it must be EXPLICIT if ($op->[cTYPE] == opCHOICE && defined($op->[cTAG]) && length($op->[cTAG])) { $op = bless explicit($op); $op->[cTYPE] = opSEQUENCE; } if ( @{$op->[cCHILD]} > 1) { ;#if ($op->[cTYPE] != opSEQUENCE) { ;# Here we need to flatten CHOICEs and check that SET and CHOICE ;# do not contain duplicate tags ;#} if ($op->[cTYPE] == opSET) { ;# In case we do CER encoding we order the SET elements by thier tags my @tags = map { length($_->[cTAG]) ? $_->[cTAG] : $_->[cTYPE] == opCHOICE ? (sort map { $_->[cTAG] } $_->[cCHILD])[0] : '' } @{$op->[cCHILD]}; @{$op->[cCHILD]} = @{$op->[cCHILD]}[sort { $tags[$a] cmp $tags[$b] } 0..$#tags]; } } else { ;# A SET of one element can be treated the same as a SEQUENCE $op->[cTYPE] = opSEQUENCE if $op->[cTYPE] == opSET; } } } $ops; } sub compile { my $tree = shift; ;# The tree should be valid enough to be able to ;# - resolve references ;# - encode tags ;# - verify CHOICEs do not contain duplicate tags ;# once references have been resolved, and also due to ;# flattening of COMPONENTS, it is possible for an op ;# to appear in multiple places. So once an op is ;# compiled we bless it. This ensure we dont try to ;# compile it again. while(my($k,$v) = each %$tree) { compile_one($tree,$v,$k); } $tree; } sub verify { my $tree = shift or return; my $err = ""; ;# Well it parsed correctly, now we ;# - check references exist ;# - flatten COMPONENTS OF (checking for loops) ;# - check for duplicate var names while(my($name,$ops) = each %$tree) { my $stash = {}; my @scope = (); my $path = ""; my $idx = 0; while($ops) { if ($idx < @$ops) { my $op = $ops->[$idx++]; my $var; if (defined ($var = $op->[cVAR])) { $err .= "$name: $path.$var used multiple times\n" if $stash->{$var}++; } if (defined $op->[cCHILD]) { if (ref $op->[cCHILD]) { push @scope, [$stash, $path, $ops, $idx]; if (defined $var) { $stash = {}; $path .= "." . $var; } $idx = 0; $ops = $op->[cCHILD]; } elsif ($op->[cTYPE] eq 'COMPONENTS') { splice(@$ops,--$idx,1,expand_ops($tree, $op->[cCHILD])); } else { die "Internal error\n"; } } } else { my $s = pop @scope or last; ($stash,$path,$ops,$idx) = @$s; } } } die $err if length $err; $tree; } sub expand_ops { my $tree = shift; my $want = shift; my $seen = shift || { }; die "COMPONENTS OF loop $want\n" if $seen->{$want}++; die "Undefined macro $want\n" unless exists $tree->{$want}; my $ops = $tree->{$want}; die "Bad macro for COMPUNENTS OF '$want'\n" unless @$ops == 1 && ($ops->[0][cTYPE] eq 'SEQUENCE' || $ops->[0][cTYPE] eq 'SET') && ref $ops->[0][cCHILD]; $ops = $ops->[0][cCHILD]; for(my $idx = 0 ; $idx < @$ops ; ) { my $op = $ops->[$idx++]; if ($op->[cTYPE] eq 'COMPONENTS') { splice(@$ops,--$idx,1,expand_ops($tree, $op->[cCHILD], $seen)); } } @$ops; } sub _yylex { my $ret = &_yylex; warn $ret; $ret; } sub yylex { return shift @stacked if @stacked; while ($asn =~ /\G(?: (\s+|--[^\n]*) | ([,{}]|::=) | ($reserved)\b | ( (?:OCTET|BIT)\s+STRING | OBJECT\s+IDENTIFIER | RELATIVE-OID )\b | (\w+(?:-\w+)*) | \[\s* ( (?:(?:APPLICATION|PRIVATE|UNIVERSAL|CONTEXT)\s+)? \d+ ) \s*\] | \((\d+)\) | (\.\.\.) )/sxgo ) { ($last_pos,$pos) = ($pos,pos($asn)); next if defined $1; # comment or whitespace if (defined $2 or defined $3) { my $ret = $+; # A comma is not required after a '}' so to aid the # parser we insert a fake token after any '}' if ($ret eq '}') { my $p = pos($asn); my @tmp = @stacked; @stacked = (); pos($asn) = $p if yylex() != constCOMMA(); # swallow it @stacked = (@tmp, constPOSTRBRACE()); } return $reserved{$yylval = $ret}; } if (defined $4) { ($yylval = $+) =~ s/\s+/_/g; return constWORD(); } if (defined $5) { $yylval = $+; return constWORD(); } if (defined $6) { my($class,$num) = ($+ =~ /^([A-Z]*)\s*(\d+)$/); $yylval = asn_tag($tag_class{$class}, $num); return constCLASS(); } if (defined $7) { $yylval = $+; return constNUMBER(); } if (defined $8) { return constEXTENSION_MARKER(); } die "Internal error\n"; } die "Parse error before ",substr($asn,$pos,40),"\n" unless $pos == length($asn); 0 } sub yyerror { die @_," ",substr($asn,$last_pos,40),"\n"; } 1; %yystate = ('State51','','State34','','State11','','State33','','State24', '','State47','','State40','','State31','','State37','','State23','', 'State22','','State21','','State57','','State39','','State56','','State20', '','State25','','State38','','State62','','State14','','State19','', 'State5','','State53','','State26','','State27','','State50','','State36', '','State4','','State3','','State32','','State49','','State43','','State30', '','State35','','State52','','State55','','State42','','State28','', 'State58','','State61','','State41','','State18','','State59','','State1', '','State60',''); 1;