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