diff --git a/lib/Crypt/PK/RSA.pm b/lib/Crypt/PK/RSA.pm index 282643f..be11550 100644 --- a/lib/Crypt/PK/RSA.pm +++ b/lib/Crypt/PK/RSA.pm @@ -128,11 +128,12 @@ elsif ($data =~ /-----BEGIN PRIVATE KEY-----(.*?)-----END/sg) { # PKCS#8 PrivateKeyInfo (PEM header: BEGIN PRIVATE KEY) $data = pem_to_der($data, $password); - return $self->_import_pkcs8($data, $password) if $data; + return $self->_import_pkcs8($data, $password); } elsif ($data =~ /-----BEGIN ENCRYPTED PRIVATE KEY-----(.*?)-----END/sg) { - # XXX-TODO: PKCS#8 EncryptedPrivateKeyInfo (PEM header: BEGIN ENCRYPTED PRIVATE KEY) - croak "FATAL: encrypted pkcs8 RSA private keys are not supported"; + # PKCS#8 PrivateKeyInfo (PEM header: BEGIN ENCRYPTED PRIVATE KEY) + $data = pem_to_der($data, $password); + return $self->_import_pkcs8($data, $password); } elsif ($data =~ /^\s*(\{.*?\})\s*$/s) { # JSON Web Key (JWK) - http://tools.ietf.org/html/draft-ietf-jose-json-web-key @@ -418,7 +419,7 @@ fyoy4t3yHT+/nw== -----END PRIVATE KEY----- -=item * PKCS#8 encrypted private keys ARE NOT SUPPORTED YET! +=item * PKCS#8 encrypted private keys - password protected keys (supported since: CryptX-0.062) -----BEGIN ENCRYPTED PRIVATE KEY----- MIICojAcBgoqhkiG9w0BDAEDMA4ECCQk+Rr1yzzcAgIIAASCAoD/mgpUFjxxM/Ty diff --git a/t/pkcs8.t b/t/pkcs8.t index feb1a86..c7fdadb 100644 --- a/t/pkcs8.t +++ b/t/pkcs8.t @@ -1,6 +1,6 @@ use strict; use warnings; -use Test::More tests => 12; +use Test::More tests => 14; use Crypt::PK::RSA; use Crypt::PK::ECC; @@ -36,11 +36,10 @@ ok($rsa->is_private, "RSA is_private $f"); } -### XXX-FIXME password protected pkcs8 private keys are not supported -### for my $f (qw/pkcs8.rsa-priv-pass.der pkcs8.rsa-priv-pass.pem/) { -### $rsa->import_key("t/data/$f", "secret"); -### ok($rsa->is_private, "RSA is_private $f"); -### } +for my $f (qw/pkcs8.rsa-priv-pass.der pkcs8.rsa-priv-pass.pem/) { + $rsa->import_key("t/data/$f", "secret"); + ok($rsa->is_private, "RSA is_private $f"); +} for my $f (qw/pkcs8.ec-short-priv-nopass.der pkcs8.ec-short-priv-nopass.pem pkcs8.ec-priv-nopass.der pkcs8.ec-priv-nopass.pem/) { $ec->import_key("t/data/$f");