Merge pull request #191 from zcash/sha-256-gadget-namespacing

Alter the SHA-256 gadget to require namespacing
This commit is contained in:
ebfull 2021-02-23 08:49:03 -07:00 committed by GitHub
commit 20bd44f854
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 14 deletions

View File

@ -66,9 +66,9 @@ pub struct Sha256<CS: Sha256Instructions> {
impl<Sha256Chip: Sha256Instructions> Sha256<Sha256Chip> { impl<Sha256Chip: Sha256Instructions> Sha256<Sha256Chip> {
/// Create a new hasher instance. /// Create a new hasher instance.
pub fn new(layouter: &mut impl Layouter<Sha256Chip>) -> Result<Self, Error> { pub fn new(mut layouter: impl Layouter<Sha256Chip>) -> Result<Self, Error> {
Ok(Sha256 { Ok(Sha256 {
state: Sha256Chip::initialization_vector(layouter)?, state: Sha256Chip::initialization_vector(&mut layouter)?,
cur_block: Vec::with_capacity(BLOCK_SIZE), cur_block: Vec::with_capacity(BLOCK_SIZE),
length: 0, length: 0,
}) })
@ -77,7 +77,7 @@ impl<Sha256Chip: Sha256Instructions> Sha256<Sha256Chip> {
/// Digest data, updating the internal state. /// Digest data, updating the internal state.
pub fn update( pub fn update(
&mut self, &mut self,
layouter: &mut impl Layouter<Sha256Chip>, mut layouter: impl Layouter<Sha256Chip>,
mut data: &[Sha256Chip::BlockWord], mut data: &[Sha256Chip::BlockWord],
) -> Result<(), Error> { ) -> Result<(), Error> {
self.length += data.len() * 32; self.length += data.len() * 32;
@ -95,7 +95,7 @@ impl<Sha256Chip: Sha256Instructions> Sha256<Sha256Chip> {
// Process the now-full current block. // Process the now-full current block.
self.state = Sha256Chip::compress( self.state = Sha256Chip::compress(
layouter, &mut layouter,
&self.state, &self.state,
self.cur_block[..] self.cur_block[..]
.try_into() .try_into()
@ -106,9 +106,9 @@ impl<Sha256Chip: Sha256Instructions> Sha256<Sha256Chip> {
// Process any additional full blocks. // Process any additional full blocks.
let mut chunks_iter = data.chunks_exact(BLOCK_SIZE); let mut chunks_iter = data.chunks_exact(BLOCK_SIZE);
for chunk in &mut chunks_iter { for chunk in &mut chunks_iter {
self.state = Sha256Chip::initialization(layouter, &self.state)?; self.state = Sha256Chip::initialization(&mut layouter, &self.state)?;
self.state = Sha256Chip::compress( self.state = Sha256Chip::compress(
layouter, &mut layouter,
&self.state, &self.state,
chunk.try_into().expect("chunk.len() == BLOCK_SIZE"), chunk.try_into().expect("chunk.len() == BLOCK_SIZE"),
)?; )?;
@ -124,32 +124,32 @@ impl<Sha256Chip: Sha256Instructions> Sha256<Sha256Chip> {
/// Retrieve result and consume hasher instance. /// Retrieve result and consume hasher instance.
pub fn finalize( pub fn finalize(
mut self, mut self,
layouter: &mut impl Layouter<Sha256Chip>, mut layouter: impl Layouter<Sha256Chip>,
) -> Result<Sha256Digest<Sha256Chip::BlockWord>, Error> { ) -> Result<Sha256Digest<Sha256Chip::BlockWord>, Error> {
// Pad the remaining block // Pad the remaining block
if !self.cur_block.is_empty() { if !self.cur_block.is_empty() {
let padding = vec![Sha256Chip::zero(); BLOCK_SIZE - self.cur_block.len()]; let padding = vec![Sha256Chip::zero(); BLOCK_SIZE - self.cur_block.len()];
self.cur_block.extend_from_slice(&padding); self.cur_block.extend_from_slice(&padding);
self.state = Sha256Chip::initialization(layouter, &self.state)?; self.state = Sha256Chip::initialization(&mut layouter, &self.state)?;
self.state = Sha256Chip::compress( self.state = Sha256Chip::compress(
layouter, &mut layouter,
&self.state, &self.state,
self.cur_block[..] self.cur_block[..]
.try_into() .try_into()
.expect("cur_block.len() == BLOCK_SIZE"), .expect("cur_block.len() == BLOCK_SIZE"),
)?; )?;
} }
Sha256Chip::digest(layouter, &self.state).map(Sha256Digest) Sha256Chip::digest(&mut layouter, &self.state).map(Sha256Digest)
} }
/// Convenience function to compute hash of the data. It will handle hasher creation, /// Convenience function to compute hash of the data. It will handle hasher creation,
/// data feeding and finalization. /// data feeding and finalization.
pub fn digest( pub fn digest(
layouter: &mut impl Layouter<Sha256Chip>, mut layouter: impl Layouter<Sha256Chip>,
data: &[Sha256Chip::BlockWord], data: &[Sha256Chip::BlockWord],
) -> Result<Sha256Digest<Sha256Chip::BlockWord>, Error> { ) -> Result<Sha256Digest<Sha256Chip::BlockWord>, Error> {
let mut hasher = Self::new(layouter)?; let mut hasher = Self::new(layouter.namespace(|| "init"))?;
hasher.update(layouter, data)?; hasher.update(layouter.namespace(|| "update"), data)?;
hasher.finalize(layouter) hasher.finalize(layouter.namespace(|| "finalize"))
} }
} }