From 6a75b623da6f83038c07c90c66b872e25da822a8 Mon Sep 17 00:00:00 2001 From: Piotr Sikora Date: Thu, 15 Oct 2020 22:01:48 -0700 Subject: [PATCH] Export wasi_random_get(). (#68) Signed-off-by: Piotr Sikora --- BUILD | 1 + WORKSPACE | 7 +++++++ include/proxy-wasm/exports.h | 1 + src/exports.cc | 13 +++++++++++++ src/wasm.cc | 1 + 5 files changed, 23 insertions(+) diff --git a/BUILD b/BUILD index cb621c3f..1aa823d9 100644 --- a/BUILD +++ b/BUILD @@ -33,6 +33,7 @@ cc_library( copts = COPTS, deps = [ ":include", + "@boringssl//:crypto", "@com_google_protobuf//:protobuf_lite", "@proxy_wasm_cpp_sdk//:api_lib", ], diff --git a/WORKSPACE b/WORKSPACE index 07645ef6..bc20f1fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -38,6 +38,13 @@ git_repository( shallow_since = "1565024848 -0700", ) +http_archive( + name = "boringssl", + sha256 = "bb55b0ed2f0cb548b5dce6a6b8307ce37f7f748eb9f1be6bfe2d266ff2b4d52b", + strip_prefix = "boringssl-2192bbc878822cf6ab5977d4257a1339453d9d39", + urls = ["https://github.com/google/boringssl/archive/2192bbc878822cf6ab5977d4257a1339453d9d39.tar.gz"], +) + http_archive( name = "com_google_googletest", sha256 = "9dc9157a9a1551ec7a7e43daea9a694a0bb5fb8bec81235d8a1e6ef64c716dcb", diff --git a/include/proxy-wasm/exports.h b/include/proxy-wasm/exports.h index 24b41d9c..f0fa5dbf 100644 --- a/include/proxy-wasm/exports.h +++ b/include/proxy-wasm/exports.h @@ -145,6 +145,7 @@ Word wasi_unstable_args_get(void *raw_context, Word argc_ptr, Word argv_buf_size Word wasi_unstable_args_sizes_get(void *raw_context, Word argc_ptr, Word argv_buf_size_ptr); void wasi_unstable_proc_exit(void *, Word); Word wasi_unstable_clock_time_get(void *, Word, uint64_t, Word); +Word wasi_unstable_random_get(void *, Word, Word); Word pthread_equal(void *, Word left, Word right); // Support for embedders, not exported to Wasm. diff --git a/src/exports.cc b/src/exports.cc index 73a44c55..cda12514 100644 --- a/src/exports.cc +++ b/src/exports.cc @@ -15,6 +15,8 @@ // #include "include/proxy-wasm/wasm.h" +#include + #define WASM_CONTEXT(_c) \ (ContextOrEffectiveContext(static_cast((void)_c, current_context_))) @@ -814,6 +816,17 @@ Word wasi_unstable_clock_time_get(void *raw_context, Word clock_id, uint64_t pre return 0; // __WASI_ESUCCESS } +// __wasi_errno_t __wasi_random_get(uint8_t *buf, size_t buf_len); +Word wasi_unstable_random_get(void *raw_context, Word result_buf_ptr, Word buf_len) { + auto context = WASM_CONTEXT(raw_context); + std::vector random(buf_len); + RAND_bytes(random.data(), random.size()); + if (!context->wasmVm()->setMemory(result_buf_ptr, random.size(), random.data())) { + return 21; // __WASI_EFAULT + } + return 0; // __WASI_ESUCCESS +} + // void __wasi_proc_exit(__wasi_exitcode_t rval); void wasi_unstable_proc_exit(void *raw_context, Word) { auto context = WASM_CONTEXT(raw_context); diff --git a/src/wasm.cc b/src/wasm.cc index e3eb2329..3a055c52 100644 --- a/src/wasm.cc +++ b/src/wasm.cc @@ -132,6 +132,7 @@ void WasmBase::registerCallbacks() { _REGISTER_WASI(args_get); _REGISTER_WASI(args_sizes_get); _REGISTER_WASI(clock_time_get); + _REGISTER_WASI(random_get); _REGISTER_WASI(proc_exit); #undef _REGISTER_WASI