1#!/usr/local/bin/perl
2
3#
4# Test that default EXPLICIT tagging works.
5#
6
7use Convert::ASN1;
8BEGIN { require './t/funcs.pl' }
9
10print "1..25\n";
11
12btest 1, $asn = Convert::ASN1->new(encoding=>'DER',
13                                   tagdefault=>'EXPLICIT') or warn $asn->error;
14
15# Tests from X.690-0207, section 8.14.3
16my $value = "Jones";
17btest 2, $asn->prepare(q(
18     Type1 ::= VisibleString
19     Type2 ::= [APPLICATION 3] IMPLICIT Type1
20     Type3 ::= [2] Type2
21     Type4 ::= [APPLICATION 7] IMPLICIT Type3
22     Type5 ::= [2] IMPLICIT Type2
23)) or warn $asn->error;
24
25# Type 1
26btest 3, $type1 = $asn->find('Type1');
27$result = pack("H*", "1A054A6F6E6573");
28stest 4, $result, $type1->encode($value) or warn $asn->error;
29btest 5, $ret = $type1->decode($result) or warn $asn->error;
30stest 6, $value, $ret;
31
32# Type 2
33btest 7, $type2 = $asn->find('Type2');
34$result = pack("H*", "43054A6F6E6573");
35stest 8, $result, $type2->encode($value) or warn $asn->error;
36btest 9, $ret = $type2->decode($result) or warn $asn->error;
37stest 10, $value, $ret;
38
39# Type 3
40btest 11, $type3 = $asn->find('Type3');
41$result = pack("H*", "A20743054A6F6E6573");
42stest 12, $result, $type3->encode($value) or warn $asn->error;
43btest 13, $ret = $type3->decode($result) or warn $asn->error;
44stest 14, $value, $ret;
45
46# Type 4
47btest 15, $type4 = $asn->find('Type4');
48$result = pack("H*", "670743054A6F6E6573");
49stest 16, $result, $type4->encode($value) or warn $asn->error;
50btest 17, $ret = $type4->decode($result) or warn $asn->error;
51stest 18, $value, $ret;
52
53# Type 5
54btest 19, $type5 = $asn->find('Type5');
55$result = pack("H*", "82054A6F6E6573");
56stest 20, $result, $type5->encode($value) or warn $asn->error;
57btest 21, $ret = $type5->decode($result) or warn $asn->error;
58stest 22, $value, $ret;
59
60# Test EXPLICIT tagging a nested SEQUENCE.
61btest 23, $asn->prepare(q(
62         X  ::= [APPLICATION 10] Y
63         Y  ::= SEQUENCE {
64                v [1] INTEGER,
65                b [4] Z
66         }
67         Z ::= SEQUENCE {
68             n [7] INTEGER,
69             e [8] SEQUENCE OF INTEGER
70         }
71)) or warn $asn->error;
72btest 24, $X = $asn->find('X');
73$value = { v => 5,b => { n => 117, e=>[18,17,16,23] }};
74$result = pack("H*", "6a20301ea103020105a4173015a703020175a80e300c020112020111020110020117");
75stest 25, $result, $X->encode($value) or warn $asn->error;
76