diff options
author | Leo K <crowlkats@toaxl.com> | 2021-06-05 14:46:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-05 14:46:24 +0200 |
commit | cf351f77c2c05255c211196957b551db871f2699 (patch) | |
tree | d3d44a1058eb8d1f609d111c236a201e76694759 | |
parent | e8be116ab6d06bed764ad9b6cb253d8de36ae73d (diff) |
feat(extensions/crypto): implement randomUUID (#10848)
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | extensions/crypto/01_crypto.js | 6 | ||||
-rw-r--r-- | extensions/crypto/Cargo.toml | 1 | ||||
-rw-r--r-- | extensions/crypto/lib.deno_crypto.d.ts | 1 | ||||
-rw-r--r-- | extensions/crypto/lib.rs | 30 | ||||
-rw-r--r-- | tools/wpt/expectation.json | 5 |
6 files changed, 38 insertions, 6 deletions
diff --git a/Cargo.lock b/Cargo.lock index c1e756854..a28d90d6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -645,6 +645,7 @@ version = "0.21.1" dependencies = [ "deno_core", "rand 0.8.3", + "uuid", ] [[package]] diff --git a/extensions/crypto/01_crypto.js b/extensions/crypto/01_crypto.js index dba6b0091..627035c28 100644 --- a/extensions/crypto/01_crypto.js +++ b/extensions/crypto/01_crypto.js @@ -41,10 +41,16 @@ return arrayBufferView; } + function randomUUID() { + return core.opSync("op_crypto_random_uuid"); + } + window.crypto = { getRandomValues, + randomUUID, }; window.__bootstrap.crypto = { getRandomValues, + randomUUID, }; })(this); diff --git a/extensions/crypto/Cargo.toml b/extensions/crypto/Cargo.toml index fa0a6634e..8b919b611 100644 --- a/extensions/crypto/Cargo.toml +++ b/extensions/crypto/Cargo.toml @@ -16,3 +16,4 @@ path = "lib.rs" [dependencies] deno_core = { version = "0.88.1", path = "../../core" } rand = "0.8.3" +uuid = { version = "0.8.2", features = ["v4"] } diff --git a/extensions/crypto/lib.deno_crypto.d.ts b/extensions/crypto/lib.deno_crypto.d.ts index a00757e71..854696676 100644 --- a/extensions/crypto/lib.deno_crypto.d.ts +++ b/extensions/crypto/lib.deno_crypto.d.ts @@ -23,4 +23,5 @@ declare interface Crypto { >( array: T, ): T; + randomUUID(): string; } diff --git a/extensions/crypto/lib.rs b/extensions/crypto/lib.rs index 45473f4d5..bf4174f75 100644 --- a/extensions/crypto/lib.rs +++ b/extensions/crypto/lib.rs @@ -21,10 +21,13 @@ pub fn init(maybe_seed: Option<u64>) -> Extension { prefix "deno:extensions/crypto", "01_crypto.js", )) - .ops(vec![( - "op_crypto_get_random_values", - op_sync(op_crypto_get_random_values), - )]) + .ops(vec![ + ( + "op_crypto_get_random_values", + op_sync(op_crypto_get_random_values), + ), + ("op_crypto_random_uuid", op_sync(op_crypto_random_uuid)), + ]) .state(move |state| { if let Some(seed) = maybe_seed { state.put(StdRng::seed_from_u64(seed)); @@ -51,6 +54,25 @@ pub fn op_crypto_get_random_values( Ok(()) } +pub fn op_crypto_random_uuid( + state: &mut OpState, + _args: (), + _zero_copy: (), +) -> Result<String, AnyError> { + let maybe_seeded_rng = state.try_borrow_mut::<StdRng>(); + let uuid = if let Some(seeded_rng) = maybe_seeded_rng { + let mut bytes = [0u8; 16]; + seeded_rng.fill(&mut bytes); + uuid::Builder::from_bytes(bytes) + .set_version(uuid::Version::Random) + .build() + } else { + uuid::Uuid::new_v4() + }; + + Ok(uuid.to_string()) +} + pub fn get_declaration() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_crypto.d.ts") } diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json index 83e4d7c94..93214d001 100644 --- a/tools/wpt/expectation.json +++ b/tools/wpt/expectation.json @@ -146,7 +146,7 @@ "rsa_importKey.https.any.html": false, "symmetric_importKey.https.any.html": false }, - "randomUUID.https.any.html": false, + "randomUUID.https.any.html": true, "sign_verify": { "ecdsa.https.any.html": false, "hmac.https.any.html": false, @@ -155,7 +155,8 @@ }, "wrapKey_unwrapKey": { "wrapKey_unwrapKey.https.any.html": false - } + }, + "randomUUID.any.html": true }, "console": { "console-is-a-namespace.any.html": true, |