Crypt-Nettle

 view release on metacpan or  search on metacpan

t/05-rsa.t  view on Meta::CPAN

               scalar(@{$digest_algos}) + 
               scalar(keys(%{$yarrow_generated_params})) +
               (8*scalar(@{$digest_algos})*scalar(@{$test_data})*2));

my @reported_digests = sort(Crypt::Nettle::RSA::hashes_available());
my @digests = sort(@{$digest_algos});
while (@reported_digests) {
  my $modea = shift(@digests);
  my $modeb = shift(@reported_digests);
  ok($modea eq $modeb);
}
ok(0 == scalar(@digests));


my $pubkey = Crypt::Nettle::RSA->new_public_key($n, $e);
my $privkey = Crypt::Nettle::RSA->new_private_key($d, $p, $q);

ok(defined($pubkey));
ok(defined($privkey));

ok($n eq $pubkey->key_params()->{'n'});
ok($e eq $pubkey->key_params()->{'e'});

ok($n eq $privkey->key_params()->{'n'});
ok($e eq $privkey->key_params()->{'e'});
ok($p eq $privkey->key_params()->{'p'});
ok($q eq $privkey->key_params()->{'q'});


# use a static seed to get replicable results for testing.
# obviously, do not do anything this stupid in production.
my $seed = 'x' x 32;
my $y = Crypt::Nettle::Yarrow->new();
$y->seed($seed);
my $key = Crypt::Nettle::RSA->generate_keypair($y, 1024);
my $params = $key->key_params();

for my $param (keys(%{$yarrow_generated_params})) {
  ok($yarrow_generated_params->{$param} eq $params->{$param});
};

use Data::Dumper;

for my $data (@${test_data}) {
  for my $algo (@{$digest_algos}) {
    my $digest = Crypt::Nettle::Hash::hash_data($algo, $data);
    for my $keypair (['generated', $key], ['stored', $privkey]) {
      my ($keylabel, $curkey) = @{$keypair};
      my $sig = $curkey->rsa_sign($algo, $data);
      ok(defined($sig));
      my $sig2 = $curkey->rsa_sign_digest($algo, $digest);
      ok(defined($sig2));
      ok($sig2 eq $sig);
      my $ret = $curkey->rsa_verify($algo, $data, $sig);
      ok(defined($ret));
      warn Dumper({key => $keylabel, algo => $algo, sig => unpack('H*', $sig), data => $data})
        if($ret != 1);
      ok($ret == 1);
      $ret = $curkey->rsa_verify_digest($algo, $digest, $sig);
      ok(defined($ret) && ($ret == 1));
      my $badsig = $sig ^ "\01"; # flip one bit
      $ret = $curkey->rsa_verify($algo, $data, $badsig);
      ok(defined($ret));
      ok($ret == 0);
    }
  }
}



( run in 0.631 second using v1.01-cache-2.11-cpan-71847e10f99 )