diff options
author | Manuel Mausz <manuel@mausz.at> | 2016-06-07 17:50:23 +0200 |
---|---|---|
committer | karel-m <karel.miko@gmail.com> | 2016-06-07 17:50:23 +0200 |
commit | 9bc711637c2618153ee5681897aabd61148e98fe (patch) | |
tree | a3a216f0271566ad3558d35d71bb2f1457f83721 /t/pk_ecc.t | |
parent | 2e635f940e5494bd690a4cef992c71618980ffff (diff) |
Add ability to export ecc keys in short/oid form. (#17)
* Add PK_CURVEOID flag to ecc_export_full
The flag exports the key with it's associated ASN.1 OID which itself
references the curves parameters.
This is like OPENSSL_EC_NAMED_CURVE in OpenSSL.
* Add ecc_dp_fill_from_sets to look up missing curve parameters
Exporting with PK_CURVEOID requires knowing the OID, however only some
key formats provide the OID. ecc_dp_fill_from_sets searches our known set
of curves and fills in the missing parameters like curve OID and name.
Additional we can now make the name parameter in ecc_dp_set optional.
* Add optional OID parameter to ecc_dp_set
* Add support for PK_CURVEOID to perl-CryptX
API:
$pk->export_key_der('private_short');
$pk->export_key_der('public_short');
$pk->export_key_pem('private_short');
$pk->export_key_pem('public_short');
* Make key2hash export the OID as curve_oid
Diffstat (limited to 't/pk_ecc.t')
-rw-r--r-- | t/pk_ecc.t | 26 |
1 files changed, 23 insertions, 3 deletions
@@ -1,6 +1,6 @@ use strict; use warnings; -use Test::More tests => 108; +use Test::More tests => 121; use Crypt::PK::ECC qw(ecc_encrypt ecc_decrypt ecc_sign_message ecc_verify_message ecc_sign_hash ecc_verify_hash ecc_shared_secret); @@ -137,6 +137,8 @@ sub read_file { #ok($k->export_key_pem('public'), 'export_key_pem pub'); ok($k->export_key_der('private'), 'export_key_der pri'); ok($k->export_key_der('public'), 'export_key_der pub'); + ok($k->export_key_der('private_short'), 'export_key_der pri_short'); + ok($k->export_key_der('public_short'), 'export_key_der pub_short'); } { @@ -158,22 +160,28 @@ sub read_file { } for my $priv (qw/openssl_ec-short.pem openssl_ec-short.der/) { - my $k = Crypt::PK::ECC->new("t/data/$priv"); + my $f = "t/data/$priv"; + my $k = Crypt::PK::ECC->new($f); ok($k, "load $priv"); ok($k->is_private, "is_private $priv"); is($k->size, 32, "size $priv"); is(uc($k->key2hash->{pub_x}), 'A01532A3C0900053DE60FBEFEFCCA58793301598D308B41E6F4E364E388C2711', "key2hash $priv"); is(uc($k->curve2hash->{prime}), 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF', "curve2hash $priv"); is($k->key2hash->{curve_name}, "secp256r1", "EC curve_name is lowercase"); + is($k->export_key_der('private_short'), read_file($f), 'export_key_der private_oid') if (substr($priv, -3) eq "der"); + is($k->export_key_pem('private_short'), read_file($f), 'export_key_pem private_oid') if (substr($priv, -3) eq "pem"); } for my $pub (qw/openssl_ec-short.pub.pem openssl_ec-short.pub.der/) { - my $k = Crypt::PK::ECC->new("t/data/$pub"); + my $f = "t/data/$pub"; + my $k = Crypt::PK::ECC->new($f); ok($k, "load $pub"); ok(!$k->is_private, "is_private $pub"); is($k->size, 32, "$pub size"); is(uc($k->key2hash->{pub_x}), 'A01532A3C0900053DE60FBEFEFCCA58793301598D308B41E6F4E364E388C2711', "key2hash $pub"); is($k->key2hash->{curve_name}, "secp256r1", "EC curve_name is lowercase"); + is($k->export_key_der('public_short'), read_file($f), 'export_key_der public_short') if (substr($pub, -3) eq "der"); + is($k->export_key_pem('public_short'), read_file($f), 'export_key_pem public_short') if (substr($pub, -3) eq "pem"); } { @@ -181,6 +189,18 @@ for my $pub (qw/openssl_ec-short.pub.pem openssl_ec-short.pub.der/) { eval { $k->export_key_pem('public'); }; ok($@, 'key not generated'); + # known curves lookup my $params = $Crypt::PK::ECC::curve{secp384r1}; + $k = Crypt::PK::ECC->new; ok($k->generate_key($params), "generate_key hash params"); + is($k->key2hash->{curve_name}, 'secp384r1', "key2hash curve_name"); + is($k->key2hash->{curve_oid}, $params->{oid}, "key2hash curve_oid"); + ok($k->export_key_der('private_short'), "export_key_der auto oid"); + + $k = Crypt::PK::ECC->new; + ok($k->generate_key({ %$params, A => '0' }), "generate_key invalid auto oid"); + is($k->key2hash->{curve_name}, 'custom', "key2hash custom curve_name"); + ok(!exists($k->key2hash->{curve_oid}), "key2hash curve_oid doesn't exist"); + eval { $k->export_key_der('private_short'); }; + ok($@, "export_key_der invalid auto oid"); } |