xref: /trunk/ns_server/deps/enacl/c_src/hash.c (revision e35c584a)
1 #include <sodium.h>
2 
3 #include <erl_nif.h>
4 
5 #include "enacl.h"
6 #include "hash.h"
7 
enacl_crypto_shorthash_BYTES(ErlNifEnv * env,int argc,ERL_NIF_TERM const argv[])8 ERL_NIF_TERM enacl_crypto_shorthash_BYTES(ErlNifEnv *env, int argc,
9                                           ERL_NIF_TERM const argv[]) {
10   return enif_make_int64(env, crypto_shorthash_BYTES);
11 }
12 
enacl_crypto_shorthash_KEYBYTES(ErlNifEnv * env,int argc,ERL_NIF_TERM const argv[])13 ERL_NIF_TERM enacl_crypto_shorthash_KEYBYTES(ErlNifEnv *env, int argc,
14                                              ERL_NIF_TERM const argv[]) {
15   return enif_make_int64(env, crypto_shorthash_KEYBYTES);
16 }
17 
enacl_crypto_shorthash(ErlNifEnv * env,int argc,ERL_NIF_TERM const argv[])18 ERL_NIF_TERM enacl_crypto_shorthash(ErlNifEnv *env, int argc,
19                                     ERL_NIF_TERM const argv[]) {
20   ErlNifBinary a, m, k;
21 
22   if ((argc != 2) || (!enif_inspect_iolist_as_binary(env, argv[0], &m)) ||
23       (!enif_inspect_binary(env, argv[1], &k))) {
24     return enif_make_badarg(env);
25   }
26 
27   if (k.size != crypto_shorthash_KEYBYTES) {
28     return enif_make_badarg(env);
29   }
30 
31   if (!enif_alloc_binary(crypto_shorthash_BYTES, &a)) {
32     return enacl_internal_error(env);
33   }
34 
35   crypto_shorthash(a.data, m.data, m.size, k.data);
36 
37   return enif_make_binary(env, &a);
38 }
39 
enacl_crypto_hash(ErlNifEnv * env,int argc,ERL_NIF_TERM const argv[])40 ERL_NIF_TERM enacl_crypto_hash(ErlNifEnv *env, int argc,
41                                ERL_NIF_TERM const argv[]) {
42   ErlNifBinary input;
43   ErlNifBinary result;
44   ERL_NIF_TERM ret;
45 
46   if ((argc != 1) || (!enif_inspect_iolist_as_binary(env, argv[0], &input)))
47     goto bad_arg;
48 
49   if (!enif_alloc_binary(crypto_hash_BYTES, &result))
50     goto err;
51 
52   crypto_hash(result.data, input.data, input.size);
53   ret = enif_make_binary(env, &result);
54   goto done;
55 
56 bad_arg:
57   return enif_make_badarg(env);
58 err:
59   ret = enacl_internal_error(env);
60 done:
61   return ret;
62 }
63