1pub use self::field_vec::FieldWrap;
4
5use std::borrow::Cow;
6use std::ops::Deref;
7
8use bls12_381::G1Projective;
9use serde::de::Error as DeserializeError;
10use serde::{Deserialize, Deserializer, Serialize, Serializer};
11
12use crate::poly::{coeff_pos, BivarCommitment};
13use crate::serde_impl::serialize_secret_internal::SerializeSecret;
14
15const ERR_DEG: &str = "commitment degree does not match coefficients";
16
17#[doc(hidden)]
18mod serialize_secret_internal {
19 use serde::Serializer;
20
21 pub trait SerializeSecret {
25 fn serialize_secret<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
26 }
27
28 impl<T: SerializeSecret> SerializeSecret for &T {
29 fn serialize_secret<S: Serializer>(
30 &self,
31 serializer: S,
32 ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> {
33 (*self).serialize_secret(serializer)
34 }
35 }
36}
37
38#[derive(Debug, Eq, PartialEq, Clone)]
43pub struct SerdeSecret<T>(pub T);
44
45impl<T> Deref for SerdeSecret<T> {
46 type Target = T;
47
48 fn deref(&self) -> &Self::Target {
49 self.inner()
50 }
51}
52
53impl<T> SerdeSecret<T> {
54 pub fn into_inner(self) -> T {
56 self.0
57 }
58
59 pub fn inner(&self) -> &T {
61 &self.0
62 }
63}
64
65impl<'de, T: Deserialize<'de>> Deserialize<'de> for SerdeSecret<T> {
66 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
67 where
68 D: Deserializer<'de>,
69 {
70 Ok(SerdeSecret(Deserialize::deserialize(deserializer)?))
71 }
72}
73
74impl<T: SerializeSecret> Serialize for SerdeSecret<T> {
75 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
76 where
77 S: Serializer,
78 {
79 self.0.serialize_secret(serializer)
80 }
81}
82
83impl<'de> Deserialize<'de> for crate::SecretKey {
84 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
85 where
86 D: Deserializer<'de>,
87 {
88 use crate::Scalar;
89 use serde::de;
90
91 let bytes: [u8; 32] = Deserialize::deserialize(deserializer)?;
92 match Option::from(Scalar::from_bytes(&bytes)) {
93 None => Err(de::Error::invalid_value(
94 de::Unexpected::Other("Invalid scalar value"),
95 &"Valid scalar value",
96 )),
97 Some(s) => Ok(crate::SecretKey(s)),
98 }
99 }
100}
101
102impl SerializeSecret for crate::SecretKey {
103 fn serialize_secret<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
104 use ff::PrimeField;
105
106 Serialize::serialize(&self.0.to_repr(), serializer)
107 }
108}
109
110impl<'de> Deserialize<'de> for crate::SecretKeyShare {
111 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
112 where
113 D: Deserializer<'de>,
114 {
115 let inner: crate::SecretKey = Deserialize::deserialize(deserializer)?;
116 Ok(crate::SecretKeyShare(inner))
117 }
118}
119
120impl SerializeSecret for crate::SecretKeyShare {
121 fn serialize_secret<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
122 self.0.serialize_secret(serializer)
123 }
124}
125
126#[derive(Serialize, Deserialize)]
128struct WireBivarCommitment<'a> {
129 degree: usize,
131 #[serde(with = "projective_vec")]
133 coeff: Cow<'a, [G1Projective]>,
134}
135
136impl Serialize for BivarCommitment {
137 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
138 WireBivarCommitment {
139 degree: self.degree,
140 coeff: Cow::Borrowed(&self.coeff),
141 }
142 .serialize(s)
143 }
144}
145
146impl<'de> Deserialize<'de> for BivarCommitment {
147 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
148 let WireBivarCommitment { degree, coeff } = Deserialize::deserialize(d)?;
149 if coeff_pos(degree, degree).and_then(|l| l.checked_add(1)) != Some(coeff.len()) {
150 return Err(D::Error::custom(ERR_DEG));
151 }
152 Ok(BivarCommitment {
153 degree,
154 coeff: coeff.into(),
155 })
156 }
157}
158
159pub(crate) mod projective {
161 use std::fmt;
162 use std::marker::PhantomData;
163
164 use group::prime::{PrimeCurve, PrimeCurveAffine};
165 use group::GroupEncoding;
166 use serde::de::{Error as DeserializeError, SeqAccess, Visitor};
167 use serde::{ser::SerializeTuple, Deserializer, Serializer};
168
169 const ERR_CODE: &str = "deserialized bytes don't encode a group element";
170
171 pub fn serialize<S, C>(c: &C, s: S) -> Result<S::Ok, S::Error>
172 where
173 S: Serializer,
174 C: PrimeCurve,
175 {
176 let bytes = c.to_affine().to_bytes();
177 let len = bytes.as_ref().len();
178 let mut tup = s.serialize_tuple(len)?;
179 for byte in bytes.as_ref() {
180 tup.serialize_element(byte)?;
181 }
182 tup.end()
183 }
184
185 pub fn deserialize<'de, D, C>(d: D) -> Result<C, D::Error>
186 where
187 D: Deserializer<'de>,
188 C: PrimeCurve,
189 {
190 struct TupleVisitor<C> {
191 _ph: PhantomData<C>,
192 }
193
194 impl<'de, C: PrimeCurve> Visitor<'de> for TupleVisitor<C> {
195 type Value = C;
196
197 fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
198 let len = <C::Affine as GroupEncoding>::Repr::default().as_ref().len();
199 write!(f, "a tuple of size {}", len)
200 }
201
202 #[inline]
203 fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<C, A::Error> {
204 let mut compressed = <C::Affine as GroupEncoding>::Repr::default();
205 for (i, byte) in compressed.as_mut().iter_mut().enumerate() {
206 let len_err = || DeserializeError::invalid_length(i, &self);
207 *byte = seq.next_element()?.ok_or_else(len_err)?;
208 }
209
210 let option = <C::Affine as GroupEncoding>::from_bytes(&compressed);
211 if option.is_some().into() {
212 let affine: C::Affine = option.unwrap();
213 Ok(affine.to_curve())
214 } else {
215 Err(DeserializeError::custom(ERR_CODE))
216 }
217 }
218 }
219
220 let len = <C::Affine as GroupEncoding>::Repr::default().as_ref().len();
221 d.deserialize_tuple(len, TupleVisitor { _ph: PhantomData })
222 }
223}
224
225pub(crate) mod projective_vec {
227 use std::borrow::Borrow;
228 use std::iter::FromIterator;
229 use std::marker::PhantomData;
230
231 use group::prime::PrimeCurve;
232 use serde::{Deserialize, Deserializer, Serialize, Serializer};
233
234 use super::projective;
235
236 struct CurveWrap<C, B>(B, PhantomData<C>);
238
239 impl<C, B> CurveWrap<C, B> {
240 fn new(c: B) -> Self {
241 CurveWrap(c, PhantomData)
242 }
243 }
244
245 impl<C: PrimeCurve, B: Borrow<C>> Serialize for CurveWrap<C, B> {
246 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
247 projective::serialize(self.0.borrow(), s)
248 }
249 }
250
251 impl<'de, C: PrimeCurve> Deserialize<'de> for CurveWrap<C, C> {
252 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
253 Ok(CurveWrap::new(projective::deserialize(d)?))
254 }
255 }
256
257 pub fn serialize<S, C, T>(vec: T, s: S) -> Result<S::Ok, S::Error>
258 where
259 S: Serializer,
260 C: PrimeCurve,
261 T: AsRef<[C]>,
262 {
263 let wrap_vec: Vec<CurveWrap<C, &C>> = vec.as_ref().iter().map(CurveWrap::new).collect();
264 wrap_vec.serialize(s)
265 }
266
267 pub fn deserialize<'de, D, C, T>(d: D) -> Result<T, D::Error>
268 where
269 D: Deserializer<'de>,
270 C: PrimeCurve,
271 T: FromIterator<C>,
272 {
273 let wrap_vec = <Vec<CurveWrap<C, C>>>::deserialize(d)?;
274 Ok(wrap_vec.into_iter().map(|CurveWrap(c, _)| c).collect())
275 }
276}
277
278pub(crate) mod field_vec {
280 use std::borrow::Borrow;
281
282 use bls12_381::Scalar;
283 use ff::PrimeField;
284 use serde::de::Error as DeserializeError;
285 use serde::{Deserialize, Deserializer, Serialize, Serializer};
286
287 pub struct FieldWrap<B>(pub B);
289
290 impl FieldWrap<Scalar> {
291 pub fn into_inner(self) -> Scalar {
293 self.0
294 }
295 }
296
297 impl<B: Borrow<Scalar>> Serialize for FieldWrap<B> {
298 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
299 self.0.borrow().to_repr().serialize(s)
300 }
301 }
302
303 impl<'de> Deserialize<'de> for FieldWrap<Scalar> {
304 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
305 let s = Scalar::from_repr(Deserialize::deserialize(d)?);
306
307 if s.is_none().into() {
308 return Err(D::Error::custom("invalid field element representation"));
309 }
310
311 Ok(FieldWrap(s.unwrap()))
312 }
313 }
314
315 pub fn serialize<S: Serializer>(vec: &[Scalar], s: S) -> Result<S::Ok, S::Error> {
316 let wrap_vec: Vec<FieldWrap<&Scalar>> = vec.iter().map(FieldWrap).collect();
317 wrap_vec.serialize(s)
318 }
319
320 pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Vec<Scalar>, D::Error> {
321 let wrap_vec = <Vec<FieldWrap<Scalar>>>::deserialize(d)?;
322 Ok(wrap_vec.into_iter().map(FieldWrap::into_inner).collect())
323 }
324}
325
326#[cfg(test)]
327mod tests {
328
329 #[test]
330 #[cfg(feature = "bincode")]
331 fn vecs() {
332 use crate::G1Projective;
333 use bls12_381::Scalar;
334 use ff::Field;
335 use group::Group;
336 use serde::{Deserialize, Serialize};
337 use std::iter::repeat_with;
338
339 #[derive(Debug, Serialize, Deserialize)]
340 pub struct Vecs {
341 #[serde(with = "super::projective_vec")]
342 curve_points: Vec<G1Projective>,
343 #[serde(with = "super::field_vec")]
344 field_elements: Vec<Scalar>,
345 }
346
347 impl PartialEq for Vecs {
348 fn eq(&self, other: &Self) -> bool {
349 self.curve_points == other.curve_points
350 && self.field_elements == other.field_elements
351 }
352 }
353
354 let mut rng = rand::thread_rng();
355 let vecs = Vecs {
356 curve_points: repeat_with(|| G1Projective::random(&mut rng))
357 .take(10)
358 .collect(),
359 field_elements: repeat_with(|| Scalar::random(&mut rng)).take(10).collect(),
360 };
361 let ser_vecs = bincode::serde::encode_to_vec(&vecs, bincode::config::legacy())
362 .expect("serialize vecs");
363 let (de_vecs, _) = bincode::serde::decode_from_slice(&ser_vecs, bincode::config::legacy())
364 .expect("deserialize vecs");
365 assert_eq!(vecs, de_vecs);
366 }
367
368 #[test]
369 #[cfg(feature = "bincode")]
370 fn bivar_commitment() {
371 use crate::poly::BivarPoly;
372
373 let mut rng = rand::thread_rng();
374 for deg in 1..8 {
375 let poly = BivarPoly::random(deg, &mut rng);
376 let comm = poly.commitment();
377 let ser_comm = bincode::serde::encode_to_vec(&comm, bincode::config::legacy())
378 .expect("serialize commitment");
379 let (de_comm, _) =
380 bincode::serde::decode_from_slice(&ser_comm, bincode::config::legacy())
381 .expect("deserialize commitment");
382 assert_eq!(comm, de_comm);
383 }
384 }
385
386 #[test]
387 #[cfg(feature = "bincode")]
388 fn serde_secret_key() {
389 use crate::serde_impl::SerdeSecret;
390 use crate::SecretKey;
391 use rand::{thread_rng, Rng};
392
393 let mut rng = thread_rng();
394 for _ in 0..2048 {
395 let sk: SecretKey = rng.gen();
396 let ser_ref =
397 bincode::serde::encode_to_vec(SerdeSecret(&sk), bincode::config::legacy())
398 .expect("serialize secret key");
399
400 let (de, _) = bincode::serde::decode_from_slice(&ser_ref, bincode::config::legacy())
401 .expect("deserialize secret key");
402 assert_eq!(sk, de);
403
404 let (de_serde_secret, _): (SerdeSecret<SecretKey>, _) =
405 bincode::serde::decode_from_slice(&ser_ref, bincode::config::legacy())
406 .expect("deserialize secret key");
407 assert_eq!(sk, de_serde_secret.into_inner());
408
409 let ser_val = bincode::serde::encode_to_vec(SerdeSecret(sk), bincode::config::legacy())
410 .expect("serialize secret key");
411 assert_eq!(ser_ref, ser_val);
412 }
413 }
414
415 #[test]
416 #[cfg(feature = "bincode")]
417 fn serde_secret_key_share() {
418 use crate::serde_impl::SerdeSecret;
419 use crate::SecretKeyShare;
420 use rand::{thread_rng, Rng};
421
422 let mut rng = thread_rng();
423 for _ in 0..2048 {
424 let sk: SecretKeyShare = rng.gen();
425 let ser_ref =
426 bincode::serde::encode_to_vec(SerdeSecret(&sk), bincode::config::legacy())
427 .expect("serialize secret key");
428
429 let (de, _) = bincode::serde::decode_from_slice(&ser_ref, bincode::config::legacy())
430 .expect("deserialize secret key");
431 assert_eq!(sk, de);
432
433 let (de_serde_secret, _): (SerdeSecret<SecretKeyShare>, _) =
434 bincode::serde::decode_from_slice(&ser_ref, bincode::config::legacy())
435 .expect("deserialize secret key");
436 assert_eq!(sk, de_serde_secret.into_inner());
437
438 let ser_val = bincode::serde::encode_to_vec(SerdeSecret(sk), bincode::config::legacy())
439 .expect("serialize secret key");
440 assert_eq!(ser_ref, ser_val);
441 assert_eq!(ser_val.len(), 32);
442 }
443 }
444}