1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-09 09:34:57 +09:00

LibWeb: Match algorithm names case-insensitive

I dug through the code and the WebCryptoAPI spec to figure out the
reason for `... mixed case parameters` WPT tests and figured out that
our implementation was slightly wrong.

By being closer to the spec we can now pass those tests and also remove
a bunch of duplicated code.

Context: https://github.com/LadybirdBrowser/ladybird/pull/2598#discussion_r1859263798
This commit is contained in:
devgianlu 2024-11-27 21:17:07 +01:00 committed by Andreas Kling
parent 6ebc812035
commit 46e724729c
Notes: github-actions[bot] 2024-11-27 23:22:41 +00:00
6 changed files with 74 additions and 139 deletions

View file

@ -314,14 +314,9 @@ static WebIDL::ExceptionOr<ByteBuffer> generate_random_key(JS::VM& vm, u16 const
AlgorithmParams::~AlgorithmParams() = default;
JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AlgorithmParams::from_value(JS::VM& vm, JS::Value value)
JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AlgorithmParams::from_value(JS::VM&, JS::Value)
{
auto& object = value.as_object();
auto name = TRY(object.get("name"));
auto name_string = TRY(name.to_string(vm));
return adopt_own(*new AlgorithmParams { name_string });
return adopt_own(*new AlgorithmParams {});
}
AesCbcParams::~AesCbcParams() = default;
@ -330,15 +325,12 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AesCbcParams::from_value(J
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto iv_value = TRY(object.get("iv"));
if (!iv_value.is_object() || !(is<JS::TypedArrayBase>(iv_value.as_object()) || is<JS::ArrayBuffer>(iv_value.as_object()) || is<JS::DataView>(iv_value.as_object())))
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "BufferSource");
auto iv = TRY_OR_THROW_OOM(vm, WebIDL::get_buffer_source_copy(iv_value.as_object()));
return adopt_own<AlgorithmParams>(*new AesCbcParams { name, iv });
return adopt_own<AlgorithmParams>(*new AesCbcParams { iv });
}
AesCtrParams::~AesCtrParams() = default;
@ -347,9 +339,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AesCtrParams::from_value(J
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto iv_value = TRY(object.get("counter"));
if (!iv_value.is_object() || !(is<JS::TypedArrayBase>(iv_value.as_object()) || is<JS::ArrayBuffer>(iv_value.as_object()) || is<JS::DataView>(iv_value.as_object())))
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "BufferSource");
@ -358,7 +347,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AesCtrParams::from_value(J
auto length_value = TRY(object.get("length"));
auto length = TRY(length_value.to_u8(vm));
return adopt_own<AlgorithmParams>(*new AesCtrParams { name, iv, length });
return adopt_own<AlgorithmParams>(*new AesCtrParams { iv, length });
}
AesGcmParams::~AesGcmParams() = default;
@ -367,9 +356,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AesGcmParams::from_value(J
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto iv_value = TRY(object.get("iv"));
if (!iv_value.is_object() || !(is<JS::TypedArrayBase>(iv_value.as_object()) || is<JS::ArrayBuffer>(iv_value.as_object()) || is<JS::DataView>(iv_value.as_object())))
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "BufferSource");
@ -389,7 +375,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AesGcmParams::from_value(J
maybe_tag_length = TRY(tag_length_value.to_u8(vm));
}
return adopt_own<AlgorithmParams>(*new AesGcmParams { name, iv, maybe_additional_data, maybe_tag_length });
return adopt_own<AlgorithmParams>(*new AesGcmParams { iv, maybe_additional_data, maybe_tag_length });
}
HKDFParams::~HKDFParams() = default;
@ -398,9 +384,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> HKDFParams::from_value(JS:
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto hash_value = TRY(object.get("hash"));
auto hash = TRY(hash_algorithm_identifier_from_value(vm, hash_value));
@ -414,7 +397,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> HKDFParams::from_value(JS:
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "BufferSource");
auto info = TRY_OR_THROW_OOM(vm, WebIDL::get_buffer_source_copy(info_value.as_object()));
return adopt_own<AlgorithmParams>(*new HKDFParams { name, hash, salt, info });
return adopt_own<AlgorithmParams>(*new HKDFParams { hash, salt, info });
}
PBKDF2Params::~PBKDF2Params() = default;
@ -423,9 +406,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> PBKDF2Params::from_value(J
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto salt_value = TRY(object.get("salt"));
if (!salt_value.is_object() || !(is<JS::TypedArrayBase>(salt_value.as_object()) || is<JS::ArrayBuffer>(salt_value.as_object()) || is<JS::DataView>(salt_value.as_object())))
@ -439,7 +419,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> PBKDF2Params::from_value(J
auto hash_value = TRY(object.get("hash"));
auto hash = TRY(hash_algorithm_identifier_from_value(vm, hash_value));
return adopt_own<AlgorithmParams>(*new PBKDF2Params { name, salt, iterations, hash });
return adopt_own<AlgorithmParams>(*new PBKDF2Params { salt, iterations, hash });
}
RsaKeyGenParams::~RsaKeyGenParams() = default;
@ -448,9 +428,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> RsaKeyGenParams::from_valu
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto modulus_length_value = TRY(object.get("modulusLength"));
auto modulus_length = TRY(modulus_length_value.to_u32(vm));
@ -462,7 +439,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> RsaKeyGenParams::from_valu
public_exponent = static_cast<JS::Uint8Array&>(public_exponent_value.as_object());
return adopt_own<AlgorithmParams>(*new RsaKeyGenParams { name, modulus_length, big_integer_from_api_big_integer(public_exponent) });
return adopt_own<AlgorithmParams>(*new RsaKeyGenParams { modulus_length, big_integer_from_api_big_integer(public_exponent) });
}
RsaHashedKeyGenParams::~RsaHashedKeyGenParams() = default;
@ -471,9 +448,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> RsaHashedKeyGenParams::fro
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto modulus_length_value = TRY(object.get("modulusLength"));
auto modulus_length = TRY(modulus_length_value.to_u32(vm));
@ -488,7 +462,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> RsaHashedKeyGenParams::fro
auto hash_value = TRY(object.get("hash"));
auto hash = TRY(hash_algorithm_identifier_from_value(vm, hash_value));
return adopt_own<AlgorithmParams>(*new RsaHashedKeyGenParams { name, modulus_length, big_integer_from_api_big_integer(public_exponent), hash });
return adopt_own<AlgorithmParams>(*new RsaHashedKeyGenParams { modulus_length, big_integer_from_api_big_integer(public_exponent), hash });
}
RsaHashedImportParams::~RsaHashedImportParams() = default;
@ -497,13 +471,10 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> RsaHashedImportParams::fro
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto hash_value = TRY(object.get("hash"));
auto hash = TRY(hash_algorithm_identifier_from_value(vm, hash_value));
return adopt_own<AlgorithmParams>(*new RsaHashedImportParams { name, hash });
return adopt_own<AlgorithmParams>(*new RsaHashedImportParams { hash });
}
RsaOaepParams::~RsaOaepParams() = default;
@ -512,9 +483,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> RsaOaepParams::from_value(
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto label_value = TRY(object.get("label"));
ByteBuffer label;
@ -525,7 +493,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> RsaOaepParams::from_value(
label = TRY_OR_THROW_OOM(vm, WebIDL::get_buffer_source_copy(label_value.as_object()));
}
return adopt_own<AlgorithmParams>(*new RsaOaepParams { name, move(label) });
return adopt_own<AlgorithmParams>(*new RsaOaepParams { move(label) });
}
EcdsaParams::~EcdsaParams() = default;
@ -534,13 +502,10 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> EcdsaParams::from_value(JS
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto hash_value = TRY(object.get("hash"));
auto hash = TRY(hash_algorithm_identifier_from_value(vm, hash_value));
return adopt_own<AlgorithmParams>(*new EcdsaParams { name, hash });
return adopt_own<AlgorithmParams>(*new EcdsaParams { hash });
}
EcKeyGenParams::~EcKeyGenParams() = default;
@ -549,13 +514,10 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> EcKeyGenParams::from_value
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto curve_value = TRY(object.get("namedCurve"));
auto curve = TRY(curve_value.to_string(vm));
return adopt_own<AlgorithmParams>(*new EcKeyGenParams { name, curve });
return adopt_own<AlgorithmParams>(*new EcKeyGenParams { curve });
}
AesKeyGenParams::~AesKeyGenParams() = default;
@ -564,13 +526,10 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AesKeyGenParams::from_valu
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto length_value = TRY(object.get("length"));
auto length = TRY(length_value.to_u16(vm));
return adopt_own<AlgorithmParams>(*new AesKeyGenParams { name, length });
return adopt_own<AlgorithmParams>(*new AesKeyGenParams { length });
}
AesDerivedKeyParams::~AesDerivedKeyParams() = default;
@ -579,13 +538,10 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> AesDerivedKeyParams::from_
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto length_value = TRY(object.get("length"));
auto length = TRY(length_value.to_u16(vm));
return adopt_own<AlgorithmParams>(*new AesDerivedKeyParams { name, length });
return adopt_own<AlgorithmParams>(*new AesDerivedKeyParams { length });
}
EcdhKeyDeriveParams::~EcdhKeyDeriveParams() = default;
@ -594,9 +550,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> EcdhKeyDeriveParams::from_
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto key_value = TRY(object.get("public"));
auto key_object = TRY(key_value.to_object(vm));
@ -606,7 +559,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> EcdhKeyDeriveParams::from_
auto& key = verify_cast<CryptoKey>(*key_object);
return adopt_own<AlgorithmParams>(*new EcdhKeyDeriveParams { name, key });
return adopt_own<AlgorithmParams>(*new EcdhKeyDeriveParams { key });
}
EcKeyImportParams::~EcKeyImportParams() = default;
@ -615,13 +568,10 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> EcKeyImportParams::from_va
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto named_curve_value = TRY(object.get("namedCurve"));
auto named_curve = TRY(named_curve_value.to_string(vm));
return adopt_own<AlgorithmParams>(*new EcKeyImportParams { name, named_curve });
return adopt_own<AlgorithmParams>(*new EcKeyImportParams { named_curve });
}
HmacImportParams::~HmacImportParams() = default;
@ -630,9 +580,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> HmacImportParams::from_val
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto hash_value = TRY(object.get("hash"));
auto hash = TRY(hash_algorithm_identifier_from_value(vm, hash_value));
@ -642,7 +589,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> HmacImportParams::from_val
maybe_length = TRY(length_value.to_u32(vm));
}
return adopt_own<AlgorithmParams>(*new HmacImportParams { name, hash, maybe_length });
return adopt_own<AlgorithmParams>(*new HmacImportParams { hash, maybe_length });
}
HmacKeyGenParams::~HmacKeyGenParams() = default;
@ -651,9 +598,6 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> HmacKeyGenParams::from_val
{
auto& object = value.as_object();
auto name_value = TRY(object.get("name"));
auto name = TRY(name_value.to_string(vm));
auto hash_value = TRY(object.get("hash"));
auto hash = TRY(hash_algorithm_identifier_from_value(vm, hash_value));
@ -663,7 +607,7 @@ JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> HmacKeyGenParams::from_val
maybe_length = TRY(length_value.to_u32(vm));
}
return adopt_own<AlgorithmParams>(*new HmacKeyGenParams { name, hash, maybe_length });
return adopt_own<AlgorithmParams>(*new HmacKeyGenParams { hash, maybe_length });
}
// https://w3c.github.io/webcrypto/#rsa-oaep-operations

