diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 20:52:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 20:52:35 +0000 |
| commit | 46439007cf417cbd9ac8049bb4122c890097a0fa (patch) | |
| tree | 6fdb25e5f3a2b6d5657eb23b35774b631d4d97e4 /module/asn1.m | |
| parent | 37da2899f40661e3e9631e497da8dc59b971cbd0 (diff) | |
20060303-partial
Diffstat (limited to 'module/asn1.m')
| -rw-r--r-- | module/asn1.m | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/module/asn1.m b/module/asn1.m new file mode 100644 index 00000000..3ceb85de --- /dev/null +++ b/module/asn1.m @@ -0,0 +1,101 @@ +ASN1: module { + PATH: con "/dis/lib/asn1.dis"; + + # Tag classes + Universal : con 0; + Application : con 16r40; + Context : con 16r80; + Private : con 16rC0; + + # Universal tags + BOOLEAN : con 1; + INTEGER : con 2; + BIT_STRING : con 3; + OCTET_STRING : con 4; + NULL : con 5; + OBJECT_ID: con 6; + ObjectDescriptor : con 7; + EXTERNAL : con 8; + REAL : con 9; + ENUMERATED : con 10; + EMBEDDED_PDV : con 11; + SEQUENCE : con 16; # also SEQUENCE OF + SET : con 17; # also SET OF + NumericString : con 18; + PrintableString : con 19; + TeletexString : con 20; + VideotexString : con 21; + IA5String : con 22; + UTCTime : con 23; + GeneralizedTime : con 24; + GraphicString : con 25; + VisibleString : con 26; + GeneralString : con 27; + UniversalString : con 28; + BMPString : con 30; + + Elem: adt { + tag: Tag; + val: ref Value; + + is_seq: fn(e: self ref Elem) : (int, list of ref Elem); + is_set: fn(e: self ref Elem) : (int, list of ref Elem); + is_int: fn(e: self ref Elem) : (int, int); + is_bigint: fn(e: self ref Elem) : (int, array of byte); + is_bitstring: fn(e: self ref Elem) : (int, int, array of byte); + is_octetstring: fn(e: self ref Elem) : (int, array of byte); + is_oid: fn(e: self ref Elem) : (int, ref Oid); + is_string: fn(e: self ref Elem) : (int, string); + is_time: fn(e: self ref Elem) : (int, string); + tostring: fn(e: self ref Elem) : string; + }; + + Tag: adt { + class: int; + num: int; + constr: int; # ignored by encode() + + tostring: fn(t: self Tag) : string; + }; + + Value: adt { + pick { + Bool or Int => + v: int; + Octets or BigInt or Real or Other => + # BigInt: integer too big for limbo int + # Real: we don't care to decode these + # since they are hardly ever used + bytes: array of byte; + BitString => + # pack into bytes, with perhaps some + # unused bits in last byte + unusedbits: int; + bits: array of byte; + Null or EOC => + dummy: int; + ObjId => + id: ref Oid; + String => + s: string; + Seq or Set => + l: list of ref Elem; + } + + tostring : fn(v: self ref Value) : string; + }; + + Oid: adt { + nums: array of int; + + tostring: fn(o: self ref Oid) : string; + }; + + init: fn(); + decode: fn(a: array of byte) : (string, ref Elem); + decode_seq: fn(a: array of byte) : (string, list of ref Elem); + decode_value: fn(a: array of byte, kind, constr: int) : (string, ref Value); + encode: fn(e: ref Elem) : (string, array of byte); + oid_lookup: fn(o: ref Oid, tab: array of Oid) : int; + print_elem: fn(e: ref Elem); +}; |
