From 478c592b131b21506e50ed1793b09689f0da456f Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 31 Jul 2021 15:10:18 +0200 Subject: [PATCH] wasm: add support for the crypto/rand package This is done via wasi-libc and the WASI interface, for ease of maintenance (only one implementation for both WASI and JS/browsers). --- main_test.go | 8 +++++++- src/crypto/rand/rand_getentropy.go | 2 +- targets/wasm_exec.js | 4 ++++ testdata/env.go | 23 ----------------------- testdata/env.txt | 1 - testdata/rand.go | 24 ++++++++++++++++++++++++ testdata/rand.txt | 1 + 7 files changed, 37 insertions(+), 26 deletions(-) create mode 100644 testdata/rand.go create mode 100644 testdata/rand.txt diff --git a/main_test.go b/main_test.go index 9ed0c6c5..2c1b2f86 100644 --- a/main_test.go +++ b/main_test.go @@ -162,7 +162,7 @@ func runPlatTests(target string, tests []string, t *testing.T) { runTest(name, target, t, nil, nil) }) } - if target == "wasi" || target == "" { + if target == "" || target == "wasi" { t.Run("filesystem.go", func(t *testing.T) { t.Parallel() runTest("filesystem.go", target, t, nil, nil) @@ -172,6 +172,12 @@ func runPlatTests(target string, tests []string, t *testing.T) { runTest("env.go", target, t, []string{"first", "second"}, []string{"ENV1=VALUE1", "ENV2=VALUE2"}) }) } + if target == "" || target == "wasi" || target == "wasm" { + t.Run("rand.go", func(t *testing.T) { + t.Parallel() + runTest("rand.go", target, t, nil, nil) + }) + } } // Due to some problems with LLD, we cannot run links in parallel, or in parallel with compiles. diff --git a/src/crypto/rand/rand_getentropy.go b/src/crypto/rand/rand_getentropy.go index 661132fb..4cd03795 100644 --- a/src/crypto/rand/rand_getentropy.go +++ b/src/crypto/rand/rand_getentropy.go @@ -1,4 +1,4 @@ -// +build darwin freebsd wasi +// +build darwin freebsd tinygo.wasm // This implementation of crypto/rand uses the getentropy system call (available // on both MacOS and WASI) to generate random numbers. diff --git a/targets/wasm_exec.js b/targets/wasm_exec.js index 21bfcda1..b0545abd 100644 --- a/targets/wasm_exec.js +++ b/targets/wasm_exec.js @@ -285,6 +285,10 @@ throw 'trying to exit with code ' + code; } }, + random_get: (bufPtr, bufLen) => { + crypto.getRandomValues(loadSlice(bufPtr, bufLen)); + return 0; + }, }, env: { // func ticks() float64 diff --git a/testdata/env.go b/testdata/env.go index 9c5bb5a8..115da6d3 100644 --- a/testdata/env.go +++ b/testdata/env.go @@ -1,7 +1,6 @@ package main import ( - "crypto/rand" "os" ) @@ -21,26 +20,4 @@ func main() { for _, arg := range os.Args[1:] { println("arg:", arg) } - - // Check for crypto/rand support. - checkRand() -} - -func checkRand() { - buf := make([]byte, 500) - n, err := rand.Read(buf) - if n != len(buf) || err != nil { - println("could not read random numbers:", err) - } - - // Very simple test that random numbers are at least somewhat random. - sum := 0 - for _, b := range buf { - sum += int(b) - } - if sum < 95*len(buf) || sum > 159*len(buf) { - println("random numbers don't seem that random, the average byte is", sum/len(buf)) - } else { - println("random number check was successful") - } } diff --git a/testdata/env.txt b/testdata/env.txt index e392cd5e..8ba50a7f 100644 --- a/testdata/env.txt +++ b/testdata/env.txt @@ -3,4 +3,3 @@ ENV2: VALUE2 arg: first arg: second -random number check was successful diff --git a/testdata/rand.go b/testdata/rand.go new file mode 100644 index 00000000..958b95c2 --- /dev/null +++ b/testdata/rand.go @@ -0,0 +1,24 @@ +package main + +import "crypto/rand" + +// TODO: make this a test in the crypto/rand package. + +func main() { + buf := make([]byte, 500) + n, err := rand.Read(buf) + if n != len(buf) || err != nil { + println("could not read random numbers:", err) + } + + // Very simple test that random numbers are at least somewhat random. + sum := 0 + for _, b := range buf { + sum += int(b) + } + if sum < 95*len(buf) || sum > 159*len(buf) { + println("random numbers don't seem that random, the average byte is", sum/len(buf)) + } else { + println("random number check was successful") + } +} diff --git a/testdata/rand.txt b/testdata/rand.txt new file mode 100644 index 00000000..d6b8162f --- /dev/null +++ b/testdata/rand.txt @@ -0,0 +1 @@ +random number check was successful