Skip to content

Commit

Permalink
Refine type for MAC (#577)
Browse files Browse the repository at this point in the history
  • Loading branch information
yaahc committed Jul 2, 2020
1 parent 7f1bc8d commit c216f5c
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 19 deletions.
4 changes: 1 addition & 3 deletions zebra-chain/src/transaction/joinsplit.rs
Expand Up @@ -34,9 +34,7 @@ pub struct JoinSplit<P: ZkSnarkProof> {
/// JoinSplit description.
pub random_seed: [u8; 32],
/// A message authentication tag.
///
/// XXX refine type to [T; 2] -- there are two macs
pub vmacs: [[u8; 32]; 2],
pub vmacs: [crate::types::MAC; 2],
/// A ZK JoinSplit proof, either a
/// [`Groth16Proof`](crate::proofs::Groth16Proof) or a
/// [`Bctv14Proof`](crate::proofs::Bctv14Proof).
Expand Down
9 changes: 6 additions & 3 deletions zebra-chain/src/transaction/serialize.rs
Expand Up @@ -242,8 +242,8 @@ impl<P: ZkSnarkProof> ZcashSerialize for JoinSplit<P> {
writer.write_all(&self.commitments[1][..])?;
writer.write_all(&self.ephemeral_key.as_bytes()[..])?;
writer.write_all(&self.random_seed[..])?;
writer.write_all(&self.vmacs[0][..])?;
writer.write_all(&self.vmacs[1][..])?;
self.vmacs[0].zcash_serialize(&mut writer)?;
self.vmacs[1].zcash_serialize(&mut writer)?;
self.zkproof.zcash_serialize(&mut writer)?;
self.enc_ciphertexts[0].zcash_serialize(&mut writer)?;
self.enc_ciphertexts[1].zcash_serialize(&mut writer)?;
Expand All @@ -261,7 +261,10 @@ impl<P: ZkSnarkProof> ZcashDeserialize for JoinSplit<P> {
commitments: [reader.read_32_bytes()?, reader.read_32_bytes()?],
ephemeral_key: x25519_dalek::PublicKey::from(reader.read_32_bytes()?),
random_seed: reader.read_32_bytes()?,
vmacs: [reader.read_32_bytes()?, reader.read_32_bytes()?],
vmacs: [
crate::types::MAC::zcash_deserialize(&mut reader)?,
crate::types::MAC::zcash_deserialize(&mut reader)?,
],
zkproof: P::zcash_deserialize(&mut reader)?,
enc_ciphertexts: [
notes::sprout::EncryptedCiphertext::zcash_deserialize(&mut reader)?,
Expand Down
2 changes: 1 addition & 1 deletion zebra-chain/src/transaction/tests/arbitrary.rs
Expand Up @@ -26,7 +26,7 @@ impl<P: ZkSnarkProof + Arbitrary + 'static> Arbitrary for JoinSplit<P> {
array::uniform2(array::uniform32(any::<u8>())),
array::uniform32(any::<u8>()),
array::uniform32(any::<u8>()),
array::uniform2(array::uniform32(any::<u8>())),
array::uniform2(any::<crate::types::MAC>()),
any::<P>(),
array::uniform2(any::<sprout::EncryptedCiphertext>()),
)
Expand Down
40 changes: 28 additions & 12 deletions zebra-chain/src/types.rs
@@ -1,18 +1,13 @@
//! Newtype wrappers for primitive data types with semantic meaning.

use std::{
fmt,
io::{self, Read},
#![allow(clippy::unit_arg)]
use crate::serialization::{
ReadZcashExt, SerializationError, WriteZcashExt, ZcashDeserialize, ZcashSerialize,
};

use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use chrono::{DateTime, TimeZone, Utc};

#[cfg(test)]
use proptest_derive::Arbitrary;

use crate::serialization::{
ReadZcashExt, SerializationError, WriteZcashExt, ZcashDeserialize, ZcashSerialize,
use std::{
fmt,
io::{self, Read},
};

pub mod amount;
Expand Down Expand Up @@ -93,9 +88,30 @@ impl Arbitrary for LockTime {
type Strategy = BoxedStrategy<Self>;
}

/// A sequence of message authentication tags ...
///
/// binding h_sig to each a_sk of the JoinSplit description, computed as
/// described in § 4.10 ‘Non-malleability (Sprout)’ on p. 37
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
pub struct MAC([u8; 32]);

impl ZcashDeserialize for MAC {
fn zcash_deserialize<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
let bytes = reader.read_32_bytes()?;

Ok(Self(bytes))
}
}

impl ZcashSerialize for MAC {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
writer.write_all(&self.0[..])
}
}
/// An encoding of a Bitcoin script.
#[derive(Clone, Eq, PartialEq, Serialize, Deserialize)]
#[cfg_attr(test, derive(Arbitrary))]
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
pub struct Script(pub Vec<u8>);

impl fmt::Debug for Script {
Expand Down

0 comments on commit c216f5c

Please sign in to comment.