diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b6adab..40caac7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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] diff --git a/c_src/generichash.c b/c_src/generichash.c index 4da2c80..a554d43 100644 --- a/c_src/generichash.c +++ b/c_src/generichash.c @@ -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; } diff --git a/eqc_test/enacl_eqc.erl b/eqc_test/enacl_eqc.erl index 4371ff8..1610f4b 100644 --- a/eqc_test/enacl_eqc.erl +++ b/eqc_test/enacl_eqc.erl @@ -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(),