| Crates.io | tacet-macros |
| lib.rs | tacet-macros |
| version | 0.2.0 |
| created_at | 2026-01-25 05:02:23.281981+00 |
| updated_at | 2026-01-25 05:02:23.281981+00 |
| description | Proc macros for tacet timing side-channel detection |
| homepage | |
| repository | https://github.com/agucova/tacet |
| max_upload_size | |
| id | 2068158 |
| size | 18,654 |
Proc macros for timing side-channel tests.
This crate provides the timing_test! and timing_test_checked! macros for tacet. You typically don't need to depend on this crate directly.
The macros are included when you enable the macros feature on tacet (enabled by default):
[dev-dependencies]
tacet = "0.1"
timing_test!Returns Outcome for pattern matching on all four variants:
use tacet::{timing_test, Outcome};
let outcome = timing_test! {
baseline: || [0u8; 32],
sample: || rand::random::<[u8; 32]>(),
measure: |input| {
my_crypto_function(&input);
},
};
match outcome {
Outcome::Pass { leak_probability, .. } => {
println!("No leak: {:.1}%", leak_probability * 100.0);
}
Outcome::Fail { exploitability, .. } => {
panic!("Timing leak detected: {:?}", exploitability);
}
Outcome::Inconclusive { reason, .. } => {
println!("Inconclusive: {:?}", reason);
}
Outcome::Unmeasurable { recommendation, .. } => {
println!("Skipped: {}", recommendation);
}
}
timing_test_checked!Same as timing_test! but panics on Fail:
use tacet::{timing_test_checked, Outcome};
// Panics if timing leak detected
let outcome = timing_test_checked! {
baseline: || [0u8; 32],
sample: || rand::random::<[u8; 32]>(),
measure: |input| {
constant_time_eq(&secret, &input);
},
};
use tacet::{timing_test, TimingOracle, AttackerModel};
let outcome = timing_test! {
oracle: TimingOracle::for_attacker(AttackerModel::SharedHardware)
.pass_threshold(0.01)
.fail_threshold(0.99),
baseline: || [0u8; 32],
sample: || rand::random::<[u8; 32]>(),
measure: |input| operation(&input),
};
timing_test! {
// Optional: oracle configuration (defaults to AdjacentNetwork)
oracle: TimingOracle::for_attacker(AttackerModel::AdjacentNetwork),
// Required: baseline input generator
baseline: || fixed_input,
// Required: sample input generator
sample: || random_input(),
// Required: operation to measure
measure: |input| operation(&input),
}
MPL-2.0