Lemonldap-NG-Common
view release on metacpan or search on metacpan
lib/Lemonldap/NG/Common/Util/Crypto.pm view on Meta::CPAN
package Lemonldap::NG::Common::Util::Crypto;
use strict;
use warnings;
require Exporter;
our $VERSION = '2.23.0';
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(genRsaKey);
use Crypt::OpenSSL::RSA;
use Digest::MD5 qw(md5_base64);
use Convert::PEM;
use Net::SSLeay;
sub genRsaKey {
my ( $key_size, $password ) = @_;
my $rsa = Crypt::OpenSSL::RSA->generate_key($key_size);
my $keys = {
'private' => $rsa->get_private_key_string(),
'public' => $rsa->get_public_key_x509_string(),
'hash' => md5_base64( $rsa->get_public_key_string() ),
};
if ($password) {
my $pem = Convert::PEM->new(
Name => 'RSA PRIVATE KEY',
ASN => q(
RSAPrivateKey SEQUENCE {
version INTEGER,
n INTEGER,
e INTEGER,
d INTEGER,
p INTEGER,
q INTEGER,
dp INTEGER,
dq INTEGER,
iqmp INTEGER
}
)
);
$keys->{private} = $pem->encode(
Content => $pem->decode( Content => $keys->{private} ),
Password => $password,
);
}
return $keys;
}
sub _genSelfSignedCertificate {
my ( $password, $cn, $assign_key_func ) = @_;
Net::SSLeay::SSLeay_add_ssl_algorithms();
$cn ||= "localhost";
# Generate 2048 bits RSA key
my $key = Net::SSLeay::EVP_PKEY_new();
# Populate private key using supplied coderef
$assign_key_func->($key);
my $cert = Net::SSLeay::X509_new();
# Serial
Net::SSLeay::ASN1_INTEGER_set(
Net::SSLeay::X509_get_serialNumber($cert),
rand( 2**32 ),
);
# Version
Net::SSLeay::X509_set_version( $cert, 2 );
# Make it last 20 years
Net::SSLeay::ASN1_TIME_set( Net::SSLeay::X509_get_notBefore($cert),
time() );
Net::SSLeay::ASN1_TIME_set( Net::SSLeay::X509_get_notAfter($cert),
time() + 20 * 365 * 86400 );
# set subject
my $subj_e = Net::SSLeay::X509_get_subject_name($cert);
( run in 2.155 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )