mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-15 02:51:25 +00:00
Add Blake2b256 and Blake2s128 (#1386)
Signed-off-by: koushiro <koushiro.cqx@gmail.com> Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com>
This commit is contained in:
@ -29,11 +29,11 @@ pub enum Hash {
|
|||||||
Keccak512,
|
Keccak512,
|
||||||
/// BLAKE2b-512 (64-byte hash size)
|
/// BLAKE2b-512 (64-byte hash size)
|
||||||
Blake2b512,
|
Blake2b512,
|
||||||
/// Encoding unsupported
|
/// BLAKE2b-256 (32-byte hash size)
|
||||||
Blake2b256,
|
Blake2b256,
|
||||||
/// BLAKE2s-256 (32-byte hash size)
|
/// BLAKE2s-256 (32-byte hash size)
|
||||||
Blake2s256,
|
Blake2s256,
|
||||||
/// Encoding unsupported
|
/// BLAKE2s-128 (16-byte hash size)
|
||||||
Blake2s128,
|
Blake2s128,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,17 +8,18 @@
|
|||||||
mod errors;
|
mod errors;
|
||||||
mod hashes;
|
mod hashes;
|
||||||
|
|
||||||
|
use std::{convert::TryFrom, fmt::Write};
|
||||||
|
|
||||||
use bytes::{BufMut, Bytes, BytesMut};
|
use bytes::{BufMut, Bytes, BytesMut};
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
use sha2::Digest;
|
use sha2::digest::{self, VariableOutput};
|
||||||
use std::{convert::TryFrom, fmt::Write};
|
|
||||||
use unsigned_varint::{decode, encode};
|
use unsigned_varint::{decode, encode};
|
||||||
|
|
||||||
pub use self::errors::{DecodeError, DecodeOwnedError, EncodeError};
|
pub use self::errors::{DecodeError, DecodeOwnedError, EncodeError};
|
||||||
pub use self::hashes::Hash;
|
pub use self::hashes::Hash;
|
||||||
|
|
||||||
/// Helper function for encoding input into output using given `Digest`
|
/// Helper function for encoding input into output using given `Digest`
|
||||||
fn digest_encode<D: Digest>(input: &[u8], output: &mut [u8]) {
|
fn digest_encode<D: digest::Digest>(input: &[u8], output: &mut [u8]) {
|
||||||
output.copy_from_slice(&D::digest(input))
|
output.copy_from_slice(&D::digest(input))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,7 +92,9 @@ pub fn encode(hash: Hash, input: &[u8]) -> Result<Multihash, EncodeError> {
|
|||||||
Keccak384 => sha3::Keccak384,
|
Keccak384 => sha3::Keccak384,
|
||||||
Keccak512 => sha3::Keccak512,
|
Keccak512 => sha3::Keccak512,
|
||||||
Blake2b512 => blake2::Blake2b,
|
Blake2b512 => blake2::Blake2b,
|
||||||
|
Blake2b256 => Blake2b256,
|
||||||
Blake2s256 => blake2::Blake2s,
|
Blake2s256 => blake2::Blake2s,
|
||||||
|
Blake2s128 => Blake2s128,
|
||||||
});
|
});
|
||||||
Ok(Multihash {
|
Ok(Multihash {
|
||||||
bytes: output.freeze(),
|
bytes: output.freeze(),
|
||||||
@ -115,6 +118,76 @@ fn encode_hash(hash: Hash) -> (usize, BytesMut) {
|
|||||||
(code.len() + 1, output)
|
(code.len() + 1, output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// BLAKE2b-256 (32-byte hash size)
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
struct Blake2b256(blake2::VarBlake2b);
|
||||||
|
|
||||||
|
impl Default for Blake2b256 {
|
||||||
|
fn default() -> Self {
|
||||||
|
Blake2b256(blake2::VarBlake2b::new(32).unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl digest::Input for Blake2b256 {
|
||||||
|
fn input<B: AsRef<[u8]>>(&mut self, data: B) {
|
||||||
|
self.0.input(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl digest::FixedOutput for Blake2b256 {
|
||||||
|
type OutputSize = digest::generic_array::typenum::U32;
|
||||||
|
|
||||||
|
fn fixed_result(self) -> digest::generic_array::GenericArray<u8, Self::OutputSize> {
|
||||||
|
let mut out = digest::generic_array::GenericArray::default();
|
||||||
|
self.0.variable_result(|slice| {
|
||||||
|
assert_eq!(slice.len(), 32);
|
||||||
|
out.copy_from_slice(slice)
|
||||||
|
});
|
||||||
|
out
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl digest::Reset for Blake2b256 {
|
||||||
|
fn reset(&mut self) {
|
||||||
|
self.0.reset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// BLAKE2s-128 (16-byte hash size)
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
struct Blake2s128(blake2::VarBlake2s);
|
||||||
|
|
||||||
|
impl Default for Blake2s128 {
|
||||||
|
fn default() -> Self {
|
||||||
|
Blake2s128(blake2::VarBlake2s::new(16).unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl digest::Input for Blake2s128 {
|
||||||
|
fn input<B: AsRef<[u8]>>(&mut self, data: B) {
|
||||||
|
self.0.input(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl digest::FixedOutput for Blake2s128 {
|
||||||
|
type OutputSize = digest::generic_array::typenum::U16;
|
||||||
|
|
||||||
|
fn fixed_result(self) -> digest::generic_array::GenericArray<u8, Self::OutputSize> {
|
||||||
|
let mut out = digest::generic_array::GenericArray::default();
|
||||||
|
self.0.variable_result(|slice| {
|
||||||
|
assert_eq!(slice.len(), 16);
|
||||||
|
out.copy_from_slice(slice)
|
||||||
|
});
|
||||||
|
out
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl digest::Reset for Blake2s128 {
|
||||||
|
fn reset(&mut self) {
|
||||||
|
self.0.reset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Represents a valid multihash.
|
/// Represents a valid multihash.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
pub struct Multihash { bytes: Bytes }
|
pub struct Multihash { bytes: Bytes }
|
||||||
@ -194,7 +267,7 @@ impl<'a> MultihashRef<'a> {
|
|||||||
/// Creates a `MultihashRef` from the given `input`.
|
/// Creates a `MultihashRef` from the given `input`.
|
||||||
pub fn from_slice(input: &'a [u8]) -> Result<Self, DecodeError> {
|
pub fn from_slice(input: &'a [u8]) -> Result<Self, DecodeError> {
|
||||||
if input.is_empty() {
|
if input.is_empty() {
|
||||||
return Err(DecodeError::BadInputLength)
|
return Err(DecodeError::BadInputLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure `Hash::code` returns a `u16` so that our `decode::u16` here is correct.
|
// Ensure `Hash::code` returns a `u16` so that our `decode::u16` here is correct.
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
use parity_multihash::*;
|
use parity_multihash::*;
|
||||||
|
|
||||||
/// Helper function to convert a hex-encoded byte array back into a bytearray
|
/// Helper function to convert a hex-encoded byte array back into a bytearray
|
||||||
@ -41,7 +39,9 @@ fn multihash_encode() {
|
|||||||
Keccak384, b"hello world", "1C3065fc99339a2a40e99d3c40d695b22f278853ca0f925cde4254bcae5e22ece47e6441f91b6568425adc9d95b0072eb49f";
|
Keccak384, b"hello world", "1C3065fc99339a2a40e99d3c40d695b22f278853ca0f925cde4254bcae5e22ece47e6441f91b6568425adc9d95b0072eb49f";
|
||||||
Keccak512, b"hello world", "1D403ee2b40047b8060f68c67242175660f4174d0af5c01d47168ec20ed619b0b7c42181f40aa1046f39e2ef9efc6910782a998e0013d172458957957fac9405b67d";
|
Keccak512, b"hello world", "1D403ee2b40047b8060f68c67242175660f4174d0af5c01d47168ec20ed619b0b7c42181f40aa1046f39e2ef9efc6910782a998e0013d172458957957fac9405b67d";
|
||||||
Blake2b512, b"hello world", "c0e40240021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbcc05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0";
|
Blake2b512, b"hello world", "c0e40240021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbcc05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0";
|
||||||
|
Blake2b256, b"hello world", "a0e40220256c83b297114d201b30179f3f0ef0cace9783622da5974326b436178aeef610";
|
||||||
Blake2s256, b"hello world", "e0e402209aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b";
|
Blake2s256, b"hello world", "e0e402209aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b";
|
||||||
|
Blake2s128, b"hello world", "d0e4021037deae0226c30da2ab424a7b8ee14e83";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +74,9 @@ fn assert_decode() {
|
|||||||
Keccak384, "1C3065fc99339a2a40e99d3c40d695b22f278853ca0f925cde4254bcae5e22ece47e6441f91b6568425adc9d95b0072eb49f";
|
Keccak384, "1C3065fc99339a2a40e99d3c40d695b22f278853ca0f925cde4254bcae5e22ece47e6441f91b6568425adc9d95b0072eb49f";
|
||||||
Keccak512, "1D403ee2b40047b8060f68c67242175660f4174d0af5c01d47168ec20ed619b0b7c42181f40aa1046f39e2ef9efc6910782a998e0013d172458957957fac9405b67d";
|
Keccak512, "1D403ee2b40047b8060f68c67242175660f4174d0af5c01d47168ec20ed619b0b7c42181f40aa1046f39e2ef9efc6910782a998e0013d172458957957fac9405b67d";
|
||||||
Blake2b512, "c0e40240021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbcc05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0";
|
Blake2b512, "c0e40240021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbcc05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0";
|
||||||
|
Blake2b256, "a0e40220256c83b297114d201b30179f3f0ef0cace9783622da5974326b436178aeef610";
|
||||||
Blake2s256, "e0e402209aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b";
|
Blake2s256, "e0e402209aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b";
|
||||||
|
Blake2s128, "d0e4021037deae0226c30da2ab424a7b8ee14e83";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user