Skip to main content

timelock

Function timelock 

Source
pub fn timelock(
    cadence: Option<TimeLockCadence>,
    time: Option<TimeLockTime>,
    precision: Option<TimePrecision>,
    format: Option<TimeFormat>,
    salts: Option<TimeLockSalts>,
    kdf: Option<KdfParams>,
    params: Option<TimeLockParams>,
) -> Result<TimeLockKey, TimeLockError>
Expand description

Derive a 32-byte time-locked key — unified sync entry point.

§Encryption path (params = None)

Set params to None and supply all of cadence, time, precision, format, salts, and kdf as Some(...). Requires the enc-timelock-keygen-input feature. After calling, use pack with the same arguments to produce a TimeLockParams header for the ciphertext.

§Decryption path (params = Some(p))

Set params to Some(header) where header is the TimeLockParams read from the ciphertext. All other arguments are ignored and may be None. Requires the enc-timelock-keygen-now feature.

§Errors

§Example

let salts = TimeLockSalts::generate();
let kdf   = KdfPreset::BalancedMac.params();

// Encryption side — lock to every Tuesday at 18:00
let enc_key = timelock(
    Some(TimeLockCadence::DayOfWeek(Weekday::Tuesday)),
    Some(TimeLockTime::new(18, 0).unwrap()),
    Some(TimePrecision::Hour),
    Some(TimeFormat::Hour24),
    Some(salts.clone()),
    Some(kdf),
    None,
).unwrap();

// Pack settings + salts + kdf into header; store in ciphertext.
let header = pack(TimePrecision::Hour, TimeFormat::Hour24,
                  &TimeLockCadence::DayOfWeek(Weekday::Tuesday), salts, kdf);

// Decryption side — call on a Tuesday at 18:xx:
let dec_key = timelock(
    None, None, None, None, None, None,
    Some(header),
).unwrap();
// enc_key.as_bytes() == dec_key.as_bytes() when called at the right time
Examples found in repository?
examples/timelock_round_trip.rs (lines 39-47)
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 = timelock(
40        Some(cadence.clone()),
41        Some(lock_time),
42        Some(TimePrecision::Hour),
43        Some(TimeFormat::Hour24),
44        Some(salts.clone()),
45        Some(kdf),
46        None,   // params = None → _at (encryption) path
47    )
48    .expect("encryption-side key derivation failed");
49
50    println!("enc_key[:8] = {:02x?}", &enc_key.as_bytes()[..8]);
51
52    // Pack every setting — including salts and KDF params — into a compact header.
53    // This header goes into the ciphertext in plaintext; nothing here is secret.
54    let header = pack(
55        TimePrecision::Hour,
56        TimeFormat::Hour24,
57        &cadence,
58        salts,
59        kdf,
60    );
61
62    // ── Decryption side ───────────────────────────────────────────────────────
63    // Load `header` from the ciphertext and call timelock() at the matching
64    // time slot with params = Some(header).
65    println!("Deriving decryption key from system clock…");
66    let dec_key = timelock(
67        None, None, None, None, None, None,
68        Some(header),   // params = Some → _now (decryption) path
69    )
70    .expect("decryption-side key derivation failed");
71
72    println!("dec_key[:8] = {:02x?}", &dec_key.as_bytes()[..8]);
73
74    // ── Verdict ───────────────────────────────────────────────────────────────
75    if enc_key.as_bytes() == dec_key.as_bytes() {
76        println!("\nKeys match ✓  — running on a Tuesday at 18:xx");
77    } else {
78        println!("\nKeys differ — not running on a Tuesday at 18:xx (expected outside that window)");
79    }
80}