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;

t/key.t  view on Meta::CPAN

  };
  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 )