Mojo-ACME
view release on metacpan or search on metacpan
lib/Mojo/ACME/Key.pm view on Meta::CPAN
use Mojo::Base -base;
use Mojo::File;
use Crypt::OpenSSL::RSA;
use Crypt::OpenSSL::Bignum; # get_key_parameters
use Digest::SHA 'sha256';
use MIME::Base64 'encode_base64url';
has 'generated';
has string => sub { shift->key->get_private_key_string };
has key => sub {
my $self = shift;
my $path = $self->path;
my $rsa;
if ($path && -e $path) {
my $string = Mojo::File->new($path)->slurp;
$rsa = Crypt::OpenSSL::RSA->new_private_key($string);
$self->generated(0);
} else {
$rsa = Crypt::OpenSSL::RSA->generate_key(4096);
$self->generated(1);
}
return $rsa;
};
has 'path';
has pub => sub { Crypt::OpenSSL::RSA->new_public_key(shift->key->get_public_key_string) };
lib/Mojo/ACME/Key.pm view on Meta::CPAN
has thumbprint => sub {
my $jwk = shift->jwk;
# manually format json for sorted keys
my $fmt = '{"e":"%s","kty":"%s","n":"%s"}';
my $json = sprintf $fmt, @{$jwk}{qw/e kty n/};
return encode_base64url( sha256($json) );
};
# TODO remove this once https://rt.cpan.org/Ticket/Display.html?id=111829&results=dcfe848f59fceab0efed819d62b70447
# is resolved and dependency on PKCS10 is bumped
sub key_clone { Crypt::OpenSSL::RSA->new_private_key(shift->string) }
sub sign {
my ($self, $content) = @_;
my $key = $self->key;
$key->use_sha256_hash;
return $key->sign($content);
}
1;
};
is_deeply $key->jwk, $jwk, 'jwk is as previously computed';
is $key->thumbprint, 'oIePSSg18GEOJIadc6j-HOC0ZC-gdXPHCzP077RQX2o', 'thumbprint is as previously computed';
my $sig = 'tOZ3Q3UOjkoBKA/SITPG7EiSciziz8AiNqYCLN6cR5KKxHFDVNCbY5CRgbVl0Yl1xY1F+8i29+NOMYhqnG0NvTyCc3XvEqb6s1N8KfH/wMMaqWlg36/ocfWMLFgnRMFpEd3y+OYOs5i5m9vHwZkZ+n+sovIkx/p396ZFIl4Y9rxEtRIAq/E0QKf5iMvMJEekie8AGV02zVVAa/C+Bq2Cc446+VjZDomJhqVB0qN9toA/2...
is Mojo::Util::encode_base64($key->sign('abc123'), ''), $sig, 'signed value is as previously computed';
# check clone
my $clone = $key->key_clone;
isa_ok $clone, 'Crypt::OpenSSL::RSA';
isnt $key->pub, $clone, 'clone is not the same object';
is $key->key->get_private_key_string, $clone->get_private_key_string, 'key strings are equivalent';
};
done_testing;
( run in 0.240 second using v1.01-cache-2.11-cpan-4d50c553e7e )