diff options
Diffstat (limited to 'op_crates/crypto')
-rw-r--r-- | op_crates/crypto/01_crypto.js | 25 | ||||
-rw-r--r-- | op_crates/crypto/Cargo.toml | 19 | ||||
-rw-r--r-- | op_crates/crypto/README.md | 3 | ||||
-rw-r--r-- | op_crates/crypto/lib.rs | 43 |
4 files changed, 90 insertions, 0 deletions
diff --git a/op_crates/crypto/01_crypto.js b/op_crates/crypto/01_crypto.js new file mode 100644 index 000000000..2f9424492 --- /dev/null +++ b/op_crates/crypto/01_crypto.js @@ -0,0 +1,25 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +((window) => { + const core = window.Deno.core; + function getRandomValues(typedArray) { + if (typedArray == null) throw new Error("Input must not be null"); + if (typedArray.length > 65536) { + throw new Error("Input must not be longer than 65536"); + } + const ui8 = new Uint8Array( + typedArray.buffer, + typedArray.byteOffset, + typedArray.byteLength, + ); + core.jsonOpSync("op_get_random_values", {}, ui8); + return typedArray; + } + window.crypto = { + getRandomValues, + }; + window.__bootstrap = window.__bootstrap || {}; + window.__bootstrap.crypto = { + getRandomValues, + }; +})(this); diff --git a/op_crates/crypto/Cargo.toml b/op_crates/crypto/Cargo.toml new file mode 100644 index 000000000..3bcaf7490 --- /dev/null +++ b/op_crates/crypto/Cargo.toml @@ -0,0 +1,19 @@ +# Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +[package] +name = "deno_crypto" +version = "0.1.1" +edition = "2018" +description = "Collection of WebCrypto APIs" +authors = ["the Deno authors"] +license = "MIT" +readme = "README.md" +repository = "https://github.com/denoland/deno" + +[lib] +path = "lib.rs" + +[dependencies] +deno_core = { version = "0.67.0", path = "../../core" } +rand = "0.7.3" + diff --git a/op_crates/crypto/README.md b/op_crates/crypto/README.md new file mode 100644 index 000000000..0e1c248e6 --- /dev/null +++ b/op_crates/crypto/README.md @@ -0,0 +1,3 @@ +# deno crypto + +Op crate that implements crypto functions. diff --git a/op_crates/crypto/lib.rs b/op_crates/crypto/lib.rs new file mode 100644 index 000000000..a211a29b3 --- /dev/null +++ b/op_crates/crypto/lib.rs @@ -0,0 +1,43 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +#![deny(warnings)] + +use deno_core::error::AnyError; +use deno_core::serde_json::json; +use deno_core::serde_json::Value; +use deno_core::JsRuntime; +use deno_core::OpState; +use deno_core::ZeroCopyBuf; +use rand::rngs::StdRng; +use rand::thread_rng; +use rand::Rng; + +pub use rand; // Re-export rand + +/// Execute this crates' JS source files. +pub fn init(isolate: &mut JsRuntime) { + let files = vec![( + "deno:op_crates/crypto/01_crypto.js", + include_str!("01_crypto.js"), + )]; + for (url, source_code) in files { + isolate.execute(url, source_code).unwrap(); + } +} + +pub fn op_get_random_values( + state: &mut OpState, + _args: Value, + zero_copy: &mut [ZeroCopyBuf], +) -> Result<Value, AnyError> { + assert_eq!(zero_copy.len(), 1); + let maybe_seeded_rng = state.try_borrow_mut::<StdRng>(); + if let Some(seeded_rng) = maybe_seeded_rng { + seeded_rng.fill(&mut *zero_copy[0]); + } else { + let mut rng = thread_rng(); + rng.fill(&mut *zero_copy[0]); + } + + Ok(json!({})) +} |