218 lines
6.6 KiB
C++
Executable file
218 lines
6.6 KiB
C++
Executable file
/**
|
|
* Node Native Module for Lib Sodium
|
|
*
|
|
* @Author Pedro Paixao
|
|
* @email paixaop at gmail dot com
|
|
* @License MIT
|
|
*/
|
|
#include "node_sodium.h"
|
|
|
|
|
|
/*
|
|
int crypto_pwhash(unsigned char * const out, unsigned long long outlen,
|
|
const char * const passwd, unsigned long long passwdlen,
|
|
const unsigned char * const salt,
|
|
unsigned long long opslimit, size_t memlimit, int alg)
|
|
|
|
Buffer out
|
|
Buffer password
|
|
Buffer salt
|
|
Number oppsLimit
|
|
Number memLimit
|
|
Number algorithm
|
|
|
|
*/
|
|
NAPI_METHOD(crypto_pwhash) {
|
|
Napi::Env env = info.Env();
|
|
|
|
ARGS(6, "arguments must be: output buffer length, password buffer, salt buffer, oLimit, memLimit, algorithm");
|
|
|
|
ARG_TO_NUMBER(outLen);
|
|
ARG_TO_BUFFER_TYPE(passwd, char);
|
|
ARG_TO_UCHAR_BUFFER_LEN(salt, crypto_pwhash_SALTBYTES);
|
|
ARG_TO_NUMBER(oppLimit);
|
|
ARG_TO_NUMBER(memLimit);
|
|
ARG_TO_NUMBER(alg);
|
|
if( outLen <= 0 ) {
|
|
THROW_ERROR("output buffer length must be bigger than 0.");
|
|
}
|
|
NEW_BUFFER_AND_PTR(out, outLen);
|
|
if (crypto_pwhash(out_ptr, outLen, passwd, passwd_size, salt, oppLimit, memLimit, alg) == 0) {
|
|
return out;
|
|
}
|
|
return NAPI_NULL;
|
|
}
|
|
|
|
|
|
/**
|
|
* int crypto_pwhash_str(char out[crypto_pwhash_STRBYTES],
|
|
const char * const passwd, unsigned long long passwdlen,
|
|
unsigned long long opslimit, size_t memlimit)
|
|
|
|
Buffer out
|
|
Buffer passwd
|
|
Number oppsLimit
|
|
Number memLimit
|
|
*/
|
|
NAPI_METHOD(crypto_pwhash_str) {
|
|
Napi::Env env = info.Env();
|
|
|
|
ARGS(3, "arguments must be: password buffer, oLimit, memLimit");
|
|
|
|
ARG_TO_BUFFER_TYPE(passwd, char);
|
|
ARG_TO_NUMBER(oppLimit);
|
|
ARG_TO_NUMBER(memLimit);
|
|
|
|
NEW_BUFFER_AND_PTR(out, crypto_pwhash_STRBYTES);
|
|
|
|
if (crypto_pwhash_str((char*)out_ptr, passwd, passwd_size, oppLimit, memLimit) == 0) {
|
|
return out;
|
|
}
|
|
|
|
return NAPI_NULL;
|
|
}
|
|
|
|
/**
|
|
* int crypto_pwhash_str_verify(const char str[crypto_pwhash_STRBYTES],
|
|
const char * const passwd,
|
|
unsigned long long passwdlen)
|
|
|
|
Buffer hash String
|
|
Buffer password
|
|
*/
|
|
NAPI_METHOD(crypto_pwhash_str_verify) {
|
|
Napi::Env env = info.Env();
|
|
|
|
ARGS(2, "arguments must be: pwhash string, password");
|
|
|
|
ARG_TO_UCHAR_BUFFER_LEN(hash, crypto_pwhash_STRBYTES);
|
|
ARG_TO_BUFFER_TYPE(passwd, char);
|
|
|
|
if (crypto_pwhash_str_verify((char*)hash, passwd, passwd_size) == 0) {
|
|
return NAPI_TRUE;
|
|
}
|
|
|
|
return NAPI_FALSE;
|
|
}
|
|
|
|
NAPI_METHOD(crypto_pwhash_str_needs_rehash) {
|
|
Napi::Env env = info.Env();
|
|
|
|
ARGS(2, "arguments must be: pwhash hash, oLimit, memLimit");
|
|
ARG_TO_UCHAR_BUFFER_LEN(hash, crypto_pwhash_STRBYTES);
|
|
ARG_TO_NUMBER(oppLimit);
|
|
ARG_TO_NUMBER(memLimit);
|
|
|
|
if (crypto_pwhash_str_needs_rehash((char*)hash, oppLimit, memLimit) == 0) {
|
|
return NAPI_TRUE;
|
|
}
|
|
return NAPI_FALSE;
|
|
}
|
|
|
|
/*
|
|
crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES],
|
|
const char * const passwd, unsigned long long passwdlen,
|
|
unsigned long long opslimit, size_t memlimit, int alg)
|
|
*/
|
|
NAPI_METHOD(crypto_pwhash_str_alg) {
|
|
Napi::Env env = info.Env();
|
|
|
|
ARGS(3, "arguments must be: password buffer, oLimit, memLimit, and algorithm");
|
|
|
|
ARG_TO_BUFFER_TYPE(passwd, char);
|
|
ARG_TO_NUMBER(oppLimit);
|
|
ARG_TO_NUMBER(memLimit);
|
|
ARG_TO_NUMBER(alg);
|
|
|
|
NEW_BUFFER_AND_PTR(out, crypto_pwhash_STRBYTES);
|
|
|
|
if (crypto_pwhash_str_alg((char*)out_ptr, passwd, passwd_size, oppLimit, memLimit, alg) == 0) {
|
|
return out;
|
|
}
|
|
|
|
return NAPI_NULL;
|
|
}
|
|
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_bytes_max)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_bytes_min)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_opslimit_max)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_opslimit_min)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_opslimit_interactive)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_opslimit_sensitive)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_memlimit_max)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_memlimit_min)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_memlimit_interactive)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_memlimit_sensitive)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_passwd_max)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_passwd_min)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_saltbytes)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_strbytes)
|
|
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_alg_default)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_alg_argon2i13)
|
|
NAPI_METHOD_FROM_INT(crypto_pwhash_alg_argon2id13)
|
|
|
|
NAPI_METHOD_FROM_STRING(crypto_pwhash_strprefix)
|
|
NAPI_METHOD_FROM_STRING(crypto_pwhash_primitive)
|
|
|
|
/**
|
|
* Register function calls in node binding
|
|
*/
|
|
void register_crypto_pwhash(Napi::Env env, Napi::Object exports) {
|
|
|
|
// Methods
|
|
EXPORT(crypto_pwhash);
|
|
EXPORT(crypto_pwhash_str);
|
|
EXPORT(crypto_pwhash_str_verify);
|
|
EXPORT(crypto_pwhash_str_alg);
|
|
EXPORT(crypto_pwhash_str_needs_rehash);
|
|
|
|
EXPORT(crypto_pwhash_alg_default);
|
|
EXPORT(crypto_pwhash_alg_argon2id13);
|
|
EXPORT(crypto_pwhash_alg_argon2i13);
|
|
EXPORT(crypto_pwhash_primitive);
|
|
|
|
EXPORT(crypto_pwhash_bytes_max);
|
|
EXPORT(crypto_pwhash_bytes_min);
|
|
EXPORT(crypto_pwhash_opslimit_max);
|
|
EXPORT(crypto_pwhash_opslimit_min);
|
|
EXPORT(crypto_pwhash_opslimit_interactive);
|
|
EXPORT(crypto_pwhash_opslimit_sensitive);
|
|
EXPORT(crypto_pwhash_memlimit_max);
|
|
EXPORT(crypto_pwhash_memlimit_min);
|
|
EXPORT(crypto_pwhash_memlimit_interactive);
|
|
EXPORT(crypto_pwhash_memlimit_sensitive);
|
|
EXPORT(crypto_pwhash_passwd_max);
|
|
EXPORT(crypto_pwhash_passwd_min);
|
|
EXPORT(crypto_pwhash_saltbytes);
|
|
EXPORT(crypto_pwhash_strbytes);
|
|
EXPORT(crypto_pwhash_strprefix);
|
|
|
|
EXPORT(crypto_pwhash_alg_default);
|
|
EXPORT(crypto_pwhash_alg_argon2i13);
|
|
EXPORT(crypto_pwhash_alg_argon2id13);
|
|
|
|
EXPORT(crypto_pwhash_strprefix);
|
|
EXPORT(crypto_pwhash_primitive);
|
|
|
|
EXPORT_INT(crypto_pwhash_BYTES_MAX);
|
|
EXPORT_INT(crypto_pwhash_BYTES_MIN);
|
|
EXPORT_INT(crypto_pwhash_OPSLIMIT_MAX);
|
|
EXPORT_INT(crypto_pwhash_OPSLIMIT_MIN);
|
|
EXPORT_INT(crypto_pwhash_OPSLIMIT_INTERACTIVE);
|
|
EXPORT_INT(crypto_pwhash_OPSLIMIT_SENSITIVE);
|
|
EXPORT_INT(crypto_pwhash_MEMLIMIT_MAX);
|
|
EXPORT_INT(crypto_pwhash_MEMLIMIT_MIN);
|
|
EXPORT_INT(crypto_pwhash_MEMLIMIT_INTERACTIVE);
|
|
EXPORT_INT(crypto_pwhash_MEMLIMIT_SENSITIVE);
|
|
EXPORT_INT(crypto_pwhash_PASSWD_MAX);
|
|
EXPORT_INT(crypto_pwhash_PASSWD_MIN);
|
|
EXPORT_INT(crypto_pwhash_SALTBYTES);
|
|
EXPORT_INT(crypto_pwhash_STRBYTES);
|
|
EXPORT_INT(crypto_pwhash_ALG_DEFAULT);
|
|
EXPORT_INT(crypto_pwhash_ALG_ARGON2I13);
|
|
EXPORT_INT(crypto_pwhash_ALG_ARGON2ID13);
|
|
|
|
EXPORT_STRING(crypto_pwhash_STRPREFIX);
|
|
EXPORT_STRING(crypto_pwhash_PRIMITIVE);
|
|
} |