dergen.pl
*********
This Perl application recursively parses a set of text files translating the
contents into a DER encoding.  This should now support all of the ASN.1
tags required to create a PKCS#12 file.

Syntax:

* key value format
* one key per line
* tabs + whitespace up to command ignored
* comment is //
* $1 .. $N for textual substitution of args
* escape character is \ 
* case insensitive

Simple types are of the form
SIMPLE_COMMAND=arg1,arg2,arg3

simple types
************
BITSTRING
		Output an DER bit string 
		ARG0=A sequence of 0s and 1s. 
BMPSTRING
		Encodes ascii text as BMPSTRING
		ARG0=ascii text to encode
BMPSTRING_FILE
		Includes a BMPSTRING file as a BMPSTRING element
		ARG0=name of file to include
ENUMERATED
		Encodes and enumerated value
		ARG0=integer value of enum
IA5STRING
		Encodes ascii text as BMPSTRING
		ARG0=ascii text to encode
IA5STRING_FILE
		Includes a IA5STRING file as an IA5STRING element
		ARG0=name of file to include
INCLUDE_BINARY_FILE
		Includes raw binary data from a file
		ARG0=filename to include
INTEGER|INT
		Outputs an integer
		ARG0=Integer in decimal or hex format (leading 0x)
NULL
		A null entry (no args)
OID
		An ASN.1 object identifier
		ARG0=Raw form (1.2.840.113549.1) or one of the defined key words (look in the source)
PRINTABLESTRING
		Encodes ascii text as PRINTABLESTRING
		ARG0=ascii text to encode
UTF8STRING_FILE
		Includes a UTF8STRING file as an UTF8STRING element
		ARG0=name of file to include
RAW
		Allows raw hex to be inserted into the file
		ARG0=AA:BB:CC:DD:EE:FF
UTCTIME
		Encodes a utc time. N.B. no attempt is made to validate the format of the time.
		ARG0=time in ascii
UTF8STRING
		Encodes ascii text as UTF8STRING
		ARG0=ascii text to encode
UTF8STRING_FILE
		Includes a UTF8STRING file as an UTF8STRING element
		ARG0=name of file to include
**********

Compound types are of the form and apply an encoding to the result of
recursively concatenating the embedded types.

COMPOUND_TYPE
		SIMPLE_TYPE
		COMPOUND_TYPE
				SIMPLE_TYPE
		END
		SIMPLE_TYPE
END

compound types
**************
BITSTRING_WRAPPER
		Wraps the nested content inside a BITSTRING
INCLUDE
		Allows nesting of dergen script file. Arguments may also be passed for textual substitution. Refer to arguments as $1 .. $N
		ARG0=filename to include
		ARG1 (optional)=argument to subtitute for $1 in include file
		ARGN (optional)=argument

IMPLICIT			
		Changes the tag of the embedded type according to the tag number and class arguments. 
		The default tag number is 0 and the default class is CONTEXT-SPECIFIC.
		ARG1 (optional)=tag nummber (in hex)
		ARG2 (optional)=class (UNIVERSAL,APPLICATION,CONTEXT-SPECIFIC,PRIVATE)

ENCRYPT
		Encrypts the nested data. (Requires OpenSSL)
		ARG0=cipher (as defined by openssl without the leading hyphen)
		ARG1=key (in hex)
		ARG2=iv (in hex)
EXPLICIT
		Wraps the embedded type with a new tag defined by the tag number and class arguments. 
		The default tag number is 0 and the default class is CONTEXT-SPECIFIC.
		ARG0 (optional)=tag nummber (in hex)
		ARG1 (optional)class (UNIVERSAL,APPLICATION,CONTEXT-SPECIFIC,PRIVATE)
HASH
		Embeds the hash of the nested data. (Requries OpenSSL)
		ARG0=algorithm (as defined by OpenSSL without the leading hyphen)
HMAC
		Embeds a HMAC for the nested data.
		ARG0=algorithm (SHA1|MD5)
		ARG1=key (in kex)
OCTETSTRING
		Wraps the nested content in an OCTETSTRING tag
OUTPUT_BINARY_FILE
		Outputs the nested data in binary form to the named file and optionally includes the nested data in the 
		encoding stream as well. 
		ARG0=The filename to write the data to
		ARG1=Set this to 1 to also include the binary content int he output stream (Optional)
SEQ
		Embeds content in a SEQ tag
SIGN	Creates a PKCS#7 signed data object of the nested data using OpenSSL's SMIME command
		ARG0=signing certificate filename (PEM format)
		ARG1=signing key filename (PEM format)
SET
		Embeds content in a SET tag
SHELL	
		Executes an arbitrary shell command
		ARG0=program to run
		ARG1 (optional)=first argument to shell command
		ARGN (optional)=last largument to shell command

command line arguments
**********************
--in  <filename>		: script file
--out <filename>		: output file
--hex					: output hex instead of binary
--debug					: set the debug level. 0=off,1=parsing information,2=parsing & encoding information,3=everything

other
****
If it doesn't work then then try setting the DEBUG global variable to 1 (or 2
or 3 for more increased verbosity)
