Skip to content

Commit 91528f4

Browse files
Rust wrapper: store pointer to WC_RNG instead of full struct (WIP)
1 parent b38d7bf commit 91528f4

12 files changed

Lines changed: 75 additions & 66 deletions

File tree

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ impl Curve25519Key {
8484
let wc_key = unsafe { wc_key.assume_init() };
8585
let mut curve25519key = Curve25519Key { wc_key };
8686
let rc = unsafe {
87-
sys::wc_curve25519_make_key(&mut rng.wc_rng, Self::KEYSIZE as i32,
87+
sys::wc_curve25519_make_key(rng.wc_rng, Self::KEYSIZE as i32,
8888
&mut curve25519key.wc_key)
8989
};
9090
if rc != 0 {
@@ -109,7 +109,7 @@ impl Curve25519Key {
109109
return Err(sys::wolfCrypt_ErrorCodes_BUFFER_E);
110110
}
111111
let rc = unsafe {
112-
sys::wc_curve25519_make_priv(&mut rng.wc_rng, Self::KEYSIZE as i32, out.as_mut_ptr())
112+
sys::wc_curve25519_make_priv(rng.wc_rng, Self::KEYSIZE as i32, out.as_mut_ptr())
113113
};
114114
if rc != 0 {
115115
return Err(rc);
@@ -358,7 +358,7 @@ impl Curve25519Key {
358358
let public_size = crate::buffer_len_to_i32(public.len())?;
359359
let rc = unsafe {
360360
sys::wc_curve25519_make_pub_blind(public_size, public.as_mut_ptr(),
361-
private_size, private.as_ptr(), &mut rng.wc_rng)
361+
private_size, private.as_ptr(), rng.wc_rng)
362362
};
363363
if rc != 0 {
364364
return Err(rc);
@@ -415,7 +415,7 @@ impl Curve25519Key {
415415
let rc = unsafe {
416416
sys::wc_curve25519_generic_blind(public_size, public.as_mut_ptr(),
417417
private_size, private.as_ptr(), basepoint_size, basepoint.as_ptr(),
418-
&mut rng.wc_rng)
418+
rng.wc_rng)
419419
};
420420
if rc != 0 {
421421
return Err(rc);
@@ -457,8 +457,14 @@ impl Curve25519Key {
457457
/// # Parameters
458458
///
459459
/// * `rng`: The `RNG` struct instance to associate with this
460-
/// `Curve25519Key` instance. The `RNG` struct should not be moved in
461-
/// memory after calling this method.
460+
/// `Curve25519Key` instance.
461+
///
462+
/// # Safety contract
463+
///
464+
/// The caller must ensure that the `RNG` instance is not dropped before
465+
/// this `Curve25519Key` instance. The `Curve25519Key` struct holds an
466+
/// internal pointer to the `RNG`'s underlying `WC_RNG` context, and
467+
/// dropping the `RNG` first would result in a dangling pointer.
462468
///
463469
/// # Returns
464470
///
@@ -467,7 +473,7 @@ impl Curve25519Key {
467473
#[cfg(all(curve25519_blinding, random))]
468474
pub fn set_rng(&mut self, rng: &mut RNG) -> Result<(), i32> {
469475
let rc = unsafe {
470-
sys::wc_curve25519_set_rng(&mut self.wc_key, &mut rng.wc_rng)
476+
sys::wc_curve25519_set_rng(&mut self.wc_key, rng.wc_rng)
471477
};
472478
if rc != 0 {
473479
return Err(rc);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl DH {
242242
let wc_dhkey = unsafe { wc_dhkey.assume_init() };
243243
let mut dh = DH { wc_dhkey };
244244
let rc = unsafe {
245-
sys::wc_DhGenerateParams(&mut rng.wc_rng, modulus_size, &mut dh.wc_dhkey)
245+
sys::wc_DhGenerateParams(rng.wc_rng, modulus_size, &mut dh.wc_dhkey)
246246
};
247247
if rc != 0 {
248248
return Err(rc);
@@ -1050,7 +1050,7 @@ impl DH {
10501050
let wc_dhkey = unsafe { wc_dhkey.assume_init() };
10511051
let mut dh = DH { wc_dhkey };
10521052
let rc = unsafe {
1053-
sys::wc_DhSetCheckKey(&mut dh.wc_dhkey, p.as_ptr(), p_size, g.as_ptr(), g_size, q.as_ptr(), q_size, trusted, &mut rng.wc_rng)
1053+
sys::wc_DhSetCheckKey(&mut dh.wc_dhkey, p.as_ptr(), p_size, g.as_ptr(), g_size, q.as_ptr(), q_size, trusted, rng.wc_rng)
10541054
};
10551055
if rc != 0 {
10561056
return Err(rc);
@@ -1515,7 +1515,7 @@ impl DH {
15151515
*private_size = crate::buffer_len_to_u32(private.len())?;
15161516
*public_size = crate::buffer_len_to_u32(public.len())?;
15171517
let rc = unsafe {
1518-
sys::wc_DhGenerateKeyPair(&mut self.wc_dhkey, &mut rng.wc_rng,
1518+
sys::wc_DhGenerateKeyPair(&mut self.wc_dhkey, rng.wc_rng,
15191519
private.as_mut_ptr(), private_size,
15201520
public.as_mut_ptr(), public_size)
15211521
};

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ impl Dilithium {
202202
if rc != 0 {
203203
return Err(rc);
204204
}
205-
let rc = unsafe { sys::wc_dilithium_make_key(&mut key.ws_key, &mut rng.wc_rng) };
205+
let rc = unsafe { sys::wc_dilithium_make_key(&mut key.ws_key, rng.wc_rng) };
206206
if rc != 0 {
207207
return Err(rc);
208208
}
@@ -869,7 +869,7 @@ impl Dilithium {
869869
msg.as_ptr(), msg_len,
870870
sig.as_mut_ptr(), &mut sig_len,
871871
&mut self.ws_key,
872-
&mut rng.wc_rng,
872+
rng.wc_rng,
873873
)
874874
};
875875
if rc != 0 {
@@ -931,7 +931,7 @@ impl Dilithium {
931931
msg.as_ptr(), msg_len,
932932
sig.as_mut_ptr(), &mut sig_len,
933933
&mut self.ws_key,
934-
&mut rng.wc_rng,
934+
rng.wc_rng,
935935
)
936936
};
937937
if rc != 0 {
@@ -981,7 +981,7 @@ impl Dilithium {
981981
hash.as_ptr(), hash_len,
982982
sig.as_mut_ptr(), &mut sig_len,
983983
&mut self.ws_key,
984-
&mut rng.wc_rng,
984+
rng.wc_rng,
985985
)
986986
};
987987
if rc != 0 {

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ impl ECC {
438438
let wc_ecc_key = unsafe { wc_ecc_key.assume_init() };
439439
let mut ecc = ECC { wc_ecc_key };
440440
let rc = unsafe {
441-
sys::wc_ecc_make_key(&mut rng.wc_rng, size, &mut ecc.wc_ecc_key)
441+
sys::wc_ecc_make_key(rng.wc_rng, size, &mut ecc.wc_ecc_key)
442442
};
443443
if rc != 0 {
444444
return Err(rc);
@@ -495,7 +495,7 @@ impl ECC {
495495
let wc_ecc_key = unsafe { wc_ecc_key.assume_init() };
496496
let mut ecc = ECC { wc_ecc_key };
497497
let rc = unsafe {
498-
sys::wc_ecc_make_key_ex(&mut rng.wc_rng, size, &mut ecc.wc_ecc_key, curve_id)
498+
sys::wc_ecc_make_key_ex(rng.wc_rng, size, &mut ecc.wc_ecc_key, curve_id)
499499
};
500500
if rc != 0 {
501501
return Err(rc);
@@ -553,7 +553,7 @@ impl ECC {
553553
let wc_ecc_key = unsafe { wc_ecc_key.assume_init() };
554554
let mut ecc = ECC { wc_ecc_key };
555555
let rc = unsafe {
556-
sys::wc_ecc_make_key_ex2(&mut rng.wc_rng, size, &mut ecc.wc_ecc_key, curve_id, flags)
556+
sys::wc_ecc_make_key_ex2(rng.wc_rng, size, &mut ecc.wc_ecc_key, curve_id, flags)
557557
};
558558
if rc != 0 {
559559
return Err(rc);
@@ -1676,7 +1676,7 @@ impl ECC {
16761676
#[cfg(random)]
16771677
pub fn make_pub(&mut self, rng: Option<&mut RNG>) -> Result<(), i32> {
16781678
let rng_ptr = match rng {
1679-
Some(rng) => &mut rng.wc_rng,
1679+
Some(rng) => rng.wc_rng,
16801680
None => core::ptr::null_mut(),
16811681
};
16821682
let rc = unsafe {
@@ -1720,7 +1720,7 @@ impl ECC {
17201720
#[cfg(random)]
17211721
pub fn make_pub_to_point(&mut self, rng: Option<&mut RNG>, heap: Option<*mut core::ffi::c_void>) -> Result<ECCPoint, i32> {
17221722
let rng_ptr = match rng {
1723-
Some(rng) => &mut rng.wc_rng,
1723+
Some(rng) => rng.wc_rng,
17241724
None => core::ptr::null_mut(),
17251725
};
17261726
let heap = match heap {
@@ -1749,8 +1749,14 @@ impl ECC {
17491749
/// # Parameters
17501750
///
17511751
/// * `rng`: The `RNG` struct instance to associate with this `ECC`
1752-
/// instance. The `RNG` struct should not be moved in memory after
1753-
/// calling this method.
1752+
/// instance.
1753+
///
1754+
/// # Safety contract
1755+
///
1756+
/// The caller must ensure that the `RNG` instance is not dropped before
1757+
/// this `ECC` instance. The `ECC` struct holds an internal pointer to the
1758+
/// `RNG`'s underlying `WC_RNG` context, and dropping the `RNG` first
1759+
/// would result in a dangling pointer.
17541760
///
17551761
/// # Returns
17561762
///
@@ -1773,7 +1779,7 @@ impl ECC {
17731779
#[cfg(random)]
17741780
pub fn set_rng(&mut self, rng: &mut RNG) -> Result<(), i32> {
17751781
let rc = unsafe {
1776-
sys::wc_ecc_set_rng(&mut self.wc_ecc_key, &mut rng.wc_rng)
1782+
sys::wc_ecc_set_rng(&mut self.wc_ecc_key, rng.wc_rng)
17771783
};
17781784
if rc != 0 {
17791785
return Err(rc);
@@ -1915,7 +1921,7 @@ impl ECC {
19151921
let mut dout_size = crate::buffer_len_to_u32(dout.len())?;
19161922
let rc = unsafe {
19171923
sys::wc_ecc_sign_hash(din.as_ptr(), din_size, dout.as_mut_ptr(),
1918-
&mut dout_size, &mut rng.wc_rng, &mut self.wc_ecc_key)
1924+
&mut dout_size, rng.wc_rng, &mut self.wc_ecc_key)
19191925
};
19201926
if rc != 0 {
19211927
return Err(rc);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ macro_rules! define_ecdsa_curve {
254254
der.as_mut_ptr(), &mut der_len,
255255
&mut self.inner.wc_ecc_key as *mut _ as *mut c_void,
256256
size_of::<sys::ecc_key>() as u32,
257-
&mut self.rng.wc_rng,
257+
self.rng.wc_rng,
258258
)
259259
};
260260
if rc != 0 {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ impl Ed25519 {
114114
let ws_key = unsafe { ws_key.assume_init() };
115115
let mut ed25519 = Ed25519 { ws_key };
116116
let rc = unsafe {
117-
sys::wc_ed25519_make_key(&mut rng.wc_rng,
117+
sys::wc_ed25519_make_key(rng.wc_rng,
118118
sys::ED25519_KEY_SIZE as i32, &mut ed25519.ws_key)
119119
};
120120
if rc != 0 {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ impl Ed448 {
113113
let ws_key = unsafe { ws_key.assume_init() };
114114
let mut ed448 = Ed448 { ws_key };
115115
let rc = unsafe {
116-
sys::wc_ed448_make_key(&mut rng.wc_rng,
116+
sys::wc_ed448_make_key(rng.wc_rng,
117117
sys::ED448_KEY_SIZE as i32, &mut ed448.ws_key)
118118
};
119119
if rc != 0 {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ impl Lms {
444444
/// ```
445445
#[cfg(all(lms_make_key, random))]
446446
pub fn make_key(&mut self, rng: &mut RNG) -> Result<(), i32> {
447-
let rc = unsafe { sys::wc_LmsKey_MakeKey(&mut self.ws_key, &mut rng.wc_rng) };
447+
let rc = unsafe { sys::wc_LmsKey_MakeKey(&mut self.ws_key, rng.wc_rng) };
448448
if rc != 0 {
449449
return Err(rc);
450450
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ impl MlKem {
162162
dev_id: Option<i32>,
163163
) -> Result<Self, i32> {
164164
let key = Self::new_ex(key_type, heap, dev_id)?;
165-
let rc = unsafe { sys::wc_MlKemKey_MakeKey(key.ws_key, &mut rng.wc_rng) };
165+
let rc = unsafe { sys::wc_MlKemKey_MakeKey(key.ws_key, rng.wc_rng) };
166166
if rc != 0 {
167167
return Err(rc);
168168
}
@@ -489,7 +489,7 @@ impl MlKem {
489489
self.ws_key,
490490
ct.as_mut_ptr(),
491491
ss.as_mut_ptr(),
492-
&mut rng.wc_rng,
492+
rng.wc_rng,
493493
)
494494
};
495495
if rc != 0 {

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

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,19 @@ rng.generate_block(&mut buffer).expect("Failed to generate a block");
4545
#![cfg(random)]
4646

4747
use crate::sys;
48-
use core::mem::{size_of_val, MaybeUninit};
48+
use core::mem::size_of_val;
4949
use num_traits::PrimInt;
5050

5151
/// A cryptographically secure random number generator based on the wolfSSL
5252
/// library.
5353
///
54-
/// This struct wraps the wolfssl `WC_RNG` type, providing a high-level API
55-
/// for generating random bytes and blocks of data. The `Drop` implementation
56-
/// ensures that the underlying wolfSSL RNG context is correctly freed when the
57-
/// `RNG` struct goes out of scope, preventing memory leaks.
54+
/// This struct wraps a pointer to a wolfssl `WC_RNG` allocated on the C heap,
55+
/// providing a high-level API for generating random bytes and blocks of data.
56+
/// The `Drop` implementation ensures that the underlying wolfSSL RNG context is
57+
/// correctly freed when the `RNG` struct goes out of scope, preventing memory
58+
/// leaks.
5859
pub struct RNG {
59-
pub(crate) wc_rng: sys::WC_RNG,
60+
pub(crate) wc_rng: *mut sys::WC_RNG,
6061
}
6162

6263
impl RNG {
@@ -97,7 +98,7 @@ impl RNG {
9798
return Err(rc);
9899
}
99100
}
100-
let mut wc_rng: MaybeUninit<sys::WC_RNG> = MaybeUninit::uninit();
101+
let mut wc_rng: *mut sys::WC_RNG = core::ptr::null_mut();
101102
let heap = match heap {
102103
Some(heap) => heap,
103104
None => core::ptr::null_mut(),
@@ -107,12 +108,10 @@ impl RNG {
107108
None => sys::INVALID_DEVID,
108109
};
109110
let rc = unsafe {
110-
sys::wc_InitRng_ex(wc_rng.as_mut_ptr(), heap, dev_id)
111+
sys::wc_rng_new_ex(&mut wc_rng, core::ptr::null_mut(), 0, heap, dev_id)
111112
};
112113
if rc == 0 {
113-
let wc_rng = unsafe { wc_rng.assume_init() };
114-
let rng = RNG {wc_rng};
115-
Ok(rng)
114+
Ok(RNG {wc_rng})
116115
} else {
117116
Err(rc)
118117
}
@@ -159,7 +158,7 @@ impl RNG {
159158
}
160159
let ptr = nonce.as_mut_ptr() as *mut u8;
161160
let size = crate::buffer_len_to_u32(size_of_val(nonce))?;
162-
let mut wc_rng: MaybeUninit<sys::WC_RNG> = MaybeUninit::uninit();
161+
let mut wc_rng: *mut sys::WC_RNG = core::ptr::null_mut();
163162
let heap = match heap {
164163
Some(heap) => heap,
165164
None => core::ptr::null_mut(),
@@ -169,12 +168,10 @@ impl RNG {
169168
None => sys::INVALID_DEVID,
170169
};
171170
let rc = unsafe {
172-
sys::wc_InitRngNonce_ex(wc_rng.as_mut_ptr(), ptr, size, heap, dev_id)
171+
sys::wc_rng_new_ex(&mut wc_rng, ptr, size, heap, dev_id)
173172
};
174173
if rc == 0 {
175-
let wc_rng = unsafe { wc_rng.assume_init() };
176-
let rng = RNG {wc_rng};
177-
Ok(rng)
174+
Ok(RNG {wc_rng})
178175
} else {
179176
Err(rc)
180177
}
@@ -317,7 +314,7 @@ impl RNG {
317314
/// an `Err` with the wolfssl library return code on failure.
318315
pub fn generate_byte(&mut self) -> Result<u8, i32> {
319316
let mut b: u8 = 0;
320-
let rc = unsafe { sys::wc_RNG_GenerateByte(&mut self.wc_rng, &mut b) };
317+
let rc = unsafe { sys::wc_RNG_GenerateByte(self.wc_rng, &mut b) };
321318
if rc == 0 {
322319
Ok(b)
323320
} else {
@@ -342,7 +339,7 @@ impl RNG {
342339
pub fn generate_block<T: PrimInt>(&mut self, buf: &mut [T]) -> Result<(), i32> {
343340
let ptr = buf.as_mut_ptr() as *mut u8;
344341
let size = crate::buffer_len_to_u32(size_of_val(buf))?;
345-
let rc = unsafe { sys::wc_RNG_GenerateBlock(&mut self.wc_rng, ptr, size) };
342+
let rc = unsafe { sys::wc_RNG_GenerateBlock(self.wc_rng, ptr, size) };
346343
if rc == 0 {
347344
Ok(())
348345
} else {
@@ -374,7 +371,7 @@ impl RNG {
374371
pub fn reseed(&mut self, seed: &[u8]) -> Result<(), i32> {
375372
let seed_size = crate::buffer_len_to_u32(seed.len())?;
376373
let rc = unsafe {
377-
sys::wc_RNG_DRBG_Reseed(&mut self.wc_rng, seed.as_ptr(), seed_size)
374+
sys::wc_RNG_DRBG_Reseed(self.wc_rng, seed.as_ptr(), seed_size)
378375
};
379376
if rc != 0 {
380377
return Err(rc);
@@ -411,22 +408,16 @@ impl rand_core::TryRng for RNG {
411408
#[cfg(feature = "rand_core")]
412409
impl rand_core::TryCryptoRng for RNG {}
413410

414-
impl RNG {
415-
fn zeroize(&mut self) {
416-
unsafe { crate::zeroize_raw(&mut self.wc_rng); }
417-
}
418-
}
419-
420411
impl Drop for RNG {
421412
/// Safely free the underlying wolfSSL RNG context.
422413
///
423-
/// This calls the `wc_FreeRng` wolfssl library function.
414+
/// This calls the `wc_rng_free` wolfssl library function, which frees the
415+
/// C-heap-allocated `WC_RNG` object.
424416
///
425417
/// The Rust Drop trait guarantees that this method is called when the RNG
426418
/// struct goes out of scope, automatically cleaning up resources and
427419
/// preventing memory leaks.
428420
fn drop(&mut self) {
429-
unsafe { sys::wc_FreeRng(&mut self.wc_rng); }
430-
self.zeroize();
421+
unsafe { sys::wc_rng_free(self.wc_rng); }
431422
}
432423
}

0 commit comments

Comments
 (0)