use freenet_stdlib::prelude::*;
use serde::{Deserialize, Serialize};
#[cfg(feature = "crypto")]
use ed25519_dalek::VerifyingKey;
#[cfg(feature = "crypto")]
pub fn fingerprint(verifying_key: &VerifyingKey) -> String {
let hash = blake3::hash(verifying_key.as_bytes());
bs58::encode(&hash.as_bytes()[..8]).into_string()
}
pub fn to_cbor<T: Serialize>(value: &T) -> Result<Vec<u8>, String> {
let mut buf = Vec::new();
ciborium::into_writer(value, &mut buf).map_err(|e| format!("CBOR serialize: {e}"))?;
Ok(buf)
}
pub fn from_cbor<T: for<'de> Deserialize<'de>>(bytes: &[u8]) -> Result<T, String> {
ciborium::from_reader(bytes).map_err(|e| format!("CBOR deserialize: {e}"))
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum SignatureRequestor {
WebApp(ContractInstanceId),
Delegate(DelegateKey),
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ScopedPayload {
pub requestor: SignatureRequestor,
pub payload: Vec<u8>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct GhostKeyInfo {
pub fingerprint: String,
pub label: Option<String>,
#[serde(rename = "delegate_info")]
pub notary_info: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ExportedGhostKey {
pub fingerprint: String,
pub certificate_pem: String,
pub signing_key_pem: String,
pub label: Option<String>,
#[serde(rename = "delegate_info")]
pub notary_info: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[non_exhaustive]
pub enum GhostkeyRequest {
ImportGhostKey {
certificate_pem: String,
signing_key_pem: String,
#[serde(default)]
master_verifying_key_pem: Option<String>,
},
ListGhostKeys,
GetGhostKey { fingerprint: String },
GetCertificate { fingerprint: String },
DeleteGhostKey { fingerprint: String },
SetLabel { fingerprint: String, label: String },
SignMessage {
fingerprint: String,
message: Vec<u8>,
},
SignWithDefault { message: Vec<u8> },
SetDefaultKey { fingerprint: String },
GetDefaultKey,
VerifySignedMessage { signed_message: Vec<u8> },
ExportGhostKey { fingerprint: String },
ExportAllGhostKeys,
GrantPermission {
fingerprint: String,
requestor: SignatureRequestor,
},
RevokePermission {
fingerprint: String,
requestor: SignatureRequestor,
},
ListPermissions { fingerprint: String },
TestPermissionPrompt { fingerprint: String },
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[non_exhaustive]
pub enum GhostkeyResponse {
ImportResult {
fingerprint: String,
#[serde(rename = "delegate_info")]
notary_info: String,
},
GhostKeyList {
keys: Vec<GhostKeyInfo>,
},
GhostKeyDetail {
fingerprint: String,
certificate_pem: String,
label: Option<String>,
#[serde(rename = "delegate_info")]
notary_info: String,
},
Certificate {
fingerprint: String,
certificate_pem: String,
},
SignResult {
scoped_payload: Vec<u8>,
signature: Vec<u8>,
certificate_pem: String,
},
DefaultKeyResult {
fingerprint: Option<String>,
},
DefaultKeySet {
fingerprint: String,
},
VerifyResult {
valid: bool,
signer_fingerprint: Option<String>,
#[serde(rename = "delegate_info")]
notary_info: Option<String>,
requestor: Option<SignatureRequestor>,
message: Option<Vec<u8>>,
},
Deleted {
fingerprint: String,
},
LabelSet {
fingerprint: String,
label: String,
},
PermissionGranted {
fingerprint: String,
requestor: SignatureRequestor,
},
PermissionRevoked {
fingerprint: String,
requestor: SignatureRequestor,
},
PermissionList {
fingerprint: String,
requestors: Vec<SignatureRequestor>,
},
ExportResult {
fingerprint: String,
certificate_pem: String,
signing_key_pem: String,
label: Option<String>,
},
ExportAllResult {
keys: Vec<ExportedGhostKey>,
},
PermissionDenied {
fingerprint: String,
requestor: SignatureRequestor,
},
NoIdentityAvailable,
KeyNotFound {
fingerprint: String,
},
Error {
message: String,
},
}