synta-certificate 0.2.2

X.509 certificate structures for synta ASN.1 library
Documentation
//! Tests for algorithm identification helper functions

use std::str::FromStr;
use synta::ObjectIdentifier;
use synta_certificate::{identify_public_key_algorithm, identify_signature_algorithm, names, oids};

// ── RSA signature variants ────────────────────────────────────────────────────

#[test]
fn test_identify_rsa_signature_algorithm() {
    let cases = [
        (oids::MD5_WITH_RSA, names::MD5_WITH_RSA),
        (oids::SHA1_WITH_RSA, names::SHA1_WITH_RSA),
        (oids::SHA256_WITH_RSA, names::SHA256_WITH_RSA),
        (oids::SHA384_WITH_RSA, names::SHA384_WITH_RSA),
        (oids::SHA512_WITH_RSA, names::SHA512_WITH_RSA),
        // rsaEncryption (key OID) falls back to the RSA family name.
        (oids::RSA_ENCRYPTION, names::RSA),
    ];
    for (oid_arcs, expected) in cases {
        let oid = ObjectIdentifier::new(oid_arcs).unwrap();
        assert_eq!(
            identify_signature_algorithm(&oid),
            expected,
            "OID arcs: {oid_arcs:?}"
        );
    }
}

// ── ECDSA signature variants ──────────────────────────────────────────────────

#[test]
fn test_identify_ecdsa_signature_algorithm() {
    let cases = [
        (oids::ECDSA_WITH_SHA1, names::ECDSA_WITH_SHA1),
        (oids::ECDSA_WITH_SHA256, names::ECDSA_WITH_SHA256),
        (oids::ECDSA_WITH_SHA384, names::ECDSA_WITH_SHA384),
        (oids::ECDSA_WITH_SHA512, names::ECDSA_WITH_SHA512),
    ];
    for (oid_arcs, expected) in cases {
        let oid = ObjectIdentifier::new(oid_arcs).unwrap();
        assert_eq!(
            identify_signature_algorithm(&oid),
            expected,
            "OID arcs: {oid_arcs:?}"
        );
    }
}

// ── EdDSA ─────────────────────────────────────────────────────────────────────

#[test]
fn test_identify_ed25519_signature_algorithm() {
    let oid = ObjectIdentifier::new(oids::ED25519).unwrap();
    assert_eq!(identify_signature_algorithm(&oid), names::ED25519);
}

#[test]
fn test_identify_ed448_signature_algorithm() {
    let oid = ObjectIdentifier::new(oids::ED448).unwrap();
    assert_eq!(identify_signature_algorithm(&oid), names::ED448);
}

// ── ML-DSA (FIPS 204) ─────────────────────────────────────────────────────────

#[test]
fn test_identify_ml_dsa_44_signature_algorithm() {
    let oid = ObjectIdentifier::new(oids::ML_DSA_44).unwrap();
    assert_eq!(identify_signature_algorithm(&oid), names::ML_DSA_44);
}

#[test]
fn test_identify_ml_dsa_65_signature_algorithm() {
    let oid = ObjectIdentifier::new(oids::ML_DSA_65).unwrap();
    assert_eq!(identify_signature_algorithm(&oid), names::ML_DSA_65);
}

#[test]
fn test_identify_ml_dsa_87_signature_algorithm() {
    let oid = ObjectIdentifier::new(oids::ML_DSA_87).unwrap();
    assert_eq!(identify_signature_algorithm(&oid), names::ML_DSA_87);
}

// ── DSA ───────────────────────────────────────────────────────────────────────

#[test]
fn test_identify_dsa_signature_algorithm() {
    // id-dsa-with-sha1 (1.2.840.10040.4.3) — covered by starts_with(DSA) fallback.
    let oid = ObjectIdentifier::from_str("1.2.840.10040.4.3").unwrap();
    assert_eq!(identify_signature_algorithm(&oid), names::DSA);
}

// ── Unknown / fallback ────────────────────────────────────────────────────────

#[test]
fn test_identify_unknown_signature_algorithm() {
    let oid = ObjectIdentifier::from_str("1.2.3.4.5").unwrap();
    assert_eq!(identify_signature_algorithm(&oid), names::OTHER);
}

// ── Public-key algorithm identification ───────────────────────────────────────

#[test]
fn test_identify_rsa_public_key_algorithm() {
    let oid = ObjectIdentifier::new(oids::RSA_ENCRYPTION).unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), Some(names::RSA));
}

#[test]
fn test_identify_ecdsa_public_key_algorithm() {
    let oid = ObjectIdentifier::new(oids::EC_PUBLIC_KEY).unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), Some(names::ECDSA));
}

#[test]
fn test_identify_ml_kem_512_public_key_algorithm() {
    let oid = ObjectIdentifier::new(oids::ML_KEM_512).unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), Some(names::ML_KEM_512));
}

#[test]
fn test_identify_ml_kem_768_public_key_algorithm() {
    let oid = ObjectIdentifier::new(oids::ML_KEM_768).unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), Some(names::ML_KEM_768));
}

#[test]
fn test_identify_ml_kem_1024_public_key_algorithm() {
    let oid = ObjectIdentifier::new(oids::ML_KEM_1024).unwrap();
    assert_eq!(
        identify_public_key_algorithm(&oid),
        Some(names::ML_KEM_1024)
    );
}

#[test]
fn test_identify_ml_dsa_public_key_algorithm() {
    let cases = [
        (oids::ML_DSA_44, names::ML_DSA_44),
        (oids::ML_DSA_65, names::ML_DSA_65),
        (oids::ML_DSA_87, names::ML_DSA_87),
    ];
    for (oid_arcs, expected) in cases {
        let oid = ObjectIdentifier::new(oid_arcs).unwrap();
        assert_eq!(
            identify_public_key_algorithm(&oid),
            Some(expected),
            "OID arcs: {oid_arcs:?}"
        );
    }
}

#[test]
fn test_identify_ed25519_public_key_algorithm() {
    let oid = ObjectIdentifier::new(oids::ED25519).unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), Some(names::ED25519));
}

#[test]
fn test_identify_ed448_public_key_algorithm() {
    let oid = ObjectIdentifier::new(oids::ED448).unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), Some(names::ED448));
}

#[test]
fn test_identify_dsa_public_key_algorithm() {
    // id-dsa (1.2.840.10040.4.1) — covered by starts_with(DSA) fallback.
    let oid = ObjectIdentifier::from_str("1.2.840.10040.4.1").unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), Some(names::DSA));
}

#[test]
fn test_identify_unknown_public_key_algorithm() {
    let oid = ObjectIdentifier::from_str("1.2.3.4.5").unwrap();
    assert_eq!(identify_public_key_algorithm(&oid), None);
}