From 8cb371b2cea81787eb3ddf9dd9da837a2dd3c66f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 24 Nov 2024 20:08:33 +0100 Subject: [PATCH] LibWeb: Decode X25519 keys as base64url + throw on bogus key data This makes the X25519 importKey tests from WPT actually run. --- Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp | 12 +- .../okp_importKey_X25519.https.any.txt | 65 +++++ ...kp_importKey_failures_X25519.https.any.txt | 235 ++++++++++++++++++ 3 files changed, 310 insertions(+), 2 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_X25519.https.any.txt create mode 100644 Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_X25519.https.any.txt diff --git a/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp b/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp index 4cf0848b08e..ae64f71fbd8 100644 --- a/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp +++ b/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp @@ -3188,7 +3188,11 @@ WebIDL::ExceptionOr> X25519::import_key([[maybe_unused]] Web: // 2. Let key be a new CryptoKey object that represents the X25519 private key identified by interpreting jwk according to Section 2 of [RFC8037]. auto private_key_base_64 = jwk.d.value(); - auto private_key = TRY_OR_THROW_OOM(vm, decode_base64(private_key_base_64)); + 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". @@ -3217,7 +3221,11 @@ WebIDL::ExceptionOr> X25519::import_key([[maybe_unused]] Web: // 2. Let key be a new CryptoKey object that represents the X25519 public key identified by interpreting jwk according to Section 2 of [RFC8037]. auto public_key_base_64 = jwk.x.value(); - auto public_key = TRY_OR_THROW_OOM(vm, decode_base64(public_key_base_64)); + 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". diff --git a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_X25519.https.any.txt b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_X25519.https.any.txt new file mode 100644 index 00000000000..796cf84fffe --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_X25519.https.any.txt @@ -0,0 +1,65 @@ +Summary + +Harness status: OK + +Rerun + +Found 54 tests + +24 Pass +30 Fail +Details +Result Test Name MessageFail Good parameters: X25519 bits (spki, buffer(44), {name: X25519}, true, []) +Fail Good parameters: X25519 bits (spki, buffer(44), X25519, true, []) +Fail Good parameters: X25519 bits (jwk, object(kty, crv, x), {name: X25519}, true, []) +Fail Good parameters: X25519 bits (jwk, object(kty, crv, x), X25519, true, []) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(kty, crv, x), {name: X25519}, true, []) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(kty, crv, x), X25519, true, []) +Pass Good parameters: X25519 bits (raw, buffer(32), {name: X25519}, true, []) +Pass Good parameters: X25519 bits (raw, buffer(32), X25519, true, []) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, true, [deriveKey]) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), X25519, true, [deriveKey]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, true, [deriveKey]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), X25519, true, [deriveKey]) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, true, [deriveBits, deriveKey]) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), X25519, true, [deriveBits, deriveKey]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits, deriveKey]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, true, [deriveBits, deriveKey]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits, deriveKey]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), X25519, true, [deriveBits, deriveKey]) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, true, [deriveBits]) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), X25519, true, [deriveBits]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, true, [deriveBits]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), X25519, true, [deriveBits]) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Fail Good parameters: X25519 bits (pkcs8, buffer(48), X25519, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Fail Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Fail Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), X25519, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Good parameters: X25519 bits (spki, buffer(44), {name: X25519}, false, []) +Pass Good parameters: X25519 bits (spki, buffer(44), X25519, false, []) +Pass Good parameters: X25519 bits (jwk, object(kty, crv, x), {name: X25519}, false, []) +Pass Good parameters: X25519 bits (jwk, object(kty, crv, x), X25519, false, []) +Pass Good parameters: X25519 bits (raw, buffer(32), {name: X25519}, false, []) +Pass Good parameters: X25519 bits (raw, buffer(32), X25519, false, []) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, false, [deriveKey]) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), X25519, false, [deriveKey]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, false, [deriveKey]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, false, [deriveKey]) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, false, [deriveBits, deriveKey]) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), X25519, false, [deriveBits, deriveKey]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, false, [deriveBits, deriveKey]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, false, [deriveBits, deriveKey]) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, false, [deriveBits]) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), X25519, false, [deriveBits]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, false, [deriveBits]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, false, [deriveBits]) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Good parameters: X25519 bits (pkcs8, buffer(48), X25519, false, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Good parameters: X25519 bits (jwk, object(crv, d, x, kty), X25519, false, [deriveKey, deriveBits, deriveKey, deriveBits]) \ No newline at end of file diff --git a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_X25519.https.any.txt b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_X25519.https.any.txt new file mode 100644 index 00000000000..73b1672b789 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/import_export/okp_importKey_failures_X25519.https.any.txt @@ -0,0 +1,235 @@ +Summary + +Harness status: OK + +Rerun + +Found 224 tests + +208 Pass +16 Fail +Details +Result Test Name MessagePass Bad usages: importKey(spki, {name: X25519}, true, [encrypt]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [encrypt]) +Pass Bad usages: importKey(spki, {name: X25519}, true, [decrypt]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [decrypt]) +Pass Bad usages: importKey(spki, {name: X25519}, true, [sign]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [sign]) +Pass Bad usages: importKey(spki, {name: X25519}, true, [verify]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [verify]) +Pass Bad usages: importKey(spki, {name: X25519}, true, [wrapKey]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [wrapKey]) +Pass Bad usages: importKey(spki, {name: X25519}, true, [unwrapKey]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [unwrapKey]) +Pass Bad usages: importKey(spki, {name: X25519}, true, [deriveKey]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [deriveKey]) +Pass Bad usages: importKey(spki, {name: X25519}, true, [deriveBits]) +Pass Bad usages: importKey(spki, {name: X25519}, false, [deriveBits]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, deriveKey, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, deriveKey, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, encrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, deriveKey, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, deriveKey, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, decrypt]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, deriveKey, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, deriveKey, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, sign]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, deriveKey, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, deriveKey, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, verify]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, deriveKey, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, deriveKey, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, wrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, deriveKey, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, deriveKey, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveBits, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveBits, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, unwrapKey]) +Pass Bad usages: importKey(pkcs8, {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, unwrapKey]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [encrypt]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [encrypt]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [decrypt]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [decrypt]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [sign]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [sign]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [verify]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [verify]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [wrapKey]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [wrapKey]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [unwrapKey]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [unwrapKey]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [deriveKey]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [deriveKey]) +Pass Bad usages: importKey(raw, {name: X25519}, true, [deriveBits]) +Pass Bad usages: importKey(raw, {name: X25519}, false, [deriveBits]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, encrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, decrypt]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, sign]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, verify]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, wrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveBits, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveBits, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits, unwrapKey]) +Pass Bad usages: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits, unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [encrypt]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [decrypt]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [sign]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [sign]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [verify]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [verify]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [wrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [unwrapKey]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [deriveKey]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, true, [deriveBits]) +Pass Bad usages: importKey(jwk (public) , {name: X25519}, false, [deriveBits]) +Pass Empty usages: importKey(pkcs8, {name: X25519}, true, []) +Pass Empty usages: importKey(pkcs8, {name: X25519}, false, []) +Pass Empty usages: importKey(jwk(private), {name: X25519}, true, []) +Pass Empty usages: importKey(jwk(private), {name: X25519}, false, []) +Pass Bad key length: importKey(spki, {name: X25519}, true, []) +Pass Bad key length: importKey(spki, {name: X25519}, false, []) +Pass Bad key length: importKey(pkcs8, {name: X25519}, true, [deriveKey]) +Pass Bad key length: importKey(pkcs8, {name: X25519}, false, [deriveKey]) +Pass Bad key length: importKey(pkcs8, {name: X25519}, true, [deriveBits, deriveKey]) +Pass Bad key length: importKey(pkcs8, {name: X25519}, false, [deriveBits, deriveKey]) +Pass Bad key length: importKey(pkcs8, {name: X25519}, true, [deriveBits]) +Pass Bad key length: importKey(pkcs8, {name: X25519}, false, [deriveBits]) +Pass Bad key length: importKey(pkcs8, {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Bad key length: importKey(pkcs8, {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits]) +Fail Bad key length: importKey(raw, {name: X25519}, true, []) +Fail Bad key length: importKey(raw, {name: X25519}, false, []) +Fail Bad key length: importKey(jwk (public) , {name: X25519}, true, []) +Fail Bad key length: importKey(jwk (public) , {name: X25519}, false, []) +Fail Bad key length: importKey(jwk(private), {name: X25519}, true, [deriveKey]) +Fail Bad key length: importKey(jwk(private), {name: X25519}, false, [deriveKey]) +Fail Bad key length: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey]) +Fail Bad key length: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey]) +Fail Bad key length: importKey(jwk(private), {name: X25519}, true, [deriveBits]) +Fail Bad key length: importKey(jwk(private), {name: X25519}, false, [deriveBits]) +Fail Bad key length: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Fail Bad key length: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, true, [deriveKey]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, false, [deriveKey]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, true, [deriveBits]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, false, [deriveBits]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Missing JWK 'x' parameter: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, true, [deriveKey]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, false, [deriveKey]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, false, [deriveBits, deriveKey]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, true, [deriveBits]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, false, [deriveBits]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Missing JWK 'kty' parameter: importKey(jwk(private), {name: X25519}, false, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Missing JWK 'crv' parameter: importKey(jwk (public) , {name: X25519}, true, []) +Pass Missing JWK 'crv' parameter: importKey(jwk (public) , {name: X25519}, false, []) +Fail Invalid key pair: importKey(jwk(private), {name: X25519}, true, [deriveKey]) +Fail Invalid key pair: importKey(jwk(private), {name: X25519}, true, [deriveBits, deriveKey]) +Fail Invalid key pair: importKey(jwk(private), {name: X25519}, true, [deriveBits]) +Fail Invalid key pair: importKey(jwk(private), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits]) +Pass Missing algorithm name: importKey(pkcs8, {}, true, deriveKey) +Pass Missing algorithm name: importKey(pkcs8, {}, false, deriveKey) +Pass Missing algorithm name: importKey(pkcs8, {}, true, deriveBits) +Pass Missing algorithm name: importKey(pkcs8, {}, false, deriveBits) +Pass Missing algorithm name: importKey(jwk(private), {}, true, deriveKey) +Pass Missing algorithm name: importKey(jwk(private), {}, false, deriveKey) +Pass Missing algorithm name: importKey(jwk(private), {}, true, deriveBits) +Pass Missing algorithm name: importKey(jwk(private), {}, false, deriveBits) \ No newline at end of file