spark_rust/signer/traits/mod.rs
1//! # Signer Traits for the Spark Wallet SDK
2//!
3//! This module defines the trait interfaces for the signing system in Spark.
4//! The signing system is a critical component that handles all cryptographic
5//! operations including key management, ECDSA signing, FROST threshold signing,
6//! and secure key derivation.
7//!
8//! ## Trait Architecture
9//!
10//! The signer follows a modular trait-based design:
11//!
12//! - [`SparkSigner`] - The main trait that composes all sub-traits
13//! - [`SparkSignerDerivationPath`] - Key derivation path handling using Spark's custom path scheme
14//! - [`SparkSignerEcdsa`] - ECDSA signature operations for identity verification
15//! - [`SparkSignerEcies`] - Encryption/decryption of secret keys between parties
16//! - [`SparkSignerFrost`] - FROST nonce and commitment management for threshold signing
17//! - [`SparkSignerFrostSigning`] - FROST threshold signature operations
18//! - [`SparkSignerSecp256k1`] - Secp256k1 keypair management
19//! - [`SparkSignerShamir`] - Verifiable secret sharing for secure key distribution
20//!
21//! This design allows for flexible implementation of different signing backends
22//! while ensuring all required cryptographic operations are supported.
23//!
24//! ## Implementation
25//!
26//! The SDK provides a default implementation [`DefaultSigner`](crate::signer::default_signer::DefaultSigner)
27//! that manages keys in memory. Users can implement custom signers for specialized
28//! needs such as hardware security modules or remote signing services.
29
30use crate::error::SparkSdkError;
31
32// Signer traits
33use crate::signer::traits::derivation_path::SparkSignerDerivationPath;
34use crate::signer::traits::ecdsa::SparkSignerEcdsa;
35use crate::signer::traits::ecies::SparkSignerEcies;
36use crate::signer::traits::frost::SparkSignerFrost;
37use crate::signer::traits::frost_signing::SparkSignerFrostSigning;
38use crate::signer::traits::secp256k1::SparkSignerSecp256k1;
39use crate::signer::traits::shamir::SparkSignerShamir;
40
41use crate::SparkNetwork;
42
43use tonic::async_trait;
44
45pub mod derivation_path;
46pub mod ecdsa;
47pub mod ecies;
48pub mod frost;
49pub mod frost_signing;
50pub mod secp256k1;
51pub mod shamir;
52
53/// The main signer trait that aggregates all cryptographic capabilities required
54/// for the Spark wallet.
55///
56/// This trait is the primary interface for implementing a signer for the Spark Wallet SDK.
57/// It combines all the specialized sub-traits that handle different aspects of the
58/// cryptographic operations needed in the Spark protocol.
59///
60/// Implementors must provide all the functionality defined in each sub-trait:
61///
62/// - [`SparkSignerShamir`]: Verifiable secret sharing operations
63/// - [`SparkSignerEcdsa`]: ECDSA signature operations
64/// - [`SparkSignerEcies`]: Encryption/decryption of secret keys
65/// - [`SparkSignerFrost`]: FROST nonce and commitment management
66/// - [`SparkSignerSecp256k1`]: Secp256k1 keypair operations
67/// - [`SparkSignerFrostSigning`]: FROST threshold signing operations
68/// - [`SparkSignerDerivationPath`]: Key derivation path handling
69///
70/// # Security Considerations
71///
72/// The signer implementation is responsible for securely managing private keys
73/// and other sensitive cryptographic material. Implementors should:
74///
75/// - Ensure proper isolation of private key material
76/// - Implement secure storage if keys are persisted
77/// - Follow best practices for cryptographic operations
78/// - Maintain Spark's specific derivation path scheme for compatibility
79#[async_trait]
80pub trait SparkSigner:
81 SparkSignerShamir
82 + SparkSignerEcdsa
83 + SparkSignerEcies
84 + SparkSignerFrost
85 + SparkSignerSecp256k1
86 + SparkSignerFrostSigning
87 + SparkSignerDerivationPath
88{
89 /// The constructed signer type, wrapped in a thread-safe reference-counted container.
90 ///
91 /// This associated type allows implementors to define their own wrapped signer type,
92 /// which typically is an `Arc<parking_lot::RwLock<Self>>` to enable thread-safe
93 /// access and mutation of the signer state.
94 type WrappedSigner: Sized;
95
96 /// Creates a new signer instance from a BIP-39 mnemonic phrase.
97 ///
98 /// This method initializes a signer using a mnemonic phrase, which is converted
99 /// to a seed for deriving all necessary keys. This is the recommended way to
100 /// create a signer for most applications.
101 ///
102 /// # Arguments
103 /// * `mnemonic` - The BIP-39 mnemonic phrase to derive keys from
104 /// * `network` - The Spark network to use (affects key derivation)
105 ///
106 /// # Returns
107 /// A wrapped signer instance or an error if initialization fails
108 ///
109 /// # Example
110 /// ```
111 /// # use spark_rust::signer::default_signer::DefaultSigner;
112 /// # use spark_rust::SparkNetwork;
113 /// # use spark_rust::error::SparkSdkError;
114 /// # use spark_rust::signer::traits::SparkSigner;
115 /// # async fn example() -> Result<(), SparkSdkError> {
116 /// let mnemonic = "abandon ability able about above absent absorb abstract absurd abuse access accident";
117 /// let signer = DefaultSigner::from_mnemonic(mnemonic, SparkNetwork::Regtest).await?;
118 /// # Ok(())
119 /// # }
120 /// ```
121 async fn from_mnemonic(
122 mnemonic: &str,
123 network: SparkNetwork,
124 ) -> Result<Self::WrappedSigner, SparkSdkError>;
125
126 /// Creates a new signer instance from a raw seed.
127 ///
128 /// This method initializes a signer using a raw seed byte array for deriving keys.
129 /// This is an alternative to using a mnemonic phrase when the seed is already available.
130 ///
131 /// # Arguments
132 /// * `master_seed` - The seed bytes to derive keys from
133 /// * `network` - The Spark network to use (affects key derivation)
134 ///
135 /// # Returns
136 /// A wrapped signer instance or an error if initialization fails
137 async fn from_master_seed(
138 master_seed: &[u8],
139 network: SparkNetwork,
140 ) -> Result<Self::WrappedSigner, SparkSdkError>;
141}