From 0eb2f9f79cfacfe1cd341a1f21efeb557b41c574 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 28 Oct 2025 20:12:48 -0400 Subject: [PATCH] wip --- Cargo.lock | 68 +++++++++++++++++-- Cargo.toml | 1 + crates/api_clients/grok_client/Cargo.toml | 1 + .../generate_sign_for_new_conversation.rs | 46 ++++++++++++- 4 files changed, 109 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f7c008dd1e..d414b354f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1523,6 +1523,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.11.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ef36a6fcdb072aa548f3da057640ec10859eb4e91ddf526ee648d50c76a949" +dependencies = [ + "hybrid-array", +] + [[package]] name = "block-modes" version = "0.8.1" @@ -2088,7 +2097,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", + "crypto-common 0.1.6", "inout", ] @@ -2349,6 +2358,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dabb6555f92fb9ee4140454eb5dcd14c7960e1225c6d1a6cc361f032947713e" + [[package]] name = "const-random" version = "0.1.18" @@ -2657,6 +2672,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8235645834fbc6832939736ce2f2d08192652269e11010a6240f61b908a1c6" +dependencies = [ + "hybrid-array", +] + [[package]] name = "crypto-mac" version = "0.10.0" @@ -2960,7 +2984,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ - "const-oid", + "const-oid 0.9.6", "pem-rfc7468", "zeroize", ] @@ -3184,11 +3208,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid", - "crypto-common", + "const-oid 0.9.6", + "crypto-common 0.1.6", "subtle", ] +[[package]] +name = "digest" +version = "0.11.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac89f8a64533a9b0eaa73a68e424db0fb1fd6271c74cc0125336a05f090568d" +dependencies = [ + "block-buffer 0.11.0-rc.5", + "const-oid 0.10.1", + "crypto-common 0.2.0-rc.4", +] + [[package]] name = "diligent-date-parser" version = "0.1.4" @@ -4697,6 +4732,7 @@ dependencies = [ "scraper 0.24.0", "serde", "serde_json", + "sha2 0.11.0-rc.2", "test_data", "testing", "tokio", @@ -5160,6 +5196,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hybrid-array" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f471e0a81b2f90ffc0cb2f951ae04da57de8baa46fa99112b062a5173a5088d0" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "0.14.28" @@ -9225,7 +9270,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ - "const-oid", + "const-oid 0.9.6", "digest 0.10.7", "num-bigint-dig", "num-integer", @@ -10206,6 +10251,17 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha2" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.11.0-rc.3", +] + [[package]] name = "sha3" version = "0.10.8" @@ -13984,7 +14040,7 @@ dependencies = [ "cookie 0.18.1", "core-foundation-sys", "crossbeam-utils 0.8.20", - "crypto-common", + "crypto-common 0.1.6", "deranged", "derive_more 0.99.17", "digest 0.10.7", diff --git a/Cargo.toml b/Cargo.toml index dc8f9110aa..f0f1e68499 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -250,6 +250,7 @@ serde = { version = "1.0.219", features = ["derive"] } serde_derive = "1.0.219" serde_json = "1.0.140" serde_yaml = "0.9.34+deprecated" +sha2 = "0.11.0-rc.2" sha3 = "0.10.8" tauri = { version = "2.8.3", features = ["unstable", "devtools"] } # NB: "devtools" prevents App Store distribution; "ubstable" is needed for window access tauri-plugin-dialog = "2.3.3" diff --git a/crates/api_clients/grok_client/Cargo.toml b/crates/api_clients/grok_client/Cargo.toml index 4b4f2d0bc7..38fb3aa4b9 100644 --- a/crates/api_clients/grok_client/Cargo.toml +++ b/crates/api_clients/grok_client/Cargo.toml @@ -33,6 +33,7 @@ regex.workspace = true scraper = "0.24.0" serde.workspace = true serde_json.workspace = true +sha2.workspace = true tokio = { version = "1", features = ["full"] } url.workspace = true uuid.workspace = true diff --git a/crates/api_clients/grok_client/src/requests/index_page/signature/generate_sign_for_new_conversation.rs b/crates/api_clients/grok_client/src/requests/index_page/signature/generate_sign_for_new_conversation.rs index d55d6f476e..7a0c7ac39d 100644 --- a/crates/api_clients/grok_client/src/requests/index_page/signature/generate_sign_for_new_conversation.rs +++ b/crates/api_clients/grok_client/src/requests/index_page/signature/generate_sign_for_new_conversation.rs @@ -4,9 +4,10 @@ use base64::prelude::BASE64_STANDARD; use byteorder::{LittleEndian, WriteBytesExt}; use chrono::{TimeDelta, Utc}; use log::error; +use sha2::{Digest, Sha256}; use crate::error::grok_client_error::GrokClientError; use crate::requests::index_page::index_parsers::parse_index_verification_token::VerificationToken; - +use crate::requests::index_page::signature::signature_xs::signature_xs; /* xsid: str = Signature.generate_sign('/rest/app-chat/conversations/new', 'POST', self.verification_token, self.svg_data, self.numbers) @@ -46,6 +47,7 @@ pub struct GenerateSignArgs<'a> { pub svg_data: &'a str, + // "x_values" pub numbers: &'a [u8], } @@ -75,6 +77,48 @@ pub fn generate_sign(args: GenerateSignArgs<'_>) -> Result<(), GrokClientError> println!("r = {:?}", r); + // o = Signature.xs(r, svg, x_values) + let o = signature_xs(&r, &args.svg_data, &args.numbers)?; + + // generate_sign.o 4320e30fd70a3d70a3d7028f5c28f5c28f6028f5c28f5c28f60fd70a3d70a3d700 + println!("o = {:?}", o); + + //msg = "!".join([method, path, str(n)]) + "obfiowerehiring" + o + let method = args.method; + let path = args.path; + let msg = format!("{method}!{path}!{n}obfiowerehiring{o}"); + + // POST!/rest/app-chat/conversations/new!78721673obfiowerehiring4320e30fd70a3d70a3d7028f5c28f5c28f6028f5c28f5c28f60fd70a3d70a3d700 + println!("msg = {}", msg); + + + //digest = sha256(msg.encode('utf-8')).digest()[:16] + + let digest_all_bytes = Sha256::digest(msg.as_bytes()).to_vec(); + println!("digest_all_bytes = {:?}", digest_all_bytes); + + if digest_all_bytes.len() < 16 { + error!("Digest is too short: {}", digest_all_bytes.len()); + return Err(GrokClientError::BadSignatureInputs); + } + + let digest : &[u8] = &digest_all_bytes[.. 16]; + + println!("digest = {:?}", digest); + + //prefix_byte = int(floor(random() if not random_float else random_float * 256)) + let prefix_byte = 0; // NB: This is bad code? floor(random) = 0 always. + + //assembled = bytes([prefix_byte]) + r + t + digest + bytes([3]) + + let mut assembled = vec![prefix_byte]; + assembled.extend(r); + assembled.extend(t); + assembled.extend(digest); + assembled.extend([3]); + + println!("assembled = {:?}", assembled); + Ok(()) }