1use openssl::x509::X509;
2use openssl::hash::{MessageDigest, DigestBytes, Hasher};
3use openssl::sign::Signer;
4use openssl::pkey::PKey;
5static KEY : &str = "c3eAd3eC3a7845dE98f73942b3d5f9c0";
6
7
8pub fn get_authorization<'a>(path: &str, date: &str) -> String {
9 let hmac_key = get_key();
10 let key = PKey::hmac(hmac_key.as_bytes()).unwrap();
11 let mut signer = Signer::new(MessageDigest::sha1(), &key).unwrap();
12
13 let digest = format!("{}{}", path, date);
14 let _ = signer.update(digest.as_bytes());
15
16 base64::encode(&signer.sign_to_vec().expect("Unable to sign"))
17}
18
19pub fn get_certificate_hash() -> String {
20 let cert = X509::from_der(
21 include_bytes!("../resources/ca_cert.crt")
22 ).expect("Invalid CA certificate");
23
24 let r : DigestBytes = cert.digest(MessageDigest::sha1()).expect("Digest");
25 base64::encode(&r)
26}
27
28pub fn retrieve_key(cert_hash: &str, key: &str) -> String {
29 let mut hasher : Hasher = Hasher::new(MessageDigest::sha256()).expect("Unable to initialize hasher");
30
31 let cleartext = format!("{}{}", cert_hash, key);
32 hasher.update(cleartext.as_bytes()).expect("Failed to update hasher");
33 let bytes = hasher.finish().expect("Unable to hash!");
34 hex::encode(bytes)
35}
36
37pub fn get_key() -> String {
38 retrieve_key(&get_certificate_hash(), KEY)
39}
40
41#[cfg(test)]
42mod test {
43 use crate::authenticator::{get_authorization, get_certificate_hash};
44
45 #[test]
46 fn url_1(){
47 let date = "2020-06-28";
48 let auth = "hL89gUidDebOUNUCP/+5vbj+0Iw=";
49 let path = "/unauth/fahrplanservice/v1/verbindungen/s/Z%25C3%25BCrich%2520HB/s/Bern/ab/2019-09-20/21-14/";
50
51 assert_eq!(get_authorization(path, date), auth);
52 }
53
54 #[test]
55 fn test_certificate_hash(){
56 assert_eq!("WdfnzdQugRFUF5b812hZl3lAahM=", get_certificate_hash());
57 }
58
59}
60