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:
parent
f580f6525b
commit
014d50cf47
@ -14,7 +14,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- Implement missing EQC tests
|
||||
- stream_chacha20...
|
||||
- stream_xor...
|
||||
- generichash...
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
|
@ -96,8 +96,8 @@ ERL_NIF_TERM enacl_crypto_generichash(ErlNifEnv *env, int argc,
|
||||
|
||||
// Verify that hash size is
|
||||
// crypto_generichash_BYTES/crypto_generichash_BYTES_MIN/crypto_generichash_BYTES_MAX
|
||||
if ((hash_size <= crypto_generichash_BYTES_MIN) ||
|
||||
(hash_size >= crypto_generichash_BYTES_MAX)) {
|
||||
if ((hash_size < crypto_generichash_BYTES_MIN) ||
|
||||
(hash_size > crypto_generichash_BYTES_MAX)) {
|
||||
goto bad_arg;
|
||||
}
|
||||
|
||||
@ -105,8 +105,8 @@ ERL_NIF_TERM enacl_crypto_generichash(ErlNifEnv *env, int argc,
|
||||
unsigned char *k = key.data;
|
||||
if (0 == key.size) {
|
||||
k = NULL;
|
||||
} else if (key.size <= crypto_generichash_KEYBYTES_MIN ||
|
||||
key.size >= crypto_generichash_KEYBYTES_MAX) {
|
||||
} else if (key.size < crypto_generichash_KEYBYTES_MIN ||
|
||||
key.size > crypto_generichash_KEYBYTES_MAX) {
|
||||
goto bad_arg;
|
||||
}
|
||||
|
||||
@ -150,8 +150,8 @@ ERL_NIF_TERM enacl_crypto_generichash_init(ErlNifEnv *env, int argc,
|
||||
goto bad_arg;
|
||||
|
||||
// Verify that hash size is valid
|
||||
if ((hash_size <= crypto_generichash_BYTES_MIN) ||
|
||||
(hash_size >= crypto_generichash_BYTES_MAX)) {
|
||||
if ((hash_size < crypto_generichash_BYTES_MIN) ||
|
||||
(hash_size > crypto_generichash_BYTES_MAX)) {
|
||||
goto bad_arg;
|
||||
}
|
||||
|
||||
@ -159,8 +159,8 @@ ERL_NIF_TERM enacl_crypto_generichash_init(ErlNifEnv *env, int argc,
|
||||
unsigned char *k = key.data;
|
||||
if (0 == key.size) {
|
||||
k = NULL;
|
||||
} else if (key.size <= crypto_generichash_KEYBYTES_MIN ||
|
||||
key.size >= crypto_generichash_KEYBYTES_MAX) {
|
||||
} else if (key.size < crypto_generichash_KEYBYTES_MIN ||
|
||||
key.size > crypto_generichash_KEYBYTES_MAX) {
|
||||
goto bad_arg;
|
||||
}
|
||||
|
||||
|
@ -140,6 +140,17 @@ kx_keypair_bad() ->
|
||||
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
|
||||
%% ---------------------------
|
||||
%% * box/4
|
||||
@ -798,6 +809,22 @@ prop_crypto_shorthash_eq() ->
|
||||
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() ->
|
||||
?FORALL({X, Y}, diff_pair(),
|
||||
|
Loading…
x
Reference in New Issue
Block a user