From e0a19600c6daeedebe50a41b8be080389de60a2f Mon Sep 17 00:00:00 2001 From: Stanislav Stoyanov Date: Sun, 18 Aug 2024 19:27:08 +0200 Subject: [PATCH] hash to get tags, make tagging a feature --- Cargo.toml | 7 ++++++- README.md | 4 ++-- src/id.rs | 12 ------------ src/lib.rs | 12 ++++++++---- src/tag.rs | 3 +++ 5 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 src/tag.rs diff --git a/Cargo.toml b/Cargo.toml index 0ac0b02..0f078e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,12 +13,14 @@ keywords = ["sql", "id", "encode", "obfuscate"] categories = ["cryptography", "encoding", "no-std"] [features] -default = ["std"] +default = ["std", "tag"] std = [] +tag = ["dep:const-fnv1a-hash"] zeroize = ["aes/zeroize"] [dependencies] aes = "0.8.4" +const-fnv1a-hash = { version = "1.1.0", optional = true } [dev-dependencies] prop-test = "0.1.1" @@ -28,3 +30,6 @@ opt-level = 3 [profile.test.package.rand_chacha] opt-level = 3 + +[package.metadata."docs.rs"] +all-features = true diff --git a/README.md b/README.md index 5ad44be..7279ecb 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,8 @@ let cipher = Aes128::new(&key.into()); let user_id = UserId::new(1, &cipher); let crate_id = CrateId::new(1, &cipher); -assert_eq!("mC67zUocKZHWRXCHBr4aj52", &user_id.to_string()); -assert_eq!("oPnmjU48WRy4GNradtqYdX2", &crate_id.to_string()); +assert_eq!("qXfXkNN9ReZCGXu3qi28xC2", &user_id.to_string()); +assert_eq!("VgtE1tzjDEHnjd3fh3PwiT2", &crate_id.to_string()); ``` # Comparison diff --git a/src/id.rs b/src/id.rs index 3877ab4..254d40e 100644 --- a/src/id.rs +++ b/src/id.rs @@ -14,18 +14,6 @@ use crate::{ #[derive(Clone, Copy, PartialEq, Eq)] pub struct Id(u128); -pub const fn tag(tag: &str) -> u64 { - assert!(tag.len() <= 8, "tag is too long"); - let mut byte_block = [0; 8]; - let tag = tag.as_bytes(); - let mut i = 0; - while i < tag.len() { - byte_block[i] = tag[i]; - i += 1; - } - u64::from_be_bytes(byte_block) -} - impl Id { pub fn new(id: i64, cipher: &Aes128) -> Self { Self(encrypt(TAG, id, cipher)) diff --git a/src/lib.rs b/src/lib.rs index f0601ff..12754cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,11 +10,15 @@ mod encryption; mod error; mod id; +#[cfg(feature = "tag")] +mod tag; + pub use aes; -pub use self::{ - error::Error, - id::{tag, Id}, -}; +pub use error::Error; +pub use id::Id; + +#[cfg(feature = "tag")] +pub use tag::tag; pub type Result = core::result::Result; diff --git a/src/tag.rs b/src/tag.rs new file mode 100644 index 0000000..92ee395 --- /dev/null +++ b/src/tag.rs @@ -0,0 +1,3 @@ +pub const fn tag(tag: &str) -> u64 { + const_fnv1a_hash::fnv1a_hash_str_64(tag) +}