use super::*;
impl<N: Network> FromBytes for Ciphertext<N> {
#[inline]
fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
let num_fields = u16::read_le(&mut reader)?;
match num_fields as u32 <= N::MAX_DATA_SIZE_IN_FIELDS {
true => {
Ok(Ciphertext((0..num_fields).map(|_| Field::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?))
}
false => Err(error("Ciphertext is too large to encode in field elements.")),
}
}
}
impl<N: Network> ToBytes for Ciphertext<N> {
#[inline]
fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
if u32::try_from(self.0.len()).or_halt::<N>() > N::MAX_DATA_SIZE_IN_FIELDS || self.0.len() > u16::MAX as usize {
return Err(error("Ciphertext is too large to encode in field elements."));
}
u16::try_from(self.0.len()).or_halt::<N>().write_le(&mut writer)?;
self.0.write_le(&mut writer)
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network::MainnetV0;
type CurrentNetwork = MainnetV0;
const ITERATIONS: u32 = 1000;
#[test]
fn test_bytes() -> Result<()> {
let mut rng = TestRng::default();
for _ in 0..ITERATIONS {
let expected = Ciphertext::<CurrentNetwork>((0..100).map(|_| Uniform::rand(&mut rng)).collect::<Vec<_>>());
let expected_bytes = expected.to_bytes_le()?;
assert_eq!(expected, Ciphertext::read_le(&expected_bytes[..])?);
}
Ok(())
}
}