summaryrefslogtreecommitdiff
path: root/extensions/crypto/01_crypto.js
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/crypto/01_crypto.js')
-rw-r--r--extensions/crypto/01_crypto.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/extensions/crypto/01_crypto.js b/extensions/crypto/01_crypto.js
new file mode 100644
index 000000000..dba6b0091
--- /dev/null
+++ b/extensions/crypto/01_crypto.js
@@ -0,0 +1,50 @@
+// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
+"use strict";
+
+((window) => {
+ const core = window.Deno.core;
+
+ function getRandomValues(arrayBufferView) {
+ if (!ArrayBuffer.isView(arrayBufferView)) {
+ throw new TypeError(
+ "Argument 1 does not implement interface ArrayBufferView",
+ );
+ }
+ if (
+ !(
+ arrayBufferView instanceof Int8Array ||
+ arrayBufferView instanceof Uint8Array ||
+ arrayBufferView instanceof Int16Array ||
+ arrayBufferView instanceof Uint16Array ||
+ arrayBufferView instanceof Int32Array ||
+ arrayBufferView instanceof Uint32Array ||
+ arrayBufferView instanceof Uint8ClampedArray
+ )
+ ) {
+ throw new DOMException(
+ "The provided ArrayBufferView is not an integer array type",
+ "TypeMismatchError",
+ );
+ }
+ if (arrayBufferView.byteLength > 65536) {
+ throw new DOMException(
+ `The ArrayBufferView's byte length (${arrayBufferView.byteLength}) exceeds the number of bytes of entropy available via this API (65536)`,
+ "QuotaExceededError",
+ );
+ }
+ const ui8 = new Uint8Array(
+ arrayBufferView.buffer,
+ arrayBufferView.byteOffset,
+ arrayBufferView.byteLength,
+ );
+ core.opSync("op_crypto_get_random_values", null, ui8);
+ return arrayBufferView;
+ }
+
+ window.crypto = {
+ getRandomValues,
+ };
+ window.__bootstrap.crypto = {
+ getRandomValues,
+ };
+})(this);