enable wycheproof test for ed25519/x25519
Karel Miko
4 years ago
7 | 7 | |
8 | 8 | plan skip_all => "No JSON::* module installed" unless eval { require JSON::PP } || eval { require JSON::XS } || eval { require Cpanel::JSON::XS }; |
9 | 9 | #plan skip_all => "Temporarily disabled"; |
10 | plan tests => 14141; | |
10 | plan tests => 14339; | |
11 | 11 | |
12 | 12 | use CryptX; |
13 | 13 | use Crypt::Misc 'read_rawfile'; |
14 | 14 | use Crypt::Digest 'digest_data'; |
15 | ||
16 | if (1) { | |
17 | use Crypt::PK::Ed25519; | |
18 | my $json = 't/wycheproof/eddsa_test.json'; | |
19 | my $tests = CryptX::_decode_json read_rawfile $json; | |
20 | for my $g (@{$tests->{testGroups}}) { | |
21 | my $type = $g->{type}; # EDDSAVer | |
22 | my $keyDer = pack "H*", $g->{keyDer}; | |
23 | my $keyPem = $g->{keyPem}; | |
24 | my $pk = pack "H*", $g->{key}{pk}; | |
25 | my $sk = pack "H*", $g->{key}{sk}; | |
26 | for my $t (@{$g->{tests}}) { | |
27 | my $tcId = $t->{tcId}; | |
28 | my $comment = $t->{comment}; | |
29 | my $result = $t->{result}; | |
30 | my $message = pack "H*", $t->{msg}; | |
31 | my $sig = pack "H*", $t->{sig}; | |
32 | my $testname = "($json) type=$type tcId=$tcId comment='$comment' expected-result=$result"; | |
33 | my $pk = Crypt::PK::Ed25519->new( \$keyPem ); | |
34 | my $valid = $pk->verify_message($sig, $message); | |
35 | if ($result eq 'valid') { | |
36 | ok($valid, "$testname valid=$valid"); | |
37 | } | |
38 | elsif ($result eq 'acceptable') { | |
39 | ok($valid, "$testname valid=$valid"); # consider: acceptable == valid | |
40 | } | |
41 | elsif ($result eq 'invalid') { | |
42 | SKIP: { | |
43 | skip "ltc bug ed25519", 1 if $tcId =~ /^(63|64|65|66)$/; #XXX-FIXME | |
44 | ok(!$valid, "$testname valid=$valid"); | |
45 | } | |
46 | } | |
47 | else { | |
48 | ok(0, "UNEXPECTED result=$result"); | |
49 | } | |
50 | } | |
51 | } | |
52 | } | |
53 | ||
54 | if (1) { | |
55 | use Crypt::PK::X25519; | |
56 | my $json = 't/wycheproof/x25519_test.json'; | |
57 | my $tests = CryptX::_decode_json read_rawfile $json; | |
58 | for my $g (@{$tests->{testGroups}}) { | |
59 | my $curve = $g->{curve}; | |
60 | next if $curve ne 'curve25519'; | |
61 | for my $t (@{$g->{tests}}) { | |
62 | my $pk = pack "H*", $t->{public}; | |
63 | my $sk = pack "H*", $t->{private}; | |
64 | my $sh = pack "H*", $t->{shared}; | |
65 | my $result = $t->{result}; | |
66 | my $comment = $t->{comment}; | |
67 | my $s = Crypt::PK::X25519->new->import_key_raw($sk, 'private'); | |
68 | my $p = Crypt::PK::X25519->new->import_key_raw($pk, 'public'); | |
69 | my $shared = $s->shared_secret($p); | |
70 | if ($result eq 'valid') { | |
71 | is(unpack("H*", $shared), $t->{shared}, "result=$result comment=$comment"); | |
72 | } | |
73 | elsif ($result eq 'acceptable') { | |
74 | is(unpack("H*", $shared), $t->{shared}, "result=$result comment=$comment"); | |
75 | } | |
76 | else { | |
77 | isnt(unpack("H*", $shared), $t->{shared}, "result=$result comment=$comment"); | |
78 | } | |
79 | } | |
80 | } | |
81 | } | |
15 | 82 | |
16 | 83 | if (1) { |
17 | 84 | use Crypt::AuthEnc::ChaCha20Poly1305 qw(chacha20poly1305_encrypt_authenticate chacha20poly1305_decrypt_verify); |