From 70e7836db11a1fbe494f46278af4483790feed69 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Mon, 15 Apr 2019 14:11:23 -0700 Subject: [PATCH] Added random number helpers --- microscript/ILibDuktape_Polyfills.c | 28 ++++++++++++++++++++++++ microscript/ILibDuktape_net.c | 33 ++++++----------------------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 69b988a..994c2d8 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -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) { diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index 4d78c12..c4e4275 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -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