diff --git a/Cargo.lock b/Cargo.lock index b5661e6..8143cc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -415,9 +415,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" dependencies = [ "aws-lc-sys", "untrusted 0.7.1", @@ -426,9 +426,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" dependencies = [ "cc", "cmake", @@ -849,9 +849,9 @@ checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "deflate64" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "807800ff3288b621186fe0a8f3392c4652068257302709c24efd918c3dffcdc2" +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" [[package]] name = "deltae" @@ -997,9 +997,9 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.13" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" dependencies = [ "num-traits", ] @@ -1783,9 +1783,9 @@ dependencies = [ [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" dependencies = [ "memchr", "serde", @@ -1821,9 +1821,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jni" @@ -1834,7 +1834,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -1843,9 +1843,31 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "jobserver" @@ -2156,9 +2178,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -3128,9 +3150,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "aws-lc-rs", "ring", @@ -3743,9 +3765,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" dependencies = [ "futures-util", "log", @@ -3854,7 +3876,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ttp-core" version = "0.1.0" -source = "git+https://github.com/t3kkm0tt/TTP.git#8a3cd5cea756d62e7f85824ebfa1e64c7594c7de" +source = "git+https://github.com/Tensamin/TTP.git#7e46b440f847e8bf1ad1ce21932ce33a275dfcd1" dependencies = [ "base64", "byteorder", @@ -3866,7 +3888,7 @@ dependencies = [ [[package]] name = "ttp-native" version = "0.1.0" -source = "git+https://github.com/t3kkm0tt/TTP.git#8a3cd5cea756d62e7f85824ebfa1e64c7594c7de" +source = "git+https://github.com/Tensamin/TTP.git#7e46b440f847e8bf1ad1ce21932ce33a275dfcd1" dependencies = [ "quinn", "rustls", @@ -3879,9 +3901,9 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" dependencies = [ "bytes", "data-encoding", @@ -3892,7 +3914,6 @@ dependencies = [ "rand 0.9.2", "sha1", "thiserror 2.0.18", - "utf-8", ] [[package]] @@ -3921,9 +3942,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "da36089a805484bcccfffe0739803392c8298778a2d2f09febf76fac5ad9025b" [[package]] name = "unicode-truncate" @@ -3982,12 +4003,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -4881,18 +4896,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index d664f77..f3484e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,13 +9,13 @@ ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-nativ actix-web = { version = "4", features = ["rustls-0_23"] } actix-web-actors = "4" -aes-gcm = "*" +aes-gcm = "0.10.3" base64 = "0.22.1" crossterm = "*" futures = "*" futures-util = "*" hex = "*" -hkdf = "*" +hkdf = "0.12.4" hyper-util = { version = "*" } hyper = { version = "1.8.1", features = [ "capi", @@ -32,7 +32,7 @@ rand = "0.8" rand_core = { version = "0.6", features = ["getrandom", "std"] } reqwest = "0.13.2" rustls = { version = "0.23.37", features = ["aws-lc-rs"] } -sha2 = "*" +sha2 = "0.10.9" sysinfo = "0.38.3" tokio = { version = "1.50.0", features = ["full"] } tokio-tungstenite = { version = "*", features = ["native-tls"] } diff --git a/src/util/crypto_util.rs b/src/util/crypto_util.rs index db427e4..bb784e8 100644 --- a/src/util/crypto_util.rs +++ b/src/util/crypto_util.rs @@ -4,10 +4,10 @@ use aes_gcm::{ }; use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64_STD}; use hkdf::Hkdf; -use sha2::{Digest, Sha256}; +type HkdfSha256 = sha2::Sha256; +use sha2::{Digest, Sha256 as HashSha256}; use x448::{PublicKey, Secret}; -// --- Custom Errors --- #[derive(Debug)] #[allow(dead_code)] pub enum SecurePayloadError { @@ -18,7 +18,6 @@ pub enum SecurePayloadError { InvalidKeyLength, } -// --- Data Format Enum --- #[derive(Clone, Copy, Debug)] #[allow(dead_code)] pub enum DataFormat { @@ -27,11 +26,8 @@ pub enum DataFormat { Hex, } -// --- Main Class Structure --- pub struct SecurePayload { - /// The internal canonical representation is always raw bytes. inner_data: Vec, - /// The private key of the user associated with this payload instance. private_key: Secret, } @@ -46,7 +42,6 @@ impl Clone for SecurePayload { #[allow(dead_code)] impl SecurePayload { - /// Clear Constructor: Takes data in any format and the user's private key. pub fn new>( data: T, format: DataFormat, @@ -71,12 +66,10 @@ impl SecurePayload { }) } - /// Helper to get the public key associated with this instance's private key. pub fn get_public_key(&self) -> [u8; 56] { *PublicKey::from(&self.private_key).as_bytes() } - /// Exports the internal data to the requested format pub fn export(&self, format: DataFormat) -> String { match format.into() { DataFormat::Raw => String::from_utf8_lossy(&self.inner_data).to_string(), @@ -85,14 +78,12 @@ impl SecurePayload { } } - /// Access raw bytes directly pub fn get_bytes(&self) -> &[u8] { &self.inner_data } - /// Returns the SHA-256 Hash of the data in the requested format pub fn get_hash(&self, format: DataFormat) -> String { - let mut hasher = Sha256::new(); + let mut hasher = HashSha256::new(); hasher.update(&self.inner_data); let result = hasher.finalize(); @@ -103,8 +94,6 @@ impl SecurePayload { } } - /// Encrypts the held data for a specific recipient using AES-256-GCM. - /// The message will contain ONLY the ciphertext. pub fn encrypt_x448(&self, public_key: S) -> Result where S: Into, @@ -112,17 +101,15 @@ impl SecurePayload { let peer_pub = public_key.into(); let shared_secret = self.private_key.as_diffie_hellman(&peer_pub).unwrap(); - // 3. Key & Nonce Derivation (HKDF) - // We derive 32 bytes for the key and 12 bytes for a deterministic nonce. - let hkdf = Hkdf::::new(None, shared_secret.as_bytes()); - let mut okm = [0u8; 44]; // 32 (Key) + 12 (Nonce) + let hkdf = Hkdf::::new(None, shared_secret.as_bytes()); + let mut okm = [0u8; 44]; + hkdf.expand(b"x448-aes-gcm-no-overhead", &mut okm) .map_err(|_| SecurePayloadError::EncryptionError)?; let key = &okm[..32]; let nonce_bytes = &okm[32..]; - // 4. Encrypt with AES-256-GCM let cipher = Aes256Gcm::new(key.into()); let nonce = Nonce::from_slice(nonce_bytes); @@ -136,14 +123,12 @@ impl SecurePayload { ) .map_err(|_| SecurePayloadError::EncryptionError)?; - // 5. Result is ONLY the ciphertext. No key or nonce is packed. Ok(SecurePayload { inner_data: ciphertext, private_key: Secret::from_bytes(self.private_key.as_bytes()).unwrap(), }) } - /// Decrypts the held data providing the sender's public key manually. pub fn decrypt_to_format( &self, peer_public_key_bytes: &[u8; 56], @@ -154,7 +139,6 @@ impl SecurePayload { Ok(decrypted_instance.export(output_format)) } - /// Decrypts the held data using the internal Private Key and the provided Peer Public Key. pub fn decrypt_x448( &self, peer_public_key_bytes: S, @@ -162,12 +146,10 @@ impl SecurePayload { where S: Into, { - // 1. Perform Exchange let peer_pub = peer_public_key_bytes.into(); let shared_secret = self.private_key.as_diffie_hellman(&peer_pub).unwrap(); - // 2. Key & Nonce Derivation (Must match encryption exactly) - let hkdf = Hkdf::::new(None, shared_secret.as_bytes()); + let hkdf = Hkdf::::new(None, shared_secret.as_bytes()); let mut okm = [0u8; 44]; hkdf.expand(b"x448-aes-gcm-no-overhead", &mut okm) .map_err(|_| SecurePayloadError::DecryptionError)?; @@ -175,7 +157,6 @@ impl SecurePayload { let key = &okm[..32]; let nonce_bytes = &okm[32..]; - // 3. Decrypt with AES-256-GCM let cipher = Aes256Gcm::new(key.into()); let nonce = Nonce::from_slice(nonce_bytes);