use super::*;
use ciborium::value::Value as CborValue;
#[test]
fn test_get_sig_from_stmt_success() {
let att_stmt = vec![
(
CborValue::Text("alg".to_string()),
CborValue::Integer(Integer::from(-7)), ),
(
CborValue::Text("sig".to_string()),
CborValue::Bytes(vec![0x01, 0x02, 0x03, 0x04]), ),
];
let result = get_sig_from_stmt(&att_stmt);
assert!(result.is_ok());
let (alg, sig) = result.unwrap();
assert_eq!(alg, -7);
assert_eq!(sig, vec![0x01, 0x02, 0x03, 0x04]);
}
#[test]
fn test_get_sig_from_stmt_missing_alg() {
let att_stmt = vec![(
CborValue::Text("sig".to_string()),
CborValue::Bytes(vec![0x01, 0x02, 0x03, 0x04]), )];
let result = get_sig_from_stmt(&att_stmt);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Missing algorithm or signature"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_get_sig_from_stmt_missing_sig() {
let att_stmt = vec![(
CborValue::Text("alg".to_string()),
CborValue::Integer(Integer::from(-7)), )];
let result = get_sig_from_stmt(&att_stmt);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Missing algorithm or signature"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_get_sig_from_stmt_wrong_types() {
let att_stmt = vec![
(
CborValue::Text("alg".to_string()),
CborValue::Text("ES256".to_string()), ),
(
CborValue::Text("sig".to_string()),
CborValue::Integer(Integer::from(123)), ),
];
let result = get_sig_from_stmt(&att_stmt);
assert!(result.is_err());
}
#[test]
fn test_get_sig_from_stmt_empty_statement() {
let att_stmt = vec![];
let result = get_sig_from_stmt(&att_stmt);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Missing algorithm or signature"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_get_sig_from_stmt_irrelevant_keys() {
let att_stmt = vec![
(
CborValue::Text("fmt".to_string()),
CborValue::Text("packed".to_string()),
),
(CborValue::Text("x5c".to_string()), CborValue::Array(vec![])),
];
let result = get_sig_from_stmt(&att_stmt);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Missing algorithm or signature"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_get_sig_from_stmt_empty_signature() {
let att_stmt = vec![
(
CborValue::Text("alg".to_string()),
CborValue::Integer(Integer::from(-7)), ),
(
CborValue::Text("sig".to_string()),
CborValue::Bytes(vec![]), ),
];
let result = get_sig_from_stmt(&att_stmt);
assert!(result.is_ok());
let (alg, sig) = result.unwrap();
assert_eq!(alg, -7);
assert_eq!(sig, Vec::<u8>::new()); }
#[test]
fn test_integer_to_i64_common_values() {
assert_eq!(integer_to_i64(&Integer::from(0)), 0);
assert_eq!(integer_to_i64(&Integer::from(1)), 1);
assert_eq!(integer_to_i64(&Integer::from(2)), 2);
assert_eq!(integer_to_i64(&Integer::from(3)), 3);
assert_eq!(integer_to_i64(&Integer::from(-1)), -1);
assert_eq!(integer_to_i64(&Integer::from(-2)), -2);
assert_eq!(integer_to_i64(&Integer::from(-3)), -3);
assert_eq!(integer_to_i64(&Integer::from(-7)), -7);
assert_eq!(integer_to_i64(&Integer::from(-257)), -257);
assert_eq!(integer_to_i64(&Integer::from(999)), 999);
}
#[test]
fn test_integer_to_i64_arbitrary_values() {
assert_eq!(integer_to_i64(&Integer::from(1000000007)), 1000000007);
assert_eq!(integer_to_i64(&Integer::from(123456789)), 123456789);
assert_eq!(integer_to_i64(&Integer::from(-65535)), -65535); assert_eq!(integer_to_i64(&Integer::from(-259)), -259);
assert_eq!(integer_to_i64(&Integer::from(i64::MAX)), i64::MAX);
assert_eq!(integer_to_i64(&Integer::from(i64::MIN)), i64::MIN);
}
#[test]
fn test_integer_to_i64_simplified_powers_of_two() {
assert_eq!(integer_to_i64(&Integer::from(4)), 4); assert_eq!(integer_to_i64(&Integer::from(8)), 8); assert_eq!(integer_to_i64(&Integer::from(256)), 256); assert_eq!(integer_to_i64(&Integer::from(1024)), 1024);
assert_eq!(integer_to_i64(&Integer::from(-4)), -4);
assert_eq!(integer_to_i64(&Integer::from(-8)), -8);
}
#[test]
fn test_extract_public_key_coords_success() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
(
CborValue::Integer(Integer::from(-2)),
CborValue::Bytes(vec![0x01; 32]),
),
(
CborValue::Integer(Integer::from(-3)),
CborValue::Bytes(vec![0x02; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_ok());
let (x, y) = result.unwrap();
assert_eq!(x, vec![0x01; 32]);
assert_eq!(y, vec![0x02; 32]);
}
#[test]
fn test_extract_public_key_coords_invalid_key_type() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(1)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
(
CborValue::Integer(Integer::from(-2)),
CborValue::Bytes(vec![0x01; 32]),
),
(
CborValue::Integer(Integer::from(-3)),
CborValue::Bytes(vec![0x02; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Invalid key type or algorithm"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_invalid_algorithm() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-8)),
),
(
CborValue::Integer(Integer::from(-2)),
CborValue::Bytes(vec![0x01; 32]),
),
(
CborValue::Integer(Integer::from(-3)),
CborValue::Bytes(vec![0x02; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Invalid key type or algorithm"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_missing_x() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
(
CborValue::Integer(Integer::from(-3)),
CborValue::Bytes(vec![0x02; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Missing public key coordinates"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_missing_y() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
(
CborValue::Integer(Integer::from(-2)),
CborValue::Bytes(vec![0x01; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Missing public key coordinates"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_invalid_coordinate_length() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
(
CborValue::Integer(Integer::from(-2)),
CborValue::Bytes(vec![0x01; 16]),
),
(
CborValue::Integer(Integer::from(-3)),
CborValue::Bytes(vec![0x02; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Invalid coordinate length"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_invalid_format() {
let public_key = CborValue::Array(vec![
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
]);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Invalid public key format"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_missing_both_coordinates() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Missing public key coordinates"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_zero_length_coordinates() {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
(
CborValue::Integer(Integer::from(-2)),
CborValue::Bytes(vec![]),
),
(
CborValue::Integer(Integer::from(-3)),
CborValue::Bytes(vec![0x02; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Invalid coordinate length"));
} else {
panic!("Expected PasskeyError::Verification");
}
}
#[test]
fn test_extract_public_key_coords_boundary_lengths() {
let test_cases = vec![(31, "too short"), (33, "too long")];
for (length, description) in test_cases {
let public_key_entries = vec![
(
CborValue::Integer(Integer::from(1)),
CborValue::Integer(Integer::from(2)),
),
(
CborValue::Integer(Integer::from(3)),
CborValue::Integer(Integer::from(-7)),
),
(
CborValue::Integer(Integer::from(-2)),
CborValue::Bytes(vec![0x01; length]),
),
(
CborValue::Integer(Integer::from(-3)),
CborValue::Bytes(vec![0x02; 32]),
),
];
let public_key = CborValue::Map(public_key_entries);
let result = extract_public_key_coords(&public_key);
assert!(
result.is_err(),
"Should fail for {description} coordinate length"
);
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Invalid coordinate length"));
} else {
panic!("Expected PasskeyError::Verification for {description} length");
}
}
}
#[test]
fn test_extract_public_key_coords_empty_map() {
let public_key = CborValue::Map(vec![]);
let result = extract_public_key_coords(&public_key);
assert!(result.is_err());
if let Err(PasskeyError::Verification(msg)) = result {
assert!(msg.contains("Invalid key type or algorithm"));
} else {
panic!("Expected PasskeyError::Verification");
}
}