From 878ab924d1ff020cecb4f057a5143ac30558f25f Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Sun, 31 Mar 2024 19:39:15 -0700 Subject: [PATCH 1/2] Add HMAC Extract-and-Expand Key Derivation Function BIP324's peer to peer encryption protocol requires an HMAC-based extract and expand key derivation function (HKDF). HKDFs were not part of many bitcoin protocols before BIP324, but the hope is that the encrypted protocol becomes the dominant standard justifying this implementation. --- hashes/src/hkdf.rs | 189 +++++++++++++++++++++++++++++++++++++++++++++ hashes/src/lib.rs | 1 + 2 files changed, 190 insertions(+) create mode 100644 hashes/src/hkdf.rs diff --git a/hashes/src/hkdf.rs b/hashes/src/hkdf.rs new file mode 100644 index 000000000..a1b6c730a --- /dev/null +++ b/hashes/src/hkdf.rs @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: CC0-1.0 + +//! HMAC-based Extract-and-Expand Key Derivation Function (HKDF). +//! +//! Implementation based on RFC5869, but the interface is scoped +//! to BIP324's requirements. + +use core::fmt; + +#[cfg(all(feature = "alloc", not(feature = "std")))] +use alloc::vec; +#[cfg(all(feature = "alloc", not(feature = "std")))] +use alloc::vec::Vec; + +use crate::{Hash, HashEngine, Hmac, HmacEngine}; + +/// Output keying material max length multiple. +const MAX_OUTPUT_BLOCKS: usize = 255; + +/// Size of output exceeds maximum length allowed. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct MaxLengthError { + max: usize, +} + +impl fmt::Display for MaxLengthError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "exceeds {} byte max output material limit", self.max) + } +} + +#[cfg(feature = "std")] +impl std::error::Error for MaxLengthError {} + +/// HMAC-based Extract-and-Expand Key Derivation Function (HKDF). +pub struct Hkdf { + /// Pseudorandom key based on the extract step. + prk: Hmac, +} + +impl Hkdf { + /// Initialize a HKDF by performing the extract step. + pub fn new(salt: &[u8], ikm: &[u8]) -> Self { + let mut hmac_engine: HmacEngine = HmacEngine::new(salt); + hmac_engine.input(ikm); + Self { prk: Hmac::from_engine(hmac_engine) } + } + + /// Expand the key to generate output key material in okm. + /// + /// Expand may be called multiple times to derive multiple keys, + /// but the info must be independent from the ikm for security. + pub fn expand(&self, info: &[u8], okm: &mut [u8]) -> Result<(), MaxLengthError> { + // Length of output keying material in bytes must be less than 255 * hash length. + if okm.len() > (MAX_OUTPUT_BLOCKS * T::LEN) { + return Err(MaxLengthError { max: MAX_OUTPUT_BLOCKS * T::LEN }); + } + + // Counter starts at "1" based on RFC5869 spec and is committed to in the hash. + let mut counter = 1u8; + // Ceiling calculation for the total number of blocks (iterations) required for the expand. + let total_blocks = (okm.len() + T::LEN - 1) / T::LEN; + + while counter <= total_blocks as u8 { + let mut hmac_engine: HmacEngine = HmacEngine::new(self.prk.as_ref()); + + // First block does not have a previous block, + // all other blocks include last block in the HMAC input. + if counter != 1u8 { + let previous_start_index = (counter as usize - 2) * T::LEN; + let previous_end_index = (counter as usize - 1) * T::LEN; + hmac_engine.input(&okm[previous_start_index..previous_end_index]); + } + hmac_engine.input(info); + hmac_engine.input(&[counter]); + + let t = Hmac::from_engine(hmac_engine); + let start_index = (counter as usize - 1) * T::LEN; + // Last block might not take full hash length. + let end_index = + if counter == (total_blocks as u8) { okm.len() } else { counter as usize * T::LEN }; + + okm[start_index..end_index].copy_from_slice(&t.as_ref()[0..(end_index - start_index)]); + + counter += 1; + } + + Ok(()) + } + + /// Expand the key to specified length. + /// + /// Expand may be called multiple times to derive multiple keys, + /// but the info must be independent from the ikm for security. + #[cfg(feature = "alloc")] + pub fn expand_to_len(&self, info: &[u8], len: usize) -> Result, MaxLengthError> { + let mut okm = vec![0u8; len]; + self.expand(info, &mut okm)?; + Ok(okm) + } +} + +#[cfg(test)] +#[cfg(feature = "alloc")] +mod tests { + use hex::prelude::*; + + use super::*; + use crate::sha256; + + #[test] + fn test_rfc5869_basic() { + let salt = Vec::from_hex("000102030405060708090a0b0c").unwrap(); + let ikm = Vec::from_hex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b").unwrap(); + let info = Vec::from_hex("f0f1f2f3f4f5f6f7f8f9").unwrap(); + + let hkdf = Hkdf::::new(&salt, &ikm); + let mut okm = [0u8; 42]; + hkdf.expand(&info, &mut okm).unwrap(); + + assert_eq!( + okm.to_lower_hex_string(), + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865" + ); + } + + #[test] + fn test_rfc5869_longer_inputs_outputs() { + let salt = Vec::from_hex( + "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + ).unwrap(); + let ikm = Vec::from_hex( + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f" + ).unwrap(); + let info = Vec::from_hex( + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" + ).unwrap(); + + let hkdf = Hkdf::::new(&salt, &ikm); + let mut okm = [0u8; 82]; + hkdf.expand(&info, &mut okm).unwrap(); + + assert_eq!( + okm.to_lower_hex_string(), + "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87" + ); + } + + #[test] + fn test_too_long_okm() { + let salt = Vec::from_hex("000102030405060708090a0b0c").unwrap(); + let ikm = Vec::from_hex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b").unwrap(); + let info = Vec::from_hex("f0f1f2f3f4f5f6f7f8f9").unwrap(); + + let hkdf = Hkdf::::new(&salt, &ikm); + let mut okm = [0u8; 256 * 32]; + let e = hkdf.expand(&info, &mut okm); + + assert!(e.is_err()); + } + + #[test] + fn test_short_okm() { + let salt = Vec::from_hex("000102030405060708090a0b0c").unwrap(); + let ikm = Vec::from_hex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b").unwrap(); + let info = Vec::from_hex("f0f1f2f3f4f5f6f7f8f9").unwrap(); + + let hkdf = Hkdf::::new(&salt, &ikm); + let mut okm = [0u8; 1]; + hkdf.expand(&info, &mut okm).unwrap(); + + assert_eq!(okm.to_lower_hex_string(), "3c"); + } + + #[test] + fn test_alloc_wrapper() { + let salt = Vec::from_hex("000102030405060708090a0b0c").unwrap(); + let ikm = Vec::from_hex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b").unwrap(); + let info = Vec::from_hex("f0f1f2f3f4f5f6f7f8f9").unwrap(); + + let hkdf = Hkdf::::new(&salt, &ikm); + let okm = hkdf.expand_to_len(&info, 42).unwrap(); + + assert_eq!( + okm.to_lower_hex_string(), + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865" + ); + } +} diff --git a/hashes/src/lib.rs b/hashes/src/lib.rs index 1aa7a6b92..ae7c01a1b 100644 --- a/hashes/src/lib.rs +++ b/hashes/src/lib.rs @@ -110,6 +110,7 @@ mod util; pub mod serde_macros; pub mod cmp; pub mod hash160; +pub mod hkdf; pub mod hmac; #[cfg(feature = "bitcoin-io")] mod impls; From c9d1ff7037aa47d5a0690d994cb1587908f201b8 Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Thu, 30 May 2024 15:50:51 -0700 Subject: [PATCH 2/2] Update hashes API changes --- api/hashes/all-features.txt | 30 ++++++++++++++++++++++++++++++ api/hashes/alloc-only.txt | 29 +++++++++++++++++++++++++++++ api/hashes/no-features.txt | 28 ++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/api/hashes/all-features.txt b/api/hashes/all-features.txt index 18a0991fb..ab2cbe77d 100644 --- a/api/hashes/all-features.txt +++ b/api/hashes/all-features.txt @@ -66,6 +66,7 @@ impl core::borrow::Borrow<[u8]> for bitcoin_hashes::sha512_256::Hash impl core::borrow::Borrow<[u8]> for bitcoin_hashes::siphash24::Hash impl core::clone::Clone for bitcoin_hashes::FromSliceError impl core::clone::Clone for bitcoin_hashes::hash160::Hash +impl core::clone::Clone for bitcoin_hashes::hkdf::MaxLengthError impl core::clone::Clone for bitcoin_hashes::ripemd160::Hash impl core::clone::Clone for bitcoin_hashes::ripemd160::HashEngine impl core::clone::Clone for bitcoin_hashes::sha1::Hash @@ -85,6 +86,7 @@ impl core::clone::Clone for bitcoin_hashes::siphash24::HashEngine impl core::clone::Clone for bitcoin_hashes::siphash24::State impl core::cmp::Eq for bitcoin_hashes::FromSliceError impl core::cmp::Eq for bitcoin_hashes::hash160::Hash +impl core::cmp::Eq for bitcoin_hashes::hkdf::MaxLengthError impl core::cmp::Eq for bitcoin_hashes::ripemd160::Hash impl core::cmp::Eq for bitcoin_hashes::sha1::Hash impl core::cmp::Eq for bitcoin_hashes::sha256::Hash @@ -106,6 +108,7 @@ impl core::cmp::Ord for bitcoin_hashes::sha512_256::Hash impl core::cmp::Ord for bitcoin_hashes::siphash24::Hash impl core::cmp::PartialEq for bitcoin_hashes::FromSliceError impl core::cmp::PartialEq for bitcoin_hashes::hash160::Hash +impl core::cmp::PartialEq for bitcoin_hashes::hkdf::MaxLengthError impl core::cmp::PartialEq for bitcoin_hashes::ripemd160::Hash impl core::cmp::PartialEq for bitcoin_hashes::sha1::Hash impl core::cmp::PartialEq for bitcoin_hashes::sha256::Hash @@ -153,8 +156,10 @@ impl core::default::Default for bitcoin_hashes::sha512::HashEngine impl core::default::Default for bitcoin_hashes::sha512_256::HashEngine impl core::default::Default for bitcoin_hashes::siphash24::HashEngine impl core::error::Error for bitcoin_hashes::FromSliceError +impl core::error::Error for bitcoin_hashes::hkdf::MaxLengthError impl core::fmt::Debug for bitcoin_hashes::FromSliceError impl core::fmt::Debug for bitcoin_hashes::hash160::Hash +impl core::fmt::Debug for bitcoin_hashes::hkdf::MaxLengthError impl core::fmt::Debug for bitcoin_hashes::ripemd160::Hash impl core::fmt::Debug for bitcoin_hashes::sha1::Hash impl core::fmt::Debug for bitcoin_hashes::sha256::Hash @@ -168,6 +173,7 @@ impl core::fmt::Debug for bitcoin_hashes::siphash24::HashEngine impl core::fmt::Debug for bitcoin_hashes::siphash24::State impl core::fmt::Display for bitcoin_hashes::FromSliceError impl core::fmt::Display for bitcoin_hashes::hash160::Hash +impl core::fmt::Display for bitcoin_hashes::hkdf::MaxLengthError impl core::fmt::Display for bitcoin_hashes::ripemd160::Hash impl core::fmt::Display for bitcoin_hashes::sha1::Hash impl core::fmt::Display for bitcoin_hashes::sha256::Hash @@ -208,6 +214,7 @@ impl core::hash::Hash for bitcoin_hashes::sha512::Hash impl core::hash::Hash for bitcoin_hashes::sha512_256::Hash impl core::hash::Hash for bitcoin_hashes::siphash24::Hash impl core::marker::Copy for bitcoin_hashes::hash160::Hash +impl core::marker::Copy for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Copy for bitcoin_hashes::ripemd160::Hash impl core::marker::Copy for bitcoin_hashes::sha1::Hash impl core::marker::Copy for bitcoin_hashes::sha256::Hash @@ -219,6 +226,7 @@ impl core::marker::Copy for bitcoin_hashes::sha512_256::Hash impl core::marker::Copy for bitcoin_hashes::siphash24::Hash impl core::marker::Freeze for bitcoin_hashes::FromSliceError impl core::marker::Freeze for bitcoin_hashes::hash160::Hash +impl core::marker::Freeze for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Freeze for bitcoin_hashes::ripemd160::Hash impl core::marker::Freeze for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Freeze for bitcoin_hashes::sha1::Hash @@ -238,6 +246,7 @@ impl core::marker::Freeze for bitcoin_hashes::siphash24::HashEngine impl core::marker::Freeze for bitcoin_hashes::siphash24::State impl core::marker::Send for bitcoin_hashes::FromSliceError impl core::marker::Send for bitcoin_hashes::hash160::Hash +impl core::marker::Send for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Send for bitcoin_hashes::ripemd160::Hash impl core::marker::Send for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Send for bitcoin_hashes::sha1::Hash @@ -257,6 +266,7 @@ impl core::marker::Send for bitcoin_hashes::siphash24::HashEngine impl core::marker::Send for bitcoin_hashes::siphash24::State impl core::marker::StructuralPartialEq for bitcoin_hashes::FromSliceError impl core::marker::StructuralPartialEq for bitcoin_hashes::hash160::Hash +impl core::marker::StructuralPartialEq for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::StructuralPartialEq for bitcoin_hashes::ripemd160::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::sha1::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::sha256::Hash @@ -268,6 +278,7 @@ impl core::marker::StructuralPartialEq for bitcoin_hashes::sha512_256::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::siphash24::Hash impl core::marker::Sync for bitcoin_hashes::FromSliceError impl core::marker::Sync for bitcoin_hashes::hash160::Hash +impl core::marker::Sync for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Sync for bitcoin_hashes::ripemd160::Hash impl core::marker::Sync for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Sync for bitcoin_hashes::sha1::Hash @@ -287,6 +298,7 @@ impl core::marker::Sync for bitcoin_hashes::siphash24::HashEngine impl core::marker::Sync for bitcoin_hashes::siphash24::State impl core::marker::Unpin for bitcoin_hashes::FromSliceError impl core::marker::Unpin for bitcoin_hashes::hash160::Hash +impl core::marker::Unpin for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Unpin for bitcoin_hashes::ripemd160::Hash impl core::marker::Unpin for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Unpin for bitcoin_hashes::sha1::Hash @@ -306,6 +318,7 @@ impl core::marker::Unpin for bitcoin_hashes::siphash24::HashEngine impl core::marker::Unpin for bitcoin_hashes::siphash24::State impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::FromSliceError impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hash160::Hash +impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hkdf::MaxLengthError impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::ripemd160::Hash impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::ripemd160::HashEngine impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::sha1::Hash @@ -325,6 +338,7 @@ impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::siphash24::Hash impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::siphash24::State impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::FromSliceError impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hash160::Hash +impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hkdf::MaxLengthError impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::ripemd160::Hash impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::ripemd160::HashEngine impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::sha1::Hash @@ -405,6 +419,7 @@ impl schemars::JsonSchema for bi impl serde::ser::Serialize for bitcoin_hashes::hmac::Hmac impl bitcoin_hashes::Hash for bitcoin_hashes::hmac::Hmac impl bitcoin_hashes::HashEngine for bitcoin_hashes::hmac::HmacEngine +impl bitcoin_hashes::hkdf::Hkdf impl bitcoin_hashes::hmac::HmacEngine impl bitcoin_io::Write for bitcoin_hashes::hmac::HmacEngine impl core::convert::AsRef<[u8]> for bitcoin_hashes::hmac::Hmac @@ -443,26 +458,32 @@ impl core::cmp::PartialEq for bi impl core::cmp::PartialOrd for bitcoin_hashes::hmac::Hmac impl core::hash::Hash for bitcoin_hashes::hmac::Hmac impl core::marker::Copy for bitcoin_hashes::hmac::Hmac +impl core::marker::Freeze for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::Hmac where T: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::sha256t::Hash +impl core::marker::Send for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::Hmac where T: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Send impl core::marker::Send for bitcoin_hashes::sha256t::Hash where T: core::marker::Send +impl core::marker::Sync for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::Hmac where T: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::sha256t::Hash where T: core::marker::Sync +impl core::marker::Unpin for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::Hmac where T: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::sha256t::Hash where T: core::marker::Unpin +impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hkdf::Hkdf where T: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::Hmac where T: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::sha256t::Hash where T: core::panic::unwind_safe::RefUnwindSafe +impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hkdf::Hkdf where T: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::Hmac where T: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::panic::unwind_safe::UnwindSafe @@ -563,6 +584,12 @@ pub fn bitcoin_hashes::hash160::Hash::partial_cmp(&self, other: &bitcoin_hashes: pub fn bitcoin_hashes::hash160::Hash::schema_name() -> alloc::string::String pub fn bitcoin_hashes::hash160::Hash::serialize(&self, s: S) -> core::result::Result<::Ok, ::Error> pub fn bitcoin_hashes::hash160::Hash::to_byte_array(self) -> Self::Bytes +pub fn bitcoin_hashes::hkdf::Hkdf::expand(&self, info: &[u8], okm: &mut [u8]) -> core::result::Result<(), bitcoin_hashes::hkdf::MaxLengthError> +pub fn bitcoin_hashes::hkdf::Hkdf::expand_to_len(&self, info: &[u8], len: usize) -> core::result::Result, bitcoin_hashes::hkdf::MaxLengthError> +pub fn bitcoin_hashes::hkdf::Hkdf::new(salt: &[u8], ikm: &[u8]) -> Self +pub fn bitcoin_hashes::hkdf::MaxLengthError::clone(&self) -> bitcoin_hashes::hkdf::MaxLengthError +pub fn bitcoin_hashes::hkdf::MaxLengthError::eq(&self, other: &bitcoin_hashes::hkdf::MaxLengthError) -> bool +pub fn bitcoin_hashes::hkdf::MaxLengthError::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result pub fn bitcoin_hashes::hmac::Hmac::all_zeros() -> Self pub fn bitcoin_hashes::hmac::Hmac::as_byte_array(&self) -> &Self::Bytes pub fn bitcoin_hashes::hmac::Hmac::as_ref(&self) -> &[u8] @@ -914,6 +941,7 @@ pub macro bitcoin_hashes::sha256t_hash_newtype! pub mod bitcoin_hashes pub mod bitcoin_hashes::cmp pub mod bitcoin_hashes::hash160 +pub mod bitcoin_hashes::hkdf pub mod bitcoin_hashes::hmac pub mod bitcoin_hashes::ripemd160 pub mod bitcoin_hashes::serde_macros @@ -928,6 +956,8 @@ pub mod bitcoin_hashes::sha512_256 pub mod bitcoin_hashes::siphash24 pub struct bitcoin_hashes::FromSliceError pub struct bitcoin_hashes::HmacEngine +pub struct bitcoin_hashes::hkdf::Hkdf +pub struct bitcoin_hashes::hkdf::MaxLengthError pub struct bitcoin_hashes::hmac::HmacEngine pub struct bitcoin_hashes::hmac::HmacMidState pub struct bitcoin_hashes::ripemd160::HashEngine diff --git a/api/hashes/alloc-only.txt b/api/hashes/alloc-only.txt index 52d7eb84e..baefc09f9 100644 --- a/api/hashes/alloc-only.txt +++ b/api/hashes/alloc-only.txt @@ -51,6 +51,7 @@ impl core::borrow::Borrow<[u8]> for bitcoin_hashes::sha512_256::Hash impl core::borrow::Borrow<[u8]> for bitcoin_hashes::siphash24::Hash impl core::clone::Clone for bitcoin_hashes::FromSliceError impl core::clone::Clone for bitcoin_hashes::hash160::Hash +impl core::clone::Clone for bitcoin_hashes::hkdf::MaxLengthError impl core::clone::Clone for bitcoin_hashes::ripemd160::Hash impl core::clone::Clone for bitcoin_hashes::ripemd160::HashEngine impl core::clone::Clone for bitcoin_hashes::sha1::Hash @@ -70,6 +71,7 @@ impl core::clone::Clone for bitcoin_hashes::siphash24::HashEngine impl core::clone::Clone for bitcoin_hashes::siphash24::State impl core::cmp::Eq for bitcoin_hashes::FromSliceError impl core::cmp::Eq for bitcoin_hashes::hash160::Hash +impl core::cmp::Eq for bitcoin_hashes::hkdf::MaxLengthError impl core::cmp::Eq for bitcoin_hashes::ripemd160::Hash impl core::cmp::Eq for bitcoin_hashes::sha1::Hash impl core::cmp::Eq for bitcoin_hashes::sha256::Hash @@ -91,6 +93,7 @@ impl core::cmp::Ord for bitcoin_hashes::sha512_256::Hash impl core::cmp::Ord for bitcoin_hashes::siphash24::Hash impl core::cmp::PartialEq for bitcoin_hashes::FromSliceError impl core::cmp::PartialEq for bitcoin_hashes::hash160::Hash +impl core::cmp::PartialEq for bitcoin_hashes::hkdf::MaxLengthError impl core::cmp::PartialEq for bitcoin_hashes::ripemd160::Hash impl core::cmp::PartialEq for bitcoin_hashes::sha1::Hash impl core::cmp::PartialEq for bitcoin_hashes::sha256::Hash @@ -139,6 +142,7 @@ impl core::default::Default for bitcoin_hashes::sha512_256::HashEngine impl core::default::Default for bitcoin_hashes::siphash24::HashEngine impl core::fmt::Debug for bitcoin_hashes::FromSliceError impl core::fmt::Debug for bitcoin_hashes::hash160::Hash +impl core::fmt::Debug for bitcoin_hashes::hkdf::MaxLengthError impl core::fmt::Debug for bitcoin_hashes::ripemd160::Hash impl core::fmt::Debug for bitcoin_hashes::sha1::Hash impl core::fmt::Debug for bitcoin_hashes::sha256::Hash @@ -152,6 +156,7 @@ impl core::fmt::Debug for bitcoin_hashes::siphash24::HashEngine impl core::fmt::Debug for bitcoin_hashes::siphash24::State impl core::fmt::Display for bitcoin_hashes::FromSliceError impl core::fmt::Display for bitcoin_hashes::hash160::Hash +impl core::fmt::Display for bitcoin_hashes::hkdf::MaxLengthError impl core::fmt::Display for bitcoin_hashes::ripemd160::Hash impl core::fmt::Display for bitcoin_hashes::sha1::Hash impl core::fmt::Display for bitcoin_hashes::sha256::Hash @@ -192,6 +197,7 @@ impl core::hash::Hash for bitcoin_hashes::sha512::Hash impl core::hash::Hash for bitcoin_hashes::sha512_256::Hash impl core::hash::Hash for bitcoin_hashes::siphash24::Hash impl core::marker::Copy for bitcoin_hashes::hash160::Hash +impl core::marker::Copy for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Copy for bitcoin_hashes::ripemd160::Hash impl core::marker::Copy for bitcoin_hashes::sha1::Hash impl core::marker::Copy for bitcoin_hashes::sha256::Hash @@ -203,6 +209,7 @@ impl core::marker::Copy for bitcoin_hashes::sha512_256::Hash impl core::marker::Copy for bitcoin_hashes::siphash24::Hash impl core::marker::Freeze for bitcoin_hashes::FromSliceError impl core::marker::Freeze for bitcoin_hashes::hash160::Hash +impl core::marker::Freeze for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Freeze for bitcoin_hashes::ripemd160::Hash impl core::marker::Freeze for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Freeze for bitcoin_hashes::sha1::Hash @@ -222,6 +229,7 @@ impl core::marker::Freeze for bitcoin_hashes::siphash24::HashEngine impl core::marker::Freeze for bitcoin_hashes::siphash24::State impl core::marker::Send for bitcoin_hashes::FromSliceError impl core::marker::Send for bitcoin_hashes::hash160::Hash +impl core::marker::Send for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Send for bitcoin_hashes::ripemd160::Hash impl core::marker::Send for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Send for bitcoin_hashes::sha1::Hash @@ -241,6 +249,7 @@ impl core::marker::Send for bitcoin_hashes::siphash24::HashEngine impl core::marker::Send for bitcoin_hashes::siphash24::State impl core::marker::StructuralPartialEq for bitcoin_hashes::FromSliceError impl core::marker::StructuralPartialEq for bitcoin_hashes::hash160::Hash +impl core::marker::StructuralPartialEq for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::StructuralPartialEq for bitcoin_hashes::ripemd160::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::sha1::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::sha256::Hash @@ -252,6 +261,7 @@ impl core::marker::StructuralPartialEq for bitcoin_hashes::sha512_256::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::siphash24::Hash impl core::marker::Sync for bitcoin_hashes::FromSliceError impl core::marker::Sync for bitcoin_hashes::hash160::Hash +impl core::marker::Sync for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Sync for bitcoin_hashes::ripemd160::Hash impl core::marker::Sync for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Sync for bitcoin_hashes::sha1::Hash @@ -271,6 +281,7 @@ impl core::marker::Sync for bitcoin_hashes::siphash24::HashEngine impl core::marker::Sync for bitcoin_hashes::siphash24::State impl core::marker::Unpin for bitcoin_hashes::FromSliceError impl core::marker::Unpin for bitcoin_hashes::hash160::Hash +impl core::marker::Unpin for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Unpin for bitcoin_hashes::ripemd160::Hash impl core::marker::Unpin for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Unpin for bitcoin_hashes::sha1::Hash @@ -290,6 +301,7 @@ impl core::marker::Unpin for bitcoin_hashes::siphash24::HashEngine impl core::marker::Unpin for bitcoin_hashes::siphash24::State impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::FromSliceError impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hash160::Hash +impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hkdf::MaxLengthError impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::ripemd160::Hash impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::ripemd160::HashEngine impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::sha1::Hash @@ -309,6 +321,7 @@ impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::siphash24::Hash impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::siphash24::State impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::FromSliceError impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hash160::Hash +impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hkdf::MaxLengthError impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::ripemd160::Hash impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::ripemd160::HashEngine impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::sha1::Hash @@ -351,6 +364,7 @@ impl> core::ops::index::Index for bit impl core::str::traits::FromStr for bitcoin_hashes::hmac::Hmac impl bitcoin_hashes::Hash for bitcoin_hashes::hmac::Hmac impl bitcoin_hashes::HashEngine for bitcoin_hashes::hmac::HmacEngine +impl bitcoin_hashes::hkdf::Hkdf impl bitcoin_hashes::hmac::HmacEngine impl core::convert::AsRef<[u8]> for bitcoin_hashes::hmac::Hmac impl core::default::Default for bitcoin_hashes::hmac::HmacEngine @@ -384,26 +398,32 @@ impl core::cmp::PartialEq for bi impl core::cmp::PartialOrd for bitcoin_hashes::hmac::Hmac impl core::hash::Hash for bitcoin_hashes::hmac::Hmac impl core::marker::Copy for bitcoin_hashes::hmac::Hmac +impl core::marker::Freeze for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::Hmac where T: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::sha256t::Hash +impl core::marker::Send for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::Hmac where T: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Send impl core::marker::Send for bitcoin_hashes::sha256t::Hash where T: core::marker::Send +impl core::marker::Sync for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::Hmac where T: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::sha256t::Hash where T: core::marker::Sync +impl core::marker::Unpin for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::Hmac where T: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::sha256t::Hash where T: core::marker::Unpin +impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hkdf::Hkdf where T: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::Hmac where T: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::sha256t::Hash where T: core::panic::unwind_safe::RefUnwindSafe +impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hkdf::Hkdf where T: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::Hmac where T: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::panic::unwind_safe::UnwindSafe @@ -486,6 +506,12 @@ pub fn bitcoin_hashes::hash160::Hash::hash<__H: core::hash::Hasher>(&self, state pub fn bitcoin_hashes::hash160::Hash::index(&self, index: I) -> &Self::Output pub fn bitcoin_hashes::hash160::Hash::partial_cmp(&self, other: &bitcoin_hashes::hash160::Hash) -> core::option::Option pub fn bitcoin_hashes::hash160::Hash::to_byte_array(self) -> Self::Bytes +pub fn bitcoin_hashes::hkdf::Hkdf::expand(&self, info: &[u8], okm: &mut [u8]) -> core::result::Result<(), bitcoin_hashes::hkdf::MaxLengthError> +pub fn bitcoin_hashes::hkdf::Hkdf::expand_to_len(&self, info: &[u8], len: usize) -> core::result::Result, bitcoin_hashes::hkdf::MaxLengthError> +pub fn bitcoin_hashes::hkdf::Hkdf::new(salt: &[u8], ikm: &[u8]) -> Self +pub fn bitcoin_hashes::hkdf::MaxLengthError::clone(&self) -> bitcoin_hashes::hkdf::MaxLengthError +pub fn bitcoin_hashes::hkdf::MaxLengthError::eq(&self, other: &bitcoin_hashes::hkdf::MaxLengthError) -> bool +pub fn bitcoin_hashes::hkdf::MaxLengthError::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result pub fn bitcoin_hashes::hmac::Hmac::all_zeros() -> Self pub fn bitcoin_hashes::hmac::Hmac::as_byte_array(&self) -> &Self::Bytes pub fn bitcoin_hashes::hmac::Hmac::as_ref(&self) -> &[u8] @@ -757,6 +783,7 @@ pub macro bitcoin_hashes::sha256t_hash_newtype! pub mod bitcoin_hashes pub mod bitcoin_hashes::cmp pub mod bitcoin_hashes::hash160 +pub mod bitcoin_hashes::hkdf pub mod bitcoin_hashes::hmac pub mod bitcoin_hashes::ripemd160 pub mod bitcoin_hashes::serde_macros @@ -770,6 +797,8 @@ pub mod bitcoin_hashes::sha512_256 pub mod bitcoin_hashes::siphash24 pub struct bitcoin_hashes::FromSliceError pub struct bitcoin_hashes::HmacEngine +pub struct bitcoin_hashes::hkdf::Hkdf +pub struct bitcoin_hashes::hkdf::MaxLengthError pub struct bitcoin_hashes::hmac::HmacEngine pub struct bitcoin_hashes::hmac::HmacMidState pub struct bitcoin_hashes::ripemd160::HashEngine diff --git a/api/hashes/no-features.txt b/api/hashes/no-features.txt index 52d7eb84e..134993aad 100644 --- a/api/hashes/no-features.txt +++ b/api/hashes/no-features.txt @@ -51,6 +51,7 @@ impl core::borrow::Borrow<[u8]> for bitcoin_hashes::sha512_256::Hash impl core::borrow::Borrow<[u8]> for bitcoin_hashes::siphash24::Hash impl core::clone::Clone for bitcoin_hashes::FromSliceError impl core::clone::Clone for bitcoin_hashes::hash160::Hash +impl core::clone::Clone for bitcoin_hashes::hkdf::MaxLengthError impl core::clone::Clone for bitcoin_hashes::ripemd160::Hash impl core::clone::Clone for bitcoin_hashes::ripemd160::HashEngine impl core::clone::Clone for bitcoin_hashes::sha1::Hash @@ -70,6 +71,7 @@ impl core::clone::Clone for bitcoin_hashes::siphash24::HashEngine impl core::clone::Clone for bitcoin_hashes::siphash24::State impl core::cmp::Eq for bitcoin_hashes::FromSliceError impl core::cmp::Eq for bitcoin_hashes::hash160::Hash +impl core::cmp::Eq for bitcoin_hashes::hkdf::MaxLengthError impl core::cmp::Eq for bitcoin_hashes::ripemd160::Hash impl core::cmp::Eq for bitcoin_hashes::sha1::Hash impl core::cmp::Eq for bitcoin_hashes::sha256::Hash @@ -91,6 +93,7 @@ impl core::cmp::Ord for bitcoin_hashes::sha512_256::Hash impl core::cmp::Ord for bitcoin_hashes::siphash24::Hash impl core::cmp::PartialEq for bitcoin_hashes::FromSliceError impl core::cmp::PartialEq for bitcoin_hashes::hash160::Hash +impl core::cmp::PartialEq for bitcoin_hashes::hkdf::MaxLengthError impl core::cmp::PartialEq for bitcoin_hashes::ripemd160::Hash impl core::cmp::PartialEq for bitcoin_hashes::sha1::Hash impl core::cmp::PartialEq for bitcoin_hashes::sha256::Hash @@ -139,6 +142,7 @@ impl core::default::Default for bitcoin_hashes::sha512_256::HashEngine impl core::default::Default for bitcoin_hashes::siphash24::HashEngine impl core::fmt::Debug for bitcoin_hashes::FromSliceError impl core::fmt::Debug for bitcoin_hashes::hash160::Hash +impl core::fmt::Debug for bitcoin_hashes::hkdf::MaxLengthError impl core::fmt::Debug for bitcoin_hashes::ripemd160::Hash impl core::fmt::Debug for bitcoin_hashes::sha1::Hash impl core::fmt::Debug for bitcoin_hashes::sha256::Hash @@ -152,6 +156,7 @@ impl core::fmt::Debug for bitcoin_hashes::siphash24::HashEngine impl core::fmt::Debug for bitcoin_hashes::siphash24::State impl core::fmt::Display for bitcoin_hashes::FromSliceError impl core::fmt::Display for bitcoin_hashes::hash160::Hash +impl core::fmt::Display for bitcoin_hashes::hkdf::MaxLengthError impl core::fmt::Display for bitcoin_hashes::ripemd160::Hash impl core::fmt::Display for bitcoin_hashes::sha1::Hash impl core::fmt::Display for bitcoin_hashes::sha256::Hash @@ -192,6 +197,7 @@ impl core::hash::Hash for bitcoin_hashes::sha512::Hash impl core::hash::Hash for bitcoin_hashes::sha512_256::Hash impl core::hash::Hash for bitcoin_hashes::siphash24::Hash impl core::marker::Copy for bitcoin_hashes::hash160::Hash +impl core::marker::Copy for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Copy for bitcoin_hashes::ripemd160::Hash impl core::marker::Copy for bitcoin_hashes::sha1::Hash impl core::marker::Copy for bitcoin_hashes::sha256::Hash @@ -203,6 +209,7 @@ impl core::marker::Copy for bitcoin_hashes::sha512_256::Hash impl core::marker::Copy for bitcoin_hashes::siphash24::Hash impl core::marker::Freeze for bitcoin_hashes::FromSliceError impl core::marker::Freeze for bitcoin_hashes::hash160::Hash +impl core::marker::Freeze for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Freeze for bitcoin_hashes::ripemd160::Hash impl core::marker::Freeze for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Freeze for bitcoin_hashes::sha1::Hash @@ -222,6 +229,7 @@ impl core::marker::Freeze for bitcoin_hashes::siphash24::HashEngine impl core::marker::Freeze for bitcoin_hashes::siphash24::State impl core::marker::Send for bitcoin_hashes::FromSliceError impl core::marker::Send for bitcoin_hashes::hash160::Hash +impl core::marker::Send for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Send for bitcoin_hashes::ripemd160::Hash impl core::marker::Send for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Send for bitcoin_hashes::sha1::Hash @@ -241,6 +249,7 @@ impl core::marker::Send for bitcoin_hashes::siphash24::HashEngine impl core::marker::Send for bitcoin_hashes::siphash24::State impl core::marker::StructuralPartialEq for bitcoin_hashes::FromSliceError impl core::marker::StructuralPartialEq for bitcoin_hashes::hash160::Hash +impl core::marker::StructuralPartialEq for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::StructuralPartialEq for bitcoin_hashes::ripemd160::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::sha1::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::sha256::Hash @@ -252,6 +261,7 @@ impl core::marker::StructuralPartialEq for bitcoin_hashes::sha512_256::Hash impl core::marker::StructuralPartialEq for bitcoin_hashes::siphash24::Hash impl core::marker::Sync for bitcoin_hashes::FromSliceError impl core::marker::Sync for bitcoin_hashes::hash160::Hash +impl core::marker::Sync for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Sync for bitcoin_hashes::ripemd160::Hash impl core::marker::Sync for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Sync for bitcoin_hashes::sha1::Hash @@ -271,6 +281,7 @@ impl core::marker::Sync for bitcoin_hashes::siphash24::HashEngine impl core::marker::Sync for bitcoin_hashes::siphash24::State impl core::marker::Unpin for bitcoin_hashes::FromSliceError impl core::marker::Unpin for bitcoin_hashes::hash160::Hash +impl core::marker::Unpin for bitcoin_hashes::hkdf::MaxLengthError impl core::marker::Unpin for bitcoin_hashes::ripemd160::Hash impl core::marker::Unpin for bitcoin_hashes::ripemd160::HashEngine impl core::marker::Unpin for bitcoin_hashes::sha1::Hash @@ -290,6 +301,7 @@ impl core::marker::Unpin for bitcoin_hashes::siphash24::HashEngine impl core::marker::Unpin for bitcoin_hashes::siphash24::State impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::FromSliceError impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hash160::Hash +impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hkdf::MaxLengthError impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::ripemd160::Hash impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::ripemd160::HashEngine impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::sha1::Hash @@ -309,6 +321,7 @@ impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::siphash24::Hash impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::siphash24::State impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::FromSliceError impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hash160::Hash +impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hkdf::MaxLengthError impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::ripemd160::Hash impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::ripemd160::HashEngine impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::sha1::Hash @@ -351,6 +364,7 @@ impl> core::ops::index::Index for bit impl core::str::traits::FromStr for bitcoin_hashes::hmac::Hmac impl bitcoin_hashes::Hash for bitcoin_hashes::hmac::Hmac impl bitcoin_hashes::HashEngine for bitcoin_hashes::hmac::HmacEngine +impl bitcoin_hashes::hkdf::Hkdf impl bitcoin_hashes::hmac::HmacEngine impl core::convert::AsRef<[u8]> for bitcoin_hashes::hmac::Hmac impl core::default::Default for bitcoin_hashes::hmac::HmacEngine @@ -384,26 +398,32 @@ impl core::cmp::PartialEq for bi impl core::cmp::PartialOrd for bitcoin_hashes::hmac::Hmac impl core::hash::Hash for bitcoin_hashes::hmac::Hmac impl core::marker::Copy for bitcoin_hashes::hmac::Hmac +impl core::marker::Freeze for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::Hmac where T: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Freeze impl core::marker::Freeze for bitcoin_hashes::sha256t::Hash +impl core::marker::Send for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::Hmac where T: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Send impl core::marker::Send for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Send impl core::marker::Send for bitcoin_hashes::sha256t::Hash where T: core::marker::Send +impl core::marker::Sync for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::Hmac where T: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Sync impl core::marker::Sync for bitcoin_hashes::sha256t::Hash where T: core::marker::Sync +impl core::marker::Unpin for bitcoin_hashes::hkdf::Hkdf where T: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::Hmac where T: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::marker::Unpin impl core::marker::Unpin for bitcoin_hashes::sha256t::Hash where T: core::marker::Unpin +impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hkdf::Hkdf where T: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::Hmac where T: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::panic::unwind_safe::RefUnwindSafe impl core::panic::unwind_safe::RefUnwindSafe for bitcoin_hashes::sha256t::Hash where T: core::panic::unwind_safe::RefUnwindSafe +impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hkdf::Hkdf where T: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::Hmac where T: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::HmacEngine where ::Engine: core::panic::unwind_safe::UnwindSafe impl core::panic::unwind_safe::UnwindSafe for bitcoin_hashes::hmac::HmacMidState where <::Engine as bitcoin_hashes::HashEngine>::MidState: core::panic::unwind_safe::UnwindSafe @@ -486,6 +506,11 @@ pub fn bitcoin_hashes::hash160::Hash::hash<__H: core::hash::Hasher>(&self, state pub fn bitcoin_hashes::hash160::Hash::index(&self, index: I) -> &Self::Output pub fn bitcoin_hashes::hash160::Hash::partial_cmp(&self, other: &bitcoin_hashes::hash160::Hash) -> core::option::Option pub fn bitcoin_hashes::hash160::Hash::to_byte_array(self) -> Self::Bytes +pub fn bitcoin_hashes::hkdf::Hkdf::expand(&self, info: &[u8], okm: &mut [u8]) -> core::result::Result<(), bitcoin_hashes::hkdf::MaxLengthError> +pub fn bitcoin_hashes::hkdf::Hkdf::new(salt: &[u8], ikm: &[u8]) -> Self +pub fn bitcoin_hashes::hkdf::MaxLengthError::clone(&self) -> bitcoin_hashes::hkdf::MaxLengthError +pub fn bitcoin_hashes::hkdf::MaxLengthError::eq(&self, other: &bitcoin_hashes::hkdf::MaxLengthError) -> bool +pub fn bitcoin_hashes::hkdf::MaxLengthError::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result pub fn bitcoin_hashes::hmac::Hmac::all_zeros() -> Self pub fn bitcoin_hashes::hmac::Hmac::as_byte_array(&self) -> &Self::Bytes pub fn bitcoin_hashes::hmac::Hmac::as_ref(&self) -> &[u8] @@ -757,6 +782,7 @@ pub macro bitcoin_hashes::sha256t_hash_newtype! pub mod bitcoin_hashes pub mod bitcoin_hashes::cmp pub mod bitcoin_hashes::hash160 +pub mod bitcoin_hashes::hkdf pub mod bitcoin_hashes::hmac pub mod bitcoin_hashes::ripemd160 pub mod bitcoin_hashes::serde_macros @@ -770,6 +796,8 @@ pub mod bitcoin_hashes::sha512_256 pub mod bitcoin_hashes::siphash24 pub struct bitcoin_hashes::FromSliceError pub struct bitcoin_hashes::HmacEngine +pub struct bitcoin_hashes::hkdf::Hkdf +pub struct bitcoin_hashes::hkdf::MaxLengthError pub struct bitcoin_hashes::hmac::HmacEngine pub struct bitcoin_hashes::hmac::HmacMidState pub struct bitcoin_hashes::ripemd160::HashEngine