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
use std::time::SystemTime;

mod auth_header;
mod c_request;
mod keys;
mod string_to_sign;
mod util;
mod vocab;

pub use c_request::{ensure_header_order, ensure_query_order, split_url};
pub use keys::{signing_key, validate_key_id, validate_secret_key, Key};
pub use util::FormatTime;
pub use vocab::{AwsRegion, AwsService, Hash, HttpMethod, Signature};

pub fn gen_auth_header<'a>(
    buffer: &'a mut Vec<u8>,
    http_method: HttpMethod,
    abspath: &[u8],
    query: &[(&[u8], &[u8])],
    signed_headers: &[(&[u8], &[u8])],
    signing_key: &Key,
    key_id: &[u8; 20],
    region: AwsRegion,
    service: AwsService,
    request_time: SystemTime,
    key_date: SystemTime,
    payload_hash: &Hash,
) -> &'a [u8] {
    let offset = buffer.len();
    c_request::generate(
        buffer,
        http_method,
        abspath,
        query,
        signed_headers,
        payload_hash,
    );
    let c_request_hash = Hash::new(&buffer[offset..]);
    buffer.truncate(offset);
    string_to_sign::generate(
        buffer,
        request_time,
        key_date,
        region,
        service,
        &c_request_hash,
    );
    let signature = signing_key.sign(&buffer[offset..]);
    buffer.truncate(offset);
    auth_header::generate(
        buffer,
        signed_headers,
        key_date,
        region,
        service,
        key_id,
        &signature,
    );
    &buffer[offset..]
}