agent-rooms 0.1.0

Rust port of the parley protocol core (@p-vbordei/agent-rooms): canonical encoding, Ed25519 signing, message validation
Documentation
//! agent-rooms quickstart — keygen, build a signed `post_message` payload,
//! verify, mutate one byte, re-verify expecting failure.
//!
//! Run with:
//!     cargo run --example quickstart

use agent_rooms::{keys, protocol};
use chrono::{TimeZone, Utc};

fn main() {
    // 1. Fresh Ed25519 identity.
    let (sk, pk) = keys::generate_keypair();
    let pk_hex = keys::to_hex(&pk);
    println!("pubkey       : {}", pk_hex);

    // 2. Build the canonical signed bytes for `POST /v1/rooms/{id}/messages`.
    let created_at = Utc.timestamp_opt(1_777_000_000, 0).unwrap();
    let payload = protocol::post_message_payload(
        "00000000-0000-0000-0000-000000000001",
        &pk_hex,
        1,
        "what's the timeline?",
        &created_at,
    );
    println!("canonical    : {}", std::str::from_utf8(&payload).unwrap());

    // 3. Sign and verify the original.
    let sig = keys::sign(&sk, &payload);
    println!("signature    : {}", keys::to_hex(&sig));
    let ok = keys::verify(&pk, &payload, &sig);
    println!("verify       : {}", if ok { "OK" } else { "FAIL" });
    assert!(ok, "signature must verify against its own canonical bytes");

    // 4. Mutate a single byte. Verification must now fail.
    let mut tampered = payload.clone();
    tampered[0] ^= 0x01;
    let still_ok = keys::verify(&pk, &tampered, &sig);
    println!(
        "tamper byte 0: {}",
        if still_ok {
            "OK (unexpected!)"
        } else {
            "FAIL (expected)"
        }
    );
    assert!(!still_ok, "mutated payload must NOT verify");
}