Implement EQC for generic hashing, fix bug.

Turns out the interval we had in the
file were inverted and I was wrong
in an earlier commit. However, EQC
dutifully found the mistake, and it
is now corrected.
This commit is contained in:
Jesper Louis Andersen 2020-02-06 12:18:47 +01:00
parent f580f6525b
commit 014d50cf47
3 changed files with 35 additions and 9 deletions

View File

@ -14,7 +14,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Implement missing EQC tests - Implement missing EQC tests
- stream_chacha20... - stream_chacha20...
- stream_xor... - stream_xor...
- generichash...
## [Unreleased] ## [Unreleased]

View File

@ -96,8 +96,8 @@ ERL_NIF_TERM enacl_crypto_generichash(ErlNifEnv *env, int argc,
// Verify that hash size is // Verify that hash size is
// crypto_generichash_BYTES/crypto_generichash_BYTES_MIN/crypto_generichash_BYTES_MAX // crypto_generichash_BYTES/crypto_generichash_BYTES_MIN/crypto_generichash_BYTES_MAX
if ((hash_size <= crypto_generichash_BYTES_MIN) || if ((hash_size < crypto_generichash_BYTES_MIN) ||
(hash_size >= crypto_generichash_BYTES_MAX)) { (hash_size > crypto_generichash_BYTES_MAX)) {
goto bad_arg; goto bad_arg;
} }
@ -105,8 +105,8 @@ ERL_NIF_TERM enacl_crypto_generichash(ErlNifEnv *env, int argc,
unsigned char *k = key.data; unsigned char *k = key.data;
if (0 == key.size) { if (0 == key.size) {
k = NULL; k = NULL;
} else if (key.size <= crypto_generichash_KEYBYTES_MIN || } else if (key.size < crypto_generichash_KEYBYTES_MIN ||
key.size >= crypto_generichash_KEYBYTES_MAX) { key.size > crypto_generichash_KEYBYTES_MAX) {
goto bad_arg; goto bad_arg;
} }
@ -150,8 +150,8 @@ ERL_NIF_TERM enacl_crypto_generichash_init(ErlNifEnv *env, int argc,
goto bad_arg; goto bad_arg;
// Verify that hash size is valid // Verify that hash size is valid
if ((hash_size <= crypto_generichash_BYTES_MIN) || if ((hash_size < crypto_generichash_BYTES_MIN) ||
(hash_size >= crypto_generichash_BYTES_MAX)) { (hash_size > crypto_generichash_BYTES_MAX)) {
goto bad_arg; goto bad_arg;
} }
@ -159,8 +159,8 @@ ERL_NIF_TERM enacl_crypto_generichash_init(ErlNifEnv *env, int argc,
unsigned char *k = key.data; unsigned char *k = key.data;
if (0 == key.size) { if (0 == key.size) {
k = NULL; k = NULL;
} else if (key.size <= crypto_generichash_KEYBYTES_MIN || } else if (key.size < crypto_generichash_KEYBYTES_MIN ||
key.size >= crypto_generichash_KEYBYTES_MAX) { key.size > crypto_generichash_KEYBYTES_MAX) {
goto bad_arg; goto bad_arg;
} }

View File

@ -140,6 +140,17 @@ kx_keypair_bad() ->
end end
end). end).
g_generichash_data() ->
binary().
g_generichash_key() ->
?LET({Min, Max}, {return(enacl_nif:crypto_generichash_KEYBYTES_MIN()), return(enacl_nif:crypto_generichash_KEYBYTES_MAX())},
largebinary({limit, Min, Max})).
g_generichash_size() ->
?LET({Min, Max}, {return(enacl_nif:crypto_generichash_BYTES_MIN()), return(enacl_nif:crypto_generichash_BYTES_MAX())},
choose(Min, Max)).
%% CRYPTO BOX %% CRYPTO BOX
%% --------------------------- %% ---------------------------
%% * box/4 %% * box/4
@ -798,6 +809,22 @@ prop_crypto_shorthash_eq() ->
end end
end end
). ).
prop_crypto_generichash_eq() ->
?FORALL({Sz, X, Key}, {g_generichash_size(), g_generichash_data(), g_generichash_key()},
equals(enacl:generichash(Sz, X, Key), enacl:generichash(Sz, X, Key))).
generichash_loop(S, []) -> S;
generichash_loop(S, [M|Ms]) ->
S2 = enacl:generichash_update(S, M),
generichash_loop(S2, Ms).
prop_crypto_generichash_multi_part_eq() ->
?FORALL({Sz, Xs, Key}, {g_generichash_size(), list(g_generichash_data()), g_generichash_key()},
begin
S1 = generichash_loop(enacl:generichash_init(Sz, Key), Xs),
S2 = generichash_loop(enacl:generichash_init(Sz, Key), Xs),
equals(enacl:generichash_final(S1), enacl:generichash_final(S2))
end).
prop_crypto_shorthash_neq() -> prop_crypto_shorthash_neq() ->
?FORALL({X, Y}, diff_pair(), ?FORALL({X, Y}, diff_pair(),