mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 07:30:19 +00:00
LibWeb: Update spec implementation for SubtleCrypto.deriveKey()
Our spec issue got resolved, including a bonus fix! See: https://github.com/w3c/webcrypto/pull/384
This commit is contained in:
parent
137db0e38e
commit
b895a135d5
Notes:
github-actions[bot]
2024-11-15 17:52:36 +00:00
Author: https://github.com/gmta Commit: https://github.com/LadybirdBrowser/ladybird/commit/b895a135d50 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2361
1 changed files with 15 additions and 12 deletions
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
|
* Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
|
||||||
* Copyright (c) 2023-2024, stelar7 <dudedbz@gmail.com>
|
* Copyright (c) 2023-2024, stelar7 <dudedbz@gmail.com>
|
||||||
|
* Copyright (c) 2024, Jelle Raaijmakers <jelle@ladybird.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -8,7 +9,6 @@
|
||||||
#include <AK/QuickSort.h>
|
#include <AK/QuickSort.h>
|
||||||
#include <LibCrypto/Hash/HashManager.h>
|
#include <LibCrypto/Hash/HashManager.h>
|
||||||
#include <LibJS/Runtime/ArrayBuffer.h>
|
#include <LibJS/Runtime/ArrayBuffer.h>
|
||||||
#include <LibJS/Runtime/Promise.h>
|
|
||||||
#include <LibWeb/Bindings/ExceptionOrUtils.h>
|
#include <LibWeb/Bindings/ExceptionOrUtils.h>
|
||||||
#include <LibWeb/Bindings/Intrinsics.h>
|
#include <LibWeb/Bindings/Intrinsics.h>
|
||||||
#include <LibWeb/Bindings/SubtleCryptoPrototype.h>
|
#include <LibWeb/Bindings/SubtleCryptoPrototype.h>
|
||||||
|
@ -664,7 +664,7 @@ JS::ThrowCompletionOr<GC::Ref<WebIDL::Promise>> SubtleCrypto::derive_key(Algorit
|
||||||
auto promise = WebIDL::create_promise(realm);
|
auto promise = WebIDL::create_promise(realm);
|
||||||
|
|
||||||
// 9. Return promise and perform the remaining steps in parallel.
|
// 9. Return promise and perform the remaining steps in parallel.
|
||||||
Platform::EventLoopPlugin::the().deferred_invoke(GC::create_function(realm.heap(), [&realm, &vm, normalized_algorithm = normalized_algorithm.release_value(), promise, normalized_derived_key_algorithm_import = normalized_derived_key_algorithm_import.release_value(), normalized_derived_key_algorithm_length = normalized_derived_key_algorithm_length.release_value(), base_key = move(base_key), extractable, key_usages = move(key_usages)]() -> void {
|
Platform::EventLoopPlugin::the().deferred_invoke(GC::create_function(realm.heap(), [&realm, &vm, normalized_algorithm = normalized_algorithm.release_value(), promise, normalized_derived_key_algorithm_import = normalized_derived_key_algorithm_import.release_value(), normalized_derived_key_algorithm_length = normalized_derived_key_algorithm_length.release_value(), base_key = move(base_key), extractable, key_usages = move(key_usages)]() mutable -> void {
|
||||||
HTML::TemporaryExecutionContext context(realm, HTML::TemporaryExecutionContext::CallbacksEnabled::Yes);
|
HTML::TemporaryExecutionContext context(realm, HTML::TemporaryExecutionContext::CallbacksEnabled::Yes);
|
||||||
// 10. If the following steps or referenced procedures say to throw an error, reject promise with the returned error and then terminate the algorithm.
|
// 10. If the following steps or referenced procedures say to throw an error, reject promise with the returned error and then terminate the algorithm.
|
||||||
|
|
||||||
|
@ -707,25 +707,28 @@ JS::ThrowCompletionOr<GC::Ref<WebIDL::Promise>> SubtleCrypto::derive_key(Algorit
|
||||||
}
|
}
|
||||||
|
|
||||||
// 15. Let result be the result of performing the import key operation specified by normalizedDerivedKeyAlgorithmImport using "raw" as format, secret as keyData, derivedKeyType as algorithm and using extractable and usages.
|
// 15. Let result be the result of performing the import key operation specified by normalizedDerivedKeyAlgorithmImport using "raw" as format, secret as keyData, derivedKeyType as algorithm and using extractable and usages.
|
||||||
auto result = normalized_derived_key_algorithm_import.methods->import_key(*normalized_derived_key_algorithm_import.parameter, Bindings::KeyFormat::Raw, secret.release_value()->buffer(), extractable, key_usages);
|
auto result_or_error = normalized_derived_key_algorithm_import.methods->import_key(*normalized_derived_key_algorithm_import.parameter, Bindings::KeyFormat::Raw, secret.release_value()->buffer(), extractable, key_usages);
|
||||||
if (result.is_error()) {
|
if (result_or_error.is_error()) {
|
||||||
WebIDL::reject_promise(realm, promise, Bindings::dom_exception_to_throw_completion(realm.vm(), result.release_error()).release_value().value());
|
WebIDL::reject_promise(realm, promise, Bindings::dom_exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value().value());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
auto result = result_or_error.release_value();
|
||||||
|
|
||||||
// 16. If the [[type]] internal slot of result is "secret" or "private" and usages is empty, then throw a SyntaxError.
|
// 16. If the [[type]] internal slot of result is "secret" or "private" and usages is empty, then throw a SyntaxError.
|
||||||
if ((result.release_value()->type() == Bindings::KeyType::Secret || result.release_value()->type() == Bindings::KeyType::Private) && key_usages.is_empty()) {
|
if ((result->type() == Bindings::KeyType::Secret || result->type() == Bindings::KeyType::Private) && key_usages.is_empty()) {
|
||||||
WebIDL::reject_promise(realm, promise, WebIDL::SyntaxError::create(realm, "usages must not be empty"_string));
|
WebIDL::reject_promise(realm, promise, WebIDL::SyntaxError::create(realm, "usages must not be empty"_string));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// AD-HOC: Set the [[extractable]] internal slot of key to be extractable.
|
// 17. Set the [[extractable]] internal slot of result to extractable.
|
||||||
// See: https://github.com/w3c/webcrypto/issues/383
|
result->set_extractable(extractable);
|
||||||
auto key = result.release_value();
|
|
||||||
key->set_extractable(extractable);
|
|
||||||
|
|
||||||
// 17. Resolve promise with result.
|
// 18. Set the [[usages]] internal slot of result to the normalized value of usages.
|
||||||
WebIDL::resolve_promise(realm, promise, key);
|
normalize_key_usages(key_usages);
|
||||||
|
result->set_usages(key_usages);
|
||||||
|
|
||||||
|
// 19. Resolve promise with result.
|
||||||
|
WebIDL::resolve_promise(realm, promise, result);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return promise;
|
return promise;
|
||||||
|
|
Loading…
Reference in a new issue