1 |
root |
1.7 |
BEGIN { $| = 1; print "1..114\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 |
|
|
sub roundtrip { |
12 |
|
|
my ($hex, $is, $hex2) = @_; |
13 |
|
|
|
14 |
|
|
$hex2 ||= $hex; |
15 |
|
|
|
16 |
|
|
y/ //d for $hex, $hex2; |
17 |
|
|
|
18 |
|
|
my $bin2 = pack "H*", $hex2; |
19 |
|
|
|
20 |
|
|
my $dec = ber_decode pack "H*", $hex; |
21 |
|
|
ok (&ber_is ($dec, @$is), "decode $hex => @$dec"); |
22 |
|
|
my $enc = ber_encode $dec; |
23 |
|
|
ok ($enc eq $bin2, "encode $hex2 == " . unpack "H*", $enc); |
24 |
|
|
} |
25 |
|
|
|
26 |
|
|
sub fail { |
27 |
|
|
my ($hex, $match) = @_; |
28 |
|
|
|
29 |
|
|
y/ //d for $hex; |
30 |
|
|
|
31 |
|
|
ok (!eval { ber_decode pack "H*", $hex; 1 }, "# fail $hex"); |
32 |
|
|
$@ =~ s/ at .*//s; |
33 |
|
|
ok ($@ =~ $match, "# $@ =~ $match"); |
34 |
|
|
} |
35 |
|
|
|
36 |
root |
1.4 |
# extended tags |
37 |
root |
1.3 |
roundtrip "1f020105", [ASN_UNIVERSAL, ASN_INTEGER, 0, 5], "020105"; |
38 |
|
|
roundtrip "1f80020105", [ASN_UNIVERSAL, ASN_INTEGER, 0, 5], "020105"; |
39 |
|
|
|
40 |
root |
1.4 |
# types |
41 |
root |
1.2 |
roundtrip "020105", [ASN_UNIVERSAL, ASN_INTEGER, 0, 5]; |
42 |
|
|
roundtrip "0201ff", [ASN_UNIVERSAL, ASN_INTEGER, 0, -1]; |
43 |
|
|
roundtrip "020200ff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 255]; |
44 |
|
|
roundtrip "0204ffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, -1], "0201ff"; |
45 |
|
|
roundtrip "020500ffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 4294967295]; |
46 |
|
|
roundtrip "020488776655", [ASN_UNIVERSAL, ASN_INTEGER, 0, -2005440939]; |
47 |
|
|
roundtrip "02050088776655", [ASN_UNIVERSAL, ASN_INTEGER, 0, 2289526357]; |
48 |
root |
1.1 |
|
49 |
|
|
# 64 bit tests, clunky |
50 |
|
|
if (8 == length pack "j", 0) { |
51 |
root |
1.2 |
roundtrip "0208ffffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, -1], "0201ff"; |
52 |
|
|
roundtrip "020900ffffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 18446744073709551615]; |
53 |
|
|
roundtrip "0209007fffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 9223372036854775807], "02087fffffffffffffff"; |
54 |
|
|
roundtrip "0209008fffffffffffffff", [ASN_UNIVERSAL, ASN_INTEGER, 0, 10376293541461622783], "0209008fffffffffffffff"; |
55 |
root |
1.1 |
} else { |
56 |
|
|
ok (1) for 1 .. 2 * 3; |
57 |
|
|
} |
58 |
|
|
|
59 |
|
|
roundtrip "010100", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 0]; |
60 |
|
|
roundtrip "010101", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 1], "0101ff"; |
61 |
|
|
roundtrip "010180", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 1], "0101ff"; |
62 |
|
|
roundtrip "0101ff", [ASN_UNIVERSAL, ASN_BOOLEAN, 0, 1], "0101ff"; |
63 |
|
|
fail "0100" , "BER_TYPE_BOOLEAN value with invalid length"; |
64 |
|
|
fail "01020000", "BER_TYPE_BOOLEAN value with invalid length"; |
65 |
|
|
|
66 |
|
|
roundtrip "0303353637", [ASN_UNIVERSAL, ASN_BIT_STRING, 0, "567"]; |
67 |
|
|
roundtrip "0403353637", [ASN_UNIVERSAL, ASN_OCTET_STRING, 0, "567"]; |
68 |
|
|
roundtrip "0402a0ff", [ASN_UNIVERSAL, ASN_OCTET_STRING, 0, "\xa0\xff"]; |
69 |
|
|
roundtrip "0400", [ASN_UNIVERSAL, ASN_OCTET_STRING, 0, ""]; |
70 |
|
|
fail "040201", "unexpected end of message buffer"; |
71 |
|
|
roundtrip "0500", [ASN_UNIVERSAL, ASN_NULL, 0]; |
72 |
|
|
roundtrip "0500", [ASN_UNIVERSAL, ASN_NULL, 0]; |
73 |
|
|
fail "050101", "BER_TYPE_NULL value with non-zero length"; |
74 |
|
|
|
75 |
|
|
roundtrip "06053305818219", [ASN_UNIVERSAL, ASN_OBJECT_IDENTIFIER, 0, "1.11.5.16665"]; |
76 |
|
|
fail "06053305818299", "unexpected end of message buffer"; |
77 |
|
|
roundtrip "0d053305818219", [ASN_UNIVERSAL, ASN_RELATIVE_OID, 0, "51.5.16665"]; |
78 |
root |
1.5 |
fail "0600", "OBJECT IDENTIFIER length equal to zero", "OBJECT IDENTIFIER length equal to zero"; |
79 |
root |
1.7 |
roundtrip "0603818055", [ASN_UNIVERSAL, ASN_OID, 0, "2.16389"]; |
80 |
|
|
fail "06028001", "illegal BER padding"; |
81 |
root |
1.4 |
# first component |
82 |
|
|
roundtrip "06022777", [ASN_UNIVERSAL, ASN_OID, 0, "0.39.119"]; |
83 |
|
|
roundtrip "06022877", [ASN_UNIVERSAL, ASN_OID, 0, "1.0.119"]; |
84 |
|
|
roundtrip "06024f77", [ASN_UNIVERSAL, ASN_OID, 0, "1.39.119"]; |
85 |
|
|
roundtrip "06025077", [ASN_UNIVERSAL, ASN_OID, 0, "2.0.119"]; |
86 |
|
|
roundtrip "06027777", [ASN_UNIVERSAL, ASN_OID, 0, "2.39.119"]; |
87 |
|
|
roundtrip "06027877", [ASN_UNIVERSAL, ASN_OID, 0, "2.40.119"]; |
88 |
|
|
roundtrip "0603817877", [ASN_UNIVERSAL, ASN_OID, 0, "2.168.119"]; |
89 |
root |
1.6 |
roundtrip "06028837", [ASN_UNIVERSAL, ASN_OID, 0, "2.999"]; |
90 |
root |
1.4 |
|
91 |
root |
1.1 |
roundtrip "0703353739", [ASN_UNIVERSAL, ASN_OBJECT_DESCRIPTOR, 0, "579"]; |
92 |
|
|
roundtrip "0a0177", [ASN_UNIVERSAL, ASN_ENUMERATED, 0, 0x77]; |
93 |
|
|
roundtrip "2b00", [ASN_UNIVERSAL, ASN_EMBEDDED_PDV, 1]; |
94 |
|
|
roundtrip "0c04c2a0c3bf", [ASN_UNIVERSAL, ASN_UTF8_STRING, 0, "\xa0\xff"]; |
95 |
|
|
roundtrip "3000", [ASN_UNIVERSAL, ASN_SEQUENCE, 1]; |
96 |
|
|
roundtrip "3100", [ASN_UNIVERSAL, ASN_SET, 1]; |
97 |
|
|
roundtrip "1603393334", [ASN_UNIVERSAL, ASN_ASCII_STRING, 0, "934"]; |
98 |
|
|
|
99 |
|
|
roundtrip "1c0400000031", [ASN_UNIVERSAL, ASN_UNIVERSAL_STRING, 0, "1"]; |
100 |
|
|
roundtrip "1c0411223344", [ASN_UNIVERSAL, ASN_UNIVERSAL_STRING, 0, chr 0x11223344]; |
101 |
|
|
fail "1c0111", "BER_TYPE_UCS has an invalid number of octets"; |
102 |
|
|
fail "1c021122", "BER_TYPE_UCS has an invalid number of octets"; |
103 |
|
|
fail "1c03112234", "BER_TYPE_UCS has an invalid number of octets"; |
104 |
|
|
|
105 |
|
|
roundtrip "1e0400310037", [ASN_UNIVERSAL, ASN_BMP_STRING, 0, "17"]; |
106 |
|
|
roundtrip "1e0411223344", [ASN_UNIVERSAL, ASN_BMP_STRING, 0, "\x{1122}\x{3344}"]; |
107 |
|
|
fail "1e0111", "BER_TYPE_UCS has an invalid number of octets"; |
108 |
|
|
fail "1e03112234", "BER_TYPE_UCS has an invalid number of octets"; |
109 |
|
|
|
110 |
|
|
# TODO, verify they are all raw octets |
111 |
|
|
# ASN_NUMERIC_STRING = 0x12, |
112 |
|
|
# ASN_PRINTABLE_STRING = 0x13, |
113 |
|
|
# ASN_TELETEX_STRING = 0x14, |
114 |
|
|
# ASN_T61_STRING = 0x14, |
115 |
|
|
# ASN_VIDEOTEX_STRING = 0x15, |
116 |
|
|
# ASN_IA5_STRING = 0x16, |
117 |
|
|
# ASN_UTC_TIME = 0x17, |
118 |
|
|
# ASN_GENERALIZED_TIME = 0x18, |
119 |
|
|
# ASN_GRAPHIC_STRING = 0x19, |
120 |
|
|
# ASN_VISIBLE_STRING = 0x1a, |
121 |
|
|
# ASN_ISO646_STRING = 0x1a, |
122 |
|
|
# ASN_GENERAL_STRING = 0x1b, |
123 |
|
|
# ASN_CHARACTER_STRING = 0x1d, |
124 |
|
|
|