liminal-server 0.25.4

Standalone server for the liminal messaging bus
Documentation
use super::{header, payload};
use lys_core::attestation::{Attestation, verify_attestation_bytes_by_signer};
use lys_core::keys::Ed25519Identity;
use zeroize::Zeroizing;
type TestResult = Result<(), Box<dyn std::error::Error>>;

#[test]
fn lys_worked_request_payload_and_cose_verify_byte_for_byte() -> TestResult {
    let body = br#"{"audience":"liminal"}"#;
    let nonce = "01010101010101010101010101010101";
    let path = "/agents/agent-1/pass";
    let expected = b"lys-identity/agent-request/v1\nPOST\n/agents/agent-1/pass\ndfb5338e8006a254cc49c5f68902e196225ff18e2dbc587bdf988c75c0017da9\n1700000000000\n01010101010101010101010101010101";
    assert_eq!(payload(path, body, 1_700_000_000_000, nonce), expected);
    let key = Ed25519Identity::from_seed(&Zeroizing::new([1; 32]));
    let signed = header(&key, "agent-1", path, body, 1_700_000_000_000, nonce);
    let words: Vec<_> = signed.split_ascii_whitespace().collect();
    assert_eq!(&words[..3], &["agent-1", "1700000000000", nonce]);
    let cose = hex::decode(words[3])?;
    let attestation = verify_attestation_bytes_by_signer(&cose, expected, &key.public_key_bytes())?;
    assert_eq!(attestation.to_cose_bytes(), cose);
    Ok(())
}

#[test]
fn lys_worked_cose_vector_is_reproduced_byte_for_byte() -> TestResult {
    let key = Ed25519Identity::from_seed(&Zeroizing::new(*b"lys-cose-conformance-test-seed01"));
    let input = hex::decode(
        "846a5369676e6174757265315850a301270378276170706c69636174696f6e2f766e642e6c79732e6174746573746174696f6e2e76322b63626f72045820214e41cc8475f5bc9af68dbf33fa56e8adf5144a4a81134268f4ae379e103bfd40582ea20158209404f8b8cec8ad98a88b106d9345d518c273f012c1306b8af5103e865997191e021b0000018bcfe56800",
    )?;
    let mut hash = [0; 32];
    hex::decode_to_slice(
        "9404f8b8cec8ad98a88b106d9345d518c273f012c1306b8af5103e865997191e",
        &mut hash,
    )?;
    let signed = Attestation {
        payload_hash: hash,
        signature: key.sign(&input),
        signer_public_key: key.public_key_bytes(),
        timestamp: 1_700_000_000_000,
    };
    let expected = hex::decode(
        "d2845850a301270378276170706c69636174696f6e2f766e642e6c79732e6174746573746174696f6e2e76322b63626f72045820214e41cc8475f5bc9af68dbf33fa56e8adf5144a4a81134268f4ae379e103bfda0582ea20158209404f8b8cec8ad98a88b106d9345d518c273f012c1306b8af5103e865997191e021b0000018bcfe568005840ba6eae66b3a04f25e6116e7278ae8b0e2174a2964bb0917ae53ab2ef326c22a706e90cae6886b20ecd086fee4b515de046d450f90de81f9aa46a9b34bd7f1a09",
    )?;
    assert_eq!(signed.to_cose_bytes(), expected);
    verify_attestation_bytes_by_signer(
        &expected,
        b"lys attestation conformance payload\n",
        &key.public_key_bytes(),
    )?;
    Ok(())
}