Skip to content

Commit db1aab9

Browse files
Rust wrapper: zeroize structs on drop
1 parent f1a041a commit db1aab9

19 files changed

Lines changed: 374 additions & 6 deletions

File tree

wrapper/rust/wolfssl-wolfcrypt/Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wrapper/rust/wolfssl-wolfcrypt/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ cipher = ["dep:cipher"]
2020
rand_core = { version = "0.10", optional = true, default-features = false }
2121
aead = { version = "0.5", optional = true, default-features = false }
2222
cipher = { version = "0.5", optional = true, default-features = false }
23+
zeroize = { version = "1.3", default-features = false, features = ["derive"] }
2324

2425
[dev-dependencies]
2526
aead = { version = "0.5", features = ["alloc", "dev"] }

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

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Encryption Standard (AES) functionality.
2727

2828
use crate::sys;
2929
use core::mem::{size_of_val, MaybeUninit};
30+
use zeroize::{Zeroize, ZeroizeOnDrop};
3031

3132
#[cfg(feature = "aead")]
3233
use aead::{AeadCore, AeadInPlace, KeyInit, KeySizeUser};
@@ -233,10 +234,17 @@ impl CBC {
233234
}
234235
}
235236
#[cfg(aes_cbc)]
237+
impl Zeroize for CBC {
238+
fn zeroize(&mut self) {
239+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
240+
}
241+
}
242+
#[cfg(aes_cbc)]
236243
impl Drop for CBC {
237244
/// Safely free the wolfSSL resources.
238245
fn drop(&mut self) {
239246
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
247+
self.zeroize();
240248
}
241249
}
242250

@@ -428,10 +436,17 @@ impl CCM {
428436
}
429437
}
430438
#[cfg(aes_ccm)]
439+
impl Zeroize for CCM {
440+
fn zeroize(&mut self) {
441+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
442+
}
443+
}
444+
#[cfg(aes_ccm)]
431445
impl Drop for CCM {
432446
/// Safely free the wolfSSL resources.
433447
fn drop(&mut self) {
434448
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
449+
self.zeroize();
435450
}
436451
}
437452

@@ -506,6 +521,7 @@ fn ccm_decrypt_in_place(
506521

507522
/// AES-128-CCM authenticated encryption (12-byte nonce, 16-byte tag).
508523
#[cfg(all(aes_ccm, feature = "aead"))]
524+
#[derive(Zeroize, ZeroizeOnDrop)]
509525
pub struct Aes128Ccm {
510526
key: [u8; 16],
511527
}
@@ -557,6 +573,7 @@ impl AeadInPlace for Aes128Ccm {
557573

558574
/// AES-256-CCM authenticated encryption (12-byte nonce, 16-byte tag).
559575
#[cfg(all(aes_ccm, feature = "aead"))]
576+
#[derive(Zeroize, ZeroizeOnDrop)]
560577
pub struct Aes256Ccm {
561578
key: [u8; 32],
562579
}
@@ -906,10 +923,17 @@ impl CFB {
906923
}
907924
}
908925
#[cfg(aes_cfb)]
926+
impl Zeroize for CFB {
927+
fn zeroize(&mut self) {
928+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
929+
}
930+
}
931+
#[cfg(aes_cfb)]
909932
impl Drop for CFB {
910933
/// Safely free the wolfSSL resources.
911934
fn drop(&mut self) {
912935
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
936+
self.zeroize();
913937
}
914938
}
915939

@@ -1076,10 +1100,17 @@ impl CTR {
10761100
}
10771101
}
10781102
#[cfg(aes_ctr)]
1103+
impl Zeroize for CTR {
1104+
fn zeroize(&mut self) {
1105+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
1106+
}
1107+
}
1108+
#[cfg(aes_ctr)]
10791109
impl Drop for CTR {
10801110
/// Safely free the wolfSSL resources.
10811111
fn drop(&mut self) {
10821112
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
1113+
self.zeroize();
10831114
}
10841115
}
10851116

@@ -1384,10 +1415,17 @@ impl ECB {
13841415
}
13851416
}
13861417
#[cfg(aes_ecb)]
1418+
impl Zeroize for ECB {
1419+
fn zeroize(&mut self) {
1420+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
1421+
}
1422+
}
1423+
#[cfg(aes_ecb)]
13871424
impl Drop for ECB {
13881425
/// Safely free the wolfSSL resources.
13891426
fn drop(&mut self) {
13901427
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
1428+
self.zeroize();
13911429
}
13921430
}
13931431

