ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-BER-XS/t/02_simple.t
Revision: 1.16
Committed: Thu Apr 25 22:30:21 2019 UTC (5 years, 1 month ago) by root
Content type: application/x-troff
Branch: MAIN
CVS Tags: rel-1_2
Changes since 1.15: +35 -3 lines
Log Message:
1.2

File Contents

# User Rev Content
1 root 1.16 BEGIN { $| = 1; print "1..463\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     1e30, 1e-30, -1e30, -1e-30,
158     8e30, -8e30, 5e-30, -5e-30,
159     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