@@ -153,3 +153,157 @@ impl TryFrom<&Signature> for Vec<u8> {
153153 Ok ( ecdsa:: EcdsaSig :: try_from ( value) ?. to_der ( ) ?)
154154 }
155155}
156+ #[ cfg( test) ]
157+ mod tests {
158+ use super :: * ;
159+
160+ #[ test]
161+ fn test_signature_default ( ) {
162+ let sig: Signature = Signature :: default ( ) ;
163+ assert_eq ! ( sig. r( ) , & [ 0u8 ; 72 ] ) ;
164+ assert_eq ! ( sig. s( ) , & [ 0u8 ; 72 ] ) ;
165+ }
166+
167+ #[ test]
168+ fn test_signature_getters ( ) {
169+ let sig: Signature = Signature {
170+ r : [ 1u8 ; 72 ] ,
171+ s : [ 2u8 ; 72 ] ,
172+ _reserved : [ 0u8 ; 512 - ( SIG_PIECE_SIZE * 2 ) ] ,
173+ } ;
174+ assert_eq ! ( sig. r( ) , & [ 1u8 ; 72 ] ) ;
175+ assert_eq ! ( sig. s( ) , & [ 2u8 ; 72 ] ) ;
176+ }
177+
178+ #[ test]
179+ fn test_signature_eq ( ) {
180+ let sig1: Signature = Signature :: default ( ) ;
181+ let sig2: Signature = Signature :: default ( ) ;
182+ let sig3: Signature = Signature {
183+ r : [ 1u8 ; 72 ] ,
184+ s : [ 0u8 ; 72 ] ,
185+ _reserved : [ 0u8 ; 512 - ( SIG_PIECE_SIZE * 2 ) ] ,
186+ } ;
187+
188+ assert_eq ! ( sig1, sig2) ;
189+ assert_ne ! ( sig1, sig3) ;
190+ }
191+
192+ #[ test]
193+ fn test_signature_ord ( ) {
194+ let sig1: Signature = Signature :: default ( ) ;
195+ let sig2: Signature = Signature {
196+ r : [ 1u8 ; 72 ] ,
197+ s : [ 0u8 ; 72 ] ,
198+ _reserved : [ 0u8 ; 512 - ( SIG_PIECE_SIZE * 2 ) ] ,
199+ } ;
200+
201+ assert ! ( sig1 < sig2) ;
202+ }
203+
204+ #[ test]
205+ fn test_signature_debug ( ) {
206+ let sig: Signature = Signature :: default ( ) ;
207+ let debug_str: String = format ! ( "{:?}" , sig) ;
208+ assert ! ( debug_str. starts_with( "Signature { r: " ) ) ;
209+ assert ! ( debug_str. contains( ", s: " ) ) ;
210+ }
211+
212+ #[ test]
213+ fn test_signature_display ( ) {
214+ let sig: Signature = Signature :: default ( ) ;
215+ let display_str: String = format ! ( "{}" , sig) ;
216+ assert ! ( display_str. contains( "Signature:" ) ) ;
217+ assert ! ( display_str. contains( "R:" ) ) ;
218+ assert ! ( display_str. contains( "S:" ) ) ;
219+ }
220+
221+ #[ cfg( feature = "openssl" ) ]
222+ mod openssl_tests {
223+ use super :: * ;
224+ use openssl:: bn:: BigNum ;
225+ use std:: convert:: TryInto ;
226+
227+ #[ test]
228+ fn test_from_ecdsa_sig ( ) {
229+ let r = BigNum :: from_dec_str ( "123" ) . unwrap ( ) ;
230+ let s = BigNum :: from_dec_str ( "456" ) . unwrap ( ) ;
231+ let ecdsa_sig = ecdsa:: EcdsaSig :: from_private_components ( r, s) . unwrap ( ) ;
232+ let sig: Signature = ecdsa_sig. into ( ) ;
233+ assert_ne ! ( sig. r( ) , & [ 0u8 ; 72 ] ) ;
234+ assert_ne ! ( sig. s( ) , & [ 0u8 ; 72 ] ) ;
235+ }
236+
237+ #[ test]
238+ fn test_try_from_bytes ( ) {
239+ let r = BigNum :: from_dec_str ( "123" ) . unwrap ( ) ;
240+ let s = BigNum :: from_dec_str ( "456" ) . unwrap ( ) ;
241+ let ecdsa_sig = ecdsa:: EcdsaSig :: from_private_components ( r, s) . unwrap ( ) ;
242+ let der = ecdsa_sig. to_der ( ) . unwrap ( ) ;
243+ let sig = Signature :: try_from ( der. as_slice ( ) ) . unwrap ( ) ;
244+ assert_ne ! ( sig. r( ) , & [ 0u8 ; 72 ] ) ;
245+ assert_ne ! ( sig. s( ) , & [ 0u8 ; 72 ] ) ;
246+ }
247+
248+ #[ test]
249+ fn test_try_into_ecdsa_sig ( ) {
250+ let sig = Signature :: default ( ) ;
251+ let ecdsa_sig: ecdsa:: EcdsaSig = ( & sig) . try_into ( ) . unwrap ( ) ;
252+ assert_eq ! ( ecdsa_sig. r( ) . to_vec( ) , vec![ ] ) ;
253+ assert_eq ! ( ecdsa_sig. s( ) . to_vec( ) , vec![ ] ) ;
254+ }
255+
256+ #[ test]
257+ fn test_try_into_vec ( ) {
258+ let sig = Signature :: default ( ) ;
259+ let der: Vec < u8 > = ( & sig) . try_into ( ) . unwrap ( ) ;
260+ assert ! ( !der. is_empty( ) ) ;
261+ }
262+ }
263+
264+ #[ cfg( feature = "crypto_nossl" ) ]
265+ mod crypto_nossl_tests {
266+ use super :: * ;
267+ use std:: convert:: TryInto ;
268+
269+ #[ test]
270+ #[ should_panic]
271+ fn test_try_into_p384_signature_failure ( ) {
272+ let signature: Signature = Signature :: default ( ) ;
273+
274+ let _p384_sig: p384:: ecdsa:: Signature = ( & signature) . try_into ( ) . unwrap ( ) ;
275+ }
276+
277+ #[ test]
278+ fn test_try_into_p384_signature ( ) {
279+ // Test with non-zero values
280+ let sig = Signature {
281+ r : [ 1u8 ; 72 ] ,
282+ s : [ 2u8 ; 72 ] ,
283+ _reserved : [ 0u8 ; 512 - ( SIG_PIECE_SIZE * 2 ) ] ,
284+ } ;
285+ let p384_sig: p384:: ecdsa:: Signature = ( & sig) . try_into ( ) . unwrap ( ) ;
286+ assert_eq ! ( p384_sig. r( ) . to_bytes( ) . as_slice( ) , & [ 1u8 ; 48 ] ) ;
287+ assert_eq ! ( p384_sig. s( ) . to_bytes( ) . as_slice( ) , & [ 2u8 ; 48 ] ) ;
288+ }
289+ }
290+
291+ #[ test]
292+ fn test_signature_serde ( ) {
293+ let sig: Signature = Signature :: default ( ) ;
294+ let serialized: Vec < u8 > = bincode:: serialize ( & sig) . unwrap ( ) ;
295+ let deserialized: Signature = bincode:: deserialize ( & serialized) . unwrap ( ) ;
296+ assert_eq ! ( sig, deserialized) ;
297+ }
298+
299+ #[ test]
300+ fn test_signature_max_values ( ) {
301+ let sig: Signature = Signature {
302+ r : [ 0xFF ; 72 ] ,
303+ s : [ 0xFF ; 72 ] ,
304+ _reserved : [ 0u8 ; 512 - ( SIG_PIECE_SIZE * 2 ) ] ,
305+ } ;
306+ assert_eq ! ( sig. r( ) , & [ 0xFF ; 72 ] ) ;
307+ assert_eq ! ( sig. s( ) , & [ 0xFF ; 72 ] ) ;
308+ }
309+ }
0 commit comments