aboutsummaryrefslogtreecommitdiffstats
path: root/asn1c
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-04-28 02:55:35 +0000
committerLev Walkin <vlm@lionet.info>2005-04-28 02:55:35 +0000
commit1e1cf7cb2eda7b51dcffbcca49aaa6f222d660cc (patch)
tree10e1cf5a14eb3049878de790d61218a7a49517ea /asn1c
parentf0b808da3021d852b3b57e8b23f4c582c577eb86 (diff)
binary decoders
Diffstat (limited to 'asn1c')
-rwxr-xr-xasn1c/webcgi/asn1c.cgi141
1 files changed, 115 insertions, 26 deletions
diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi
index 07966774..3a39df0f 100755
--- a/asn1c/webcgi/asn1c.cgi
+++ b/asn1c/webcgi/asn1c.cgi
@@ -47,6 +47,56 @@ use CGI qw/param cookie header upload escapeHTML/;
$|=1; # Enable AutoFlush (for older versions of Perl)
+my %binaryDecoders = (
+ x509 => { order => 1,
+ type => 'X.509 Certificate',
+ typeExt => 'X.509 Certificate',
+ exe => 'x509dump',
+ cmdopts => '-x',
+ msg => ''
+ },
+
+ tap0311 => { order => 2,
+ type => TAP3,
+ typeExt => 'GSM TAP3-11 data',
+ exe => 'tap3dump-11',
+ cmdopts => '-x',
+ msg => ''
+ },
+
+ tap0310 => { order => 3,
+ type => TAP3,
+ typeExt => 'GSM TAP3-10 data',
+ exe => 'tap3dump-10',
+ cmdopts => '-x',
+ msg => ''
+ },
+
+ tap0309 => { order => 4,
+ type => TAP3,
+ typeExt => 'GSM TAP3-09 data',
+ exe => 'tap3dump-09',
+ cmdopts => '-x',
+ msg => ''
+ },
+
+ mheg5 => { order => 5,
+ type => 'MHEG-5',
+ typeExt => 'ISO MHEG-5 data',
+ exe => 'mheg5dump',
+ cmdopts => '-x',
+ msg => ''
+ },
+
+ ber => { order => 6,
+ type => BER,
+ typeExt => 'BER encoded data',
+ exe => 'unber',
+ cmdopts => '',
+ msg => "<!-- Use 'enber' to convert it back into BER -->\n"
+ }
+);
+
my $redirect = ''; # No redirection by default
my $redirect_bottom = ''; # No redirection text by default
my $content = ''; # Default content is empty
@@ -412,33 +462,54 @@ if($#gotSafeNames >= 0) {
. "; ec=\$?; echo \$ec > $sandbox/+ExitCode"
. "; exit \$ec";
- my $ec = (256 * $DataERR); # Simulate EX_DATAERR
my $fType = param('fileType');
+ $fType = 'auto' unless $fType;
# Compile as ASN.1 text
- if($fType ne 'ber') {
- $ec = system($CompileASN);
+ if($fType eq 'auto' || $fType eq 'asn1') {
+ my $ec = system($CompileASN);
bark("Failed to initiate compilation process: $!")
if(!-r $sandbox . '/+ExitCode');
+ if($ec != (256 * $DataERR)) {
+ makeArchive($TMPDIR, $sandbox) unless $ec;
+ goto REGET; # Issue a clean GET request.
+ }
}
- if($ec == (256 * $DataERR) and $fType ne 'asn') {
- # Unrecognized ASN.1 module format.
- # Try out BER decoding.
- my $uec = system("$SUIDHelper $TMPDIR $inChDir unber @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1");
- if(($uec == 0 or $fType eq 'ber')
- and open(U, "> $TMPDIR/$inChDir/+UNBER")) {
- my $fnames = escapeHTML(join(", ", @gotNames));
- open(T, "< $TMPDIR/$inChDir/+UNBER.tmp");
- print U "<!-- BER structure of $fnames; decoded by 'unber' (c) Lev Walkin <vlm\@lionet.info> -->\n";
- print U while <T>;
+ # Unrecognized ASN.1 module format.
+ # Try out several BER decoders.
+ foreach my $t (sort { $binaryDecoders{$a} cmp $binaryDecoders{$b} }
+ keys %binaryDecoders) {
+ next unless ($fType eq 'auto' or $fType eq $t);
+ my %dec = %{$binaryDecoders{$t}};
+ my $ec = system("$SUIDHelper $TMPDIR $inChDir $dec{exe} $dec{cmdopts} @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1");
+ next if ($ec != 0 and $t ne $fType
+ and (-s "$TMPDIR/$inChDir/+UNBER.tmp" < 1000));
+ last unless open(U, "> $TMPDIR/$inChDir/+UNBER");
+ my $fnames = escapeHTML(join(", ", @gotNames));
+ print U "<!-- $dec{type} structure of $fnames; "
+ . "decoded by '$dec{exe}' "
+ . "(c) Lev Walkin <vlm\@lionet.info> -->\n"
+ . $dec{msg};
+ open(T, "< $TMPDIR/$inChDir/+UNBER.tmp");
+ print U while <T>;
+ close(U);
+ close(T);
+ open(U, "> $TMPDIR/$inChDir/+UNBER.TYPE");
+ print U $dec{typeExt};
+ close(U);
+ if($ec) {
+ # Indicate unclean exit.
+ open(U, "> $TMPDIR/$inChDir/+UNBER.EXIT");
+ print U $ec;
close(U);
- close(T);
}
- unlink("$TMPDIR/$inChDir/+UNBER.tmp");
- } else {
- makeArchive($TMPDIR, $sandbox);
+ last;
}
+ unlink("$TMPDIR/$inChDir/+UNBER.tmp");
+
+REGET:
+
if($ENV{REQUEST_METHOD} ne 'GET') {
print "Status: 303 See Other\n";
print "Location: $myName\n";
@@ -461,8 +532,13 @@ $form =
. "</TD></TR><TD VALIGN=top><FONT COLOR=green>&rArr;</FONT></TD><TD>"
. "<SELECT NAME=fileType>"
. "<OPTION VALUE=auto>Autodetect type of file ..."
-. "<OPTION VALUE=asn>ASN.1 text file ..."
+. "<OPTION VALUE=asn1>ASN.1 module text..."
. "<OPTION VALUE=ber>BER/DER/CER data ..."
+. "<OPTION VALUE=tap0311>GSM TAP3-11 data ..."
+. "<OPTION VALUE=tap0310>GSM TAP3-10 data ..."
+. "<OPTION VALUE=tap0309>GSM TAP3-09 data ..."
+. "<OPTION VALUE=mheg5>ISO MHEG-5 data ..."
+. "<OPTION VALUE=x509>X.509 in DER (not PEM!)..."
. "</SELECT>"
. "</TD><TD ALIGN=right>"
. "<INPUT TYPE=file NAME=file SIZE=13>"
@@ -571,13 +647,26 @@ foreach my $trans (sort { $b cmp $a } @transactions) {
if($ec eq "0") {
$results = "<FONT COLOR=darkgreen><B>"
. "Compiled OK</B></FONT><BR>\n";
- } elsif(-f $sessionDir . '/' . $trans . '/+UNBER') {
- my $msg = 'This looks like a BER-encoded data';
- $msg = "Treating input as BER-encoded data" if $ec eq '';
+ } elsif(open(U, $sessionDir . '/' . $trans . '/+UNBER.TYPE')) {
+ my $type = <U>; close(U);
+ my $msg;
+ if($ec eq '') {
+ $msg = 'Treating input as ' . $type;
+ } else {
+ $msg = 'This looks like ' . $type;
+ }
$results = "<FONT COLOR=darkgreen><B>$msg</B></FONT><BR>\n";
- $resText = "Show BER structure";
+ if(-f $sessionDir . '/' . $trans . '/+UNBER.EXIT') {
+ $results = "<FONT COLOR=darkred SIZE=-1>"
+ . "<NOBR>$type:</NOBR> "
+ . "Broken encoding</FONT><BR>\n";
+ $ec = 'broken-input';
+ $resText = "Show $type decoding attempt";
+ } else {
+ $ec = 0;
+ $resText = "Show $type contents";
+ }
$resCode = "unber";
- $ec = 0;
} else {
my $why = $ec;
$why = "<NOBR>Broken input file</NOBR>" if $ec == $DataERR;
@@ -648,7 +737,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) {
$history .= "<TR $trColor>"
. "<TH ALIGN=center ID=num>$tNum"
- . "<BR><FONT FACE=Serif>[<A ID=modrefs "
+ . "<BR><FONT FACE=serif>[<A ID=modrefs "
. "HREF=\"$myName?time="
. escapeHTML($origTime)
. "&file=$f&remove=$tNum\""
@@ -701,7 +790,7 @@ if($history) {
. "<FONT COLOR=darkred><B>Bottom line:</B> ASN.1 compiler was unable to process some of the input.</FONT><BR>"
. "This is typically caused by syntax errors in the input files.\n"
. "Such errors are normally fixed by removing or adding a couple of characters in the ASN.1 module.<BR>\n"
- . "<BR><B><FONT COLOR=darkred>Please consider clicking on the appropriate &quot;<I>Help me fix it!</I>&quot; button above.</FONT></B><BR>\n"
+ . "<BR><B><FONT COLOR=darkred>&rArr; Please consider clicking on the appropriate &quot;<I>Help me fix it!</I>&quot; button above.</FONT></B><BR>\n"
. "An email will be sent to a live person who will fix the ASN.1 module for you. (The typical turn-around time is less than 24 hours.)\n"
. "<BR>This is <B>free</B>, and highly advisable.\n"
. "<BR>Your request will help us make a better compiler!\n"
@@ -725,7 +814,7 @@ $content .=
. "</TD><TD WIDTH=60% HEIGHT=50% ALIGN=center VALIGN=$histValign>$history \n"
. "</TD></TR><TR><TD HEIGHT=50% VALIGN=bottom>"
. "<B>Privacy Note:</B> this page is tailored "
- . "to your browser using a cryprographically strong cookie. "
+ . "to your browser. "
. "<I>Other users will see their own (different) data.</I> "
. "(<A HREF=asn1c-privacy.html>Read more...</A>)"
. "</TD></TR></TABLE>";