| 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 |
|