saltywitch/c_src/auth.c

103 lines
2.2 KiB
C

#include "saltywitch.h"
/* auth */
ERL_NIF_TERM saltywitch_auth_keygen(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
ERL_NIF_TERM term;
unsigned char *key = enif_make_new_binary(env, crypto_auth_KEYBYTES, &term);
if (key == NULL) {
return saltywitch_exception(env, atom_error, atom_err_nif_alloc);
}
crypto_auth_keygen(key);
return term;
}
ERL_NIF_TERM saltywitch_auth(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary message, key;
ERL_NIF_TERM term;
unsigned char *mac;
ERL_NIF_TERM err = atom_badarg;
ERL_NIF_TERM reason = atom_err_opaque;
if (enif_inspect_binary(env, argv[0], &message) == false) {
reason = atom_err_invalid_type;
goto badarg_FAULT;
}
if (enif_inspect_binary(env, argv[1], &key) == false) {
reason = atom_err_invalid_type;
goto badarg_FAULT;
}
if (key.size != crypto_auth_KEYBYTES) {
reason = atom_err_invalid_key_size;
goto badarg_FAULT;
}
mac = enif_make_new_binary(env, crypto_auth_BYTES, &term);
if (mac == NULL) {
reason = atom_err_nif_alloc;
goto error_FAULT;
}
crypto_auth(mac, message.data, message.size, key.data);
return term;
error_FAULT:
err = atom_error;
badarg_FAULT:
return saltywitch_exception(env, err, reason);
}
ERL_NIF_TERM saltywitch_auth_verify(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary tag, message, key;
ERL_NIF_TERM err = atom_badarg;
ERL_NIF_TERM reason = atom_err_opaque;
if (enif_inspect_binary(env, argv[0], &tag) == false) {
reason = atom_err_invalid_type;
goto badarg_FAULT;
}
if (tag.size != crypto_auth_BYTES) {
reason = atom_err_invalid_tag_size;
goto badarg_FAULT;
}
if (enif_inspect_binary(env, argv[1], &message) == false) {
reason = atom_err_invalid_type;
goto badarg_FAULT;
}
if (enif_inspect_binary(env, argv[2], &key) == false) {
reason = atom_err_invalid_type;
goto badarg_FAULT;
}
if (key.size != crypto_auth_KEYBYTES) {
reason = atom_err_invalid_key_size;
goto badarg_FAULT;
}
if (crypto_auth_verify(tag.data, message.data, message.size, key.data) != 0) {
reason = atom_err_verification_failed;
goto error_FAULT;
}
return atom_ok;
error_FAULT:
err = atom_error;
badarg_FAULT:
return saltywitch_exception(env, err, reason);
}