View file

@ -45,11 +45,12 @@ struct HashAlgorithmIdentifier : public AlgorithmIdentifier {
// https://w3c.github.io/webcrypto/#algorithm-overview
struct AlgorithmParams {
virtual ~AlgorithmParams();
explicit AlgorithmParams(String name)
: name(move(name))
explicit AlgorithmParams()
{
}
// NOTE: this is initialized when normalizing the algorithm name as the spec requests.
// It must not be set in `from_value`.
String name;
static JS::ThrowCompletionOr<NonnullOwnPtr<AlgorithmParams>> from_value(JS::VM&, JS::Value);
@ -58,9 +59,8 @@ struct AlgorithmParams {
// https://w3c.github.io/webcrypto/#aes-cbc
struct AesCbcParams : public AlgorithmParams {
virtual ~AesCbcParams() override;
AesCbcParams(String name, ByteBuffer iv)
: AlgorithmParams(move(name))
, iv(move(iv))
AesCbcParams(ByteBuffer iv)
: iv(move(iv))
{
}
@ -72,9 +72,8 @@ struct AesCbcParams : public AlgorithmParams {
// https://w3c.github.io/webcrypto/#dfn-AesCtrParams
struct AesCtrParams : public AlgorithmParams {
virtual ~AesCtrParams() override;
AesCtrParams(String name, ByteBuffer counter, u8 length)
: AlgorithmParams(move(name))
, counter(move(counter))
AesCtrParams(ByteBuffer counter, u8 length)
: counter(move(counter))
, length(length)
{
}
@ -88,9 +87,8 @@ struct AesCtrParams : public AlgorithmParams {
// https://w3c.github.io/webcrypto/#dfn-AesGcmParams
struct AesGcmParams : public AlgorithmParams {
virtual ~AesGcmParams() override;
AesGcmParams(String name, ByteBuffer iv, Optional<ByteBuffer> additional_data, Optional<u8> tag_length)
: AlgorithmParams(move(name))
, iv(move(iv))
AesGcmParams(ByteBuffer iv, Optional<ByteBuffer> additional_data, Optional<u8> tag_length)
: iv(move(iv))
, additional_data(move(additional_data))
, tag_length(tag_length)
{
@ -106,9 +104,8 @@ struct AesGcmParams : public AlgorithmParams {
// https://w3c.github.io/webcrypto/#hkdf-params
struct HKDFParams : public AlgorithmParams {
virtual ~HKDFParams() override;
HKDFParams(String name, HashAlgorithmIdentifier hash, ByteBuffer salt, ByteBuffer info)
: AlgorithmParams(move(name))
, hash(move(hash))
HKDFParams(HashAlgorithmIdentifier hash, ByteBuffer salt, ByteBuffer info)
: hash(move(hash))
, salt(move(salt))
, info(move(info))
{
@ -124,9 +121,8 @@ struct HKDFParams : public AlgorithmParams {
// https://w3c.github.io/webcrypto/#pbkdf2-params
struct PBKDF2Params : public AlgorithmParams {
virtual ~PBKDF2Params() override;
PBKDF2Params(String name, ByteBuffer salt, u32 iterations, HashAlgorithmIdentifier hash)
: AlgorithmParams(move(name))
, salt(move(salt))
PBKDF2Params(ByteBuffer salt, u32 iterations, HashAlgorithmIdentifier hash)
: salt(move(salt))
, iterations(iterations)
, hash(move(hash))
{
@ -143,9 +139,8 @@ struct PBKDF2Params : public AlgorithmParams {
struct RsaKeyGenParams : public AlgorithmParams {
virtual ~RsaKeyGenParams() override;
RsaKeyGenParams(String name, u32 modulus_length, ::Crypto::UnsignedBigInteger public_exponent)
: AlgorithmParams(move(name))
, modulus_length(modulus_length)
RsaKeyGenParams(u32 modulus_length, ::Crypto::UnsignedBigInteger public_exponent)
: modulus_length(modulus_length)
, public_exponent(move(public_exponent))
{
}
@ -161,8 +156,8 @@ struct RsaKeyGenParams : public AlgorithmParams {
struct RsaHashedKeyGenParams : public RsaKeyGenParams {
virtual ~RsaHashedKeyGenParams() override;
RsaHashedKeyGenParams(String name, u32 modulus_length, ::Crypto::UnsignedBigInteger public_exponent, HashAlgorithmIdentifier hash)
: RsaKeyGenParams(move(name), modulus_length, move(public_exponent))
RsaHashedKeyGenParams(u32 modulus_length, ::Crypto::UnsignedBigInteger public_exponent, HashAlgorithmIdentifier hash)
: RsaKeyGenParams(modulus_length, move(public_exponent))
, hash(move(hash))
{
}
@ -176,9 +171,8 @@ struct RsaHashedKeyGenParams : public RsaKeyGenParams {
struct RsaHashedImportParams : public AlgorithmParams {
virtual ~RsaHashedImportParams() override;
RsaHashedImportParams(String name, HashAlgorithmIdentifier hash)
: AlgorithmParams(move(name))
, hash(move(hash))
RsaHashedImportParams(HashAlgorithmIdentifier hash)
: hash(move(hash))
{
}
@ -191,9 +185,8 @@ struct RsaHashedImportParams : public AlgorithmParams {
struct RsaOaepParams : public AlgorithmParams {
virtual ~RsaOaepParams() override;
RsaOaepParams(String name, ByteBuffer label)
: AlgorithmParams(move(name))
, label(move(label))
RsaOaepParams(ByteBuffer label)
: label(move(label))
{
}
@ -206,9 +199,8 @@ struct RsaOaepParams : public AlgorithmParams {
struct EcdsaParams : public AlgorithmParams {
virtual ~EcdsaParams() override;
EcdsaParams(String name, HashAlgorithmIdentifier hash)
: AlgorithmParams(move(name))
, hash(move(hash))
EcdsaParams(HashAlgorithmIdentifier hash)
: hash(move(hash))
{
}
@ -221,9 +213,8 @@ struct EcdsaParams : public AlgorithmParams {
struct EcKeyGenParams : public AlgorithmParams {
virtual ~EcKeyGenParams() override;
EcKeyGenParams(String name, NamedCurve named_curve)
: AlgorithmParams(move(name))
, named_curve(move(named_curve))
EcKeyGenParams(NamedCurve named_curve)
: named_curve(move(named_curve))
{
}
@ -236,9 +227,8 @@ struct EcKeyGenParams : public AlgorithmParams {
struct AesKeyGenParams : public AlgorithmParams {
virtual ~AesKeyGenParams() override;
AesKeyGenParams(String name, u16 length)
: AlgorithmParams(move(name))
, length(length)
AesKeyGenParams(u16 length)
: length(length)
{
}
@ -251,9 +241,8 @@ struct AesKeyGenParams : public AlgorithmParams {
struct AesDerivedKeyParams : public AlgorithmParams {
virtual ~AesDerivedKeyParams() override;
AesDerivedKeyParams(String name, u16 length)
: AlgorithmParams(move(name))
, length(length)
AesDerivedKeyParams(u16 length)
: length(length)
{
}
@ -266,9 +255,8 @@ struct AesDerivedKeyParams : public AlgorithmParams {
struct HmacImportParams : public AlgorithmParams {
virtual ~HmacImportParams() override;
HmacImportParams(String name, HashAlgorithmIdentifier hash, Optional<WebIDL::UnsignedLong> length)
: AlgorithmParams(move(name))
, hash(move(hash))
HmacImportParams(HashAlgorithmIdentifier hash, Optional<WebIDL::UnsignedLong> length)
: hash(move(hash))
, length(length)
{
}
@ -283,9 +271,8 @@ struct HmacImportParams : public AlgorithmParams {
struct HmacKeyGenParams : public AlgorithmParams {
virtual ~HmacKeyGenParams() override;
HmacKeyGenParams(String name, HashAlgorithmIdentifier hash, Optional<WebIDL::UnsignedLong> length)
: AlgorithmParams(move(name))
, hash(move(hash))
HmacKeyGenParams(HashAlgorithmIdentifier hash, Optional<WebIDL::UnsignedLong> length)
: hash(move(hash))
, length(length)
{
}
@ -580,9 +567,8 @@ private:
struct EcdhKeyDeriveParams : public AlgorithmParams {
virtual ~EcdhKeyDeriveParams() override;
EcdhKeyDeriveParams(String name, CryptoKey& public_key)
: AlgorithmParams(move(name))
, public_key(public_key)
EcdhKeyDeriveParams(CryptoKey& public_key)
: public_key(public_key)
{
}
@ -594,9 +580,8 @@ struct EcdhKeyDeriveParams : public AlgorithmParams {
struct EcKeyImportParams : public AlgorithmParams {
virtual ~EcKeyImportParams() override;
EcKeyImportParams(String name, String named_curve)
: AlgorithmParams(move(name))
, named_curve(move(named_curve))
EcKeyImportParams(String named_curve)
: named_curve(move(named_curve))
{
}

View file

@ -100,6 +100,8 @@ WebIDL::ExceptionOr<NormalizedAlgorithmAndParameter> normalize_an_algorithm(JS::
// 5. If registeredAlgorithms contains a key that is a case-insensitive string match for algName:
if (auto it = registered_algorithms.find(algorithm_name); it != registered_algorithms.end()) {
// 1. Set algName to the value of the matching key.
algorithm_name = it->key;
// 2. Let desiredType be the IDL dictionary type stored at algName in registeredAlgorithms.
desired_type = it->value;
} else {
@ -110,7 +112,6 @@ WebIDL::ExceptionOr<NormalizedAlgorithmAndParameter> normalize_an_algorithm(JS::
// 8. Let normalizedAlgorithm be the result of converting the ECMAScript object represented by alg
// to the IDL dictionary type desiredType, as defined by [WebIDL].
// 9. Set the name attribute of normalizedAlgorithm to algName.
// 10. If an error occurred, return the error and terminate this algorithm.
// 11. Let dictionaries be a list consisting of the IDL dictionary type desiredType
// and all of desiredType's inherited dictionaries, in order from least to most derived.
@ -118,6 +119,11 @@ WebIDL::ExceptionOr<NormalizedAlgorithmAndParameter> normalize_an_algorithm(JS::
// Note: All of these steps are handled by the create_methods and parameter_from_value methods.
auto methods = desired_type.create_methods(realm);
auto parameter = TRY(desired_type.parameter_from_value(vm, algorithm.get<GC::Root<JS::Object>>()));
// 9. Set the name attribute of normalizedAlgorithm to algName.
VERIFY(parameter->name.is_empty());
parameter->name = algorithm_name;
auto normalized_algorithm = NormalizedAlgorithmAndParameter { move(methods), move(parameter) };
// 13. Return normalizedAlgorithm.

View file

@ -6,8 +6,8 @@ Rerun
Found 18 tests
16 Pass
2 Fail
17 Pass
1 Fail
Details
Result Test Name MessagePass setup - define tests
Pass X448 key derivation checks for all-zero value result with a key of order 0
@ -16,7 +16,7 @@ Pass X448 key derivation checks for all-zero value result with a key of order p-
Pass X448 key derivation checks for all-zero value result with a key of order p (=0, order 4)
Pass X448 key derivation checks for all-zero value result with a key of order p+1 (=1, order 1)
Pass X448 good parameters
Fail X448 mixed case parameters
Pass X448 mixed case parameters
Pass X448 short result
Fail X448 non-multiple of 8 bits
Pass X448 missing public property

View file

@ -6,8 +6,8 @@ Rerun
Found 40 tests
23 Pass
17 Fail
25 Pass
15 Fail
Details
Result Test Name MessagePass setup - define tests
Fail P-521 good parameters
@ -24,7 +24,7 @@ Fail P-521 public property value is a private key
Fail P-521 public property value is a secret key
Fail P-521 asking for too many bits
Pass P-256 good parameters
Fail P-256 mixed case parameters
Pass P-256 mixed case parameters
Pass P-256 short result
Fail P-256 non-multiple of 8 bits
Pass P-256 missing public curve
@ -37,7 +37,7 @@ Pass P-256 public property value is a private key
Pass P-256 public property value is a secret key
Fail P-256 asking for too many bits
Pass P-384 good parameters
Fail P-384 mixed case parameters
Pass P-384 mixed case parameters
Pass P-384 short result
Fail P-384 non-multiple of 8 bits
Pass P-384 missing public curve

View file

@ -6,8 +6,8 @@ Rerun
Found 31 tests
21 Pass
10 Fail
23 Pass
8 Fail
Details
Result Test Name MessagePass setup - define tests
Fail P-521 good parameters
@ -21,7 +21,7 @@ Fail P-521 base key is not a private key
Fail P-521 public property value is a private key
Fail P-521 public property value is a secret key
Pass P-256 good parameters
Fail P-256 mixed case parameters
Pass P-256 mixed case parameters
Pass P-256 missing public curve
Pass P-256 public property of algorithm is not a CryptoKey
Pass P-256 mismatched curves
@ -31,7 +31,7 @@ Pass P-256 base key is not a private key
Pass P-256 public property value is a private key
Pass P-256 public property value is a secret key
Pass P-384 good parameters
Fail P-384 mixed case parameters
Pass P-384 mixed case parameters
Pass P-384 missing public curve
Pass P-384 public property of algorithm is not a CryptoKey
Pass P-384 mismatched curves