1#[derive(Debug, Clone, Copy)]
3pub struct SpinParams {
4 pub spin_counter_interval: SpinCounterInterval,
6 pub spin_counter_periodicity: SpinCounterPeriodicity,
8 pub spin_entropy: SpinEntropy,
10}
11
12#[derive(Debug, Clone, Copy)]
14pub enum SpinCounterInterval {
15 Coarse,
17 Fine,
19}
20
21pub(crate) fn ticks_to_drop(interval: SpinCounterInterval) -> u64 {
22 match interval {
23 SpinCounterInterval::Coarse => 24,
24 SpinCounterInterval::Fine => 16,
25 }
26}
27
28#[derive(Debug, Clone, Copy)]
30pub enum SpinCounterPeriodicity {
31 None,
32 Short,
34 Medium,
36 Long,
38}
39
40pub(crate) fn tick_periodicity_bits(params: SpinParams) -> u64 {
41 let counter_bits = match params.spin_counter_periodicity {
42 SpinCounterPeriodicity::None => 0,
43 SpinCounterPeriodicity::Short => 16,
44 SpinCounterPeriodicity::Medium => 24,
45 SpinCounterPeriodicity::Long => 32,
46 };
47
48 counter_bits + entropy_bytes(params.spin_entropy) * 8
49}
50
51#[derive(Debug, Clone, Copy)]
53pub enum SpinEntropy {
54 None,
55 One,
56 Two,
57 Three,
58 Four,
59}
60
61pub(crate) fn entropy_bytes(entropy: SpinEntropy) -> u64 {
62 match entropy {
63 SpinEntropy::None => 0,
64 SpinEntropy::One => 1,
65 SpinEntropy::Two => 2,
66 SpinEntropy::Three => 3,
67 SpinEntropy::Four => 4,
68 }
69}
70
71pub(crate) fn generate_entropy(entropy: SpinEntropy) -> Vec<u8> {
72 let bytes_to_generate = entropy_bytes(entropy);
73
74 let mut result = Vec::new();
75 for _ in 0..bytes_to_generate {
76 result.push(rand::random::<u8>());
77 }
78 result
79}