sbb_api/
authenticator.rs

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