hashes: Add hash function to modules
Add a standalone `hash` function that is a drop in replacement for `GeneralHash::hash`. Do not add it to `hmac` - this is in parity with the current code because `Hmac` does not implement `GeneralHash::hash`. Use the new function in `bitcoin` removing all occurrences of `GeneralHash` from `bitcoin`. In `hashes` replace usage of `GeneralHash::hash` with the new `hash` function.
This commit is contained in:
parent
e1bac7da55
commit
d3846895d7
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
use core::mem;
|
use core::mem;
|
||||||
|
|
||||||
use hashes::{sha256, sha256d, GeneralHash, Hash};
|
use hashes::{sha256, sha256d, Hash};
|
||||||
use hex::DisplayHex as _;
|
use hex::DisplayHex as _;
|
||||||
use internals::{compact_size, ToU64};
|
use internals::{compact_size, ToU64};
|
||||||
use io::{BufRead, Cursor, Read, Write};
|
use io::{BufRead, Cursor, Read, Write};
|
||||||
|
@ -629,7 +629,7 @@ impl Decodable for Box<[u8]> {
|
||||||
|
|
||||||
/// Does a double-SHA256 on `data` and returns the first 4 bytes.
|
/// Does a double-SHA256 on `data` and returns the first 4 bytes.
|
||||||
fn sha2_checksum(data: &[u8]) -> [u8; 4] {
|
fn sha2_checksum(data: &[u8]) -> [u8; 4] {
|
||||||
let checksum = <sha256d::Hash as GeneralHash>::hash(data);
|
let checksum = sha256d::hash(data);
|
||||||
let checksum = checksum.to_byte_array();
|
let checksum = checksum.to_byte_array();
|
||||||
[checksum[0], checksum[1], checksum[2], checksum[3]]
|
[checksum[0], checksum[1], checksum[2], checksum[3]]
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,15 +113,15 @@ macro_rules! impl_psbt_insert_pair {
|
||||||
|
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
macro_rules! psbt_insert_hash_pair {
|
macro_rules! psbt_insert_hash_pair {
|
||||||
(&mut $slf:ident.$map:ident <= $raw_key:ident|$raw_value:ident|$hash:path|$hash_type_error:path) => {
|
(&mut $slf:ident.$map:ident <= $raw_key:ident|$raw_value:ident|$hash:ident|$hash_type_error:path) => {
|
||||||
if $raw_key.key_data.is_empty() {
|
if $raw_key.key_data.is_empty() {
|
||||||
return Err($crate::psbt::Error::InvalidKey($raw_key));
|
return Err($crate::psbt::Error::InvalidKey($raw_key));
|
||||||
}
|
}
|
||||||
let key_val: $hash = Deserialize::deserialize(&$raw_key.key_data)?;
|
let key_val: $hash::Hash = Deserialize::deserialize(&$raw_key.key_data)?;
|
||||||
match $slf.$map.entry(key_val) {
|
match $slf.$map.entry(key_val) {
|
||||||
btree_map::Entry::Vacant(empty_key) => {
|
btree_map::Entry::Vacant(empty_key) => {
|
||||||
let val: Vec<u8> = Deserialize::deserialize(&$raw_value)?;
|
let val: Vec<u8> = Deserialize::deserialize(&$raw_value)?;
|
||||||
if <$hash as hashes::GeneralHash>::hash(&val) != key_val {
|
if $hash::hash(&val) != key_val {
|
||||||
return Err($crate::psbt::Error::InvalidPreimageHashPair {
|
return Err($crate::psbt::Error::InvalidPreimageHashPair {
|
||||||
preimage: val.into_boxed_slice(),
|
preimage: val.into_boxed_slice(),
|
||||||
hash: Box::from(key_val.borrow()),
|
hash: Box::from(key_val.borrow()),
|
||||||
|
|
|
@ -317,22 +317,22 @@ impl Input {
|
||||||
}
|
}
|
||||||
PSBT_IN_RIPEMD160 => {
|
PSBT_IN_RIPEMD160 => {
|
||||||
psbt_insert_hash_pair! {
|
psbt_insert_hash_pair! {
|
||||||
&mut self.ripemd160_preimages <= raw_key|raw_value|ripemd160::Hash|error::PsbtHash::Ripemd
|
&mut self.ripemd160_preimages <= raw_key|raw_value|ripemd160|error::PsbtHash::Ripemd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PSBT_IN_SHA256 => {
|
PSBT_IN_SHA256 => {
|
||||||
psbt_insert_hash_pair! {
|
psbt_insert_hash_pair! {
|
||||||
&mut self.sha256_preimages <= raw_key|raw_value|sha256::Hash|error::PsbtHash::Sha256
|
&mut self.sha256_preimages <= raw_key|raw_value|sha256|error::PsbtHash::Sha256
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PSBT_IN_HASH160 => {
|
PSBT_IN_HASH160 => {
|
||||||
psbt_insert_hash_pair! {
|
psbt_insert_hash_pair! {
|
||||||
&mut self.hash160_preimages <= raw_key|raw_value|hash160::Hash|error::PsbtHash::Hash160
|
&mut self.hash160_preimages <= raw_key|raw_value|hash160|error::PsbtHash::Hash160
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PSBT_IN_HASH256 => {
|
PSBT_IN_HASH256 => {
|
||||||
psbt_insert_hash_pair! {
|
psbt_insert_hash_pair! {
|
||||||
&mut self.hash256_preimages <= raw_key|raw_value|sha256d::Hash|error::PsbtHash::Hash256
|
&mut self.hash256_preimages <= raw_key|raw_value|sha256d|error::PsbtHash::Hash256
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PSBT_IN_TAP_KEY_SIG => {
|
PSBT_IN_TAP_KEY_SIG => {
|
||||||
|
|
|
@ -71,6 +71,15 @@ pub(crate) use hash_trait_impls;
|
||||||
/// [`hash_trait_impls`].
|
/// [`hash_trait_impls`].
|
||||||
macro_rules! general_hash_type {
|
macro_rules! general_hash_type {
|
||||||
($bits:expr, $reverse:expr, $doc:literal) => {
|
($bits:expr, $reverse:expr, $doc:literal) => {
|
||||||
|
/// Hashes some bytes.
|
||||||
|
pub fn hash(data: &[u8]) -> Hash {
|
||||||
|
use crate::HashEngine as _;
|
||||||
|
|
||||||
|
let mut engine = Hash::engine();
|
||||||
|
engine.input(data);
|
||||||
|
engine.finalize()
|
||||||
|
}
|
||||||
|
|
||||||
$crate::internal_macros::hash_type_no_default!($bits, $reverse, $doc);
|
$crate::internal_macros::hash_type_no_default!($bits, $reverse, $doc);
|
||||||
|
|
||||||
impl Hash {
|
impl Hash {
|
||||||
|
@ -82,7 +91,7 @@ macro_rules! general_hash_type {
|
||||||
|
|
||||||
/// Hashes some bytes.
|
/// Hashes some bytes.
|
||||||
#[allow(clippy::self_named_constructors)] // Hash is a noun and a verb.
|
#[allow(clippy::self_named_constructors)] // Hash is a noun and a verb.
|
||||||
pub fn hash(data: &[u8]) -> Self { <Self as $crate::GeneralHash>::hash(data) }
|
pub fn hash(data: &[u8]) -> Self { hash(data) }
|
||||||
|
|
||||||
/// Hashes all the byte slices retrieved from the iterator together.
|
/// Hashes all the byte slices retrieved from the iterator together.
|
||||||
pub fn hash_byte_chunks<B, I>(byte_slices: I) -> Self
|
pub fn hash_byte_chunks<B, I>(byte_slices: I) -> Self
|
||||||
|
|
|
@ -140,9 +140,7 @@ impl crate::HashEngine for HashEngine {
|
||||||
impl Hash {
|
impl Hash {
|
||||||
/// Iterate the sha256 algorithm to turn a sha256 hash into a sha256d hash
|
/// Iterate the sha256 algorithm to turn a sha256 hash into a sha256d hash
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn hash_again(&self) -> sha256d::Hash {
|
pub fn hash_again(&self) -> sha256d::Hash { sha256d::Hash::from_byte_array(hash(&self.0).0) }
|
||||||
crate::Hash::from_byte_array(<Self as crate::GeneralHash>::hash(&self.0).0)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Computes hash from `bytes` in `const` context.
|
/// Computes hash from `bytes` in `const` context.
|
||||||
///
|
///
|
||||||
|
|
|
@ -9,6 +9,18 @@ use core::marker::PhantomData;
|
||||||
use crate::sha256::Midstate;
|
use crate::sha256::Midstate;
|
||||||
use crate::{sha256, HashEngine as _};
|
use crate::{sha256, HashEngine as _};
|
||||||
|
|
||||||
|
/// Hashes some bytes.
|
||||||
|
pub fn hash<T>(data: &[u8]) -> Hash<T>
|
||||||
|
where
|
||||||
|
T: Tag,
|
||||||
|
{
|
||||||
|
use crate::HashEngine as _;
|
||||||
|
|
||||||
|
let mut engine = HashEngine::default();
|
||||||
|
engine.input(data);
|
||||||
|
engine.finalize()
|
||||||
|
}
|
||||||
|
|
||||||
/// Trait representing a tag that can be used as a context for SHA256t hashes.
|
/// Trait representing a tag that can be used as a context for SHA256t hashes.
|
||||||
pub trait Tag {
|
pub trait Tag {
|
||||||
/// The [`Midstate`] after pre-tagging the hash engine.
|
/// The [`Midstate`] after pre-tagging the hash engine.
|
||||||
|
|
Loading…
Reference in New Issue