mithril_stm/signature_scheme/unique_schnorr_signature/jubjub/
mod.rs

1mod curve_points;
2mod field_elements;
3mod poseidon_digest;
4
5pub(crate) use curve_points::*;
6pub use field_elements::BaseFieldElement;
7pub(crate) use field_elements::ScalarFieldElement;
8pub(crate) use poseidon_digest::DST_SIGNATURE;
9pub(crate) use poseidon_digest::*;
10
11use serde::{
12    de::Visitor,
13    {Deserialize, Deserializer, Serialize, Serializer},
14};
15
16// ---------------------------------------------------------------------
17// Serde implementation
18// ---------------------------------------------------------------------
19
20macro_rules! impl_serde {
21    ($st:ty,$visitor:ident,$size:expr) => {
22        impl Serialize for $st {
23            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
24            where
25                S: Serializer,
26            {
27                use serde::ser::SerializeTuple;
28                let mut seq = serializer.serialize_tuple($size)?;
29                for e in self.to_bytes().iter() {
30                    seq.serialize_element(e)?;
31                }
32                seq.end()
33            }
34        }
35
36        impl<'de> Deserialize<'de> for $st {
37            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38            where
39                D: Deserializer<'de>,
40            {
41                struct $visitor;
42
43                impl<'de> Visitor<'de> for $visitor {
44                    type Value = $st;
45
46                    fn expecting(
47                        &self,
48                        formatter: &mut ::core::fmt::Formatter,
49                    ) -> ::core::fmt::Result {
50                        formatter.write_str(format!("a signature {}", stringify!($st)).as_str())
51                    }
52
53                    fn visit_seq<A>(self, mut seq: A) -> Result<$st, A::Error>
54                    where
55                        A: serde::de::SeqAccess<'de>,
56                    {
57                        let mut bytes = [0u8; $size];
58                        for i in 0..$size {
59                            bytes[i] =
60                                seq.next_element()?.ok_or(serde::de::Error::invalid_length(
61                                    i,
62                                    &format!("expected bytes{}", $size.to_string()).as_str(),
63                                ))?;
64                        }
65                        <$st>::from_bytes(&bytes).map_err(|_| {
66                            serde::de::Error::custom(
67                                &format!("deserialization failed [{}]", stringify!($st)).as_str(),
68                            )
69                        })
70                    }
71                }
72
73                deserializer.deserialize_tuple($size, $visitor)
74            }
75        }
76    };
77}
78impl_serde!(ScalarFieldElement, ScalarFieldElementVisitor, 32);
79impl_serde!(BaseFieldElement, BaseFieldElementVisitor, 32);
80impl_serde!(
81    PrimeOrderProjectivePoint,
82    PrimeOrderProjectivePointVisitor,
83    32
84);
85impl_serde!(ProjectivePoint, ProjectivePointVisitor, 32);