1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
//! `SignAlgorithm` trait and supporting types.
//!
//! # Responsibility scope
//! Defines the abstract interface for digital signature algorithms. Concrete implementations
//! live in `ml_dsa.rs` and `slh_dsa.rs`. This module owns the trait, `SignatureMode` markers,
//! and the `Keypair<A>` convenience wrapper.
//!
//! # Key types exported
//! - [`SignAlgorithm`] — core signature trait
//! - [`SignatureMode`] — marker trait for signature modes
//! - [`Detached`] — mode marker: signature is separate from message
//! - [`MessageMode`] — mode marker: signature is prepended to message
//! - [`Keypair`] — convenience holder for a signing + verifying key pair
//!
//! # Concurrency
//! `SignAlgorithm` requires `Send + Sync + 'static`. All operations are pure functions
//! over borrowed data; no mutable shared state.
//!
//! # Errors
//! Every fallible operation returns `Result<_, crate::error::CryptError>`.
//!
//! # Examples
//! ```rust,no_run
//! #[cfg(feature = "ml-dsa-backend")]
//! {
//! use crypt_guard::sign::algorithm::SignAlgorithm;
//! }
//! ```
use crateCryptError;
use ZeroizeOnDrop;
/// Marker trait for signature output modes.
///
/// # Description
/// Two modes are supported: [`Detached`] (signature bytes separate from the original message)
/// and [`MessageMode`] (signature prepended to the message). The mode is a type-level marker
/// so that the type system distinguishes the two at compile time.
///
/// # Concurrency
/// All implementors are ZST markers; `Send + Sync` trivially.
/// Signature mode: the signature is stored separately from the message.
///
/// # Description
/// Use `Detached` when you want to distribute the original message and the signature
/// independently. The signature can be verified against the original message bytes.
;
/// Signature mode: the signature bytes are prepended to the message.
///
/// # Description
/// Use `MessageMode` when the signed+message bundle is transmitted as a single blob.
/// Verification extracts the original message bytes from the bundle.
;
/// Abstract interface for a digital signature algorithm.
///
/// # Description
/// Implementors provide keypair generation, message signing, and signature verification.
/// The associated types carry ownership semantics:
/// - `SigningKey` must implement `ZeroizeOnDrop` to ensure secret material is wiped.
/// - `VerifyingKey` is not secret; no zeroization requirement.
/// - `Sig` holds raw signature bytes.
///
/// # Concurrency
/// Implementations must be `Send + Sync`. All operations are pure functions; no shared
/// mutable state is permitted inside implementors.
///
/// # Errors
/// - [`CryptError::SigningFailed`]: failure to produce a signature.
/// - [`CryptError::SignatureVerificationFailed`]: the signature did not verify.
///
/// # Examples
/// ```rust,no_run
/// #[cfg(feature = "ml-dsa-backend")]
/// {
/// use crypt_guard::sign::algorithm::SignAlgorithm;
/// use crypt_guard::sign::ml_dsa::MlDsa65Impl;
/// use crypt_guard::kem::backend::OsRng;
/// let mut rng = OsRng;
/// let (sk, vk) = MlDsa65Impl::keypair(&mut rng).unwrap();
/// let sig = MlDsa65Impl::sign(&sk, b"hello").unwrap();
/// MlDsa65Impl::verify(&vk, b"hello", &sig).unwrap();
/// }
/// ```
/// Convenience pair holding both keys from a `SignAlgorithm::keypair()` call.
///
/// # Description
/// Wraps a signing key and its paired verifying key. The verifying key can be
/// cloned and shared freely; the signing key is secret and will be zeroized on drop.
///
/// # Concurrency
/// `Send + Sync` where `A: SignAlgorithm`.