snarkvm_console_account/signature/
from_bits.rs1use super::*;
17
18impl<N: Network> FromBits for Signature<N> {
19 fn from_bits_le(bits_le: &[bool]) -> Result<Self> {
21 let scalar_size_in_bits = Scalar::<N>::size_in_bits();
22 let compute_key_size_in_bits = ComputeKey::<N>::size_in_bits();
23
24 let (challenge_start, challenge_end) = (0, scalar_size_in_bits);
25 let (response_start, response_end) = (challenge_end, challenge_end + scalar_size_in_bits);
26 let (compute_key_start, compute_key_end) = (response_end, response_end + compute_key_size_in_bits);
27
28 let Some(challenge_bits) = bits_le.get(challenge_start..challenge_end) else {
29 bail!("Unable to recover the signature challenge from (LE) bits");
30 };
31 let Some(response_bits) = bits_le.get(response_start..response_end) else {
32 bail!("Unable to recover the signature response from (LE) bits");
33 };
34 let Some(compute_key_bits) = bits_le.get(compute_key_start..compute_key_end) else {
35 bail!("Unable to recover the signature compute key from (LE) bits");
36 };
37
38 Ok(Self {
39 challenge: Scalar::from_bits_le(challenge_bits)?,
40 response: Scalar::from_bits_le(response_bits)?,
41 compute_key: ComputeKey::from_bits_le(compute_key_bits)?,
42 })
43 }
44
45 fn from_bits_be(bits_be: &[bool]) -> Result<Self> {
47 let scalar_size_in_bits = Scalar::<N>::size_in_bits();
48 let compute_key_size_in_bits = ComputeKey::<N>::size_in_bits();
49
50 let (challenge_start, challenge_end) = (0, scalar_size_in_bits);
51 let (response_start, response_end) = (challenge_end, challenge_end + scalar_size_in_bits);
52 let (compute_key_start, compute_key_end) = (response_end, response_end + compute_key_size_in_bits);
53
54 let Some(challenge_bits) = bits_be.get(challenge_start..challenge_end) else {
55 bail!("Unable to recover the signature challenge from (BE) bits");
56 };
57 let Some(response_bits) = bits_be.get(response_start..response_end) else {
58 bail!("Unable to recover the signature response from (BE) bits");
59 };
60 let Some(compute_key_bits) = bits_be.get(compute_key_start..compute_key_end) else {
61 bail!("Unable to recover the signature compute key from (BE) bits");
62 };
63
64 Ok(Self {
65 challenge: Scalar::from_bits_be(challenge_bits)?,
66 response: Scalar::from_bits_be(response_bits)?,
67 compute_key: ComputeKey::from_bits_be(compute_key_bits)?,
68 })
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75 use snarkvm_console_network::MainnetV0;
76
77 type CurrentNetwork = MainnetV0;
78
79 const ITERATIONS: usize = 100;
80
81 fn check_from_bits_le() -> Result<()> {
82 let rng = &mut TestRng::default();
83
84 for i in 0..ITERATIONS {
85 let expected = test_helpers::sample_signature(i as u64, rng);
87
88 let given_bits = expected.to_bits_le();
89 assert_eq!(Signature::<CurrentNetwork>::size_in_bits(), given_bits.len());
90
91 let candidate = Signature::<CurrentNetwork>::from_bits_le(&given_bits)?;
92 assert_eq!(expected, candidate);
93
94 let candidate = [given_bits, vec![false; i]].concat();
96
97 let candidate = Signature::<CurrentNetwork>::from_bits_le(&candidate)?;
98 assert_eq!(expected, candidate);
99 assert_eq!(Signature::<CurrentNetwork>::size_in_bits(), candidate.to_bits_le().len());
100 }
101 Ok(())
102 }
103
104 fn check_from_bits_be() -> Result<()> {
105 let rng = &mut TestRng::default();
106
107 for i in 0..ITERATIONS {
108 let expected = test_helpers::sample_signature(i as u64, rng);
110
111 let given_bits = expected.to_bits_be();
112 assert_eq!(Signature::<CurrentNetwork>::size_in_bits(), given_bits.len());
113
114 let candidate = Signature::<CurrentNetwork>::from_bits_be(&given_bits)?;
115 assert_eq!(expected, candidate);
116
117 let candidate = [given_bits, vec![false; i]].concat();
119
120 let candidate = Signature::<CurrentNetwork>::from_bits_be(&candidate)?;
121 assert_eq!(expected, candidate);
122 assert_eq!(Signature::<CurrentNetwork>::size_in_bits(), candidate.to_bits_be().len());
123 }
124 Ok(())
125 }
126
127 #[test]
128 fn test_from_bits_le() -> Result<()> {
129 check_from_bits_le()
130 }
131
132 #[test]
133 fn test_from_bits_be() -> Result<()> {
134 check_from_bits_be()
135 }
136}