Files
wolfssl/wrapper/rust/wolfssl-wolfcrypt/tests/test_ecc.rs
2025-12-15 13:02:55 -05:00

327 lines
14 KiB
Rust

#![cfg(ecc)]
#[cfg(any(all(ecc_import, ecc_export, ecc_sign, ecc_verify, random), random))]
use std::fs;
use wolfssl_wolfcrypt::ecc::*;
#[cfg(random)]
use wolfssl_wolfcrypt::random::RNG;
#[test]
#[cfg(random)]
fn test_ecc_generate() {
let mut rng = RNG::new().expect("Failed to create RNG");
let mut ecc = ECC::generate(32, &mut rng, None, None).expect("Error with generate()");
ecc.check().expect("Error with check()");
}
#[test]
#[cfg(random)]
fn test_ecc_generate_ex() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
assert_eq!(curve_size, 32);
let mut ecc = ECC::generate_ex(curve_size, &mut rng, curve_id, None, None).expect("Error with generate_ex()");
ecc.check().expect("Error with check()");
}
#[test]
#[cfg(all(ecc_import, ecc_export, random))]
fn test_ecc_import_x963() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
assert_eq!(curve_size, 32);
let mut ecc = ECC::generate_ex(curve_size, &mut rng, curve_id, None, None).expect("Error with generate_ex()");
ecc.check().expect("Error with check()");
let mut x963 = [0u8; 128];
let x963_size = ecc.export_x963(&mut x963).expect("Error with export_x963()");
let x963 = &x963[0..x963_size];
let mut ecc = ECC::import_x963_ex(x963, ECC::SECP256R1, None, None).expect("Error with import_x963_ex");
ecc.check().expect("Error with check()");
}
#[test]
#[cfg(random)]
fn test_ecc_generate_ex2() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
assert_eq!(curve_size, 32);
let mut ecc = ECC::generate_ex2(curve_size, &mut rng, curve_id, ECC::FLAG_COFACTOR, None, None).expect("Error with generate_ex2()");
ecc.check().expect("Error with check()");
}
#[test]
#[cfg(all(ecc_import, ecc_export, ecc_sign, ecc_verify, random))]
fn test_ecc_import_export_sign_verify() {
let mut rng = RNG::new().expect("Failed to create RNG");
let key_path = "../../../certs/ecc-client-key.der";
let der: Vec<u8> = fs::read(key_path).expect("Error reading key file");
let mut ecc = ECC::import_der(&der, None, None).expect("Error with import_der()");
let hash = [0x42u8; 32];
let mut signature = [0u8; 128];
let signature_length = ecc.sign_hash(&hash, &mut signature, &mut rng).expect("Error with sign_hash()");
assert!(signature_length > 0 && signature_length <= signature.len());
let signature = &mut signature[0..signature_length];
let key_path = "../../../certs/ecc-client-keyPub.der";
let der: Vec<u8> = fs::read(key_path).expect("Error reading key file");
let mut ecc = ECC::import_public_der(&der, None, None).expect("Error with import_public_der()");
let valid = ecc.verify_hash(&signature, &hash).expect("Error with verify_hash()");
assert_eq!(valid, true);
let mut x963 = [0u8; 128];
let x963_size = ecc.export_x963(&mut x963).expect("Error with export_x963()");
let x963 = &x963[0..x963_size];
let mut ecc = ECC::import_x963(x963, None, None).expect("Error with import_x963");
let valid = ecc.verify_hash(&signature, &hash).expect("Error with verify_hash()");
assert_eq!(valid, true);
#[cfg(ecc_comp_key)]
{
let mut x963 = [0u8; 128];
let x963_size = ecc.export_x963_compressed(&mut x963).expect("Error with export_x963_compressed()");
let x963 = &x963[0..x963_size];
let mut ecc = ECC::import_x963(x963, None, None).expect("Error with import_x963");
let valid = ecc.verify_hash(&signature, &hash).expect("Error with verify_hash()");
assert_eq!(valid, true);
}
let mut r = [0u8; 32];
let mut r_size = 0u32;
let mut s = [0u8; 32];
let mut s_size = 0u32;
ECC::sig_to_rs(signature, &mut r, &mut r_size, &mut s, &mut s_size).expect("Error with sig_to_rs()");
assert!(r_size > 0 && r_size <= 32);
assert!(s_size > 0 && s_size <= 32);
let r = &r[0..r_size as usize];
let s = &s[0..s_size as usize];
let mut sig_out = [0u8; 128];
let sig_out_size = ECC::rs_bin_to_sig(r, s, &mut sig_out).expect("Error with rs_bin_to_sig()");
assert_eq!(*signature, *&sig_out[0..sig_out_size]);
fn bytes_to_asciiz_hex_string(bytes: &[u8]) -> String {
let mut hex_string = String::with_capacity(bytes.len() * 2 + 1);
for byte in bytes {
hex_string.push_str(&format!("{:02X}", byte));
}
hex_string.push('\0');
hex_string
}
let r_hex_string = bytes_to_asciiz_hex_string(r);
let s_hex_string = bytes_to_asciiz_hex_string(s);
let mut sig_out = [0u8; 128];
let sig_out_size = ECC::rs_hex_to_sig(&r_hex_string[0..r_hex_string.len()].as_bytes(), &s_hex_string[0..s_hex_string.len()].as_bytes(), &mut sig_out).expect("Error with rs_hex_to_sig()");
assert_eq!(*signature, *&sig_out[0..sig_out_size]);
signature[signature.len() - 2] = 0xDEu8;
signature[signature.len() - 1] = 0xADu8;
let valid = ecc.verify_hash(&signature, &hash).expect("Error with verify_hash()");
assert_eq!(valid, false);
ecc.set_rng(&mut rng).expect("Error with set_rng()");
}
#[test]
#[cfg(all(ecc_dh, random))]
fn test_ecc_shared_secret() {
let mut rng = RNG::new().expect("Failed to create RNG");
let mut ecc0 = ECC::generate(32, &mut rng, None, None).expect("Error with generate()");
let mut ecc1 = ECC::generate(32, &mut rng, None, None).expect("Error with generate()");
let mut ss0 = [0u8; 128];
let mut ss1 = [0u8; 128];
ecc0.set_rng(&mut rng).expect("Error with set_rng()");
ecc1.set_rng(&mut rng).expect("Error with set_rng()");
let ss0_size = ecc0.shared_secret(&mut ecc1, &mut ss0).expect("Error with shared_secret()");
let ss1_size = ecc1.shared_secret(&mut ecc0, &mut ss1).expect("Error with shared_secret()");
assert_eq!(ss0_size, ss1_size);
let ss0 = &ss0[0..ss0_size];
let ss1 = &ss1[0..ss1_size];
assert_eq!(*ss0, *ss1);
let mut ss0 = [0u8; 128];
let ecc_point = ecc1.make_pub_to_point(None, None).expect("Error with make_pub_to_point()");
let ss0_size = ecc0.shared_secret_ex(&ecc_point, &mut ss0).expect("Error with shared_secret_ex()");
let ss0 = &ss0[0..ss0_size];
assert_eq!(*ss0, *ss1);
}
#[test]
#[cfg(all(ecc_export, random))]
fn test_ecc_export() {
let mut rng = RNG::new().expect("Failed to create RNG");
let mut ecc = ECC::generate(32, &mut rng, None, None).expect("Error with generate()");
let mut qx = [0u8; 32];
let mut qx_len = 0u32;
let mut qy = [0u8; 32];
let mut qy_len = 0u32;
let mut d = [0u8; 32];
let mut d_len = 0u32;
ecc.export(&mut qx, &mut qx_len, &mut qy, &mut qy_len, &mut d, &mut d_len).expect("Error with export()");
}
#[test]
#[cfg(all(ecc_export, random))]
fn test_ecc_export_ex() {
let mut rng = RNG::new().expect("Failed to create RNG");
let mut ecc = ECC::generate(32, &mut rng, None, None).expect("Error with generate()");
let mut qx = [0u8; 32];
let mut qx_len = 0u32;
let mut qy = [0u8; 32];
let mut qy_len = 0u32;
let mut d = [0u8; 32];
let mut d_len = 0u32;
ecc.export_ex(&mut qx, &mut qx_len, &mut qy, &mut qy_len, &mut d, &mut d_len, false).expect("Error with export_ex()");
}
#[test]
#[cfg(all(ecc_import, ecc_export, ecc_sign, ecc_verify, random))]
fn test_ecc_import_export_private() {
let mut rng = RNG::new().expect("Failed to create RNG");
let mut ecc = ECC::generate(32, &mut rng, None, None).expect("Error with generate()");
let hash = [0x42u8; 32];
let mut signature = [0u8; 128];
let signature_length = ecc.sign_hash(&hash, &mut signature, &mut rng).expect("Error with sign_hash()");
let signature = &signature[0..signature_length];
let mut d = [0u8; 32];
let d_size = ecc.export_private(&mut d).expect("Error with export_private()");
assert_eq!(d_size, 32);
let mut x963 = [0u8; 128];
let x963_size = ecc.export_x963(&mut x963).expect("Error with export_x963()");
let x963 = &x963[0..x963_size];
let mut ecc2 = ECC::import_private_key(&d, x963, None, None).expect("Error with import_private_key()");
let valid = ecc2.verify_hash(&signature, &hash).expect("Error with verify_hash()");
assert_eq!(valid, true);
}
#[test]
#[cfg(all(ecc_import, ecc_export, ecc_sign, ecc_verify, random))]
fn test_ecc_import_export_private_ex() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
let mut ecc = ECC::generate_ex(curve_size, &mut rng, curve_id, None, None).expect("Error with generate_ex()");
let hash = [0x42u8; 32];
let mut signature = [0u8; 128];
let signature_length = ecc.sign_hash(&hash, &mut signature, &mut rng).expect("Error with sign_hash()");
let signature = &signature[0..signature_length];
let mut d = [0u8; 32];
let d_size = ecc.export_private(&mut d).expect("Error with export_private()");
assert_eq!(d_size, 32);
let mut x963 = [0u8; 128];
let x963_size = ecc.export_x963(&mut x963).expect("Error with export_x963()");
let x963 = &x963[0..x963_size];
let mut ecc2 = ECC::import_private_key_ex(&d, x963, curve_id, None, None).expect("Error with import_private_key_ex()");
let valid = ecc2.verify_hash(&signature, &hash).expect("Error with verify_hash()");
assert_eq!(valid, true);
}
#[test]
#[cfg(all(ecc_export, random))]
fn test_ecc_export_public() {
let mut rng = RNG::new().expect("Failed to create RNG");
let mut ecc = ECC::generate(32, &mut rng, None, None).expect("Error with generate()");
let mut qx = [0u8; 32];
let mut qx_len = 0u32;
let mut qy = [0u8; 32];
let mut qy_len = 0u32;
ecc.export_public(&mut qx, &mut qx_len, &mut qy, &mut qy_len).expect("Error with export_public()");
}
#[test]
#[cfg(all(ecc_import, ecc_export, ecc_sign, ecc_verify, random))]
fn test_ecc_import_unsigned() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
let mut ecc = ECC::generate_ex(curve_size, &mut rng, curve_id, None, None).expect("Error with generate()");
let mut qx = [0u8; 32];
let mut qx_len = 0u32;
let mut qy = [0u8; 32];
let mut qy_len = 0u32;
let mut d = [0u8; 32];
let mut d_len = 0u32;
ecc.export_ex(&mut qx, &mut qx_len, &mut qy, &mut qy_len, &mut d, &mut d_len, false).expect("Error with export_ex()");
let mut ecc2 = ECC::import_unsigned(&qx, &qy, &d, curve_id, None, None).expect("Error with import_unsigned()");
let hash = [0x42u8; 32];
let mut signature = [0u8; 128];
let signature_length = ecc.sign_hash(&hash, &mut signature, &mut rng).expect("Error with sign_hash()");
let signature = &signature[0..signature_length];
let valid = ecc2.verify_hash(signature, &hash).expect("Error with verify_hash()");
assert_eq!(valid, true);
}
#[test]
#[cfg(random)]
fn test_ecc_make_pub() {
let mut rng = RNG::new().expect("Failed to create RNG");
let key_path = "../../../certs/ecc-client-key.der";
let der: Vec<u8> = fs::read(key_path).expect("Error reading key file");
let mut ecc = ECC::import_der(&der, None, None).expect("Error with import_der()");
ecc.make_pub(Some(&mut rng)).expect("Error with make_pub()");
ecc.make_pub(None).expect("Error with make_pub()");
ecc.make_pub_to_point(Some(&mut rng), None).expect("Error with make_pub_to_point()");
ecc.make_pub_to_point(None, None).expect("Error with make_pub_to_point()");
}
#[test]
#[cfg(all(ecc_export, random))]
fn test_ecc_point() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
let mut ecc = ECC::generate_ex(curve_size, &mut rng, curve_id, None, None).expect("Error with generate()");
let mut ecc_point = ecc.make_pub_to_point(Some(&mut rng), None).expect("Error with make_pub_to_point()");
let mut der = [0u8; 128];
let size = ecc_point.export_der(&mut der, curve_id).expect("Error with export_der()");
assert!(size > 0 && size <= der.len());
ecc_point.forcezero();
}
#[test]
#[cfg(all(all(ecc_import, ecc_export, random)))]
fn test_ecc_point_import() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
let mut ecc = ECC::generate_ex(curve_size, &mut rng, curve_id, None, None).expect("Error with generate()");
let mut ecc_point = ecc.make_pub_to_point(Some(&mut rng), None).expect("Error with make_pub_to_point()");
let mut der = [0u8; 128];
let size = ecc_point.export_der(&mut der, curve_id).expect("Error with export_der()");
assert!(size > 0 && size <= der.len());
ECCPoint::import_der(&der[0..size], curve_id, None).expect("Error with import_der()");
ecc_point.forcezero();
}
#[test]
#[cfg(all(ecc_import, ecc_export, ecc_comp_key, random))]
fn test_ecc_point_import_compressed() {
let mut rng = RNG::new().expect("Failed to create RNG");
let curve_id = ECC::SECP256R1;
let curve_size = ECC::get_curve_size_from_id(curve_id).expect("Error with get_curve_size_from_id()");
let mut ecc = ECC::generate_ex(curve_size, &mut rng, curve_id, None, None).expect("Error with generate()");
let mut ecc_point = ecc.make_pub_to_point(Some(&mut rng), None).expect("Error with make_pub_to_point()");
let mut der = [0u8; 128];
let _size = ecc_point.export_der_compressed(&mut der, curve_id).expect("Error with export_der_compressed()");
ecc_point.forcezero();
}
#[test]
#[cfg(ecc_import)]
fn test_ecc_import() {
let qx = b"7a4e287890a1a47ad3457e52f2f76a83ce46cbc947616d0cbaa82323818a793d\0";
let qy = b"eec4084f5b29ebf29c44cce3b3059610922f8b30ea6e8811742ac7238fe87308\0";
let d = b"8c14b793cb19137e323a6d2e2a870bca2e7a493ec1153b3a95feb8a4873f8d08\0";
ECC::import_raw(qx, qy, d, b"SECP256R1\0", None, None).expect("Error with import_raw()");
ECC::import_raw_ex(qx, qy, d, ECC::SECP256R1, None, None).expect("Error with import_raw_ex()");
}