pub struct Dynamic<T: ?Sized>(/* private fields */);Expand description
Re-export of the Dynamic type.
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, ExposeSecret};
let secret: Dynamic<String> = "hunter2".into();
assert_eq!(secret.expose_secret(), "hunter2");With already-boxed values:
use secure_gate::{Dynamic, ExposeSecret};
let boxed_secret = Box::new("hunter2".to_string());
let secret: Dynamic<String> = boxed_secret.into(); // or Dynamic::from(boxed_secret)
assert_eq!(secret.expose_secret(), "hunter2");Mutable access:
use secure_gate::{Dynamic, ExposeSecret, ExposeSecretMut};
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§
impl Dynamic<String>
§Ergonomic helpers for common heap types
Source§impl Dynamic<String>
impl Dynamic<String>
Sourcepub fn ct_eq(&self, other: &Self) -> bool
pub fn ct_eq(&self, other: &Self) -> bool
Constant-time equality comparison.
Compares the byte contents of two Dynamic<String> instances in constant time
to prevent timing attacks. The strings are compared as UTF-8 byte sequences.
§Examples
use secure_gate::Dynamic;
let a: Dynamic<String> = Dynamic::new("secret".to_string());
let b: Dynamic<String> = Dynamic::new("secret".to_string());
assert!(a.ct_eq(&b));Source§impl Dynamic<Vec<u8>>
impl Dynamic<Vec<u8>>
Sourcepub fn ct_eq(&self, other: &Self) -> bool
pub fn ct_eq(&self, other: &Self) -> bool
Constant-time equality comparison.
Compares the byte contents of two Dynamic<Vec<u8>> instances in constant time
to prevent timing attacks. The vectors are compared as byte slices.
§Examples
use secure_gate::Dynamic;
let a: Dynamic<Vec<u8>> = Dynamic::new(vec![1, 2, 3]);
let b: Dynamic<Vec<u8>> = Dynamic::new(vec![1, 2, 3]);
assert!(a.ct_eq(&b));Source§impl Dynamic<Vec<u8>>
Random generation — only available with rand feature.
impl Dynamic<Vec<u8>>
Random generation — only available with rand feature.
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 DynamicRandom. Equivalent to:
DynamicRandom::generate(len).into_inner()
§Example
use secure_gate::{Dynamic, ExposeSecret};
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());Source§impl Dynamic<CloneableStringInner>
impl Dynamic<CloneableStringInner>
Sourcepub fn init_with<F>(constructor: F) -> Self
pub fn init_with<F>(constructor: F) -> Self
Construct a cloneable string secret by building it in a closure.
This minimizes the time the secret spends on the stack:
- The closure builds a temporary
String. - It is immediately cloned to the heap.
- The temporary is zeroized before returning.
Use this when reading passwords or tokens from user input.
§Example
use secure_gate::CloneableString;
use std::io::{self, Write};
fn read_password() -> io::Result<String> {
let mut input = String::new();
io::stdout().flush()?;
io::stdin().read_line(&mut input)?;
Ok(input.trim_end().to_string())
}
let pw = CloneableString::init_with(|| read_password().unwrap());Sourcepub fn try_init_with<F, E>(constructor: F) -> Result<Self, E>
pub fn try_init_with<F, E>(constructor: F) -> Result<Self, E>
Fallible version of init_with.
Same stack-minimization benefits as init_with, but allows for construction
that may fail with an error. Useful when reading secrets from fallible sources
like files, network connections, or user input that may encounter I/O errors.
Source§impl Dynamic<CloneableVecInner>
impl Dynamic<CloneableVecInner>
Sourcepub fn init_with<F>(constructor: F) -> Self
pub fn init_with<F>(constructor: F) -> Self
Construct a cloneable vec secret by building it in a closure.
Same stack-minimization benefits as CloneableString::init_with.
§Example
use secure_gate::CloneableVec;
let seed = CloneableVec::init_with(|| {
let mut v = vec![0u8; 32];
// Fill from some source...
v
});Sourcepub fn try_init_with<F, E>(constructor: F) -> Result<Self, E>
pub fn try_init_with<F, E>(constructor: F) -> Result<Self, E>
Fallible version of init_with.
Same stack-minimization benefits as init_with, but allows for construction
that may fail with an error. Useful when reading secrets from fallible sources
like files or network connections.
Trait Implementations§
Source§impl<T: CloneSafe> Clone for Dynamic<T>
Available on crate feature zeroize only.Opt-in Clone — only for types marked CloneSafe.
impl<T: CloneSafe> Clone for Dynamic<T>
zeroize only.Opt-in Clone — only for types marked CloneSafe.
Source§impl ExposeSecret for Dynamic<CloneableStringInner>
Available on crate feature zeroize only.Implementation for Dynamic<CloneableStringInner> - exposes the inner wrapper.
impl ExposeSecret for Dynamic<CloneableStringInner>
zeroize only.Implementation for Dynamic<CloneableStringInner> - exposes the inner wrapper.
Source§type Inner = CloneableStringInner
type Inner = CloneableStringInner
Source§fn expose_secret(&self) -> &CloneableStringInner
fn expose_secret(&self) -> &CloneableStringInner
Source§impl ExposeSecret for Dynamic<CloneableVecInner>
Available on crate feature zeroize only.Implementation for Dynamic<CloneableVecInner> - exposes the inner wrapper.
impl ExposeSecret for Dynamic<CloneableVecInner>
zeroize only.Implementation for Dynamic<CloneableVecInner> - exposes the inner wrapper.
Source§type Inner = CloneableVecInner
type Inner = CloneableVecInner
Source§fn expose_secret(&self) -> &CloneableVecInner
fn expose_secret(&self) -> &CloneableVecInner
Source§impl ExposeSecret for Dynamic<String>
Implementation for Dynamic<String> - provides full read/write access.
impl ExposeSecret for Dynamic<String>
Implementation for Dynamic<String> - provides full read/write access.
Dynamic<String> is a core wrapper that allows both reading and mutation of secrets.
This implementation directly accesses the inner field.
Source§impl<T> ExposeSecret for Dynamic<Vec<T>>
Implementation for Dynamic<Vec<T>> - provides full read/write access.
impl<T> ExposeSecret for Dynamic<Vec<T>>
Implementation for Dynamic<Vec<T>> - provides full read/write access.
Dynamic<Vec<T>> is a core wrapper that allows both reading and mutation of secrets.
This implementation directly accesses the inner field.
Source§impl ExposeSecretMut for Dynamic<CloneableStringInner>
Available on crate feature zeroize only.Implementation for Dynamic<CloneableStringInner> - provides mutable access.
impl ExposeSecretMut for Dynamic<CloneableStringInner>
zeroize only.Implementation for Dynamic<CloneableStringInner> - provides mutable access.
Source§fn expose_secret_mut(&mut self) -> &mut CloneableStringInner
fn expose_secret_mut(&mut self) -> &mut CloneableStringInner
Source§impl ExposeSecretMut for Dynamic<CloneableVecInner>
Available on crate feature zeroize only.Implementation for Dynamic<CloneableVecInner> - provides mutable access.
impl ExposeSecretMut for Dynamic<CloneableVecInner>
zeroize only.Implementation for Dynamic<CloneableVecInner> - provides mutable access.
Source§fn expose_secret_mut(&mut self) -> &mut CloneableVecInner
fn expose_secret_mut(&mut self) -> &mut CloneableVecInner
Source§impl ExposeSecretMut for Dynamic<String>
Implementation for Dynamic<String> - provides mutable access.
impl ExposeSecretMut for Dynamic<String>
Implementation for Dynamic<String> - provides mutable access.
Extends the read-only implementation with mutation capabilities.
Source§fn expose_secret_mut(&mut self) -> &mut String
fn expose_secret_mut(&mut self) -> &mut String
Source§impl<T> ExposeSecretMut for Dynamic<Vec<T>>
Implementation for Dynamic<Vec<T>> - provides mutable access.
impl<T> ExposeSecretMut for Dynamic<Vec<T>>
Implementation for Dynamic<Vec<T>> - provides mutable access.
Extends the read-only implementation with mutation capabilities.
Source§fn expose_secret_mut(&mut self) -> &mut Vec<T>
fn expose_secret_mut(&mut self) -> &mut Vec<T>
Source§impl From<DynamicRandom> for Dynamic<Vec<u8>>
impl From<DynamicRandom> for Dynamic<Vec<u8>>
Source§fn from(rng: DynamicRandom) -> Self
fn from(rng: DynamicRandom) -> Self
Convert a DynamicRandom to Dynamic, transferring ownership.
This preserves all security guarantees. The DynamicRandom 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::DynamicRandom};
let random: Dynamic<Vec<u8>> = DynamicRandom::generate(64).into();Source§impl<T: ?Sized + Zeroize> Zeroize for Dynamic<T>
Available on crate feature zeroize only.Zeroize integration.
impl<T: ?Sized + Zeroize> Zeroize for Dynamic<T>
zeroize only.Zeroize integration.
impl<T: ?Sized + Zeroize> ZeroizeOnDrop for Dynamic<T>
zeroize only.Zeroize on drop integration.