diff --git a/c_src/enacl_nif.c b/c_src/enacl_nif.c index a0dd801..0c3651f 100644 --- a/c_src/enacl_nif.c +++ b/c_src/enacl_nif.c @@ -14,17 +14,17 @@ static ERL_NIF_TERM enif_crypto_hash(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary input; ErlNifBinary result; - + if ((argc != 1) || (!enif_inspect_iolist_as_binary(env, argv[0], &input))) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(crypto_hash_BYTES, &result)) { return nacl_error_tuple(env, "alloc_failed"); } - + crypto_hash(result.data, input.data, input.size); - + return enif_make_binary(env, &result); } @@ -57,28 +57,28 @@ ERL_NIF_TERM enif_crypto_box_SECRETKEYBYTES(ErlNifEnv *env, int argc, ERL_NIF_TE static ERL_NIF_TERM enif_crypto_box_keypair(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary pk, sk; - + if (argc != 0) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(crypto_box_PUBLICKEYBYTES, &pk)) { return nacl_error_tuple(env, "alloc_failed"); } - + if (!enif_alloc_binary(crypto_box_SECRETKEYBYTES, &sk)) { return nacl_error_tuple(env, "alloc_failed"); } - + crypto_box_keypair(pk.data, sk.data); - + return enif_make_tuple3(env, enif_make_atom(env, "ok"), enif_make_binary(env, &pk), enif_make_binary(env, &sk)); } static ERL_NIF_TERM enif_crypto_box(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary padded_msg, nonce, pk, sk, result; - + if ( (argc != 4) || (!enif_inspect_iolist_as_binary(env, argv[0], &padded_msg)) || @@ -87,7 +87,7 @@ ERL_NIF_TERM enif_crypto_box(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[] (!enif_inspect_iolist_as_binary(env, argv[3], &sk))) { return enif_make_badarg(env); } - + if ( (nonce.size != crypto_box_NONCEBYTES) || (pk.size != crypto_box_PUBLICKEYBYTES) || @@ -95,13 +95,13 @@ ERL_NIF_TERM enif_crypto_box(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[] (padded_msg.size < crypto_box_ZEROBYTES)) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(padded_msg.size, &result)) { return nacl_error_tuple(env, "alloc_failed"); } - + crypto_box(result.data, padded_msg.data, padded_msg.size, nonce.data, pk.data, sk.data); - + return enif_make_sub_binary( env, enif_make_binary(env, &result), @@ -112,7 +112,7 @@ ERL_NIF_TERM enif_crypto_box(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[] static ERL_NIF_TERM enif_crypto_box_open(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary padded_ciphertext, nonce, pk, sk, result; - + if ( (argc != 4) || (!enif_inspect_iolist_as_binary(env, argv[0], &padded_ciphertext)) || @@ -121,7 +121,7 @@ ERL_NIF_TERM enif_crypto_box_open(ErlNifEnv *env, int argc, ERL_NIF_TERM const a (!enif_inspect_iolist_as_binary(env, argv[3], &sk))) { return enif_make_badarg(env); } - + if ( (nonce.size != crypto_box_NONCEBYTES) || (pk.size != crypto_box_PUBLICKEYBYTES) || @@ -129,16 +129,16 @@ ERL_NIF_TERM enif_crypto_box_open(ErlNifEnv *env, int argc, ERL_NIF_TERM const a (padded_ciphertext.size < crypto_box_BOXZEROBYTES)) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(padded_ciphertext.size, &result)) { return nacl_error_tuple(env, "alloc_failed"); } - + if (crypto_box_open(result.data, padded_ciphertext.data, padded_ciphertext.size, nonce.data, pk.data, sk.data) != 0) { enif_release_binary(&result); return nacl_error_tuple(env, "failed_verification"); } - + return enif_make_sub_binary( env, enif_make_binary(env, &result), @@ -185,7 +185,7 @@ ERL_NIF_TERM enif_crypto_auth_KEYBYTES(ErlNifEnv *env, int argc, ERL_NIF_TERM co static ERL_NIF_TERM enif_crypto_secretbox(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary key, nonce, padded_msg, padded_ciphertext; - + if ( (argc != 3) || (!enif_inspect_iolist_as_binary(env, argv[0], &padded_msg)) || @@ -193,24 +193,24 @@ ERL_NIF_TERM enif_crypto_secretbox(ErlNifEnv *env, int argc, ERL_NIF_TERM const (!enif_inspect_iolist_as_binary(env, argv[2], &key))) { return enif_make_badarg(env); } - + if ( (key.size != crypto_secretbox_KEYBYTES) || (nonce.size != crypto_secretbox_NONCEBYTES) || (padded_msg.size < crypto_secretbox_ZEROBYTES)) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(padded_msg.size, &padded_ciphertext)) { return nacl_error_tuple(env, "alloc_failed"); } - + crypto_secretbox( padded_ciphertext.data, padded_msg.data, padded_msg.size, nonce.data, key.data); - + return enif_make_sub_binary(env, enif_make_binary(env, &padded_ciphertext), crypto_secretbox_BOXZEROBYTES, @@ -220,7 +220,7 @@ ERL_NIF_TERM enif_crypto_secretbox(ErlNifEnv *env, int argc, ERL_NIF_TERM const static ERL_NIF_TERM enif_crypto_secretbox_open(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary key, nonce, padded_ciphertext, padded_msg; - + if ( (argc != 3) || (!enif_inspect_iolist_as_binary(env, argv[0], &padded_ciphertext)) || @@ -228,18 +228,18 @@ ERL_NIF_TERM enif_crypto_secretbox_open(ErlNifEnv *env, int argc, ERL_NIF_TERM c (!enif_inspect_iolist_as_binary(env, argv[2], &key))) { return enif_make_badarg(env); } - + if ( (key.size != crypto_secretbox_KEYBYTES) || (nonce.size != crypto_secretbox_NONCEBYTES) || (padded_ciphertext.size < crypto_secretbox_BOXZEROBYTES)) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(padded_ciphertext.size, &padded_msg)) { return nacl_error_tuple(env, "alloc_failed"); } - + if (crypto_secretbox_open( padded_msg.data, padded_ciphertext.data, @@ -249,7 +249,7 @@ ERL_NIF_TERM enif_crypto_secretbox_open(ErlNifEnv *env, int argc, ERL_NIF_TERM c enif_release_binary(&padded_msg); return nacl_error_tuple(env, "failed_verification"); } - + return enif_make_sub_binary( env, enif_make_binary(env, &padded_msg), @@ -269,26 +269,26 @@ ERL_NIF_TERM enif_crypto_stream(ErlNifEnv *env, int argc, ERL_NIF_TERM const arg (!enif_inspect_iolist_as_binary(env, argv[2], &k))) { return enif_make_badarg(env); } - + if ( (k.size != crypto_stream_KEYBYTES) || (n.size != crypto_stream_NONCEBYTES)) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(clen, &c)) { return nacl_error_tuple(env, "alloc_failed"); } - + crypto_stream(c.data, c.size, n.data, k.data); - + return enif_make_binary(env, &c); } static ERL_NIF_TERM enif_crypto_stream_xor(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary c, m, n, k; - + if ( (argc != 3) || (!enif_inspect_iolist_as_binary(env, argv[0], &m)) || @@ -296,19 +296,19 @@ ERL_NIF_TERM enif_crypto_stream_xor(ErlNifEnv *env, int argc, ERL_NIF_TERM const (!enif_inspect_iolist_as_binary(env, argv[2], &k))) { return enif_make_badarg(env); } - + if ( (k.size != crypto_stream_KEYBYTES) || (n.size != crypto_stream_NONCEBYTES)) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(m.size, &c)) { return nacl_error_tuple(env, "alloc_failed"); } - + crypto_stream_xor(c.data, m.data, m.size, n.data, k.data); - + return enif_make_binary(env, &c); } @@ -322,24 +322,24 @@ ERL_NIF_TERM enif_crypto_auth(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[ (!enif_inspect_iolist_as_binary(env, argv[1], &k))) { return enif_make_badarg(env); } - + if (k.size != crypto_auth_KEYBYTES) { return enif_make_badarg(env); } - + if (!enif_alloc_binary(crypto_auth_BYTES, &a)) { return nacl_error_tuple(env, "alloc_failed"); } - + crypto_auth(a.data, m.data, m.size, k.data); - + return enif_make_binary(env, &a); } static ERL_NIF_TERM enif_crypto_auth_verify(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { ErlNifBinary a, m, k; - + if ( (argc != 3) || (!enif_inspect_iolist_as_binary(env, argv[0], &a)) || @@ -372,7 +372,7 @@ static ErlNifFunc nif_funcs[] = { {"crypto_box_keypair", 0, enif_crypto_box_keypair}, {"crypto_box", 4, enif_crypto_box, ERL_NIF_DIRTY_JOB_CPU_BOUND}, {"crypto_box_open", 4, enif_crypto_box_open, ERL_NIF_DIRTY_JOB_CPU_BOUND}, - + {"crypto_secretbox_NONCEBYTES", 0, enif_crypto_secretbox_NONCEBYTES}, {"crypto_secretbox_ZEROBYTES", 0, enif_crypto_secretbox_ZEROBYTES}, {"crypto_secretbox_BOXZEROBYTES", 0, enif_crypto_secretbox_BOXZEROBYTES},