From b7f2c7576f0a9c44053f5ea13fd47494b8804340 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 24 Apr 2025 15:47:36 -0400 Subject: [PATCH 1/6] Add support for getentropy in d8 --- src/lib/libwasi.js | 15 +++++++++++++++ src/modules.mjs | 2 +- test/test_other.py | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/lib/libwasi.js b/src/lib/libwasi.js index 4e0ac85d7ba39..de874ccf868ca 100644 --- a/src/lib/libwasi.js +++ b/src/lib/libwasi.js @@ -567,6 +567,9 @@ var WasiLibrary = { // random.h +#if ENVIRONMENT_MAY_BE_SHELL + $initRandomFill__deps: ['$base64Decode'], +#endif $initRandomFill: () => { #if ENVIRONMENT_MAY_BE_NODE && MIN_NODE_VERSION < 190000 // This block is not needed on v19+ since crypto.getRandomValues is builtin @@ -576,6 +579,18 @@ var WasiLibrary = { } #endif // ENVIRONMENT_MAY_BE_NODE +#if ENVIRONMENT_MAY_BE_SHELL + if (ENVIRONMENT_IS_SHELL) { + return (view) => { + if (!os.system) { + throw new Error('randomFill not supported on d8 unless --enable-os-system is passed'); + } + const b64 = os.system('sh', ['-c', `head -c${view.byteLength} /dev/urandom | base64 --wrap=0`]); + view.set(base64Decode(b64)); + }; + } +#endif + #if SHARED_MEMORY // like with most Web APIs, we can't use Web Crypto API directly on shared memory, // so we need to create an intermediate buffer and copy it to the destination diff --git a/src/modules.mjs b/src/modules.mjs index 13438486f594c..2f18c41c634d5 100644 --- a/src/modules.mjs +++ b/src/modules.mjs @@ -77,7 +77,7 @@ function calculateLibraries() { libraries.push('libmemoryprofiler.js'); } - if (SUPPORT_BASE64_EMBEDDING) { + if (SUPPORT_BASE64_EMBEDDING || ENVIRONMENT_MAY_BE_SHELL) { libraries.push('libbase64.js'); } diff --git a/test/test_other.py b/test/test_other.py index 767789eb075c8..9f6acfb45fe92 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -16028,3 +16028,21 @@ def test_js_base64_api(self): baseline_size = os.path.getsize('baseline.js') js_api_size = os.path.getsize('hello_world.js') self.assertLess(js_api_size, baseline_size) + + @requires_v8 + def test_getentropy_d8(self): + create_file('main.c', ''' + #include "assert.h" + #include + + int main() { + char buf[100]; + assert(getentropy(buf, sizeof(buf)) == 0); + return 0; + } + ''') + + msg = 'randomFill not supported on d8 unless --enable-os-system is passed' + self.do_runf('main.c', msg, assert_returncode=1) + self.v8_args += ['--enable-os-system'] + self.do_runf('main.c') From abecbe31b0a1b18bee572044ef4a909fb57b801b Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 24 Apr 2025 15:59:11 -0400 Subject: [PATCH 2/6] Use angle braces for assert include --- test/test_other.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_other.py b/test/test_other.py index 9f6acfb45fe92..e239a16521624 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -16032,7 +16032,7 @@ def test_js_base64_api(self): @requires_v8 def test_getentropy_d8(self): create_file('main.c', ''' - #include "assert.h" + #include #include int main() { From 51f7a73087c16f29bfae1e9d7aa38ed87a029714 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 24 Apr 2025 17:10:55 -0400 Subject: [PATCH 3/6] Add os.system to node-externs.js --- src/closure-externs/node-externs.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/closure-externs/node-externs.js b/src/closure-externs/node-externs.js index afb0c14d52d94..5809cfb5bc3fc 100644 --- a/src/closure-externs/node-externs.js +++ b/src/closure-externs/node-externs.js @@ -144,3 +144,15 @@ path.isAbsolute; path.posix; crypto.randomFillSync; + + +// d8 + +var os; + +/** + * @param {string} cmd + * @param {Array.=} args + * @return {string} + */ +os.system = function (cmd, args) {}; From 378776975d13a751fabd5b5c66e7726f0fe64f17 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Fri, 25 Apr 2025 13:41:29 -0400 Subject: [PATCH 4/6] Move definitions to v8-externs.js --- src/closure-externs/node-externs.js | 12 ------------ src/closure-externs/v8-externs.js | 9 +++++++++ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/closure-externs/node-externs.js b/src/closure-externs/node-externs.js index 5809cfb5bc3fc..afb0c14d52d94 100644 --- a/src/closure-externs/node-externs.js +++ b/src/closure-externs/node-externs.js @@ -144,15 +144,3 @@ path.isAbsolute; path.posix; crypto.randomFillSync; - - -// d8 - -var os; - -/** - * @param {string} cmd - * @param {Array.=} args - * @return {string} - */ -os.system = function (cmd, args) {}; diff --git a/src/closure-externs/v8-externs.js b/src/closure-externs/v8-externs.js index 11eda1ddff882..0e5304d34725f 100644 --- a/src/closure-externs/v8-externs.js +++ b/src/closure-externs/v8-externs.js @@ -32,3 +32,12 @@ var scriptArgs = []; * @suppress {duplicate} */ var quit = function(status) {}; + +var os; + +/** + * @param {string} cmd + * @param {Array.=} args + * @return {string} + */ +os.system = function (cmd, args) {}; From 4bc7c3f85b2e0a6365f4b15d53d66fe296b9105d Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Fri, 25 Apr 2025 16:18:53 -0400 Subject: [PATCH 5/6] Get rid of 'var os' --- src/closure-externs/v8-externs.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/closure-externs/v8-externs.js b/src/closure-externs/v8-externs.js index 0e5304d34725f..4f602ac2cdc82 100644 --- a/src/closure-externs/v8-externs.js +++ b/src/closure-externs/v8-externs.js @@ -33,8 +33,6 @@ var scriptArgs = []; */ var quit = function(status) {}; -var os; - /** * @param {string} cmd * @param {Array.=} args From 2329acf6947f4f1c75f427cb40b19acff6f63e5b Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Fri, 25 Apr 2025 17:25:37 -0400 Subject: [PATCH 6/6] Fix --- src/closure-externs/closure-externs.js | 3 +++ third_party/closure-compiler/node-externs/os.js | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/closure-externs/closure-externs.js b/src/closure-externs/closure-externs.js index 99f417710e6d5..66f79e7d2a36e 100644 --- a/src/closure-externs/closure-externs.js +++ b/src/closure-externs/closure-externs.js @@ -268,3 +268,6 @@ Navigator.prototype.webkitGetUserMedia = function( * @type {symbol} */ Symbol.dispose; + +// Common between node-externs and v8-externs +var os = {}; diff --git a/third_party/closure-compiler/node-externs/os.js b/third_party/closure-compiler/node-externs/os.js index c0cdeff95d171..fabf75e27da69 100644 --- a/third_party/closure-compiler/node-externs/os.js +++ b/third_party/closure-compiler/node-externs/os.js @@ -27,7 +27,6 @@ END_NODE_INCLUDE */ -var os = {}; /** * @return {string}