1use crate::error::LitSdkError;
2use serde::{Deserialize, Serialize};
3
4pub type EncryptedPayload = lit_sdk::EncryptedPayload<Vec<u8>>;
6
7pub 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}