Skip to content

Commit 2c981d6

Browse files
Rust wrapper: check all buffer lengths when converting to u32/i32
Fix F-1068
1 parent f006369 commit 2c981d6

20 files changed

Lines changed: 483 additions & 427 deletions

File tree

wrapper/rust/wolfssl-wolfcrypt/src/aes.rs

Lines changed: 127 additions & 103 deletions
Large diffs are not rendered by default.

wrapper/rust/wolfssl-wolfcrypt/src/blake2.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ impl BLAKE2b {
8787
/// let blake2b = BLAKE2b::new_with_key(64, &key).expect("Error with new()");
8888
/// ```
8989
pub fn new_with_key(digest_size: usize, key: &[u8]) -> Result<Self, i32> {
90+
let key_size = crate::buffer_len_to_u32(key.len())?;
9091
let digest_size = digest_size as u32;
9192
let mut wc_blake2b: MaybeUninit<sys::Blake2b> = MaybeUninit::uninit();
92-
let key_size = key.len() as u32;
9393
let rc = unsafe {
9494
sys::wc_InitBlake2b_WithKey(wc_blake2b.as_mut_ptr(), digest_size,
9595
key.as_ptr(), key_size)
@@ -124,7 +124,7 @@ impl BLAKE2b {
124124
/// blake2b.update(&[0u8; 16]).expect("Error with update()");
125125
/// ```
126126
pub fn update(&mut self, data: &[u8]) -> Result<(), i32> {
127-
let data_size = data.len() as u32;
127+
let data_size = crate::buffer_len_to_u32(data.len())?;
128128
let rc = unsafe {
129129
sys::wc_Blake2bUpdate(&mut self.wc_blake2b, data.as_ptr(), data_size)
130130
};
@@ -156,7 +156,7 @@ impl BLAKE2b {
156156
/// blake2b.finalize(&mut hash).expect("Error with finalize()");
157157
/// ```
158158
pub fn finalize(&mut self, hash: &mut [u8]) -> Result<(), i32> {
159-
let hash_size = hash.len() as u32;
159+
let hash_size = crate::buffer_len_to_u32(hash.len())?;
160160
if hash_size == 0 {
161161
// The C function uses the internal state configured digest size
162162
// if hash_size is passed in as 0. We do not want to allow a
@@ -370,9 +370,9 @@ impl BLAKE2s {
370370
/// let blake2s = BLAKE2s::new_with_key(32, &key).expect("Error with new()");
371371
/// ```
372372
pub fn new_with_key(digest_size: usize, key: &[u8]) -> Result<Self, i32> {
373+
let key_size = crate::buffer_len_to_u32(key.len())?;
373374
let digest_size = digest_size as u32;
374375
let mut wc_blake2s: MaybeUninit<sys::Blake2s> = MaybeUninit::uninit();
375-
let key_size = key.len() as u32;
376376
let rc = unsafe {
377377
sys::wc_InitBlake2s_WithKey(wc_blake2s.as_mut_ptr(), digest_size,
378378
key.as_ptr(), key_size)
@@ -407,7 +407,7 @@ impl BLAKE2s {
407407
/// blake2s.update(&[0u8; 16]).expect("Error with update()");
408408
/// ```
409409
pub fn update(&mut self, data: &[u8]) -> Result<(), i32> {
410-
let data_size = data.len() as u32;
410+
let data_size = crate::buffer_len_to_u32(data.len())?;
411411
let rc = unsafe {
412412
sys::wc_Blake2sUpdate(&mut self.wc_blake2s, data.as_ptr(), data_size)
413413
};
@@ -439,7 +439,7 @@ impl BLAKE2s {
439439
/// blake2s.finalize(&mut hash).expect("Error with finalize()");
440440
/// ```
441441
pub fn finalize(&mut self, hash: &mut [u8]) -> Result<(), i32> {
442-
let hash_size = hash.len() as u32;
442+
let hash_size = crate::buffer_len_to_u32(hash.len())?;
443443
if hash_size == 0 {
444444
// The C function uses the internal state configured digest size
445445
// if hash_size is passed in as 0. We do not want to allow a

wrapper/rust/wolfssl-wolfcrypt/src/chacha20_poly1305.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ impl ChaCha20Poly1305 {
7373
if auth_tag.len() != Self::AUTH_TAG_SIZE {
7474
return Err(sys::wolfCrypt_ErrorCodes_BUFFER_E);
7575
}
76-
let aad_size = aad.len() as u32;
77-
let ciphertext_size = ciphertext.len() as u32;
76+
let aad_size = crate::buffer_len_to_u32(aad.len())?;
77+
let ciphertext_size = crate::buffer_len_to_u32(ciphertext.len())?;
7878
let rc = unsafe {
7979
sys::wc_ChaCha20Poly1305_Decrypt(key.as_ptr(), iv.as_ptr(),
8080
aad.as_ptr(), aad_size, ciphertext.as_ptr(),
@@ -115,8 +115,8 @@ impl ChaCha20Poly1305 {
115115
if auth_tag.len() != Self::AUTH_TAG_SIZE {
116116
return Err(sys::wolfCrypt_ErrorCodes_BUFFER_E);
117117
}
118-
let aad_size = aad.len() as u32;
119-
let plaintext_size = plaintext.len() as u32;
118+
let aad_size = crate::buffer_len_to_u32(aad.len())?;
119+
let plaintext_size = crate::buffer_len_to_u32(plaintext.len())?;
120120
let rc = unsafe {
121121
sys::wc_ChaCha20Poly1305_Encrypt(key.as_ptr(), iv.as_ptr(),
122122
aad.as_ptr(), aad_size, plaintext.as_ptr(), plaintext_size,
@@ -171,7 +171,7 @@ impl ChaCha20Poly1305 {
171171
/// Returns either Ok(()) on success or Err(e) containing the wolfSSL
172172
/// library error code value.
173173
pub fn update_aad(&mut self, aad: &[u8]) -> Result<(), i32> {
174-
let aad_size = aad.len() as u32;
174+
let aad_size = crate::buffer_len_to_u32(aad.len())?;
175175
let rc = unsafe {
176176
sys::wc_ChaCha20Poly1305_UpdateAad(&mut self.wc_ccp,
177177
aad.as_ptr(), aad_size)
@@ -203,7 +203,7 @@ impl ChaCha20Poly1305 {
203203
if din.len() != dout.len() {
204204
return Err(sys::wolfCrypt_ErrorCodes_BUFFER_E);
205205
}
206-
let din_size = din.len() as u32;
206+
let din_size = crate::buffer_len_to_u32(din.len())?;
207207
let rc = unsafe {
208208
sys::wc_ChaCha20Poly1305_UpdateData(&mut self.wc_ccp,
209209
din.as_ptr(), dout.as_mut_ptr(), din_size)
@@ -283,6 +283,9 @@ impl aead::AeadInPlace for ChaCha20Poly1305Aead {
283283
associated_data: &[u8],
284284
buffer: &mut [u8],
285285
) -> Result<aead::Tag<Self>, aead::Error> {
286+
if associated_data.len() > u32::MAX as usize || buffer.len() > u32::MAX as usize {
287+
return Err(aead::Error);
288+
}
286289
let mut tag = aead::Tag::<Self>::default();
287290
// wc_ChaCha20Poly1305_Encrypt supports in-place (out == in).
288291
let buf_ptr = buffer.as_mut_ptr();
@@ -310,6 +313,9 @@ impl aead::AeadInPlace for ChaCha20Poly1305Aead {
310313
buffer: &mut [u8],
311314
tag: &aead::Tag<Self>,
312315
) -> Result<(), aead::Error> {
316+
if associated_data.len() > u32::MAX as usize || buffer.len() > u32::MAX as usize {
317+
return Err(aead::Error);
318+
}
313319
let buf_ptr = buffer.as_mut_ptr();
314320
let in_ptr = buf_ptr as *const u8;
315321
let nonce_bytes: &[u8] = nonce;

wrapper/rust/wolfssl-wolfcrypt/src/cmac.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ impl CMAC {
7070
/// ```
7171
#[cfg(aes)]
7272
pub fn generate(key: &[u8], data: &[u8], dout: &mut [u8]) -> Result<(), i32> {
73-
let key_size = key.len() as u32;
74-
let data_size = data.len() as u32;
75-
let mut dout_size = dout.len() as u32;
73+
let key_size = crate::buffer_len_to_u32(key.len())?;
74+
let data_size = crate::buffer_len_to_u32(data.len())?;
75+
let mut dout_size = crate::buffer_len_to_u32(dout.len())?;
7676
let rc = unsafe {
7777
sys::wc_AesCmacGenerate(dout.as_mut_ptr(), &mut dout_size,
7878
data.as_ptr(), data_size,
@@ -134,7 +134,7 @@ impl CMAC {
134134
/// let mut cmac = CMAC::new_ex(&key, None, None).expect("Error with new_ex()");
135135
/// ```
136136
pub fn new_ex(key: &[u8], heap: Option<*mut core::ffi::c_void>, dev_id: Option<i32>) -> Result<Self, i32> {
137-
let key_size = key.len() as u32;
137+
let key_size = crate::buffer_len_to_u32(key.len())?;
138138
let mut ws_cmac: MaybeUninit<sys::Cmac> = MaybeUninit::uninit();
139139
let typ = sys::CmacType_WC_CMAC_AES as i32;
140140
let heap = match heap {
@@ -193,9 +193,9 @@ impl CMAC {
193193
/// ```
194194
#[cfg(aes)]
195195
pub fn verify(key: &[u8], data: &[u8], check: &[u8]) -> Result<bool, i32> {
196-
let key_size = key.len() as u32;
197-
let data_size = data.len() as u32;
198-
let check_size = check.len() as u32;
196+
let key_size = crate::buffer_len_to_u32(key.len())?;
197+
let data_size = crate::buffer_len_to_u32(data.len())?;
198+
let check_size = crate::buffer_len_to_u32(check.len())?;
199199
let rc = unsafe {
200200
sys::wc_AesCmacVerify(check.as_ptr(), check_size,
201201
data.as_ptr(), data_size,
@@ -243,9 +243,9 @@ impl CMAC {
243243
/// ```
244244
#[cfg(aes)]
245245
pub fn generate_ex(&mut self, key: &[u8], data: &[u8], dout: &mut [u8], heap: Option<*mut core::ffi::c_void>, dev_id: Option<i32>) -> Result<(), i32> {
246-
let key_size = key.len() as u32;
247-
let data_size = data.len() as u32;
248-
let mut dout_size = dout.len() as u32;
246+
let key_size = crate::buffer_len_to_u32(key.len())?;
247+
let data_size = crate::buffer_len_to_u32(data.len())?;
248+
let mut dout_size = crate::buffer_len_to_u32(dout.len())?;
249249
let heap = match heap {
250250
Some(heap) => heap,
251251
None => core::ptr::null_mut(),
@@ -293,7 +293,7 @@ impl CMAC {
293293
/// cmac.update(&message).expect("Error with update()");
294294
/// ```
295295
pub fn update(&mut self, data: &[u8]) -> Result<(), i32> {
296-
let data_size = data.len() as u32;
296+
let data_size = crate::buffer_len_to_u32(data.len())?;
297297
let rc = unsafe {
298298
sys::wc_CmacUpdate(&mut self.ws_cmac, data.as_ptr(), data_size)
299299
};
@@ -335,7 +335,7 @@ impl CMAC {
335335
/// cmac.finalize(&mut finalize_out).expect("Error with finalize()");
336336
/// ```
337337
pub fn finalize(mut self, dout: &mut [u8]) -> Result<(), i32> {
338-
let mut dout_size = dout.len() as u32;
338+
let mut dout_size = crate::buffer_len_to_u32(dout.len())?;
339339
let rc = unsafe {
340340
sys::wc_CmacFinalNoFree(&mut self.ws_cmac,
341341
dout.as_mut_ptr(), &mut dout_size)
@@ -385,9 +385,9 @@ impl CMAC {
385385
/// ```
386386
#[cfg(aes)]
387387
pub fn verify_ex(&mut self, key: &[u8], data: &[u8], check: &[u8], heap: Option<*mut core::ffi::c_void>, dev_id: Option<i32>) -> Result<bool, i32> {
388-
let key_size = key.len() as u32;
389-
let data_size = data.len() as u32;
390-
let check_size = check.len() as u32;
388+
let key_size = crate::buffer_len_to_u32(key.len())?;
389+
let data_size = crate::buffer_len_to_u32(data.len())?;
390+
let check_size = crate::buffer_len_to_u32(check.len())?;
391391
let heap = match heap {
392392
Some(heap) => heap,
393393
None => core::ptr::null_mut(),

0 commit comments

Comments
 (0)