Add access to secretbox_easy/easy_open functions
They are just a simplification of the secretbox API, thus it does not provide any new functionality. But it helps mapping function names to libsodium documentation.
This commit is contained in:
@@ -256,6 +256,12 @@ static ErlNifFunc nif_funcs[] = {
|
||||
{"crypto_secretbox_open_b", 3, enacl_crypto_secretbox_open},
|
||||
erl_nif_dirty_job_cpu_bound_macro("crypto_secretbox_open", 3,
|
||||
enacl_crypto_secretbox_open),
|
||||
{"crypto_secretbox_easy_b", 3, enacl_crypto_secretbox_easy},
|
||||
erl_nif_dirty_job_cpu_bound_macro("crypto_secretbox_easy", 3,
|
||||
enacl_crypto_secretbox_easy),
|
||||
{"crypto_secretbox_open_easy_b", 3, enacl_crypto_secretbox_open_easy},
|
||||
erl_nif_dirty_job_cpu_bound_macro("crypto_secretbox_open_easy", 3,
|
||||
enacl_crypto_secretbox_open_easy),
|
||||
|
||||
{"crypto_stream_chacha20_KEYBYTES", 0,
|
||||
enacl_crypto_stream_chacha20_KEYBYTES},
|
||||
|
||||
@@ -137,6 +137,64 @@ ERL_NIF_TERM enacl_crypto_secretbox_open(ErlNifEnv *env, int argc,
|
||||
return enif_make_tuple2(env, ret_ok, ret_bin);
|
||||
}
|
||||
|
||||
ERL_NIF_TERM enacl_crypto_secretbox_easy(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM const argv[]) {
|
||||
ErlNifBinary key, nonce, msg, cipherbox;
|
||||
|
||||
if ((argc != 3) ||
|
||||
(!enif_inspect_iolist_as_binary(env, argv[0], &msg)) ||
|
||||
(!enif_inspect_binary(env, argv[1], &nonce)) ||
|
||||
(!enif_inspect_binary(env, argv[2], &key))) {
|
||||
return enif_make_badarg(env);
|
||||
}
|
||||
|
||||
if ((key.size != crypto_secretbox_KEYBYTES) ||
|
||||
(nonce.size != crypto_secretbox_NONCEBYTES)) {
|
||||
return enif_make_badarg(env);
|
||||
}
|
||||
|
||||
if (!enif_alloc_binary(msg.size + crypto_secretbox_MACBYTES, &cipherbox)) {
|
||||
return enacl_internal_error(env);
|
||||
}
|
||||
|
||||
crypto_secretbox_easy(cipherbox.data, msg.data, msg.size,
|
||||
nonce.data, key.data);
|
||||
|
||||
return enif_make_binary(env, &cipherbox);
|
||||
}
|
||||
|
||||
ERL_NIF_TERM enacl_crypto_secretbox_open_easy(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM const argv[]) {
|
||||
ErlNifBinary key, nonce, cipherbox, msg;
|
||||
|
||||
if ((argc != 3) ||
|
||||
(!enif_inspect_iolist_as_binary(env, argv[0], &cipherbox)) ||
|
||||
(!enif_inspect_binary(env, argv[1], &nonce)) ||
|
||||
(!enif_inspect_binary(env, argv[2], &key))) {
|
||||
return enif_make_badarg(env);
|
||||
}
|
||||
|
||||
if ((key.size != crypto_secretbox_KEYBYTES) ||
|
||||
(nonce.size != crypto_secretbox_NONCEBYTES) ||
|
||||
(cipherbox.size < crypto_secretbox_MACBYTES)) {
|
||||
return enif_make_badarg(env);
|
||||
}
|
||||
|
||||
if (!enif_alloc_binary(cipherbox.size - crypto_secretbox_MACBYTES, &msg)) {
|
||||
return enacl_internal_error(env);
|
||||
}
|
||||
|
||||
if (crypto_secretbox_open_easy(msg.data, cipherbox.data, cipherbox.size,
|
||||
nonce.data, key.data) != 0) {
|
||||
enif_release_binary(&msg);
|
||||
return enacl_error_tuple(env, "failed_verification");
|
||||
}
|
||||
|
||||
ERL_NIF_TERM ret_ok = enif_make_atom(env, ATOM_OK);
|
||||
ERL_NIF_TERM ret_bin = enif_make_binary(env, &msg);
|
||||
return enif_make_tuple2(env, ret_ok, ret_bin);
|
||||
}
|
||||
|
||||
ERL_NIF_TERM enacl_crypto_stream_chacha20(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM const argv[]) {
|
||||
ErlNifBinary c, n, k;
|
||||
|
||||
@@ -43,6 +43,12 @@ ERL_NIF_TERM enacl_crypto_secretbox(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM enacl_crypto_secretbox_open(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM const argv[]);
|
||||
|
||||
ERL_NIF_TERM enacl_crypto_secretbox_easy(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM const argv[]);
|
||||
|
||||
ERL_NIF_TERM enacl_crypto_secretbox_open_easy(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM const argv[]);
|
||||
|
||||
ERL_NIF_TERM enacl_crypto_stream_chacha20(ErlNifEnv *env, int argc,
|
||||
ERL_NIF_TERM const argv[]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user