Lemonldap-NG-Common

 view release on metacpan or  search on metacpan

lib/Lemonldap/NG/Common/Util/Crypto.pm  view on Meta::CPAN

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,

t/71-Util-Crypto.t  view on Meta::CPAN

BEGIN { use_ok('Lemonldap::NG::Common::Util::Crypto') }
use Crypt::OpenSSL::RSA;
use Crypt::OpenSSL::X509;

# Use small key size to avoid burning too much CPU
our $key_size = 1024;

subtest "Check genRsaKey" => sub {
    my ( $result, $checkpriv, $checkpub );
    $result    = Lemonldap::NG::Common::Util::Crypto::genRsaKey($key_size);
    $checkpriv = Crypt::OpenSSL::RSA->new_private_key( $result->{private} );
    $checkpub  = Crypt::OpenSSL::RSA->new_public_key( $result->{public} );
    is( $checkpriv->size * 8, $key_size, "Correct key size" );
    is(
        $checkpriv->get_public_key_string(),
        $checkpub->get_public_key_string(),
        'Public key matches private key'
    );
    ok( $result->{hash}, "Hash is non empty" );

    my $result =
      Lemonldap::NG::Common::Util::Crypto::genRsaKey( $key_size, "mytestkey" );
  SKIP: {
        skip "Crypt::OpenSSL::RSA doesn't support loading key with passphrase"
          if $Crypt::OpenSSL::RSA::VERSION < 0.33;
        $checkpriv = Crypt::OpenSSL::RSA->new_private_key( $result->{private},
            "mytestkey" );
        $checkpub = Crypt::OpenSSL::RSA->new_public_key( $result->{public} );
        is( $checkpriv->size * 8, $key_size, "Correct key size" );
        is(
            $checkpriv->get_public_key_string(),
            $checkpub->get_public_key_string(),
            'Public key matches private key'
        );
        ok( $result->{hash}, "Hash is non empty" );
    }
};

subtest "Check genCertKey" => sub {
    my ( $result, $checkpriv, $checkpub, $checkcert );
    $result    = Lemonldap::NG::Common::Util::Crypto::genCertKey($key_size);
    $checkpriv = Crypt::OpenSSL::RSA->new_private_key( $result->{private} );
    $checkcert = Crypt::OpenSSL::X509->new_from_string( $result->{public},
        Crypt::OpenSSL::X509::FORMAT_PEM );
    $checkpub = Crypt::OpenSSL::RSA->new_public_key( $checkcert->pubkey() );
    is( $checkpriv->size * 8, $key_size, "Correct key size" );
    is(
        $checkpriv->get_public_key_string(),
        $checkpub->get_public_key_string(),
        'Public key matches private key'
    );
    is( $checkcert->subject(), "CN=localhost", "Correct subject" );
    ok( $result->{hash}, "Hash is non empty" );

  SKIP: {
        skip "Crypt::OpenSSL::RSA doesn't support loading key with passphrase"
          if $Crypt::OpenSSL::RSA::VERSION < 0.33;
        my $result = Lemonldap::NG::Common::Util::Crypto::genCertKey( $key_size,
            "mytestkey" );
        $checkpriv = Crypt::OpenSSL::RSA->new_private_key( $result->{private},
            "mytestkey" );
        $checkcert = Crypt::OpenSSL::X509->new_from_string( $result->{public},
            Crypt::OpenSSL::X509::FORMAT_PEM );
        $checkpub = Crypt::OpenSSL::RSA->new_public_key( $checkcert->pubkey() );
        is( $checkpriv->size * 8, $key_size, "Correct key size" );
        is(
            $checkpriv->get_public_key_string(),
            $checkpub->get_public_key_string(),
            'Public key matches private key'
        );
        is( $checkcert->subject(), "CN=localhost", "Correct subject" );
        ok( $result->{hash}, "Hash is non empty" );
    }

    my $result =
      Lemonldap::NG::Common::Util::Crypto::genCertKey( $key_size, undef,
        "example.com" );
    $checkpriv = Crypt::OpenSSL::RSA->new_private_key( $result->{private} );
    $checkcert = Crypt::OpenSSL::X509->new_from_string( $result->{public},
        Crypt::OpenSSL::X509::FORMAT_PEM );
    $checkpub = Crypt::OpenSSL::RSA->new_public_key( $checkcert->pubkey() );
    is( $checkpriv->size * 8, $key_size, "Correct key size" );
    is(
        $checkpriv->get_public_key_string(),
        $checkpub->get_public_key_string(),
        'Public key matches private key'
    );
    is( $checkcert->subject(), "CN=example.com", "Correct subject" );

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.805 second using v1.00-cache-2.02-grep-82fe00e-cpan-5f49755563f )