summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--extensions/crypto/01_crypto.js6
-rw-r--r--extensions/crypto/Cargo.toml1
-rw-r--r--extensions/crypto/lib.deno_crypto.d.ts1
-rw-r--r--extensions/crypto/lib.rs30
-rw-r--r--tools/wpt/expectation.json5
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,