diff --git a/CHANGELOG.md b/CHANGELOG.md index 42e104d7af5..620f6bd27cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## **[Unreleased]** - [#1129](https://github.com/wasmerio/wasmer/pull/1129) Standard exception types for singlepass backend. +- [#1140](https://github.com/wasmerio/wasmer/pull/1140) Use [`blake3`](https://github.com/BLAKE3-team/BLAKE3) as default hashing algorithm for caching. ## 0.13.1 - 2020-01-16 - Fix bug in wapm related to the `package.wasmer_extra_flags` entry in the manifest diff --git a/Cargo.lock b/Cargo.lock index 4a6428a1ee8..02c8247d8ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,13 +69,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] -name = "blake2b_simd" -version = "0.5.10" +name = "blake3" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +checksum = "b8c90bf4a07dd0b816948d0915ba1b110e7ce54169797feb5b39d6139a0a81ca" dependencies = [ "arrayref", "arrayvec", + "cc", + "cfg-if", "constant_time_eq", ] @@ -555,9 +557,9 @@ dependencies = [ [[package]] name = "hex" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" +checksum = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" [[package]] name = "indexmap" @@ -1868,7 +1870,7 @@ name = "wasmer-runtime-core" version = "0.13.1" dependencies = [ "bincode", - "blake2b_simd", + "blake3", "cc", "digest", "errno", diff --git a/lib/runtime-core/Cargo.toml b/lib/runtime-core/Cargo.toml index 07115885883..7f07a9d2d77 100644 --- a/lib/runtime-core/Cargo.toml +++ b/lib/runtime-core/Cargo.toml @@ -13,11 +13,11 @@ edition = "2018" nix = "0.15" page_size = "0.4" wasmparser = "0.45.0" -parking_lot = "0.9" +parking_lot = "0.10.0" lazy_static = "1.4" errno = "0.2" libc = "0.2.60" -hex = "0.3" +hex = "0.4" smallvec = "0.6" bincode = "1.1" @@ -36,8 +36,8 @@ version = "1.0" version = "0.11" [dependencies.serde-bench] version = "0.0.7" -[dependencies.blake2b_simd] -version = "0.5" +[dependencies.blake3] +version = "0.1.0" [dependencies.digest] version = "0.8" @@ -45,7 +45,7 @@ version = "0.8" winapi = { version = "0.3", features = ["memoryapi"] } [build-dependencies] -blake2b_simd = "0.5" +blake3 = "0.1.0" rustc_version = "0.2" cc = "1.0" diff --git a/lib/runtime-core/build.rs b/lib/runtime-core/build.rs index 3a549e45fd4..6187b4fd15a 100644 --- a/lib/runtime-core/build.rs +++ b/lib/runtime-core/build.rs @@ -1,13 +1,12 @@ -use blake2b_simd::blake2bp; use std::{env, fs, io::Write, path::PathBuf}; const WASMER_VERSION: &'static str = env!("CARGO_PKG_VERSION"); fn main() { - let mut state = blake2bp::State::new(); - state.update(WASMER_VERSION.as_bytes()); + let mut hasher = blake3::Hasher::new(); + hasher.update(WASMER_VERSION.as_bytes()); - let hasher = state.finalize(); + let hasher = hasher.finalize(); let hash_string = hasher.to_hex().as_str().to_owned(); let crate_dir = env::var("OUT_DIR").unwrap(); diff --git a/lib/runtime-core/src/cache.rs b/lib/runtime-core/src/cache.rs index f753b94232e..76a058f8bbb 100644 --- a/lib/runtime-core/src/cache.rs +++ b/lib/runtime-core/src/cache.rs @@ -3,7 +3,6 @@ //! and loaded to allow skipping compilation and fast startup. use crate::{module::ModuleInfo, sys::Memory}; -use blake2b_simd::blake2bp; use std::{io, mem, slice}; /// Indicates the invalid type of invalid cache file @@ -46,10 +45,8 @@ impl From for Error { /// /// [`Cache`]: trait.Cache.html #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] -// WasmHash is made up of two 32 byte arrays instead of a 64 byte array -// because derive only works on fixed sized arrays size 32 or below -// TODO: fix this when this gets fixed by improved const generics -pub struct WasmHash([u8; 32], [u8; 32]); +// WasmHash is made up of a 32 byte array +pub struct WasmHash([u8; 32]); impl WasmHash { /// Hash a wasm module. @@ -58,18 +55,8 @@ impl WasmHash { /// This does no verification that the supplied data /// is, in fact, a wasm module. pub fn generate(wasm: &[u8]) -> Self { - let mut first_part = [0u8; 32]; - let mut second_part = [0u8; 32]; - - let mut state = blake2bp::State::new(); - state.update(wasm); - - let hasher = state.finalize(); - let generic_array = hasher.as_bytes(); - - first_part.copy_from_slice(&generic_array[0..32]); - second_part.copy_from_slice(&generic_array[32..64]); - WasmHash(first_part, second_part) + let hash = blake3::hash(wasm); + WasmHash(hash.into()) } /// Create the hexadecimal representation of the @@ -86,26 +73,20 @@ impl WasmHash { e )) })?; - if bytes.len() != 64 { + if bytes.len() != 32 { return Err(Error::DeserializeError( - "Prehashed keys must deserialze into exactly 64 bytes".to_string(), + "Prehashed keys must deserialze into exactly 32 bytes".to_string(), )); } use std::convert::TryInto; - Ok(WasmHash( - bytes[0..32].try_into().map_err(|e| { - Error::DeserializeError(format!("Could not get first 32 bytes: {}", e)) - })?, - bytes[32..64].try_into().map_err(|e| { - Error::DeserializeError(format!("Could not get last 32 bytes: {}", e)) - })?, - )) + Ok(WasmHash(bytes[0..32].try_into().map_err(|e| { + Error::DeserializeError(format!("Could not get first 32 bytes: {}", e)) + })?)) } - pub(crate) fn into_array(self) -> [u8; 64] { - let mut total = [0u8; 64]; + pub(crate) fn into_array(self) -> [u8; 32] { + let mut total = [0u8; 32]; total[0..32].copy_from_slice(&self.0); - total[32..64].copy_from_slice(&self.1); total } }