1use anyhow::{Context, Result};
2use serde::Serialize;
3
4use relay_lib::{
5 crypto::SigningKey,
6 prelude::{CryptoMeta, KeyRecord, e2e, sign},
7};
8
9#[derive(Debug, Serialize)]
10pub struct SignedRequestWire {
11 pub user: String,
12 pub meta: CryptoMeta,
13 pub payload: Vec<u8>,
14 pub sig: Vec<u8>,
15}
16
17pub fn sign_request<T>(
18 user: &str,
19 payload: T,
20 record: &KeyRecord,
21 signing_key: &SigningKey,
22) -> Result<SignedRequestWire>
23where
24 T: Serialize,
25{
26 let rng = relay_lib::crypto::OsRng;
27
28 let payload = serde_json::to_vec(&payload).expect("Failed to serialize payload");
29
30 let (meta, ciphertext) =
31 e2e::encrypt(rng, &record.public_key(), &payload, &[]).context("encrypting")?;
32 let signed = sign::sign(&ciphertext, signing_key);
33 let sig = signed.sig.to_vec();
34
35 Ok(SignedRequestWire {
36 user: user.to_string(),
37 meta,
38 payload: signed.payload.to_vec(),
39 sig,
40 })
41}