Encoding::BER::DER

DER表記されたASN.1オブジェクトをエンコード/デコードする。
Math::BigIntがインストール済みであれば、多バイト長整数のエンコード/デコードも可能。

use Encoding::BER::DER;
パッケージをロードする。

使い方:
my $coder = Encoding::BER::DER->new( );
// エンコード
my $der = $coder->encode($object);
// デコード
my $object = $coder->decode($der);

注意事項:
perlの整数は(64bit環境では)64bitだが、ASN.1のINTEGERは大きさに制限がない。場合によっては、use bigint; を宣言しないと正しくデコードできない場合がある(例えば、X.509証明書のシリアル番号)。

ASN.1構造の例:
data ::= SEQUENCE {
     x INTEGER,
     y INTEGER
}

上記のASN.1に対応する$objectの構造:
$object = \%object;
%object = (
     type => 'sequence',
     value => \@data
);
@data = (\%x, \%y);
%x = (
    type => 'integer',
     value => $x
);
%y = (
     type => 'integer',
     value => $y
);

$y にアクセスするには、$object->{'value'}->[1]->{'value'}

type(DER表記上のタグ)は、下記のものが使用可能(抜粋)。
sequenceとsetはperl上はリスト(リスト参照)で表現され、他のタグはスカラー型(多バイト整数はMath::BigIntオブジェクト)で表現される。

float general_string generalized_time
int int32 integer integer32 null numeric_string
object_descriptor object_identifier octet_string oid
printable_string real
sequence sequence_of set set_of
string uint uint32 universal_string universal_time
unsigned_int unsigned_int32 unsigned_integer
utf8_string visible_string