1#!/usr/local/bin/perl 2 3# 4# Test bigint INTEGER encoding/decoding 5# 6 7use Convert::ASN1; 8BEGIN { require './t/funcs.pl' } 9 10$^W=0 if $] < 5.005; # BigInt in 5.004 has undef issues 11 12print "1..67\n"; 13 14btest 1, $asn = Convert::ASN1->new or warn $asn->error; 15btest 2, $asn->prepare(q( 16 integer INTEGER 17)) or warn $asn->error; 18 19use Math::BigInt; 20my $num = 21Math::BigInt->new("1092509802939879587398450394850984098031948509"); 22 23$asn->configure(decode => { bigint => 'Math::BigInt' }); 24 25$result = pack("C*", 0x2, 0x13, 0x30, 0xfd, 0x65, 0xc1, 0x01, 0xd9, 26 0xea, 0x2c, 0x94, 0x9e, 0xc5, 0x08, 0x50, 0x4a, 27 0x90, 0x43, 0xdb, 0x52, 0xdd); 28stest 3, $result, $asn->encode(integer => $num) or warn $asn->error; 29btest 4, $ret = $asn->decode($result) or warn $asn->error; 30btest 5, exists $ret->{integer}; 31btest 6, ref($ret->{integer}) eq 'Math::BigInt'; 32ntest 7, $num, $ret->{integer}; 33 34$num = (1<<17) * (1<<17); 35$result = pack("C*", 0x2, 0x5, 0x4, 0x0, 0x0, 0x0, 0x0); 36stest 8, $result, $asn->encode(integer => $num) or warn $asn->error; 37btest 9, $ret = $asn->decode($result) or warn $asn->error; 38btest 10, exists $ret->{integer}; 39ntest 11, $num, $ret->{integer}; 40 41$num += 10; 42$result = pack("C*", 0x2, 0x5, 0x4, 0x0, 0x0, 0x0, 0xa); 43stest 12, $result, $asn->encode(integer => $num) or warn $asn->error; 44btest 13, $ret = $asn->decode($result) or warn $asn->error; 45btest 14, exists $ret->{integer}; 46ntest 15, $num, $ret->{integer}; 47 48$num = -$num; 49$result = pack("C*", 0x2, 0x5, 0xfb, 0xff, 0xff, 0xff, 0xf6); 50stest 16, $result, $asn->encode(integer => $num) or warn $asn->error; 51btest 17, $ret = $asn->decode($result) or warn $asn->error; 52btest 18, exists $ret->{integer}; 53ntest 19, $num, $ret->{integer}; 54 55$num += 10; 56$result = pack("C*", 0x2, 0x5, 0xfc, 0x0, 0x0, 0x0, 0x0); 57stest 20, $result, $asn->encode(integer => $num) or warn $asn->error; 58btest 21, $ret = $asn->decode($result) or warn $asn->error; 59btest 22, exists $ret->{integer}; 60ntest 23, $num, $ret->{integer}; 61 62$num = Math::BigInt->new("-1092509802939879587398450394850984098031948509"); 63$result = pack("C*", 0x2, 0x13, 0xcf, 0x2, 0x9a, 0x3e, 0xfe, 0x26, 64 0x15, 0xd3, 0x6b, 0x61, 0x3a, 0xf7, 0xaf, 0xb5, 65 0x6f, 0xbc, 0x24, 0xad, 0x23); 66stest 24, $result, $asn->encode(integer => $num) or warn $asn->error; 67btest 25, $ret = $asn->decode($result) or warn $asn->error; 68btest 26, exists $ret->{integer}; 69ntest 27, $num, $ret->{integer}; 70 71 72## Test most-significant bit bug in 0.09. 73$num = Math::BigInt->new("1333280603684579469575805266526464216433260889799"); 74$result = pack("C*", 0x2, 0x15, 0x00, 0xe9, 0x8a, 0x5e, 0xb8, 0x3a, 75 0xfa, 0x3d, 0x4, 0x13, 0x7d, 0x19, 0xfc, 0x39, 76 0x36, 0xa3, 0x2b, 0xd2, 0x22, 0x06, 0xc7); 77stest 28, $result, $asn->encode(integer => $num) or warn $asn->error; 78btest 29, $ret = $asn->decode($result) or warn $asn->error; 79btest 30, exists $ret->{integer}; 80ntest 31, $num, $ret->{integer}; 81 82$num = Math::BigInt->new(-1 * (1<<24)) * Math::BigInt->new(1<<24); 83$result = pack("C*", 0x2, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); 84stest 32, $result, $asn->encode(integer => $num) or warn $asn->error; 85btest 33, $ret = $asn->decode($result) or warn $asn->error; 86btest 34, exists $ret->{integer}; 87ntest 35, $num, $ret->{integer}; 88 89my $test = 36; 90 91my %INTEGER = ( 92 pack("C*", 0x02, 0x04, 0x40, 0x00, 0x00, 0x00), 2**30, 93 pack("C*", 0x02, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00), 2**31, 94 pack("C*", 0x02, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00), 2**32, 95 pack("C*", 0x02, 0x04, 0xC0, 0x00, 0x00, 0x00), -2**30, 96 pack("C*", 0x02, 0x04, 0x80, 0x00, 0x00, 0x00), -2**31, 97 pack("C*", 0x02, 0x05, 0xFF, 0x00, 0x00, 0x00, 0x00), -2**32, 98); 99 100while(($result,$val) = each %INTEGER) { 101 print "# INTEGER $val\n"; 102 103 btest $test++, $asn->prepare(' integer INTEGER') or warn $asn->error; 104 stest $test++, $result, $asn->encode(integer => $val) or warn $asn->error; 105 btest $test++, $ret = $asn->decode($result) or warn $asn->error; 106 ntest $test++, $val, $ret->{integer}; 107 108} 109 110my %BCD = ( 111 pack("C*", 0x04, 0x05, 0x10, 0x73, 0x74, 0x18, 0x24), 2**30, 112 pack("C*", 0x04, 0x00), -2**30, 113); 114 115while(($result,$val) = each %BCD) { 116 print "# BCDString $val\n"; 117 118 btest $test++, $asn->prepare('bcd BCDString') or warn $asn->error; 119 stest $test++, $result, $asn->encode(bcd => $val) or warn $asn->error; 120 btest $test++, $ret = $asn->decode($result) or warn $asn->error; 121 $val =~ s/\D.*//; 122 stest $test++, $val, $ret->{'bcd'}; 123} 124 125