@@ -1579,10 +1617,17 @@ impl GCM {
15791617
}
15801618
}
15811619
#[cfg(aes_gcm)]
1620+
impl Zeroize for GCM {
1621+
fn zeroize(&mut self) {
1622+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
1623+
}
1624+
}
1625+
#[cfg(aes_gcm)]
15821626
impl Drop for GCM {
15831627
/// Safely free the wolfSSL resources.
15841628
fn drop(&mut self) {
15851629
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
1630+
self.zeroize();
15861631
}
15871632
}
15881633

@@ -1658,6 +1703,7 @@ fn gcm_decrypt_in_place(
16581703

16591704
/// AES-128-GCM authenticated encryption (12-byte nonce, 16-byte tag).
16601705
#[cfg(all(aes_gcm, feature = "aead"))]
1706+
#[derive(Zeroize, ZeroizeOnDrop)]
16611707
pub struct Aes128Gcm {
16621708
key: [u8; 16],
16631709
}
@@ -1709,6 +1755,7 @@ impl AeadInPlace for Aes128Gcm {
17091755

17101756
/// AES-256-GCM authenticated encryption (12-byte nonce, 16-byte tag).
17111757
#[cfg(all(aes_gcm, feature = "aead"))]
1758+
#[derive(Zeroize, ZeroizeOnDrop)]
17121759
pub struct Aes256Gcm {
17131760
key: [u8; 32],
17141761
}
@@ -2034,10 +2081,17 @@ impl GCMStream {
20342081
}
20352082
}
20362083
#[cfg(aes_gcm_stream)]
2084+
impl Zeroize for GCMStream {
2085+
fn zeroize(&mut self) {
2086+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
2087+
}
2088+
}
2089+
#[cfg(aes_gcm_stream)]
20372090
impl Drop for GCMStream {
20382091
/// Safely free the wolfSSL resources.
20392092
fn drop(&mut self) {
20402093
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
2094+
self.zeroize();
20412095
}
20422096
}
20432097

@@ -2215,10 +2269,17 @@ impl OFB {
22152269
}
22162270
}
22172271
#[cfg(aes_ofb)]
2272+
impl Zeroize for OFB {
2273+
fn zeroize(&mut self) {
2274+
unsafe { crate::zeroize_raw(&mut self.ws_aes); }
2275+
}
2276+
}
2277+
#[cfg(aes_ofb)]
22182278
impl Drop for OFB {
22192279
/// Safely free the wolfSSL resources.
22202280
fn drop(&mut self) {
22212281
unsafe { sys::wc_AesFree(&mut self.ws_aes); }
2282+
self.zeroize();
22222283
}
22232284
}
22242285

@@ -2586,10 +2647,17 @@ impl XTS {
25862647
}
25872648
}
25882649
#[cfg(aes_xts)]
2650+
impl Zeroize for XTS {
2651+
fn zeroize(&mut self) {
2652+
unsafe { crate::zeroize_raw(&mut self.ws_xtsaes); }
2653+
}
2654+
}
2655+
#[cfg(aes_xts)]
25892656
impl Drop for XTS {
25902657
/// Safely free the wolfSSL resources.
25912658
fn drop(&mut self) {
25922659
unsafe { sys::wc_AesXtsFree(&mut self.ws_xtsaes); }
2660+
self.zeroize();
25932661
}
25942662
}
25952663

@@ -2890,10 +2958,17 @@ impl XTSStream {
28902958
}
28912959
}
28922960
#[cfg(aes_xts_stream)]
2961+
impl Zeroize for XTSStream {
2962+
fn zeroize(&mut self) {
2963+
unsafe { crate::zeroize_raw(&mut self.ws_xtsaes); }
2964+
}
2965+
}
2966+
#[cfg(aes_xts_stream)]
28932967
impl Drop for XTSStream {
28942968
/// Safely free the wolfSSL resources.
28952969
fn drop(&mut self) {
28962970
unsafe { sys::wc_AesXtsFree(&mut self.ws_xtsaes); }
2971+
self.zeroize();
28972972
}
28982973
}
28992974

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ functionality.
2727

2828
use crate::sys;
2929
use core::mem::MaybeUninit;
30+
use zeroize::Zeroize;
3031

3132
/// Context for BLAKE2b computation.
3233
#[cfg(blake2b)]
@@ -174,6 +175,20 @@ impl BLAKE2b {
174175
}
175176

176177

