Update sha2@0.9.1 (#938)
* Update sha2@0.9.1 Fixes #915 * Update zebra-chain/src/sprout/keys.rs Co-authored-by: Jane Lusby <jlusby42@gmail.com> * Update zebra-chain/src/sprout/note/nullifiers.rs Co-authored-by: Jane Lusby <jlusby42@gmail.com>
This commit is contained in:
parent
dda0d2dd41
commit
e90137e79b
|
@ -3061,7 +3061,7 @@ dependencies = [
|
||||||
"secp256k1",
|
"secp256k1",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-big-array",
|
"serde-big-array",
|
||||||
"sha2 0.8.2",
|
"sha2 0.9.1",
|
||||||
"spandoc",
|
"spandoc",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
|
|
@ -25,7 +25,7 @@ ripemd160 = "0.8.0"
|
||||||
secp256k1 = { version = "0.17.2", features = ["serde"] }
|
secp256k1 = { version = "0.17.2", features = ["serde"] }
|
||||||
serde = { version = "1", features = ["serde_derive", "rc"] }
|
serde = { version = "1", features = ["serde_derive", "rc"] }
|
||||||
serde-big-array = "0.3.0"
|
serde-big-array = "0.3.0"
|
||||||
sha2 = { version = "0.8.2", features=["compress"] }
|
sha2 = { version = "0.9.1", features=["compress"] }
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
x25519-dalek = { version = "1", features = ["serde"] }
|
x25519-dalek = { version = "1", features = ["serde"] }
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ pub struct Writer {
|
||||||
impl Writer {
|
impl Writer {
|
||||||
/// Consume the Writer and produce the hash result.
|
/// Consume the Writer and produce the hash result.
|
||||||
pub fn finish(self) -> [u8; 32] {
|
pub fn finish(self) -> [u8; 32] {
|
||||||
let result1 = self.hash.result();
|
let result1 = self.hash.finalize();
|
||||||
let result2 = Sha256::digest(&result1);
|
let result2 = Sha256::digest(&result1);
|
||||||
let mut buffer = [0u8; 32];
|
let mut buffer = [0u8; 32];
|
||||||
buffer[0..32].copy_from_slice(&result2[0..32]);
|
buffer[0..32].copy_from_slice(&result2[0..32]);
|
||||||
|
@ -23,7 +23,7 @@ impl Writer {
|
||||||
|
|
||||||
impl Write for Writer {
|
impl Write for Writer {
|
||||||
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
|
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
|
||||||
self.hash.input(buf);
|
self.hash.update(buf);
|
||||||
Ok(buf.len())
|
Ok(buf.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,12 +37,12 @@ impl From<Note> for NoteCommitment {
|
||||||
fn from(note: Note) -> NoteCommitment {
|
fn from(note: Note) -> NoteCommitment {
|
||||||
let leading_byte: u8 = 0xB0;
|
let leading_byte: u8 = 0xB0;
|
||||||
let mut hasher = Sha256::default();
|
let mut hasher = Sha256::default();
|
||||||
hasher.input([leading_byte]);
|
hasher.update([leading_byte]);
|
||||||
hasher.input(note.paying_key);
|
hasher.update(note.paying_key);
|
||||||
hasher.input(note.value.to_bytes());
|
hasher.update(note.value.to_bytes());
|
||||||
hasher.input(note.rho);
|
hasher.update(note.rho);
|
||||||
hasher.input(note.rcm);
|
hasher.update(note.rcm);
|
||||||
NoteCommitment(hasher.result().into())
|
NoteCommitment(hasher.finalize().into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ use std::{fmt, io};
|
||||||
|
|
||||||
use byteorder::{ByteOrder, LittleEndian};
|
use byteorder::{ByteOrder, LittleEndian};
|
||||||
use rand_core::{CryptoRng, RngCore};
|
use rand_core::{CryptoRng, RngCore};
|
||||||
|
use sha2::digest::generic_array::{typenum::U64, GenericArray};
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use proptest::{array, prelude::*};
|
use proptest::{array, prelude::*};
|
||||||
|
@ -37,17 +38,17 @@ mod sk_magics {
|
||||||
/// https://zips.z.cash/protocol/protocol.pdf#sproutkeycomponents
|
/// https://zips.z.cash/protocol/protocol.pdf#sproutkeycomponents
|
||||||
fn prf_addr(x: [u8; 32], t: u8) -> [u8; 32] {
|
fn prf_addr(x: [u8; 32], t: u8) -> [u8; 32] {
|
||||||
let mut state = [0u32; 8];
|
let mut state = [0u32; 8];
|
||||||
let mut block = [0u8; 64];
|
let mut block = GenericArray::<u8, U64>::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
|
// The first four bits –i.e. the most signicant four bits of the
|
||||||
// first byte– are used to separate distinct uses
|
// first byte– are used to separate distinct uses
|
||||||
// of SHA256Compress, ensuring that the functions are independent.
|
// 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];
|
let mut derived_bytes = [0u8; 32];
|
||||||
LittleEndian::write_u32_into(&state, &mut derived_bytes);
|
LittleEndian::write_u32_into(&state, &mut derived_bytes);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
use byteorder::{ByteOrder, LittleEndian};
|
use byteorder::{ByteOrder, LittleEndian};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use sha2::digest::generic_array::{typenum::U64, GenericArray};
|
||||||
|
|
||||||
use super::super::keys::SpendingKey;
|
use super::super::keys::SpendingKey;
|
||||||
|
|
||||||
|
@ -13,17 +14,17 @@ use super::super::keys::SpendingKey;
|
||||||
/// https://zips.z.cash/protocol/protocol.pdf#commitmentsandnullifiers
|
/// https://zips.z.cash/protocol/protocol.pdf#commitmentsandnullifiers
|
||||||
fn prf_nf(a_sk: [u8; 32], rho: [u8; 32]) -> [u8; 32] {
|
fn prf_nf(a_sk: [u8; 32], rho: [u8; 32]) -> [u8; 32] {
|
||||||
let mut state = [0u32; 8];
|
let mut state = [0u32; 8];
|
||||||
let mut block = [0u8; 64];
|
let mut block = GenericArray::<u8, U64>::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
|
// The first four bits –i.e. the most signicant four bits of the
|
||||||
// first byte– are used to separate distinct uses
|
// first byte– are used to separate distinct uses
|
||||||
// of SHA256Compress, ensuring that the functions are independent.
|
// 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];
|
let mut derived_bytes = [0u8; 32];
|
||||||
LittleEndian::write_u32_into(&state, &mut derived_bytes);
|
LittleEndian::write_u32_into(&state, &mut derived_bytes);
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::{fmt, io};
|
||||||
|
|
||||||
use ripemd160::{Digest, Ripemd160};
|
use ripemd160::{Digest, Ripemd160};
|
||||||
use secp256k1::PublicKey;
|
use secp256k1::PublicKey;
|
||||||
use sha2::Sha256;
|
use sha2::{Digest as sha2Digest, Sha256};
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use proptest::{arbitrary::Arbitrary, collection::vec, prelude::*};
|
use proptest::{arbitrary::Arbitrary, collection::vec, prelude::*};
|
||||||
|
|
Loading…
Reference in New Issue