6e91d9 | 2002-12-05 | H. William Welliver III | |
|
a580e1 | 2000-09-27 | Fredrik Hübinette (Hubbe) | | #pike __REAL_VERSION__
|
4e151b | 2008-05-02 | Martin Nilsson | | #pragma strict_types
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
3e031f | 1998-06-13 | Niels Möller | | #if 0
#define WERROR werror
#else
|
fa323d | 2004-02-29 | Martin Nilsson | | #define WERROR(x ...)
|
3e031f | 1998-06-13 | Niels Möller | | #endif
|
1ec5d6 | 1999-03-22 | Niels Möller | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
1ec5d6 | 1999-03-22 | Niels Möller | |
|
53f1e6 | 2014-06-26 | Martin Nilsson | |
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
240d3e | 2014-06-10 | Martin Nilsson | |
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
240d3e | 2014-06-10 | Martin Nilsson | |
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
240d3e | 2014-06-10 | Martin Nilsson | |
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
53f1e6 | 2014-06-26 | Martin Nilsson | |
|
1ec5d6 | 1999-03-22 | Niels Möller | | int make_combined_tag(int cls, int tag)
|
372d65 | 2014-06-09 | Martin Nilsson | | { return tag << 2 | cls; }
|
1ec5d6 | 1999-03-22 | Niels Möller | |
|
240d3e | 2014-06-10 | Martin Nilsson | |
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
53f1e6 | 2014-06-26 | Martin Nilsson | |
|
1ec5d6 | 1999-03-22 | Niels Möller | | int extract_tag(int i) { return i >> 2; }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
240d3e | 2014-06-10 | Martin Nilsson | |
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
53f1e6 | 2014-06-26 | Martin Nilsson | |
|
240d3e | 2014-06-10 | Martin Nilsson | | int(0..3) extract_cls(int i) { return [int(0..3)](i & 3); }
|
1ec5d6 | 1999-03-22 | Niels Möller | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
e6945d | 2014-08-24 | Martin Nilsson | | #define CODEC(X) \
array _encode() { return ({ cls, tag, value }); } \
void _decode(array(X) x) { [ cls, tag, value ] = x; }
|
3980c7 | 2003-01-26 | Martin Nilsson | |
class Object
|
3e031f | 1998-06-13 | Niels Möller | | {
|
39fddc | 2014-06-09 | Martin Nilsson | | int cls = 0;
int tag = 0;
|
3e031f | 1998-06-13 | Niels Möller | | constant constructed = 0;
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | constant type_name = "";
|
775a1d | 2015-03-05 | Martin Nilsson | | protected string(8bit) get_der_content()
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | {
return "";
}
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
3e031f | 1998-06-13 | Niels Möller | | int get_cls() { return cls; }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
3e031f | 1998-06-13 | Niels Möller | | int get_tag() { return tag; }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
int get_combined_tag() {
|
8c9291 | 2014-01-19 | Henrik Grubbström (Grubba) | | return make_combined_tag(get_cls(), get_tag());
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
775a1d | 2015-03-05 | Martin Nilsson | | protected string(0..255) der;
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object) decoder,
mapping(int:program(Object)) types);
|
842b3e | 2014-06-21 | Martin Nilsson | | void begin_decode_constructed(string raw);
void decode_constructed_element(int i, object e);
|
3e031f | 1998-06-13 | Niels Möller | |
|
c485aa | 2003-01-27 | Martin Nilsson | | mapping(int:program(Object)) element_types(int i,
mapping(int:program(Object)) types) {
|
7991f1 | 2008-01-05 | Henrik Grubbström (Grubba) | | return types; i;
|
c485aa | 2003-01-27 | Martin Nilsson | | }
|
7991f1 | 2008-01-05 | Henrik Grubbström (Grubba) | | this_program init(mixed ... args) { return this; args; }
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
240d3e | 2014-06-10 | Martin Nilsson | | protected string(0..255) to_base_128(int n)
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
240d3e | 2014-06-10 | Martin Nilsson | | string(0..255) ret = [string(0..127)]sprintf("%c", n&0x7f);
n >>= 7;
while( n )
|
3e031f | 1998-06-13 | Niels Möller | | {
|
240d3e | 2014-06-10 | Martin Nilsson | | ret = [string(0..255)]sprintf("%c", (n&0x7f) | 0x80) + ret;
|
3980c7 | 2003-01-26 | Martin Nilsson | | n >>= 7;
|
3e031f | 1998-06-13 | Niels Möller | | }
|
240d3e | 2014-06-10 | Martin Nilsson | | return ret;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
240d3e | 2014-06-10 | Martin Nilsson | | protected string(0..255) encode_tag()
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | int tag = get_tag();
int cls = get_cls();
if (tag < 31)
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | return [string(0..255)]sprintf("%c",
(cls << 6) | (constructed << 5) | tag);
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | return [string(0..255)]sprintf("%c%s",
(cls << 6) | (constructed << 5) | 0x1f,
to_base_128(tag) );
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
240d3e | 2014-06-10 | Martin Nilsson | | protected string(0..255) encode_length(int|object len)
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (len < 0x80)
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | return [string(0..255)]sprintf("%c", len);
|
3980c7 | 2003-01-26 | Martin Nilsson | | string s = Gmp.mpz(len)->digits(256);
if (sizeof(s) >= 0x80)
error("Max length exceeded.\n" );
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | return [string(0..255)]sprintf("%c%s", sizeof(s) | 0x80, s);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
240d3e | 2014-06-10 | Martin Nilsson | | protected string(0..255) build_der(string(0..255) contents)
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
string(0..255) data =
encode_tag() + encode_length(sizeof(contents)) + contents;
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("build_der: %O\n", data);
|
3980c7 | 2003-01-26 | Martin Nilsson | | return data;
}
|
3e031f | 1998-06-13 | Niels Möller | |
|
775a1d | 2015-03-05 | Martin Nilsson | |
protected void record_der_contents(string(0..255) s)
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
983ea1 | 2013-12-04 | Martin Nilsson | | der = build_der(s);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | string(0..255) get_der() {
|
775a1d | 2015-03-05 | Martin Nilsson | | return der || (der = build_der(get_der_content()));
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
33dd5f | 2014-02-11 | Henrik Grubbström (Grubba) | | protected void create(mixed ...args) {
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_object[%s]->create\n", type_name);
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (sizeof(args))
init(@args);
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Compound
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Object;
|
3e031f | 1998-06-13 | Niels Möller | |
constant constructed = 1;
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
53f1e6 | 2014-06-26 | Martin Nilsson | |
|
032413 | 2004-01-27 | Martin Nilsson | | array(Object) elements = ({ });
|
3e031f | 1998-06-13 | Niels Möller | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | this_program init(array args) {
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_compound[%s]->init(%O)\n", type_name, args);
|
3980c7 | 2003-01-26 | Martin Nilsson | | foreach(args, mixed o)
if (!objectp(o))
|
6725f5 | 2013-11-22 | Martin Nilsson | | error( "Non-object argument %O\n", o );
|
009d77 | 2004-02-22 | Martin Nilsson | | elements = [array(Object)]args;
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_compound: %O\n", elements);
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
842b3e | 2014-06-21 | Martin Nilsson | | void begin_decode_constructed(string(0..255) raw) {
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_compound[%s]->begin_decode_constructed\n", type_name);
|
3980c7 | 2003-01-26 | Martin Nilsson | | record_der_contents(raw);
}
|
3e031f | 1998-06-13 | Niels Möller | |
|
842b3e | 2014-06-21 | Martin Nilsson | | void decode_constructed_element(int i, object e) {
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_compound[%s]->decode_constructed_element(%O)\n",
type_name, e);
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (i != sizeof(elements))
error("Unexpected index!\n");
elements += ({ e });
}
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
d01fbe | 2013-08-30 | Martin Nilsson | | protected mixed `[](mixed index)
{
if( intp(index) )
return elements[index];
return ::`[]([string]index);
}
protected int _sizeof()
{
return sizeof(elements);
}
|
36261f | 2013-03-01 | Chris Angelico | | protected string _sprintf(int t,mapping(string:int)|void params) {
if (params) ++params->indent; else params=([]);
|
eac0f7 | 2013-11-28 | Martin Nilsson | | return t=='O' && sprintf("%O(%*O)", this_program, params, elements);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
e6945d | 2014-08-24 | Martin Nilsson | | array _encode()
{
return ({ cls, tag, elements });
}
void _decode(array(int|array(Object)) x)
{
[ cls, tag, elements ] = x;
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class String
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Object;
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
3e031f | 1998-06-13 | Niels Möller | | string value;
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
e6945d | 2014-08-24 | Martin Nilsson | | CODEC(string);
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
3e031f | 1998-06-13 | Niels Möller | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program init(string(0..255) s) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | value = s;
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string(0..255) get_der_content() {
return [string(0..255)]value;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | record_der_contents(contents);
value = contents;
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
842b3e | 2014-06-21 | Martin Nilsson | | void begin_decode_constructed(string raw)
{
value = "";
}
void decode_constructed_element(int i, object(this_program) e)
{
value += e->value;
}
|
9eaf1d | 2008-06-28 | Martin Nilsson | | protected string _sprintf(int t) {
|
6725f5 | 2013-11-22 | Martin Nilsson | | return t=='O' && sprintf("%O(%O)", this_program, value);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Boolean
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Object;
|
e6945d | 2014-08-24 | Martin Nilsson | |
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 1;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "BOOLEAN";
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
3e031f | 1998-06-13 | Niels Möller | | int value;
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
e6945d | 2014-08-24 | Martin Nilsson | | CODEC(int);
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | this_program init(int x) {
value = x;
return this;
}
|
3e031f | 1998-06-13 | Niels Möller | |
|
53f1e6 | 2014-06-26 | Martin Nilsson | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string(0..255) get_der_content()
{
return value ? "\377" : "\0";
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | }
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | record_der_contents(contents);
|
b935cc | 2014-06-10 | Martin Nilsson | | if( contents=="" ) error("Illegal boolean value.\n");
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | value = (contents != "\0");
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
9eaf1d | 2008-06-28 | Martin Nilsson | | protected string _sprintf(int t) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | return t=='O' && sprintf("%O(%s)", this_program, (value?"TRUE":"FALSE"));
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Integer
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Object;
|
e6945d | 2014-08-24 | Martin Nilsson | |
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 2;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "INTEGER";
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
Gmp.mpz value;
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
e6945d | 2014-08-24 | Martin Nilsson | | CODEC(Gmp.mpz);
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
3e031f | 1998-06-13 | Niels Möller | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | this_object init(int|object n) {
value = Gmp.mpz(n);
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("i = %s\n", value->digits());
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string(0..255) get_der_content()
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
string(0..255) s;
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (value < 0)
|
3e031f | 1998-06-13 | Niels Möller | | {
|
009d77 | 2004-02-22 | Martin Nilsson | | Gmp.mpz n = [object(Gmp.mpz)](value +
pow(256, ([object(Gmp.mpz)](- value))->
size(256)));
|
3980c7 | 2003-01-26 | Martin Nilsson | | s = n->digits(256);
if (!(s[0] & 0x80))
s = "\377" + s;
} else {
s = value->digits(256);
if (s[0] & 0x80)
s = "\0" + s;
|
3e031f | 1998-06-13 | Niels Möller | | }
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | |
return s;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_object decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | record_der_contents(contents);
value = Gmp.mpz(contents, 256);
if (contents[0] & 0x80)
value -= pow(256, sizeof(contents));
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
9eaf1d | 2008-06-28 | Martin Nilsson | | protected string _sprintf(int t) {
|
26d0c4 | 2014-06-21 | Martin Nilsson | | if(t!='O') return UNDEFINED;
if(!value) return sprintf("%O(0)", this_program);
return sprintf("%O(%d %s)", this_program,
value->size(), value->digits());
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Enumerated
|
47b591 | 1999-02-19 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Integer;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 10;
|
74fdce | 2014-06-21 | Martin Nilsson | | constant type_name = "ENUMERATED";
}
class Real
{
inherit Object;
|
e6945d | 2014-08-24 | Martin Nilsson | |
|
74fdce | 2014-06-21 | Martin Nilsson | | int tag = 9;
constant type_name = "REAL";
float value;
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
e6945d | 2014-08-24 | Martin Nilsson | | CODEC(float);
|
10d6cd | 2014-08-25 | Per Hedbor | |
|
74fdce | 2014-06-21 | Martin Nilsson | |
string(0..255) get_der_content()
{
string v = sprintf("%F", value);
switch(v)
{
case "\0\0\0\0" : return "";
case "\200\0\0\0" : return "\x43";
case "\177\200\0\0" : return "\x40";
case "\377\200\0\0" : return "\x41";
case "\177\300\0\0" :
case "\377\300\0\0" :
return "\x42";
}
error("Encoding Real values not supported.\n");
}
this_object decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
74fdce | 2014-06-21 | Martin Nilsson | | mapping(int:program(Object)):
Object) decoder,
mapping(int:program(Object))|void types) {
if( contents=="" ) { value = 0.0; return this; }
int first = contents[0];
switch( first )
{
case 0b01000000: value = Math.inf; return this;
case 0b01000001: value = -Math.inf; return this;
case 0b01000010: value = Math.nan; return this;
case 0b01000011: value = -0.0; return this;
case 0b00000001: error("ISO 6093 NR1 not supported.\n");
case 0b00000010: error("ISO 6093 NR2 not supported.\n");
case 0b00000011: error("ISO 6093 NR3 not supported.\n");
}
switch( first & 0xc0 )
{
case 0x00:
error("Unknown real coding.\n");
case 0x40:
error("Unknown SpecialRealValues code.\n");
}
int neg = first & 0b01000000;
int base;
switch(first & 0b00110000)
{
case 0b00000000: base = 2; break;
case 0b00010000: base = 8; break;
case 0b00100000: base = 16; break;
default: error("Unknown real base.\n");
}
int scaling = (first & 0b00001100) >> 2;
int exp;
int num;
switch(first & 0b00000011)
{
case 0b00:
sscanf(contents, "%*1c%+1c%+"+(sizeof(contents)-2)+"c", exp, num);
break;
case 0b01:
sscanf(contents, "%*1c%+2c%+"+(sizeof(contents)-3)+"c", exp, num);
break;
case 0b10:
sscanf(contents, "%*1c%+3c%+"+(sizeof(contents)-4)+"c", exp, num);
break;
case 0b11:
int e_size = contents[1];
int n_size = sizeof(contents)-2-e_size;
sscanf(contents, "%*2c%+"+e_size+"c%+"+n_size+"c", exp, num);
break;
}
int mantissa = num * (1<<scaling);
if( neg ) mantissa = -mantissa;
value = mantissa * pow((float)base, exp);
return this;
}
|
778dd2 | 2014-07-15 | Martin Nilsson | | protected string _sprintf(int t)
{
return t=='O' && sprintf("%O(%O)", this_program, value);
}
|
47b591 | 1999-02-19 | Niels Möller | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class BitString
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Object;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 3;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "BIT STRING";
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | string(0..255) value;
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3e031f | 1998-06-13 | Niels Möller | | int unused = 0;
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program init(string(0..255) s)
{
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | value = s;
return this;
}
|
3e031f | 1998-06-13 | Niels Möller | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string(0..255) get_der_content()
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | return [string(0..255)]sprintf("%c%s", unused, value);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
78e418 | 2004-02-22 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program set_from_ascii(string(0..255) s)
{
|
78e418 | 2004-02-22 | Martin Nilsson | | array v = array_sscanf(s, "%8b"*(sizeof(s)/8)+"%b");
v[-1] = v[-1]<<((-sizeof(s))%8);
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | value = (string(0..255))v;
|
78e418 | 2004-02-22 | Martin Nilsson | | set_length(sizeof(s));
return this;
}
|
f02e6f | 2014-04-05 | Martin Nilsson | |
|
74b5f0 | 2014-04-05 | Martin Nilsson | | this_program set_length(int len) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (len)
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | value = value[..(len + 7)/8];
unused = (- len) % 8;
|
f02e6f | 2014-04-05 | Martin Nilsson | | value[-1] &= 256-(1<<unused);
|
3980c7 | 2003-01-26 | Martin Nilsson | | } else {
unused = 0;
value = "";
|
3e031f | 1998-06-13 | Niels Möller | | }
|
74b5f0 | 2014-04-05 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | record_der_contents(contents);
if (!sizeof(contents))
return 0;
unused = contents[0];
if (unused >= 8)
return 0;
|
5a3ed7 | 2015-01-19 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | value = contents[1..];
|
5a3ed7 | 2015-01-19 | Martin Nilsson | |
if (sizeof(value) && unused && value[-1]&(1<<unused)-1)
return 0;
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
842b3e | 2014-06-21 | Martin Nilsson | | void begin_decode_constructed(string raw)
{
unused = 0;
value = "";
}
void decode_constructed_element(int i, object(this_program) e)
{
if( unused ) error("Adding to a non-aligned bit stream.\n");
value += e->value;
unused = e->unused;
|
5a3ed7 | 2015-01-19 | Martin Nilsson | |
if (sizeof(value) && unused && value[-1]&(1<<unused)-1)
error("Non-zero padding bits.\n");
|
842b3e | 2014-06-21 | Martin Nilsson | | }
|
9eaf1d | 2008-06-28 | Martin Nilsson | | protected string _sprintf(int t) {
|
86fa1b | 2014-05-20 | Martin Nilsson | | if(t!='O') return UNDEFINED;
|
26d0c4 | 2014-06-21 | Martin Nilsson | | if(!value) return sprintf("%O(0)", this_program);
int size = sizeof(value)*8-unused;
|
86fa1b | 2014-05-20 | Martin Nilsson | | if(!unused) return sprintf("%O(%d %O)", this_program, size, value);
return sprintf("%O(%d %0"+size+"s)", this_program, size,
([object(Gmp.mpz)](Gmp.mpz(value, 256) >> unused))
->digits(2));
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
e6945d | 2014-08-24 | Martin Nilsson | | array _encode()
{
return ({ cls, tag, value, unused });
}
void _decode(array(int|string(8bit)) x)
{
[ cls, tag, value, unused ] = x;
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class OctetString
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit String;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 4;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "OCTET STRING";
}
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Null
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Object;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 5;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "NULL";
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | record_der_contents(contents);
|
563bd7 | 2004-01-11 | Martin Nilsson | | return !sizeof(contents) && this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
e6945d | 2014-08-24 | Martin Nilsson | | array _encode()
{
return ({ cls, tag });
}
void _decode(array(int) x)
{
[ cls, tag ] = x;
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Identifier
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Object;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 6;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "OBJECT IDENTIFIER";
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
3e031f | 1998-06-13 | Niels Möller | | array(int) id;
|
3980c7 | 2003-01-26 | Martin Nilsson | | this_program init(int ... args) {
if ( (sizeof(args) < 2)
|| (args[0] > 2)
|| (args[1] >= ( (args[0] < 2) ? 40 : 176) ))
error( "Invalid object identifier.\n" );
id = args;
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
86e5af | 2004-02-22 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | this_program append(int ... args) {
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this_program(@id, @args);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string(0..255) get_der_content()
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | return [string(0..255)]sprintf("%s%@s",
to_base_128(40 * id[0] + id[1]),
map(id[2..], to_base_128));
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | record_der_contents(contents);
|
3e031f | 1998-06-13 | Niels Möller | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (contents[0] < 120)
id = ({ contents[0] / 40, contents[0] % 40 });
else
id = ({ 2, contents[0] - 80 });
int index = 1;
while(index < sizeof(contents))
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | int element = 0;
do {
element = element << 7 | (contents[index] & 0x7f);
} while(contents[index++] & 0x80);
id += ({ element });
|
3e031f | 1998-06-13 | Niels Möller | | }
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
3213f9 | 2014-08-25 | Martin Nilsson | | protected mixed cast(string t)
{
switch(t)
{
case "string": return (array(string))id * ".";
case "array" : return id+({});
default: return UNDEFINED;
}
}
|
9eaf1d | 2008-06-28 | Martin Nilsson | | protected string _sprintf(int t) {
|
26d0c4 | 2014-06-21 | Martin Nilsson | | if(t!='O') return UNDEFINED;
if(!id) return sprintf("%O(0)", this_program);
return sprintf("%O(%s)", this_program, (array(string))id*".");
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
e6945d | 2014-08-24 | Martin Nilsson | | array _encode()
{
return ({ cls, tag, id });
}
void _decode(array(int|array(int)) x)
{
if( sizeof(x)!=3 || intp(x[2]) )
id = [array(int)]x;
else
[ cls, tag, id ] = x;
}
|
c0903c | 2014-04-25 | Martin Nilsson | | protected int __hash()
|
0a3877 | 2004-01-26 | H. William Welliver III | | {
return hash(get_der());
}
|
c0903c | 2014-04-25 | Martin Nilsson | | protected int(0..1) `==(mixed other) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | return (objectp(other) &&
|
563bd7 | 2004-01-11 | Martin Nilsson | | (this_program == object_program(other)) &&
|
009d77 | 2004-02-22 | Martin Nilsson | | equal(id, ([object(Identifier)]other)->id));
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
c0903c | 2014-04-25 | Martin Nilsson | |
protected int(0..1) `<(mixed other) {
if( !objectp(other) ||
(this_program != object_program(other)) )
return 0;
array oid = ([object(Identifier)]other)->id;
for( int i; i<min(sizeof(id),sizeof(oid)); i++ )
{
if( id[i] < oid[i] ) return 1;
if( id[i] > oid[i] ) return 0;
}
return sizeof(id) < sizeof(oid);
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
3980c7 | 2003-01-26 | Martin Nilsson | |
int(1..1) asn1_utf8_valid (string s)
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | return 1;
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class UTF8String
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit String;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 12;
|
a6914b | 1999-06-07 | Martin Stjernholm | | constant type_name = "UTF8String";
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string(0..255) get_der_content()
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | return string_to_utf8(value);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
a6914b | 1999-06-07 | Martin Stjernholm | |
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
983ea1 | 2013-12-04 | Martin Nilsson | | der = contents;
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (catch {
value = utf8_to_string(contents);
})
return 0;
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
}
|
a6914b | 1999-06-07 | Martin Stjernholm | |
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Sequence
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Compound;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 16;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "SEQUENCE";
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string(0..255) get_der_content()
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | {
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("ASN1.Sequence: elements = '%O\n", elements);
|
3980c7 | 2003-01-26 | Martin Nilsson | | array(string) a = elements->get_der();
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("ASN1.Sequence: der_encode(elements) = '%O\n", a);
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | return [string(0..255)]`+("", @ a);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | |
|
d74f03 | 2013-12-08 | Henrik Grubbström (Grubba) | | this_program decode_primitive(string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object) decoder,
mapping(int:program(Object)) types) {
|
983ea1 | 2013-12-04 | Martin Nilsson | | der = contents;
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | elements = ({});
|
cb6501 | 2014-10-01 | Martin Nilsson | | Stdio.Buffer data = Stdio.Buffer(contents);
|
e7e02a | 2014-09-14 | Martin Nilsson | | while (sizeof(data)) {
elements += ({ decoder(data, types) });
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | }
return this;
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class Set
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit Compound;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 17;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "SET";
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
ee6060 | 2014-02-20 | Henrik Grubbström (Grubba) | | int(-1..1) compare_octet_strings(string r, string s)
{
if (r == s) return 0;
|
3980c7 | 2003-01-26 | Martin Nilsson | | for(int i = 0;; i++) {
if (i == sizeof(r))
|
ee6060 | 2014-02-20 | Henrik Grubbström (Grubba) | | return (i = sizeof(s)) ? 0 : -1;
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (i == sizeof(s))
return 1;
|
ee6060 | 2014-02-20 | Henrik Grubbström (Grubba) | | if (r[i] < s[i])
|
3980c7 | 2003-01-26 | Martin Nilsson | | return -1;
|
ee6060 | 2014-02-20 | Henrik Grubbström (Grubba) | | else if (r[i] > s[i])
return 1;
|
3e031f | 1998-06-13 | Niels Möller | | }
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string get_der_content() {
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_set->der: elements = '%O\n", elements);
|
3980c7 | 2003-01-26 | Martin Nilsson | | array(string) a = elements->get_der();
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_set->der: der_encode(elements) = '%O\n", a);
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | return [string(0..255)]
`+("", @[array(string)]
Array.sort_array(a, compare_octet_strings));
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
b7bb64 | 2014-06-26 | Martin Nilsson | | protected Regexp asn1_printable_invalid_chars = Regexp("([^-A-Za-z0-9 '()+,./:=?])");
|
a6914b | 1999-06-07 | Martin Stjernholm | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
int(0..1) asn1_printable_valid (string s) {
if (global.String.width(s)!=8) return 0;
return !asn1_printable_invalid_chars->match(s);
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class PrintableString
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit String;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 19;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "PrintableString";
}
|
3980c7 | 2003-01-26 | Martin Nilsson | |
int(0..1) asn1_broken_teletex_valid (string s)
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | return global.String.width(s)==8;
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class BrokenTeletexString
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit String;
|
58aad1 | 2014-08-10 | Henrik Grubbström (Grubba) | | int(0..) tag = 20;
|
a6914b | 1999-06-07 | Martin Stjernholm | | constant type_name = "TeletexString";
}
|
b7bb64 | 2014-06-26 | Martin Nilsson | | protected Regexp asn1_IA5_invalid_chars = Regexp ("([\200-\377])");
|
a6914b | 1999-06-07 | Martin Stjernholm | |
|
3980c7 | 2003-01-26 | Martin Nilsson | |
int(0..1) asn1_IA5_valid (string s)
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (global.String.width(s)!=8) return 0;
|
a6914b | 1999-06-07 | Martin Stjernholm | | return !asn1_printable_invalid_chars->match (s);
|
3e031f | 1998-06-13 | Niels Möller | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class IA5String
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit String;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 22;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "IA5STRING";
}
|
53df71 | 2003-01-26 | Martin Nilsson | |
|
ffbc62 | 2003-01-28 | Martin Nilsson | |
class VisibleString {
inherit String;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 26;
|
ffbc62 | 2003-01-28 | Martin Nilsson | | constant type_name = "VisibleString";
}
|
eb16ad | 2014-05-14 | Henrik Grubbström (Grubba) | |
|
53df71 | 2003-01-26 | Martin Nilsson | |
|
eb16ad | 2014-05-14 | Henrik Grubbström (Grubba) | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class UTC
|
3e031f | 1998-06-13 | Niels Möller | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit String;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 23;
|
3e031f | 1998-06-13 | Niels Möller | | constant type_name = "UTCTime";
|
6725f5 | 2013-11-22 | Martin Nilsson | |
|
b45e9c | 2014-09-29 | Martin Nilsson | | this_program init(int|string|Calendar.ISO_UTC.Second t)
|
ac7d63 | 2014-07-16 | Martin Nilsson | | {
if(intp(t))
set_posix([int]t);
|
b45e9c | 2014-09-29 | Martin Nilsson | | else if(objectp(t))
set_posix([object(Calendar.ISO_UTC.Second)]t);
|
ac7d63 | 2014-07-16 | Martin Nilsson | | else
value = [string]t;
}
|
6725f5 | 2013-11-22 | Martin Nilsson | | this_program set_posix(int t)
{
|
b45e9c | 2014-09-29 | Martin Nilsson | | return set_posix(Calendar.ISO_UTC.Second(t));
}
variant this_program set_posix(Calendar.ISO_UTC.Second second)
{
|
6725f5 | 2013-11-22 | Martin Nilsson | |
|
eb16ad | 2014-05-14 | Henrik Grubbström (Grubba) | |
|
6725f5 | 2013-11-22 | Martin Nilsson | | if (second->year_no() >= 2050)
error( "Times later than 2049 not supported.\n" );
|
eb16ad | 2014-05-14 | Henrik Grubbström (Grubba) | | if (second->year_no() < 1950)
error( "Times earlier than 1950 not supported.\n" );
|
6725f5 | 2013-11-22 | Martin Nilsson | |
value = sprintf("%02d%02d%02d%02d%02d%02dZ",
[int]second->year_no() % 100,
[int]second->month_no(),
[int]second->month_day(),
[int]second->hour_no(),
[int]second->minute_no(),
[int]second->second_no());
return this;
}
|
eb16ad | 2014-05-14 | Henrik Grubbström (Grubba) | |
|
6725f5 | 2013-11-22 | Martin Nilsson | | int get_posix()
{
if( !value || sizeof(value)!=13 ) error("Data not UTC date string.\n");
array t = (array(int))(value[..<1]/2);
if(t[0]>49)
t[0]+=1900;
else
t[0]+=2000;
|
e2f077 | 2014-03-02 | Marcus Comstedt | | return [int]Calendar.ISO_UTC.Second(@t)->unix_time();
|
6725f5 | 2013-11-22 | Martin Nilsson | | }
|
3e031f | 1998-06-13 | Niels Möller | | }
|
11471a | 2014-09-29 | Martin Nilsson | | class GeneralizedTime
{
inherit UTC;
int tag = 24;
constant type_name = "GeneralizedTime";
this_program set_posix(int t)
{
|
b45e9c | 2014-09-29 | Martin Nilsson | | return set_posix(Calendar.ISO_UTC.Second(t));
}
variant this_program set_posix(Calendar.ISO_UTC.Second second)
{
|
11471a | 2014-09-29 | Martin Nilsson | | value = sprintf("%04d%02d%02d%02d%02d%02dZ",
[int]second->year_no(),
[int]second->month_no(),
[int]second->month_day(),
[int]second->hour_no(),
[int]second->minute_no(),
[int]second->second_no());
return this;
}
int get_posix()
{
if( !value || sizeof(value) < 15 )
error("Data not GeneralizedTime date string.\n");
array(int) t = array_sscanf(value, "%4d%2d%2d%2d%2d%2d");
return [int]Calendar.ISO_UTC.Second(@t)->unix_time();
}
}
|
3980c7 | 2003-01-26 | Martin Nilsson | |
int(0..0) asn1_universal_valid (string s)
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
7991f1 | 2008-01-05 | Henrik Grubbström (Grubba) | | return 0; s;
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class UniversalString
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit OctetString;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 28;
|
a6914b | 1999-06-07 | Martin Stjernholm | | constant type_name = "UniversalString";
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string get_der_content() {
|
3980c7 | 2003-01-26 | Martin Nilsson | | error( "Encoding not implemented\n" );
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | this_program decode_primitive (string contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
7991f1 | 2008-01-05 | Henrik Grubbström (Grubba) | | error( "Decoding not implemented\n" ); contents;
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
}
|
3980c7 | 2003-01-26 | Martin Nilsson | |
int(0..1) asn1_bmp_valid (string s)
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | return global.String.width(s)<32;
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class BMPString
|
a6914b | 1999-06-07 | Martin Stjernholm | | {
|
3980c7 | 2003-01-26 | Martin Nilsson | | inherit OctetString;
|
39fddc | 2014-06-09 | Martin Nilsson | | int tag = 30;
|
a6914b | 1999-06-07 | Martin Stjernholm | | constant type_name = "BMPString";
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string get_der_content() {
return string_to_unicode (value);
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | this_program decode_primitive (string(0..255) contents,
|
cb6501 | 2014-10-01 | Martin Nilsson | | function(Stdio.Buffer,
|
12e490 | 2008-04-22 | Henrik Grubbström (Grubba) | | mapping(int:program(Object)):
Object)|void decoder,
mapping(int:program(Object))|void types) {
|
983ea1 | 2013-12-04 | Martin Nilsson | | der = contents;
|
a6914b | 1999-06-07 | Martin Stjernholm | | value = unicode_to_string (contents);
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
a6914b | 1999-06-07 | Martin Stjernholm | | }
}
|
3980c7 | 2003-01-26 | Martin Nilsson | |
|
dd85c0 | 2013-08-16 | Martin Nilsson | |
|
6e91d9 | 2002-12-05 | H. William Welliver III | |
|
dd85c0 | 2013-08-16 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class MetaExplicit
|
3e031f | 1998-06-13 | Niels Möller | | {
int real_tag;
|
1ec5d6 | 1999-03-22 | Niels Möller | | int real_cls;
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
c485aa | 2003-01-27 | Martin Nilsson | | mapping(int:program(Object)) valid_types;
|
3e031f | 1998-06-13 | Niels Möller | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | class `() {
inherit Compound;
constant type_name = "EXPLICIT";
constant constructed = 1;
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | int get_tag() { return real_tag; }
int get_cls() { return real_cls; }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
3980c7 | 2003-01-26 | Martin Nilsson | | Object contents;
|
3e031f | 1998-06-13 | Niels Möller | |
|
8c9291 | 2014-01-19 | Henrik Grubbström (Grubba) | | array(Object) `elements() { return contents ? ({ contents }) : ({}); }
void `elements=(array(Object) args)
{
if (sizeof(args) > 1) error("Invalid number of elements.\n");
contents = sizeof(args) && args[0];
}
int `combined_tag() {
return get_combined_tag();
}
|
3980c7 | 2003-01-26 | Martin Nilsson | | this_program init(Object o) {
contents = o;
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | string get_der_content() {
|
fa323d | 2004-02-29 | Martin Nilsson | | WERROR("asn1_explicit->der: contents = '%O\n", contents);
|
8856fc | 2014-02-21 | Henrik Grubbström (Grubba) | | return contents->get_der();
|
3e031f | 1998-06-13 | Niels Möller | | }
|
3980c7 | 2003-01-26 | Martin Nilsson | |
this_program decode_constructed_element(int i, Object e) {
if (i)
error("Unexpected index!\n");
contents = e;
|
563bd7 | 2004-01-11 | Martin Nilsson | | return this;
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
c485aa | 2003-01-27 | Martin Nilsson | | mapping(int:program(Object)) element_types(int i,
mapping(int:program(Object)) types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | if (i)
error("Unexpected index!\n");
return valid_types || types;
}
|
9eaf1d | 2008-06-28 | Martin Nilsson | | protected string _sprintf(int t) {
|
bc5ae9 | 2014-01-18 | Henrik Grubbström (Grubba) | | if (t != 'O') return UNDEFINED;
if ((real_cls == 2) && (real_tag <= 3)) {
return sprintf("%O.TaggedType%d(%O)",
global::this, real_tag, contents);
}
return sprintf("%O(%s %d %O)", this_program, type_name,
real_tag, contents);
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
e6945d | 2014-08-24 | Martin Nilsson | | array _encode()
{
return ({ real_cls, real_tag, contents });
}
void _decode(array(int|Object) x)
{
[ real_cls, real_tag, contents ] = x;
}
|
3980c7 | 2003-01-26 | Martin Nilsson | | }
|
17e742 | 2003-01-26 | Martin Nilsson | |
|
dd85c0 | 2013-08-16 | Martin Nilsson | |
|
33dd5f | 2014-02-11 | Henrik Grubbström (Grubba) | | protected void create(int cls, int tag,
mapping(int:program(Object))|void types) {
|
3980c7 | 2003-01-26 | Martin Nilsson | | real_cls = cls;
real_tag = tag;
valid_types = types;
}
|
e6945d | 2014-08-24 | Martin Nilsson | |
array _encode()
{
return ({ real_cls, real_tag, valid_types });
}
void _decode(array(int|mapping(int:program(Object))) x)
{
[ real_cls, real_tag, valid_types ] = x;
}
|
3e031f | 1998-06-13 | Niels Möller | | }
|
d9b402 | 1999-08-06 | Fredrik Hübinette (Hubbe) | |
|
bc5ae9 | 2014-01-18 | Henrik Grubbström (Grubba) | |
MetaExplicit TaggedType0 = MetaExplicit(2, 0);
MetaExplicit TaggedType1 = MetaExplicit(2, 1);
MetaExplicit TaggedType2 = MetaExplicit(2, 2);
MetaExplicit TaggedType3 = MetaExplicit(2, 3);
|