diff --git a/eqc_test/enacl_eqc.erl b/eqc_test/enacl_eqc.erl index 48ecb82e6b2e92373f9dd16ddc5bea87d95a6d26..40625015be287aacd1a7f57c673494faf24c0a32 100644 --- a/eqc_test/enacl_eqc.erl +++ b/eqc_test/enacl_eqc.erl @@ -216,3 +216,53 @@ prop_crypto_hash_neq() -> enacl:hash(X) /= enacl:hash(Y) )). +%% STRING COMPARISON +%% ------------------------- + +verify_pair_bad(Sz) -> + ?LET(X, elements([fst, snd]), + case X of + fst -> + {?SUCHTHAT(B, binary(), byte_size(B) /= Sz), binary(Sz)}; + snd -> + {binary(Sz), ?SUCHTHAT(B, binary(), byte_size(B) /= Sz)} + end). + +verify_pair_good(Sz) -> + oneof([ + ?LET(Bin, binary(Sz), {Bin, Bin}), + ?SUCHTHAT({X, Y}, {binary(Sz), binary(Sz)}, X /= Y)]). + +verify_pair(Sz) -> + fault(verify_pair_bad(Sz), verify_pair_good(Sz)). + +verify_pair_valid(Sz, X, Y) -> + byte_size(X) == Sz andalso byte_size(Y) == Sz. + +prop_verify_16() -> + ?FORALL({X, Y}, verify_pair(16), + case verify_pair_valid(16, X, Y) of + true -> + equals(X == Y, enacl:verify_16(X, Y)); + false -> + try + enacl:verify_16(X, Y), + false + catch + error:badarg -> true + end + end). + +prop_verify_32() -> + ?FORALL({X, Y}, verify_pair(32), + case verify_pair_valid(32, X, Y) of + true -> + equals(X == Y, enacl:verify_32(X, Y)); + false -> + try + enacl:verify_32(X, Y), + false + catch + error:badarg -> true + end + end). \ No newline at end of file diff --git a/src/enacl.erl b/src/enacl.erl index e1aebd8a038467d0f4cb33d4aa0cd76ae0f4d9d6..bcad62eb0fd1aa147fd8d40ba069baef96185a3b 100644 --- a/src/enacl.erl +++ b/src/enacl.erl @@ -19,12 +19,20 @@ ]). -export([ - hash/1 + hash/1, + verify_16/2, + verify_32/2 ]). -hash(Bin) -> - enacl_nif:crypto_hash(Bin). +%% Low level helper functions +%% ----------------- +hash(Bin) -> enacl_nif:crypto_hash(Bin). +verify_16(X, Y) -> enacl_nif:crypto_verify_16(X, Y). +verify_32(X, Y) -> enacl_nif:crypto_verify_32(X, Y). + +%% Public Key Crypto +%% --------------------- box_keypair() -> enacl_nif:crypto_box_keypair().