diff --git a/Libraries/LibTLS/Certificate.h b/Libraries/LibTLS/Certificate.h index 2aa26ff5db3..a05c76b4c18 100644 --- a/Libraries/LibTLS/Certificate.h +++ b/Libraries/LibTLS/Certificate.h @@ -37,7 +37,7 @@ constexpr static Array ed25519_oid { 1, 3, 101, 112 }, ed448_oid { 1, 3, 101, 113 }; -constexpr static Array, 10> known_algorithm_identifiers { +constexpr static Array, 11> known_algorithm_identifiers { rsa_encryption_oid, rsa_md5_encryption_oid, rsa_sha1_encryption_oid, @@ -47,7 +47,8 @@ constexpr static Array, 10> known_algorithm_identifiers { ecdsa_with_sha256_encryption_oid, ecdsa_with_sha384_encryption_oid, ec_public_key_encryption_oid, - x25519_oid + x25519_oid, + ed25519_oid, }; constexpr static Array diff --git a/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp b/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp index ae64f71fbd8..b1c83cb3ad2 100644 --- a/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp +++ b/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp @@ -2693,6 +2693,263 @@ WebIDL::ExceptionOr, GC::Ref>> ED25519 return Variant, GC::Ref> { CryptoKeyPair::create(m_realm, public_key, private_key) }; } +// https://wicg.github.io/webcrypto-secure-curves/#ed25519-operations +WebIDL::ExceptionOr> ED25519::import_key( + [[maybe_unused]] Web::Crypto::AlgorithmParams const& params, + Bindings::KeyFormat format, + CryptoKey::InternalKeyData key_data, + bool extractable, + Vector const& usages) +{ + GC::Ptr key = nullptr; + + // 1. Let keyData be the key data to be imported. + + // 2. If format is "spki": + if (format == Bindings::KeyFormat::Spki) { + // 1. If usages contains a value which is not "verify" then throw a SyntaxError. + for (auto const& usage : usages) { + if (usage != Bindings::KeyUsage::Verify) { + return WebIDL::SyntaxError::create(m_realm, MUST(String::formatted("Invalid key usage '{}'", idl_enum_to_string(usage)))); + } + } + + // 2. Let spki be the result of running the parse a subjectPublicKeyInfo algorithm over keyData. + // 3. If an error occurred while parsing, then throw a DataError. + auto spki = TRY(parse_a_subject_public_key_info(m_realm, key_data.get())); + + // 4. If the algorithm object identifier field of the algorithm AlgorithmIdentifier field of spki + // is not equal to the id-Ed25519 object identifier defined in [RFC8410], then throw a DataError. + if (spki.algorithm.identifier != TLS::ed25519_oid) + return WebIDL::DataError::create(m_realm, "Invalid algorithm identifier"_string); + + // 5. If the parameters field of the algorithm AlgorithmIdentifier field of spki is present, then throw a DataError. + if (static_cast(spki.algorithm.ec_parameters) != 0) + return WebIDL::DataError::create(m_realm, "Invalid algorithm parameters"_string); + + // 6. Let publicKey be the Ed25519 public key identified by the subjectPublicKey field of spki. + auto const& public_key = spki.raw_key; + + // 7. Let key be a new CryptoKey associated with the relevant global object of this [HTML], + // and that represents publicKey. + key = CryptoKey::create(m_realm, CryptoKey::InternalKeyData { public_key }); + + // 8. Set the [[type]] internal slot of key to "public" + key->set_type(Bindings::KeyType::Public); + + // 9. Let algorithm be a new KeyAlgorithm. + auto algorithm = KeyAlgorithm::create(m_realm); + + // 10. Set the name attribute of algorithm to "Ed25519". + algorithm->set_name("Ed25519"_string); + + // 11. Set the [[algorithm]] internal slot of key to algorithm. + key->set_algorithm(algorithm); + } + + // 2. If format is "pkcs8": + else if (format == Bindings::KeyFormat::Pkcs8) { + // 1. If usages contains a value which is not "sign" then throw a SyntaxError. + for (auto const& usage : usages) { + if (usage != Bindings::KeyUsage::Sign) { + return WebIDL::SyntaxError::create(m_realm, MUST(String::formatted("Invalid key usage '{}'", idl_enum_to_string(usage)))); + } + } + + // 2. Let privateKeyInfo be the result of running the parse a privateKeyInfo algorithm over keyData. + // 3. If an error occurs while parsing, then throw a DataError. + auto private_key_info = TRY(parse_a_private_key_info(m_realm, key_data.get())); + + // 4. If the algorithm object identifier field of the privateKeyAlgorithm PrivateKeyAlgorithm field + // of privateKeyInfo is not equal to the id-Ed25519 object identifier defined in [RFC8410], then throw a DataError. + if (private_key_info.algorithm.identifier != TLS::ed25519_oid) + return WebIDL::DataError::create(m_realm, "Invalid algorithm identifier"_string); + + // 5. If the parameters field of the privateKeyAlgorithm PrivateKeyAlgorithmIdentifier field of privateKeyInfo is present, + // then throw a DataError. + if (static_cast(private_key_info.algorithm.ec_parameters) != 0) + return WebIDL::DataError::create(m_realm, "Invalid algorithm parameters"_string); + + // 6. Let curvePrivateKey be the result of performing the parse an ASN.1 structure algorithm, + // with data as the privateKey field of privateKeyInfo, structure as the ASN.1 CurvePrivateKey structure + // specified in Section 7 of [RFC8410], and exactData set to true. + // 7. If an error occurred while parsing, then throw a DataError. + auto curve_private_key = TRY(parse_an_ASN1_structure(m_realm, private_key_info.raw_key, true)); + auto curve_private_key_bytes = TRY_OR_THROW_OOM(m_realm->vm(), ByteBuffer::copy(curve_private_key.bytes())); + + // 8. Let key be a new CryptoKey associated with the relevant global object of this [HTML], + // and that represents the Ed25519 private key identified by curvePrivateKey. + key = CryptoKey::create(m_realm, CryptoKey::InternalKeyData { curve_private_key_bytes }); + + // 9. Set the [[type]] internal slot of key to "private" + key->set_type(Bindings::KeyType::Private); + + // 10. Let algorithm be a new KeyAlgorithm. + auto algorithm = KeyAlgorithm::create(m_realm); + + // 11. Set the name attribute of algorithm to "Ed25519". + algorithm->set_name("Ed25519"_string); + + // 12. Set the [[algorithm]] internal slot of key to algorithm. + key->set_algorithm(algorithm); + } + + // 2. If format is "jwk": + else if (format == Bindings::KeyFormat::Jwk) { + // 1. If keyData is a JsonWebKey dictionary: Let jwk equal keyData. + // Otherwise: Throw a DataError. + if (!key_data.has()) + return WebIDL::DataError::create(m_realm, "keyData is not a JsonWebKey dictionary"_string); + auto& jwk = key_data.get(); + + // 2. If the d field is present and usages contains a value which is not "sign", + // or, if the d field is not present and usages contains a value which is not "verify" then throw a SyntaxError. + if (jwk.d.has_value()) { + for (auto const& usage : usages) { + if (usage != Bindings::KeyUsage::Sign) { + return WebIDL::SyntaxError::create(m_realm, MUST(String::formatted("Invalid key usage '{}'", idl_enum_to_string(usage)))); + } + } + } else { + for (auto const& usage : usages) { + if (usage != Bindings::KeyUsage::Verify) { + return WebIDL::SyntaxError::create(m_realm, MUST(String::formatted("Invalid key usage '{}'", idl_enum_to_string(usage)))); + } + } + } + + // 3. If the kty field of jwk is not "OKP", then throw a DataError. + if (jwk.kty != "OKP"sv) + return WebIDL::DataError::create(m_realm, "Invalid key type"_string); + + // 4. If the crv field of jwk is not "Ed25519", then throw a DataError. + if (jwk.crv != "Ed25519"sv) + return WebIDL::DataError::create(m_realm, "Invalid curve"_string); + + // 5. If usages is non-empty and the use field of jwk is present and is not "sig", then throw a DataError. + if (!usages.is_empty() && jwk.use.has_value() && jwk.use.value() != "sig") + return WebIDL::DataError::create(m_realm, "Invalid key usage"_string); + + // 6. If the key_ops field of jwk is present, and is invalid according to the requirements of JSON Web Key [JWK], + // or it does not contain all of the specified usages values, then throw a DataError. + TRY(validate_jwk_key_ops(m_realm, jwk, usages)); + + // 7. If the ext field of jwk is present and has the value false and extractable is true, then throw a DataError. + if (jwk.ext.has_value() && !jwk.ext.value() && extractable) + return WebIDL::DataError::create(m_realm, "Invalid extractable"_string); + + // 8. If the d field is present: + if (jwk.d.has_value()) { + // 1. If jwk does not meet the requirements of the JWK private key format described in Section 2 of [RFC8037], + // then throw a DataError. + // o The parameter "kty" MUST be "OKP". + if (jwk.kty != "OKP"sv) + return WebIDL::DataError::create(m_realm, "Invalid key type"_string); + + // https://www.iana.org/assignments/jose/jose.xhtml#web-key-elliptic-curve + // o The parameter "crv" MUST be present and contain the subtype of the key (from the "JSON Web Elliptic Curve" registry). + if (jwk.crv != "Ed25519"sv) + return WebIDL::DataError::create(m_realm, "Invalid curve"_string); + + // o The parameter "x" MUST be present and contain the public key encoded using the base64url [RFC4648] encoding. + if (!jwk.x.has_value()) + return WebIDL::DataError::create(m_realm, "Missing x field"_string); + + // o The parameter "d" MUST be present for private keys and contain the private key encoded using the base64url encoding. + // This parameter MUST NOT be present for public keys. + if (!jwk.d.has_value()) + return WebIDL::DataError::create(m_realm, "Present d field"_string); + + // 2. Let key be a new CryptoKey object that represents the Ed25519 private key identified by interpreting jwk according to Section 2 of [RFC8037]. + auto private_key_base_64 = jwk.d.value(); + auto private_key_or_error = decode_base64url(private_key_base_64); + if (private_key_or_error.is_error()) { + return WebIDL::DataError::create(m_realm, "Failed to decode base64"_string); + } + auto private_key = private_key_or_error.release_value(); + key = CryptoKey::create(m_realm, CryptoKey::InternalKeyData { private_key }); + + // 3. Set the [[type]] internal slot of Key to "private". + key->set_type(Bindings::KeyType::Private); + } + // Otherwise: + else { + // 1. If jwk does not meet the requirements of the JWK public key format described in Section 2 of [RFC8037], then throw a DataError. + // o The parameter "kty" MUST be "OKP". + if (jwk.kty != "OKP"sv) + return WebIDL::DataError::create(m_realm, "Invalid key type"_string); + + // https://www.iana.org/assignments/jose/jose.xhtml#web-key-elliptic-curve + // o The parameter "crv" MUST be present and contain the subtype of the key (from the "JSON Web Elliptic Curve" registry). + if (jwk.crv != "Ed25519"sv) + return WebIDL::DataError::create(m_realm, "Invalid curve"_string); + + // o The parameter "x" MUST be present and contain the public key encoded using the base64url [RFC4648] encoding. + if (!jwk.x.has_value()) + return WebIDL::DataError::create(m_realm, "Missing x field"_string); + + // o The parameter "d" MUST be present for private keys and contain the private key encoded using the base64url encoding. + // This parameter MUST NOT be present for public keys. + if (jwk.d.has_value()) + return WebIDL::DataError::create(m_realm, "Present d field"_string); + + // 2. Let key be a new CryptoKey object that represents the Ed25519 public key identified by interpreting jwk according to Section 2 of [RFC8037]. + auto public_key_base_64 = jwk.x.value(); + auto public_key_or_error = decode_base64url(public_key_base_64); + if (public_key_or_error.is_error()) { + return WebIDL::DataError::create(m_realm, "Failed to decode base64"_string); + } + auto public_key = public_key_or_error.release_value(); + key = CryptoKey::create(m_realm, CryptoKey::InternalKeyData { public_key }); + + // 3. Set the [[type]] internal slot of Key to "public". + key->set_type(Bindings::KeyType::Public); + } + + // 9. Let algorithm be a new instance of a KeyAlgorithm object. + auto algorithm = KeyAlgorithm::create(m_realm); + + // 10. Set the name attribute of algorithm to "Ed25519". + algorithm->set_name("Ed25519"_string); + + // 11. Set the [[algorithm]] internal slot of key to algorithm. + key->set_algorithm(algorithm); + } + + // 2. If format is "raw": + else if (format == Bindings::KeyFormat::Raw) { + // 1. If usages contains a value which is not "verify" then throw a SyntaxError. + for (auto const& usage : usages) { + if (usage != Bindings::KeyUsage::Verify) { + return WebIDL::SyntaxError::create(m_realm, MUST(String::formatted("Invalid key usage '{}'", idl_enum_to_string(usage)))); + } + } + + // 2. Let algorithm be a new KeyAlgorithm object. + auto algorithm = KeyAlgorithm::create(m_realm); + + // 3. Set the name attribute of algorithm to "Ed25519". + algorithm->set_name("Ed25519"_string); + + // 4. Let key be a new CryptoKey associated with the relevant global object of this [HTML], and representing the key data provided in keyData. + key = CryptoKey::create(m_realm, key_data); + + // 5. Set the [[type]] internal slot of key to "public" + key->set_type(Bindings::KeyType::Public); + + // 6. Set the [[algorithm]] internal slot of key to algorithm. + key->set_algorithm(algorithm); + } + + // 2. Otherwise: + else { + // throw a NotSupportedError. + return WebIDL::NotSupportedError::create(m_realm, "Invalid key format"_string); + } + + return GC::Ref { *key }; +} + WebIDL::ExceptionOr> ED25519::sign([[maybe_unused]] AlgorithmParams const& params, GC::Ref key, ByteBuffer const& message) { auto& realm = *m_realm; diff --git a/Libraries/LibWeb/Crypto/CryptoAlgorithms.h b/Libraries/LibWeb/Crypto/CryptoAlgorithms.h index 8a9a9111c23..ca780f6e821 100644 --- a/Libraries/LibWeb/Crypto/CryptoAlgorithms.h +++ b/Libraries/LibWeb/Crypto/CryptoAlgorithms.h @@ -515,6 +515,7 @@ public: virtual WebIDL::ExceptionOr verify(AlgorithmParams const&, GC::Ref, ByteBuffer const&, ByteBuffer const&) override; virtual WebIDL::ExceptionOr, GC::Ref>> generate_key(AlgorithmParams const&, bool, Vector const&) override; + virtual WebIDL::ExceptionOr> import_key(AlgorithmParams const&, Bindings::KeyFormat, CryptoKey::InternalKeyData, bool, Vector const&) override; static NonnullOwnPtr create(JS::Realm& realm) { return adopt_own(*new ED25519(realm)); } diff --git a/Libraries/LibWeb/Crypto/SubtleCrypto.cpp b/Libraries/LibWeb/Crypto/SubtleCrypto.cpp index 6c23f2c2272..ef5986386cb 100644 --- a/Libraries/LibWeb/Crypto/SubtleCrypto.cpp +++ b/Libraries/LibWeb/Crypto/SubtleCrypto.cpp @@ -878,7 +878,7 @@ SupportedAlgorithmsMap supported_algorithms() define_an_algorithm("sign"_string, "Ed25519"_string); define_an_algorithm("verify"_string, "Ed25519"_string); define_an_algorithm("generateKey"_string, "Ed25519"_string); - // FIXME: define_an_algorithm("importKey"_string, "Ed25519"_string); + define_an_algorithm("importKey"_string, "Ed25519"_string); // FIXME: define_an_algorithm("exportKey"_string, "Ed25519"_string); // https://wicg.github.io/webcrypto-secure-curves/#ed448-registration diff --git a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_Ed25519.https.any.txt b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_Ed25519.https.any.txt index 0318f2efb5d..fa1f7917e2c 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_Ed25519.https.any.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_Ed25519.https.any.txt @@ -6,7 +6,8 @@ Rerun Found 62 tests -62 Fail +26 Pass +36 Fail Details Result Test Name MessageFail Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, true, [verify]) Fail Good parameters: Ed25519 bits (spki, buffer(44), Ed25519, true, [verify]) @@ -44,29 +45,29 @@ Fail Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), {name: Ed25519} Fail Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), Ed25519, true, [sign, sign]) Fail Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign, sign]) Fail Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), Ed25519, true, [sign, sign]) -Fail Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, false, [verify]) -Fail Good parameters: Ed25519 bits (spki, buffer(44), Ed25519, false, [verify]) -Fail Good parameters: Ed25519 bits (jwk, object(kty, crv, x), {name: Ed25519}, false, [verify]) -Fail Good parameters: Ed25519 bits (jwk, object(kty, crv, x), Ed25519, false, [verify]) -Fail Good parameters: Ed25519 bits (raw, buffer(32), {name: Ed25519}, false, [verify]) -Fail Good parameters: Ed25519 bits (raw, buffer(32), Ed25519, false, [verify]) -Fail Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, false, []) -Fail Good parameters: Ed25519 bits (spki, buffer(44), Ed25519, false, []) -Fail Good parameters: Ed25519 bits (jwk, object(kty, crv, x), {name: Ed25519}, false, []) -Fail Good parameters: Ed25519 bits (jwk, object(kty, crv, x), Ed25519, false, []) -Fail Good parameters: Ed25519 bits (raw, buffer(32), {name: Ed25519}, false, []) -Fail Good parameters: Ed25519 bits (raw, buffer(32), Ed25519, false, []) -Fail Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, false, [verify, verify]) -Fail Good parameters: Ed25519 bits (spki, buffer(44), Ed25519, false, [verify, verify]) -Fail Good parameters: Ed25519 bits (jwk, object(kty, crv, x), {name: Ed25519}, false, [verify, verify]) -Fail Good parameters: Ed25519 bits (jwk, object(kty, crv, x), Ed25519, false, [verify, verify]) -Fail Good parameters: Ed25519 bits (raw, buffer(32), {name: Ed25519}, false, [verify, verify]) -Fail Good parameters: Ed25519 bits (raw, buffer(32), Ed25519, false, [verify, verify]) -Fail Good parameters: Ed25519 bits (pkcs8, buffer(48), {name: Ed25519}, false, [sign]) -Fail Good parameters: Ed25519 bits (pkcs8, buffer(48), Ed25519, false, [sign]) -Fail Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), {name: Ed25519}, false, [sign]) -Fail Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), Ed25519, false, [sign]) -Fail Good parameters: Ed25519 bits (pkcs8, buffer(48), {name: Ed25519}, false, [sign, sign]) -Fail Good parameters: Ed25519 bits (pkcs8, buffer(48), Ed25519, false, [sign, sign]) -Fail Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), {name: Ed25519}, false, [sign, sign]) -Fail Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), Ed25519, false, [sign, sign]) \ No newline at end of file +Pass Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, false, [verify]) +Pass Good parameters: Ed25519 bits (spki, buffer(44), Ed25519, false, [verify]) +Pass Good parameters: Ed25519 bits (jwk, object(kty, crv, x), {name: Ed25519}, false, [verify]) +Pass Good parameters: Ed25519 bits (jwk, object(kty, crv, x), Ed25519, false, [verify]) +Pass Good parameters: Ed25519 bits (raw, buffer(32), {name: Ed25519}, false, [verify]) +Pass Good parameters: Ed25519 bits (raw, buffer(32), Ed25519, false, [verify]) +Pass Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, false, []) +Pass Good parameters: Ed25519 bits (spki, buffer(44), Ed25519, false, []) +Pass Good parameters: Ed25519 bits (jwk, object(kty, crv, x), {name: Ed25519}, false, []) +Pass Good parameters: Ed25519 bits (jwk, object(kty, crv, x), Ed25519, false, []) +Pass Good parameters: Ed25519 bits (raw, buffer(32), {name: Ed25519}, false, []) +Pass Good parameters: Ed25519 bits (raw, buffer(32), Ed25519, false, []) +Pass Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, false, [verify, verify]) +Pass Good parameters: Ed25519 bits (spki, buffer(44), Ed25519, false, [verify, verify]) +Pass Good parameters: Ed25519 bits (jwk, object(kty, crv, x), {name: Ed25519}, false, [verify, verify]) +Pass Good parameters: Ed25519 bits (jwk, object(kty, crv, x), Ed25519, false, [verify, verify]) +Pass Good parameters: Ed25519 bits (raw, buffer(32), {name: Ed25519}, false, [verify, verify]) +Pass Good parameters: Ed25519 bits (raw, buffer(32), Ed25519, false, [verify, verify]) +Pass Good parameters: Ed25519 bits (pkcs8, buffer(48), {name: Ed25519}, false, [sign]) +Pass Good parameters: Ed25519 bits (pkcs8, buffer(48), Ed25519, false, [sign]) +Pass Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), {name: Ed25519}, false, [sign]) +Pass Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), Ed25519, false, [sign]) +Pass Good parameters: Ed25519 bits (pkcs8, buffer(48), {name: Ed25519}, false, [sign, sign]) +Pass Good parameters: Ed25519 bits (pkcs8, buffer(48), Ed25519, false, [sign, sign]) +Pass Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), {name: Ed25519}, false, [sign, sign]) +Pass Good parameters: Ed25519 bits (jwk, object(crv, d, x, kty), Ed25519, false, [sign, sign]) \ No newline at end of file diff --git a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.txt b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.txt index 78aa51030c2..53a3f838abc 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_Ed25519.https.any.txt @@ -6,231 +6,231 @@ Rerun Found 258 tests -10 Pass -248 Fail +244 Pass +14 Fail Details -Result Test Name MessageFail Bad usages: importKey(spki, {name: Ed25519}, true, [encrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [encrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, encrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, encrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, encrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, encrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [decrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [decrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, decrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, decrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, decrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, decrypt]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [sign]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [sign]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, sign]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, sign]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, sign]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, sign]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [wrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [wrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, wrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, wrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, wrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, wrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [unwrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [unwrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, unwrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, unwrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, unwrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, unwrapKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [deriveKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [deriveKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, deriveKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, deriveKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, deriveKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, deriveKey]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [deriveBits]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [deriveBits]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, deriveBits]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, deriveBits]) -Fail Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, deriveBits]) -Fail Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, deriveBits]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [encrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [encrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, encrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, encrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, encrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, encrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [decrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [decrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, decrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, decrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, decrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, decrypt]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [verify]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [verify]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, verify]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, verify]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, verify]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, verify]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [wrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [wrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, wrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, wrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, wrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, wrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [unwrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [unwrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, unwrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, unwrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, unwrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, unwrapKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [deriveKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [deriveKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, deriveKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, deriveKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, deriveKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, deriveKey]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [deriveBits]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [deriveBits]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, deriveBits]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, deriveBits]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, deriveBits]) -Fail Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, deriveBits]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [encrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [encrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, encrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, encrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, encrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, encrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [decrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [decrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, decrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, decrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, decrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, decrypt]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [sign]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [sign]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, sign]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, sign]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, sign]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, sign]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [wrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [wrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, wrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, wrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, wrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, wrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [unwrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [unwrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, unwrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, unwrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, unwrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, unwrapKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [deriveKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [deriveKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, deriveKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, deriveKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, deriveKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, deriveKey]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [deriveBits]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [deriveBits]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, deriveBits]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, deriveBits]) -Fail Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, deriveBits]) -Fail Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, deriveBits]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [encrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [encrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, encrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, encrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, encrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, encrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [decrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [decrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, decrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, decrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, decrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, decrypt]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [verify]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [verify]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, verify]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, verify]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, verify]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, verify]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [wrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [wrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, wrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, wrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, wrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, wrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [unwrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [unwrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, unwrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, unwrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, unwrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, unwrapKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [deriveKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [deriveKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, deriveKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, deriveKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, deriveKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, deriveKey]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [deriveBits]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [deriveBits]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, deriveBits]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, deriveBits]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, deriveBits]) -Fail Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, deriveBits]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [encrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [encrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, encrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, encrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, encrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, encrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [decrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [decrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, decrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, decrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, decrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, decrypt]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [sign]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [sign]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, sign]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, sign]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, sign]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, sign]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [wrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [wrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, wrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, wrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, wrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, wrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [unwrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [unwrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, unwrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, unwrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, unwrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, unwrapKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [deriveKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [deriveKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, deriveKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, deriveKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, deriveKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, deriveKey]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [deriveBits]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [deriveBits]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, deriveBits]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, deriveBits]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, deriveBits]) -Fail Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, deriveBits]) -Fail Empty usages: importKey(pkcs8, {name: Ed25519}, true, []) -Fail Empty usages: importKey(pkcs8, {name: Ed25519}, false, []) -Fail Empty usages: importKey(jwk(private), {name: Ed25519}, true, []) -Fail Empty usages: importKey(jwk(private), {name: Ed25519}, false, []) -Fail Bad key length: importKey(spki, {name: Ed25519}, true, [verify]) -Fail Bad key length: importKey(spki, {name: Ed25519}, false, [verify]) -Fail Bad key length: importKey(spki, {name: Ed25519}, true, [verify, verify]) -Fail Bad key length: importKey(spki, {name: Ed25519}, false, [verify, verify]) -Fail Bad key length: importKey(pkcs8, {name: Ed25519}, true, [sign]) -Fail Bad key length: importKey(pkcs8, {name: Ed25519}, false, [sign]) -Fail Bad key length: importKey(pkcs8, {name: Ed25519}, true, [sign, sign]) -Fail Bad key length: importKey(pkcs8, {name: Ed25519}, false, [sign, sign]) +Result Test Name MessagePass Bad usages: importKey(spki, {name: Ed25519}, true, [encrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [encrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, encrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, encrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, encrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, encrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [decrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [decrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, decrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, decrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, decrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, decrypt]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [sign]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [sign]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, sign]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, sign]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, sign]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, sign]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [wrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [wrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, wrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, wrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, wrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, wrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [unwrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [unwrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, unwrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, unwrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, unwrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, unwrapKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [deriveKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [deriveKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, deriveKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, deriveKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, deriveKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, deriveKey]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [deriveBits]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [deriveBits]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, deriveBits]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, deriveBits]) +Pass Bad usages: importKey(spki, {name: Ed25519}, true, [verify, verify, deriveBits]) +Pass Bad usages: importKey(spki, {name: Ed25519}, false, [verify, verify, deriveBits]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [encrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [encrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [decrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [decrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [verify]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [verify]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, verify]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, verify]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, verify]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, verify]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [deriveKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [deriveKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, deriveKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, deriveKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, deriveKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, deriveKey]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [deriveBits]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [deriveBits]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, deriveBits]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, deriveBits]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, true, [sign, sign, deriveBits]) +Pass Bad usages: importKey(pkcs8, {name: Ed25519}, false, [sign, sign, deriveBits]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [encrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [encrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, encrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, encrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, encrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, encrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [decrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [decrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, decrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, decrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, decrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, decrypt]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [sign]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [sign]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, sign]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, sign]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, sign]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, sign]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [wrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [wrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, wrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, wrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, wrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, wrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [unwrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [unwrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, unwrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, unwrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, unwrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, unwrapKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [deriveKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [deriveKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, deriveKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, deriveKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, deriveKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, deriveKey]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [deriveBits]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [deriveBits]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, deriveBits]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, deriveBits]) +Pass Bad usages: importKey(raw, {name: Ed25519}, true, [verify, verify, deriveBits]) +Pass Bad usages: importKey(raw, {name: Ed25519}, false, [verify, verify, deriveBits]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [encrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [encrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [decrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [decrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [verify]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [verify]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, verify]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, verify]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, verify]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, verify]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [deriveKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [deriveKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, deriveKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, deriveKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, deriveKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, deriveKey]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [deriveBits]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [deriveBits]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, deriveBits]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, deriveBits]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, true, [sign, sign, deriveBits]) +Pass Bad usages: importKey(jwk(private), {name: Ed25519}, false, [sign, sign, deriveBits]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [sign]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [sign]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, sign]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, sign]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, sign]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, sign]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [deriveBits]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [deriveBits]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, deriveBits]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, deriveBits]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify, deriveBits]) +Pass Bad usages: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify, deriveBits]) +Pass Empty usages: importKey(pkcs8, {name: Ed25519}, true, []) +Pass Empty usages: importKey(pkcs8, {name: Ed25519}, false, []) +Pass Empty usages: importKey(jwk(private), {name: Ed25519}, true, []) +Pass Empty usages: importKey(jwk(private), {name: Ed25519}, false, []) +Pass Bad key length: importKey(spki, {name: Ed25519}, true, [verify]) +Pass Bad key length: importKey(spki, {name: Ed25519}, false, [verify]) +Pass Bad key length: importKey(spki, {name: Ed25519}, true, [verify, verify]) +Pass Bad key length: importKey(spki, {name: Ed25519}, false, [verify, verify]) +Pass Bad key length: importKey(pkcs8, {name: Ed25519}, true, [sign]) +Pass Bad key length: importKey(pkcs8, {name: Ed25519}, false, [sign]) +Pass Bad key length: importKey(pkcs8, {name: Ed25519}, true, [sign, sign]) +Pass Bad key length: importKey(pkcs8, {name: Ed25519}, false, [sign, sign]) Fail Bad key length: importKey(raw, {name: Ed25519}, true, [verify]) Fail Bad key length: importKey(raw, {name: Ed25519}, false, [verify]) Fail Bad key length: importKey(raw, {name: Ed25519}, true, [verify, verify]) @@ -243,18 +243,18 @@ Fail Bad key length: importKey(jwk (public) , {name: Ed25519}, true, [verify]) Fail Bad key length: importKey(jwk (public) , {name: Ed25519}, false, [verify]) Fail Bad key length: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify]) Fail Bad key length: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify]) -Fail Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign]) -Fail Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign]) -Fail Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign, sign]) -Fail Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign, sign]) -Fail Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign]) -Fail Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign]) -Fail Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign, sign]) -Fail Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign, sign]) -Fail Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, true, [verify]) -Fail Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, false, [verify]) -Fail Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify]) -Fail Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign, sign]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign, sign]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, true, [sign, sign]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: Ed25519}, false, [sign, sign]) +Pass Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, true, [verify]) +Pass Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, false, [verify]) +Pass Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, true, [verify, verify]) +Pass Missing JWK 'crv' parameter: importKey(jwk (public) , {name: Ed25519}, false, [verify, verify]) Fail Invalid key pair: importKey(jwk(private), {name: Ed25519}, true, [sign]) Fail Invalid key pair: importKey(jwk(private), {name: Ed25519}, true, [sign, sign]) Pass Missing algorithm name: importKey(spki, {}, true, verify)