1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2026-01-08 19:44:06 +00:00

Added random number helpers

This commit is contained in:
Bryan Roe
2019-04-15 14:11:23 -07:00
parent 094918c400
commit 70e7836db1
2 changed files with 34 additions and 27 deletions

View File

@@ -1747,6 +1747,15 @@ duk_ret_t ILibDuktape_bignum_mod(duk_context* ctx)
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
return(1);
}
duk_ret_t ILibDuktape_bignum_cmp(duk_context *ctx)
{
BIGNUM *r1, *r2;
duk_push_this(ctx);
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
duk_push_int(ctx, BN_cmp(r2, r1));
return(1);
}
duk_ret_t ILibDuktape_bignum_finalizer(duk_context *ctx)
{
@@ -1767,9 +1776,20 @@ void ILibDuktape_bignum_addBigNumMethods(duk_context *ctx, BIGNUM *b)
ILibDuktape_CreateInstanceMethod(ctx, "mul", ILibDuktape_bignum_mul, 1);
ILibDuktape_CreateInstanceMethod(ctx, "div", ILibDuktape_bignum_div, 1);
ILibDuktape_CreateInstanceMethod(ctx, "mod", ILibDuktape_bignum_mod, 1);
ILibDuktape_CreateInstanceMethod(ctx, "cmp", ILibDuktape_bignum_cmp, 1);
duk_push_c_function(ctx, ILibDuktape_bignum_finalizer, 1); duk_set_finalizer(ctx, -2);
duk_eval_string(ctx, "(function toNumber(){return(parseInt(this.toString()));})"); duk_put_prop_string(ctx, -2, "toNumber");
}
duk_ret_t ILibDuktape_bignum_random(duk_context *ctx)
{
BIGNUM *r = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
BIGNUM *rnd = BN_new();
if (BN_rand_range(rnd, r) == 0) { return(ILibDuktape_Error(ctx, "Error Generating Random Number")); }
ILibDuktape_bignum_addBigNumMethods(ctx, rnd);
return(1);
}
duk_ret_t ILibDuktape_bignum_fromBuffer(duk_context *ctx)
{
char *endian = duk_get_top(ctx) > 1 ? Duktape_GetStringPropertyValue(ctx, 1, "endian", "big") : "big";
@@ -1805,6 +1825,14 @@ void ILibDuktape_bignum_Push(duk_context *ctx, void *chain)
{
duk_push_c_function(ctx, ILibDuktape_bignum_func, DUK_VARARGS);
duk_push_c_function(ctx, ILibDuktape_bignum_fromBuffer, DUK_VARARGS); duk_put_prop_string(ctx, -2, "fromBuffer");
duk_push_c_function(ctx, ILibDuktape_bignum_random, DUK_VARARGS); duk_put_prop_string(ctx, -2, "random");
char randRange[] = "exports.randomRange = function randomRange(low, high)\
{\
var result = exports.random(high.sub(low)).add(low);\
return(result);\
};";
ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(ctx, randRange, sizeof(randRange) - 1);
}
void ILibDuktape_dataGenerator_onPause(struct ILibDuktape_readableStream *sender, void *user)
{

View File

@@ -1568,33 +1568,7 @@ duk_ret_t ILibDuktape_TLS_loadpkcs7b(duk_context *ctx)
return(ILibDuktape_Error(ctx, "Error reading pkcs7b data"));
}
}
duk_ret_t ILibDuktape_TLS_generateRandomInteger(duk_context *ctx)
{
char *low = (char*)duk_require_string(ctx, 0);
char *hi = (char*)duk_require_string(ctx, 1);
BN_CTX *binctx = BN_CTX_new();
BIGNUM *bnlow = NULL;
BIGNUM *bnhi = NULL;
BN_dec2bn(&bnlow, low);
BN_dec2bn(&bnhi, hi);
if (BN_rand_range(bnlow, bnhi) == 0)
{
return(ILibDuktape_Error(ctx, "Error calling BN_rand_range()"));
}
else
{
char *v = BN_bn2dec(bnlow);
duk_push_string(ctx, v);
OPENSSL_free(v);
}
BN_free(bnlow);
BN_free(bnhi);
BN_CTX_free(binctx);
return(1);
}
duk_ret_t ILibDuktape_TLS_loadCertificate_finalizer(duk_context *ctx)
{
struct util_cert *cert = (struct util_cert*)Duktape_GetBufferProperty(ctx, 0, ILibDuktape_TLS_util_cert);
@@ -1672,8 +1646,13 @@ void ILibDuktape_tls_PUSH(duk_context *ctx, void *chain)
ILibDuktape_CreateInstanceMethod(ctx, "createSecureContext", ILibDuktape_TLS_createSecureContext, 1);
ILibDuktape_CreateInstanceMethod(ctx, "generateCertificate", ILibDuktape_TLS_generateCertificate, 1);
ILibDuktape_CreateInstanceMethod(ctx, "loadCertificate", ILibDuktape_TLS_loadCertificate, 1);
ILibDuktape_CreateInstanceMethod(ctx, "generateRandomInteger", ILibDuktape_TLS_generateRandomInteger, 2);
ILibDuktape_CreateInstanceMethod(ctx, "loadpkcs7b", ILibDuktape_TLS_loadpkcs7b, 1);
char generateRandomInteger[] = "exports.generateRandomInteger = function generateRandomInteger(low, high)\
{\
return(require('bignum').randomRange(require('bignum')(low), require('bignum')(high)).toString());\
};";
ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(ctx, generateRandomInteger, sizeof(generateRandomInteger) - 1);
}
#endif