use super::*;
use uuid::Uuid;
fn create_test_attestation(fmt: &str, auth_data_len: usize) -> AttestationObject {
let mut auth_data = vec![0; auth_data_len];
if auth_data_len >= 53 {
let test_uuid = Uuid::parse_str("f1d0f1d0-f1d0-f1d0-f1d0-f1d0f1d0f1d0").unwrap();
auth_data[37..53].copy_from_slice(test_uuid.as_bytes());
}
AttestationObject {
fmt: fmt.to_string(),
auth_data,
att_stmt: Vec::new(),
}
}
#[test]
fn test_verify_attestation_unsupported_format() {
let attestation = create_test_attestation("unsupported", 100);
let client_data = b"test client data";
let result = verify_attestation(&attestation, client_data);
assert!(result.is_err());
if let Err(PasskeyError::Format(msg)) = result {
assert!(msg.contains("Unsupported attestation format"));
} else {
panic!("Expected PasskeyError::Format");
}
}
#[test]
fn test_extract_aaguid_success() {
let attestation = create_test_attestation("none", 100);
let result = extract_aaguid(&attestation);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "f1d0f1d0-f1d0-f1d0-f1d0-f1d0f1d0f1d0");
}
#[test]
fn test_extract_aaguid_too_short() {
let attestation = AttestationObject {
fmt: "none".to_string(),
auth_data: vec![0; 37], att_stmt: Vec::new(),
};
let result = extract_aaguid(&attestation);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Auth data too short"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_verify_attestation_format_recognition() {
let unsupported_formats = vec!["", "unknown", "NONE", "Packed", " none ", "none\0"];
for format in unsupported_formats {
let attestation = create_test_attestation(format, 100);
let client_data = b"test client data";
let result = verify_attestation(&attestation, client_data);
assert!(
matches!(result, Err(PasskeyError::Format(_))),
"Expected format error for format: '{format}'"
);
if let Err(PasskeyError::Format(msg)) = result {
assert!(msg.contains("Unsupported attestation format"));
}
}
}
#[test]
fn test_verify_attestation_client_data_hash_created() {
let attestation = create_test_attestation("unsupported", 100);
let client_data1 = b"data1";
let client_data2 = b"data2";
let empty_data = b"";
let result1 = verify_attestation(&attestation, client_data1);
let result2 = verify_attestation(&attestation, client_data2);
let result3 = verify_attestation(&attestation, empty_data);
assert!(matches!(result1, Err(PasskeyError::Format(_))));
assert!(matches!(result2, Err(PasskeyError::Format(_))));
assert!(matches!(result3, Err(PasskeyError::Format(_))));
}
#[test]
fn test_extract_aaguid_with_different_uuids() {
let mut attestation = AttestationObject {
fmt: "none".to_string(),
auth_data: vec![0; 100],
att_stmt: Vec::new(),
};
let test_uuid = Uuid::parse_str("12345678-1234-5678-9012-123456789012").unwrap();
attestation.auth_data[37..53].copy_from_slice(test_uuid.as_bytes());
let result = extract_aaguid(&attestation);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "12345678-1234-5678-9012-123456789012");
}
#[test]
fn test_extract_aaguid_boundary_conditions() {
let mut attestation = AttestationObject {
fmt: "none".to_string(),
auth_data: vec![0; 53], att_stmt: Vec::new(),
};
let test_uuid = Uuid::parse_str("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").unwrap();
attestation.auth_data[37..53].copy_from_slice(test_uuid.as_bytes());
let result = extract_aaguid(&attestation);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
}
#[test]
fn test_verify_attestation_error_propagation() {
let invalid_formats = vec!["", "unknown", "NONE", "Packed", " none ", "none\0"];
for format in invalid_formats {
let attestation = create_test_attestation(format, 100);
let client_data = b"test client data";
let result = verify_attestation(&attestation, client_data);
assert!(
matches!(result, Err(PasskeyError::Format(_))),
"Expected format error for format: '{format}'"
);
}
}
#[test]
fn test_extract_aaguid_malformed_data() {
let mut attestation = AttestationObject {
fmt: "none".to_string(),
auth_data: vec![0xFF; 53], att_stmt: Vec::new(),
};
let result = extract_aaguid(&attestation);
assert!(result.is_ok(), "UUID crate should handle 0xFF bytes");
attestation.auth_data = vec![0; 52];
let result = extract_aaguid(&attestation);
assert!(matches!(result, Err(PasskeyError::Verification(_))));
attestation.auth_data = vec![0; 1000];
let test_uuid = Uuid::parse_str("fedcba98-7654-3210-fedc-ba9876543210").unwrap();
attestation.auth_data[37..53].copy_from_slice(test_uuid.as_bytes());
let result = extract_aaguid(&attestation);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "fedcba98-7654-3210-fedc-ba9876543210");
}
#[test]
fn test_verify_attestation_empty_client_data() {
let attestation = create_test_attestation("unsupported", 100);
let empty_client_data = b"";
let result = verify_attestation(&attestation, empty_client_data);
assert!(matches!(result, Err(PasskeyError::Format(_))));
}
#[test]
fn test_verify_attestation_large_client_data() {
let attestation = create_test_attestation("unsupported", 100);
let large_client_data = vec![0x42; 10000];
let result = verify_attestation(&attestation, &large_client_data);
assert!(matches!(result, Err(PasskeyError::Format(_))));
}