mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
refactor: add CanGc as argument to create_buffer_source (#35597)
Signed-off-by: Yerkebulan Tulibergenov <yerkebulan@gmail.com>
This commit is contained in:
parent
35f21e426b
commit
245a39c07e
22 changed files with 169 additions and 96 deletions
|
@ -176,7 +176,8 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
let cx = GlobalScope::get_cx();
|
||||
rooted!(in(*cx) let mut array_buffer_ptr = ptr::null_mut::<JSObject>());
|
||||
|
||||
if let Err(e) = normalized_algorithm.encrypt(&subtle, &key, &data, cx, array_buffer_ptr.handle_mut()) {
|
||||
if let Err(e) = normalized_algorithm.encrypt(&subtle, &key, &data, cx, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note()) {
|
||||
promise.reject_error(e);
|
||||
return;
|
||||
}
|
||||
|
@ -229,7 +230,8 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
return;
|
||||
}
|
||||
|
||||
if let Err(e) = normalized_algorithm.decrypt(&subtle, &key, &data, cx, array_buffer_ptr.handle_mut()) {
|
||||
if let Err(e) = normalized_algorithm.decrypt(&subtle, &key, &data, cx, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note()) {
|
||||
promise.reject_error(e);
|
||||
return;
|
||||
}
|
||||
|
@ -314,7 +316,7 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
};
|
||||
|
||||
rooted!(in(*cx) let mut array_buffer_ptr = ptr::null_mut::<JSObject>());
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &result, array_buffer_ptr.handle_mut())
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &result, array_buffer_ptr.handle_mut(), CanGc::note())
|
||||
.expect("failed to create buffer source for exported key.");
|
||||
|
||||
// Step 9. Resolve promise with result.
|
||||
|
@ -466,7 +468,7 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
|
||||
let cx = GlobalScope::get_cx();
|
||||
rooted!(in(*cx) let mut array_buffer_ptr = ptr::null_mut::<JSObject>());
|
||||
create_buffer_source::<ArrayBufferU8>(cx, digest.as_ref(), array_buffer_ptr.handle_mut())
|
||||
create_buffer_source::<ArrayBufferU8>(cx, digest.as_ref(), array_buffer_ptr.handle_mut(), CanGc::note())
|
||||
.expect("failed to create buffer source for exported key.");
|
||||
|
||||
|
||||
|
@ -708,7 +710,7 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
}
|
||||
};
|
||||
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &result, array_buffer_ptr.handle_mut())
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &result, array_buffer_ptr.handle_mut(), CanGc::note())
|
||||
.expect("failed to create buffer source for derived bits.");
|
||||
|
||||
// Step 10. Resolve promise with result.
|
||||
|
@ -821,7 +823,8 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
AesExportedKey::Raw(k) => {
|
||||
let cx = GlobalScope::get_cx();
|
||||
rooted!(in(*cx) let mut array_buffer_ptr = ptr::null_mut::<JSObject>());
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &k, array_buffer_ptr.handle_mut())
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &k, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note())
|
||||
.expect("failed to create buffer source for exported key.");
|
||||
promise.resolve_native(&array_buffer_ptr.get())
|
||||
},
|
||||
|
@ -933,19 +936,20 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
|
||||
let result = match normalized_algorithm {
|
||||
KeyWrapAlgorithm::AesKw => {
|
||||
subtle.wrap_key_aes_kw(&wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut())
|
||||
subtle.wrap_key_aes_kw(&wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut(), CanGc::note())
|
||||
},
|
||||
KeyWrapAlgorithm::AesCbc(params) => {
|
||||
subtle.encrypt_aes_cbc(¶ms, &wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut())
|
||||
subtle.encrypt_aes_cbc(¶ms, &wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note())
|
||||
},
|
||||
KeyWrapAlgorithm::AesCtr(params) => {
|
||||
subtle.encrypt_decrypt_aes_ctr(
|
||||
¶ms, &wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut()
|
||||
¶ms, &wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut(), CanGc::note()
|
||||
)
|
||||
},
|
||||
KeyWrapAlgorithm::AesGcm(params) => {
|
||||
subtle.encrypt_aes_gcm(
|
||||
¶ms, &wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut()
|
||||
¶ms, &wrapping_key, &bytes, cx, array_buffer_ptr.handle_mut(), CanGc::note()
|
||||
)
|
||||
},
|
||||
};
|
||||
|
@ -1016,21 +1020,25 @@ impl SubtleCryptoMethods<crate::DomTypeHolder> for SubtleCrypto {
|
|||
|
||||
let result = match normalized_algorithm {
|
||||
KeyWrapAlgorithm::AesKw => {
|
||||
subtle.unwrap_key_aes_kw(&unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut())
|
||||
subtle.unwrap_key_aes_kw(&unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note())
|
||||
},
|
||||
KeyWrapAlgorithm::AesCbc(params) => {
|
||||
subtle.decrypt_aes_cbc(
|
||||
¶ms, &unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut()
|
||||
¶ms, &unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note()
|
||||
)
|
||||
},
|
||||
KeyWrapAlgorithm::AesCtr(params) => {
|
||||
subtle.encrypt_decrypt_aes_ctr(
|
||||
¶ms, &unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut()
|
||||
¶ms, &unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note()
|
||||
)
|
||||
},
|
||||
KeyWrapAlgorithm::AesGcm(params) => {
|
||||
subtle.decrypt_aes_gcm(
|
||||
¶ms, &unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut()
|
||||
¶ms, &unwrapping_key, &wrapped_key_bytes, cx, array_buffer_ptr.handle_mut(),
|
||||
CanGc::note()
|
||||
)
|
||||
},
|
||||
};
|
||||
|
@ -1648,6 +1656,7 @@ impl SubtleCrypto {
|
|||
data: &[u8],
|
||||
cx: JSContext,
|
||||
handle: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
if params.iv.len() != 16 {
|
||||
return Err(Error::Operation);
|
||||
|
@ -1672,7 +1681,7 @@ impl SubtleCrypto {
|
|||
_ => return Err(Error::Data),
|
||||
};
|
||||
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &ct, handle)
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &ct, handle, can_gc)
|
||||
.expect("failed to create buffer source for exported key.");
|
||||
|
||||
Ok(ct)
|
||||
|
@ -1686,6 +1695,7 @@ impl SubtleCrypto {
|
|||
data: &[u8],
|
||||
cx: JSContext,
|
||||
handle: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
if params.iv.len() != 16 {
|
||||
return Err(Error::Operation);
|
||||
|
@ -1716,7 +1726,7 @@ impl SubtleCrypto {
|
|||
_ => return Err(Error::Data),
|
||||
};
|
||||
|
||||
create_buffer_source::<ArrayBufferU8>(cx, plaintext, handle)
|
||||
create_buffer_source::<ArrayBufferU8>(cx, plaintext, handle, can_gc)
|
||||
.expect("failed to create buffer source for exported key.");
|
||||
|
||||
Ok(plaintext.to_vec())
|
||||
|
@ -1730,6 +1740,7 @@ impl SubtleCrypto {
|
|||
data: &[u8],
|
||||
cx: JSContext,
|
||||
handle: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
if params.counter.len() != 16 || params.length == 0 || params.length > 128 {
|
||||
return Err(Error::Operation);
|
||||
|
@ -1754,7 +1765,7 @@ impl SubtleCrypto {
|
|||
_ => return Err(Error::Data),
|
||||
};
|
||||
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &ciphertext, handle)
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &ciphertext, handle, can_gc)
|
||||
.expect("failed to create buffer source for exported key.");
|
||||
|
||||
Ok(ciphertext)
|
||||
|
@ -1768,6 +1779,7 @@ impl SubtleCrypto {
|
|||
plaintext: &[u8],
|
||||
cx: JSContext,
|
||||
handle: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
// Step 1. If plaintext has a length greater than 2^39 - 256 bytes, then throw an OperationError.
|
||||
if plaintext.len() as u64 > (2 << 39) - 256 {
|
||||
|
@ -1874,7 +1886,7 @@ impl SubtleCrypto {
|
|||
ciphertext.extend_from_slice(&tag.unwrap()[..tag_length as usize / 8]);
|
||||
|
||||
// Step 8. Return the result of creating an ArrayBuffer containing ciphertext.
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &ciphertext, handle)
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &ciphertext, handle, can_gc)
|
||||
.expect("failed to create buffer source for encrypted ciphertext");
|
||||
|
||||
Ok(ciphertext)
|
||||
|
@ -1888,6 +1900,7 @@ impl SubtleCrypto {
|
|||
ciphertext: &[u8],
|
||||
cx: JSContext,
|
||||
handle: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
// Step 1.
|
||||
// FIXME: aes_gcm uses a fixed tag length
|
||||
|
@ -1998,7 +2011,7 @@ impl SubtleCrypto {
|
|||
// Let plaintext be the output P of the Authenticated Decryption Function.
|
||||
|
||||
// Step 9. Return the result of creating an ArrayBuffer containing plaintext.
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &plaintext, handle)
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &plaintext, handle, can_gc)
|
||||
.expect("failed to create buffer source for decrypted plaintext");
|
||||
|
||||
Ok(plaintext)
|
||||
|
@ -2431,6 +2444,7 @@ impl SubtleCrypto {
|
|||
bytes: &[u8],
|
||||
cx: JSContext,
|
||||
handle: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
// Step 1. If plaintext is not a multiple of 64 bits in length, then throw an OperationError.
|
||||
if bytes.len() % 8 != 0 {
|
||||
|
@ -2468,7 +2482,7 @@ impl SubtleCrypto {
|
|||
_ => return Err(Error::Operation),
|
||||
};
|
||||
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &wrapped_key, handle)
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &wrapped_key, handle, can_gc)
|
||||
.expect("failed to create buffer source for wrapped key.");
|
||||
|
||||
// 3. Return ciphertext.
|
||||
|
@ -2482,6 +2496,7 @@ impl SubtleCrypto {
|
|||
bytes: &[u8],
|
||||
cx: JSContext,
|
||||
handle: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
// Step 1. Let plaintext be the result of performing the Key Unwrap operation described in Section 2.2.2
|
||||
// of [RFC3394] with ciphertext as the input ciphertext and using the default Initial Value defined
|
||||
|
@ -2515,7 +2530,7 @@ impl SubtleCrypto {
|
|||
_ => return Err(Error::Operation),
|
||||
};
|
||||
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &unwrapped_key, handle)
|
||||
create_buffer_source::<ArrayBufferU8>(cx, &unwrapped_key, handle, can_gc)
|
||||
.expect("failed to create buffer source for unwrapped key.");
|
||||
|
||||
// 3. Return plaintext.
|
||||
|
@ -2853,11 +2868,14 @@ impl EncryptionAlgorithm {
|
|||
data: &[u8],
|
||||
cx: JSContext,
|
||||
result: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
match self {
|
||||
Self::AesCbc(params) => subtle.encrypt_aes_cbc(params, key, data, cx, result),
|
||||
Self::AesCtr(params) => subtle.encrypt_decrypt_aes_ctr(params, key, data, cx, result),
|
||||
Self::AesGcm(params) => subtle.encrypt_aes_gcm(params, key, data, cx, result),
|
||||
Self::AesCbc(params) => subtle.encrypt_aes_cbc(params, key, data, cx, result, can_gc),
|
||||
Self::AesCtr(params) => {
|
||||
subtle.encrypt_decrypt_aes_ctr(params, key, data, cx, result, can_gc)
|
||||
},
|
||||
Self::AesGcm(params) => subtle.encrypt_aes_gcm(params, key, data, cx, result, can_gc),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2869,11 +2887,14 @@ impl EncryptionAlgorithm {
|
|||
data: &[u8],
|
||||
cx: JSContext,
|
||||
result: MutableHandleObject,
|
||||
can_gc: CanGc,
|
||||
) -> Result<Vec<u8>, Error> {
|
||||
match self {
|
||||
Self::AesCbc(params) => subtle.decrypt_aes_cbc(params, key, data, cx, result),
|
||||
Self::AesCtr(params) => subtle.encrypt_decrypt_aes_ctr(params, key, data, cx, result),
|
||||
Self::AesGcm(params) => subtle.decrypt_aes_gcm(params, key, data, cx, result),
|
||||
Self::AesCbc(params) => subtle.decrypt_aes_cbc(params, key, data, cx, result, can_gc),
|
||||
Self::AesCtr(params) => {
|
||||
subtle.encrypt_decrypt_aes_ctr(params, key, data, cx, result, can_gc)
|
||||
},
|
||||
Self::AesGcm(params) => subtle.decrypt_aes_gcm(params, key, data, cx, result, can_gc),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue