pub struct Dynamic<T: ?Sized>(/* private fields */);Expand description
Heap-allocated secure secret wrapper.
This is a thin wrapper around Box<T> with enforced explicit exposure.
Suitable for dynamic-sized secrets like String or Vec<u8>.
Security invariants:
- No
DereforAsRef— prevents silent access. Debugis always redacted.- With
zeroize, wipes the entire allocation on drop (including spare capacity).
§Examples
Basic usage:
use secure_gate::Dynamic;
let secret: Dynamic<String> = "hunter2".into();
assert_eq!(secret.expose_secret(), "hunter2");Mutable access:
use secure_gate::Dynamic;
let mut secret = Dynamic::<String>::new("pass".to_string());
secret.expose_secret_mut().push('!');
assert_eq!(secret.expose_secret(), "pass!");With zeroize (automatic wipe):
use secure_gate::Dynamic;
let secret = Dynamic::<Vec<u8>>::new(vec![1u8; 32]);
drop(secret); // heap wiped automaticallyImplementations§
Source§impl<T: ?Sized> Dynamic<T>
impl<T: ?Sized> Dynamic<T>
Sourcepub fn new_boxed(value: Box<T>) -> Self
pub fn new_boxed(value: Box<T>) -> Self
Wrap an already-boxed value.
Zero-cost — just wraps the Box.
Sourcepub const fn expose_secret(&self) -> &T
pub const fn expose_secret(&self) -> &T
Expose the inner value for read-only access.
This is the only way to read the secret — loud and auditable.
Sourcepub fn expose_secret_mut(&mut self) -> &mut T
pub fn expose_secret_mut(&mut self) -> &mut T
Expose the inner value for mutable access.
This is the only way to mutate the secret — loud and auditable.
Source§impl Dynamic<Vec<u8>>
impl Dynamic<Vec<u8>>
Sourcepub fn generate_random(len: usize) -> Self
pub fn generate_random(len: usize) -> Self
Generate fresh random bytes of the specified length using the OS RNG.
This is a convenience method that generates random bytes directly
without going through DynamicRng. Equivalent to:
DynamicRng::generate(len).into_inner()
§Example
use secure_gate::Dynamic;
let random: Dynamic<Vec<u8>> = Dynamic::generate_random(64);
assert_eq!(random.len(), 64);Sourcepub fn try_generate_random(len: usize) -> Result<Self, OsError>
pub fn try_generate_random(len: usize) -> Result<Self, OsError>
Try to generate random bytes for Dynamic.
Returns an error if the RNG fails.
§Example
use secure_gate::Dynamic;
let random: Result<Dynamic<Vec<u8>>, rand::rand_core::OsError> = Dynamic::try_generate_random(64);
assert!(random.is_ok());Trait Implementations§
Source§impl<T: CloneableSecret> Clone for Dynamic<T>
Available on crate feature zeroize only.
impl<T: CloneableSecret> Clone for Dynamic<T>
zeroize only.Source§impl From<DynamicRng> for Dynamic<Vec<u8>>
impl From<DynamicRng> for Dynamic<Vec<u8>>
Source§fn from(rng: DynamicRng) -> Self
fn from(rng: DynamicRng) -> Self
Convert a DynamicRng to Dynamic, transferring ownership.
This preserves all security guarantees. The DynamicRng type
ensures the value came from secure RNG, and this conversion
transfers that value to Dynamic without exposing bytes.
§Example
use secure_gate::{Dynamic, random::DynamicRng};
let random: Dynamic<Vec<u8>> = DynamicRng::generate(64).into();impl<T: ?Sized + Zeroize> ZeroizeOnDrop for Dynamic<T>
zeroize only.