summaryrefslogtreecommitdiff
path: root/t/pk_ecc.t
diff options
context:
space:
mode:
authorManuel Mausz <manuel@mausz.at>2016-06-07 17:50:23 +0200
committerkarel-m <karel.miko@gmail.com>2016-06-07 17:50:23 +0200
commit9bc711637c2618153ee5681897aabd61148e98fe (patch)
treea3a216f0271566ad3558d35d71bb2f1457f83721 /t/pk_ecc.t
parent2e635f940e5494bd690a4cef992c71618980ffff (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.t26
1 files changed, 23 insertions, 3 deletions
diff --git a/t/pk_ecc.t b/t/pk_ecc.t
index dd656cf7..27fd0b84 100644
--- a/t/pk_ecc.t
+++ b/t/pk_ecc.t
@@ -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");
}