|
Packit Service |
8c15e4 |
#!/usr/bin/perl
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
#
|
|
Packit |
ef9df4 |
# Test bigint INTEGER encoding/decoding
|
|
Packit |
ef9df4 |
#
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
use Convert::ASN1;
|
|
Packit |
ef9df4 |
BEGIN { require 't/funcs.pl' }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$^W=0 if $] < 5.005; # BigInt in 5.004 has undef issues
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
print "1..67\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest 1, $asn = Convert::ASN1->new or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 2, $asn->prepare(q(
|
|
Packit |
ef9df4 |
integer INTEGER
|
|
Packit |
ef9df4 |
)) or warn $asn->error;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
use Math::BigInt;
|
|
Packit |
ef9df4 |
my $num =
|
|
Packit |
ef9df4 |
Math::BigInt->new("1092509802939879587398450394850984098031948509");
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$asn->configure(decode => { bigint => 'Math::BigInt' });
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x13, 0x30, 0xfd, 0x65, 0xc1, 0x01, 0xd9,
|
|
Packit |
ef9df4 |
0xea, 0x2c, 0x94, 0x9e, 0xc5, 0x08, 0x50, 0x4a,
|
|
Packit |
ef9df4 |
0x90, 0x43, 0xdb, 0x52, 0xdd);
|
|
Packit |
ef9df4 |
stest 3, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 4, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 5, exists $ret->{integer};
|
|
Packit |
ef9df4 |
btest 6, ref($ret->{integer}) eq 'Math::BigInt';
|
|
Packit |
ef9df4 |
ntest 7, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$num = (1<<17) * (1<<17);
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x5, 0x4, 0x0, 0x0, 0x0, 0x0);
|
|
Packit |
ef9df4 |
stest 8, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 9, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 10, exists $ret->{integer};
|
|
Packit |
ef9df4 |
ntest 11, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$num += 10;
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x5, 0x4, 0x0, 0x0, 0x0, 0xa);
|
|
Packit |
ef9df4 |
stest 12, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 13, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 14, exists $ret->{integer};
|
|
Packit |
ef9df4 |
ntest 15, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$num = -$num;
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x5, 0xfb, 0xff, 0xff, 0xff, 0xf6);
|
|
Packit |
ef9df4 |
stest 16, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 17, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 18, exists $ret->{integer};
|
|
Packit |
ef9df4 |
ntest 19, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$num += 10;
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x5, 0xfc, 0x0, 0x0, 0x0, 0x0);
|
|
Packit |
ef9df4 |
stest 20, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 21, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 22, exists $ret->{integer};
|
|
Packit |
ef9df4 |
ntest 23, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$num = Math::BigInt->new("-1092509802939879587398450394850984098031948509");
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x13, 0xcf, 0x2, 0x9a, 0x3e, 0xfe, 0x26,
|
|
Packit |
ef9df4 |
0x15, 0xd3, 0x6b, 0x61, 0x3a, 0xf7, 0xaf, 0xb5,
|
|
Packit |
ef9df4 |
0x6f, 0xbc, 0x24, 0xad, 0x23);
|
|
Packit |
ef9df4 |
stest 24, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 25, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 26, exists $ret->{integer};
|
|
Packit |
ef9df4 |
ntest 27, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
## Test most-significant bit bug in 0.09.
|
|
Packit |
ef9df4 |
$num = Math::BigInt->new("1333280603684579469575805266526464216433260889799");
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x15, 0x00, 0xe9, 0x8a, 0x5e, 0xb8, 0x3a,
|
|
Packit |
ef9df4 |
0xfa, 0x3d, 0x4, 0x13, 0x7d, 0x19, 0xfc, 0x39,
|
|
Packit |
ef9df4 |
0x36, 0xa3, 0x2b, 0xd2, 0x22, 0x06, 0xc7);
|
|
Packit |
ef9df4 |
stest 28, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 29, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 30, exists $ret->{integer};
|
|
Packit |
ef9df4 |
ntest 31, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$num = Math::BigInt->new(-1 * (1<<24)) * Math::BigInt->new(1<<24);
|
|
Packit |
ef9df4 |
$result = pack("C*", 0x2, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
|
|
Packit |
ef9df4 |
stest 32, $result, $asn->encode(integer => $num) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 33, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 34, exists $ret->{integer};
|
|
Packit |
ef9df4 |
ntest 35, $num, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my $test = 36;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %INTEGER = (
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x04, 0x40, 0x00, 0x00, 0x00), 2**30,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00), 2**31,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00), 2**32,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x04, 0xC0, 0x00, 0x00, 0x00), -2**30,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x04, 0x80, 0x00, 0x00, 0x00), -2**31,
|
|
Packit |
ef9df4 |
pack("C*", 0x02, 0x05, 0xFF, 0x00, 0x00, 0x00, 0x00), -2**32,
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %INTEGER) {
|
|
Packit |
ef9df4 |
print "# INTEGER $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare(' integer INTEGER') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(integer => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
ntest $test++, $val, $ret->{integer};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my %BCD = (
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x05, 0x10, 0x73, 0x74, 0x18, 0x24), 2**30,
|
|
Packit |
ef9df4 |
pack("C*", 0x04, 0x00), -2**30,
|
|
Packit |
ef9df4 |
);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
while(($result,$val) = each %BCD) {
|
|
Packit |
ef9df4 |
print "# BCDString $val\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest $test++, $asn->prepare('bcd BCDString') or warn $asn->error;
|
|
Packit |
ef9df4 |
stest $test++, $result, $asn->encode(bcd => $val) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest $test++, $ret = $asn->decode($result) or warn $asn->error;
|
|
Packit |
ef9df4 |
$val =~ s/\D.*//;
|
|
Packit |
ef9df4 |
stest $test++, $val, $ret->{'bcd'};
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
|