relay-cli 0.1.2

CLI interface for Relay Agents.
use anyhow::{Context, Result};
use serde::Serialize;

use relay_lib::{
    crypto::SigningKey,
    prelude::{CryptoMeta, KeyRecord, e2e, sign},
};

#[derive(Debug, Serialize)]
pub struct SignedRequestWire {
    pub user: String,
    pub meta: CryptoMeta,
    pub payload: Vec<u8>,
    pub sig: Vec<u8>,
}

pub fn sign_request<T>(
    user: &str,
    payload: T,
    record: &KeyRecord,
    signing_key: &SigningKey,
) -> Result<SignedRequestWire>
where
    T: Serialize,
{
    let rng = relay_lib::crypto::OsRng;

    let payload = serde_json::to_vec(&payload).expect("Failed to serialize payload");

    let (meta, ciphertext) = e2e::encrypt(rng, record, &payload, &[]).context("encrypting")?;
    let signed = sign::sign(&ciphertext, signing_key);
    let sig = signed.sig.context("signature missing")?.to_vec();

    Ok(SignedRequestWire {
        user: user.to_string(),
        meta,
        payload: signed.payload.to_vec(),
        sig,
    })
}