1cfg_if::cfg_if! {
2 if #[cfg(feature = "std")] {
3 use std::borrow::Cow;
4 } else {
5 use alloc::borrow::Cow;
6 }
7}
8use super::common::{
9 CURVE_NAME, PRIVATE_KEY_LENGTH, PUBLIC_KEY_LENGTH, PrivateKeyInner, PublicKeyInner,
10 impl_private_key_wrapper, impl_public_key_wrapper,
11};
12use bytes::{Buf, BufMut};
13use commonware_codec::{Error as CodecError, FixedArray, FixedSize, Read, ReadExt, Write};
14use commonware_formatting::Hex;
15use commonware_utils::{Array, Span, union_unique};
16use core::{
17 fmt::{Debug, Display},
18 hash::{Hash, Hasher},
19 ops::Deref,
20};
21use ecdsa::RecoveryId;
22use p256::{ecdsa::VerifyingKey, elliptic_curve::scalar::IsHigh};
23
24const BASE_SIGNATURE_LENGTH: usize = 64; const SIGNATURE_LENGTH: usize = 1 + BASE_SIGNATURE_LENGTH; #[derive(Clone, Eq, PartialEq)]
29pub struct PrivateKey(PrivateKeyInner);
30
31impl_private_key_wrapper!(PrivateKey);
32
33impl crate::Signer for PrivateKey {
34 type Signature = Signature;
35 type PublicKey = PublicKey;
36
37 fn sign(&self, namespace: &[u8], msg: &[u8]) -> Self::Signature {
38 self.sign_inner(Some(namespace), msg)
39 }
40
41 fn public_key(&self) -> Self::PublicKey {
42 PublicKey(PublicKeyInner::from_private_key(&self.0))
43 }
44}
45
46impl PrivateKey {
47 #[inline(always)]
48 fn sign_inner(&self, namespace: Option<&[u8]>, msg: &[u8]) -> Signature {
49 let payload = namespace.map_or(Cow::Borrowed(msg), |namespace| {
50 Cow::Owned(union_unique(namespace, msg))
51 });
52 let (mut signature, mut recovery_id) =
53 self.0.key.expose(|key| key.sign_recoverable(&payload));
54
55 if signature.s().is_high().into() {
59 signature = signature.normalize_s();
60 recovery_id = RecoveryId::new(!recovery_id.is_y_odd(), recovery_id.is_x_reduced());
61 }
62
63 Signature::new(signature, recovery_id)
64 }
65}
66
67impl From<PrivateKey> for PublicKey {
68 fn from(value: PrivateKey) -> Self {
69 Self(PublicKeyInner::from_private_key(&value.0))
70 }
71}
72
73#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, FixedArray)]
75#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
76pub struct PublicKey(PublicKeyInner);
77
78impl_public_key_wrapper!(PublicKey);
79
80impl crate::Verifier for PublicKey {
81 type Signature = Signature;
82
83 fn verify(&self, namespace: &[u8], msg: &[u8], sig: &Self::Signature) -> bool {
84 self.verify_inner(Some(namespace), msg, sig)
85 }
86}
87
88impl PublicKey {
89 #[inline(always)]
90 fn verify_inner(&self, namespace: Option<&[u8]>, msg: &[u8], sig: &Signature) -> bool {
91 let Some(recovered_signer) = sig.recover_signer_inner(namespace, msg) else {
92 return false;
93 };
94 &recovered_signer == self
95 }
96}
97
98#[derive(Clone, Eq, PartialEq, FixedArray)]
100pub struct Signature {
101 raw: [u8; SIGNATURE_LENGTH],
102 recovery_id: RecoveryId,
103 signature: p256::ecdsa::Signature,
104}
105
106impl Signature {
107 fn new(signature: p256::ecdsa::Signature, recovery_id: RecoveryId) -> Self {
108 let mut raw = [0u8; SIGNATURE_LENGTH];
109 raw[0] = recovery_id.to_byte();
110 raw[1..].copy_from_slice(signature.to_bytes().as_slice());
111
112 Self {
113 raw,
114 recovery_id,
115 signature,
116 }
117 }
118}
119
120impl crate::Signature for Signature {}
121
122impl crate::Recoverable for Signature {
123 type PublicKey = PublicKey;
124
125 fn recover_signer(&self, namespace: &[u8], msg: &[u8]) -> Option<Self::PublicKey> {
126 self.recover_signer_inner(Some(namespace), msg)
127 }
128}
129
130impl Signature {
131 #[inline(always)]
132 fn recover_signer_inner(&self, namespace: Option<&[u8]>, msg: &[u8]) -> Option<PublicKey> {
133 let payload = namespace.map_or(Cow::Borrowed(msg), |namespace| {
134 Cow::Owned(union_unique(namespace, msg))
135 });
136
137 VerifyingKey::recover_from_msg(payload.as_ref(), &self.signature, self.recovery_id)
138 .ok()
139 .map(|k| PublicKey(PublicKeyInner::from(k)))
140 }
141}
142
143impl Write for Signature {
144 fn write(&self, buf: &mut impl BufMut) {
145 self.raw.write(buf);
146 }
147}
148
149impl Read for Signature {
150 type Cfg = ();
151
152 fn read_cfg(buf: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
153 let raw = <[u8; Self::SIZE]>::read(buf)?;
154 let recovery_id = RecoveryId::from_byte(raw[0])
155 .ok_or_else(|| CodecError::Invalid(CURVE_NAME, "RecoveryId out of range"))?;
156 let result = p256::ecdsa::Signature::from_slice(&raw[1..]);
157 #[cfg(feature = "std")]
158 let signature = result.map_err(|e| CodecError::Wrapped(CURVE_NAME, e.into()))?;
159 #[cfg(not(feature = "std"))]
160 let signature = result
161 .map_err(|e| CodecError::Wrapped(CURVE_NAME, alloc::format!("{:?}", e).into()))?;
162 if signature.s().is_high().into() {
164 return Err(CodecError::Invalid(CURVE_NAME, "Signature S is high"));
165 }
166 Ok(Self {
167 raw,
168 signature,
169 recovery_id,
170 })
171 }
172}
173
174impl FixedSize for Signature {
175 const SIZE: usize = SIGNATURE_LENGTH;
176}
177
178impl Span for Signature {}
179
180impl Array for Signature {}
181
182impl Hash for Signature {
183 fn hash<H: Hasher>(&self, state: &mut H) {
184 self.raw.hash(state);
185 }
186}
187
188impl Ord for Signature {
189 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
190 self.raw.cmp(&other.raw)
191 }
192}
193
194impl PartialOrd for Signature {
195 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
196 Some(self.cmp(other))
197 }
198}
199
200impl AsRef<[u8]> for Signature {
201 fn as_ref(&self) -> &[u8] {
202 &self.raw
203 }
204}
205
206impl Deref for Signature {
207 type Target = [u8];
208 fn deref(&self) -> &[u8] {
209 &self.raw
210 }
211}
212
213impl Debug for Signature {
214 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
215 write!(f, "{}", Hex(&self.raw))
216 }
217}
218
219impl Display for Signature {
220 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
221 write!(f, "{}", Hex(&self.raw))
222 }
223}
224
225#[cfg(feature = "arbitrary")]
226impl arbitrary::Arbitrary<'_> for Signature {
227 fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
228 use crate::Signer;
229 use commonware_math::algebra::Random;
230 use rand::{SeedableRng, rngs::StdRng};
231
232 let mut rand = StdRng::from_seed(u.arbitrary::<[u8; 32]>()?);
233 let private_key = PrivateKey(PrivateKeyInner::random(&mut rand));
234 let len = u.arbitrary::<usize>()? % 256;
235 let message = u
236 .arbitrary_iter()?
237 .take(len)
238 .collect::<Result<Vec<_>, _>>()?;
239
240 Ok(private_key.sign(&[], &message))
241 }
242}
243
244#[cfg(test)]
245mod tests {
246 use super::*;
247 use crate::{Recoverable, Signer as _, Verifier as _, secp256r1::common::tests::*};
248 use bytes::Bytes;
249 use commonware_codec::{DecodeExt, Encode};
250 use ecdsa::RecoveryId;
251 use p256::elliptic_curve::scalar::IsHigh;
252 use rstest::rstest;
253
254 const NAMESPACE: &[u8] = b"test-namespace";
255
256 fn encode_signature_with_recovery(
257 verifying_key: &VerifyingKey,
258 message: &[u8],
259 signature: &p256::ecdsa::Signature,
260 ) -> Vec<u8> {
261 let recovery_id = RecoveryId::trial_recovery_from_msg(verifying_key, message, signature)
262 .unwrap_or_else(|_| RecoveryId::new(false, false));
263 Signature::new(*signature, recovery_id).encode().to_vec()
264 }
265
266 #[test]
267 fn test_recover_signer_flipped_y_parity_fails() {
268 let private_key = PrivateKey(create_private_key());
269 let expected_public_key = private_key.public_key();
270 let message = b"recover with no namespace";
271
272 let mut signature = private_key.sign(NAMESPACE, message);
273
274 signature.recovery_id = RecoveryId::new(
275 !signature.recovery_id.is_y_odd(),
276 signature.recovery_id.is_x_reduced(),
277 );
278
279 let recovered = signature.recover_signer(NAMESPACE, message);
280
281 assert_ne!(
282 recovered,
283 Some(expected_public_key),
284 "flipped y-parity must fail recovery"
285 );
286
287 assert!(
288 !private_key
289 .public_key()
290 .verify(NAMESPACE, message, &signature)
291 );
292 }
293
294 #[test]
295 fn test_recover_signer_with_namespace() {
296 let private_key = PrivateKey(create_private_key());
297 let expected_public_key = private_key.public_key();
298 let message = b"recover with namespace";
299
300 let signature = private_key.sign(NAMESPACE, message);
301 let recovered = signature.recover_signer(NAMESPACE, message);
302 assert_eq!(recovered, Some(expected_public_key));
303 }
304
305 #[test]
306 fn test_recover_signer_mismatched_message_does_not_match_public_key() {
307 let private_key = PrivateKey(create_private_key());
308 let original_message = b"recover with namespace";
309 let expected_public_key = private_key.public_key();
310 let signature = private_key.sign(NAMESPACE, original_message);
311
312 let recovered = signature.recover_signer(NAMESPACE, b"different message");
313 assert_ne!(
314 recovered,
315 Some(expected_public_key),
316 "mismatched message must not recover the original public key"
317 );
318 }
319
320 #[test]
321 fn test_codec_private_key() {
322 let original = PrivateKey(create_private_key());
323 let encoded = original.encode();
324 assert_eq!(encoded.len(), PRIVATE_KEY_LENGTH);
325
326 let decoded = PrivateKey::decode(encoded).unwrap();
327 assert_eq!(original, decoded);
328 }
329
330 #[test]
331 fn test_codec_public_key() {
332 let private_key = PrivateKey(create_private_key());
333 let original = PublicKey::from(private_key);
334
335 let encoded = original.encode();
336 assert_eq!(encoded.len(), PUBLIC_KEY_LENGTH);
337
338 let decoded = PublicKey::decode(encoded).unwrap();
339 assert_eq!(original, decoded);
340 }
341
342 #[test]
343 fn test_codec_signature() {
344 let private_key = PrivateKey(create_private_key());
345 let original = private_key.sign(NAMESPACE, "Hello World".as_bytes());
346
347 let encoded = original.encode();
348 assert_eq!(encoded.len(), SIGNATURE_LENGTH);
349
350 let decoded = Signature::decode(encoded).unwrap();
351 assert_eq!(original, decoded);
352 }
353
354 #[test]
355 fn test_codec_signature_invalid() {
356 let (_, sig, ..) = vector_sig_verification_5();
357 let result = Signature::decode(Bytes::from(sig));
358 assert!(result.is_err());
359 }
360
361 #[test]
362 fn test_scheme_sign() {
363 let private_key: PrivateKey = PrivateKey::decode(
364 commonware_formatting::from_hex(
365 "519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464",
366 )
367 .unwrap()
368 .as_ref(),
369 )
370 .unwrap();
371 let public_key: PublicKey = private_key.clone().into();
372 let message = commonware_formatting::from_hex(
373 "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045e
374 e2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf
375 9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8",
376 )
377 .unwrap();
378 let signature = private_key.sign(NAMESPACE, &message);
379 assert_eq!(SIGNATURE_LENGTH, signature.len());
380 assert!(public_key.verify(NAMESPACE, &message, &signature));
381 }
382
383 #[test]
384 fn test_decode_zero_signature_fails() {
385 let result = Signature::decode(vec![0u8; SIGNATURE_LENGTH].as_ref());
386 assert!(result.is_err());
387 }
388
389 #[test]
390 fn test_decode_high_s_signature_fails() {
391 let (inner, _) = vector_keypair_1();
392 let private_key = PrivateKey(inner);
393 let message = b"edge";
394 let signature = private_key.sign(NAMESPACE, message);
395 let mut bad_signature = signature.to_vec();
396 bad_signature[33] |= 0x80;
397 assert!(Signature::decode(bad_signature.as_ref()).is_err());
398 }
399
400 #[test]
401 fn test_decode_zero_r_signature_fails() {
402 let (inner, _) = vector_keypair_1();
403 let private_key = PrivateKey(inner);
404 let message = b"edge";
405 let signature = private_key.sign(NAMESPACE, message);
406 let mut bad_signature = signature.to_vec();
407 for b in bad_signature.iter_mut().skip(1).take(32) {
408 *b = 0x00;
409 }
410 bad_signature[33] = 1;
411 assert!(Signature::decode(bad_signature.as_ref()).is_err());
412 }
413
414 #[test]
415 fn test_rfc6979() {
416 let private_key: PrivateKey = PrivateKey::decode(
417 commonware_formatting::from_hex(
418 "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721",
419 )
420 .unwrap()
421 .as_ref(),
422 )
423 .unwrap();
424
425 let (message, exp_sig) = (
426 b"sample",
427 p256::ecdsa::Signature::from_slice(
428 &commonware_formatting::from_hex(
429 "efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716
430 f7cb1c942d657c41d436c7a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8",
431 )
432 .unwrap(),
433 )
434 .unwrap(),
435 );
436 let signature = private_key.sign_inner(None, message);
437 assert_eq!(
438 signature.signature.to_bytes().to_vec(),
439 exp_sig.normalize_s().to_bytes().to_vec()
440 );
441
442 let (message, exp_sig) = (
443 b"test",
444 p256::ecdsa::Signature::from_slice(
445 &commonware_formatting::from_hex(
446 "f1abb023518351cd71d881567b1ea663ed3efcf6c5132b354f28d3b0b7d38367
447 019f4113742a2b14bd25926b49c649155f267e60d3814b4c0cc84250e46f0083",
448 )
449 .unwrap(),
450 )
451 .unwrap(),
452 );
453
454 let signature = private_key.sign_inner(None, message);
455 assert_eq!(
456 signature.signature.to_bytes().to_vec(),
457 exp_sig.to_bytes().to_vec()
458 );
459 }
460
461 #[test]
462 fn test_scheme_validate_public_key_too_long() {
463 let qx_hex = "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f";
464 let qy_hex = "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f";
465
466 let uncompressed_public_key = parse_public_key_as_uncompressed_vector(qx_hex, qy_hex);
467 let public_key = PublicKey::decode(uncompressed_public_key.as_ref());
468 assert!(matches!(public_key, Err(CodecError::Invalid(_, _))));
469
470 let mut compressed_public_key = parse_public_key_as_compressed_vector(qx_hex, qy_hex);
471 compressed_public_key.push(0u8);
472 let public_key = PublicKey::decode(compressed_public_key.as_ref());
473 assert!(matches!(public_key, Err(CodecError::ExtraData(1))));
474
475 let compressed_public_key = parse_public_key_as_compressed_vector(qx_hex, qy_hex);
476 let public_key = PublicKey::decode(compressed_public_key.as_ref());
477 assert!(public_key.is_ok());
478 }
479
480 #[test]
481 fn test_scheme_verify_signature_r0() {
482 let private_key: PrivateKey = PrivateKey::decode(
483 commonware_formatting::from_hex(
484 "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
485 )
486 .unwrap()
487 .as_ref(),
488 )
489 .unwrap();
490 let message = b"sample";
491 let signature = private_key.sign(NAMESPACE, message);
492 let mut signature = signature.to_vec();
493 signature[1..33].fill(0);
494
495 assert!(Signature::decode(signature.as_ref()).is_err());
496 }
497
498 #[test]
499 fn test_scheme_verify_signature_s0() {
500 let private_key: PrivateKey = PrivateKey::decode(
501 commonware_formatting::from_hex(
502 "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
503 )
504 .unwrap()
505 .as_ref(),
506 )
507 .unwrap();
508 let message = b"sample";
509 let signature = private_key.sign(NAMESPACE, message);
510 let mut signature = signature.to_vec();
511 signature[33..].fill(0);
512
513 assert!(Signature::decode(signature.as_ref()).is_err());
514 }
515
516 #[rstest]
517 #[case(vector_keypair_1())]
518 #[case(vector_keypair_2())]
519 #[case(vector_keypair_3())]
520 #[case(vector_keypair_4())]
521 #[case(vector_keypair_5())]
522 #[case(vector_keypair_6())]
523 #[case(vector_keypair_7())]
524 #[case(vector_keypair_8())]
525 #[case(vector_keypair_9())]
526 #[case(vector_keypair_10())]
527 fn test_keypairs(#[case] (inner_priv, inner_pub): (PrivateKeyInner, PublicKeyInner)) {
528 let private_key = PrivateKey(inner_priv);
529 let public_key = PublicKey::from(private_key);
530 let exp_public_key = PublicKey(inner_pub);
531 assert_eq!(exp_public_key, public_key);
532 assert!(public_key.len() == PUBLIC_KEY_LENGTH);
533 }
534
535 #[rstest]
536 #[case(1, vector_public_key_validation_1())]
537 #[case(3, vector_public_key_validation_3())]
538 #[case(4, vector_public_key_validation_4())]
539 #[case(5, vector_public_key_validation_5())]
540 #[case(6, vector_public_key_validation_6())]
541 #[case(7, vector_public_key_validation_7())]
542 #[case(8, vector_public_key_validation_8())]
543 #[case(9, vector_public_key_validation_9())]
544 #[case(10, vector_public_key_validation_10())]
545 #[case(12, vector_public_key_validation_12())]
546 fn test_public_key_validation(
547 #[case] n: usize,
548 #[case] (public_key, exp_valid): (Vec<u8>, bool),
549 ) {
550 let res = PublicKey::decode(public_key.as_ref());
551 assert_eq!(exp_valid, res.is_ok(), "vector_public_key_validation_{n}");
552 }
553
554 fn vector_sig_verification_1() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
555 let (public_key, sig, message, expected) = vector_sig_verification_1_raw();
556 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
557 (PublicKey(public_key), encoded, message, expected)
558 }
559
560 fn vector_sig_verification_2() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
561 let (public_key, sig, message, expected) = vector_sig_verification_2_raw();
562 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
563 (PublicKey(public_key), encoded, message, expected)
564 }
565
566 fn vector_sig_verification_3() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
567 let (public_key, sig, message, expected) = vector_sig_verification_3_raw();
568 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
569 (PublicKey(public_key), encoded, message, expected)
570 }
571
572 fn vector_sig_verification_4() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
573 let (public_key, sig, message, expected) = vector_sig_verification_4_raw();
574 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
575 (PublicKey(public_key), encoded, message, expected)
576 }
577
578 fn vector_sig_verification_5() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
579 let (public_key, sig, message, expected) = vector_sig_verification_5_raw();
580 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
581 (PublicKey(public_key), encoded, message, expected)
582 }
583
584 fn vector_sig_verification_6() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
585 let (public_key, sig, message, expected) = vector_sig_verification_6_raw();
586 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
587 (PublicKey(public_key), encoded, message, expected)
588 }
589
590 fn vector_sig_verification_7() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
591 let (public_key, sig, message, expected) = vector_sig_verification_7_raw();
592 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
593 (PublicKey(public_key), encoded, message, expected)
594 }
595
596 fn vector_sig_verification_8() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
597 let (public_key, sig, message, expected) = vector_sig_verification_8_raw();
598 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
599 (PublicKey(public_key), encoded, message, expected)
600 }
601
602 fn vector_sig_verification_9() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
603 let (public_key, sig, message, expected) = vector_sig_verification_9_raw();
604 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
605 (PublicKey(public_key), encoded, message, expected)
606 }
607
608 fn vector_sig_verification_10() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
609 let (public_key, sig, message, expected) = vector_sig_verification_10_raw();
610 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
611 (PublicKey(public_key), encoded, message, expected)
612 }
613
614 fn vector_sig_verification_11() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
615 let (public_key, sig, message, expected) = vector_sig_verification_11_raw();
616 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
617 (PublicKey(public_key), encoded, message, expected)
618 }
619
620 fn vector_sig_verification_12() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
621 let (public_key, sig, message, expected) = vector_sig_verification_12_raw();
622 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
623 (PublicKey(public_key), encoded, message, expected)
624 }
625
626 fn vector_sig_verification_13() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
627 let (public_key, sig, message, expected) = vector_sig_verification_13_raw();
628 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
629 (PublicKey(public_key), encoded, message, expected)
630 }
631
632 fn vector_sig_verification_14() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
633 let (public_key, sig, message, expected) = vector_sig_verification_14_raw();
634 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
635 (PublicKey(public_key), encoded, message, expected)
636 }
637
638 fn vector_sig_verification_15() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
639 let (public_key, sig, message, expected) = vector_sig_verification_15_raw();
640 let encoded = encode_signature_with_recovery(&public_key.key, &message, &sig);
641 (PublicKey(public_key), encoded, message, expected)
642 }
643
644 #[rstest]
645 #[case(vector_sig_verification_1())]
646 #[case(vector_sig_verification_2())]
647 #[case(vector_sig_verification_3())]
648 #[case(vector_sig_verification_4())]
649 #[case(vector_sig_verification_5())]
650 #[case(vector_sig_verification_6())]
651 #[case(vector_sig_verification_7())]
652 #[case(vector_sig_verification_8())]
653 #[case(vector_sig_verification_9())]
654 #[case(vector_sig_verification_10())]
655 #[case(vector_sig_verification_11())]
656 #[case(vector_sig_verification_12())]
657 #[case(vector_sig_verification_13())]
658 #[case(vector_sig_verification_14())]
659 #[case(vector_sig_verification_15())]
660 fn test_signature_verification(
661 #[case] (public_key, sig, message, expected): (PublicKey, Vec<u8>, Vec<u8>, bool),
662 ) {
663 let expected = if expected {
664 let mut ecdsa_signature = p256::ecdsa::Signature::from_slice(&sig[1..]).unwrap();
665 if ecdsa_signature.s().is_high().into() {
666 assert!(Signature::decode(sig.as_ref()).is_err());
667 assert!(Signature::decode(Bytes::from(sig)).is_err());
668
669 ecdsa_signature = ecdsa_signature.normalize_s();
670 }
671 let recovery_id =
672 RecoveryId::trial_recovery_from_msg(&public_key.0.key, &message, &ecdsa_signature)
673 .expect("recovery id");
674 let signature = Signature::new(ecdsa_signature, recovery_id);
675 public_key.verify_inner(None, &message, &signature)
676 } else {
677 let tf_res = Signature::decode(sig.as_ref());
678 let dc_res = Signature::decode(Bytes::from(sig));
679 if tf_res.is_err() && dc_res.is_err() {
680 true
681 } else {
682 let f1 = !public_key.verify_inner(None, &message, &tf_res.unwrap());
683 let f2 = !public_key.verify_inner(None, &message, &dc_res.unwrap());
684 f1 && f2
685 }
686 };
687 assert!(expected);
688 }
689
690 #[cfg(feature = "arbitrary")]
691 mod conformance {
692 use super::*;
693 use commonware_codec::conformance::CodecConformance;
694
695 commonware_conformance::conformance_tests! {
696 CodecConformance<Signature> => 1024,
697 }
698 }
699}