saltywitch/c_src/random.c

98 lines
2.1 KiB
C

#include "saltywitch.h"
_Static_assert(sizeof(unsigned int) >= sizeof(uint32_t), "unsigned int must be greated than 32 bits");
ERL_NIF_TERM saltywitch_randombytes_random(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
(void) argc;
(void) argv;
return enif_make_uint(env, randombytes_random());
}
ERL_NIF_TERM saltywitch_randombytes_uniform(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
uint32_t upper;
(void) argc;
if (enif_get_uint(env, argv[0], &upper) == false) {
return saltywitch_exception(env, atom_badarg, atom_err_invalid_type);
}
return enif_make_uint(env, randombytes_uniform(upper));
}
ERL_NIF_TERM saltywitch_randombytes_buf(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
unsigned char *buf;
ERL_NIF_TERM term;
uint64_t len;
(void) argc;
if (enif_get_uint64(env, argv[0], &len) == false) {
return saltywitch_exception(env, atom_badarg, atom_err_invalid_type);
}
buf = enif_make_new_binary(env, len, &term);
if (buf == NULL) {
return saltywitch_exception(env, atom_error, atom_err_nif_alloc);
}
randombytes_buf(buf, len);
return term;
}
ERL_NIF_TERM saltywitch_randombytes_buf_deterministic(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
unsigned char *buf;
ErlNifBinary seed;
ERL_NIF_TERM term;
uint64_t len;
ERL_NIF_TERM err = atom_badarg;
ERL_NIF_TERM reason = atom_err_opaque;
(void) argc;
if (enif_get_uint64(env, argv[0], &len) == false) {
reason = atom_err_invalid_type;
goto badarg_FAULT;
}
if (enif_inspect_binary(env, argv[1], &seed) == false) {
reason = atom_err_invalid_type;
goto badarg_FAULT;
}
if (seed.size != randombytes_SEEDBYTES) {
reason = atom_err_invalid_seed_size;
goto badarg_FAULT;
}
buf = enif_make_new_binary(env, len, &term);
if (buf == NULL) {
reason = atom_err_nif_alloc;
goto error_FAULT;
}
randombytes_buf_deterministic(buf, len, seed.data);
return term;
error_FAULT:
err = atom_error;
badarg_FAULT:
return saltywitch_exception(env, err, reason);
}
ERL_NIF_TERM saltywitch_randombytes_seedbytes(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
(void) argc;
(void) argv;
return enif_make_uint64(env, randombytes_SEEDBYTES);
}