use super::*;
use rand::rngs::OsRng;
#[test]
fn test_field_arithmetic() {
let one = FieldElement::one();
let mut two_bytes = [0u8; 36];
two_bytes[35] = 2;
let two = FieldElement::from_bytes(&two_bytes).unwrap();
assert!(one.add(&one).is_zero());
assert_eq!(one.mul(&two), two);
let inv_one = one.invert().unwrap();
assert_eq!(one.mul(&inv_one), one);
}
#[test]
fn test_scalar_reduction() {
let large_scalar_bytes = [0xFF; 36];
let scalar = Scalar::new(large_scalar_bytes).unwrap();
assert_ne!(scalar.serialize(), large_scalar_bytes);
assert!(Scalar::new([0; 36]).is_err());
}
#[test]
fn test_point_operations() {
let g = base_point_g();
let g2 = g.double();
assert_eq!(g.add(&g), g2);
let neg_g_y = g.x.add(&g.y);
let neg_g = Point {
is_identity: g.is_identity,
x: g.x.clone(),
y: neg_g_y,
};
assert!(g.add(&neg_g).is_identity());
}
#[test]
fn test_scalar_multiplication() {
let g = base_point_g();
let mut two_bytes = [0; 36];
two_bytes[35] = 2;
let two = Scalar::new(two_bytes).unwrap();
let g2 = g.mul(&two).unwrap();
assert_eq!(g2, g.double());
}
#[test]
fn test_keypair_generation() {
let (sk, pk) = generate_keypair(&mut OsRng).unwrap();
let pk_recomputed = scalar_mult_base_g(&sk).unwrap();
assert_eq!(pk, pk_recomputed);
}
#[test]
fn test_point_compression_roundtrip() {
let g = base_point_g();
let compressed = g.serialize_compressed();
let decompressed = Point::deserialize_compressed(&compressed).unwrap();
assert_eq!(g, decompressed);
let g2 = g.double();
let compressed2 = g2.serialize_compressed();
let decompressed2 = Point::deserialize_compressed(&compressed2).unwrap();
assert_eq!(g2, decompressed2);
}
#[test]
fn test_base_point_on_curve() {
let g = base_point_g();
assert!(!g.is_identity());
let x = &g.x;
let y = &g.y;
let y_sq = y.square();
let xy = x.mul(y);
let lhs = y_sq.add(&xy);
let x_cubed = x.square().mul(x);
let rhs = x_cubed.add(&FieldElement::one());
assert_eq!(lhs, rhs, "Base point must satisfy curve equation");
}
#[test]
fn test_ecdh_key_exchange() {
let (sk1, pk1) = generate_keypair(&mut OsRng).unwrap();
let (sk2, pk2) = generate_keypair(&mut OsRng).unwrap();
let shared1 = scalar_mult(&sk1, &pk2).unwrap();
let shared2 = scalar_mult(&sk2, &pk1).unwrap();
assert_eq!(shared1, shared2);
assert!(!shared1.is_identity());
}
#[test]
fn test_kdf() {
let input = b"test shared secret";
let info = b"test info";
let output1 = kdf_hkdf_sha384_for_ecdh_kem(input, Some(info)).unwrap();
let output2 = kdf_hkdf_sha384_for_ecdh_kem(input, Some(info)).unwrap();
assert_eq!(output1, output2);
assert_eq!(output1.len(), B283K_KEM_SHARED_SECRET_KDF_OUTPUT_SIZE);
let output3 = kdf_hkdf_sha384_for_ecdh_kem(b"different input", Some(info)).unwrap();
assert_ne!(output1, output3);
}