Initial Commit
This commit is contained in:
178
database/perl/vendor/lib/Crypt/DSA/Key/PEM.pm
vendored
Normal file
178
database/perl/vendor/lib/Crypt/DSA/Key/PEM.pm
vendored
Normal file
@@ -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.17';
|
||||
@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
|
||||
120
database/perl/vendor/lib/Crypt/DSA/Key/SSH2.pm
vendored
Normal file
120
database/perl/vendor/lib/Crypt/DSA/Key/SSH2.pm
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
package Crypt::DSA::Key::SSH2;
|
||||
|
||||
use strict;
|
||||
use MIME::Base64 qw( decode_base64 );
|
||||
use Crypt::DSA::Key;
|
||||
|
||||
use vars qw{$VERSION @ISA};
|
||||
BEGIN {
|
||||
$VERSION = '1.17';
|
||||
@ISA = 'Crypt::DSA::Key';
|
||||
}
|
||||
|
||||
use constant PRIVKEY_MAGIC => 0x3f6ff9eb;
|
||||
|
||||
sub deserialize {
|
||||
my $key = shift;
|
||||
my %param = @_;
|
||||
|
||||
chomp($param{Content});
|
||||
my($head, $object, $content, $tail) = $param{Content} =~
|
||||
m:(---- BEGIN ([^\n\-]+) ----)\n(.+)(---- END .*? ----)$:s;
|
||||
my @lines = split /\n/, $content;
|
||||
my $escaped = 0;
|
||||
my @real;
|
||||
for my $l (@lines) {
|
||||
if (substr($l, -1) eq '\\') {
|
||||
$escaped++;
|
||||
next;
|
||||
}
|
||||
next if index($l, ':') != -1;
|
||||
if ($escaped) {
|
||||
$escaped--;
|
||||
next;
|
||||
}
|
||||
push @real, $l;
|
||||
}
|
||||
$content = join "\n", @real;
|
||||
$content = decode_base64($content);
|
||||
|
||||
my $b = BufferWithInt->new;
|
||||
$b->append($content);
|
||||
my $magic = $b->get_int32;
|
||||
return unless $magic == PRIVKEY_MAGIC;
|
||||
|
||||
my($ignore);
|
||||
$ignore = $b->get_int32;
|
||||
my $type = $b->get_str;
|
||||
my $cipher = $b->get_str;
|
||||
$ignore = $b->get_int32 for 1..3;
|
||||
|
||||
return unless $cipher eq 'none';
|
||||
|
||||
$key->p( $b->get_mp_ssh2 );
|
||||
$key->g( $b->get_mp_ssh2 );
|
||||
$key->q( $b->get_mp_ssh2 );
|
||||
$key->pub_key( $b->get_mp_ssh2 );
|
||||
$key->priv_key( $b->get_mp_ssh2 );
|
||||
|
||||
#return unless $b->length == $b->offset;
|
||||
|
||||
$key;
|
||||
}
|
||||
|
||||
sub serialize {
|
||||
my $key = shift;
|
||||
my %param = @_;
|
||||
die "serialize is unimplemented";
|
||||
}
|
||||
|
||||
package BufferWithInt;
|
||||
use strict;
|
||||
|
||||
use Data::Buffer;
|
||||
use Crypt::DSA::Util qw( bin2mp );
|
||||
use base qw( Data::Buffer );
|
||||
|
||||
sub get_mp_ssh2 {
|
||||
my $buf = shift;
|
||||
my $bits = $buf->get_int32;
|
||||
my $off = $buf->{offset};
|
||||
my $bytes = int(($bits+7) / 8);
|
||||
my $int = bin2mp( $buf->bytes($off, $bytes) );
|
||||
$buf->{offset} += $bytes;
|
||||
$int;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Crypt::DSA::Key::SSH2 - Read/write DSA SSH2 files
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use Crypt::DSA::Key;
|
||||
my $key = Crypt::DSA::Key->new( Type => 'SSH2', ...);
|
||||
$key->write( Type => 'SSH2', ...);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
I<Crypt::DSA::Key::SSH2> provides an interface to reading and
|
||||
writing DSA SSH2 files, using I<Data::Buffer>, which provides
|
||||
functionality for SSH-compatible binary in/out buffers.
|
||||
|
||||
Currently encrypted key files are not supported.
|
||||
|
||||
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 SSH2 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
|
||||
Reference in New Issue
Block a user