103 lines
2.2 KiB
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);
|
|
}
|