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(())
}