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 )