Selaa lähdekoodia

LibWeb: Decode X25519 keys as base64url + throw on bogus key data

This makes the X25519 importKey tests from WPT actually run.
Andreas Kling 8 kuukautta sitten
vanhempi
commit
8cb371b2ce

+ 10 - 2
Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp

@@ -3188,7 +3188,11 @@ WebIDL::ExceptionOr<GC::Ref<CryptoKey>> 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<GC::Ref<CryptoKey>> 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".

+ 65 - 0
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])	

+ 235 - 0
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)