diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index c83b7a8..08b7e3d 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -11,14 +11,14 @@ env: jobs: msrv: - name: Verify MSRV (1.96) + name: Verify MSRV (1.99) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install Rust Toolchain (1.96) - uses: dtolnay/rust-toolchain@1.96.0 + - name: Install Rust Toolchain (1.99) + uses: dtolnay/rust-toolchain@1.99.0 - name: Check run: cargo check --all-features diff --git a/CHANGELOG.md b/CHANGELOG.md index 57a275f..8f3af78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.2.0] - 2026-10-08 + +### Changed + +- Migrated the `FingerprintView` implementation bodies (30 key views) and the custom-codec test builder from the removed `Builder::new_from_bytes` API to the streaming shape `Builder::new(codec)?` + `update(bytes)` + `output_len(32)` + `try_build()`. The value 32 preserves the 32-byte fingerprints multi-hash 1.x produced. Requirement `multi-hash` raised 1.1 → 2.0. The crate requires multi-hash 2.0.0, which declares `rust-version = "1.99"`. No public API changes. +- Raised `rust-version` from 1.96 to 1.99 and applied clippy 0.1.99 fixes. + ## [2.1.1] - 2026-10-07 ### Changed @@ -265,6 +272,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Major dependency updates: ed25519-dalek 3, blsful 4, elliptic-curve 0.14, vsss-rs 6, ssh-key 0.7. - Initial published release on crates.io as `multi-key`. +[2.2.0]: https://github.com/cryptidtech/multi-key/compare/v2.1.1...v2.2.0 [2.1.1]: https://github.com/cryptidtech/multi-key/compare/v2.1.0...v2.1.1 [2.1.0]: https://github.com/cryptidtech/multi-key/compare/v2.0.0...v2.1.0 [1.1.1]: https://github.com/cryptidtech/multi-key/compare/v1.1.0...v1.1.1 diff --git a/Cargo.toml b/Cargo.toml index ce01927..3bc4248 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "multi-key" -version = "2.1.1" +version = "2.2.0" edition = "2024" -rust-version = "1.96" +rust-version = "1.99" authors = ["Dave Grantham "] description = "Multikey self-describing cryptographic key data" repository = "https://github.com/cryptidtech/multi-key.git" @@ -52,11 +52,11 @@ mceliece348864 = { version = "1.0", optional = true } ml-dsa = "0.1.1" ml-kem = "0.3" multi-base = { version = "1.0", default-features = false } -multi-codec = "1.5" -multi-hash = "1.1" -multi-sig = "1.5" -multi-trait = { version = "1.0", default-features = false } -multi-util = "1.1" +multi-codec = "1.6" +multi-hash = "2.0" +multi-sig = "1.6" +multi-trait = { version = "1.1", default-features = false } +multi-util = "1.2" p256 = { version = "0.14", features = ["ecdsa", "ecdh"] } p384 = { version = "0.14", features = ["ecdsa", "ecdh"] } p521 = { version = "0.14", features = ["ecdsa", "ecdh"] } @@ -83,7 +83,7 @@ sntrup = "0.4.0" ssh-encoding = "0.3" subtle = "2" thiserror = { version = "2.0" } -typenum = "1.17" +typenum = "1.20" unsigned-varint = { version = "0.8", features = ["std"] } vsss-rs = "6.0" x25519-dalek = { version = "3.0", features = ["static_secrets", "getrandom"] } @@ -91,23 +91,23 @@ zeroize = "1" # Lamport support (feature-gated, default-enabled) lamport_signature_plus = { version = "0.5.0", optional = true } sha3 = { version = "0.12", optional = true } -blake2 = { version = "0.11.0-rc.6", optional = true } +blake2 = { version = "0.11.0", optional = true } shake = { version = "0.1", optional = true } # XMSS support (feature-gated, default-enabled) xmss = { version = "0.1.0-pre.0", optional = true } [target.'cfg(target_arch = "wasm32")'.dependencies] -blsful = { version = "4.0.0", default-features = false, features = ["rust"] } +blsful = { version = "4.1.0", default-features = false, features = ["rust"] } getrandom_02 = { package = "getrandom", version = "0.2", features = ["js"] } ssh-key = { version = "0.7.0-rc.11", default-features = false, features = ["alloc", "ecdsa", "ed25519", "p256", "p384", "p521"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -blsful = { version = "4.0.0", default-features = false, features = ["blst"] } +blsful = { version = "4.1.0", default-features = false, features = ["blst"] } ssh-key = { version = "0.7.0-rc.11", default-features = false, features = ["alloc", "ecdsa", "ed25519", "p256", "p384", "p521"] } [dev-dependencies] criterion = { version = "0.8", features = ["html_reports"] } -proptest = "1.4" +proptest = "1.11" serde_json = "1.0" serde_test = "1.0" diff --git a/src/error.rs b/src/error.rs index 02f3e0c..5372192 100644 --- a/src/error.rs +++ b/src/error.rs @@ -450,7 +450,7 @@ mod tests { #[test] fn test_error_display() { let err = Error::MissingSigil; - assert!(!err.to_string().is_empty()); + assert_ne!(err.to_string(), ""); } #[test] diff --git a/src/views/bls12381.rs b/src/views/bls12381.rs index e32c235..cf4dbbc 100644 --- a/src/views/bls12381.rs +++ b/src/views/bls12381.rs @@ -370,7 +370,10 @@ impl<'a> FingerprintView for View<'a> { kd.key_bytes()? }; // hash the key bytes using the given codec - Ok(mh::Builder::new_from_bytes(codec, bytes)?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes); + b.output_len(32); + Ok(b.try_build()?) } } } diff --git a/src/views/bls12381_g1_fndsa512.rs b/src/views/bls12381_g1_fndsa512.rs index dc5b2d4..09c6065 100644 --- a/src/views/bls12381_g1_fndsa512.rs +++ b/src/views/bls12381_g1_fndsa512.rs @@ -125,7 +125,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/bls12381_g1_mayo1.rs b/src/views/bls12381_g1_mayo1.rs index e96e3d1..c3da4c8 100644 --- a/src/views/bls12381_g1_mayo1.rs +++ b/src/views/bls12381_g1_mayo1.rs @@ -121,7 +121,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/bls12381_g1_mayo2.rs b/src/views/bls12381_g1_mayo2.rs index 027da65..c4f86f6 100644 --- a/src/views/bls12381_g1_mayo2.rs +++ b/src/views/bls12381_g1_mayo2.rs @@ -121,7 +121,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/bls12381_g1_mldsa65.rs b/src/views/bls12381_g1_mldsa65.rs index 066c48f..fee2c1f 100644 --- a/src/views/bls12381_g1_mldsa65.rs +++ b/src/views/bls12381_g1_mldsa65.rs @@ -132,7 +132,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/chacha20.rs b/src/views/chacha20.rs index a117ebb..085ca55 100644 --- a/src/views/chacha20.rs +++ b/src/views/chacha20.rs @@ -335,6 +335,9 @@ impl<'a> FingerprintView for View<'a> { kd.key_bytes()? }; // hash the key bytes using the given codec - Ok(mh::Builder::new_from_bytes(codec, bytes)?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/classic_mceliece.rs b/src/views/classic_mceliece.rs index 5c2ae80..74a42d1 100644 --- a/src/views/classic_mceliece.rs +++ b/src/views/classic_mceliece.rs @@ -141,7 +141,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } @@ -336,7 +339,7 @@ mod tests { .fingerprint(Codec::Sha3256) .unwrap(); let fp_bytes: Vec = fp.into(); - assert!(!fp_bytes.is_empty()); + assert_ne!(fp_bytes, Vec::::new()); } } diff --git a/src/views/ed25519.rs b/src/views/ed25519.rs index c5625ac..0ddcdd4 100644 --- a/src/views/ed25519.rs +++ b/src/views/ed25519.rs @@ -157,7 +157,10 @@ impl<'a> FingerprintView for View<'a> { kd.key_bytes()? }; // hash the key bytes using the given codec - Ok(mh::Builder::new_from_bytes(codec, bytes)?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes); + b.output_len(32); + Ok(b.try_build()?) } } } diff --git a/src/views/ed25519_fndsa512.rs b/src/views/ed25519_fndsa512.rs index b91389a..b722d9f 100644 --- a/src/views/ed25519_fndsa512.rs +++ b/src/views/ed25519_fndsa512.rs @@ -132,7 +132,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/ed25519_mayo2.rs b/src/views/ed25519_mayo2.rs index bc19210..b2dc238 100644 --- a/src/views/ed25519_mayo2.rs +++ b/src/views/ed25519_mayo2.rs @@ -131,7 +131,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } @@ -350,7 +353,7 @@ mod tests { let fp1_bytes: Vec = fp1.into(); let fp2_bytes: Vec = fp2.into(); assert_eq!(fp1_bytes, fp2_bytes); - assert!(!fp1_bytes.is_empty()); + assert_ne!(fp1_bytes, Vec::::new()); } #[test] diff --git a/src/views/ed25519_mldsa65.rs b/src/views/ed25519_mldsa65.rs index c37ec54..e4e1cbe 100644 --- a/src/views/ed25519_mldsa65.rs +++ b/src/views/ed25519_mldsa65.rs @@ -138,7 +138,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/fn_dsa.rs b/src/views/fn_dsa.rs index fa2f099..6208bcc 100644 --- a/src/views/fn_dsa.rs +++ b/src/views/fn_dsa.rs @@ -90,7 +90,10 @@ impl<'a> FingerprintView for View<'a> { kd.key_bytes()? }; // hash the key bytes using the given codec - Ok(mh::Builder::new_from_bytes(codec, bytes)?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes); + b.output_len(32); + Ok(b.try_build()?) } } } diff --git a/src/views/frodokem.rs b/src/views/frodokem.rs index 0414d22..7f57f4e 100644 --- a/src/views/frodokem.rs +++ b/src/views/frodokem.rs @@ -218,7 +218,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/lamport.rs b/src/views/lamport.rs index 0b5541e..42f7276 100644 --- a/src/views/lamport.rs +++ b/src/views/lamport.rs @@ -549,7 +549,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/lamport_merkle.rs b/src/views/lamport_merkle.rs index d2515b0..c85c5fb 100644 --- a/src/views/lamport_merkle.rs +++ b/src/views/lamport_merkle.rs @@ -636,7 +636,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/mayo.rs b/src/views/mayo.rs index 2d9b45e..ec3516b 100644 --- a/src/views/mayo.rs +++ b/src/views/mayo.rs @@ -246,7 +246,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/ml_dsa.rs b/src/views/ml_dsa.rs index 18ba475..2f9938e 100644 --- a/src/views/ml_dsa.rs +++ b/src/views/ml_dsa.rs @@ -231,7 +231,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/ml_kem.rs b/src/views/ml_kem.rs index 4426058..71cfb7f 100644 --- a/src/views/ml_kem.rs +++ b/src/views/ml_kem.rs @@ -144,7 +144,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } @@ -367,7 +370,7 @@ mod tests { .fingerprint(Codec::Sha3256) .unwrap(); let fp_bytes: Vec = fp.into(); - assert!(!fp_bytes.is_empty()); + assert_ne!(fp_bytes, Vec::::new()); } } diff --git a/src/views/nist_p.rs b/src/views/nist_p.rs index ef37da9..b1d6831 100644 --- a/src/views/nist_p.rs +++ b/src/views/nist_p.rs @@ -178,7 +178,10 @@ impl<'a> FingerprintView for View<'a> { let kd = dispatch_data_view(self.mk)?; kd.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, bytes)?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes); + b.output_len(32); + Ok(b.try_build()?) } } } diff --git a/src/views/rsa.rs b/src/views/rsa.rs index fd4bc0e..efe482b 100644 --- a/src/views/rsa.rs +++ b/src/views/rsa.rs @@ -237,7 +237,10 @@ impl<'a> FingerprintView for View<'a> { let kd = dispatch_data_view(self.mk)?; kd.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, bytes)?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes); + b.output_len(32); + Ok(b.try_build()?) } } } diff --git a/src/views/secp256k1.rs b/src/views/secp256k1.rs index 6042440..76772a1 100644 --- a/src/views/secp256k1.rs +++ b/src/views/secp256k1.rs @@ -172,7 +172,10 @@ impl<'a> FingerprintView for View<'a> { kd.key_bytes()? }; // hash the key bytes using the given codec - Ok(mh::Builder::new_from_bytes(codec, bytes)?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes); + b.output_len(32); + Ok(b.try_build()?) } } } diff --git a/src/views/slh_dsa.rs b/src/views/slh_dsa.rs index cf15d38..d3adf46 100644 --- a/src/views/slh_dsa.rs +++ b/src/views/slh_dsa.rs @@ -383,7 +383,10 @@ impl<'a> FingerprintView for View<'a> { return dispatch_fingerprint_view(&pk)?.fingerprint(codec); } let bytes = self.key_bytes()?; - Ok(mh::Builder::new_from_bytes(codec, bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/sntrup.rs b/src/views/sntrup.rs index 94d8611..e650221 100644 --- a/src/views/sntrup.rs +++ b/src/views/sntrup.rs @@ -293,7 +293,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } @@ -474,7 +477,7 @@ mod tests { .fingerprint(Codec::Sha3256) .unwrap(); let fp_bytes: Vec = fp.into(); - assert!(!fp_bytes.is_empty()); + assert_ne!(fp_bytes, Vec::::new()); } } diff --git a/src/views/threshold_meta.rs b/src/views/threshold_meta.rs index 1fd0a68..6da635c 100644 --- a/src/views/threshold_meta.rs +++ b/src/views/threshold_meta.rs @@ -329,7 +329,7 @@ mod tests { let encoded = mode.encode_into(); let (decoded, rest) = ThresholdDisclosure::try_decode_from(&encoded).unwrap(); assert_eq!(mode, decoded); - assert!(rest.is_empty()); + assert_eq!(rest.len(), 0); } } diff --git a/src/views/x25519.rs b/src/views/x25519.rs index 7d787b9..7096906 100644 --- a/src/views/x25519.rs +++ b/src/views/x25519.rs @@ -125,7 +125,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } @@ -328,7 +331,7 @@ mod tests { .fingerprint(Codec::Sha3256) .unwrap(); let fp_bytes: Vec = fp.into(); - assert!(!fp_bytes.is_empty()); + assert_ne!(fp_bytes, Vec::::new()); } #[test] diff --git a/src/views/x25519_frodokem640.rs b/src/views/x25519_frodokem640.rs index 94e473d..17adde1 100644 --- a/src/views/x25519_frodokem640.rs +++ b/src/views/x25519_frodokem640.rs @@ -209,7 +209,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/x25519_mceliece348864.rs b/src/views/x25519_mceliece348864.rs index bc04beb..76854f4 100644 --- a/src/views/x25519_mceliece348864.rs +++ b/src/views/x25519_mceliece348864.rs @@ -146,7 +146,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/x25519_mlkem768.rs b/src/views/x25519_mlkem768.rs index e8c8f96..0bdd668 100644 --- a/src/views/x25519_mlkem768.rs +++ b/src/views/x25519_mlkem768.rs @@ -141,7 +141,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } @@ -412,7 +415,7 @@ mod tests { .fingerprint(Codec::Sha3256) .unwrap(); let fp_bytes: Vec = fp.into(); - assert!(!fp_bytes.is_empty()); + assert_ne!(fp_bytes, Vec::::new()); } #[test] diff --git a/src/views/x25519_sntrup761.rs b/src/views/x25519_sntrup761.rs index a3378bb..fb0c626 100644 --- a/src/views/x25519_sntrup761.rs +++ b/src/views/x25519_sntrup761.rs @@ -156,7 +156,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } @@ -419,7 +422,7 @@ mod tests { .fingerprint(Codec::Sha3256) .unwrap(); let fp_bytes: Vec = fp.into(); - assert!(!fp_bytes.is_empty()); + assert_ne!(fp_bytes, Vec::::new()); } #[test] diff --git a/src/views/xeddsa.rs b/src/views/xeddsa.rs index 21f8efa..0843495 100644 --- a/src/views/xeddsa.rs +++ b/src/views/xeddsa.rs @@ -228,7 +228,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/src/views/xmss.rs b/src/views/xmss.rs index 2d8e2f9..c4cc52c 100644 --- a/src/views/xmss.rs +++ b/src/views/xmss.rs @@ -318,7 +318,10 @@ impl<'a> FingerprintView for View<'a> { } else { self.key_bytes()? }; - Ok(mh::Builder::new_from_bytes(codec, pub_bytes.as_slice())?.try_build()?) + let mut b = mh::Builder::new(codec)?; + b.update(pub_bytes.as_slice()); + b.output_len(32); + Ok(b.try_build()?) } } diff --git a/tests/custom_codec_tests.rs b/tests/custom_codec_tests.rs index cbbf6bd..8b5a580 100644 --- a/tests/custom_codec_tests.rs +++ b/tests/custom_codec_tests.rs @@ -119,7 +119,10 @@ struct CustomFingerprint { impl FingerprintView for CustomFingerprint { fn fingerprint(&self, hash: Codec) -> Result { - Ok(mh::Builder::new_from_bytes(hash, &self.key_bytes)?.try_build()?) + let mut b = mh::Builder::new(hash)?; + b.update(&self.key_bytes); + b.output_len(32); + Ok(b.try_build()?) } } @@ -376,10 +379,10 @@ fn test_custom_key_factory_dispatch() { .with_local_codec(Codec::Identity, fingerprint_factory) .build() .unwrap(); - let expected = mh::Builder::new_from_bytes(Codec::Blake2S256, b"custom-key-seed".as_slice()) - .unwrap() - .try_build() - .unwrap(); + let mut b = mh::Builder::new(Codec::Blake2S256).unwrap(); + b.update(b"custom-key-seed".as_slice()); + b.output_len(32); + let expected = b.try_build().unwrap(); assert_eq!(fp.fingerprint(Codec::Blake2S256).unwrap(), expected); }