JavaScript: faster randomness generation

Fill entire buffers directly.
This commit is contained in:
Frank Denis
2026-01-13 23:00:03 +01:00
parent 4a7692a723
commit e7c1796015
2 changed files with 56 additions and 5 deletions
+18
View File
@@ -120,6 +120,20 @@ if [ "$DIST" = yes ]; then
};
randomValuesStandard();
Module.getRandomValue = randomValuesStandard;
Module.getRandomBytes = function(ptr, size) {
var heapu8 = Module.HEAPU8;
var chunk = 65536;
while (size > chunk) {
var buf = new Uint8Array(chunk);
crypto_.getRandomValues(buf);
heapu8.set(buf, ptr);
ptr += chunk;
size -= chunk;
}
var buf = new Uint8Array(size);
crypto_.getRandomValues(buf);
heapu8.set(buf, ptr);
};
} catch (e) {
try {
var crypto = require('crypto');
@@ -129,6 +143,10 @@ if [ "$DIST" = yes ]; then
};
randomValueNodeJS();
Module.getRandomValue = randomValueNodeJS;
Module.getRandomBytes = function(ptr, size) {
var buf = crypto['randomBytes'](size);
Module.HEAPU8.set(buf, ptr);
};
} catch (e) {
throw 'No secure random number generator found';
}
+38 -5
View File
@@ -65,6 +65,20 @@ javascript_stir(void)
};
randomValuesStandard();
Module.getRandomValue = randomValuesStandard;
Module.getRandomBytes = function(ptr, size) {
var heapu8 = Module.HEAPU8;
var chunk = 65536;
while (size > chunk) {
var buf = new Uint8Array(chunk);
crypto_.getRandomValues(buf);
heapu8.set(buf, ptr);
ptr += chunk;
size -= chunk;
}
var buf = new Uint8Array(size);
crypto_.getRandomValues(buf);
heapu8.set(buf, ptr);
};
} catch (e) {
try {
var crypto = require('crypto');
@@ -74,22 +88,41 @@ javascript_stir(void)
};
randomValueNodeJS();
Module.getRandomValue = randomValueNodeJS;
Module.getRandomBytes = function(ptr, size) {
var buf = crypto['randomBytes'](size);
Module.HEAPU8.set(buf, ptr);
};
} catch (e) {
throw 'No secure random number generator found';
}
}
}
if (Module.getRandomBytes === undefined) {
Module.getRandomBytes = function(ptr, size) {
var heapu8 = Module.HEAPU8;
for (var i = 0; i < size; i++) {
heapu8[ptr + i] = Module.getRandomValue() & 0xff;
}
};
}
});
}
static void
javascript_buf(void * const buf, const size_t size)
{
unsigned char *p = (unsigned char *) buf;
size_t i;
for (i = (size_t) 0U; i < size; i++) {
p[i] = (unsigned char) randombytes_random();
if (size > (size_t) 0U) {
EM_ASM({
if (Module.getRandomBytes === undefined) {
Module.getRandomBytes = function(ptr, size) {
var heapu8 = Module.HEAPU8;
for (var i = 0; i < size; i++) {
heapu8[ptr + i] = Module.getRandomValue() & 0xff;
}
};
}
Module.getRandomBytes($0, $1);
}, buf, size);
}
}
#endif