lit_rust_sdk/
e2ee.rs

1use crate::error::LitSdkError;
2use serde::{Deserialize, Serialize};
3
4// Re-export lit-sdk's EncryptedPayload for raw bytes
5pub type EncryptedPayload = lit_sdk::EncryptedPayload<Vec<u8>>;
6
7/// Try to decrypt an encrypted payload with any of the given secret keys.
8/// Returns the decrypted data if any key works.
9pub fn wallet_decrypt_with_any_key(
10    secret_keys: &[[u8; 32]],
11    data: &EncryptedPayload,
12) -> Result<Vec<u8>, LitSdkError> {
13    for secret_key in secret_keys {
14        if let Ok((decrypted, _)) = data.decrypt(secret_key) {
15            return Ok(decrypted);
16        }
17    }
18    Err(LitSdkError::Crypto(
19        "E2EE decryption failed with all available keys".into(),
20    ))
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct GenericEncryptedPayload {
26    pub success: bool,
27    #[serde(default)]
28    pub values: Vec<EncryptedPayload>,
29    #[serde(default)]
30    pub error: Option<serde_json::Value>,
31}
32
33fn always_32_bytes(bytes: &[u8]) -> [u8; 32] {
34    let mut out = [0u8; 32];
35    if bytes.len() >= 32 {
36        out.copy_from_slice(&bytes[..32]);
37    } else {
38        out[32 - bytes.len()..].copy_from_slice(bytes);
39    }
40    out
41}
42
43pub fn wallet_encrypt(
44    my_secret_key: &[u8; 32],
45    their_public_key_bytes: &[u8],
46    message: &[u8],
47) -> Result<EncryptedPayload, LitSdkError> {
48    let their_pk = always_32_bytes(their_public_key_bytes);
49    Ok(EncryptedPayload::encrypt(my_secret_key, &their_pk, message))
50}
51
52pub fn wallet_decrypt(
53    my_secret_key: &[u8; 32],
54    data: &EncryptedPayload,
55) -> Result<Vec<u8>, LitSdkError> {
56    let (decrypted, _their_pk) = data
57        .decrypt(my_secret_key)
58        .map_err(|e| LitSdkError::Crypto(e.to_string()))?;
59    Ok(decrypted)
60}