diff options
author | Norbert Preining <preining@logic.at> | 2010-05-12 16:54:37 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2010-05-12 16:54:37 +0000 |
commit | 661c41a09e39a182865e0b51e34cc995a0dc96e8 (patch) | |
tree | 2f79bb1406e22fdcb2587be8ffda6c0c609d7932 /Master/tlpkg/tlperl/lib/Crypt/DSA/Key/PEM.pm | |
parent | b645030efc22e13c2498a1522083634ab91b2de1 (diff) |
move tlperl.straw to tlperl
git-svn-id: svn://tug.org/texlive/trunk@18210 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/tlperl/lib/Crypt/DSA/Key/PEM.pm')
-rwxr-xr-x | Master/tlpkg/tlperl/lib/Crypt/DSA/Key/PEM.pm | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl/lib/Crypt/DSA/Key/PEM.pm b/Master/tlpkg/tlperl/lib/Crypt/DSA/Key/PEM.pm new file mode 100755 index 00000000000..b760cc40317 --- /dev/null +++ b/Master/tlpkg/tlperl/lib/Crypt/DSA/Key/PEM.pm @@ -0,0 +1,178 @@ +package Crypt::DSA::Key::PEM; + +use strict; +use Carp qw( croak ); +use Convert::PEM; +use Crypt::DSA::Key; + +use vars qw{$VERSION @ISA}; +BEGIN { + $VERSION = '1.16'; + @ISA = 'Crypt::DSA::Key'; +} + +sub deserialize { + my $key = shift; + my %param = @_; + $param{Content} =~ /DSA PRIVATE KEY/ ? + $key->_deserialize_privkey(%param) : + $key->_deserialize_pubkey(%param); +} + +sub _deserialize_privkey { + my $key = shift; + my %param = @_; + + my $pem = $key->_pem; + my $pkey = $pem->decode( Content => $param{Content}, + Password => $param{Password}, + Macro => 'DSAPrivateKey' ); + return unless $pkey; + + for my $m (qw( p q g pub_key priv_key )) { + $key->$m( $pkey->{$m} ); + } + $key; +} + +sub _deserialize_pubkey { + my $key = shift; + my %param = @_; + + my $pem = $key->_pem; + my $pkey = $pem->decode( Content => $param{Content}, + Password => $param{Password}, + Macro => 'DSAPublicKey', + Name => 'PUBLIC KEY' ); + return unless $pkey; + + my $asn = $pem->asn->find('DSAPubKeyInner'); + my $num = $asn->decode($pkey->{pub_key}[0]) or croak $asn->{error}; + + for my $m (qw( p q g )) { + $key->$m( $pkey->{inner}{DSAParams}{$m} ); + } + $key->pub_key($num); + + $key; +} + +sub serialize { + my $key = shift; + ## If this is a private key (has the private key portion), serialize + ## it as a private key; otherwise use a public key ASN.1 object. + $key->priv_key ? $key->_serialize_privkey(@_) : $key->_serialize_pubkey(@_); +} + +sub _serialize_privkey { + my $key = shift; + my %param = @_; + + my $pkey = { version => 0 }; + for my $m (qw( p q g pub_key priv_key )) { + $pkey->{$m} = $key->$m(); + } + + my $pem = $key->_pem; + my $buf = $pem->encode( + Content => $pkey, + Password => $param{Password}, + Name => 'DSA PRIVATE KEY', + Macro => 'DSAPrivateKey', + ) or croak $pem->errstr; + $buf; +} + +sub _serialize_pubkey { + my $key = shift; + my %param = @_; + my $pem = $key->_pem; + my $asn = $pem->asn->find('DSAPubKeyInner'); + ## Force stringification. + my $str = $asn->encode($key->pub_key . '') or croak $asn->{error}; + my $pkey = { + inner => { + objId => '1.2.840.10040.4.1', + DSAParams => { + p => $key->p, + q => $key->q, + g => $key->g + }, + }, + pub_key => $str + }; + my $buf = $pem->encode( + Content => $pkey, + Password => $param{Password}, + Name => 'PUBLIC KEY', + Macro => 'DSAPublicKey', + ) or return $key->error($pem->errstr); + $buf; +} + +sub _pem { + my $key = shift; + unless (defined $key->{__pem}) { + my $pem = Convert::PEM->new( + Name => "DSA PRIVATE KEY", + ASN => qq( + DSAPrivateKey ::= SEQUENCE { + version INTEGER, + p INTEGER, + q INTEGER, + g INTEGER, + pub_key INTEGER, + priv_key INTEGER + } + + DSAPublicKey ::= SEQUENCE { + inner SEQUENCE { + objId OBJECT IDENTIFIER, + DSAParams SEQUENCE { + p INTEGER, + q INTEGER, + g INTEGER + } + } + pub_key BIT STRING + } + + DSAPubKeyInner ::= INTEGER + )); + $key->{__pem} = $pem; + } + $key->{__pem}; +} + +1; +__END__ + +=head1 NAME + +Crypt::DSA::Key::PEM - Read/write DSA PEM files + +=head1 SYNOPSIS + + use Crypt::DSA::Key; + my $key = Crypt::DSA::Key->new( Type => 'PEM', ...); + $key->write( Type => 'PEM', ...); + +=head1 DESCRIPTION + +I<Crypt::DSA::Key::PEM> provides an interface to reading and +writing DSA PEM files, using I<Convert::PEM>. The files are +ASN.1-encoded and optionally encrypted. + +You shouldn't use this module directly. As the SYNOPSIS above +suggests, this module should be considered a plugin for +I<Crypt::DSA::Key>, and all access to PEM files (reading DSA +keys from disk, etc.) should be done through that module. + +Read the I<Crypt::DSA::Key> documentation for more details. + +=head1 AUTHOR & COPYRIGHTS + +Please see the Crypt::DSA manpage for author, copyright, +and license information. + +=cut |