@@ -141,18 +141,60 @@ void KernelMain::MakeV8Snapshot() {
141141}
142142
143143const char * runtime_rng_name () {
144- return " runtimejs" ;
144+ return " runtimejs" ;
145145}
146146
147147uint32_t runtime_rng_random () {
148+ // prevent abort()
149+ if (GLOBAL_engines ()) {
150+ v8::Isolate* iv8 = GLOBAL_engines ()->cpu_engine ()->thread_manager ()->current_thread ()->IsolateV8 ();
151+ v8::Local<v8::Context> context = iv8->GetCurrentContext ();
152+
153+ v8::Local<v8::Object> global = context->Global ();
154+ v8::Local<v8::Object> runtimeObj = global->Get (context, v8::String::NewFromUtf8 (iv8, " runtime" , v8::NewStringType::kNormal ).ToLocalChecked ()).ToLocalChecked ()->ToObject ();
155+ v8::Local<v8::Object> runtimeRandomObj = runtimeObj->Get (context, v8::String::NewFromUtf8 (iv8, " random" , v8::NewStringType::kNormal ).ToLocalChecked ()).ToLocalChecked ()->ToObject ();
156+ v8::Local<v8::Function> runtimeRandomGetRandomValuesFunc = v8::Local<v8::Function>::Cast (runtimeRandomObj->Get (context, v8::String::NewFromUtf8 (iv8, " getRandomValues" , v8::NewStringType::kNormal ).ToLocalChecked ()).ToLocalChecked ());
157+
158+ v8::Local<v8::Value> args[1 ] = { v8::Number::New (iv8, 1 ) };
159+
160+ // js equivalent: runtime.random.getRandomValues.apply(undefined, [1])
161+ v8::Local<v8::Object> u8Array = runtimeRandomGetRandomValuesFunc->Call (context, v8::Undefined (iv8), 1 , args).ToLocalChecked ()->ToObject (context).ToLocalChecked ();
162+ return (uint8_t )(u8Array->Get (0 )->ToNumber ()->Value ());
163+ } else {
164+ // mainly when libsodium is intialized, which is before V8 is available
165+ printf (" [randombytes] fallback used\n " );
148166 return 42 ;
167+ }
149168}
150169
151170void runtime_rng_buf (void * const buf, const size_t size) {
152- uint8_t * b = reinterpret_cast <uint8_t *>(buf);
171+ uint8_t * b = reinterpret_cast <uint8_t *>(buf);
172+
173+ // prevent abort()
174+ if (GLOBAL_engines ()) {
175+ v8::Isolate* iv8 = GLOBAL_engines ()->cpu_engine ()->thread_manager ()->current_thread ()->IsolateV8 ();
176+ v8::Local<v8::Context> context = iv8->GetCurrentContext ();
177+
178+ v8::Local<v8::Object> global = context->Global ();
179+ v8::Local<v8::Object> runtimeObj = global->Get (context, v8::String::NewFromUtf8 (iv8, " runtime" , v8::NewStringType::kNormal ).ToLocalChecked ()).ToLocalChecked ()->ToObject ();
180+ v8::Local<v8::Object> runtimeRandomObj = runtimeObj->Get (context, v8::String::NewFromUtf8 (iv8, " random" , v8::NewStringType::kNormal ).ToLocalChecked ()).ToLocalChecked ()->ToObject ();
181+ v8::Local<v8::Function> runtimeRandomGetRandomValuesFunc = v8::Local<v8::Function>::Cast (runtimeRandomObj->Get (context, v8::String::NewFromUtf8 (iv8, " getRandomValues" , v8::NewStringType::kNormal ).ToLocalChecked ()).ToLocalChecked ());
182+
183+ v8::Local<v8::Value> args[1 ] = { v8::Number::New (iv8, size) };
184+
185+ // js equivalent: runtime.random.getRandomValues.apply(undefined, [size])
186+ v8::Local<v8::Object> u8Array = runtimeRandomGetRandomValuesFunc->Call (context, v8::Undefined (iv8), 1 , args).ToLocalChecked ()->ToObject (context).ToLocalChecked ();
187+
153188 for (size_t i = 0 ; i < size; ++i) {
154- b[i] = 42 ;
189+ b[i] = ( uint8_t )u8Array-> Get (i)-> ToNumber ()-> Value () ;
155190 }
191+ } else {
192+ // mainly when libsodium is intialized, which is before V8 is available
193+ printf (" [randombytes] fallback used\n " );
194+ for (size_t i = 0 ; i < size; ++i) {
195+ b[i] = 42 ;
196+ }
197+ }
156198}
157199
158200void KernelMain::InitSystemBSP (void * mbt) {
0 commit comments