From 5714d4a3f9fc08f771538e038fed49a4dffb69ce Mon Sep 17 00:00:00 2001 From: Russell Banks <74878137+russellbanks@users.noreply.github.com> Date: Wed, 30 Oct 2024 13:46:59 +0000 Subject: [PATCH] Chain update Sha256 one UTF16 char at a time --- Cargo.toml | 2 +- src/lib.rs | 22 ++++++++++++---------- src/publisher_id.rs | 2 +- src/serde.rs | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 015da9c..d8351e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "package-family-name" -version = "2.0.0" +version = "2.0.1" edition = "2021" license = "MIT OR Apache-2.0" categories = ["no-std"] diff --git a/src/lib.rs b/src/lib.rs index 4bd0609..a7d2ab0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,12 +23,6 @@ pub struct PackageFamilyName { publisher_id: PublisherId, } -impl fmt::Display for PackageFamilyName { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}_{}", self.identity_name, self.publisher_id) - } -} - impl PackageFamilyName { pub fn new(identity_name: &str, identity_publisher: &str) -> Self { PackageFamilyName { @@ -38,18 +32,25 @@ impl PackageFamilyName { } pub fn get_id(identity_publisher: &str) -> PublisherId { + const HASH_TRUNCATION_LENGTH: usize = 8; + let publisher_sha_256 = identity_publisher .encode_utf16() - .flat_map(u16::to_le_bytes) - .fold(Sha256::new(), |buf, byte| buf.chain_update([byte])) + .fold(Sha256::new(), |hasher, char| hasher.chain_update(char.to_le_bytes())) .finalize(); - let crockford_encoded = CROCKFORD_LOWER.encode(&publisher_sha_256[..8]); + let crockford_encoded = CROCKFORD_LOWER.encode(&publisher_sha_256[..HASH_TRUNCATION_LENGTH]); PublisherId(heapless::String::from_str(&crockford_encoded).unwrap()) } } +impl fmt::Display for PackageFamilyName { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}_{}", self.identity_name, self.publisher_id) + } +} + #[cfg(test)] mod tests { use alloc::string::ToString; @@ -61,6 +62,7 @@ mod tests { let package_family_name = PackageFamilyName::new("AppName", "Publisher Software"); assert_eq!(package_family_name.to_string(), "AppName_zj75k085cmj1a"); } + #[test] fn test_publisher_id() { let publisher_id = PackageFamilyName::get_id("Publisher Software"); @@ -71,6 +73,6 @@ mod tests { fn test_different_publishers() { let publisher_id1 = PackageFamilyName::get_id("Publisher Software"); let publisher_id2 = PackageFamilyName::get_id("Another Publisher"); - assert_ne!(publisher_id1.to_string(), publisher_id2.to_string()); + assert_ne!(publisher_id1, publisher_id2); } } diff --git a/src/publisher_id.rs b/src/publisher_id.rs index 0350bb2..06ae9db 100644 --- a/src/publisher_id.rs +++ b/src/publisher_id.rs @@ -21,7 +21,7 @@ impl FromStr for PublisherId { fn from_str(s: &str) -> Result { if s.len() != PUBLISHER_ID_LENGTH { - return Err("expected publisher id length of 13"); + return Err("Expected Publisher ID length of 13"); } Ok(PublisherId(heapless::String::from_str(s).unwrap())) } diff --git a/src/serde.rs b/src/serde.rs index 4ba24db..45db24e 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -5,7 +5,7 @@ use alloc::string::ToString; use core::str::FromStr; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -impl<'identity> Serialize for PackageFamilyName { +impl Serialize for PackageFamilyName { fn serialize(&self, serializer: S) -> Result where S: Serializer,