mirror of
https://github.com/denoland/deno.git
synced 2024-12-25 00:29:09 -05:00
feat(ext/crypto): implement encrypt, decrypt & generateKey for RSA-OAEP (#11654)
This commit is contained in:
parent
4853be20f2
commit
85a56e7144
6 changed files with 490 additions and 198 deletions
|
@ -1,4 +1,9 @@
|
||||||
import { assert, assertEquals, unitTest } from "./test_util.ts";
|
import {
|
||||||
|
assert,
|
||||||
|
assertEquals,
|
||||||
|
assertThrowsAsync,
|
||||||
|
unitTest,
|
||||||
|
} from "./test_util.ts";
|
||||||
|
|
||||||
// https://github.com/denoland/deno/issues/11664
|
// https://github.com/denoland/deno/issues/11664
|
||||||
unitTest(async function testImportArrayBufferKey() {
|
unitTest(async function testImportArrayBufferKey() {
|
||||||
|
@ -46,6 +51,7 @@ unitTest(async function testSignVerify() {
|
||||||
);
|
);
|
||||||
|
|
||||||
const data = new Uint8Array([1, 2, 3]);
|
const data = new Uint8Array([1, 2, 3]);
|
||||||
|
|
||||||
const signAlgorithm = { name: algorithm, saltLength: 32 };
|
const signAlgorithm = { name: algorithm, saltLength: 32 };
|
||||||
|
|
||||||
const signature = await subtle.sign(
|
const signature = await subtle.sign(
|
||||||
|
@ -70,6 +76,83 @@ unitTest(async function testSignVerify() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// deno-fmt-ignore
|
||||||
|
const plainText = new Uint8Array([95, 77, 186, 79, 50, 12, 12, 232, 118, 114, 90, 252, 229, 251, 210, 91, 248, 62, 90, 113, 37, 160, 140, 175, 231, 60, 62, 186, 196, 33, 119, 157, 249, 213, 93, 24, 12, 58, 233, 148, 38, 69, 225, 216, 47, 238, 140, 157, 41, 75, 60, 177, 160, 138, 153, 49, 32, 27, 60, 14, 129, 252, 71, 202, 207, 131, 21, 162, 175, 102, 50, 65, 19, 195, 182, 98, 48, 195, 70, 8, 196, 244, 89, 54, 52, 206, 2, 178, 103, 54, 34, 119, 240, 168, 64, 202, 116, 188, 61, 26, 98, 54, 149, 44, 94, 215, 170, 248, 168, 254, 203, 221, 250, 117, 132, 230, 151, 140, 234, 93, 42, 91, 159, 183, 241, 180, 140, 139, 11, 229, 138, 48, 82, 2, 117, 77, 131, 118, 16, 115, 116, 121, 60, 240, 38, 170, 238, 83, 0, 114, 125, 131, 108, 215, 30, 113, 179, 69, 221, 178, 228, 68, 70, 255, 197, 185, 1, 99, 84, 19, 137, 13, 145, 14, 163, 128, 152, 74, 144, 25, 16, 49, 50, 63, 22, 219, 204, 157, 107, 225, 104, 184, 72, 133, 56, 76, 160, 62, 18, 96, 10, 193, 194, 72, 2, 138, 243, 114, 108, 201, 52, 99, 136, 46, 168, 192, 42, 171]);
|
||||||
|
|
||||||
|
// Passing
|
||||||
|
const hashPlainTextVector = [
|
||||||
|
{
|
||||||
|
hash: "SHA-1",
|
||||||
|
plainText: plainText.slice(0, 214),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hash: "SHA-256",
|
||||||
|
plainText: plainText.slice(0, 190),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hash: "SHA-384",
|
||||||
|
plainText: plainText.slice(0, 158),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hash: "SHA-512",
|
||||||
|
plainText: plainText.slice(0, 126),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// TODO(@littledivy): Remove this when we enable WPT for encrypt_decrypt
|
||||||
|
unitTest(async function testEncryptDecrypt() {
|
||||||
|
const subtle = window.crypto.subtle;
|
||||||
|
assert(subtle);
|
||||||
|
for (
|
||||||
|
const { hash, plainText } of hashPlainTextVector
|
||||||
|
) {
|
||||||
|
const keyPair = await subtle.generateKey(
|
||||||
|
{
|
||||||
|
name: "RSA-OAEP",
|
||||||
|
modulusLength: 2048,
|
||||||
|
publicExponent: new Uint8Array([1, 0, 1]),
|
||||||
|
hash,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
["encrypt", "decrypt"],
|
||||||
|
);
|
||||||
|
|
||||||
|
const encryptAlgorithm = { name: "RSA-OAEP" };
|
||||||
|
const cipherText = await subtle.encrypt(
|
||||||
|
encryptAlgorithm,
|
||||||
|
keyPair.publicKey,
|
||||||
|
plainText,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert(cipherText);
|
||||||
|
assert(cipherText.byteLength > 0);
|
||||||
|
assertEquals(cipherText.byteLength * 8, 2048);
|
||||||
|
assert(cipherText instanceof ArrayBuffer);
|
||||||
|
|
||||||
|
const decrypted = await subtle.decrypt(
|
||||||
|
encryptAlgorithm,
|
||||||
|
keyPair.privateKey,
|
||||||
|
cipherText,
|
||||||
|
);
|
||||||
|
assert(decrypted);
|
||||||
|
assert(decrypted instanceof ArrayBuffer);
|
||||||
|
assertEquals(new Uint8Array(decrypted), plainText);
|
||||||
|
|
||||||
|
const badPlainText = new Uint8Array(plainText.byteLength + 1);
|
||||||
|
badPlainText.set(plainText, 0);
|
||||||
|
badPlainText.set(new Uint8Array([32]), plainText.byteLength);
|
||||||
|
await assertThrowsAsync(async () => {
|
||||||
|
// Should fail
|
||||||
|
await subtle.encrypt(
|
||||||
|
encryptAlgorithm,
|
||||||
|
keyPair.publicKey,
|
||||||
|
badPlainText,
|
||||||
|
);
|
||||||
|
throw new TypeError("unreachable");
|
||||||
|
}, DOMException);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
unitTest(async function testGenerateRSAKey() {
|
unitTest(async function testGenerateRSAKey() {
|
||||||
const subtle = window.crypto.subtle;
|
const subtle = window.crypto.subtle;
|
||||||
assert(subtle);
|
assert(subtle);
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
RsaPssParams: {},
|
RsaPssParams: {},
|
||||||
EcdsaParams: { hash: "HashAlgorithmIdentifier" },
|
EcdsaParams: { hash: "HashAlgorithmIdentifier" },
|
||||||
HmacImportParams: { hash: "HashAlgorithmIdentifier" },
|
HmacImportParams: { hash: "HashAlgorithmIdentifier" },
|
||||||
|
RsaOaepParams: { label: "BufferSource" },
|
||||||
};
|
};
|
||||||
|
|
||||||
const supportedAlgorithms = {
|
const supportedAlgorithms = {
|
||||||
|
@ -68,6 +69,7 @@
|
||||||
"generateKey": {
|
"generateKey": {
|
||||||
"RSASSA-PKCS1-v1_5": "RsaHashedKeyGenParams",
|
"RSASSA-PKCS1-v1_5": "RsaHashedKeyGenParams",
|
||||||
"RSA-PSS": "RsaHashedKeyGenParams",
|
"RSA-PSS": "RsaHashedKeyGenParams",
|
||||||
|
"RSA-OAEP": "RsaHashedKeyGenParams",
|
||||||
"ECDSA": "EcKeyGenParams",
|
"ECDSA": "EcKeyGenParams",
|
||||||
"HMAC": "HmacKeyGenParams",
|
"HMAC": "HmacKeyGenParams",
|
||||||
},
|
},
|
||||||
|
@ -85,6 +87,12 @@
|
||||||
"importKey": {
|
"importKey": {
|
||||||
"HMAC": "HmacImportParams",
|
"HMAC": "HmacImportParams",
|
||||||
},
|
},
|
||||||
|
"encrypt": {
|
||||||
|
"RSA-OAEP": "RsaOaepParams",
|
||||||
|
},
|
||||||
|
"decrypt": {
|
||||||
|
"RSA-OAEP": "RsaOaepParams",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// See https://www.w3.org/TR/WebCryptoAPI/#dfn-normalize-an-algorithm
|
// See https://www.w3.org/TR/WebCryptoAPI/#dfn-normalize-an-algorithm
|
||||||
|
@ -300,6 +308,173 @@
|
||||||
return result.buffer;
|
return result.buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} algorithm
|
||||||
|
* @param {CryptoKey} key
|
||||||
|
* @param {BufferSource} data
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
async encrypt(algorithm, key, data) {
|
||||||
|
webidl.assertBranded(this, SubtleCrypto);
|
||||||
|
const prefix = "Failed to execute 'encrypt' on 'SubtleCrypto'";
|
||||||
|
webidl.requiredArguments(arguments.length, 3, { prefix });
|
||||||
|
algorithm = webidl.converters.AlgorithmIdentifier(algorithm, {
|
||||||
|
prefix,
|
||||||
|
context: "Argument 1",
|
||||||
|
});
|
||||||
|
key = webidl.converters.CryptoKey(key, {
|
||||||
|
prefix,
|
||||||
|
context: "Argument 2",
|
||||||
|
});
|
||||||
|
data = webidl.converters.BufferSource(data, {
|
||||||
|
prefix,
|
||||||
|
context: "Argument 3",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2.
|
||||||
|
if (ArrayBufferIsView(data)) {
|
||||||
|
data = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
||||||
|
} else {
|
||||||
|
data = new Uint8Array(data);
|
||||||
|
}
|
||||||
|
data = TypedArrayPrototypeSlice(data);
|
||||||
|
|
||||||
|
// 3.
|
||||||
|
const normalizedAlgorithm = normalizeAlgorithm(algorithm, "encrypt");
|
||||||
|
|
||||||
|
const handle = key[_handle];
|
||||||
|
const keyData = WeakMapPrototypeGet(KEY_STORE, handle);
|
||||||
|
|
||||||
|
switch (normalizedAlgorithm.name) {
|
||||||
|
case "RSA-OAEP": {
|
||||||
|
// 1.
|
||||||
|
if (key[_type] !== "public") {
|
||||||
|
throw new DOMException(
|
||||||
|
"Key type not supported",
|
||||||
|
"InvalidAccessError",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.
|
||||||
|
if (normalizedAlgorithm.label) {
|
||||||
|
if (ArrayBufferIsView(normalizedAlgorithm.label)) {
|
||||||
|
normalizedAlgorithm.label = new Uint8Array(
|
||||||
|
normalizedAlgorithm.label.buffer,
|
||||||
|
normalizedAlgorithm.label.byteOffset,
|
||||||
|
normalizedAlgorithm.label.byteLength,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
normalizedAlgorithm.label = new Uint8Array(
|
||||||
|
normalizedAlgorithm.label,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
normalizedAlgorithm.label = TypedArrayPrototypeSlice(
|
||||||
|
normalizedAlgorithm.label,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
normalizedAlgorithm.label = new Uint8Array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3-5.
|
||||||
|
const hashAlgorithm = key[_algorithm].hash.name;
|
||||||
|
const cipherText = await core.opAsync("op_crypto_encrypt_key", {
|
||||||
|
key: keyData,
|
||||||
|
algorithm: "RSA-OAEP",
|
||||||
|
hash: hashAlgorithm,
|
||||||
|
}, data);
|
||||||
|
|
||||||
|
// 6.
|
||||||
|
return cipherText.buffer;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw new DOMException("Not implemented", "NotSupportedError");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} algorithm
|
||||||
|
* @param {CryptoKey} key
|
||||||
|
* @param {BufferSource} data
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
async decrypt(algorithm, key, data) {
|
||||||
|
webidl.assertBranded(this, SubtleCrypto);
|
||||||
|
const prefix = "Failed to execute 'decrypt' on 'SubtleCrypto'";
|
||||||
|
webidl.requiredArguments(arguments.length, 3, { prefix });
|
||||||
|
algorithm = webidl.converters.AlgorithmIdentifier(algorithm, {
|
||||||
|
prefix,
|
||||||
|
context: "Argument 1",
|
||||||
|
});
|
||||||
|
key = webidl.converters.CryptoKey(key, {
|
||||||
|
prefix,
|
||||||
|
context: "Argument 2",
|
||||||
|
});
|
||||||
|
data = webidl.converters.BufferSource(data, {
|
||||||
|
prefix,
|
||||||
|
context: "Argument 3",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2.
|
||||||
|
if (ArrayBufferIsView(data)) {
|
||||||
|
data = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
||||||
|
} else {
|
||||||
|
data = new Uint8Array(data);
|
||||||
|
}
|
||||||
|
data = TypedArrayPrototypeSlice(data);
|
||||||
|
|
||||||
|
// 3.
|
||||||
|
const normalizedAlgorithm = normalizeAlgorithm(algorithm, "decrypt");
|
||||||
|
|
||||||
|
const handle = key[_handle];
|
||||||
|
const keyData = WeakMapPrototypeGet(KEY_STORE, handle);
|
||||||
|
|
||||||
|
switch (normalizedAlgorithm.name) {
|
||||||
|
case "RSA-OAEP": {
|
||||||
|
// 1.
|
||||||
|
if (key[_type] !== "private") {
|
||||||
|
throw new DOMException(
|
||||||
|
"Key type not supported",
|
||||||
|
"InvalidAccessError",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.
|
||||||
|
if (normalizedAlgorithm.label) {
|
||||||
|
if (ArrayBufferIsView(normalizedAlgorithm.label)) {
|
||||||
|
normalizedAlgorithm.label = new Uint8Array(
|
||||||
|
normalizedAlgorithm.label.buffer,
|
||||||
|
normalizedAlgorithm.label.byteOffset,
|
||||||
|
normalizedAlgorithm.label.byteLength,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
normalizedAlgorithm.label = new Uint8Array(
|
||||||
|
normalizedAlgorithm.label,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
normalizedAlgorithm.label = TypedArrayPrototypeSlice(
|
||||||
|
normalizedAlgorithm.label,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
normalizedAlgorithm.label = new Uint8Array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3-5.
|
||||||
|
const hashAlgorithm = key[_algorithm].hash.name;
|
||||||
|
const plainText = await core.opAsync("op_crypto_decrypt_key", {
|
||||||
|
key: keyData,
|
||||||
|
algorithm: "RSA-OAEP",
|
||||||
|
hash: hashAlgorithm,
|
||||||
|
label: normalizedAlgorithm.label,
|
||||||
|
}, data);
|
||||||
|
|
||||||
|
// 6.
|
||||||
|
return plainText.buffer;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw new DOMException("Not implemented", "NotSupportedError");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} algorithm
|
* @param {string} algorithm
|
||||||
* @param {CryptoKey} key
|
* @param {CryptoKey} key
|
||||||
|
@ -833,7 +1008,66 @@
|
||||||
// 19-22.
|
// 19-22.
|
||||||
return { publicKey, privateKey };
|
return { publicKey, privateKey };
|
||||||
}
|
}
|
||||||
// TODO(lucacasonato): RSA-OAEP
|
case "RSA-OAEP": {
|
||||||
|
if (
|
||||||
|
ArrayPrototypeFind(
|
||||||
|
usages,
|
||||||
|
(u) =>
|
||||||
|
!ArrayPrototypeIncludes([
|
||||||
|
"encrypt",
|
||||||
|
"decrypt",
|
||||||
|
"wrapKey",
|
||||||
|
"unwrapKey",
|
||||||
|
], u),
|
||||||
|
) !== undefined
|
||||||
|
) {
|
||||||
|
throw new DOMException("Invalid key usages", "SyntaxError");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.
|
||||||
|
const keyData = await core.opAsync(
|
||||||
|
"op_crypto_generate_key",
|
||||||
|
{
|
||||||
|
name: normalizedAlgorithm.name,
|
||||||
|
modulusLength: normalizedAlgorithm.modulusLength,
|
||||||
|
publicExponent: normalizedAlgorithm.publicExponent,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const handle = {};
|
||||||
|
WeakMapPrototypeSet(KEY_STORE, handle, {
|
||||||
|
type: "pkcs8",
|
||||||
|
data: keyData,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 4-8.
|
||||||
|
const algorithm = {
|
||||||
|
name: normalizedAlgorithm.name,
|
||||||
|
modulusLength: normalizedAlgorithm.modulusLength,
|
||||||
|
publicExponent: normalizedAlgorithm.publicExponent,
|
||||||
|
hash: normalizedAlgorithm.hash,
|
||||||
|
};
|
||||||
|
|
||||||
|
// 9-13.
|
||||||
|
const publicKey = constructKey(
|
||||||
|
"public",
|
||||||
|
true,
|
||||||
|
usageIntersection(usages, ["encrypt", "wrapKey"]),
|
||||||
|
algorithm,
|
||||||
|
handle,
|
||||||
|
);
|
||||||
|
|
||||||
|
// 14-18.
|
||||||
|
const privateKey = constructKey(
|
||||||
|
"private",
|
||||||
|
extractable,
|
||||||
|
usageIntersection(usages, ["decrypt", "unwrapKey"]),
|
||||||
|
algorithm,
|
||||||
|
handle,
|
||||||
|
);
|
||||||
|
|
||||||
|
// 19-22.
|
||||||
|
return { publicKey, privateKey };
|
||||||
|
}
|
||||||
case "ECDSA": {
|
case "ECDSA": {
|
||||||
// 1.
|
// 1.
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -138,6 +138,17 @@
|
||||||
webidl.converters.RsaPssParams = webidl
|
webidl.converters.RsaPssParams = webidl
|
||||||
.createDictionaryConverter("RsaPssParams", dictRsaPssParams);
|
.createDictionaryConverter("RsaPssParams", dictRsaPssParams);
|
||||||
|
|
||||||
|
const dictRsaOaepParams = [
|
||||||
|
...dictAlgorithm,
|
||||||
|
{
|
||||||
|
key: "label",
|
||||||
|
converter: webidl.converters["BufferSource"],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
webidl.converters.RsaOaepParams = webidl
|
||||||
|
.createDictionaryConverter("RsaOaepParams", dictRsaOaepParams);
|
||||||
|
|
||||||
const dictEcdsaParams = [
|
const dictEcdsaParams = [
|
||||||
...dictAlgorithm,
|
...dictAlgorithm,
|
||||||
{
|
{
|
||||||
|
|
14
ext/crypto/lib.deno_crypto.d.ts
vendored
14
ext/crypto/lib.deno_crypto.d.ts
vendored
|
@ -54,6 +54,10 @@ interface RsaPssParams extends Algorithm {
|
||||||
saltLength: number;
|
saltLength: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface RsaOaepParams extends Algorithm {
|
||||||
|
label?: Uint8Array;
|
||||||
|
}
|
||||||
|
|
||||||
interface HmacImportParams extends Algorithm {
|
interface HmacImportParams extends Algorithm {
|
||||||
hash: HashAlgorithmIdentifier;
|
hash: HashAlgorithmIdentifier;
|
||||||
length?: number;
|
length?: number;
|
||||||
|
@ -141,6 +145,16 @@ interface SubtleCrypto {
|
||||||
algorithm: AlgorithmIdentifier,
|
algorithm: AlgorithmIdentifier,
|
||||||
data: BufferSource,
|
data: BufferSource,
|
||||||
): Promise<ArrayBuffer>;
|
): Promise<ArrayBuffer>;
|
||||||
|
encrypt(
|
||||||
|
algorithm: AlgorithmIdentifier | RsaOaepParams,
|
||||||
|
key: CryptoKey,
|
||||||
|
data: BufferSource,
|
||||||
|
): Promise<ArrayBuffer>;
|
||||||
|
decrypt(
|
||||||
|
algorithm: AlgorithmIdentifier | RsaOaepParams,
|
||||||
|
key: CryptoKey,
|
||||||
|
data: BufferSource,
|
||||||
|
): Promise<ArrayBuffer>;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare interface Crypto {
|
declare interface Crypto {
|
||||||
|
|
|
@ -74,6 +74,8 @@ pub fn init(maybe_seed: Option<u64>) -> Extension {
|
||||||
("op_crypto_generate_key", op_async(op_crypto_generate_key)),
|
("op_crypto_generate_key", op_async(op_crypto_generate_key)),
|
||||||
("op_crypto_sign_key", op_async(op_crypto_sign_key)),
|
("op_crypto_sign_key", op_async(op_crypto_sign_key)),
|
||||||
("op_crypto_verify_key", op_async(op_crypto_verify_key)),
|
("op_crypto_verify_key", op_async(op_crypto_verify_key)),
|
||||||
|
("op_crypto_encrypt_key", op_async(op_crypto_encrypt_key)),
|
||||||
|
("op_crypto_decrypt_key", op_async(op_crypto_decrypt_key)),
|
||||||
("op_crypto_subtle_digest", op_async(op_crypto_subtle_digest)),
|
("op_crypto_subtle_digest", op_async(op_crypto_subtle_digest)),
|
||||||
("op_crypto_random_uuid", op_sync(op_crypto_random_uuid)),
|
("op_crypto_random_uuid", op_sync(op_crypto_random_uuid)),
|
||||||
])
|
])
|
||||||
|
@ -128,7 +130,7 @@ pub async fn op_crypto_generate_key(
|
||||||
let algorithm = args.name;
|
let algorithm = args.name;
|
||||||
|
|
||||||
let key = match algorithm {
|
let key = match algorithm {
|
||||||
Algorithm::RsassaPkcs1v15 | Algorithm::RsaPss => {
|
Algorithm::RsassaPkcs1v15 | Algorithm::RsaPss | Algorithm::RsaOaep => {
|
||||||
let public_exponent = args.public_exponent.ok_or_else(not_supported)?;
|
let public_exponent = args.public_exponent.ok_or_else(not_supported)?;
|
||||||
let modulus_length = args.modulus_length.ok_or_else(not_supported)?;
|
let modulus_length = args.modulus_length.ok_or_else(not_supported)?;
|
||||||
|
|
||||||
|
@ -517,6 +519,131 @@ pub async fn op_crypto_verify_key(
|
||||||
Ok(verification)
|
Ok(verification)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct EncryptArg {
|
||||||
|
key: KeyData,
|
||||||
|
algorithm: Algorithm,
|
||||||
|
hash: Option<CryptoHash>,
|
||||||
|
label: Option<ZeroCopyBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn op_crypto_encrypt_key(
|
||||||
|
_state: Rc<RefCell<OpState>>,
|
||||||
|
args: EncryptArg,
|
||||||
|
zero_copy: Option<ZeroCopyBuf>,
|
||||||
|
) -> Result<ZeroCopyBuf, AnyError> {
|
||||||
|
let zero_copy = zero_copy.ok_or_else(null_opbuf)?;
|
||||||
|
let data = &*zero_copy;
|
||||||
|
let algorithm = args.algorithm;
|
||||||
|
|
||||||
|
match algorithm {
|
||||||
|
Algorithm::RsaOaep => {
|
||||||
|
let public_key: RsaPublicKey =
|
||||||
|
RsaPrivateKey::from_pkcs8_der(&*args.key.data)?.to_public_key();
|
||||||
|
let label = args.label.map(|l| String::from_utf8_lossy(&*l).to_string());
|
||||||
|
let mut rng = OsRng;
|
||||||
|
let padding = match args
|
||||||
|
.hash
|
||||||
|
.ok_or_else(|| type_error("Missing argument hash".to_string()))?
|
||||||
|
{
|
||||||
|
CryptoHash::Sha1 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha1::new()),
|
||||||
|
mgf_digest: Box::new(Sha1::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
CryptoHash::Sha256 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha256::new()),
|
||||||
|
mgf_digest: Box::new(Sha256::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
CryptoHash::Sha384 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha384::new()),
|
||||||
|
mgf_digest: Box::new(Sha384::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
CryptoHash::Sha512 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha512::new()),
|
||||||
|
mgf_digest: Box::new(Sha512::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(
|
||||||
|
public_key
|
||||||
|
.encrypt(&mut rng, padding, data)
|
||||||
|
.map_err(|e| {
|
||||||
|
custom_error("DOMExceptionOperationError", e.to_string())
|
||||||
|
})?
|
||||||
|
.into(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_ => Err(type_error("Unsupported algorithm".to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct DecryptArg {
|
||||||
|
key: KeyData,
|
||||||
|
algorithm: Algorithm,
|
||||||
|
hash: Option<CryptoHash>,
|
||||||
|
label: Option<ZeroCopyBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn op_crypto_decrypt_key(
|
||||||
|
_state: Rc<RefCell<OpState>>,
|
||||||
|
args: DecryptArg,
|
||||||
|
zero_copy: Option<ZeroCopyBuf>,
|
||||||
|
) -> Result<ZeroCopyBuf, AnyError> {
|
||||||
|
let zero_copy = zero_copy.ok_or_else(null_opbuf)?;
|
||||||
|
let data = &*zero_copy;
|
||||||
|
let algorithm = args.algorithm;
|
||||||
|
|
||||||
|
match algorithm {
|
||||||
|
Algorithm::RsaOaep => {
|
||||||
|
let private_key: RsaPrivateKey =
|
||||||
|
RsaPrivateKey::from_pkcs8_der(&*args.key.data)?;
|
||||||
|
let label = args.label.map(|l| String::from_utf8_lossy(&*l).to_string());
|
||||||
|
let padding = match args
|
||||||
|
.hash
|
||||||
|
.ok_or_else(|| type_error("Missing argument hash".to_string()))?
|
||||||
|
{
|
||||||
|
CryptoHash::Sha1 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha1::new()),
|
||||||
|
mgf_digest: Box::new(Sha1::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
CryptoHash::Sha256 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha256::new()),
|
||||||
|
mgf_digest: Box::new(Sha256::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
CryptoHash::Sha384 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha384::new()),
|
||||||
|
mgf_digest: Box::new(Sha384::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
CryptoHash::Sha512 => PaddingScheme::OAEP {
|
||||||
|
digest: Box::new(Sha512::new()),
|
||||||
|
mgf_digest: Box::new(Sha512::new()),
|
||||||
|
label,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(
|
||||||
|
private_key
|
||||||
|
.decrypt(padding, data)
|
||||||
|
.map_err(|e| {
|
||||||
|
custom_error("DOMExceptionOperationError", e.to_string())
|
||||||
|
})?
|
||||||
|
.into(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_ => Err(type_error("Unsupported algorithm".to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn op_crypto_random_uuid(
|
pub fn op_crypto_random_uuid(
|
||||||
state: &mut OpState,
|
state: &mut OpState,
|
||||||
_: (),
|
_: (),
|
||||||
|
|
|
@ -14515,180 +14515,7 @@
|
||||||
"Empty usages: generateKey({name: ECDSA, namedCurve: P-521}, true, [])"
|
"Empty usages: generateKey({name: ECDSA, namedCurve: P-521}, true, [])"
|
||||||
],
|
],
|
||||||
"failures_HMAC.https.any.html": true,
|
"failures_HMAC.https.any.html": true,
|
||||||
"failures_RSA-OAEP.https.any.html": [
|
"failures_RSA-OAEP.https.any.html": true,
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, sign])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, verify])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, deriveKey])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, encrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [wrapKey, decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, decrypt, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, wrapKey, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [unwrapKey, deriveBits])",
|
|
||||||
"Bad usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey, deriveBits])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey, wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey, wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey, wrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey, wrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey, wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey, wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey, wrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey, wrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [unwrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [unwrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, false, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey, wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey, wrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey, decrypt, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey, wrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey, wrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey, encrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey, wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey, wrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey, decrypt])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey, wrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey, wrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [unwrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [unwrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, false, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey])",
|
|
||||||
"Bad algorithm property: generateKey({hash: SHA-256, modulusLength: 1024, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 0}}, true, [encrypt, decrypt, wrapKey, unwrapKey, decrypt, unwrapKey, encrypt, decrypt, wrapKey, unwrapKey])",
|
|
||||||
"Empty usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, false, [])",
|
|
||||||
"Empty usages: generateKey({hash: SHA-1, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [])",
|
|
||||||
"Empty usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, false, [])",
|
|
||||||
"Empty usages: generateKey({hash: SHA-256, modulusLength: 2048, name: RSA-OAEP, publicExponent: {0: 1, 1: 0, 2: 1}}, true, [])"
|
|
||||||
],
|
|
||||||
"failures_RSA-PSS.https.any.html": true,
|
"failures_RSA-PSS.https.any.html": true,
|
||||||
"failures_RSASSA-PKCS1-v1_5.https.any.html": true,
|
"failures_RSASSA-PKCS1-v1_5.https.any.html": true,
|
||||||
"successes_AES-CBC.https.any.html": false,
|
"successes_AES-CBC.https.any.html": false,
|
||||||
|
@ -14717,23 +14544,23 @@
|
||||||
"Success: generateKey({name: Ecdsa, namedCurve: P-521}, false, [sign, verify, sign, sign, verify])",
|
"Success: generateKey({name: Ecdsa, namedCurve: P-521}, false, [sign, verify, sign, sign, verify])",
|
||||||
"Success: generateKey({name: Ecdsa, namedCurve: P-521}, true, [sign, verify, sign, sign, verify])"
|
"Success: generateKey({name: Ecdsa, namedCurve: P-521}, true, [sign, verify, sign, sign, verify])"
|
||||||
],
|
],
|
||||||
"successes_RSA-OAEP.https.any.html": false,
|
"successes_RSA-OAEP.https.any.html": true,
|
||||||
"successes_RSA-OAEP.https.any.html?1-10": false,
|
"successes_RSA-OAEP.https.any.html?1-10": true,
|
||||||
"successes_RSA-OAEP.https.any.html?101-110": false,
|
"successes_RSA-OAEP.https.any.html?101-110": true,
|
||||||
"successes_RSA-OAEP.https.any.html?11-20": false,
|
"successes_RSA-OAEP.https.any.html?11-20": true,
|
||||||
"successes_RSA-OAEP.https.any.html?111-120": false,
|
"successes_RSA-OAEP.https.any.html?111-120": true,
|
||||||
"successes_RSA-OAEP.https.any.html?121-130": false,
|
"successes_RSA-OAEP.https.any.html?121-130": true,
|
||||||
"successes_RSA-OAEP.https.any.html?131-140": false,
|
"successes_RSA-OAEP.https.any.html?131-140": true,
|
||||||
"successes_RSA-OAEP.https.any.html?141-150": false,
|
"successes_RSA-OAEP.https.any.html?141-150": true,
|
||||||
"successes_RSA-OAEP.https.any.html?151-last": false,
|
"successes_RSA-OAEP.https.any.html?151-last": true,
|
||||||
"successes_RSA-OAEP.https.any.html?21-30": false,
|
"successes_RSA-OAEP.https.any.html?21-30": true,
|
||||||
"successes_RSA-OAEP.https.any.html?31-40": false,
|
"successes_RSA-OAEP.https.any.html?31-40": true,
|
||||||
"successes_RSA-OAEP.https.any.html?41-50": false,
|
"successes_RSA-OAEP.https.any.html?41-50": true,
|
||||||
"successes_RSA-OAEP.https.any.html?51-60": false,
|
"successes_RSA-OAEP.https.any.html?51-60": true,
|
||||||
"successes_RSA-OAEP.https.any.html?61-70": false,
|
"successes_RSA-OAEP.https.any.html?61-70": true,
|
||||||
"successes_RSA-OAEP.https.any.html?71-80": false,
|
"successes_RSA-OAEP.https.any.html?71-80": true,
|
||||||
"successes_RSA-OAEP.https.any.html?81-90": false,
|
"successes_RSA-OAEP.https.any.html?81-90": true,
|
||||||
"successes_RSA-OAEP.https.any.html?91-100": false,
|
"successes_RSA-OAEP.https.any.html?91-100": true,
|
||||||
"successes_RSA-PSS.https.any.html?1-10": true,
|
"successes_RSA-PSS.https.any.html?1-10": true,
|
||||||
"successes_RSA-PSS.https.any.html?11-20": true,
|
"successes_RSA-PSS.https.any.html?11-20": true,
|
||||||
"successes_RSA-PSS.https.any.html?21-30": true,
|
"successes_RSA-PSS.https.any.html?21-30": true,
|
||||||
|
@ -14757,10 +14584,6 @@
|
||||||
"SubtleCrypto interface: operation exportKey(KeyFormat, CryptoKey)",
|
"SubtleCrypto interface: operation exportKey(KeyFormat, CryptoKey)",
|
||||||
"SubtleCrypto interface: operation wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)",
|
"SubtleCrypto interface: operation wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)",
|
||||||
"SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, sequence<KeyUsage>)",
|
"SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, sequence<KeyUsage>)",
|
||||||
"SubtleCrypto interface: crypto.subtle must inherit property \"encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)\" with the proper type",
|
|
||||||
"SubtleCrypto interface: calling encrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError",
|
|
||||||
"SubtleCrypto interface: crypto.subtle must inherit property \"decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)\" with the proper type",
|
|
||||||
"SubtleCrypto interface: calling decrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError",
|
|
||||||
"SubtleCrypto interface: crypto.subtle must inherit property \"deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, sequence<KeyUsage>)\" with the proper type",
|
"SubtleCrypto interface: crypto.subtle must inherit property \"deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, sequence<KeyUsage>)\" with the proper type",
|
||||||
"SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, sequence<KeyUsage>) on crypto.subtle with too few arguments must throw TypeError",
|
"SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, sequence<KeyUsage>) on crypto.subtle with too few arguments must throw TypeError",
|
||||||
"SubtleCrypto interface: crypto.subtle must inherit property \"deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)\" with the proper type",
|
"SubtleCrypto interface: crypto.subtle must inherit property \"deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)\" with the proper type",
|
||||||
|
|
Loading…
Reference in a new issue