pub fn pack(
precision: TimePrecision,
format: TimeFormat,
cadence: &TimeLockCadence,
salts: TimeLockSalts,
kdf_params: KdfParams,
) -> TimeLockParamsExpand description
Pack TimePrecision, TimeFormat, and a TimeLockCadence reference
into a compact TimeLockParams for ciphertext header storage.
Only the variant identity of cadence is recorded — the actual day,
weekday, or month values are intentionally discarded.
§Example
let salts = TimeLockSalts::generate();
let kdf = KdfPreset::Balanced.params();
let p = pack(
TimePrecision::Minute,
TimeFormat::Hour24,
&TimeLockCadence::DayOfWeek(Weekday::Tuesday),
salts,
kdf,
);
// p.time_precision == 2, p.time_format == 1, p.cadence_variant == 1Examples found in repository?
examples/timelock_round_trip.rs (lines 54-60)
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}