lit_node_core/models/
signable.rs

1use crate::{Error, Result};
2use serde::{Deserialize, Serialize};
3
4/// The ECDSA signature shares
5#[derive(Clone, Serialize, Deserialize, Debug)]
6pub struct EcdsaSignedMessageShare {
7    pub digest: String,
8    pub result: String,
9    pub share_id: String,
10    pub peer_id: String,
11    pub signature_share: String,
12    pub big_r: String,
13    pub compressed_public_key: String,
14    pub public_key: String,
15    pub sig_type: String,
16}
17
18/// Frost / Schnorr signature shares
19#[derive(Clone, Serialize, Deserialize, Debug)]
20pub struct FrostSignedMessageShare {
21    pub message: String,
22    pub result: String,
23    pub share_id: String,
24    pub peer_id: String,
25    pub signature_share: String,
26    pub signing_commitments: String,
27    pub verifying_share: String,
28    pub public_key: String,
29    pub sig_type: String,
30}
31
32/// Bls signature shares
33#[derive(Clone, Serialize, Deserialize, Debug)]
34pub struct BlsSignedMessageShare {
35    pub message: String,
36    pub result: String,
37    pub peer_id: String,
38    pub share_id: String,
39    pub signature_share: String,
40    pub verifying_share: String,
41    pub public_key: String,
42    pub sig_type: String,
43}
44
45/// The output signature types
46#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
47pub enum SignableOutput {
48    /// Ecdsa signature shares
49    EcdsaSignedMessageShare(EcdsaSignedMessageShare),
50    /// Frost / Schnorr signature shares
51    FrostSignedMessageShare(FrostSignedMessageShare),
52    /// Bls signature shares
53    BlsSignedMessageShare(BlsSignedMessageShare),
54}
55
56impl From<EcdsaSignedMessageShare> for SignableOutput {
57    fn from(share: EcdsaSignedMessageShare) -> Self {
58        SignableOutput::EcdsaSignedMessageShare(share)
59    }
60}
61
62impl From<FrostSignedMessageShare> for SignableOutput {
63    fn from(share: FrostSignedMessageShare) -> Self {
64        SignableOutput::FrostSignedMessageShare(share)
65    }
66}
67
68impl From<BlsSignedMessageShare> for SignableOutput {
69    fn from(share: BlsSignedMessageShare) -> Self {
70        SignableOutput::BlsSignedMessageShare(share)
71    }
72}
73
74impl SignableOutput {
75    /// The failed message type for ECDSA
76    pub fn ecdsa_failed_message_share() -> Self {
77        EcdsaSignedMessageShare {
78            digest: "".to_string(),
79            result: "fail".to_string(),
80            signature_share: "".to_string(),
81            share_id: "".to_string(),
82            peer_id: "".to_string(),
83            big_r: "".to_string(),
84            compressed_public_key: "".to_string(),
85            public_key: "".to_string(),
86            sig_type: "".to_string(),
87        }
88        .into()
89    }
90
91    /// Extract an ECDSA signature share
92    pub fn ecdsa_signed_message_share(&self) -> Result<EcdsaSignedMessageShare> {
93        match self {
94            SignableOutput::EcdsaSignedMessageShare(share) => Ok((*share).clone()),
95            _ => Err(Error::InvalidType(
96                "Invalid SignableOutput type".to_string(),
97            )),
98        }
99    }
100
101    /// Extract a Frost / Schnorr signature share
102    pub fn frost_signed_message_share(&self) -> Result<FrostSignedMessageShare> {
103        match self {
104            SignableOutput::FrostSignedMessageShare(share) => Ok((*share).clone()),
105            _ => Err(Error::InvalidType(
106                "Invalid SignableOutput type".to_string(),
107            )),
108        }
109    }
110
111    /// Extract a BLS signature share
112    pub fn bls_signed_message_share(&self) -> Result<BlsSignedMessageShare> {
113        match self {
114            SignableOutput::BlsSignedMessageShare(share) => Ok((*share).clone()),
115            _ => Err(Error::InvalidType(
116                "Invalid SignableOutput type".to_string(),
117            )),
118        }
119    }
120}