#!/usr/bin/perl
#
# Test that the primitive operators are working
#
BEGIN { require 't/funcs.pl' }
use Convert::ASN1;
print "1..35\n";
btest 1, $asn = Convert::ASN1->new or warn $asn->error;
btest 2, $asn->prepare(' ints SEQUENCE OF INTEGER ') or warn $asn->error;
$result = pack("C*", 0x30, 0x0C, 0x02, 0x01, 0x09, 0x02, 0x01, 0x05,
0x02, 0x01, 0x03, 0x02, 0x01, 0x01);
stest 3, $result, $asn->encode(ints => [9,5,3,1]) or warn $asn->error;
btest 4, $ret = $asn->decode($result) or warn $asn->error;
btest 5, exists $ret->{'ints'};
stest 6, "9:5:3:1", join(":", @{$ret->{'ints'}});
##
##
##
$result = pack("C*",
0x30, 0x25,
0x30, 0x11,
0x04, 0x04, ord('f'), ord('r'), ord('e'), ord('d'),
0x30, 0x09,
0x04, 0x01, ord('a'),
0x04, 0x01, ord('b'),
0x04, 0x01, ord('c'),
0x30, 0x10,
0x04, 0x03, ord('j'), ord('o'), ord('e'),
0x30, 0x09,
0x04, 0x01, ord('q'),
0x04, 0x01, ord('w'),
0x04, 0x01, ord('e'),
);
btest 7, $asn->prepare(' seq SEQUENCE OF SEQUENCE { str STRING, val SEQUENCE OF STRING } ')
or warn $asn->error;
stest 8, $result, $asn->encode(
seq => [
{ str => 'fred', val => [qw(a b c)] },
{ str => 'joe', val => [qw(q w e)] }
]) or warn $asn->error;
btest 9, $ret = $asn->decode($result) or warn $asn->error;
ntest 10, 1, scalar keys %$ret;
btest 11, exists $ret->{'seq'};
ntest 12, 2, scalar @{$ret->{'seq'}};
stest 13, 'fred', $ret->{'seq'}[0]{'str'};
stest 14, 'joe', $ret->{'seq'}[1]{'str'};
stest 15, "a:b:c", join(":", @{$ret->{'seq'}[0]{'val'}});
stest 16, "q:w:e", join(":", @{$ret->{'seq'}[1]{'val'}});
btest 17, $asn = Convert::ASN1->new or warn $asn->error;
btest 18, $asn->prepare(<<'EOS') or warn $asn->error;
AttributeTypeAndValue ::= SEQUENCE {
type STRING,
value STRING }
RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
Name ::= CHOICE { -- only one possibility for now --
rdnSequence RDNSequence }
Issuer ::= SEQUENCE { issuer Name }
EOS
btest 19, $asn = $asn->find('Issuer') or warn $asn->error;
$result = pack("C*",
0x30, 0x26, 0x30, 0x24, 0x31, 0x10, 0x30, 0x06,
0x04, 0x01, 0x31, 0x04, 0x01, 0x61, 0x30, 0x06,
0x04, 0x01, 0x32, 0x04, 0x01, 0x62, 0x31, 0x10,
0x30, 0x06, 0x04, 0x01, 0x33, 0x04, 0x01, 0x63,
0x30, 0x06, 0x04, 0x01, 0x34, 0x04, 0x01, 0x64
);
stest 20, $result, $asn->encode(
issuer => {
rdnSequence => [
[{ type => "1", value => "a" }, { type => "2", value => "b" }],
[{ type => "3", value => "c" }, { type => "4", value => "d" }],
]
}
) or warn $asn->error;
btest 21, $ret = $asn->decode($result) or warn $asn->error;
ntest 22, 1, $ret->{issuer}{rdnSequence}[0][0]{type};
ntest 23, 2, $ret->{issuer}{rdnSequence}[0][1]{type};
ntest 24, 3, $ret->{issuer}{rdnSequence}[1][0]{type};
ntest 25, 4, $ret->{issuer}{rdnSequence}[1][1]{type};
stest 26, 'a', $ret->{issuer}{rdnSequence}[0][0]{value};
stest 27, 'b', $ret->{issuer}{rdnSequence}[0][1]{value};
stest 28, 'c', $ret->{issuer}{rdnSequence}[1][0]{value};
stest 29, 'd', $ret->{issuer}{rdnSequence}[1][1]{value};
btest 30, $asn = Convert::ASN1->new or warn $asn->error;
btest 31, $asn->prepare('test ::= SEQUENCE OF INTEGER ') or warn $asn->error;
$result = pack("C*", 0x30, 0x0C, 0x02, 0x01, 0x09, 0x02, 0x01, 0x05,
0x02, 0x01, 0x03, 0x02, 0x01, 0x01);
stest 32, $result, $asn->encode([9,5,3,1]) or warn $asn->error;
btest 33, $ret = $asn->decode($result) or warn $asn->error;
btest 34, ref($ret) eq 'ARRAY';
stest 35, "9:5:3:1", join(":", @{$ret});