Skip to main content

relay_actions/
sign.rs

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}