2021-10-24 11:46:30 -04:00
|
|
|
#include "bcrypt.js.h"
|
2021-01-02 13:10:00 -05:00
|
|
|
|
2023-10-22 13:26:53 -04:00
|
|
|
#include "task.h"
|
|
|
|
|
2021-01-02 13:10:00 -05:00
|
|
|
#include "ow-crypt.h"
|
2023-05-21 17:36:51 -04:00
|
|
|
#include "quickjs.h"
|
2024-02-10 11:50:00 -05:00
|
|
|
#include "uv.h"
|
2023-05-21 17:36:51 -04:00
|
|
|
|
2024-02-10 11:50:00 -05:00
|
|
|
static JSValue _crypt_hashpw(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
2021-10-10 17:51:38 -04:00
|
|
|
{
|
2021-01-02 13:10:00 -05:00
|
|
|
const char* key = JS_ToCString(context, argv[0]);
|
|
|
|
const char* salt = JS_ToCString(context, argv[1]);
|
|
|
|
char output[7 + 22 + 31 + 1];
|
|
|
|
char* hash = crypt_rn(key, salt, output, sizeof(output));
|
|
|
|
JSValue result = JS_NewString(context, hash);
|
|
|
|
JS_FreeCString(context, key);
|
|
|
|
JS_FreeCString(context, salt);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2024-02-10 11:50:00 -05:00
|
|
|
static JSValue _crypt_gensalt(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
2021-10-10 17:51:38 -04:00
|
|
|
{
|
2023-03-19 16:25:50 -04:00
|
|
|
int length = 0;
|
2021-01-02 13:10:00 -05:00
|
|
|
JS_ToInt32(context, &length, argv[0]);
|
|
|
|
char buffer[16];
|
2023-10-22 13:26:53 -04:00
|
|
|
tf_task_t* task = tf_task_get(context);
|
|
|
|
size_t bytes = uv_random(tf_task_get_loop(task), &(uv_random_t) { 0 }, buffer, sizeof(buffer), 0, NULL) == 0 ? sizeof(buffer) : 0;
|
2021-01-02 13:10:00 -05:00
|
|
|
char output[7 + 22 + 1];
|
|
|
|
char* salt = crypt_gensalt_rn("$2b$", length, buffer, bytes, output, sizeof(output));
|
|
|
|
JSValue result = JS_NewString(context, salt);
|
|
|
|
return result;
|
|
|
|
}
|
2024-02-10 11:50:00 -05:00
|
|
|
|
|
|
|
void tf_bcrypt_register(JSContext* context)
|
|
|
|
{
|
|
|
|
JSValue global = JS_GetGlobalObject(context);
|
|
|
|
JSValue bcrypt = JS_NewObject(context);
|
|
|
|
JS_SetPropertyStr(context, global, "bCrypt", bcrypt);
|
|
|
|
JS_SetPropertyStr(context, bcrypt, "hashpw", JS_NewCFunction(context, _crypt_hashpw, "hashpw", 2));
|
|
|
|
JS_SetPropertyStr(context, bcrypt, "gensalt", JS_NewCFunction(context, _crypt_gensalt, "gensalt", 1));
|
|
|
|
JS_FreeValue(context, global);
|
|
|
|
}
|