cryptoservices/certificateandkeymgmt/tder/importdumpasn1.pl
changeset 8 35751d3474b7
parent 0 2c201484c85f
child 11 9d767430696e
child 19 ece3df019add
--- a/cryptoservices/certificateandkeymgmt/tder/importdumpasn1.pl	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/tder/importdumpasn1.pl	Thu Sep 10 14:01:51 2009 +0300
@@ -1,354 +1,354 @@
-#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description: 
-#
-#!/bin/perl
-
-# Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "Symbian Foundation License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description:
-# Imports ASN.1 files into a format that may be used by dergen.pl by
-# de-compiing the data using dumpasn1.
-# 
-#
-
-use strict;
-use Getopt::Long;
-
-my $DEBUG = 0;
-my $TABS = "";
-my $OUTPUT_BUFFER = "";
-
-main();
-exit;
-
-sub main() {
-	my $out;
-	my $outFh;
-	my $in;	
-	my @lines;
-
-	GetOptions('debug=i' => \$DEBUG,
-			   'in=s' => \$in,
-			   'out=s' => \$out);
-
-	if (! defined $in && defined $ARGV[0]) {
-		$in = $ARGV[0];
-	}
-
-	if (defined $in) {
-		@lines = decompile($in);
-	}
-	else {
-		die "No input file specified.\n";
-	}
-
-	if (! defined $out && defined $ARGV[1]) {
-		$out = $ARGV[1];
-	}
-	if (defined $out) {
-		open $outFh, ">$out" || die "Cannot open output file $out";
-	}
-	else {
-		$outFh = *STDOUT;
-	}
-	translate(\@lines);
-	print $outFh $OUTPUT_BUFFER; 
-}
-
-sub translate($) {
-	my ($lines) = @_;
-	my $lineCount = scalar(@$lines);
-
-	for (my $i = 0; $i < $lineCount; ++$i) {
-		$_ = @$lines[$i];
-		s/^\s*//g;
-		s/\n//g;
-
-		if ($DEBUG >= 3) {
-			print "$_\n";
-		}
-
-		if ( /^OBJECT\s+IDENTIFIER\s*$/ ) {
-			if ($DEBUG >= 3) {
-				print "reading OID value from next line\n";
-			}
-			if (defined @$lines[$i+1]) {
-				$_ .= @$lines[++$i];
-			}
-		}
-
-		if ( /BIT\s+STRING,\s+encapsulates/i ) {
-			addToOutput("BITSTRING_WRAPPER");
-			nest();
-		}
-		elsif ( /^\s*BIT\s+STRING/i ) {
-			# bitstring defined in binary
-			if ( $$lines[$i+1] =~ /\'([01]+)\'/ ) {
-				$i++;
-				addToOutput("BITSTRING=$1");
-			}
-			# bit string defined in hex
-			elsif ( /^\s*BIT\s+STRING\s+(([A-F0-9][A-F0-9]\s*)+)/i ) {
-				my $bitStr = toBitString($1);
-				addToOutput("BITSTRING=$bitStr");
-			}
-			else {
-			# bit string wrapper
-				addToOutput("BITSTRING_WRAPPER");
-				nest();
-				addToOutput("RAW \{");
-				nest();
-				$i++;
-				addToOutput(getRawHex($lines,\$i));
-				leaveNest();
-				addToOutput(" \}");
-				leaveNest();
-				addToOutput("END");								
-			}
-		}
-		elsif ( /^(BMPSTRING\s+)\'(.*)\'/i ) {
-			addToOutput("BMPSTRING=$2");
-		}
-		elsif ( /^(BOOLEAN\s+)(.*)/i ) {
-			addToOutput("BOOLEAN=$2");
-		}
-		elsif ( /(^ENUMERATED\s+)(\d+)*$/i ) {
-			# small integer - non hex incoded
-			addToOutput("ENUMERATED=$2");
-		}
-		elsif ( /^\[(\d+)\]\s*\'(.*)\'/ ) { 
-			addToOutput("IMPLICIT=$1");
-			nest();
-			addToOutput("PRINTABLESTRING=$2");
-			leaveNest();
-			addToOutput("END");
-		}
-		elsif ( /^\[(\d+)\]/ ) {
-			# general case for implicit & explicit tags
-			my $tag=$1;
-			if (defined @$lines[$i+1] && isRawData(@$lines[$i+1])) {
-				# if there is only raw data assume implicit
-				addToOutput("IMPLICIT=$tag");				
-				nest();
-				addToOutput("OCTETSTRING");
-				nest();
-				addToOutput("RAW \{");
-				while (isRawData(@$lines[++$i])) {
-					addToOutput("" . @$lines[$i] . "");
-				}
-				--$i;
-				addToOutput("\}");
-				leaveNest();
-				addToOutput("END");
-				leaveNest();
-				addToOutput("END");
-				leaveNest();
-			}
-			else {
-				# otherwise assume explicit
-				addToOutput("EXPLICIT=$tag");
-			}
-			nest();
-		}			
-		elsif ( /^(IA5STRING\s+)\'(.*)\'/i ) {
-			addToOutput("IA5STRING=$2");
-		}
-		elsif ( /(^INTEGER\s+)(\d+)*$/i ) {
-			# small integer - non hex incoded
-			addToOutput("INTEGER=$2");
-		}
-		elsif (/^INTEGER/) {
-			# big integer
-			addToOutput("BIGINTEGER {");
-			my $tmp = $_;
-			$tmp =~ s/.*INTEGER\s+//g;
-			nest();
-			if (isRawData($tmp)) {
-				addToOutput($tmp);
-			}
-
-			$i++;
-			addToOutput(getRawHex($lines,\$i));
-			leaveNest();
-			addToOutput("\}");
-		}
-		elsif ( /^NULL/i ) {
-			addToOutput("NULL");
-		}
-		elsif ( /^OCTET STRING\s*$/i ) {
-			$i++;
-			addToOutput("OCTETSTRING");				
-			nest();
-			addToOutput("RAW \{");
-			nest();
-			addToOutput(getRawHex($lines,\$i));
-			leaveNest();
-			addToOutput("\}");
-			leaveNest();
-			addToOutput("END");								
-		}
-		elsif ( /^OCTET\s+STRING.*encapsulates/i ) {
-			addToOutput("OCTETSTRING");
-			nest();			
-		}
-		elsif ( /^OCTET\s+STRING/i ) {
-			addToOutput("OCTETSTRING");
-			nest();			
-			my $hex = $_;
-			$hex =~ s/OCTET\s+STRING\s+//g;
-			addToOutput("RAW=$hex");
-			leaveNest();
-			addToOutput("END");
-		}
-		elsif ( /^OBJECT\s+IDENTIFIER\s+\'([\d ]+)\'/i ) { 
-			# plain oid
-			my $oid = $1;
-			$oid =~ s/ /./g;
-			addToOutput("OID=$oid");
-		}
-		elsif ( /(^OBJECT\s+IDENTIFIER.*\()([\d ]+)/i ) { 
-			# extra information printed with oid
-			my $oid = $2;
-			$oid =~ s/ /./g;
-			addToOutput("OID=$oid");
-		}
-		elsif ( /(^PRINTABLESTRING\s*\')([^\']*)/i ) {
-			addToOutput("PRINTABLESTRING=$2");
-		}
-		elsif ( /^SEQUENCE/i ) {
-			addToOutput("SEQUENCE");
-			nest();
-		}
-		elsif ( /^SET/i ) {
-			addToOutput("SET");
-			nest();
-		}
-		elsif (/^(UTCTIME\s+\')([^\']+)/i) {
-			addToOutput("UTCTIME=$2");
-		}
-		elsif ( /^(UTF8STRING\s+)\'(.*)\'/i ) {
-			addToOutput("UTF8STRING=$2");
-		}
-		elsif ( /^\}/) {				
-			leaveNest();
-			addToOutput("END");
-		}
-		elsif (isRawData($_)) {
-			my $raw = s/\s+/ /g;
-			addToOutput("RAW=$_");
-		}
-
-	}
-}
-
-sub addToOutput($) {
-	my ($text) = @_;
-
-	if ($DEBUG >= 3) {
-		print "+${TABS}$text\n";
-	}
-	$OUTPUT_BUFFER .= "${TABS}$text\n";
-}
-
-sub getRawHex($) {
-	my ($lines,$index) = @_;
-	my $translated = '';
-
-	my $end = 0;
-	do {
-		my $line = $$lines[$$index];
-		last if (!defined $line);
-		chomp($line);
-
-		if (isRawData($line)) {
-			$line =~ s/^\s+//g;
-			addToOutput("$line");
-			$$index++;
-		}
-		else {
-			$$index--;
-			$end = 1;
-		}					
-	} while (! $end);
-	return $translated;
-}
-
-sub isRawData() {
-	my ($line) = @_;
-	my $retVal = ($line =~ /^\s*([A-F0-9][A-F0-9]\s?)+$/i);
-	if ($DEBUG >= 3 && $retVal) {
-		print "RAW: ";
-	}
-	return $retVal;
-}
-
-sub toBitString() {
-	my ($hex) = @_;
-	my $bitStr = "";
-	$hex =~ s/\s//g;
-
-	for (my $i=0; $i < length($hex); $i+=2) {
-		my $num = hex(substr($hex, $i, 2));
-		print ".$num";
-		for (my $j=0; $j < 8; $j++) {
-			$bitStr .= ($num & 0x80) ? '1' : '0';
-			$num <<= 1;
-		}
-	}
-	if ($DEBUG >= 2) {
-		print "\nbitStr: $hex = $bitStr\n";
-	}
-	return $bitStr;
-}
-
-# increment debug tabbing level
-sub nest() {
-	$TABS .= "   ";
-}
-
-# decrement debug tabbing level
-sub leaveNest() {
-	$TABS =~ s/^...//;
-}
-
-
-sub decompile($) {
-	my ($inFile) = @_;
-
-
-	my @command = ("cmd", 
-				   "/C \"dumpasn1 -apruz $inFile > _dump.tmp\"");
-
-	if ((my $err = system(@command)) != 0) {
-		die "decode: " . join(" ", @command) . "\nreturned error $err";
-	}
-
-	my $dumpFh;
-	open $dumpFh, "_dump.tmp";
-	my @lines = <$dumpFh>;
-	close $dumpFh;
-
-	return @lines;
-}
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/bin/perl
+
+# Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Imports ASN.1 files into a format that may be used by dergen.pl by
+# de-compiing the data using dumpasn1.
+# 
+#
+
+use strict;
+use Getopt::Long;
+
+my $DEBUG = 0;
+my $TABS = "";
+my $OUTPUT_BUFFER = "";
+
+main();
+exit;
+
+sub main() {
+	my $out;
+	my $outFh;
+	my $in;	
+	my @lines;
+
+	GetOptions('debug=i' => \$DEBUG,
+			   'in=s' => \$in,
+			   'out=s' => \$out);
+
+	if (! defined $in && defined $ARGV[0]) {
+		$in = $ARGV[0];
+	}
+
+	if (defined $in) {
+		@lines = decompile($in);
+	}
+	else {
+		die "No input file specified.\n";
+	}
+
+	if (! defined $out && defined $ARGV[1]) {
+		$out = $ARGV[1];
+	}
+	if (defined $out) {
+		open $outFh, ">$out" || die "Cannot open output file $out";
+	}
+	else {
+		$outFh = *STDOUT;
+	}
+	translate(\@lines);
+	print $outFh $OUTPUT_BUFFER; 
+}
+
+sub translate($) {
+	my ($lines) = @_;
+	my $lineCount = scalar(@$lines);
+
+	for (my $i = 0; $i < $lineCount; ++$i) {
+		$_ = @$lines[$i];
+		s/^\s*//g;
+		s/\n//g;
+
+		if ($DEBUG >= 3) {
+			print "$_\n";
+		}
+
+		if ( /^OBJECT\s+IDENTIFIER\s*$/ ) {
+			if ($DEBUG >= 3) {
+				print "reading OID value from next line\n";
+			}
+			if (defined @$lines[$i+1]) {
+				$_ .= @$lines[++$i];
+			}
+		}
+
+		if ( /BIT\s+STRING,\s+encapsulates/i ) {
+			addToOutput("BITSTRING_WRAPPER");
+			nest();
+		}
+		elsif ( /^\s*BIT\s+STRING/i ) {
+			# bitstring defined in binary
+			if ( $$lines[$i+1] =~ /\'([01]+)\'/ ) {
+				$i++;
+				addToOutput("BITSTRING=$1");
+			}
+			# bit string defined in hex
+			elsif ( /^\s*BIT\s+STRING\s+(([A-F0-9][A-F0-9]\s*)+)/i ) {
+				my $bitStr = toBitString($1);
+				addToOutput("BITSTRING=$bitStr");
+			}
+			else {
+			# bit string wrapper
+				addToOutput("BITSTRING_WRAPPER");
+				nest();
+				addToOutput("RAW \{");
+				nest();
+				$i++;
+				addToOutput(getRawHex($lines,\$i));
+				leaveNest();
+				addToOutput(" \}");
+				leaveNest();
+				addToOutput("END");								
+			}
+		}
+		elsif ( /^(BMPSTRING\s+)\'(.*)\'/i ) {
+			addToOutput("BMPSTRING=$2");
+		}
+		elsif ( /^(BOOLEAN\s+)(.*)/i ) {
+			addToOutput("BOOLEAN=$2");
+		}
+		elsif ( /(^ENUMERATED\s+)(\d+)*$/i ) {
+			# small integer - non hex incoded
+			addToOutput("ENUMERATED=$2");
+		}
+		elsif ( /^\[(\d+)\]\s*\'(.*)\'/ ) { 
+			addToOutput("IMPLICIT=$1");
+			nest();
+			addToOutput("PRINTABLESTRING=$2");
+			leaveNest();
+			addToOutput("END");
+		}
+		elsif ( /^\[(\d+)\]/ ) {
+			# general case for implicit & explicit tags
+			my $tag=$1;
+			if (defined @$lines[$i+1] && isRawData(@$lines[$i+1])) {
+				# if there is only raw data assume implicit
+				addToOutput("IMPLICIT=$tag");				
+				nest();
+				addToOutput("OCTETSTRING");
+				nest();
+				addToOutput("RAW \{");
+				while (isRawData(@$lines[++$i])) {
+					addToOutput("" . @$lines[$i] . "");
+				}
+				--$i;
+				addToOutput("\}");
+				leaveNest();
+				addToOutput("END");
+				leaveNest();
+				addToOutput("END");
+				leaveNest();
+			}
+			else {
+				# otherwise assume explicit
+				addToOutput("EXPLICIT=$tag");
+			}
+			nest();
+		}			
+		elsif ( /^(IA5STRING\s+)\'(.*)\'/i ) {
+			addToOutput("IA5STRING=$2");
+		}
+		elsif ( /(^INTEGER\s+)(\d+)*$/i ) {
+			# small integer - non hex incoded
+			addToOutput("INTEGER=$2");
+		}
+		elsif (/^INTEGER/) {
+			# big integer
+			addToOutput("BIGINTEGER {");
+			my $tmp = $_;
+			$tmp =~ s/.*INTEGER\s+//g;
+			nest();
+			if (isRawData($tmp)) {
+				addToOutput($tmp);
+			}
+
+			$i++;
+			addToOutput(getRawHex($lines,\$i));
+			leaveNest();
+			addToOutput("\}");
+		}
+		elsif ( /^NULL/i ) {
+			addToOutput("NULL");
+		}
+		elsif ( /^OCTET STRING\s*$/i ) {
+			$i++;
+			addToOutput("OCTETSTRING");				
+			nest();
+			addToOutput("RAW \{");
+			nest();
+			addToOutput(getRawHex($lines,\$i));
+			leaveNest();
+			addToOutput("\}");
+			leaveNest();
+			addToOutput("END");								
+		}
+		elsif ( /^OCTET\s+STRING.*encapsulates/i ) {
+			addToOutput("OCTETSTRING");
+			nest();			
+		}
+		elsif ( /^OCTET\s+STRING/i ) {
+			addToOutput("OCTETSTRING");
+			nest();			
+			my $hex = $_;
+			$hex =~ s/OCTET\s+STRING\s+//g;
+			addToOutput("RAW=$hex");
+			leaveNest();
+			addToOutput("END");
+		}
+		elsif ( /^OBJECT\s+IDENTIFIER\s+\'([\d ]+)\'/i ) { 
+			# plain oid
+			my $oid = $1;
+			$oid =~ s/ /./g;
+			addToOutput("OID=$oid");
+		}
+		elsif ( /(^OBJECT\s+IDENTIFIER.*\()([\d ]+)/i ) { 
+			# extra information printed with oid
+			my $oid = $2;
+			$oid =~ s/ /./g;
+			addToOutput("OID=$oid");
+		}
+		elsif ( /(^PRINTABLESTRING\s*\')([^\']*)/i ) {
+			addToOutput("PRINTABLESTRING=$2");
+		}
+		elsif ( /^SEQUENCE/i ) {
+			addToOutput("SEQUENCE");
+			nest();
+		}
+		elsif ( /^SET/i ) {
+			addToOutput("SET");
+			nest();
+		}
+		elsif (/^(UTCTIME\s+\')([^\']+)/i) {
+			addToOutput("UTCTIME=$2");
+		}
+		elsif ( /^(UTF8STRING\s+)\'(.*)\'/i ) {
+			addToOutput("UTF8STRING=$2");
+		}
+		elsif ( /^\}/) {				
+			leaveNest();
+			addToOutput("END");
+		}
+		elsif (isRawData($_)) {
+			my $raw = s/\s+/ /g;
+			addToOutput("RAW=$_");
+		}
+
+	}
+}
+
+sub addToOutput($) {
+	my ($text) = @_;
+
+	if ($DEBUG >= 3) {
+		print "+${TABS}$text\n";
+	}
+	$OUTPUT_BUFFER .= "${TABS}$text\n";
+}
+
+sub getRawHex($) {
+	my ($lines,$index) = @_;
+	my $translated = '';
+
+	my $end = 0;
+	do {
+		my $line = $$lines[$$index];
+		last if (!defined $line);
+		chomp($line);
+
+		if (isRawData($line)) {
+			$line =~ s/^\s+//g;
+			addToOutput("$line");
+			$$index++;
+		}
+		else {
+			$$index--;
+			$end = 1;
+		}					
+	} while (! $end);
+	return $translated;
+}
+
+sub isRawData() {
+	my ($line) = @_;
+	my $retVal = ($line =~ /^\s*([A-F0-9][A-F0-9]\s?)+$/i);
+	if ($DEBUG >= 3 && $retVal) {
+		print "RAW: ";
+	}
+	return $retVal;
+}
+
+sub toBitString() {
+	my ($hex) = @_;
+	my $bitStr = "";
+	$hex =~ s/\s//g;
+
+	for (my $i=0; $i < length($hex); $i+=2) {
+		my $num = hex(substr($hex, $i, 2));
+		print ".$num";
+		for (my $j=0; $j < 8; $j++) {
+			$bitStr .= ($num & 0x80) ? '1' : '0';
+			$num <<= 1;
+		}
+	}
+	if ($DEBUG >= 2) {
+		print "\nbitStr: $hex = $bitStr\n";
+	}
+	return $bitStr;
+}
+
+# increment debug tabbing level
+sub nest() {
+	$TABS .= "   ";
+}
+
+# decrement debug tabbing level
+sub leaveNest() {
+	$TABS =~ s/^...//;
+}
+
+
+sub decompile($) {
+	my ($inFile) = @_;
+
+
+	my @command = ("cmd", 
+				   "/C \"dumpasn1 -apruz $inFile > _dump.tmp\"");
+
+	if ((my $err = system(@command)) != 0) {
+		die "decode: " . join(" ", @command) . "\nreturned error $err";
+	}
+
+	my $dumpFh;
+	open $dumpFh, "_dump.tmp";
+	my @lines = <$dumpFh>;
+	close $dumpFh;
+
+	return @lines;
+}