1#![doc = include_str!("../README.md")]
2#![cfg_attr(not(feature = "std"), no_std)]
7#![warn(missing_docs)]
8#![warn(clippy::use_self)]
9
10#[cfg(not(feature = "std"))]
11extern crate alloc;
12
13#[cfg(not(feature = "std"))]
14use alloc::vec::Vec;
15use core::{any::type_name, fmt, marker::PhantomData};
16
17use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
18use serde::{
19 Deserializer, Serializer,
20 de::{self, Visitor},
21 ser::Error as _,
22};
23
24pub mod compressed {
26 use super::*;
27
28 struct ByteVisitor<T>(PhantomData<T>);
29
30 impl<T> Visitor<'_> for ByteVisitor<T>
31 where
32 T: CanonicalDeserialize,
33 {
34 type Value = T;
35
36 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
37 write!(formatter, "{}", type_name::<T>())
38 }
39
40 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
41 where
42 E: de::Error,
43 {
44 T::deserialize_compressed(v)
45 .map_err(|_| de::Error::invalid_value(de::Unexpected::Bytes(v), &self))
46 }
47 }
48
49 pub fn serialize<V, S>(value: &V, ser: S) -> Result<S::Ok, S::Error>
51 where
52 V: CanonicalSerialize,
53 S: Serializer,
54 {
55 let mut dst = Vec::new();
56 value
57 .serialize_compressed(&mut dst)
58 .map_err(|_| S::Error::custom("serialize_compressed failed"))?;
59 ser.serialize_bytes(&dst)
60 }
61
62 pub fn deserialize<'de, V, D>(de: D) -> Result<V, D::Error>
64 where
65 V: CanonicalDeserialize,
66 D: Deserializer<'de>,
67 {
68 de.deserialize_bytes(ByteVisitor(PhantomData))
69 }
70}
71
72pub mod uncompressed {
74 use super::*;
75
76 struct ByteVisitor<T>(PhantomData<T>);
77
78 impl<T> Visitor<'_> for ByteVisitor<T>
79 where
80 T: CanonicalDeserialize,
81 {
82 type Value = T;
83
84 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
85 write!(formatter, "{}", type_name::<T>())
86 }
87
88 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
89 where
90 E: de::Error,
91 {
92 T::deserialize_uncompressed(v)
93 .map_err(|_| de::Error::invalid_value(de::Unexpected::Bytes(v), &self))
94 }
95 }
96
97 pub fn serialize<V, S>(value: &V, ser: S) -> Result<S::Ok, S::Error>
99 where
100 V: CanonicalSerialize,
101 S: Serializer,
102 {
103 let mut dst = Vec::new();
104 value
105 .serialize_uncompressed(&mut dst)
106 .map_err(|_| S::Error::custom("serialize_uncompressed failed"))?;
107 ser.serialize_bytes(&dst)
108 }
109
110 pub fn deserialize<'de, V, D>(de: D) -> Result<V, D::Error>
112 where
113 V: CanonicalDeserialize,
114 D: Deserializer<'de>,
115 {
116 de.deserialize_bytes(ByteVisitor(PhantomData))
117 }
118}
119
120#[cfg(feature = "std")]
121pub mod vec {
123 use super::*;
124
125 use serde::{Deserialize, Serialize};
126
127 #[derive(Serialize, Deserialize)]
128 struct Wrapper<T>(#[serde(with = "compressed")] T)
129 where
130 T: CanonicalSerialize + CanonicalDeserialize;
131
132 pub fn serialize<T, S>(value: &[T], ser: S) -> Result<S::Ok, S::Error>
134 where
135 T: CanonicalSerialize + CanonicalDeserialize + Copy,
136 S: Serializer,
137 {
138 let tmp: Vec<_> = value.iter().map(|v| Wrapper(*v)).collect();
139 tmp.serialize(ser)
140 }
141
142 pub fn deserialize<'de, T, D>(de: D) -> Result<Vec<T>, D::Error>
144 where
145 T: CanonicalSerialize + CanonicalDeserialize,
146 D: Deserializer<'de>,
147 {
148 Vec::<Wrapper<T>>::deserialize(de).map(|w| w.into_iter().map(|w| w.0).collect())
149 }
150}
151
152pub use compressed::{deserialize, serialize};
153
154#[cfg(test)]
155mod test {
156 use super::*;
157
158 use fmt::Debug;
159
160 use ark_bls12_381::Bls12_381;
161 use ark_ec::pairing::{Pairing, PairingOutput};
162 use ark_ff::UniformRand;
163 use bincode::config;
164 use serde::{Deserialize, Serialize};
165
166 type G1Affine = <Bls12_381 as Pairing>::G1Affine;
167 type G1Projective = <Bls12_381 as Pairing>::G1;
168 type G2Affine = <Bls12_381 as Pairing>::G2Affine;
169 type G2Projective = <Bls12_381 as Pairing>::G2;
170 type Gt = PairingOutput<Bls12_381>;
171 type Scalar = <Bls12_381 as Pairing>::ScalarField;
172
173 #[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
174 struct Wrapper<T>(#[serde(with = "super")] T)
175 where
176 T: CanonicalSerialize + CanonicalDeserialize + Eq + PartialEq + Debug;
177
178 #[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
179 struct UncommpressedWrapper<T>(#[serde(with = "uncompressed")] T)
180 where
181 T: CanonicalSerialize + CanonicalDeserialize + Eq + PartialEq + Debug;
182
183 #[test]
184 fn g1() {
185 let mut rng = rand::thread_rng();
186 let v = Wrapper(G1Affine::rand(&mut rng));
187
188 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
189 let (v_deserialized, len) =
190 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
191 assert_eq!(v, v_deserialized);
192 assert_eq!(bin.len(), len);
193 }
194
195 #[test]
196 fn uncompressed_g1() {
197 let mut rng = rand::thread_rng();
198 let v = UncommpressedWrapper(G1Affine::rand(&mut rng));
199
200 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
201 let (v_deserialized, len) =
202 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
203 assert_eq!(v, v_deserialized);
204 assert_eq!(bin.len(), len);
205 }
206
207 #[test]
208 fn g1_projective() {
209 let mut rng = rand::thread_rng();
210 let v = Wrapper(G1Affine::rand(&mut rng));
211
212 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
213 let (v_deserialized, len) =
214 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
215 assert_eq!(v, v_deserialized);
216 assert_eq!(bin.len(), len);
217 }
218
219 #[test]
220 fn uncompressed_g1_projective() {
221 let mut rng = rand::thread_rng();
222 let v = UncommpressedWrapper(G1Projective::rand(&mut rng));
223
224 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
225 let (v_deserialized, len) =
226 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
227 assert_eq!(v, v_deserialized);
228 assert_eq!(bin.len(), len);
229 }
230
231 #[test]
232 fn g2() {
233 let mut rng = rand::thread_rng();
234 let v = Wrapper(G2Affine::rand(&mut rng));
235
236 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
237 let (v_deserialized, len) =
238 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
239 assert_eq!(v, v_deserialized);
240 assert_eq!(bin.len(), len);
241 }
242
243 #[test]
244 fn uncompressed_g2() {
245 let mut rng = rand::thread_rng();
246 let v = UncommpressedWrapper(G2Affine::rand(&mut rng));
247
248 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
249 let (v_deserialized, len) =
250 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
251 assert_eq!(v, v_deserialized);
252 assert_eq!(bin.len(), len);
253 }
254
255 #[test]
256 fn g2_projective() {
257 let mut rng = rand::thread_rng();
258 let v = Wrapper(G2Projective::rand(&mut rng));
259
260 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
261 let (v_deserialized, len) =
262 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
263 assert_eq!(v, v_deserialized);
264 assert_eq!(bin.len(), len);
265 }
266
267 #[test]
268 fn uncompressed_g2_projective() {
269 let mut rng = rand::thread_rng();
270 let v = UncommpressedWrapper(G2Projective::rand(&mut rng));
271
272 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
273 let (v_deserialized, len) =
274 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
275 assert_eq!(v, v_deserialized);
276 assert_eq!(bin.len(), len);
277 }
278
279 #[test]
280 fn gt() {
281 let mut rng = rand::thread_rng();
282 let v = Wrapper(Gt::rand(&mut rng));
283
284 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
285 let (v_deserialized, len) =
286 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
287 assert_eq!(v, v_deserialized);
288 assert_eq!(bin.len(), len);
289 }
290
291 #[test]
292 fn uncompressed_gt() {
293 let mut rng = rand::thread_rng();
294 let v = UncommpressedWrapper(Gt::rand(&mut rng));
295
296 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
297 let (v_deserialized, len) =
298 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
299 assert_eq!(v, v_deserialized);
300 assert_eq!(bin.len(), len);
301 }
302
303 #[test]
304 fn scalar() {
305 let mut rng = rand::thread_rng();
306 let v = Wrapper(Scalar::rand(&mut rng));
307 let v_uncompressed = UncommpressedWrapper(v.0);
308
309 let bin = bincode::serde::encode_to_vec(&v, config::standard()).unwrap();
310 assert_eq!(
311 bin,
312 bincode::serde::encode_to_vec(&v_uncompressed, config::standard()).unwrap()
313 );
314
315 let (v_deserialized, len) =
316 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
317 assert_eq!(v, v_deserialized);
318 assert_eq!(bin.len(), len);
319
320 let (v_deserialized, len) =
321 bincode::serde::decode_from_slice(&bin, config::standard()).unwrap();
322 assert_eq!(v_uncompressed, v_deserialized);
323 assert_eq!(bin.len(), len);
324 }
325}