98 lines
2.1 KiB
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);
|
|
}
|