Codebase list libcryptx-perl / 3982c43
ECC preparing new PEM/DER support Karel Miko 10 years ago
2 changed file(s) with 57 addition(s) and 6 deletion(s). Raw diff Collapse all Expand all
333333 return $self;
334334 }
335335
336 sub export_key_pem {
337 my ($self, $type, $password, $cipher) = @_;
338 my $key = $self->export_key_der($type||'');
339 return undef unless $key;
340 return Crypt::PK::_asn1_to_pem($key, "EC PRIVATE KEY", $password, $cipher) if $type eq 'private';
341 return Crypt::PK::_asn1_to_pem($key, "PUBLIC KEY") if $type eq 'public' || $type eq 'public_compressed';
342 }
343
336344 sub import_key {
337 my ($self, $key) = @_;
345 my ($self, $key, $password) = @_;
338346 croak "FATAL: undefined key" unless $key;
339347 my $data;
340348 if (ref($key) eq 'SCALAR') {
346354 else {
347355 croak "FATAL: non-existing file '$key'";
348356 }
349 ### no PEM support
350 #if ($data && $data =~ /-----BEGIN (EC PRIVATE|EC PUBLIC|PRIVATE|PUBLIC) KEY-----(.*?)-----END/sg) {
351 # $data = decode_base64($2);
352 #}
357 if ($data && $data =~ /-----BEGIN (EC PRIVATE|EC PUBLIC|PRIVATE|PUBLIC) KEY-----(.*?)-----END/sg) {
358 $data = Crypt::PK::_pem_to_asn1($data, $password);
359 }
353360 croak "FATAL: invalid key format" unless $data;
354361 return $self->_import($data);
355362 }
499506 $pk->generate_key('secp160r1');
500507 my $private_der = $pk->export_key_der('private');
501508 my $public_der = $pk->export_key_der('public');
509 my $private_pem = $pk->export_key_pem('private');
510 my $public_pem = $pk->export_key_pem('public');
502511 my $public_raw = $pk->export_key_raw('public');
503512
504513 ### Functional interface
665674
666675 =head2 import_key
667676
668 Loads private or public key in DER format (exported by L</export_key_der>).
677 Loads private or public key in DER or PEM format.
669678
670679 $pk->import_key($filename);
671680 #or
672681 $pk->import_key(\$buffer_containing_key);
673682
683 Support for password protected PEM keys
684
685 $pk->import_key($pem_filename, $password);
686 #or
687 $pk->import_key(\$buffer_containing_pem_key, $password);
688
674689 =head2 import_key_raw
675690
676691 Import raw public/private key - can load data exported by L</export_key_raw>.
684699 my $private_der = $pk->export_key_der('private');
685700 #or
686701 my $public_der = $pk->export_key_der('public');
702
703 =head2 export_key_pem
704
705 my $private_pem = $pk->export_key_pem('private');
706 #or
707 my $public_pem = $pk->export_key_pem('public');
708
709 Support for password protected PEM keys
710
711 my $private_pem = $pk->export_key_pem('private', $password);
712 #or
713 my $private_pem = $pk->export_key_pem('private', $password, $cipher);
714
715 # supported ciphers: 'DES-CBC'
716 # 'DES-EDE3-CBC'
717 # 'SEED-CBC'
718 # 'CAMELLIA-128-CBC'
719 # 'CAMELLIA-192-CBC'
720 # 'CAMELLIA-256-CBC'
721 # 'AES-128-CBC'
722 # 'AES-192-CBC'
723 # 'AES-256-CBC' (DEFAULT)
687724
688725 =head2 export_key_raw
689726
2424 ok($k, 'load cryptx_pub_ecc2.der');
2525 ok(!$k->is_private, 'is_private cryptx_pub_ecc2.der');
2626
27 ### XXX-TODO regenerate keys
2728 # $k = Crypt::PK::ECC->new('t/data/cryptx_priv_ecc1.pem');
2829 # ok($k, 'load cryptx_priv_ecc1.pem');
2930 # ok($k->is_private, 'is_private cryptx_priv_ecc1.pem');
3940 # $k = Crypt::PK::ECC->new('t/data/cryptx_pub_ecc2.pem');
4041 # ok($k, 'load cryptx_pub_ecc2.pem');
4142 # ok(!$k->is_private, 'is_private cryptx_pub_ecc2.pem');
43 # $k = Crypt::PK::ECC->new('t/data/cryptx_pub_ecc2.pem');
44
45 ### XXX-TODO private key PEM/DER not finished yet
46 #for (qw(openssl_ec1.key.pem openssl_ec1.pri.der openssl_ec1.pri.pem openssl_ec1.pric.der openssl_ec1.pric.pem)) {
47 # $k = Crypt::PK::ECC->new("t/data/$_");
48 # ok($k, "load $_");
49 # ok($k->is_private, 'is_private $_');
50 #}
51 for (qw(openssl_ec1.pub.pem openssl_ec1.pub.der openssl_ec1.pubc.der openssl_ec1.pubc.pem)) {
52 $k = Crypt::PK::ECC->new("t/data/$_");
53 ok($k, "load $_");
54 ok(!$k->is_private, 'is_private $_');
55 }
4256 }
4357
4458 {