|
Packit Service |
8c15e4 |
#!/usr/bin/perl
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
#
|
|
Packit |
ef9df4 |
# Test that the primitive operators are working
|
|
Packit |
ef9df4 |
#
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
use Convert::ASN1 qw(:all);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
print "1..186\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
BEGIN { require 't/funcs.pl' }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ntest 1, 129, asn_tag(ASN_CONTEXT, 1);
|
|
Packit |
ef9df4 |
ntest 2, 0x201f, asn_tag(ASN_UNIVERSAL, 32);
|
|
Packit |
ef9df4 |
ntest 3, 0x01825f, asn_tag(ASN_APPLICATION, 257);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
stest 4, pack("C*", 129), asn_encode_tag(129);
|
|
Packit |
ef9df4 |
stest 5, pack("C*", 0x1f,0x20), asn_encode_tag(0x201f);
|
|
Packit |
ef9df4 |
stest 6, pack("C*", 0x5f,0x82,0x01), asn_encode_tag(0x01825f);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ntest 7, 129, asn_decode_tag(asn_encode_tag(asn_tag(ASN_CONTEXT, 1)));
|
|
Packit |
ef9df4 |
ntest 8, 0x201f, asn_decode_tag(asn_encode_tag(asn_tag(ASN_UNIVERSAL, 32)));
|
|
Packit |
ef9df4 |
ntest 9, 0x01825f, asn_decode_tag(asn_encode_tag(asn_tag(ASN_APPLICATION, 257)));
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ntest 10, 1, (asn_decode_tag(asn_encode_tag(asn_tag(ASN_CONTEXT, 1))))[0];
|
|
Packit |
ef9df4 |
ntest 11, 2, (asn_decode_tag(asn_encode_tag(asn_tag(ASN_UNIVERSAL, 32))))[0];
|
|
Packit |
ef9df4 |
ntest 12, 3, (asn_decode_tag(asn_encode_tag(asn_tag(ASN_APPLICATION, 257))))[0];
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
stest 13, pack("C*", 45), asn_encode_length(45);
|
|
Packit |
ef9df4 |
stest 14, pack("C*", 0x81,0x8b), asn_encode_length(139);
|
|
Packit |
ef9df4 |
stest 15, pack("C*", 0x82,0x12,0x34), asn_encode_length(0x1234);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ntest 16, 45, asn_decode_length(asn_encode_length(45));
|
|
Packit |
ef9df4 |
ntest 17, 139, asn_decode_length(asn_encode_length(139));
|
|
Packit |
ef9df4 |
ntest 18, 0x1234, asn_decode_length(asn_encode_length(0x1234));
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ntest 19, 1, (asn_decode_length(asn_encode_length(45)))[0];
|
|
Packit |
ef9df4 |
ntest 20, 2, (asn_decode_length(asn_encode_length(139)))[0];
|
|
Packit |
ef9df4 |
ntest 21, 3, (asn_decode_length(asn_encode_length(0x1234)))[0];
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest 22, $asn = Convert::ASN1->new;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## NULL
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
print "# NULL\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$buf = pack("C*", 0x05, 0x00);
|
|
Packit |
ef9df4 |
btest 23, $asn->prepare(' null NULL ') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest 24, $buf, $asn->encode(null => 1) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 25, $ret = $asn->decode($buf) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 26, $ret->{'null'};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## BOOLEAN
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$test = 27;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
foreach $val (0,1,-99) {
|
|
Packit |
ef9df4 |
print "# BOOLEAN $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my $result = pack("C*", 0x01, 0x01, $val ? 0xFF : 0);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare(' bool BOOLEAN') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(bool => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
ntest $test++, !!$val, !!$ret->{'bool'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## INTEGER (tests 13 - 21)
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %INTEGER = (
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x02, 0x00, 0x80), 128,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x01, 0x80), -128,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x02, 0xff, 0x01), -255,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x01, 0x00), 0,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x03, 0x66, 0x77, 0x99), 0x667799,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x02, 0xFE, 0x37), -457,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x04, 0x40, 0x00, 0x00, 0x00), 2**30,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x04, 0xC0, 0x00, 0x00, 0x00), -2**30,
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %INTEGER) {
|
|
Packit |
ef9df4 |
print "# INTEGER $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare(' integer INTEGER') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(integer => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
ntest $test++, $val, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('test ::= INTEGER ');
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x02, 0x01, 0x09);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(9) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret == 9;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## STRING
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %STRING = (
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x00), "",
|
|
Packit |
ef9df4 |
pack("CCa*", 0x04, 0x08, "A string"), "A string",
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %STRING) {
|
|
Packit |
ef9df4 |
print "# STRING '$val'\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('str STRING') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(str => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $val, $ret->{'str'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## OBJECT_ID
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %OBJECT_ID = (
|
|
Packit |
ef9df4 |
pack("C*", 0x06, 0x04, 0x2A, 0x03, 0x04, 0x05), "1.2.3.4.5",
|
|
Packit |
ef9df4 |
pack("C*", 0x06, 0x03, 0x55, 0x83, 0x49), "2.5.457",
|
|
Packit |
ef9df4 |
pack("C*", 0x06, 0x07, 0x00, 0x11, 0x86, 0x05, 0x01, 0x01, 0x01), "0.0.17.773.1.1.1",
|
|
Packit |
ef9df4 |
pack("C*", 0x06, 0x04, 0x86, 0x8D, 0x6F, 0x63), "2.99999.99",
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %OBJECT_ID) {
|
|
Packit |
ef9df4 |
print "# OBJECT_ID $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('oid OBJECT IDENTIFIER') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(oid => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $val, $ret->{'oid'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## ENUM
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %ENUM = (
|
|
Packit |
ef9df4 |
pack("C*", 0x0A, 0x01, 0x00), 0,
|
|
Packit |
ef9df4 |
pack("C*", 0x0A, 0x01, 0x9D), -99,
|
|
Packit |
ef9df4 |
pack("C*", 0x0A, 0x03, 0x64, 0x4D, 0x90), 6573456,
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %ENUM) {
|
|
Packit |
ef9df4 |
print "# ENUM $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('enum ENUMERATED') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(enum => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
ntest $test++, $val, $ret->{'enum'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## BIT STRING
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %BSTR = (
|
|
Packit |
ef9df4 |
pack("C*", 0x03, 0x02, 0x07, 0x00),
|
|
Packit |
ef9df4 |
[pack("B*",'0'), 1, pack("B*",'0')],
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
pack("C*", 0x03, 0x02, 0x00, 0x33),
|
|
Packit |
ef9df4 |
pack("B*",'00110011'),
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
pack("C*", 0x03, 0x04, 0x03, 0x6E, 0x5D, 0xC0),
|
|
Packit |
ef9df4 |
[pack("B*",'011011100101110111'), 21, pack("B*",'011011100101110111')],
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
pack("C*", 0x03, 0x02, 0x01, 0x6E),
|
|
Packit |
ef9df4 |
[pack("B*",'011011111101110111'), 7, pack("B*", '01101110')]
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %BSTR) {
|
|
Packit |
ef9df4 |
print "# BIT STRING ", unpack("B*", ref($val) ? $val->[0] : $val),
|
|
Packit |
ef9df4 |
" ",(ref($val) ? $val->[1] : $val),"\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('bit BIT STRING') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode( bit => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, (ref($val) ? $val->[2] : $val), $ret->{'bit'}[0];
|
|
Packit |
ef9df4 |
ntest $test++, (ref($val) ? $val->[1] : 8*length$val), $ret->{'bit'}[1];
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## REAL
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
use POSIX qw(HUGE_VAL);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %REAL = (
|
|
Packit |
ef9df4 |
pack("C*", 0x09, 0x00), 0,
|
|
Packit |
ef9df4 |
pack("C*", 0x09, 0x03, 0x80, 0xf9, 0xc0), 1.5,
|
|
Packit |
ef9df4 |
pack("C*", 0x09, 0x03, 0xc0, 0xfb, 0xb0), -5.5,
|
|
Packit |
ef9df4 |
pack("C*", 0x09, 0x01, 0x40), HUGE_VAL(),
|
|
Packit |
ef9df4 |
pack("C*", 0x09, 0x01, 0x41), - HUGE_VAL(),
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %REAL) {
|
|
Packit |
ef9df4 |
print "# REAL $val\n";
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('real REAL') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode( real => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
ntest $test++, $val, $ret->{'real'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## RELATIVE-OID
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %ROID = (
|
|
Packit |
ef9df4 |
pack("C*", 0x0D, 0x05, 0x01, 0x02, 0x03, 0x04, 0x05), "1.2.3.4.5",
|
|
Packit |
ef9df4 |
pack("C*", 0x0D, 0x04, 0x02, 0x05, 0x83, 0x49), "2.5.457",
|
|
Packit |
ef9df4 |
pack("C*", 0x0D, 0x08, 0x00, 0x00, 0x11, 0x86, 0x05, 0x01, 0x01, 0x01), "0.0.17.773.1.1.1",
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %ROID) {
|
|
Packit |
ef9df4 |
print "# RELATIVE-OID $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('roid RELATIVE-OID') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(roid => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $val, $ret->{'roid'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
## BCDString
|
|
Packit |
ef9df4 |
##
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %BCD = (
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x09, 0x12, 0x34, 0x56, 0x78, 0x91, 0x23, 0x45, 0x67, 0x89), "123456789123456789",
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x04, 0x12, 0x34, 0x56, 0x78), 12345678,
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x02, 0x56, 0x4f), 564,
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x00), "",
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x00), -1,
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x01, 0x0f), 0,
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x01, 0x2f), 2.2,
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %BCD) {
|
|
Packit |
ef9df4 |
print "# BCDString $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('bcd BCDString') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(bcd => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
$val =~ s/\D.*//;
|
|
Packit |
ef9df4 |
stest $test++, $val, $ret->{'bcd'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|