|
Packit Service |
8c15e4 |
#!/usr/bin/perl
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
#
|
|
Packit |
ef9df4 |
# Test the use of choices
|
|
Packit |
ef9df4 |
#
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
use Convert::ASN1;
|
|
Packit |
ef9df4 |
BEGIN { require 't/funcs.pl' }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
print "1..10\n";
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest 1, $asn = Convert::ASN1->new;
|
|
Packit |
ef9df4 |
btest 2, $asn->prepare( <<'[TheEnd]' ) or warn $asn->error;
|
|
Packit |
ef9df4 |
Natural ::= CHOICE {
|
|
Packit |
ef9df4 |
prime Prime,
|
|
Packit |
ef9df4 |
product Product
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
Prime ::= [1] INTEGER
|
|
Packit |
ef9df4 |
Product ::= CHOICE {
|
|
Packit |
ef9df4 |
perfect Perfect,
|
|
Packit |
ef9df4 |
plain Plain
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
Perfect ::= [2] INTEGER
|
|
Packit |
ef9df4 |
Plain ::= [3] INTEGER
|
|
Packit |
ef9df4 |
Naturals ::= [4] SEQUENCE OF Natural
|
|
Packit |
ef9df4 |
List ::= [5] SEQUENCE { list Naturals }
|
|
Packit |
ef9df4 |
[TheEnd]
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my $nl = $asn->find( 'List' );
|
|
Packit |
ef9df4 |
my $buf = $nl->encode( list => [
|
|
Packit |
ef9df4 |
{ prime => 13 },
|
|
Packit |
ef9df4 |
{ product => { perfect => 28 } },
|
|
Packit |
ef9df4 |
{ product => { plain => 42 } }, ] );
|
|
Packit |
ef9df4 |
$result = pack( 'C*', 0xa5, 0x0b, 0xa4, 0x09,
|
|
Packit |
ef9df4 |
0x81, 0x01, 0x0d,
|
|
Packit |
ef9df4 |
0x82, 0x01, 0x1c,
|
|
Packit |
ef9df4 |
0x83, 0x01, 0x2a, );
|
|
Packit |
ef9df4 |
stest 3, $result, $buf;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
my $seq = $nl->decode( $buf ) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 4, defined( $seq ) && exists( $seq->{list} );
|
|
Packit |
ef9df4 |
ntest 5, 13, $seq->{list}->[0]->{prime};
|
|
Packit |
ef9df4 |
ntest 6, 28, $seq->{list}->[1]->{product}->{perfect};
|
|
Packit |
ef9df4 |
ntest 7, 42, $seq->{list}->[2]->{product}->{plain};
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
btest 8, $asn->prepare( 'Foo ::= [1] EXPLICIT CHOICE { a NULL }' ) or warn $asn->error;
|
|
Packit |
ef9df4 |
$nl = $asn->find('Foo');
|
|
Packit |
ef9df4 |
$buf = $nl->encode( a => 1 );
|
|
Packit |
ef9df4 |
$result = pack 'C*', map hex, qw(A1 02 05 00);
|
|
Packit |
ef9df4 |
stest 9, $result, $buf;
|
|
Packit |
ef9df4 |
$seq = $nl->decode( $result ) or warn $asn->error;
|
|
Packit |
ef9df4 |
btest 10, $seq->{a};
|