mirror of
https://github.com/denoland/deno.git
synced 2024-12-23 15:49:44 -05:00
fix(crypto): change Crypto to interface (#10853)
Co-authored-by: Luca Casonato <hello@lcas.dev>
This commit is contained in:
parent
368c784d7f
commit
bb0c90cadb
3 changed files with 52 additions and 47 deletions
|
@ -3,48 +3,62 @@
|
|||
|
||||
((window) => {
|
||||
const core = window.Deno.core;
|
||||
const webidl = window.__bootstrap.webidl;
|
||||
|
||||
function getRandomValues(arrayBufferView) {
|
||||
if (!ArrayBuffer.isView(arrayBufferView)) {
|
||||
throw new TypeError(
|
||||
"Argument 1 does not implement interface ArrayBufferView",
|
||||
);
|
||||
class Crypto {
|
||||
constructor() {
|
||||
webidl.illegalConstructor();
|
||||
}
|
||||
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",
|
||||
|
||||
getRandomValues(arrayBufferView) {
|
||||
webidl.assertBranded(this, Crypto);
|
||||
const prefix = "Failed to execute 'getRandomValues' on 'Crypto'";
|
||||
webidl.requiredArguments(arguments.length, 1, { prefix });
|
||||
arrayBufferView = webidl.converters.ArrayBufferView(arrayBufferView, {
|
||||
prefix,
|
||||
context: "Argument 1",
|
||||
});
|
||||
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",
|
||||
);
|
||||
}
|
||||
const ui8 = new Uint8Array(
|
||||
arrayBufferView.buffer,
|
||||
arrayBufferView.byteOffset,
|
||||
arrayBufferView.byteLength,
|
||||
);
|
||||
core.opSync("op_crypto_get_random_values", ui8);
|
||||
return arrayBufferView;
|
||||
}
|
||||
|
||||
randomUUID() {
|
||||
webidl.assertBranded(this, Crypto);
|
||||
return core.opSync("op_crypto_random_uuid");
|
||||
}
|
||||
|
||||
get [Symbol.toStringTag]() {
|
||||
return "Crypto";
|
||||
}
|
||||
|
||||
[Symbol.for("Deno.customInspect")](inspect) {
|
||||
return `${this.constructor.name} ${inspect({})}`;
|
||||
}
|
||||
const ui8 = new Uint8Array(
|
||||
arrayBufferView.buffer,
|
||||
arrayBufferView.byteOffset,
|
||||
arrayBufferView.byteLength,
|
||||
);
|
||||
core.opSync("op_crypto_get_random_values", ui8);
|
||||
return arrayBufferView;
|
||||
}
|
||||
|
||||
function randomUUID() {
|
||||
return core.opSync("op_crypto_random_uuid");
|
||||
}
|
||||
|
||||
window.crypto = {
|
||||
getRandomValues,
|
||||
randomUUID,
|
||||
};
|
||||
window.__bootstrap.crypto = {
|
||||
getRandomValues,
|
||||
randomUUID,
|
||||
crypto: webidl.createBranded(Crypto),
|
||||
Crypto,
|
||||
};
|
||||
})(this);
|
||||
|
|
|
@ -302,7 +302,8 @@ delete Object.prototype.__proto__;
|
|||
console: util.writable(
|
||||
new Console((msg, level) => core.print(msg, level > 1)),
|
||||
),
|
||||
crypto: util.readOnly(crypto),
|
||||
crypto: util.readOnly(crypto.crypto),
|
||||
Crypto: util.nonEnumerable(crypto.Crypto),
|
||||
fetch: util.writable(fetch.fetch),
|
||||
performance: util.writable(performance.performance),
|
||||
setInterval: util.writable(timers.setInterval),
|
||||
|
|
|
@ -72,19 +72,9 @@
|
|||
},
|
||||
"historical.any.html": true,
|
||||
"idlharness.https.any.html": [
|
||||
"Crypto interface: existence and properties of interface object",
|
||||
"Crypto interface object length",
|
||||
"Crypto interface object name",
|
||||
"Crypto interface: existence and properties of interface prototype object",
|
||||
"Crypto interface: existence and properties of interface prototype object's \"constructor\" property",
|
||||
"Crypto interface: existence and properties of interface prototype object's @@unscopables property",
|
||||
"Crypto interface: attribute subtle",
|
||||
"Crypto interface: operation getRandomValues(ArrayBufferView)",
|
||||
"Crypto must be primary interface of crypto",
|
||||
"Stringification of crypto",
|
||||
"Crypto interface: crypto must inherit property \"subtle\" with the proper type",
|
||||
"Crypto interface: crypto must inherit property \"getRandomValues(ArrayBufferView)\" with the proper type",
|
||||
"Crypto interface: calling getRandomValues(ArrayBufferView) on crypto with too few arguments must throw TypeError",
|
||||
"CryptoKey interface: existence and properties of interface object",
|
||||
"CryptoKey interface object length",
|
||||
"CryptoKey interface object name",
|
||||
|
|
Loading…
Reference in a new issue