Impl ZcashDeserialize for jubjub::Fq, use in transaction deserialization

This commit is contained in:
Deirdre Connolly 2020-08-13 22:16:03 -04:00 committed by Deirdre Connolly
parent 1255cec6a4
commit a2c9011e06
1 changed files with 15 additions and 1 deletions

View File

@ -33,6 +33,20 @@ const GENESIS_COINBASE_DATA: [u8; 77] = [
54, 52, 56, 51, 53, 100, 51, 52,
];
impl ZcashDeserialize for jubjub::Fq {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
let possible_scalar = jubjub::Fq::from_bytes(&reader.read_32_bytes()?);
if possible_scalar.is_some().into() {
Ok(possible_scalar.unwrap())
} else {
Err(SerializationError::Parse(
"Invalid jubjub::Fq, input not canonical",
))
}
}
}
impl ZcashSerialize for OutPoint {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&self.hash.0[..])?;
@ -364,7 +378,7 @@ impl ZcashDeserialize for Output {
fn zcash_deserialize<R: io::Read>(mut reader: R) -> Result<Self, SerializationError> {
Ok(Output {
cv: commitments::sapling::ValueCommitment::zcash_deserialize(&mut reader)?,
cm_u: jubjub::Fq::from_bytes(&reader.read_32_bytes()?).unwrap(),
cm_u: jubjub::Fq::zcash_deserialize(&mut reader)?,
ephemeral_key: keys::sapling::EphemeralPublicKey::zcash_deserialize(&mut reader)?,
enc_ciphertext: notes::sapling::EncryptedCiphertext::zcash_deserialize(&mut reader)?,
out_ciphertext: notes::sapling::OutCiphertext::zcash_deserialize(&mut reader)?,