our
$VERSION
=
'2.20.0'
;
our
@ISA
=
qw(Exporter)
;
our
@EXPORT_OK
=
qw(genRsaKey)
;
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
genCertKey {
my
(
$key_size
,
$password
,
$cn
) =
@_
;
Net::SSLeay::SSLeay_add_ssl_algorithms();
$cn
||=
"localhost"
;
my
$key
= Net::SSLeay::EVP_PKEY_new();
Net::SSLeay::EVP_PKEY_assign_RSA(
$key
,
Net::SSLeay::RSA_generate_key(
$key_size
, 0x10001 ) );
my
$cert
= Net::SSLeay::X509_new();
Net::SSLeay::ASN1_INTEGER_set(
Net::SSLeay::X509_get_serialNumber(
$cert
),
rand
( 2**32 ),
);
Net::SSLeay::X509_set_version(
$cert
, 2 );
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 );
my
$subj_e
= Net::SSLeay::X509_get_subject_name(
$cert
);
my
$subj
= {
commonName
=>
$cn
, };
while
(
my
(
$k
,
$v
) =
each
%$subj
) {
Net::SSLeay::X509_NAME_add_entry_by_txt(
$subj_e
,
$k
, 0x1000,
$v
, -1,
0 )
or
Net::SSLeay::X509_NAME_add_entry_by_txt(
$subj_e
,
$k
, 20,
$v
, -1, 0 )
or
Net::SSLeay::X509_NAME_add_entry_by_txt(
$subj_e
,
$k
, 4,
$v
, -1, 0 )
or croak(
"failed to add entry for $k - "
. Net::SSLeay::ERR_error_string( Net::SSLeay::ERR_get_error() ) );
}
Net::SSLeay::X509_set_pubkey(
$cert
,
$key
);
Net::SSLeay::X509_set_issuer_name(
$cert
,
Net::SSLeay::X509_get_subject_name(
$cert
) );
Net::SSLeay::X509_sign(
$cert
,
$key
, 0 );
my
$strCert
= Net::SSLeay::PEM_get_string_X509(
$cert
);
my
$strPrivate
;
if
(
$password
) {
my
$alg
= Net::SSLeay::EVP_get_cipherbyname(
"AES-256-CBC"
)
|| Net::SSLeay::EVP_get_cipherbyname(
"DES-EDE3-CBC"
);
$strPrivate
=
Net::SSLeay::PEM_get_string_PrivateKey(
$key
,
$password
,
$alg
);
}
else
{
$strPrivate
= Net::SSLeay::PEM_get_string_PrivateKey(
$key
);
}
Net::SSLeay::X509_free(
$cert
);
Net::SSLeay::EVP_PKEY_free(
$key
);
return
{
private
=>
$strPrivate
,
public
=>
$strCert
,
hash
=> md5_base64 (
$strCert
) };
}
sub
genEcKey {
my
(
$curve
) =
@_
;
my
$ec_key
= Crypt::PK::ECC->new();
$ec_key
->generate_key(
$curve
);
my
$pubKey
=
$ec_key
->export_key_pem(
'public'
);
my
$privKey
=
$ec_key
->export_key_pem(
'private'
);
return
{
private
=>
$privKey
,
public
=>
$pubKey
,
hash
=> md5_base64(
$pubKey
),
};
}
1;