talk_api_internal/auth/xvc/
default.rs

1use sha2::{Digest, Sha512};
2
3use super::XvcHasher;
4
5/// Default xvc hasher uses win32 platform client format.
6///
7/// Format: sha512("{first_seed}|{user_agent}|{second_seed}|{email}|{device_uuid}")
8#[derive(Debug, Clone, Copy)]
9pub struct Win32XVCHasher<'a>(pub &'a str, pub &'a str);
10
11impl XvcHasher for Win32XVCHasher<'_> {
12    fn full_xvc_hash(&self, device_uuid: &str, user_agent: &str, email: &str) -> Vec<u8> {
13        let mut hasher = Sha512::new();
14
15        hasher.update(self.0);
16        hasher.update("|");
17        hasher.update(user_agent);
18        hasher.update("|");
19        hasher.update(self.1);
20        hasher.update("|");
21        hasher.update(email);
22        hasher.update("|");
23        hasher.update(device_uuid);
24
25        hasher.finalize().to_vec()
26    }
27}
28
29/// Default xvc hasher uses android subdevice platform client format.
30///
31/// Format: sha512("{first_seed}|{user_agent}|{second_seed}|{email}|{third_seed}")
32#[derive(Debug, Clone, Copy)]
33pub struct AndroidSubXVCHasher<'a>(pub &'a str, pub &'a str, pub &'a str);
34
35impl XvcHasher for AndroidSubXVCHasher<'_> {
36    fn full_xvc_hash(&self, _: &str, user_agent: &str, email: &str) -> Vec<u8> {
37        let mut hasher = Sha512::new();
38
39        hasher.update(self.0);
40        hasher.update("|");
41        hasher.update(user_agent);
42        hasher.update("|");
43        hasher.update(self.1);
44        hasher.update("|");
45        hasher.update(email);
46        hasher.update("|");
47        hasher.update(self.2);
48
49        hasher.finalize().to_vec()
50    }
51}