1use freenet_stdlib::prelude::*;
2use serde::{Deserialize, Serialize};
3
4#[cfg(feature = "crypto")]
5use ed25519_dalek::VerifyingKey;
6
7#[cfg(feature = "crypto")]
10pub fn fingerprint(verifying_key: &VerifyingKey) -> String {
11 let hash = blake3::hash(verifying_key.as_bytes());
12 bs58::encode(&hash.as_bytes()[..8]).into_string()
13}
14
15pub fn to_cbor<T: Serialize>(value: &T) -> Result<Vec<u8>, String> {
17 let mut buf = Vec::new();
18 ciborium::into_writer(value, &mut buf).map_err(|e| format!("CBOR serialize: {e}"))?;
19 Ok(buf)
20}
21
22pub fn from_cbor<T: for<'de> Deserialize<'de>>(bytes: &[u8]) -> Result<T, String> {
24 ciborium::from_reader(bytes).map_err(|e| format!("CBOR deserialize: {e}"))
25}
26
27#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
29#[non_exhaustive]
30pub enum SignatureRequestor {
31 WebApp(ContractInstanceId),
33 Delegate(DelegateKey),
35}
36
37#[derive(Serialize, Deserialize, Debug, Clone)]
40pub struct ScopedPayload {
41 pub requestor: SignatureRequestor,
42 pub payload: Vec<u8>,
43}
44
45#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
47pub struct GhostKeyInfo {
48 pub fingerprint: String,
49 pub label: Option<String>,
50 #[serde(rename = "delegate_info")]
55 pub notary_info: String,
56 #[serde(default)]
59 pub verifying_key_bytes: Option<Vec<u8>>,
60}
61
62#[derive(Serialize, Deserialize, Debug, Clone)]
64pub struct ExportedGhostKey {
65 pub fingerprint: String,
66 pub certificate_pem: String,
67 pub signing_key_pem: String,
68 pub label: Option<String>,
69 #[serde(rename = "delegate_info")]
70 pub notary_info: String,
71}
72
73#[derive(Serialize, Deserialize, Debug, Clone)]
75#[non_exhaustive]
76pub enum GhostkeyRequest {
77 ImportGhostKey {
80 certificate_pem: String,
81 signing_key_pem: String,
82 #[serde(default)]
83 master_verifying_key_pem: Option<String>,
84 },
85 ListGhostKeys,
87 GetGhostKey { fingerprint: String },
89 GetCertificate { fingerprint: String },
91 DeleteGhostKey { fingerprint: String },
93 SetLabel { fingerprint: String, label: String },
95 SignMessage {
98 fingerprint: String,
99 message: Vec<u8>,
100 },
101 SignWithDefault { message: Vec<u8> },
105 SetDefaultKey { fingerprint: String },
107 GetDefaultKey,
109 VerifySignedMessage { signed_message: Vec<u8> },
111 ExportGhostKey { fingerprint: String },
114 ExportAllGhostKeys,
116 GrantPermission {
118 fingerprint: String,
119 requestor: SignatureRequestor,
120 },
121 RevokePermission {
123 fingerprint: String,
124 requestor: SignatureRequestor,
125 },
126 ListPermissions { fingerprint: String },
128 TestPermissionPrompt { fingerprint: String },
130}
131
132#[derive(Serialize, Deserialize, Debug, Clone)]
134#[non_exhaustive]
135pub enum GhostkeyResponse {
136 ImportResult {
137 fingerprint: String,
138 #[serde(rename = "delegate_info")]
139 notary_info: String,
140 },
141 GhostKeyList {
142 keys: Vec<GhostKeyInfo>,
143 },
144 GhostKeyDetail {
145 fingerprint: String,
146 certificate_pem: String,
147 label: Option<String>,
148 #[serde(rename = "delegate_info")]
149 notary_info: String,
150 },
151 Certificate {
152 fingerprint: String,
153 certificate_pem: String,
154 },
155 SignResult {
156 scoped_payload: Vec<u8>,
158 signature: Vec<u8>,
160 certificate_pem: String,
162 },
163 DefaultKeyResult {
164 fingerprint: Option<String>,
165 },
166 DefaultKeySet {
167 fingerprint: String,
168 },
169 VerifyResult {
170 valid: bool,
171 signer_fingerprint: Option<String>,
172 #[serde(rename = "delegate_info")]
173 notary_info: Option<String>,
174 requestor: Option<SignatureRequestor>,
175 message: Option<Vec<u8>>,
176 },
177 Deleted {
178 fingerprint: String,
179 },
180 LabelSet {
181 fingerprint: String,
182 label: String,
183 },
184 PermissionGranted {
185 fingerprint: String,
186 requestor: SignatureRequestor,
187 },
188 PermissionRevoked {
189 fingerprint: String,
190 requestor: SignatureRequestor,
191 },
192 PermissionList {
193 fingerprint: String,
194 requestors: Vec<SignatureRequestor>,
195 },
196 ExportResult {
197 fingerprint: String,
198 certificate_pem: String,
199 signing_key_pem: String,
200 label: Option<String>,
201 },
202 ExportAllResult {
203 keys: Vec<ExportedGhostKey>,
204 },
205 PermissionDenied {
206 fingerprint: String,
207 requestor: SignatureRequestor,
208 },
209 NoIdentityAvailable,
212 KeyNotFound {
214 fingerprint: String,
215 },
216 Error {
218 message: String,
219 },
220}