mirror of
https://github.com/servo/servo.git
synced 2025-07-22 23:03:42 +01:00
Implement "get key length"
operation for HMAC algorithm (#34230)
* Implement "get key length" for HMAC keys Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Update WPT expectations Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
parent
81c1f961e9
commit
5e7664b72e
3 changed files with 41 additions and 4612 deletions
|
@ -622,7 +622,7 @@ impl SubtleCryptoMethods for SubtleCrypto {
|
||||||
|
|
||||||
// Step 14. Let secret be the result of performing the derive bits operation specified by
|
// Step 14. Let secret be the result of performing the derive bits operation specified by
|
||||||
// normalizedAlgorithm using key, algorithm and length.
|
// normalizedAlgorithm using key, algorithm and length.
|
||||||
let secret = match normalized_algorithm.derive_bits(&base_key, Some(length as u32)){
|
let secret = match normalized_algorithm.derive_bits(&base_key, Some(length)){
|
||||||
Ok(secret) => secret,
|
Ok(secret) => secret,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
promise.reject_error(e);
|
promise.reject_error(e);
|
||||||
|
@ -953,6 +953,37 @@ impl SubtleHmacImportParams {
|
||||||
};
|
};
|
||||||
Ok(params)
|
Ok(params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webcrypto/#hmac-operations>
|
||||||
|
fn get_key_length(&self) -> Result<u32, Error> {
|
||||||
|
// Step 1.
|
||||||
|
let length = match self.length {
|
||||||
|
// If the length member of normalizedDerivedKeyAlgorithm is not present:
|
||||||
|
None => {
|
||||||
|
// Let length be the block size in bits of the hash function identified by the hash member of
|
||||||
|
// normalizedDerivedKeyAlgorithm.
|
||||||
|
match self.hash {
|
||||||
|
DigestAlgorithm::Sha1 => 160,
|
||||||
|
DigestAlgorithm::Sha256 => 256,
|
||||||
|
DigestAlgorithm::Sha384 => 384,
|
||||||
|
DigestAlgorithm::Sha512 => 512,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Otherwise, if the length member of normalizedDerivedKeyAlgorithm is non-zero:
|
||||||
|
Some(length) if length != 0 => {
|
||||||
|
// Let length be equal to the length member of normalizedDerivedKeyAlgorithm.
|
||||||
|
length
|
||||||
|
},
|
||||||
|
// Otherwise:
|
||||||
|
_ => {
|
||||||
|
// throw a TypeError.
|
||||||
|
return Err(Error::Type("[[length]] must not be zero".to_string()));
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 2. Return length.
|
||||||
|
Ok(length)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://w3c.github.io/webcrypto/#hkdf-params>
|
/// <https://w3c.github.io/webcrypto/#hkdf-params>
|
||||||
|
@ -1018,6 +1049,7 @@ impl SubtlePbkdf2Params {
|
||||||
|
|
||||||
enum GetKeyLengthAlgorithm {
|
enum GetKeyLengthAlgorithm {
|
||||||
Aes(u16),
|
Aes(u16),
|
||||||
|
Hmac(SubtleHmacImportParams),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
@ -1105,6 +1137,10 @@ fn normalize_algorithm_for_get_key_length(
|
||||||
{
|
{
|
||||||
let params = value_from_js_object!(AesDerivedKeyParams, cx, value);
|
let params = value_from_js_object!(AesDerivedKeyParams, cx, value);
|
||||||
GetKeyLengthAlgorithm::Aes(params.length)
|
GetKeyLengthAlgorithm::Aes(params.length)
|
||||||
|
} else if name.eq_ignore_ascii_case(ALG_HMAC) {
|
||||||
|
let params = value_from_js_object!(HmacImportParams, cx, value);
|
||||||
|
let subtle_params = SubtleHmacImportParams::new(cx, params)?;
|
||||||
|
return Ok(GetKeyLengthAlgorithm::Hmac(subtle_params));
|
||||||
} else {
|
} else {
|
||||||
return Err(Error::NotSupported);
|
return Err(Error::NotSupported);
|
||||||
};
|
};
|
||||||
|
@ -1946,7 +1982,7 @@ impl SubtlePbkdf2Params {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://w3c.github.io/webcrypto/#aes-ctr-operations>
|
/// <https://w3c.github.io/webcrypto/#aes-ctr-operations>
|
||||||
fn get_key_length_for_aes(length: u16) -> Result<u16, Error> {
|
fn get_key_length_for_aes(length: u16) -> Result<u32, Error> {
|
||||||
// Step 1. If the length member of normalizedDerivedKeyAlgorithm is not 128, 192 or 256,
|
// Step 1. If the length member of normalizedDerivedKeyAlgorithm is not 128, 192 or 256,
|
||||||
// then throw an OperationError.
|
// then throw an OperationError.
|
||||||
if !matches!(length, 128 | 192 | 256) {
|
if !matches!(length, 128 | 192 | 256) {
|
||||||
|
@ -1954,13 +1990,14 @@ fn get_key_length_for_aes(length: u16) -> Result<u16, Error> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2. Return the length member of normalizedDerivedKeyAlgorithm.
|
// Step 2. Return the length member of normalizedDerivedKeyAlgorithm.
|
||||||
Ok(length)
|
Ok(length as u32)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GetKeyLengthAlgorithm {
|
impl GetKeyLengthAlgorithm {
|
||||||
fn get_key_length(&self) -> Result<u16, Error> {
|
fn get_key_length(&self) -> Result<u32, Error> {
|
||||||
match self {
|
match self {
|
||||||
Self::Aes(length) => get_key_length_for_aes(*length),
|
Self::Aes(length) => get_key_length_for_aes(*length),
|
||||||
|
Self::Hmac(params) => params.get_key_length(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue