Skip to main content

KdfPreset

Enum KdfPreset 

Source
pub enum KdfPreset {
Show 13 variants Fast, Balanced, Paranoid, FastMac, BalancedMac, ParanoidMac, FastX86, BalancedX86, ParanoidX86, FastArm, BalancedArm, ParanoidArm, Custom(KdfParams),
}
Expand description

Pre-tuned KdfParams sets.

Pick the variant that matches your target platform and security goal. Use Custom to supply entirely your own parameters.

Why device-specific presets? Apple Silicon has exceptional memory bandwidth (unified memory, ~400 GB/s on M2). The same parameters that take 2 seconds on an M2 may take 15+ seconds on a typical x86-64 server. Device-specific variants let you choose a cost that is consistent across the hardware you actually deploy on.

§Generic (cross-platform)

Suitable for any platform. Use these when you don’t know or don’t control the target hardware.

PresetPeak RAMEst. Mac M2Est. x86-64
Fast~128 MiB~500 ms~1.5 s
Balanced~512 MiB~2 s~8–15 s
Paranoid~768 MiB~4–6 s~20–30 s

§Apple Silicon (*Mac)

Harder parameters calibrated for Apple Silicon’s superior memory bandwidth. All three tiers assume at least 8 GiB unified memory (all M-series chips).

PresetPeak RAMEst. Mac M2Est. Mac M3/M4
FastMac~512 MiB~2 sfaster
BalancedMac~1 GiB~5–12 sfaster
ParanoidMac~3 GiB~30–60 sfaster

§x86-64 (*X86)

Equivalent to Generic; provided as explicit named variants so code documents intent clearly.

PresetPeak RAMEst. x86-64
FastX86~128 MiB~1.5 s
BalancedX86~512 MiB~8–15 s
ParanoidX86~768 MiB~20–30 s

§Linux ARM64 (*Arm)

Tuned for AWS Graviton3 / similar high-end ARM servers. Raspberry Pi and lower-end ARM boards will be slower.

PresetPeak RAMEst. Graviton3
FastArm~256 MiB~3 s
BalancedArm~512 MiB~10–20 s
ParanoidArm~768 MiB~30–50 s

§Custom

Custom(KdfParams) lets you supply exactly the parameters you measured and tuned for your own hardware.

Variants§

§

Fast

~128 MiB · scrypt 2¹⁶ · ~64 MiB, 3 iters each.

§

Balanced

~512 MiB · scrypt 2¹⁷ · ~256 MiB, 4 iters each.

§

Paranoid

~768 MiB · scrypt 2¹⁸ · ~512 MiB, 5 iters each.

§

FastMac

Dev / CI on macOS. ~512 MiB · scrypt 2¹⁷ · ~256 MiB, 4 iters each.

§

BalancedMac

Production on macOS (Apple Silicon). ~1 GiB · scrypt 2¹⁸ · ~512 MiB, 4 iters each.

§

ParanoidMac

Maximum security on macOS. ~3 GiB · scrypt 2²⁰ · ~1 GiB, 4 iters each. Assumes 8+ GiB unified memory (all M-series chips).

§

FastX86

Dev / CI on x86-64. Same params as Fast.

§

BalancedX86

Production on x86-64. Same params as Balanced.

§

ParanoidX86

Maximum security on x86-64. Same params as Paranoid.

§

FastArm

Dev / CI on Linux ARM64. ~256 MiB · scrypt 2¹⁶ · ~128 MiB, 3 iters each.

§

BalancedArm

Production on Linux ARM64. ~512 MiB · scrypt 2¹⁷ · ~256 MiB, 5 iters each.

§

ParanoidArm

Maximum security on Linux ARM64. ~768 MiB · scrypt 2¹⁸ · ~512 MiB, 5 iters each.

§

Custom(KdfParams)

Fully user-defined parameters. Use when you have measured and tuned KDF cost on your own hardware.

§Example

use toolkit_zero::encryption::timelock::*;
let p = KdfPreset::Custom(KdfParams {
    pass1: Argon2PassParams { m_cost: 262_144, t_cost: 3, p_cost: 1 },
    pass2: ScryptPassParams { log_n: 16, r: 8, p: 1 },
    pass3: Argon2PassParams { m_cost: 131_072, t_cost: 3, p_cost: 1 },
});

Implementations§

Source§

impl KdfPreset

Source

pub fn params(self) -> KdfParams

Return the KdfParams for this preset.

Examples found in repository?
examples/timelock_round_trip.rs (line 32)
24fn main() {
25    // ── Encryption side ───────────────────────────────────────────────────────
26    // Generate fresh salts.  Salts are NOT secret — store them in plaintext
27    // alongside the ciphertext so the decryption side can reproduce the key.
28    let salts = TimeLockSalts::generate();
29
30    // Use a deliberately fast preset so the example finishes quickly.
31    // In production use KdfPreset::Balanced or stronger.
32    let kdf = KdfPreset::Balanced.params();
33
34    // Lock to any Tuesday at 18:00 (hour-precision window = the full 18:00–18:59 block).
35    let cadence   = TimeLockCadence::DayOfWeek(Weekday::Tuesday);
36    let lock_time = TimeLockTime::new(18, 0).unwrap();
37
38    println!("Deriving encryption key (this may take a few seconds)…");
39    let enc_key = TimelockBuilder::encrypt()
40        .cadence(cadence.clone())
41        .time(lock_time)
42        .precision(TimePrecision::Hour)
43        .format(TimeFormat::Hour24)
44        .salts(salts.clone())
45        .kdf(kdf)
46        .derive()
47        .expect("encryption-side key derivation failed");
48
49    println!("enc_key[:8] = {:02x?}", &enc_key.as_bytes()[..8]);
50
51    // Pack every setting — including salts and KDF params — into a compact header.
52    // This header goes into the ciphertext in plaintext; nothing here is secret.
53    let header = pack(
54        TimePrecision::Hour,
55        TimeFormat::Hour24,
56        &cadence,
57        salts,
58        kdf,
59    );
60
61    // ── Decryption side ───────────────────────────────────────────────────────
62    // Load `header` from the ciphertext and call TimelockBuilder::decrypt at the
63    // matching time slot.  All settings are read from the header automatically.
64    println!("Deriving decryption key from system clock…");
65    let dec_key = TimelockBuilder::decrypt(header)
66        .derive()
67        .expect("decryption-side key derivation failed");
68
69    println!("dec_key[:8] = {:02x?}", &dec_key.as_bytes()[..8]);
70
71    // ── Verdict ───────────────────────────────────────────────────────────────
72    if enc_key.as_bytes() == dec_key.as_bytes() {
73        println!("\nKeys match ✓  — running on a Tuesday at 18:xx");
74    } else {
75        println!("\nKeys differ — not running on a Tuesday at 18:xx (expected outside that window)");
76    }
77}

Trait Implementations§

Source§

impl Clone for KdfPreset

Source§

fn clone(&self) -> KdfPreset

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for KdfPreset

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for KdfPreset

Source§

fn eq(&self, other: &KdfPreset) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for KdfPreset

Source§

impl Eq for KdfPreset

Source§

impl StructuralPartialEq for KdfPreset

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more