Bläddra i källkod

LibWeb: Correctly set the key_usages on HMAC export

stelar7 8 månader sedan
förälder
incheckning
19ee8ddec2

+ 4 - 11
Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp

@@ -3589,8 +3589,6 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<CryptoKey>> HMAC::import_key(Web::Crypto::A
 // https://w3c.github.io/webcrypto/#hmac-operations
 WebIDL::ExceptionOr<JS::NonnullGCPtr<JS::Object>> HMAC::export_key(Bindings::KeyFormat format, JS::NonnullGCPtr<CryptoKey> key)
 {
-    auto& vm = m_realm->vm();
-
     // 1. If the underlying cryptographic key material represented by the [[handle]] internal slot
     //    of key cannot be accessed, then throw an OperationError.
     // NOTE: In our impl this is always accessible
@@ -3657,15 +3655,10 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<JS::Object>> HMAC::export_key(Bindings::Key
         }
 
         // Set the key_ops attribute of jwk to equal the usages attribute of key.
-        auto key_usages = verify_cast<JS::Array>(key->usages());
-        auto key_usages_length = MUST(MUST(key_usages->get(vm.names.length)).to_length(vm));
-        for (auto i = 0u; i < key_usages_length; ++i) {
-            auto usage = key_usages->get(i);
-            if (!usage.has_value())
-                break;
-
-            auto usage_string = TRY(usage.value().to_string(vm));
-            jwk.key_ops->append(usage_string);
+        jwk.key_ops = Vector<String> {};
+        jwk.key_ops->ensure_capacity(key->internal_usages().size());
+        for (auto const& usage : key->internal_usages()) {
+            jwk.key_ops->append(Bindings::idl_enum_to_string(usage));
         }
 
         // Set the ext attribute of jwk to equal the [[extractable]] internal slot of key.

+ 1 - 0
Tests/LibWeb/Text/expected/Crypto/SubtleCrypto-hmac.txt

@@ -0,0 +1 @@
+Does not crash.

+ 22 - 0
Tests/LibWeb/Text/input/Crypto/SubtleCrypto-hmac.html

@@ -0,0 +1,22 @@
+<script src="../include.js"></script>
+<script>
+    asyncTest(async done => {
+        await crypto.subtle.exportKey(
+            "jwk",
+            await crypto.subtle.generateKey(
+                {
+                    name: "HMAC",
+                    hash: {
+                        name: "SHA-512",
+                    },
+                },
+                !0,
+                ["sign", "verify"]
+            )
+        );
+
+        println("Does not crash.");
+
+        done();
+    });
+</script>