diff --git a/builtins/web/crypto/crypto-key.cpp b/builtins/web/crypto/crypto-key.cpp index a1d5e6b7..604f6b23 100644 --- a/builtins/web/crypto/crypto-key.cpp +++ b/builtins/web/crypto/crypto-key.cpp @@ -14,7 +14,7 @@ namespace builtins::web::crypto { -CryptoKeyUsages::CryptoKeyUsages(uint8_t mask) : mask(mask) { }; +CryptoKeyUsages::CryptoKeyUsages(uint16_t mask) : mask(mask) { }; CryptoKeyUsages::CryptoKeyUsages(bool encrypt, bool decrypt, bool sign, bool verify, bool derive_key, bool derive_bits, bool wrap_key, bool unwrap_key) { @@ -46,7 +46,7 @@ CryptoKeyUsages::CryptoKeyUsages(bool encrypt, bool decrypt, bool sign, bool ver }; CryptoKeyUsages CryptoKeyUsages::from(const std::vector& key_usages) { - uint8_t mask = 0; + uint16_t mask = 0; for (const auto &usage : key_usages) { if (usage == "encrypt") { mask |= encrypt_flag; @@ -64,6 +64,14 @@ CryptoKeyUsages CryptoKeyUsages::from(const std::vector& key_usages mask |= wrap_key_flag; } else if (usage == "unwrapKey") { mask |= unwrap_key_flag; + } else if (usage == "encapsulateKey") { + mask |= encapsulate_key_flag; + } else if (usage == "encapsulateBits") { + mask |= encapsulate_bits_flag; + } else if (usage == "decapsulateKey") { + mask |= decapsulate_key_flag; + } else if (usage == "decapsulateBits") { + mask |= decapsulate_bits_flag; } } return {mask}; @@ -88,7 +96,7 @@ JS::Result CryptoKeyUsages::from(JSContext *cx, JS::HandleValue if (!JS::GetArrayLength(cx, array, &key_usages_length)) { return JS::Result(JS::Error()); } - uint8_t mask = 0; + uint16_t mask = 0; for (uint32_t index = 0; index < key_usages_length; index++) { JS::RootedValue val(cx); if (!JS_GetElement(cx, array, index, &val)) { @@ -118,12 +126,21 @@ JS::Result CryptoKeyUsages::from(JSContext *cx, JS::HandleValue mask |= wrap_key_flag; } else if (usage == "unwrapKey") { mask |= unwrap_key_flag; + } else if (usage == "encapsulateKey") { + mask |= encapsulate_key_flag; + } else if (usage == "encapsulateBits") { + mask |= encapsulate_bits_flag; + } else if (usage == "decapsulateKey") { + mask |= decapsulate_key_flag; + } else if (usage == "decapsulateBits") { + mask |= decapsulate_bits_flag; } else { api::throw_error( cx, api::Errors::TypeError, "crypto.subtle.importKey", "each value in the 'keyUsages' list", "be one of 'encrypt', 'decrypt', 'sign', 'verify', 'deriveKey', 'deriveBits', " - "'wrapKey', or 'unwrapKey'"); + "'wrapKey', 'unwrapKey', 'encapsulateKey', 'encapsulateBits', 'decapsulateKey', or " + "'decapsulateBits'"); return JS::Result(JS::Error()); } } @@ -223,8 +240,8 @@ bool CryptoKey::usages_get(JSContext *cx, unsigned argc, JS::Value *vp) { // Else, grab the CryptoKeyUsages value from Slots::Usages and convert // it into a JS Array and store the result in Slots::UsagesArray. auto usages = JS::GetReservedSlot(self, std::to_underlying(Slots::Usages)).toInt32(); - MOZ_ASSERT(std::in_range(usages)); - auto usage = CryptoKeyUsages(static_cast(usages)); + MOZ_ASSERT(std::in_range(usages)); + auto usage = CryptoKeyUsages(static_cast(usages)); // The result is ordered alphabetically. JS::RootedValueVector result(cx); JS::RootedString str(cx); @@ -239,6 +256,16 @@ bool CryptoKey::usages_get(JSContext *cx, unsigned argc, JS::Value *vp) { return true; }; + if (usage.canDecapsulateBits()) { + if (!append("decapsulateBits")) { + return false; + } + } + if (usage.canDecapsulateKey()) { + if (!append("decapsulateKey")) { + return false; + } + } if (usage.canDecrypt()) { if (!append("decrypt")) { return false; @@ -254,6 +281,16 @@ bool CryptoKey::usages_get(JSContext *cx, unsigned argc, JS::Value *vp) { return false; } } + if (usage.canEncapsulateBits()) { + if (!append("encapsulateBits")) { + return false; + } + } + if (usage.canEncapsulateKey()) { + if (!append("encapsulateKey")) { + return false; + } + } if (usage.canEncrypt()) { if (!append("encrypt")) { return false; @@ -882,16 +919,16 @@ JS::Result CryptoKey::is_algorithm(JSContext *cx, JS::HandleObject self, bool CryptoKey::canSign(JS::HandleObject self) { MOZ_ASSERT(is_instance(self)); auto usages = JS::GetReservedSlot(self, std::to_underlying(Slots::Usages)).toInt32(); - MOZ_ASSERT(std::in_range(usages)); - auto usage = CryptoKeyUsages(static_cast(usages)); + MOZ_ASSERT(std::in_range(usages)); + auto usage = CryptoKeyUsages(static_cast(usages)); return usage.canSign(); } bool CryptoKey::canVerify(JS::HandleObject self) { MOZ_ASSERT(is_instance(self)); auto usages = JS::GetReservedSlot(self, std::to_underlying(Slots::Usages)).toInt32(); - MOZ_ASSERT(std::in_range(usages)); - auto usage = CryptoKeyUsages(static_cast(usages)); + MOZ_ASSERT(std::in_range(usages)); + auto usage = CryptoKeyUsages(static_cast(usages)); return usage.canVerify(); } diff --git a/builtins/web/crypto/crypto-key.h b/builtins/web/crypto/crypto-key.h index 88db236d..d4c9e985 100644 --- a/builtins/web/crypto/crypto-key.h +++ b/builtins/web/crypto/crypto-key.h @@ -22,26 +22,30 @@ enum class CryptoKeyFormat : uint8_t { Raw, Spki, Pkcs8, Jwk }; class CryptoKeyUsages { private: - uint8_t mask = 0; + uint16_t mask = 0; public: - static constexpr const uint8_t encrypt_flag = 1 << 0; - static constexpr const uint8_t decrypt_flag = 1 << 1; - static constexpr const uint8_t sign_flag = 1 << 2; - static constexpr const uint8_t verify_flag = 1 << 3; - static constexpr const uint8_t derive_key_flag = 1 << 4; - static constexpr const uint8_t derive_bits_flag = 1 << 5; - static constexpr const uint8_t wrap_key_flag = 1 << 6; - static constexpr const uint8_t unwrap_key_flag = 1 << 7; + static constexpr const uint16_t encrypt_flag = 1 << 0; + static constexpr const uint16_t decrypt_flag = 1 << 1; + static constexpr const uint16_t sign_flag = 1 << 2; + static constexpr const uint16_t verify_flag = 1 << 3; + static constexpr const uint16_t derive_key_flag = 1 << 4; + static constexpr const uint16_t derive_bits_flag = 1 << 5; + static constexpr const uint16_t wrap_key_flag = 1 << 6; + static constexpr const uint16_t unwrap_key_flag = 1 << 7; + static constexpr const uint16_t encapsulate_key_flag = 1 << 8; + static constexpr const uint16_t encapsulate_bits_flag = 1 << 9; + static constexpr const uint16_t decapsulate_key_flag = 1 << 10; + static constexpr const uint16_t decapsulate_bits_flag = 1 << 11; CryptoKeyUsages() = default; - CryptoKeyUsages(uint8_t mask); + CryptoKeyUsages(uint16_t mask); CryptoKeyUsages(bool encrypt, bool decrypt, bool sign, bool verify, bool derive_key, bool derive_bits, bool wrap_key, bool unwrap_key); static CryptoKeyUsages from(const std::vector& key_usages); static JS::Result from(JSContext *cx, JS::HandleValue key_usages); - [[nodiscard]] uint8_t toInt() const { return this->mask; }; + [[nodiscard]] uint16_t toInt() const { return this->mask; }; [[nodiscard]] bool isEmpty() const { return this->mask == 0; }; bool isSuperSetOf(CryptoKeyUsages &other) const { return (this->mask & other.mask) != 0; }; @@ -54,6 +58,10 @@ class CryptoKeyUsages { [[nodiscard]] bool canDeriveBits() const { return (this->mask & derive_bits_flag) != 0; }; [[nodiscard]] bool canWrapKey() const { return (this->mask & wrap_key_flag) != 0; }; [[nodiscard]] bool canUnwrapKey() const { return (this->mask & unwrap_key_flag) != 0; }; + [[nodiscard]] bool canEncapsulateKey() const { return (this->mask & encapsulate_key_flag) != 0; }; + [[nodiscard]] bool canEncapsulateBits() const { return (this->mask & encapsulate_bits_flag) != 0; }; + [[nodiscard]] bool canDecapsulateKey() const { return (this->mask & decapsulate_key_flag) != 0; }; + [[nodiscard]] bool canDecapsulateBits() const { return (this->mask & decapsulate_bits_flag) != 0; }; [[nodiscard]] bool canOnlyEncrypt() const { return this->mask == encrypt_flag; }; [[nodiscard]] bool canOnlyDecrypt() const { return this->mask == decrypt_flag; }; diff --git a/builtins/web/crypto/json-web-key.cpp b/builtins/web/crypto/json-web-key.cpp index 65617341..b87aef34 100644 --- a/builtins/web/crypto/json-web-key.cpp +++ b/builtins/web/crypto/json-web-key.cpp @@ -229,11 +229,14 @@ std::unique_ptr JsonWebKey::parse(JSContext *cx, JS::HandleValue val std::string op(op_chars.begin(), op_chars.len); if (op != "encrypt" && op != "decrypt" && op != "sign" && op != "verify" && - op != "deriveKey" && op != "deriveBits" && op != "wrapKey" && op != "unwrapKey") { + op != "deriveKey" && op != "deriveBits" && op != "wrapKey" && op != "unwrapKey" && + op != "encapsulateKey" && op != "encapsulateBits" && op != "decapsulateKey" && + op != "decapsulateBits") { dom_exception::DOMException::raise(cx, "crypto.subtle.importKey parameter 'keyData': " "each value in the 'key_ops' list must be one of 'encrypt', 'decrypt', " - "'sign', 'verify', 'deriveKey', 'deriveBits', 'wrapKey', or 'unwrapKey'", + "'sign', 'verify', 'deriveKey', 'deriveBits', 'wrapKey', 'unwrapKey', " + "'encapsulateKey', 'encapsulateBits', 'decapsulateKey', or 'decapsulateBits'", "DataError"); return nullptr; } diff --git a/tests/integration/crypto/crypto.js b/tests/integration/crypto/crypto.js index 20164b4a..002b6504 100644 --- a/tests/integration/crypto/crypto.js +++ b/tests/integration/crypto/crypto.js @@ -1139,6 +1139,31 @@ export const handler = serveTest(async (t) => { ); }, TypeError); }); + // https://wicg.github.io/webcrypto-modern-algos/ adds these values to the KeyUsage enum, so + // they must reach the algorithm's usage check (SyntaxError) instead of failing enum + // conversion (TypeError). + const modernKeyUsages = ["encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits"]; + await t.test("subtle.importKey.fifth-parameter-modern-algorithms-usages", async () => { + for (const usage of modernKeyUsages) { + const publicEcdsaJsonWebKeyData = createPublicEcdsaJsonWebKeyData(); + await rejects(async () => { + await crypto.subtle.importKey( + "jwk", + publicEcdsaJsonWebKeyData, + ecdsaJsonWebKeyAlgorithm, + publicEcdsaJsonWebKeyData.ext, + ["verify", usage], + ); + }, DOMException, undefined, "SyntaxError"); + } + }); + await t.test("subtle.importKey.jwk-key_ops-modern-algorithms-usages", async () => { + for (const usage of modernKeyUsages) { + const jwk = { ...createPublicEcdsaJsonWebKeyData(), key_ops: ["verify", usage] }; + const key = await crypto.subtle.importKey("jwk", jwk, ecdsaJsonWebKeyAlgorithm, true, ["verify"]); + deepStrictEqual(key.usages, ["verify"], `key.usages with key_ops ["verify", "${usage}"]`); + } + }); await t.test( "subtle.importKey.fifth-parameter-duplicate-operations", async () => { diff --git a/tests/wpt-harness/expectations/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.js.json b/tests/wpt-harness/expectations/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.js.json index 19e96014..e3c3e479 100644 --- a/tests/wpt-harness/expectations/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.js.json +++ b/tests/wpt-harness/expectations/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.js.json @@ -126,76 +126,76 @@ "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, true, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, Ed25519, false, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [encrypt])": { "status": "PASS" @@ -324,76 +324,76 @@ "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, true, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, Ed25519, false, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [encrypt])": { "status": "PASS" @@ -522,76 +522,76 @@ "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, true, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, Ed25519, false, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [encrypt])": { "status": "PASS" @@ -720,76 +720,76 @@ "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, true, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), Ed25519, false, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [encrypt])": { "status": "PASS" @@ -918,76 +918,76 @@ "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, true, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , Ed25519, false, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [encrypt])": { "status": "PASS" @@ -1116,76 +1116,76 @@ "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [encrypt])": { "status": "PASS" @@ -1314,76 +1314,76 @@ "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [encrypt])": { "status": "PASS" @@ -1512,76 +1512,76 @@ "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [encrypt])": { "status": "PASS" @@ -1710,76 +1710,76 @@ "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [encrypt])": { "status": "PASS" @@ -1908,76 +1908,76 @@ "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, encapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, encapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, decapsulateKey])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, decapsulateBits])": { - "status": "FAIL" + "status": "PASS" }, "Empty usages: importKey(pkcs8, Ed25519, true, [])": { "status": "PASS"