Crypt-Perl
view release on metacpan or search on metacpan
util/extract_openssl_curves.pl view on Meta::CPAN
#!/usr/bin/env perl
use strict;
use warnings;
use Try::Tiny;
use FindBin;
use lib "$FindBin::Bin/../lib";
use Crypt::Perl::BigInt ();
use Crypt::Perl::ECDSA::KeyBase ();
use lib "$FindBin::Bin/../t/lib";
use OpenSSL_Control ();
my $CURVE_TEMPLATE = <<END;
use constant CURVE_<oid> => (
'<p>', # p / prime
'<a>', # a
'<b>', # b
'<n>', # n / order
'<gx>', # gx / generator-x
'<gy>', # gy / generator-y
'<h>', # h / cofactor
'<seed>', # seed
);
END
my $MODULE_HEADER = <<END;
package Crypt::Perl::ECDSA::EC::CurvesDB;
use strict;
use warnings;
END
run() if !caller;
sub run {
my $perl = '';
my %oid_seen;
for my $cname ( OpenSSL_Control::curve_names() ) {
my $oid = OpenSSL_Control::curve_oid($cname);
my $oid_ = $oid =~ tr<.><_>r;
$perl .= '#' . ('-' x 70) . $/;
my $esc_cname = $cname =~ tr<-><_>r;
$perl .= "use constant OID_$esc_cname => '$oid';$/$/";
next if $oid_seen{$oid}++;
my $cdata = OpenSSL_Control::curve_data($cname);
try {
my $template_data = Crypt::Perl::ECDSA::ECParameters::normalize($cdata);
$_ = substr($_->as_hex(), 2) for values %$template_data;
$template_data->{'oid'} = $oid_;
$template_data->{'seed'} ||= q<>;
$perl .= ($CURVE_TEMPLATE =~ s[<(.+?)>][$template_data->{$1}]gr);
$perl .= $/;
}
catch {
if ( try { $_->isa('Crypt::Perl::X::ECDSA::CharacteristicTwoUnsupported') } ) {
$perl .= "# Skipping data for $cname:$/# " . $_->to_string . $/;
}
else {
local $@ = $_;
die;
}
};
}
$perl .= "1;$/";
my $ossl_v = OpenSSL_Control::openssl_version();
$ossl_v =~ s<^><# >mg;
print $MODULE_HEADER . "# Extracted from:$/" . $ossl_v . $perl;
}
( run in 0.838 second using v1.01-cache-2.11-cpan-6aa56a78535 )