From e06b33a0cb202c20cba5e45554ea29bd4a33a686 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Mon, 25 Aug 2025 21:01:34 -0700 Subject: [PATCH 1/2] publish: use same function as app store to compute keccak256 --- Cargo.toml | 1 + src/publish/mod.rs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bf621739..3d59a2f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ semver = "1.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" sha2 = "0.10.8" +sha3 = "0.10.8" syn = { version = "2.0", features = ["full", "visit", "parsing", "extra-traits"] } thiserror = "1.0" tokio = { version = "1.28", features = [ diff --git a/src/publish/mod.rs b/src/publish/mod.rs index 216bfa6c..5b114936 100644 --- a/src/publish/mod.rs +++ b/src/publish/mod.rs @@ -99,8 +99,16 @@ pub fn make_remote_link(url: &str, text: &str) -> String { #[instrument(level = "trace", skip_all)] fn calculate_metadata_hash(package_dir: &Path) -> Result { let metadata_text = fs::read_to_string(package_dir.join("metadata.json"))?; - let hash = keccak256(metadata_text.as_bytes()); - Ok(format!("0x{}", hex::encode(hash))) + let hash = keccak_256_hash(metadata_text.as_bytes()); + Ok(hash) +} + +/// generate a Keccak-256 hash string (with 0x prefix) of the metadata bytes +pub fn keccak_256_hash(bytes: &[u8]) -> String { + use sha3::{Digest, Keccak256}; + let mut hasher = Keccak256::new(); + hasher.update(bytes); + format!("0x{:x}", hasher.finalize()) } #[instrument(level = "trace", skip_all)] From 2865796d6b7b31ad935db6bf99a2c1a5bd731db1 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Mon, 25 Aug 2025 21:45:17 -0700 Subject: [PATCH 2/2] publish: add newline if none is there --- src/publish/mod.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/publish/mod.rs b/src/publish/mod.rs index 5b114936..e09a0fa2 100644 --- a/src/publish/mod.rs +++ b/src/publish/mod.rs @@ -98,7 +98,10 @@ pub fn make_remote_link(url: &str, text: &str) -> String { #[instrument(level = "trace", skip_all)] fn calculate_metadata_hash(package_dir: &Path) -> Result { - let metadata_text = fs::read_to_string(package_dir.join("metadata.json"))?; + let mut metadata_text = fs::read_to_string(package_dir.join("metadata.json"))?; + if !metadata_text.ends_with('\n') { + metadata_text.push('\n'); + } let hash = keccak_256_hash(metadata_text.as_bytes()); Ok(hash) }