diff --git a/Cargo.lock b/Cargo.lock index 7a1e5382..f828fd42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3061,7 +3061,7 @@ dependencies = [ "secp256k1", "serde", "serde-big-array", - "sha2 0.8.2", + "sha2 0.9.1", "spandoc", "thiserror", "tracing", diff --git a/zebra-chain/Cargo.toml b/zebra-chain/Cargo.toml index b6482007..8adf8e05 100644 --- a/zebra-chain/Cargo.toml +++ b/zebra-chain/Cargo.toml @@ -25,7 +25,7 @@ ripemd160 = "0.8.0" secp256k1 = { version = "0.17.2", features = ["serde"] } serde = { version = "1", features = ["serde_derive", "rc"] } serde-big-array = "0.3.0" -sha2 = { version = "0.8.2", features=["compress"] } +sha2 = { version = "0.9.1", features=["compress"] } thiserror = "1" x25519-dalek = { version = "1", features = ["serde"] } diff --git a/zebra-chain/src/serialization/sha256d.rs b/zebra-chain/src/serialization/sha256d.rs index 2c6b511d..4b6acbfe 100644 --- a/zebra-chain/src/serialization/sha256d.rs +++ b/zebra-chain/src/serialization/sha256d.rs @@ -13,7 +13,7 @@ pub struct Writer { impl Writer { /// Consume the Writer and produce the hash result. pub fn finish(self) -> [u8; 32] { - let result1 = self.hash.result(); + let result1 = self.hash.finalize(); let result2 = Sha256::digest(&result1); let mut buffer = [0u8; 32]; buffer[0..32].copy_from_slice(&result2[0..32]); @@ -23,7 +23,7 @@ impl Writer { impl Write for Writer { fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.hash.input(buf); + self.hash.update(buf); Ok(buf.len()) } diff --git a/zebra-chain/src/sprout/commitment.rs b/zebra-chain/src/sprout/commitment.rs index 39895e99..379f67a3 100644 --- a/zebra-chain/src/sprout/commitment.rs +++ b/zebra-chain/src/sprout/commitment.rs @@ -37,12 +37,12 @@ impl From for NoteCommitment { fn from(note: Note) -> NoteCommitment { let leading_byte: u8 = 0xB0; let mut hasher = Sha256::default(); - hasher.input([leading_byte]); - hasher.input(note.paying_key); - hasher.input(note.value.to_bytes()); - hasher.input(note.rho); - hasher.input(note.rcm); - NoteCommitment(hasher.result().into()) + hasher.update([leading_byte]); + hasher.update(note.paying_key); + hasher.update(note.value.to_bytes()); + hasher.update(note.rho); + hasher.update(note.rcm); + NoteCommitment(hasher.finalize().into()) } } diff --git a/zebra-chain/src/sprout/keys.rs b/zebra-chain/src/sprout/keys.rs index 033f9778..cc96a260 100644 --- a/zebra-chain/src/sprout/keys.rs +++ b/zebra-chain/src/sprout/keys.rs @@ -11,6 +11,7 @@ use std::{fmt, io}; use byteorder::{ByteOrder, LittleEndian}; use rand_core::{CryptoRng, RngCore}; +use sha2::digest::generic_array::{typenum::U64, GenericArray}; #[cfg(test)] use proptest::{array, prelude::*}; @@ -37,17 +38,17 @@ mod sk_magics { /// https://zips.z.cash/protocol/protocol.pdf#sproutkeycomponents fn prf_addr(x: [u8; 32], t: u8) -> [u8; 32] { let mut state = [0u32; 8]; - let mut block = [0u8; 64]; + let mut block = GenericArray::::default(); - block[0..32].copy_from_slice(&x[..]); + block.as_mut_slice()[0..32].copy_from_slice(&x[..]); // The first four bits –i.e. the most signicant four bits of the // first byte– are used to separate distinct uses // of SHA256Compress, ensuring that the functions are independent. - block[0] |= 0b1100_0000; + block.as_mut_slice()[0] |= 0b1100_0000; - block[32] = t; + block.as_mut_slice()[32] = t; - sha2::compress256(&mut state, &block); + sha2::compress256(&mut state, &[block]); let mut derived_bytes = [0u8; 32]; LittleEndian::write_u32_into(&state, &mut derived_bytes); diff --git a/zebra-chain/src/sprout/note/nullifiers.rs b/zebra-chain/src/sprout/note/nullifiers.rs index 11d0edde..8513739f 100644 --- a/zebra-chain/src/sprout/note/nullifiers.rs +++ b/zebra-chain/src/sprout/note/nullifiers.rs @@ -2,6 +2,7 @@ use byteorder::{ByteOrder, LittleEndian}; use serde::{Deserialize, Serialize}; +use sha2::digest::generic_array::{typenum::U64, GenericArray}; use super::super::keys::SpendingKey; @@ -13,17 +14,17 @@ use super::super::keys::SpendingKey; /// https://zips.z.cash/protocol/protocol.pdf#commitmentsandnullifiers fn prf_nf(a_sk: [u8; 32], rho: [u8; 32]) -> [u8; 32] { let mut state = [0u32; 8]; - let mut block = [0u8; 64]; + let mut block = GenericArray::::default(); - block[0..32].copy_from_slice(&a_sk[..]); + block.as_mut_slice()[0..32].copy_from_slice(&a_sk[..]); // The first four bits –i.e. the most signicant four bits of the // first byte– are used to separate distinct uses // of SHA256Compress, ensuring that the functions are independent. - block[0] |= 0b1110_0000; + block.as_mut_slice()[0] |= 0b1100_0000; - block[32..].copy_from_slice(&rho[..]); + block.as_mut_slice()[32..].copy_from_slice(&rho[..]); - sha2::compress256(&mut state, &block); + sha2::compress256(&mut state, &[block]); let mut derived_bytes = [0u8; 32]; LittleEndian::write_u32_into(&state, &mut derived_bytes); diff --git a/zebra-chain/src/transparent/address.rs b/zebra-chain/src/transparent/address.rs index 29e0213f..5506f29a 100644 --- a/zebra-chain/src/transparent/address.rs +++ b/zebra-chain/src/transparent/address.rs @@ -4,7 +4,7 @@ use std::{fmt, io}; use ripemd160::{Digest, Ripemd160}; use secp256k1::PublicKey; -use sha2::Sha256; +use sha2::{Digest as sha2Digest, Sha256}; #[cfg(test)] use proptest::{arbitrary::Arbitrary, collection::vec, prelude::*};