diff --git a/Tests/LibWeb/Text/expected/Crypto/SubtleCrypto-import-PBKDF2.txt b/Tests/LibWeb/Text/expected/Crypto/SubtleCrypto-import-PBKDF2.txt index 3fa2356f7e..031e2ebf1c 100644 --- a/Tests/LibWeb/Text/expected/Crypto/SubtleCrypto-import-PBKDF2.txt +++ b/Tests/LibWeb/Text/expected/Crypto/SubtleCrypto-import-PBKDF2.txt @@ -2,4 +2,5 @@ imported key: [object CryptoKey] imported key.type: secret imported key.extractable: false imported key.algorithm: {"name":"PBKDF2"} +imported key.usages: deriveKey,deriveBits SHA-256 digest: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3 diff --git a/Tests/LibWeb/Text/input/Crypto/SubtleCrypto-import-PBKDF2.html b/Tests/LibWeb/Text/input/Crypto/SubtleCrypto-import-PBKDF2.html index 1e69dd256d..7789994ba5 100644 --- a/Tests/LibWeb/Text/input/Crypto/SubtleCrypto-import-PBKDF2.html +++ b/Tests/LibWeb/Text/input/Crypto/SubtleCrypto-import-PBKDF2.html @@ -19,7 +19,7 @@ println(`imported key.type: ${key.type}`); println(`imported key.extractable: ${key.extractable}`); println(`imported key.algorithm: ${JSON.stringify(key.algorithm)}`); - // FIXME: Implement usages println(`imported key.usages: ${key.usages}`); + println(`imported key.usages: ${key.usages}`); let message = "Hello, world!"; let encoded_message = enc.encode(message); diff --git a/Userland/Libraries/LibWeb/Crypto/CryptoKey.cpp b/Userland/Libraries/LibWeb/Crypto/CryptoKey.cpp index 8431e4cedc..25a460f8da 100644 --- a/Userland/Libraries/LibWeb/Crypto/CryptoKey.cpp +++ b/Userland/Libraries/LibWeb/Crypto/CryptoKey.cpp @@ -6,6 +6,7 @@ */ #include +#include #include namespace Web::Crypto { @@ -45,4 +46,13 @@ void CryptoKey::visit_edges(Visitor& visitor) visitor.visit(m_usages); } +void CryptoKey::set_usages(Vector usages) +{ + m_key_usages = move(usages); + auto& realm = this->realm(); + m_usages = JS::Array::create_from(realm, m_key_usages.span(), [&](auto& key_usage) -> JS::Value { + return JS::PrimitiveString::create(realm.vm(), Bindings::idl_enum_to_string(key_usage)); + }); +} + } diff --git a/Userland/Libraries/LibWeb/Crypto/CryptoKey.h b/Userland/Libraries/LibWeb/Crypto/CryptoKey.h index ba5ad753a2..fc568e2ea9 100644 --- a/Userland/Libraries/LibWeb/Crypto/CryptoKey.h +++ b/Userland/Libraries/LibWeb/Crypto/CryptoKey.h @@ -28,13 +28,15 @@ public: bool extractable() const { return m_extractable; } Bindings::KeyType type() const { return m_type; } - Object const* algorithm() const { return m_algorithm.ptr(); } - Object const* usages() const { return m_usages.ptr(); } + JS::Object const* algorithm() const { return m_algorithm; } + JS::Object const* usages() const { return m_usages; } + + Vector internal_usages() const { return m_key_usages; } void set_extractable(bool extractable) { m_extractable = extractable; } void set_type(Bindings::KeyType type) { m_type = type; } void set_algorithm(JS::NonnullGCPtr algorithm) { m_algorithm = move(algorithm); } - void set_usages(JS::NonnullGCPtr usages) { m_usages = move(usages); } + void set_usages(Vector); private: CryptoKey(JS::Realm&, InternalKeyData); @@ -46,6 +48,7 @@ private: JS::NonnullGCPtr m_algorithm; JS::NonnullGCPtr m_usages; + Vector m_key_usages; InternalKeyData m_key_data; }; diff --git a/Userland/Libraries/LibWeb/Crypto/SubtleCrypto.cpp b/Userland/Libraries/LibWeb/Crypto/SubtleCrypto.cpp index c1a67d2e0a..90835b9484 100644 --- a/Userland/Libraries/LibWeb/Crypto/SubtleCrypto.cpp +++ b/Userland/Libraries/LibWeb/Crypto/SubtleCrypto.cpp @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -20,6 +21,11 @@ namespace Web::Crypto { +static void normalize_key_usages(Vector& key_usages) +{ + quick_sort(key_usages); +} + JS_DEFINE_ALLOCATOR(SubtleCrypto); JS::NonnullGCPtr SubtleCrypto::create(JS::Realm& realm) @@ -190,7 +196,7 @@ JS::ThrowCompletionOr> SubtleCrypto::import_key(Bi auto promise = WebIDL::create_promise(realm); // 8. Return promise and perform the remaining steps in parallel. - Platform::EventLoopPlugin::the().deferred_invoke([&realm, real_key_data = move(real_key_data), normalized_algorithm = normalized_algorithm.release_value(), promise, format, extractable, key_usages = move(key_usages), algorithm = move(algorithm)]() -> void { + Platform::EventLoopPlugin::the().deferred_invoke([&realm, real_key_data = move(real_key_data), normalized_algorithm = normalized_algorithm.release_value(), promise, format, extractable, key_usages = move(key_usages), algorithm = move(algorithm)]() mutable -> void { HTML::TemporaryExecutionContext context(Bindings::host_defined_environment_settings_object(realm), HTML::TemporaryExecutionContext::CallbacksEnabled::Yes); // 9. If the following steps or referenced procedures say to throw an error, reject promise with the returned error and then terminate the algorithm. @@ -214,7 +220,8 @@ JS::ThrowCompletionOr> SubtleCrypto::import_key(Bi result->set_extractable(extractable); // 13. Set the [[usages]] internal slot of result to the normalized value of usages. - // FIXME: result->set_usages(key_usages); + normalize_key_usages(key_usages); + result->set_usages(key_usages); // 14. Resolve promise with result. WebIDL::resolve_promise(realm, promise, result);