1 |
BEGIN { $| = 1; print "1..384\n"; } |
2 |
|
3 |
use common::sense; |
4 |
use Convert::BER::XS ':all'; |
5 |
|
6 |
our $test; |
7 |
sub ok($;$) { |
8 |
print $_[0] ? "" : "not ", "ok ", ++$test, " # $_[1]\n"; |
9 |
} |
10 |
|
11 |
sub fail { |
12 |
my ($hex, $match) = @_; |
13 |
|
14 |
y/ //d for $hex; |
15 |
|
16 |
ok (!eval { ber_decode pack "H*", $hex; 1 }, "# fail $hex"); |
17 |
$@ =~ s/ at .*//s; |
18 |
ok ($@ =~ $match, "# $@ =~ $match"); |
19 |
} |
20 |
|
21 |
sub roundtrip { |
22 |
my ($hex, $is, $hex2) = @_; |
23 |
|
24 |
$hex2 ||= $hex; |
25 |
|
26 |
y/ //d for $hex, $hex2; |
27 |
|
28 |
fail "$hex,", "trailing garbage"; |
29 |
|
30 |
my $bin = pack "H*", $hex; |
31 |
my $bin2 = pack "H*", $hex2; |
32 |
|
33 |
my ($dec0, $len) = ber_decode_prefix $bin . chr rand 256; |
34 |
|
35 |
ok ($len == length $bin, "prefix length $len"); |
36 |
|
37 |
my $dec = ber_decode $bin; |
38 |
ok (&ber_is ($dec, @$is), "decode $hex => @$dec"); |
39 |
|
40 |
my $enc = ber_encode $dec; |
41 |
ok ($enc eq $bin2, "encode $hex2 == " . unpack "H*", $enc); |
42 |
|
43 |
ok (($enc eq ber_encode $dec0), "identical recode"); |
44 |
} |
45 |
|
46 |
# extended tags |
47 |
roundtrip "1f020105", [ASN_UNIVERSAL, ASN_INTEGER, 0, 5], "020105"; |
48 |
|
49 |
# padding |
50 |
roundtrip "020100", [ASN_UNIVERSAL, ASN_INTEGER, 0, 0]; |
51 |
roundtrip "0201ff", [ASN_UNIVERSAL, ASN_INTEGER, 0, -1]; |
52 |
fail "0202ffff", "X.690 8.3.2"; |
53 |
fail "02020001", "X.690 8.3.2"; |
54 |
fail "0208ffffffffffffffff", "X.690 8.3.2"; |
55 |
|
56 |
# types |
57 |
roundtrip "020100", [ASN_UNIVERSAL, ASN_INTEGER, 0, 0]; |
58 |
roundtrip "020105", [ASN_UNIVERSAL, ASN_INTEGER, 0, 5]; |
59 |
roundtrip "0201ff", [ASN_UNIVERSAL, ASN_INTEGER, 0, -1]; |
60 |
roundtrip "020200ff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 255]; |
61 |
roundtrip "020500ffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 4294967295]; |
62 |
roundtrip "020488776655", [ASN_UNIVERSAL, ASN_INTEGER, 0, -2005440939]; |
63 |
roundtrip "02050088776655", [ASN_UNIVERSAL, ASN_INTEGER, 0, 2289526357]; |
64 |
|
65 |
# 64 bit tests, clunky |
66 |
if (8 == length pack "j", 0) { |
67 |
roundtrip "0208feffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, -72057594037927937]; |
68 |
roundtrip "020900ffffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 18446744073709551615]; |
69 |
roundtrip "02087fffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 9223372036854775807]; |
70 |
roundtrip "0209008fffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 10376293541461622783]; |
71 |
} else { |
72 |
ok (1) for 1 .. 6 * 4; |
73 |
} |
74 |
|
75 |
roundtrip "010100", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 0]; |
76 |
roundtrip "010101", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 1], "0101ff"; |
77 |
roundtrip "010180", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 1], "0101ff"; |
78 |
roundtrip "0101ff", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 1], "0101ff"; |
79 |
fail "0100" , "BER_TYPE_BOOLEAN value with invalid length"; |
80 |
fail "01020000", "BER_TYPE_BOOLEAN value with invalid length"; |
81 |
|
82 |
roundtrip "0303353637", [ASN_UNIVERSAL, ASN_BIT_STRING, 0, "567"]; |
83 |
roundtrip "0403353637", [ASN_UNIVERSAL, ASN_OCTET_STRING, 0, "567"]; |
84 |
roundtrip "0402a0ff", [ASN_UNIVERSAL, ASN_OCTET_STRING, 0, "\xa0\xff"]; |
85 |
roundtrip "0400", [ASN_UNIVERSAL, ASN_OCTET_STRING, 0, ""]; |
86 |
fail "040201", "unexpected end of message buffer"; |
87 |
roundtrip "0500", [ASN_UNIVERSAL, ASN_NULL, 0]; |
88 |
roundtrip "0500", [ASN_UNIVERSAL, ASN_NULL, 0]; |
89 |
fail "050101", "BER_TYPE_NULL value with non-zero length"; |
90 |
|
91 |
roundtrip "06053305818219", [ASN_UNIVERSAL, ASN_OBJECT_IDENTIFIER, 0, "1.11.5.16665"]; |
92 |
fail "06053305818299", "unexpected end of message buffer"; |
93 |
roundtrip "0d053305818219", [ASN_UNIVERSAL, ASN_RELATIVE_OID, 0, "51.5.16665"]; |
94 |
fail "0600", "BER_TYPE_OID length"; |
95 |
roundtrip "0603818055", [ASN_UNIVERSAL, ASN_OID, 0, "2.16389"]; |
96 |
fail "06028001", "illegal BER padding"; |
97 |
# first component |
98 |
roundtrip "06022777", [ASN_UNIVERSAL, ASN_OID, 0, "0.39.119"]; |
99 |
roundtrip "06022877", [ASN_UNIVERSAL, ASN_OID, 0, "1.0.119"]; |
100 |
roundtrip "06024f77", [ASN_UNIVERSAL, ASN_OID, 0, "1.39.119"]; |
101 |
roundtrip "06025077", [ASN_UNIVERSAL, ASN_OID, 0, "2.0.119"]; |
102 |
roundtrip "06027777", [ASN_UNIVERSAL, ASN_OID, 0, "2.39.119"]; |
103 |
roundtrip "06027877", [ASN_UNIVERSAL, ASN_OID, 0, "2.40.119"]; |
104 |
roundtrip "0603817877", [ASN_UNIVERSAL, ASN_OID, 0, "2.168.119"]; |
105 |
roundtrip "06028837", [ASN_UNIVERSAL, ASN_OID, 0, "2.999"]; |
106 |
|
107 |
roundtrip "0703353739", [ASN_UNIVERSAL, ASN_OBJECT_DESCRIPTOR, 0, "579"]; |
108 |
roundtrip "0a0177", [ASN_UNIVERSAL, ASN_ENUMERATED, 0, 0x77]; |
109 |
roundtrip "2b00", [ASN_UNIVERSAL, ASN_EMBEDDED_PDV, 1]; |
110 |
roundtrip "0c04c2a0c3bf", [ASN_UNIVERSAL, ASN_UTF8_STRING, 0, "\xa0\xff"]; |
111 |
roundtrip "3000", [ASN_UNIVERSAL, ASN_SEQUENCE, 1]; |
112 |
roundtrip "3100", [ASN_UNIVERSAL, ASN_SET, 1]; |
113 |
roundtrip "1603393334", [ASN_UNIVERSAL, ASN_ASCII_STRING, 0, "934"]; |
114 |
|
115 |
roundtrip "1c0400000031", [ASN_UNIVERSAL, ASN_UNIVERSAL_STRING, 0, "1"]; |
116 |
roundtrip "1c0411223344", [ASN_UNIVERSAL, ASN_UNIVERSAL_STRING, 0, chr 0x11223344]; |
117 |
fail "1c0111", "BER_TYPE_UCS has an invalid number of octets"; |
118 |
fail "1c021122", "BER_TYPE_UCS has an invalid number of octets"; |
119 |
fail "1c03112234", "BER_TYPE_UCS has an invalid number of octets"; |
120 |
|
121 |
roundtrip "1e0400310037", [ASN_UNIVERSAL, ASN_BMP_STRING, 0, "17"]; |
122 |
roundtrip "1e0411223344", [ASN_UNIVERSAL, ASN_BMP_STRING, 0, "\x{1122}\x{3344}"]; |
123 |
fail "1e0111", "BER_TYPE_UCS has an invalid number of octets"; |
124 |
fail "1e03112234", "BER_TYPE_UCS has an invalid number of octets"; |
125 |
|
126 |
for my $type ( |
127 |
ASN_NUMERIC_STRING, ASN_PRINTABLE_STRING, ASN_TELETEX_STRING, ASN_T61_STRING, ASN_VIDEOTEX_STRING, |
128 |
ASN_IA5_STRING, ASN_UTC_TIME, ASN_GENERALIZED_TIME, ASN_GRAPHIC_STRING, ASN_VISIBLE_STRING, |
129 |
ASN_ISO646_STRING, ASN_GENERAL_STRING, ASN_CHARACTER_STRING |
130 |
) { |
131 |
roundtrip +(unpack "H*", pack "C C/a", $type, "234"), [ASN_UNIVERSAL, $type, 0, "234"]; |
132 |
} |
133 |
|
134 |
# indefinite |
135 |
#roundtrip " |
136 |
|
137 |
|
138 |
|