178+
#[cfg(blake2b)]
179+
impl Zeroize for BLAKE2b {
180+
fn zeroize(&mut self) {
181+
unsafe { crate::zeroize_raw(&mut self.wc_blake2b); }
182+
}
183+
}
184+
185+
#[cfg(blake2b)]
186+
impl Drop for BLAKE2b {
187+
fn drop(&mut self) {
188+
self.zeroize();
189+
}
190+
}
191+
177192
/// Context for HMAC-BLAKE2b computation.
178193
#[cfg(blake2b_hmac)]
179194
pub struct BLAKE2bHmac {
@@ -311,6 +326,20 @@ impl BLAKE2bHmac {
311326
}
312327

313328

329+
#[cfg(blake2b_hmac)]
330+
impl Zeroize for BLAKE2bHmac {
331+
fn zeroize(&mut self) {
332+
unsafe { crate::zeroize_raw(&mut self.wc_blake2b); }
333+
}
334+
}
335+
336+
#[cfg(blake2b_hmac)]
337+
impl Drop for BLAKE2bHmac {
338+
fn drop(&mut self) {
339+
self.zeroize();
340+
}
341+
}
342+
314343
/// Context for BLAKE2s computation.
315344
#[cfg(blake2s)]
316345
pub struct BLAKE2s {
@@ -457,6 +486,20 @@ impl BLAKE2s {
457486
}
458487

459488

489+
#[cfg(blake2s)]
490+
impl Zeroize for BLAKE2s {
491+
fn zeroize(&mut self) {
492+
unsafe { crate::zeroize_raw(&mut self.wc_blake2s); }
493+
}
494+
}
495+
496+
#[cfg(blake2s)]
497+
impl Drop for BLAKE2s {
498+
fn drop(&mut self) {
499+
self.zeroize();
500+
}
501+
}
502+
460503
/// Context for HMAC-BLAKE2s computation.
461504
#[cfg(blake2s_hmac)]
462505
pub struct BLAKE2sHmac {
@@ -592,3 +635,17 @@ impl BLAKE2sHmac {
592635
Ok(())
593636
}
594637
}
638+
639+
#[cfg(blake2s_hmac)]
640+
impl Zeroize for BLAKE2sHmac {
641+
fn zeroize(&mut self) {
642+
unsafe { crate::zeroize_raw(&mut self.wc_blake2s); }
643+
}
644+
}
645+
646+
#[cfg(blake2s_hmac)]
647+
impl Drop for BLAKE2sHmac {
648+
fn drop(&mut self) {
649+
self.zeroize();
650+
}
651+
}

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ ChaCha20-Poly1305 functionality.
2727

2828
use crate::sys;
2929
use core::mem::MaybeUninit;
30+
use zeroize::{Zeroize, ZeroizeOnDrop};
3031

3132
pub struct ChaCha20Poly1305 {
3233
wc_ccp: sys::ChaChaPoly_Aead,
@@ -243,14 +244,15 @@ impl ChaCha20Poly1305 {
243244
}
244245
}
245246

247+
impl Zeroize for ChaCha20Poly1305 {
248+
fn zeroize(&mut self) {
249+
unsafe { crate::zeroize_raw(&mut self.wc_ccp); }
250+
}
251+
}
252+
246253
impl Drop for ChaCha20Poly1305 {
247254
fn drop(&mut self) {
248-
unsafe {
249-
let ptr = &mut self.wc_ccp as *mut sys::ChaChaPoly_Aead as *mut u8;
250-
for i in 0..core::mem::size_of::<sys::ChaChaPoly_Aead>() {
251-
core::ptr::write_volatile(ptr.add(i), 0);
252-
}
253-
}
255+
self.zeroize();
254256
}
255257
}
256258

@@ -261,6 +263,7 @@ impl Drop for ChaCha20Poly1305 {
261263
/// ChaCha20-Poly1305 AEAD instance holding a key for use with the
262264
/// `aead::KeyInit` and `aead::AeadInPlace` traits.
263265
#[cfg(feature = "aead")]
266+
#[derive(Zeroize, ZeroizeOnDrop)]
264267
pub struct ChaCha20Poly1305Aead {
265268
key: [u8; 32],
266269
}
@@ -449,6 +452,7 @@ impl XChaCha20Poly1305 {
449452
/// XChaCha20-Poly1305 AEAD instance holding a key for use with the
450453
/// `aead::KeyInit` and `aead::AeadInPlace` traits.
451454
#[cfg(all(xchacha20_poly1305, feature = "aead"))]
455+
#[derive(Zeroize, ZeroizeOnDrop)]
452456
pub struct XChaCha20Poly1305Aead {
453457
key: [u8; 32],
454458
}

0 commit comments

Comments
 (0)