1 |
root |
1.17 |
BEGIN { $| = 1; print "1..459\n"; } |
2 |
root |
1.1 |
|
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 |
root |
1.9 |
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 |
root |
1.1 |
sub roundtrip { |
22 |
|
|
my ($hex, $is, $hex2) = @_; |
23 |
|
|
|
24 |
|
|
$hex2 ||= $hex; |
25 |
|
|
|
26 |
|
|
y/ //d for $hex, $hex2; |
27 |
|
|
|
28 |
root |
1.9 |
fail "$hex,", "trailing garbage"; |
29 |
|
|
|
30 |
|
|
my $bin = pack "H*", $hex; |
31 |
root |
1.1 |
my $bin2 = pack "H*", $hex2; |
32 |
|
|
|
33 |
root |
1.9 |
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 |
root |
1.1 |
ok (&ber_is ($dec, @$is), "decode $hex => @$dec"); |
39 |
root |
1.9 |
|
40 |
root |
1.1 |
my $enc = ber_encode $dec; |
41 |
|
|
ok ($enc eq $bin2, "encode $hex2 == " . unpack "H*", $enc); |
42 |
|
|
|
43 |
root |
1.9 |
ok (($enc eq ber_encode $dec0), "identical recode"); |
44 |
root |
1.1 |
} |
45 |
|
|
|
46 |
root |
1.4 |
# extended tags |
47 |
root |
1.3 |
roundtrip "1f020105", [ASN_UNIVERSAL, ASN_INTEGER, 0, 5], "020105"; |
48 |
root |
1.8 |
|
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 |
root |
1.3 |
|
56 |
root |
1.4 |
# types |
57 |
root |
1.12 |
roundtrip "020100", [ASN_UNIVERSAL, ASN_INTEGER, 0, 0]; |
58 |
root |
1.2 |
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 |
root |
1.1 |
|
65 |
|
|
# 64 bit tests, clunky |
66 |
|
|
if (8 == length pack "j", 0) { |
67 |
root |
1.8 |
roundtrip "0208feffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, -72057594037927937]; |
68 |
root |
1.2 |
roundtrip "020900ffffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 18446744073709551615]; |
69 |
root |
1.8 |
roundtrip "02087fffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 9223372036854775807]; |
70 |
|
|
roundtrip "0209008fffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 10376293541461622783]; |
71 |
root |
1.1 |
} else { |
72 |
root |
1.11 |
ok (1) for 1 .. 6 * 4; |
73 |
root |
1.1 |
} |
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 |
root |
1.10 |
fail "0600", "BER_TYPE_OID length"; |
95 |
root |
1.7 |
roundtrip "0603818055", [ASN_UNIVERSAL, ASN_OID, 0, "2.16389"]; |
96 |
root |
1.16 |
fail "06028001", "invalid BER padding"; |
97 |
root |
1.4 |
# 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 |
root |
1.6 |
roundtrip "06028837", [ASN_UNIVERSAL, ASN_OID, 0, "2.999"]; |
106 |
root |
1.4 |
|
107 |
root |
1.1 |
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 |
root |
1.9 |
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 |
root |
1.13 |
# indefinite |
135 |
root |
1.14 |
fail "02800000", "indefinite BER"; |
136 |
|
|
fail "3080", "unexpected end"; |
137 |
|
|
fail "308000", "unexpected end"; |
138 |
|
|
roundtrip "30800000", [ASN_UNIVERSAL, ASN_SEQUENCE, 1], "3000"; |
139 |
|
|
roundtrip "30800201050000", [ASN_UNIVERSAL, ASN_SEQUENCE, 1], "3003020105"; |
140 |
root |
1.13 |
|
141 |
root |
1.15 |
# real |
142 |
root |
1.16 |
fail "0901", "unexpected end"; |
143 |
|
|
fail "090240", "unexpected end"; |
144 |
|
|
fail "09024044", "invalid encoding"; |
145 |
|
|
roundtrip "0900", [ASN_UNIVERSAL, ASN_REAL, 0, 0]; |
146 |
|
|
roundtrip "09024040", [ASN_UNIVERSAL, ASN_REAL, 0, undef]; # Inf, string form not portable |
147 |
|
|
roundtrip "09024041", [ASN_UNIVERSAL, ASN_REAL, 0, undef]; # Inf, string form not portable |
148 |
|
|
roundtrip "09024042", [ASN_UNIVERSAL, ASN_REAL, 0, undef]; # nan, string form not portable |
149 |
|
|
roundtrip "09024043", [ASN_UNIVERSAL, ASN_REAL, 0, undef]; # -0 printed as 0 in all tested versions |
150 |
|
|
|
151 |
|
|
for ( |
152 |
|
|
0, -0.1, -1.00001, |
153 |
|
|
123456789, -123456789, |
154 |
|
|
1.234, -1.234, |
155 |
|
|
0.123, -0.123, |
156 |
|
|
1/256, -1/256, |
157 |
root |
1.17 |
1e30, -1e30, |
158 |
|
|
8e30, -8e30, |
159 |
root |
1.16 |
1.2e20, -1.2e20, |
160 |
|
|
) { |
161 |
|
|
my $ber = ber_encode [ASN_UNIVERSAL, ASN_REAL, 0, $_]; |
162 |
|
|
my $dec = ber_decode $ber; |
163 |
|
|
ok ($_ == $dec->[BER_DATA], "real $_ == $dec->[BER_DATA]"); |
164 |
|
|
} |
165 |
|
|
|
166 |
|
|
for (qw( |
167 |
|
|
0903acfe05 |
168 |
|
|
0905adfefe0505 |
169 |
|
|
0906aefefefe0505 |
170 |
|
|
0909af0477fefefe050505 |
171 |
|
|
)) { |
172 |
|
|
my $ber = ber_decode pack "H*", $_; |
173 |
|
|
ok ((ber_is $ber, ASN_UNIVERSAL, ASN_REAL, 0), "$_ $ber->[BER_DATA]"); |
174 |
|
|
} |
175 |
root |
1.9 |
|
176 |
root |
1.1 |
|