mithril_stm/signature_scheme/unique_schnorr_signature/jubjub/
mod.rs1mod 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
16macro_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);