Replace JS snippet with WASI call for random byte generation #980
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Changelog
Context
We want to produce a WASM module that doesn't depend on JavaScript function calls to work, only in WASI, so that it can be used from other languages. This PR modifies the call used to generate random ByteStrings so that it doesn't depend on JavaScript but uses the
random_getprimitive from WASI. Which is described as producing high quality randomness, and is actually implemented in terms ofcrypto.getRandomValuesin the shim we use.How to trust this PR
It is tricky, because it is really sensitive code, and the code is quite simple, but it does rely on the WASI implementation underneath. I will do some testing and you can see the implementation in the shim we are currently using for JS here: https://github.com/bjorn3/browser_wasi_shim/blob/8dee2473332e540b3f3a9c59259dd027dc1e6853/src/wasi.ts#L886
Something worrying is It seems it uses
Math.random()as fallback, which is not cryptographically secure. But until we can include WASI2, this seems the best primitive.Checklist