1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use std::fmt::Debug;
use hmac::{Hmac, Mac};
use sha2::{Digest, Sha256, Sha512};
pub trait HttpSignature: Debug + Send + Sync + 'static {
fn name(&self) -> &str;
fn http_sign(&self, bytes_to_sign: &[u8]) -> String;
}
pub trait HttpDigest: Debug + Send + Sync + 'static {
fn name(&self) -> &str;
fn http_digest(&self, bytes_to_digest: &[u8]) -> String;
}
impl HttpSignature for Hmac<Sha256> {
fn name(&self) -> &str {
"hmac-sha256"
}
fn http_sign(&self, bytes_to_sign: &[u8]) -> String {
let mut mac = self.clone();
mac.input(bytes_to_sign);
base64::encode(&mac.result().code())
}
}
impl HttpDigest for Sha256 {
fn name(&self) -> &str {
"SHA-256"
}
fn http_digest(&self, bytes_to_digest: &[u8]) -> String {
base64::encode(&Self::digest(bytes_to_digest))
}
}
impl HttpDigest for Sha512 {
fn name(&self) -> &str {
"SHA-512"
}
fn http_digest(&self, bytes_to_digest: &[u8]) -> String {
base64::encode(&Self::digest(bytes_to_digest))
}
}