synta-certificate 0.3.2

X.509 certificate structures for synta ASN.1 library
Documentation
//! Tests for CMP PKI message builder.

use synta_certificate::{CMPMessageBuilder, GeneralNameSpec};

// ── Basic builds ──────────────────────────────────────────────────────────────

#[test]
fn cmp_pkiconf_with_sender_recipient() {
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .body_pkiconf()
        .build()
        .expect("pkiConf message must build");

    assert_eq!(der[0], 0x30);
    assert!(der.len() > 4);
}

#[test]
fn cmp_default_equals_new() {
    // Both should fail with missing sender/recipient
    let r1 = CMPMessageBuilder::new().build();
    let r2 = CMPMessageBuilder::default().build();
    // Missing sender → error
    assert!(r1.is_err());
    assert!(r2.is_err());
}

#[test]
fn cmp_missing_sender_returns_error() {
    let result = CMPMessageBuilder::new()
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .build();
    assert!(result.is_err());
}

#[test]
fn cmp_missing_recipient_returns_error() {
    let result = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .build();
    assert!(result.is_err());
}

#[test]
fn cmp_with_transaction_id() {
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .transaction_id(b"\x01\x02\x03\x04\x05\x06\x07\x08")
        .body_pkiconf()
        .build()
        .expect("message with transactionID must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_with_sender_and_recip_nonce() {
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .sender_nonce(b"\xAA\xBB\xCC\xDD")
        .recip_nonce(b"\x11\x22\x33\x44")
        .body_pkiconf()
        .build()
        .expect("message with nonces must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_pvno_3() {
    let der = CMPMessageBuilder::new()
        .pvno(3)
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .body_pkiconf()
        .build()
        .expect("cmp2021 message must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_body_ir() {
    // Minimal placeholder DER (empty SEQUENCE)
    let cert_req_msgs = &[0x30u8, 0x00];
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .body_ir(cert_req_msgs)
        .build()
        .expect("ir body message must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_body_cr() {
    let cert_req_msgs = &[0x30u8, 0x00];
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .body_cr(cert_req_msgs)
        .build()
        .expect("cr body message must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_body_kur() {
    let cert_req_msgs = &[0x30u8, 0x00];
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .body_kur(cert_req_msgs)
        .build()
        .expect("kur body message must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_body_p10cr() {
    // Use the DUMMY_SPKI as a placeholder CSR DER
    let csr_der = &[0x30u8, 0x00];
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .body_p10cr(csr_der)
        .build()
        .expect("p10cr body message must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_body_genm() {
    let gen_msg = &[0x30u8, 0x00];
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .body_genm(gen_msg)
        .build()
        .expect("genm body message must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_sender_dns_name() {
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::dns("ca.example.com"))
        .recipient(GeneralNameSpec::dns("ee.example.com"))
        .body_pkiconf()
        .build()
        .expect("message with DNS names must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_sender_directory_name() {
    let name_der = &[0x30u8, 0x00]; // empty Name
    let der = CMPMessageBuilder::new()
        .sender(GeneralNameSpec::directory_name(name_der))
        .recipient(GeneralNameSpec::directory_name(name_der))
        .body_pkiconf()
        .build()
        .expect("message with directory names must build");

    assert_eq!(der[0], 0x30);
}

#[test]
fn cmp_all_optional_fields() {
    let der = CMPMessageBuilder::new()
        .pvno(3)
        .sender(GeneralNameSpec::rfc822("ca@example.com"))
        .recipient(GeneralNameSpec::rfc822("ee@example.com"))
        .transaction_id(b"\x01\x02\x03\x04")
        .sender_nonce(b"\xAA\xBB")
        .recip_nonce(b"\x11\x22")
        .body_pkiconf()
        .build()
        .expect("message with all optional fields must build");

    assert_eq!(der[0], 0x30);
}