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
|
- Implement missing EQC tests
|
||||||
- stream_chacha20...
|
- stream_chacha20...
|
||||||
- stream_xor...
|
- stream_xor...
|
||||||
- generichash...
|
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user