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
TimeLockError::ForbiddenActionif the required feature is not active, or if the_atpath is taken but any requiredOptionargument isNone.TimeLockError::Argon2/TimeLockError::Scrypton KDF failure.TimeLockError::ClockUnavailableif the OS clock is unusable (_nowpath).
§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 timeExamples 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}