summaryrefslogtreecommitdiff
path: root/js/get_random_values.ts
diff options
context:
space:
mode:
authorchiefbiiko <noah.anabiik.schwarz@gmail.com>2019-05-17 20:03:01 +0200
committerRyan Dahl <ry@tinyclouds.org>2019-05-17 14:03:01 -0400
commit00f6fa46b34b78e926a907ee24faec78a65eafc1 (patch)
tree856ba74eb30c595f98683d0aa3161c73caa13e5e /js/get_random_values.ts
parent7f6549532c22e5e58deb37334fca06c949902e5f (diff)
Add crypto.getRandomValues() (#2327)
Diffstat (limited to 'js/get_random_values.ts')
-rw-r--r--js/get_random_values.ts35
1 files changed, 35 insertions, 0 deletions
diff --git a/js/get_random_values.ts b/js/get_random_values.ts
new file mode 100644
index 000000000..eb46ed009
--- /dev/null
+++ b/js/get_random_values.ts
@@ -0,0 +1,35 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import * as msg from "gen/cli/msg_generated";
+import * as flatbuffers from "./flatbuffers";
+import * as dispatch from "./dispatch";
+import { assert } from "./util";
+
+function req(
+ typedArray: ArrayBufferView
+): [flatbuffers.Builder, msg.Any, flatbuffers.Offset, ArrayBufferView] {
+ const builder = flatbuffers.createBuilder();
+ const inner = msg.GetRandomValues.createGetRandomValues(builder);
+ return [builder, msg.Any.GetRandomValues, inner, typedArray];
+}
+
+/** Synchronously collects cryptographically secure random values. The
+ * underlying CSPRNG in use is Rust's `rand::rngs::ThreadRng`.
+ *
+ * const arr = new Uint8Array(32);
+ * crypto.getRandomValues(arr);
+ */
+export function getRandomValues<
+ T extends
+ | Int8Array
+ | Uint8Array
+ | Uint8ClampedArray
+ | Int16Array
+ | Uint16Array
+ | Int32Array
+ | Uint32Array
+>(typedArray: T): T {
+ assert(typedArray !== null, "Input must not be null");
+ assert(typedArray.length <= 65536, "Input must not be longer than 65536");
+ dispatch.sendSync(...req(typedArray as ArrayBufferView));
+ return typedArray;
+}