diff options
Diffstat (limited to 'extensions/crypto/01_crypto.js')
-rw-r--r-- | extensions/crypto/01_crypto.js | 50 |
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); |