#![cfg(any(feature = "s3-compat", feature = "qiniu-kodo"))]
use sz_orm_storage::signing;
#[test]
fn test_hmac_sha256_rfc4231_case1() {
let key = [0x0bu8; 20];
let mac = signing::compute_hmac_sha256(&key, b"Hi There");
assert_eq!(
hex::encode(&mac),
"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
);
}
#[test]
fn test_hmac_sha256_rfc4231_case2() {
let key = b"Jefe";
let mac = signing::compute_hmac_sha256(key, b"what do ya want for nothing?");
assert_eq!(
hex::encode(&mac),
"5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"
);
}
#[test]
fn test_hmac_sha256_rfc4231_case4() {
let key: Vec<u8> = (1..=25u8).collect();
let data = vec![0xcdu8; 50];
let mac = signing::compute_hmac_sha256(&key, &data);
assert_eq!(
hex::encode(&mac),
"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b"
);
}
#[test]
fn test_hex_hmac_sha256_returns_hex_string() {
let key = [0x0bu8; 20];
let hex_mac = signing::hex_hmac_sha256(&key, b"Hi There");
assert_eq!(
hex_mac,
"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
);
}
#[test]
fn test_sha256_empty_string() {
assert_eq!(
signing::hex_sha256(b""),
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
);
}
#[test]
fn test_sha256_abc() {
assert_eq!(
signing::hex_sha256(b"abc"),
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
);
}
#[test]
fn test_sha256_long_message() {
assert_eq!(
signing::hex_sha256(b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"),
"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"
);
}
#[test]
fn test_derive_signing_key_aws_doc_example_iam() {
let key = signing::derive_signing_key(
"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY",
"20150830",
"us-east-1",
"iam",
);
assert_eq!(
hex::encode(key),
"c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9"
);
}
#[test]
fn test_derive_signing_key_aws_doc_example_s3() {
let key = signing::derive_signing_key(
"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY",
"20130524",
"us-east-1",
"s3",
);
assert_eq!(key.len(), 32);
let key2 = signing::derive_signing_key(
"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY",
"20130524",
"us-east-1",
"s3",
);
assert_eq!(key, key2);
}
#[test]
fn test_derive_signing_key_different_inputs_produce_different_keys() {
let key1 = signing::derive_signing_key("secret1", "20260101", "us-east-1", "s3");
let key2 = signing::derive_signing_key("secret2", "20260101", "us-east-1", "s3");
assert_ne!(key1, key2);
let key3 = signing::derive_signing_key("secret1", "20260102", "us-east-1", "s3");
assert_ne!(key1, key3);
let key4 = signing::derive_signing_key("secret1", "20260101", "us-west-2", "s3");
assert_ne!(key1, key4);
let key5 = signing::derive_signing_key("secret1", "20260101", "us-east-1", "iam");
assert_ne!(key1, key5);
}
#[test]
fn test_utc_now_components_format() {
let (date_stamp, amz_date) = signing::utc_now_components();
assert_eq!(
date_stamp.len(),
8,
"date_stamp should be 8 chars: {}",
date_stamp
);
assert_eq!(
amz_date.len(),
16,
"amz_date should be 16 chars: {}",
amz_date
);
assert!(
amz_date.starts_with(&date_stamp),
"amz_date '{}' should start with date_stamp '{}'",
amz_date,
date_stamp
);
assert_eq!(
&amz_date[8..9],
"T",
"amz_date should have 'T' at position 8"
);
assert!(amz_date.ends_with('Z'), "amz_date should end with 'Z'");
}
#[test]
fn test_utc_now_components_all_digits() {
let (date_stamp, amz_date) = signing::utc_now_components();
assert!(
date_stamp.chars().all(|c| c.is_ascii_digit()),
"date_stamp should be all digits: {}",
date_stamp
);
let amz_digits: String = amz_date.chars().filter(|c| c.is_ascii_digit()).collect();
assert_eq!(
amz_digits.len(),
14,
"amz_date should have 14 digits: {}",
amz_date
);
}
#[test]
fn test_utc_now_components_reasonable_date() {
let (date_stamp, _) = signing::utc_now_components();
let year: u32 = date_stamp[0..4].parse().expect("year should be parseable");
assert!(
(2020..=2030).contains(&year),
"year {} should be in 2020-2030",
year
);
let month: u32 = date_stamp[4..6].parse().expect("month should be parseable");
assert!(
(1..=12).contains(&month),
"month {} should be in 1-12",
month
);
let day: u32 = date_stamp[6..8].parse().expect("day should be parseable");
assert!((1..=31).contains(&day), "day {} should be in 1-31", day);
}
#[cfg(feature = "qiniu-kodo")]
mod hmac_sha1_tests {
use sz_orm_storage::signing;
#[test]
fn test_hmac_sha1_rfc2202_case1() {
let key = [0x0bu8; 20];
let mac = signing::compute_hmac_sha1(&key, b"Hi There");
assert_eq!(
hex::encode(&mac),
"b617318655057264e28bc0b6fb378c8ef146be00"
);
}
#[test]
fn test_hmac_sha1_rfc2202_case2() {
let key = b"Jefe";
let mac = signing::compute_hmac_sha1(key, b"what do ya want for nothing?");
assert_eq!(
hex::encode(&mac),
"effcdf6ae5eb2fa2d27416d5f184df9c259a7c79"
);
}
#[test]
fn test_hmac_sha1_rfc2202_case4() {
let key: Vec<u8> = (1..=25u8).collect();
let data = vec![0xcdu8; 50];
let mac = signing::compute_hmac_sha1(&key, &data);
assert_eq!(
hex::encode(&mac),
"4c9007f4026250c6bc8414f9bf50c86c2d7235da"
);
}
#[test]
fn test_hmac_sha1_empty_data() {
let key = b"test-key";
let mac = signing::compute_hmac_sha1(key, b"");
assert_eq!(mac.len(), 20);
let mac2 = signing::compute_hmac_sha1(key, b"");
assert_eq!(mac, mac2);
}
#[test]
fn test_hmac_sha1_different_keys_produce_different_macs() {
let data = b"test data";
let mac1 = signing::compute_hmac_sha1(b"key1", data);
let mac2 = signing::compute_hmac_sha1(b"key2", data);
assert_ne!(mac1, mac2);
}
}