zebra_chain/transparent/
keys.rs

1//! Transparent key trait impls, around secp256k1::PublicKey
2//!
3//! We don't impl Arbitrary for PublicKey since it's being pulled in
4//! from secp256k1 and we don't want to wrap it.
5
6use std::io;
7
8use secp256k1::PublicKey;
9
10use crate::serialization::{SerializationError, ZcashDeserialize, ZcashSerialize};
11
12impl ZcashSerialize for PublicKey {
13    fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
14        writer.write_all(&self.serialize())?;
15        Ok(())
16    }
17}
18
19impl ZcashDeserialize for PublicKey {
20    fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
21        let mut bytes = [0; 33];
22        reader.read_exact(&mut bytes[..])?;
23        Self::from_slice(&bytes[..])
24            .map_err(|_| SerializationError::Parse("invalid secp256k1 compressed public key"))
25    }
26}