1extern crate hmac;
2
3use crate::hash::hmac::{Mac, NewMac};
4use crate::types::ToHex;
5use base64::encode;
6use hmac::Hmac;
7use sha2::Sha256;
8
9pub struct HashGenerator {}
10
11impl HashGenerator {
12 pub fn generate_hash(
13 api_key: &str,
14 secret_key: &str,
15 random_string: &str,
16 request_str: &str,
17 ) -> String {
18 let digest = sha1::Sha1::from(format!(
19 "{}{}{}{}",
20 api_key, random_string, secret_key, request_str
21 ))
22 .digest()
23 .bytes();
24 encode(&digest)
25 }
26}
27
28pub struct IyziAuthV2Generator {}
29
30impl IyziAuthV2Generator {
31 pub fn generate_auth_content(
32 uri: &str,
33 api_key: &str,
34 secret_key: &str,
35 random_string: &str,
36 request_str: &str,
37 ) -> String {
38 let input = format!(
39 "apiKey:{}&randomKey:{}&signature:{}",
40 api_key,
41 random_string,
42 Self::get_hmac_256_signature(uri, secret_key, random_string, request_str)
43 );
44 encode(&input)
45 }
46
47 fn get_hmac_256_signature(
48 uri: &str,
49 secret_key: &str,
50 random_string: &str,
51 request_str: &str,
52 ) -> String {
53 let mut hmac = Hmac::<Sha256>::new_varkey(secret_key.as_bytes()).unwrap();
54 let data_to_sign = format!(
55 "{}{}",
56 random_string,
57 IyziAuthV2Generator::get_payload(uri, request_str)
58 );
59 hmac.update(data_to_sign.as_bytes());
60 hmac.finalize().into_bytes().to_hex()
61 }
62
63 fn get_payload(uri: &str, request_str: &str) -> String {
64 let start_index: Option<usize> = uri.find("/v2");
65 let end_index: Option<usize> = uri.find("?");
66 let uri_path = if end_index.is_none() {
67 uri.chars().skip(start_index.unwrap()).collect::<String>()
68 } else {
69 uri.chars()
70 .skip(start_index.unwrap())
71 .take(end_index.unwrap() - start_index.unwrap())
72 .collect::<String>()
73 };
74 return if request_str.is_empty() {
75 uri_path
76 } else {
77 format!("{}{}", uri_path, request_str)
78 };
79 }
80}