summaryrefslogtreecommitdiff
path: root/extensions/crypto/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/crypto/lib.rs')
-rw-r--r--extensions/crypto/lib.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/extensions/crypto/lib.rs b/extensions/crypto/lib.rs
new file mode 100644
index 000000000..45473f4d5
--- /dev/null
+++ b/extensions/crypto/lib.rs
@@ -0,0 +1,56 @@
+// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
+
+use deno_core::error::null_opbuf;
+use deno_core::error::AnyError;
+use deno_core::include_js_files;
+use deno_core::op_sync;
+use deno_core::Extension;
+use deno_core::OpState;
+use deno_core::ZeroCopyBuf;
+use rand::rngs::StdRng;
+use rand::thread_rng;
+use rand::Rng;
+use rand::SeedableRng;
+use std::path::PathBuf;
+
+pub use rand; // Re-export rand
+
+pub fn init(maybe_seed: Option<u64>) -> Extension {
+ Extension::builder()
+ .js(include_js_files!(
+ prefix "deno:extensions/crypto",
+ "01_crypto.js",
+ ))
+ .ops(vec![(
+ "op_crypto_get_random_values",
+ op_sync(op_crypto_get_random_values),
+ )])
+ .state(move |state| {
+ if let Some(seed) = maybe_seed {
+ state.put(StdRng::seed_from_u64(seed));
+ }
+ Ok(())
+ })
+ .build()
+}
+
+pub fn op_crypto_get_random_values(
+ state: &mut OpState,
+ _args: (),
+ zero_copy: Option<ZeroCopyBuf>,
+) -> Result<(), AnyError> {
+ let mut zero_copy = zero_copy.ok_or_else(null_opbuf)?;
+ let maybe_seeded_rng = state.try_borrow_mut::<StdRng>();
+ if let Some(seeded_rng) = maybe_seeded_rng {
+ seeded_rng.fill(&mut *zero_copy);
+ } else {
+ let mut rng = thread_rng();
+ rng.fill(&mut *zero_copy);
+ }
+
+ Ok(())
+}
+
+pub fn get_declaration() -> PathBuf {
+ PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_crypto.d.ts")
+}