iyzipay_rust/
hash.rs

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}