3
3
#[ cfg( any( feature = "openssl" , feature = "crypto_nossl" ) ) ]
4
4
use super :: * ;
5
5
6
- use crate :: util:: hexdump;
6
+ use crate :: { firmware :: parser :: ByteParser , util:: hexdump} ;
7
7
8
8
#[ cfg( feature = "openssl" ) ]
9
9
use crate :: certs:: snp:: { AsLeBytes , FromLe } ;
@@ -17,8 +17,8 @@ use serde_big_array::BigArray;
17
17
#[ cfg( feature = "openssl" ) ]
18
18
use openssl:: { bn, ecdsa} ;
19
19
20
- const SIG_PIECE_SIZE : usize = std:: mem:: size_of :: < [ u8 ; 72 ] > ( ) ;
21
- const R_S_SIZE : usize = SIG_PIECE_SIZE * 2usize ;
20
+ pub ( crate ) const SIG_PIECE_SIZE : usize = std:: mem:: size_of :: < [ u8 ; 72 ] > ( ) ;
21
+ pub ( crate ) const R_S_SIZE : usize = SIG_PIECE_SIZE * 2usize ;
22
22
23
23
#[ repr( C ) ]
24
24
#[ derive( Copy , Clone , Deserialize , Serialize , PartialOrd , Ord ) ]
@@ -33,6 +33,14 @@ pub struct Signature {
33
33
}
34
34
35
35
impl Signature {
36
+ /// Creates a new signature from the values specified
37
+ pub fn new ( r : [ u8 ; 72 ] , s : [ u8 ; 72 ] ) -> Self {
38
+ Self {
39
+ r,
40
+ s,
41
+ ..Default :: default ( )
42
+ }
43
+ }
36
44
/// Returns the signatures `r` component
37
45
pub fn r ( & self ) -> & [ u8 ; 72 ] {
38
46
& self . r
@@ -55,23 +63,46 @@ impl std::fmt::Debug for Signature {
55
63
}
56
64
}
57
65
58
- impl Eq for Signature { }
59
- impl PartialEq for Signature {
60
- fn eq ( & self , other : & Signature ) -> bool {
61
- self . r [ ..] == other. r [ ..] && self . s [ ..] == other. s [ ..]
66
+ impl Default for Signature {
67
+ fn default ( ) -> Self {
68
+ ByteParser :: default ( )
62
69
}
63
70
}
64
71
65
- impl Default for Signature {
72
+ impl ByteParser for Signature {
73
+ type Bytes = [ u8 ; 512 ] ;
74
+ #[ inline( always) ]
75
+ fn from_bytes ( bytes : Self :: Bytes ) -> Self {
76
+ let mut r = [ 0 ; 72 ] ;
77
+ let mut s = [ 0 ; 72 ] ;
78
+ r. copy_from_slice ( & bytes[ 0 ..72 ] ) ;
79
+ s. copy_from_slice ( & bytes[ 72 ..144 ] ) ;
80
+ Self :: new ( r, s)
81
+ }
82
+ #[ inline( always) ]
83
+ fn to_bytes ( & self ) -> Self :: Bytes {
84
+ let mut bytes = [ 0u8 ; 512 ] ;
85
+ bytes[ 0 ..72 ] . copy_from_slice ( & self . r ) ;
86
+ bytes[ 72 ..144 ] . copy_from_slice ( & self . s ) ;
87
+ bytes
88
+ }
89
+ #[ inline( always) ]
66
90
fn default ( ) -> Self {
67
- Signature {
68
- r : [ 0u8 ; 72 ] ,
69
- s : [ 0u8 ; 72 ] ,
70
- _reserved : [ 0u8 ; ( 512 - ( SIG_PIECE_SIZE * 2 ) ) ] ,
91
+ Self {
92
+ r : [ 0 ; 72 ] ,
93
+ s : [ 0 ; 72 ] ,
94
+ _reserved : [ 0 ; 512 - R_S_SIZE ] ,
71
95
}
72
96
}
73
97
}
74
98
99
+ impl Eq for Signature { }
100
+ impl PartialEq for Signature {
101
+ fn eq ( & self , other : & Signature ) -> bool {
102
+ self . r [ ..] == other. r [ ..] && self . s [ ..] == other. s [ ..]
103
+ }
104
+ }
105
+
75
106
impl std:: fmt:: Display for Signature {
76
107
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
77
108
write ! (
@@ -159,7 +190,7 @@ mod tests {
159
190
160
191
#[ test]
161
192
fn test_signature_default ( ) {
162
- let sig: Signature = Signature :: default ( ) ;
193
+ let sig: Signature = Default :: default ( ) ;
163
194
assert_eq ! ( sig. r( ) , & [ 0u8 ; 72 ] ) ;
164
195
assert_eq ! ( sig. s( ) , & [ 0u8 ; 72 ] ) ;
165
196
}
@@ -177,8 +208,8 @@ mod tests {
177
208
178
209
#[ test]
179
210
fn test_signature_eq ( ) {
180
- let sig1: Signature = Signature :: default ( ) ;
181
- let sig2: Signature = Signature :: default ( ) ;
211
+ let sig1: Signature = Default :: default ( ) ;
212
+ let sig2: Signature = Default :: default ( ) ;
182
213
let sig3: Signature = Signature {
183
214
r : [ 1u8 ; 72 ] ,
184
215
s : [ 0u8 ; 72 ] ,
@@ -191,7 +222,7 @@ mod tests {
191
222
192
223
#[ test]
193
224
fn test_signature_ord ( ) {
194
- let sig1: Signature = Signature :: default ( ) ;
225
+ let sig1: Signature = Default :: default ( ) ;
195
226
let sig2: Signature = Signature {
196
227
r : [ 1u8 ; 72 ] ,
197
228
s : [ 0u8 ; 72 ] ,
@@ -203,15 +234,15 @@ mod tests {
203
234
204
235
#[ test]
205
236
fn test_signature_debug ( ) {
206
- let sig: Signature = Signature :: default ( ) ;
237
+ let sig: Signature = Default :: default ( ) ;
207
238
let debug_str: String = format ! ( "{:?}" , sig) ;
208
239
assert ! ( debug_str. starts_with( "Signature { r: " ) ) ;
209
240
assert ! ( debug_str. contains( ", s: " ) ) ;
210
241
}
211
242
212
243
#[ test]
213
244
fn test_signature_display ( ) {
214
- let sig: Signature = Signature :: default ( ) ;
245
+ let sig: Signature = Default :: default ( ) ;
215
246
let display_str: String = format ! ( "{}" , sig) ;
216
247
assert ! ( display_str. contains( "Signature:" ) ) ;
217
248
assert ! ( display_str. contains( "R:" ) ) ;
@@ -247,15 +278,15 @@ mod tests {
247
278
248
279
#[ test]
249
280
fn test_try_into_ecdsa_sig ( ) {
250
- let sig = Signature :: default ( ) ;
281
+ let sig: Signature = Default :: default ( ) ;
251
282
let ecdsa_sig: ecdsa:: EcdsaSig = ( & sig) . try_into ( ) . unwrap ( ) ;
252
283
assert_eq ! ( ecdsa_sig. r( ) . to_vec( ) , vec![ ] ) ;
253
284
assert_eq ! ( ecdsa_sig. s( ) . to_vec( ) , vec![ ] ) ;
254
285
}
255
286
256
287
#[ test]
257
288
fn test_try_into_vec ( ) {
258
- let sig = Signature :: default ( ) ;
289
+ let sig: Signature = Default :: default ( ) ;
259
290
let der: Vec < u8 > = ( & sig) . try_into ( ) . unwrap ( ) ;
260
291
assert ! ( !der. is_empty( ) ) ;
261
292
}
@@ -269,7 +300,7 @@ mod tests {
269
300
#[ test]
270
301
#[ should_panic]
271
302
fn test_try_into_p384_signature_failure ( ) {
272
- let signature: Signature = Signature :: default ( ) ;
303
+ let signature: Signature = Default :: default ( ) ;
273
304
274
305
let _p384_sig: p384:: ecdsa:: Signature = ( & signature) . try_into ( ) . unwrap ( ) ;
275
306
}
@@ -290,7 +321,7 @@ mod tests {
290
321
291
322
#[ test]
292
323
fn test_signature_serde ( ) {
293
- let sig: Signature = Signature :: default ( ) ;
324
+ let sig: Signature = Default :: default ( ) ;
294
325
let serialized: Vec < u8 > = bincode:: serialize ( & sig) . unwrap ( ) ;
295
326
let deserialized: Signature = bincode:: deserialize ( & serialized) . unwrap ( ) ;
296
327
assert_eq ! ( sig, deserialized) ;
0 commit comments