1use crate::poly::Polynomial;
2use ff::PrimeField;
3use halo2curves::{serde::SerdeObject, CurveAffine};
4use std::io;
5
6#[derive(Clone, Copy, Debug)]
8pub enum SerdeFormat {
9 Processed,
13 RawBytes,
18 RawBytesUnchecked,
20}
21
22pub(crate) trait CurveRead: CurveAffine {
24 fn read<R: io::Read>(reader: &mut R) -> io::Result<Self> {
27 let mut compressed = Self::Repr::default();
28 reader.read_exact(compressed.as_mut())?;
29 Option::from(Self::from_bytes(&compressed))
30 .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "Invalid point encoding in proof"))
31 }
32}
33impl<C: CurveAffine> CurveRead for C {}
34
35pub trait SerdeCurveAffine: CurveAffine + SerdeObject {
36 fn read<R: io::Read>(reader: &mut R, format: SerdeFormat) -> io::Result<Self> {
43 match format {
44 SerdeFormat::Processed => <Self as CurveRead>::read(reader),
45 SerdeFormat::RawBytes => <Self as SerdeObject>::read_raw(reader),
46 SerdeFormat::RawBytesUnchecked => Ok(<Self as SerdeObject>::read_raw_unchecked(reader)),
47 }
48 }
49 fn write<W: io::Write>(&self, writer: &mut W, format: SerdeFormat) -> io::Result<()> {
53 match format {
54 SerdeFormat::Processed => writer.write_all(self.to_bytes().as_ref()),
55 _ => self.write_raw(writer),
56 }
57 }
58}
59impl<C: CurveAffine + SerdeObject> SerdeCurveAffine for C {}
60
61pub trait SerdePrimeField: PrimeField + SerdeObject {
62 fn read<R: io::Read>(reader: &mut R, format: SerdeFormat) -> io::Result<Self> {
69 match format {
70 SerdeFormat::Processed => {
71 let mut compressed = Self::Repr::default();
72 reader.read_exact(compressed.as_mut()).unwrap();
73 Option::from(Self::from_repr(compressed)).ok_or_else(|| {
74 io::Error::new(io::ErrorKind::Other, "Invalid prime field point encoding")
75 })
76 }
77 SerdeFormat::RawBytes => <Self as SerdeObject>::read_raw(reader),
78 SerdeFormat::RawBytesUnchecked => Ok(<Self as SerdeObject>::read_raw_unchecked(reader)),
79 }
80 }
81
82 fn write<W: io::Write>(&self, writer: &mut W, format: SerdeFormat) -> io::Result<()> {
88 match format {
89 SerdeFormat::Processed => writer.write_all(self.to_repr().as_ref()),
90 _ => self.write_raw(writer),
91 }
92 }
93}
94impl<F: PrimeField + SerdeObject> SerdePrimeField for F {}
95
96pub fn pack(bits: &[bool]) -> u8 {
100 let mut value = 0u8;
101 assert!(bits.len() <= 8);
102 for (bit_index, bit) in bits.iter().enumerate() {
103 value |= (*bit as u8) << bit_index;
104 }
105 value
106}
107
108pub fn unpack(byte: u8, bits: &mut [bool]) {
110 for (bit_index, bit) in bits.iter_mut().enumerate() {
111 *bit = (byte >> bit_index) & 1 == 1;
112 }
113}
114
115pub(crate) fn read_polynomial_vec<R: io::Read, F: SerdePrimeField, B>(
117 reader: &mut R,
118 format: SerdeFormat,
119) -> Vec<Polynomial<F, B>> {
120 let mut len = [0u8; 4];
121 reader.read_exact(&mut len).unwrap();
122 let len = u32::from_be_bytes(len);
123
124 (0..len)
125 .map(|_| Polynomial::<F, B>::read(reader, format))
126 .collect()
127}
128
129pub(crate) fn write_polynomial_slice<W: io::Write, F: SerdePrimeField, B>(
131 slice: &[Polynomial<F, B>],
132 writer: &mut W,
133 format: SerdeFormat,
134) {
135 writer
136 .write_all(&(slice.len() as u32).to_be_bytes())
137 .unwrap();
138 for poly in slice.iter() {
139 poly.write(writer, format);
140 }
141}
142
143pub(crate) fn polynomial_slice_byte_length<F: PrimeField, B>(slice: &[Polynomial<F, B>]) -> usize {
145 let field_len = F::default().to_repr().as_ref().len();
146 4 + slice.len() * (4 + field_len * slice.get(0).map(|poly| poly.len()).unwrap_or(0))
147}