1use crate::{Array, Error, Scheme};
2use commonware_utils::{hex, union_unique, SizedSerialize};
3use p256::{
4 ecdsa::{
5 signature::{Signer, Verifier},
6 SigningKey, VerifyingKey,
7 },
8 elliptic_curve::scalar::IsHigh,
9};
10use rand::{CryptoRng, Rng};
11use std::{
12 borrow::Cow,
13 fmt::{Debug, Display},
14 hash::{Hash, Hasher},
15 ops::Deref,
16};
17
18const PRIVATE_KEY_LENGTH: usize = 32;
19const PUBLIC_KEY_LENGTH: usize = 33; const SIGNATURE_LENGTH: usize = 64; #[derive(Clone)]
24pub struct Secp256r1 {
25 signer: SigningKey,
26 verifier: VerifyingKey,
27}
28
29impl Scheme for Secp256r1 {
30 type PrivateKey = PrivateKey;
31 type PublicKey = PublicKey;
32 type Signature = Signature;
33
34 fn new<R: CryptoRng + Rng>(r: &mut R) -> Self {
35 let signer = SigningKey::random(r);
36 let verifier = signer.verifying_key().to_owned();
37 Self { signer, verifier }
38 }
39
40 fn from(private_key: PrivateKey) -> Option<Self> {
41 let signer = private_key.key;
42 let verifier = signer.verifying_key().to_owned();
43 Some(Self { signer, verifier })
44 }
45
46 fn private_key(&self) -> PrivateKey {
47 PrivateKey::from(self.signer.clone())
48 }
49
50 fn public_key(&self) -> PublicKey {
51 PublicKey::from(self.verifier)
52 }
53
54 fn sign(&mut self, namespace: Option<&[u8]>, message: &[u8]) -> Signature {
55 let signature: p256::ecdsa::Signature = match namespace {
56 Some(namespace) => self.signer.sign(&union_unique(namespace, message)),
57 None => self.signer.sign(message),
58 };
59 let signature = match signature.normalize_s() {
60 Some(normalized) => normalized,
61 None => signature,
62 };
63 Signature::from(signature)
64 }
65
66 fn verify(
67 namespace: Option<&[u8]>,
68 message: &[u8],
69 public_key: &PublicKey,
70 signature: &Signature,
71 ) -> bool {
72 let payload = match namespace {
73 Some(namespace) => Cow::Owned(union_unique(namespace, message)),
74 None => Cow::Borrowed(message),
75 };
76 public_key
77 .key
78 .verify(&payload, &signature.signature)
79 .is_ok()
80 }
81}
82
83#[derive(Clone, Eq, PartialEq)]
85pub struct PrivateKey {
86 raw: [u8; PRIVATE_KEY_LENGTH],
87 key: SigningKey,
88}
89
90impl Array for PrivateKey {
91 type Error = Error;
92}
93
94impl SizedSerialize for PrivateKey {
95 const SERIALIZED_LEN: usize = PRIVATE_KEY_LENGTH;
96}
97
98impl Hash for PrivateKey {
99 fn hash<H: Hasher>(&self, state: &mut H) {
100 self.raw.hash(state);
101 }
102}
103
104impl Ord for PrivateKey {
105 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
106 self.raw.cmp(&other.raw)
107 }
108}
109
110impl PartialOrd for PrivateKey {
111 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
112 Some(self.cmp(other))
113 }
114}
115
116impl AsRef<[u8]> for PrivateKey {
117 fn as_ref(&self) -> &[u8] {
118 &self.raw
119 }
120}
121
122impl Deref for PrivateKey {
123 type Target = [u8];
124 fn deref(&self) -> &[u8] {
125 &self.raw
126 }
127}
128
129impl From<SigningKey> for PrivateKey {
130 fn from(signer: SigningKey) -> Self {
131 let raw = signer.to_bytes().into();
132 Self { raw, key: signer }
133 }
134}
135
136impl TryFrom<&[u8]> for PrivateKey {
137 type Error = Error;
138 fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
139 let raw: [u8; PRIVATE_KEY_LENGTH] = value
140 .try_into()
141 .map_err(|_| Error::InvalidPrivateKeyLength)?;
142 let key = SigningKey::from_slice(&raw).map_err(|_| Error::InvalidPrivateKey)?;
143 Ok(Self { raw, key })
144 }
145}
146
147impl TryFrom<&Vec<u8>> for PrivateKey {
148 type Error = Error;
149 fn try_from(value: &Vec<u8>) -> Result<Self, Self::Error> {
150 Self::try_from(value.as_slice())
151 }
152}
153
154impl TryFrom<Vec<u8>> for PrivateKey {
155 type Error = Error;
156 fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
157 Self::try_from(value.as_slice())
158 }
159}
160
161impl Debug for PrivateKey {
162 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
163 write!(f, "{}", hex(&self.raw))
164 }
165}
166
167impl Display for PrivateKey {
168 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
169 write!(f, "{}", hex(&self.raw))
170 }
171}
172
173#[derive(Clone, Eq, PartialEq, Ord, PartialOrd)]
175pub struct PublicKey {
176 raw: [u8; PUBLIC_KEY_LENGTH],
177 key: VerifyingKey,
178}
179
180impl Array for PublicKey {
181 type Error = Error;
182}
183
184impl SizedSerialize for PublicKey {
185 const SERIALIZED_LEN: usize = PUBLIC_KEY_LENGTH;
186}
187
188impl Hash for PublicKey {
189 fn hash<H: Hasher>(&self, state: &mut H) {
190 self.raw.hash(state);
191 }
192}
193
194impl AsRef<[u8]> for PublicKey {
195 fn as_ref(&self) -> &[u8] {
196 &self.raw
197 }
198}
199
200impl Deref for PublicKey {
201 type Target = [u8];
202 fn deref(&self) -> &[u8] {
203 &self.raw
204 }
205}
206
207impl From<VerifyingKey> for PublicKey {
208 fn from(verifier: VerifyingKey) -> Self {
209 let encoded = verifier.to_encoded_point(true);
210 let raw: [u8; PUBLIC_KEY_LENGTH] = encoded.as_bytes().try_into().unwrap();
211 Self { raw, key: verifier }
212 }
213}
214
215impl TryFrom<&[u8]> for PublicKey {
216 type Error = Error;
217 fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
218 let raw: [u8; PUBLIC_KEY_LENGTH] = value
219 .try_into()
220 .map_err(|_| Error::InvalidPublicKeyLength)?;
221 let key = VerifyingKey::from_sec1_bytes(&raw).map_err(|_| Error::InvalidPublicKey)?;
222 Ok(Self { raw, key })
223 }
224}
225
226impl TryFrom<&Vec<u8>> for PublicKey {
227 type Error = Error;
228 fn try_from(value: &Vec<u8>) -> Result<Self, Self::Error> {
229 Self::try_from(value.as_slice())
230 }
231}
232
233impl TryFrom<Vec<u8>> for PublicKey {
234 type Error = Error;
235 fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
236 Self::try_from(value.as_slice())
237 }
238}
239
240impl Debug for PublicKey {
241 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
242 write!(f, "{}", hex(&self.raw))
243 }
244}
245
246impl Display for PublicKey {
247 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
248 write!(f, "{}", hex(&self.raw))
249 }
250}
251
252#[derive(Clone, Eq, PartialEq)]
254pub struct Signature {
255 raw: [u8; SIGNATURE_LENGTH],
256 signature: p256::ecdsa::Signature,
257}
258
259impl Array for Signature {
260 type Error = Error;
261}
262
263impl SizedSerialize for Signature {
264 const SERIALIZED_LEN: usize = SIGNATURE_LENGTH;
265}
266
267impl Hash for Signature {
268 fn hash<H: Hasher>(&self, state: &mut H) {
269 self.raw.hash(state);
270 }
271}
272
273impl Ord for Signature {
274 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
275 self.raw.cmp(&other.raw)
276 }
277}
278
279impl PartialOrd for Signature {
280 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
281 Some(self.cmp(other))
282 }
283}
284
285impl AsRef<[u8]> for Signature {
286 fn as_ref(&self) -> &[u8] {
287 &self.raw
288 }
289}
290
291impl Deref for Signature {
292 type Target = [u8];
293 fn deref(&self) -> &[u8] {
294 &self.raw
295 }
296}
297
298impl From<p256::ecdsa::Signature> for Signature {
299 fn from(signature: p256::ecdsa::Signature) -> Self {
300 let raw = signature.to_bytes().into();
301 Self { raw, signature }
302 }
303}
304
305impl TryFrom<&[u8]> for Signature {
306 type Error = Error;
307 fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
308 let raw: [u8; SIGNATURE_LENGTH] = value
309 .try_into()
310 .map_err(|_| Error::InvalidSignatureLength)?;
311 let signature =
312 p256::ecdsa::Signature::from_slice(&raw).map_err(|_| Error::InvalidSignature)?;
313 if signature.s().is_high().into() {
314 return Err(Error::InvalidSignature);
316 }
317 Ok(Self { raw, signature })
318 }
319}
320
321impl TryFrom<&Vec<u8>> for Signature {
322 type Error = Error;
323 fn try_from(value: &Vec<u8>) -> Result<Self, Self::Error> {
324 Self::try_from(value.as_slice())
325 }
326}
327
328impl TryFrom<Vec<u8>> for Signature {
329 type Error = Error;
330 fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
331 Self::try_from(value.as_slice())
332 }
333}
334
335impl Debug for Signature {
336 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
337 write!(f, "{}", hex(&self.raw))
338 }
339}
340
341impl Display for Signature {
342 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
343 write!(f, "{}", hex(&self.raw))
344 }
345}
346
347#[cfg(test)]
350mod tests {
351 use super::*;
352
353 fn parse_vector_keypair(private_key: &str, qx: &str, qy: &str) -> (PrivateKey, PublicKey) {
354 let public_key = parse_public_key_as_compressed(qx, qy);
355 (
356 commonware_utils::from_hex_formatted(private_key)
357 .unwrap()
358 .try_into()
359 .unwrap(),
360 public_key,
361 )
362 }
363
364 fn parse_vector_sig_verification(
365 qx: &str,
366 qy: &str,
367 r: &str,
368 s: &str,
369 m: &str,
370 ) -> (PublicKey, Vec<u8>, Vec<u8>) {
371 let public_key = parse_public_key_as_compressed(qx, qy);
372 let signature = parse_signature(r, s);
373 let message = commonware_utils::from_hex_formatted(m).unwrap();
374 (public_key, signature, message)
375 }
376
377 fn parse_signature(r: &str, s: &str) -> Vec<u8> {
378 let vec_r = commonware_utils::from_hex_formatted(r).unwrap();
379 let vec_s = commonware_utils::from_hex_formatted(s).unwrap();
380 let f1 = p256::FieldBytes::from_slice(&vec_r);
381 let f2 = p256::FieldBytes::from_slice(&vec_s);
382 let s = p256::ecdsa::Signature::from_scalars(*f1, *f2).unwrap();
383 s.to_vec()
384 }
385
386 fn parse_public_key_as_compressed(qx: &str, qy: &str) -> PublicKey {
387 parse_public_key_as_compressed_vector(qx, qy)
388 .try_into()
389 .unwrap()
390 }
391
392 fn parse_public_key_as_compressed_vector(qx: &str, qy: &str) -> Vec<u8> {
393 let qx = commonware_utils::from_hex_formatted(&padding_odd_length_hex(qx)).unwrap();
394 let qy = commonware_utils::from_hex_formatted(&padding_odd_length_hex(qy)).unwrap();
395 let mut compressed = Vec::with_capacity(qx.len() + 1);
396 if qy.last().unwrap() % 2 == 0 {
397 compressed.push(0x02);
398 } else {
399 compressed.push(0x03);
400 }
401 compressed.extend_from_slice(&qx);
402 compressed
403 }
404
405 fn parse_public_key_as_uncompressed_vector(qx: &str, qy: &str) -> Vec<u8> {
406 let qx = commonware_utils::from_hex_formatted(qx).unwrap();
407 let qy = commonware_utils::from_hex_formatted(qy).unwrap();
408 let mut uncompressed_public_key = Vec::with_capacity(65);
409 uncompressed_public_key.push(0x04);
410 uncompressed_public_key.extend_from_slice(&qx);
411 uncompressed_public_key.extend_from_slice(&qy);
412 uncompressed_public_key
413 }
414
415 fn padding_odd_length_hex(value: &str) -> String {
416 if value.len() % 2 != 0 {
417 return format!("0{}", value);
418 }
419 value.to_string()
420 }
421
422 #[test]
423 fn test_scheme_sign() {
424 let private_key: PrivateKey = commonware_utils::from_hex_formatted(
425 "519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464",
426 )
427 .unwrap()
428 .try_into()
429 .unwrap();
430 let message = commonware_utils::from_hex_formatted(
431 "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045e
432 e2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf
433 9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8",
434 )
435 .unwrap();
436 let mut signer = <Secp256r1 as Scheme>::from(private_key).unwrap();
437 let signature = signer.sign(None, &message);
438 assert_eq!(SIGNATURE_LENGTH, signature.len());
439 assert!(Secp256r1::verify(
440 None,
441 &message,
442 &signer.public_key(),
443 &signature
444 ));
445 }
446
447 #[test]
448 fn test_scheme_private_key() {
449 let private_key_hex = "519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464";
450 let private_key: PrivateKey = commonware_utils::from_hex_formatted(private_key_hex)
451 .unwrap()
452 .try_into()
453 .unwrap();
454 let signer = <Secp256r1 as Scheme>::from(private_key).unwrap();
455 let exported_private_key = signer.private_key();
456 assert_eq!(
457 private_key_hex,
458 commonware_utils::hex(&exported_private_key).as_str(),
459 );
460 }
461
462 #[test]
464 fn test_rfc6979() {
465 let private_key: PrivateKey = commonware_utils::from_hex_formatted(
466 "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721",
467 )
468 .unwrap()
469 .try_into()
470 .unwrap();
471
472 let (message, exp_sig) = (
473 b"sample",
474 p256::ecdsa::Signature::from_slice(
475 &commonware_utils::from_hex_formatted(
476 "efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716
477 f7cb1c942d657c41d436c7a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8",
478 )
479 .unwrap(),
480 )
481 .unwrap(),
482 );
483 let mut signer = <Secp256r1 as Scheme>::from(private_key).unwrap();
484 let signature = signer.sign(None, message);
485 assert_eq!(signature.to_vec(), exp_sig.normalize_s().unwrap().to_vec());
486
487 let (message, exp_sig) = (
488 b"test",
489 p256::ecdsa::Signature::from_slice(
490 &commonware_utils::from_hex_formatted(
491 "f1abb023518351cd71d881567b1ea663ed3efcf6c5132b354f28d3b0b7d38367
492 019f4113742a2b14bd25926b49c649155f267e60d3814b4c0cc84250e46f0083",
493 )
494 .unwrap(),
495 )
496 .unwrap(),
497 );
498
499 let signature = signer.sign(None, message);
500 assert_eq!(signature.to_vec(), exp_sig.to_vec());
501 }
502
503 #[test]
504 fn test_scheme_validate_public_key_too_long() {
505 let qx_hex = "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f";
506 let qy_hex = "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f";
507
508 let uncompressed_public_key = parse_public_key_as_uncompressed_vector(qx_hex, qy_hex);
509 let public_key = <Secp256r1 as Scheme>::PublicKey::try_from(&uncompressed_public_key);
510 assert_eq!(public_key, Err(Error::InvalidPublicKeyLength));
511
512 let compressed_public_key = parse_public_key_as_compressed_vector(qx_hex, qy_hex);
513 let public_key = <Secp256r1 as Scheme>::PublicKey::try_from(&compressed_public_key);
514 assert!(public_key.is_ok());
515 }
516
517 #[test]
518 fn test_scheme_verify_signature_r0() {
519 let private_key: PrivateKey = commonware_utils::from_hex_formatted(
521 "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
522 )
523 .unwrap()
524 .try_into()
525 .unwrap();
526 let message = b"sample";
527 let mut signer = <Secp256r1 as Scheme>::from(private_key).unwrap();
528 let signature = signer.sign(None, message);
529 let (_, s) = signature.split_at(32);
530 let mut signature: Vec<u8> = vec![0x00; 32];
531 signature.extend_from_slice(s);
532
533 assert!(Signature::try_from(&signature).is_err());
535 }
536
537 #[test]
538 fn test_scheme_verify_signature_s0() {
539 let private_key: PrivateKey = commonware_utils::from_hex_formatted(
541 "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
542 )
543 .unwrap()
544 .try_into()
545 .unwrap();
546 let message = b"sample";
547 let mut signer = <Secp256r1 as Scheme>::from(private_key).unwrap();
548 let signature = signer.sign(None, message);
549 let (r, _) = signature.split_at(32);
550 let s: Vec<u8> = vec![0x00; 32];
551 let mut signature = r.to_vec();
552 signature.extend(s);
553
554 assert!(Signature::try_from(&signature).is_err());
556 }
557
558 #[test]
559 fn test_keypairs() {
560 let cases = [
561 vector_keypair_1(),
562 vector_keypair_2(),
563 vector_keypair_3(),
564 vector_keypair_4(),
565 vector_keypair_5(),
566 vector_keypair_6(),
567 vector_keypair_7(),
568 vector_keypair_8(),
569 vector_keypair_9(),
570 vector_keypair_10(),
571 ];
572
573 for (index, test) in cases.into_iter().enumerate() {
574 let (private_key, exp_public_key) = test;
575 let signer = <Secp256r1 as Scheme>::from(private_key).unwrap();
576 assert_eq!(
577 exp_public_key,
578 signer.public_key(),
579 "vector_keypair_{}",
580 index + 1
581 );
582 assert!(signer.public_key().len() == PUBLIC_KEY_LENGTH);
583 }
584 }
585
586 #[test]
587 fn test_public_key_validation() {
588 let cases = [
593 (1, vector_public_key_validation_1()),
594 (3, vector_public_key_validation_3()),
595 (4, vector_public_key_validation_4()),
596 (5, vector_public_key_validation_5()),
597 (6, vector_public_key_validation_6()),
598 (7, vector_public_key_validation_7()),
599 (8, vector_public_key_validation_8()),
600 (9, vector_public_key_validation_9()),
601 (10, vector_public_key_validation_10()),
602 (12, vector_public_key_validation_12()),
603 ];
604
605 for (n, test) in cases.iter() {
606 let (public_key, exp_valid) = test;
607 let res = <Secp256r1 as Scheme>::PublicKey::try_from(public_key);
608 assert_eq!(
609 *exp_valid,
610 res.is_ok(),
611 "vector_public_key_validation_{}",
612 n
613 );
614 }
615 }
616
617 #[test]
618 fn test_signature_verification() {
619 let cases = [
620 vector_sig_verification_1(),
621 vector_sig_verification_2(),
622 vector_sig_verification_3(),
623 vector_sig_verification_4(),
624 vector_sig_verification_5(),
625 vector_sig_verification_6(),
626 vector_sig_verification_7(),
627 vector_sig_verification_8(),
628 vector_sig_verification_9(),
629 vector_sig_verification_10(),
630 vector_sig_verification_11(),
631 vector_sig_verification_12(),
632 vector_sig_verification_13(),
633 vector_sig_verification_14(),
634 vector_sig_verification_15(),
635 ];
636
637 for (index, test) in cases.into_iter().enumerate() {
638 let (public_key, sig, message, expected) = test;
639 let expected = if expected {
640 let mut ecdsa_signature = p256::ecdsa::Signature::from_slice(&sig).unwrap();
641 if ecdsa_signature.s().is_high().into() {
642 assert!(Signature::try_from(sig).is_err());
644
645 if let Some(normalized_sig) = ecdsa_signature.normalize_s() {
647 ecdsa_signature = normalized_sig;
648 }
649 }
650 let signature = Signature::from(ecdsa_signature);
651 Secp256r1::verify(None, &message, &public_key, &signature)
652 } else {
653 let signature = Signature::try_from(sig);
654 signature.is_err()
655 || !Secp256r1::verify(None, &message, &public_key, &signature.unwrap())
656 };
657 assert!(expected, "vector_signature_verification_{}", index + 1);
658 }
659 }
660
661 fn vector_keypair_1() -> (PrivateKey, PublicKey) {
662 parse_vector_keypair(
663 "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
664 "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f",
665 "9681b517b1cda17d0d83d335d9c4a8a9a9b0b1b3c7106d8f3c72bc5093dc275f",
666 )
667 }
668
669 fn vector_keypair_2() -> (PrivateKey, PublicKey) {
670 parse_vector_keypair(
671 "710735c8388f48c684a97bd66751cc5f5a122d6b9a96a2dbe73662f78217446d",
672 "f6836a8add91cb182d8d258dda6680690eb724a66dc3bb60d2322565c39e4ab9",
673 "1f837aa32864870cb8e8d0ac2ff31f824e7beddc4bb7ad72c173ad974b289dc2",
674 )
675 }
676
677 fn vector_keypair_3() -> (PrivateKey, PublicKey) {
678 parse_vector_keypair(
679 "78d5d8b7b3e2c16b3e37e7e63becd8ceff61e2ce618757f514620ada8a11f6e4",
680 "76711126cbb2af4f6a5fe5665dad4c88d27b6cb018879e03e54f779f203a854e",
681 "a26df39960ab5248fd3620fd018398e788bd89a3cea509b352452b69811e6856",
682 )
683 }
684
685 fn vector_keypair_4() -> (PrivateKey, PublicKey) {
686 parse_vector_keypair(
687 "2a61a0703860585fe17420c244e1de5a6ac8c25146b208ef88ad51ae34c8cb8c",
688 "e1aa7196ceeac088aaddeeba037abb18f67e1b55c0a5c4e71ec70ad666fcddc8",
689 "d7d35bdce6dedc5de98a7ecb27a9cd066a08f586a733b59f5a2cdb54f971d5c8",
690 )
691 }
692
693 fn vector_keypair_5() -> (PrivateKey, PublicKey) {
694 parse_vector_keypair(
695 "01b965b45ff386f28c121c077f1d7b2710acc6b0cb58d8662d549391dcf5a883",
696 "1f038c5422e88eec9e88b815e8f6b3e50852333fc423134348fc7d79ef8e8a10",
697 "43a047cb20e94b4ffb361ef68952b004c0700b2962e0c0635a70269bc789b849",
698 )
699 }
700
701 fn vector_keypair_6() -> (PrivateKey, PublicKey) {
702 parse_vector_keypair(
703 "fac92c13d374c53a085376fe4101618e1e181b5a63816a84a0648f3bdc24e519",
704 "7258f2ab96fc84ef6ccb33e308cd392d8b568ea635730ceb4ebd72fa870583b9",
705 "489807ca55bdc29ca5c8fe69b94f227b0345cccdbe89975e75d385cc2f6bb1e2",
706 )
707 }
708
709 fn vector_keypair_7() -> (PrivateKey, PublicKey) {
710 parse_vector_keypair(
711 "f257a192dde44227b3568008ff73bcf599a5c45b32ab523b5b21ca582fef5a0a",
712 "d2e01411817b5512b79bbbe14d606040a4c90deb09e827d25b9f2fc068997872",
713 "503f138f8bab1df2c4507ff663a1fdf7f710e7adb8e7841eaa902703e314e793",
714 )
715 }
716
717 fn vector_keypair_8() -> (PrivateKey, PublicKey) {
718 parse_vector_keypair(
719 "add67e57c42a3d28708f0235eb86885a4ea68e0d8cfd76eb46134c596522abfd",
720 "55bed2d9c029b7f230bde934c7124ed52b1330856f13cbac65a746f9175f85d7",
721 "32805e311d583b4e007c40668185e85323948e21912b6b0d2cda8557389ae7b0",
722 )
723 }
724
725 fn vector_keypair_9() -> (PrivateKey, PublicKey) {
726 parse_vector_keypair(
727 "4494860fd2c805c5c0d277e58f802cff6d731f76314eb1554142a637a9bc5538",
728 "5190277a0c14d8a3d289292f8a544ce6ea9183200e51aec08440e0c1a463a4e4",
729 "ecd98514821bd5aaf3419ab79b71780569470e4fed3da3c1353b28fe137f36eb",
730 )
731 }
732
733 fn vector_keypair_10() -> (PrivateKey, PublicKey) {
734 parse_vector_keypair(
735 "d40b07b1ea7b86d4709ef9dc634c61229feb71abd63dc7fc85ef46711a87b210",
736 "fbcea7c2827e0e8085d7707b23a3728823ea6f4878b24747fb4fd2842d406c73",
737 "2393c85f1f710c5afc115a39ba7e18abe03f19c9d4bb3d47d19468b818efa535",
738 )
739 }
740
741 fn vector_public_key_validation_1() -> (Vec<u8>, bool) {
742 (
743 parse_public_key_as_compressed_vector(
744 "e0f7449c5588f24492c338f2bc8f7865f755b958d48edb0f2d0056e50c3fd5b7",
745 "86d7e9255d0f4b6f44fa2cd6f8ba3c0aa828321d6d8cc430ca6284ce1d5b43a0",
746 ),
747 true,
748 )
749 }
750
751 fn vector_public_key_validation_3() -> (Vec<u8>, bool) {
752 (
753 parse_public_key_as_compressed_vector(
754 "17875397ae87369365656d490e8ce956911bd97607f2aff41b56f6f3a61989826",
755 "980a3c4f61b9692633fbba5ef04c9cb546dd05cdec9fa8428b8849670e2fba92",
756 ),
757 false, )
759 }
760
761 fn vector_public_key_validation_4() -> (Vec<u8>, bool) {
762 (
763 parse_public_key_as_compressed_vector(
764 "f2d1c0dc0852c3d8a2a2500a23a44813ccce1ac4e58444175b440469ffc12273",
765 "32bfe992831b305d8c37b9672df5d29fcb5c29b4a40534683e3ace23d24647dd",
766 ),
767 false, )
769 }
770
771 fn vector_public_key_validation_5() -> (Vec<u8>, bool) {
772 (
773 parse_public_key_as_compressed_vector(
774 "10b0ca230fff7c04768f4b3d5c75fa9f6c539bea644dffbec5dc796a213061b58",
775 "f5edf37c11052b75f771b7f9fa050e353e464221fec916684ed45b6fead38205",
776 ),
777 false, )
779 }
780
781 fn vector_public_key_validation_6() -> (Vec<u8>, bool) {
782 (
783 parse_public_key_as_compressed_vector(
784 "2c1052f25360a15062d204a056274e93cbe8fc4c4e9b9561134ad5c15ce525da",
785 "ced9783713a8a2a09eff366987639c625753295d9a85d0f5325e32dedbcada0b",
786 ),
787 true,
788 )
789 }
790
791 fn vector_public_key_validation_7() -> (Vec<u8>, bool) {
792 (
793 parse_public_key_as_compressed_vector(
794 "a40d077a87dae157d93dcccf3fe3aca9c6479a75aa2669509d2ef05c7de6782f",
795 "503d86b87d743ba20804fd7e7884aa017414a7b5b5963e0d46e3a9611419ddf3",
796 ),
797 false, )
799 }
800
801 fn vector_public_key_validation_8() -> (Vec<u8>, bool) {
802 (
803 parse_public_key_as_compressed_vector(
804 "2633d398a3807b1895548adbb0ea2495ef4b930f91054891030817df87d4ac0a",
805 "d6b2f738e3873cc8364a2d364038ce7d0798bb092e3dd77cbdae7c263ba618d2",
806 ),
807 true,
808 )
809 }
810
811 fn vector_public_key_validation_9() -> (Vec<u8>, bool) {
812 (
813 parse_public_key_as_compressed_vector(
814 "14bf57f76c260b51ec6bbc72dbd49f02a56eaed070b774dc4bad75a54653c3d56",
815 "7a231a23bf8b3aa31d9600d888a0678677a30e573decd3dc56b33f365cc11236",
816 ),
817 false, )
819 }
820
821 fn vector_public_key_validation_10() -> (Vec<u8>, bool) {
822 (
823 parse_public_key_as_compressed_vector(
824 "2fa74931ae816b426f484180e517f5050c92decfc8daf756cd91f54d51b302f1",
825 "5b994346137988c58c14ae2152ac2f6ad96d97decb33099bd8a0210114cd1141",
826 ),
827 true,
828 )
829 }
830
831 fn vector_public_key_validation_12() -> (Vec<u8>, bool) {
832 (
833 parse_public_key_as_compressed_vector(
834 "7a81a7e0b015252928d8b36e4ca37e92fdc328eb25c774b4f872693028c4be38",
835 "08862f7335147261e7b1c3d055f9a316e4cab7daf99cc09d1c647f5dd6e7d5bb",
836 ),
837 false, )
839 }
840
841 fn vector_sig_verification_1() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
842 let (public_key, sig, message) = parse_vector_sig_verification(
843 "87f8f2b218f49845f6f10eec3877136269f5c1a54736dbdf69f89940cad41555",
844 "e15f369036f49842fac7a86c8a2b0557609776814448b8f5e84aa9f4395205e9",
845 "d19ff48b324915576416097d2544f7cbdf8768b1454ad20e0baac50e211f23b0",
846 "a3e81e59311cdfff2d4784949f7a2cb50ba6c3a91fa54710568e61aca3e847c6",
847 "e4796db5f785f207aa30d311693b3702821dff1168fd2e04c0836825aefd850d9aa60326d88cde1a23c7
848 745351392ca2288d632c264f197d05cd424a30336c19fd09bb229654f0222fcb881a4b35c290a093ac159ce1
849 3409111ff0358411133c24f5b8e2090d6db6558afc36f06ca1f6ef779785adba68db27a409859fc4c4a0",
850 );
851 (public_key, sig, message, false)
852 }
853
854 fn vector_sig_verification_2() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
855 let (public_key, sig, message) = parse_vector_sig_verification(
856 "5cf02a00d205bdfee2016f7421807fc38ae69e6b7ccd064ee689fc1a94a9f7d2",
857 "ec530ce3cc5c9d1af463f264d685afe2b4db4b5828d7e61b748930f3ce622a85",
858 "dc23d130c6117fb5751201455e99f36f59aba1a6a21cf2d0e7481a97451d6693",
859 "d6ce7708c18dbf35d4f8aa7240922dc6823f2e7058cbc1484fcad1599db5018c",
860 "069a6e6b93dfee6df6ef6997cd80dd2182c36653cef10c655d524585655462d683877f95ecc6d6c81623
861 d8fac4e900ed0019964094e7de91f1481989ae1873004565789cbf5dc56c62aedc63f62f3b894c9c6f7788c8
862 ecaadc9bd0e81ad91b2b3569ea12260e93924fdddd3972af5273198f5efda0746219475017557616170e",
863 );
864 (public_key, sig, message, false)
865 }
866
867 fn vector_sig_verification_3() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
868 let (public_key, sig, message) = parse_vector_sig_verification(
869 "2ddfd145767883ffbb0ac003ab4a44346d08fa2570b3120dcce94562422244cb",
870 "5f70c7d11ac2b7a435ccfbbae02c3df1ea6b532cc0e9db74f93fffca7c6f9a64",
871 "9913111cff6f20c5bf453a99cd2c2019a4e749a49724a08774d14e4c113edda8",
872 "9467cd4cd21ecb56b0cab0a9a453b43386845459127a952421f5c6382866c5cc",
873 "df04a346cf4d0e331a6db78cca2d456d31b0a000aa51441defdb97bbeb20b94d8d746429a393ba88840d
874 661615e07def615a342abedfa4ce912e562af714959896858af817317a840dcff85a057bb91a3c2bf9010550
875 0362754a6dd321cdd86128cfc5f04667b57aa78c112411e42da304f1012d48cd6a7052d7de44ebcc01de",
876 );
877 (public_key, sig, message, false)
878 }
879
880 fn vector_sig_verification_4() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
881 let (public_key, sig, message) = parse_vector_sig_verification(
882 "e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c",
883 "970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927",
884 "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f",
885 "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c",
886 "e1130af6a38ccb412a9c8d13e15dbfc9e69a16385af3c3f1e5da954fd5e7c45fd75e2b8c36699228e928
887 40c0562fbf3772f07e17f1add56588dd45f7450e1217ad239922dd9c32695dc71ff2424ca0dec1321aa47064
888 a044b7fe3c2b97d03ce470a592304c5ef21eed9f93da56bb232d1eeb0035f9bf0dfafdcc4606272b20a3",
889 );
890 (public_key, sig, message, true)
891 }
892
893 fn vector_sig_verification_5() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
894 let (public_key, sig, message) = parse_vector_sig_verification(
895 "e0fc6a6f50e1c57475673ee54e3a57f9a49f3328e743bf52f335e3eeaa3d2864",
896 "7f59d689c91e463607d9194d99faf316e25432870816dde63f5d4b373f12f22a",
897 "1d75830cd36f4c9aa181b2c4221e87f176b7f05b7c87824e82e396c88315c407",
898 "cb2acb01dac96efc53a32d4a0d85d0c2e48955214783ecf50a4f0414a319c05a",
899 "73c5f6a67456ae48209b5f85d1e7de7758bf235300c6ae2bdceb1dcb27a7730fb68c950b7fcada0ecc46
900 61d3578230f225a875e69aaa17f1e71c6be5c831f22663bac63d0c7a9635edb0043ff8c6f26470f02a7bc565
901 56f1437f06dfa27b487a6c4290d8bad38d4879b334e341ba092dde4e4ae694a9c09302e2dbf443581c08",
902 );
903 (public_key, sig, message, true)
905 }
906
907 fn vector_sig_verification_6() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
908 let (public_key, sig, message) = parse_vector_sig_verification(
909 "a849bef575cac3c6920fbce675c3b787136209f855de19ffe2e8d29b31a5ad86",
910 "bf5fe4f7858f9b805bd8dcc05ad5e7fb889de2f822f3d8b41694e6c55c16b471",
911 "25acc3aa9d9e84c7abf08f73fa4195acc506491d6fc37cb9074528a7db87b9d6",
912 "9b21d5b5259ed3f2ef07dfec6cc90d3a37855d1ce122a85ba6a333f307d31537",
913 "666036d9b4a2426ed6585a4e0fd931a8761451d29ab04bd7dc6d0c5b9e38e6c2b263ff6cb837bd04399d
914 e3d757c6c7005f6d7a987063cf6d7e8cb38a4bf0d74a282572bd01d0f41e3fd066e3021575f0fa04f27b700d
915 5b7ddddf50965993c3f9c7118ed78888da7cb221849b3260592b8e632d7c51e935a0ceae15207bedd548",
916 );
917 (public_key, sig, message, false)
918 }
919
920 fn vector_sig_verification_7() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
921 let (public_key, sig, message) = parse_vector_sig_verification(
922 "3dfb6f40f2471b29b77fdccba72d37c21bba019efa40c1c8f91ec405d7dcc5df",
923 "f22f953f1e395a52ead7f3ae3fc47451b438117b1e04d613bc8555b7d6e6d1bb",
924 "548886278e5ec26bed811dbb72db1e154b6f17be70deb1b210107decb1ec2a5a",
925 "e93bfebd2f14f3d827ca32b464be6e69187f5edbd52def4f96599c37d58eee75",
926 "7e80436bce57339ce8da1b5660149a20240b146d108deef3ec5da4ae256f8f894edcbbc57b34ce37089c
927 0daa17f0c46cd82b5a1599314fd79d2fd2f446bd5a25b8e32fcf05b76d644573a6df4ad1dfea707b479d9723
928 7a346f1ec632ea5660efb57e8717a8628d7f82af50a4e84b11f21bdff6839196a880ae20b2a0918d58cd",
929 );
930 (public_key, sig, message, false)
931 }
932
933 fn vector_sig_verification_8() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
934 let (public_key, sig, message) = parse_vector_sig_verification(
935 "69b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214",
936 "d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f",
937 "288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc18910879799790",
938 "247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979",
939 "1669bfb657fdc62c3ddd63269787fc1c969f1850fb04c933dda063ef74a56ce13e3a649700820f0061ef
940 abf849a85d474326c8a541d99830eea8131eaea584f22d88c353965dabcdc4bf6b55949fd529507dfb803ab6
941 b480cd73ca0ba00ca19c438849e2cea262a1c57d8f81cd257fb58e19dec7904da97d8386e87b84948169",
942 );
943 (public_key, sig, message, false)
944 }
945
946 fn vector_sig_verification_9() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
947 let (public_key, sig, message) = parse_vector_sig_verification(
948 "bf02cbcf6d8cc26e91766d8af0b164fc5968535e84c158eb3bc4e2d79c3cc682",
949 "069ba6cb06b49d60812066afa16ecf7b51352f2c03bd93ec220822b1f3dfba03",
950 "f5acb06c59c2b4927fb852faa07faf4b1852bbb5d06840935e849c4d293d1bad",
951 "049dab79c89cc02f1484c437f523e080a75f134917fda752f2d5ca397addfe5d",
952 "3fe60dd9ad6caccf5a6f583b3ae65953563446c4510b70da115ffaa0ba04c076115c7043ab8733403cd6
953 9c7d14c212c655c07b43a7c71b9a4cffe22c2684788ec6870dc2013f269172c822256f9e7cc674791bf2d848
954 6c0f5684283e1649576efc982ede17c7b74b214754d70402fb4bb45ad086cf2cf76b3d63f7fce39ac970",
955 );
956 (public_key, sig, message, false)
957 }
958
959 fn vector_sig_verification_10() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
960 let (public_key, sig, message) = parse_vector_sig_verification(
961 "224a4d65b958f6d6afb2904863efd2a734b31798884801fcab5a590f4d6da9de",
962 "178d51fddada62806f097aa615d33b8f2404e6b1479f5fd4859d595734d6d2b9",
963 "87b93ee2fecfda54deb8dff8e426f3c72c8864991f8ec2b3205bb3b416de93d2",
964 "4044a24df85be0cc76f21a4430b75b8e77b932a87f51e4eccbc45c263ebf8f66",
965 "983a71b9994d95e876d84d28946a041f8f0a3f544cfcc055496580f1dfd4e312a2ad418fe69dbc61db23
966 0cc0c0ed97e360abab7d6ff4b81ee970a7e97466acfd9644f828ffec538abc383d0e92326d1c88c55e1f46a6
967 68a039beaa1be631a89129938c00a81a3ae46d4aecbf9707f764dbaccea3ef7665e4c4307fa0b0a3075c",
968 );
969 (public_key, sig, message, false)
970 }
971
972 fn vector_sig_verification_11() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
973 let (public_key, sig, message) = parse_vector_sig_verification(
974 "43691c7795a57ead8c5c68536fe934538d46f12889680a9cb6d055a066228369",
975 "f8790110b3c3b281aa1eae037d4f1234aff587d903d93ba3af225c27ddc9ccac",
976 "8acd62e8c262fa50dd9840480969f4ef70f218ebf8ef9584f199031132c6b1ce",
977 "cfca7ed3d4347fb2a29e526b43c348ae1ce6c60d44f3191b6d8ea3a2d9c92154",
978 "4a8c071ac4fd0d52faa407b0fe5dab759f7394a5832127f2a3498f34aac287339e043b4ffa79528faf19
979 9dc917f7b066ad65505dab0e11e6948515052ce20cfdb892ffb8aa9bf3f1aa5be30a5bbe85823bddf70b39fd
980 7ebd4a93a2f75472c1d4f606247a9821f1a8c45a6cb80545de2e0c6c0174e2392088c754e9c8443eb5af",
981 );
982 (public_key, sig, message, false)
983 }
984
985 fn vector_sig_verification_12() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
986 let (public_key, sig, message) = parse_vector_sig_verification(
987 "9157dbfcf8cf385f5bb1568ad5c6e2a8652ba6dfc63bc1753edf5268cb7eb596",
988 "972570f4313d47fc96f7c02d5594d77d46f91e949808825b3d31f029e8296405",
989 "dfaea6f297fa320b707866125c2a7d5d515b51a503bee817de9faa343cc48eeb",
990 "8f780ad713f9c3e5a4f7fa4c519833dfefc6a7432389b1e4af463961f09764f2",
991 "0a3a12c3084c865daf1d302c78215d39bfe0b8bf28272b3c0b74beb4b7409db0718239de700785581514
992 321c6440a4bbaea4c76fa47401e151e68cb6c29017f0bce4631290af5ea5e2bf3ed742ae110b04ade83a5dbd
993 7358f29a85938e23d87ac8233072b79c94670ff0959f9c7f4517862ff829452096c78f5f2e9a7e4e9216",
994 );
995 (public_key, sig, message, false)
996 }
997
998 fn vector_sig_verification_13() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
999 let (public_key, sig, message) = parse_vector_sig_verification(
1000 "072b10c081a4c1713a294f248aef850e297991aca47fa96a7470abe3b8acfdda",
1001 "9581145cca04a0fb94cedce752c8f0370861916d2a94e7c647c5373ce6a4c8f5",
1002 "09f5483eccec80f9d104815a1be9cc1a8e5b12b6eb482a65c6907b7480cf4f19",
1003 "a4f90e560c5e4eb8696cb276e5165b6a9d486345dedfb094a76e8442d026378d",
1004 "785d07a3c54f63dca11f5d1a5f496ee2c2f9288e55007e666c78b007d95cc28581dce51f490b30fa73dc
1005 9e2d45d075d7e3a95fb8a9e1465ad191904124160b7c60fa720ef4ef1c5d2998f40570ae2a870ef3e894c2bc
1006 617d8a1dc85c3c55774928c38789b4e661349d3f84d2441a3b856a76949b9f1f80bc161648a1cad5588e",
1007 );
1008 (public_key, sig, message, false)
1009 }
1010
1011 fn vector_sig_verification_14() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
1012 let (public_key, sig, message) = parse_vector_sig_verification(
1013 "09308ea5bfad6e5adf408634b3d5ce9240d35442f7fe116452aaec0d25be8c24",
1014 "f40c93e023ef494b1c3079b2d10ef67f3170740495ce2cc57f8ee4b0618b8ee5",
1015 "5cc8aa7c35743ec0c23dde88dabd5e4fcd0192d2116f6926fef788cddb754e73",
1016 "9c9c045ebaa1b828c32f82ace0d18daebf5e156eb7cbfdc1eff4399a8a900ae7",
1017 "76f987ec5448dd72219bd30bf6b66b0775c80b394851a43ff1f537f140a6e7229ef8cd72ad58b1d2d202
1018 98539d6347dd5598812bc65323aceaf05228f738b5ad3e8d9fe4100fd767c2f098c77cb99c2992843ba3eed9
1019 1d32444f3b6db6cd212dd4e5609548f4bb62812a920f6e2bf1581be1ebeebdd06ec4e971862cc42055ca",
1020 );
1021 (public_key, sig, message, false)
1022 }
1023
1024 fn vector_sig_verification_15() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
1025 let (public_key, sig, message) = parse_vector_sig_verification(
1026 "2d98ea01f754d34bbc3003df5050200abf445ec728556d7ed7d5c54c55552b6d",
1027 "9b52672742d637a32add056dfd6d8792f2a33c2e69dafabea09b960bc61e230a",
1028 "06108e525f845d0155bf60193222b3219c98e3d49424c2fb2a0987f825c17959",
1029 "62b5cdd591e5b507e560167ba8f6f7cda74673eb315680cb89ccbc4eec477dce",
1030 "60cd64b2cd2be6c33859b94875120361a24085f3765cb8b2bf11e026fa9d8855dbe435acf7882e84f3c7
1031 857f96e2baab4d9afe4588e4a82e17a78827bfdb5ddbd1c211fbc2e6d884cddd7cb9d90d5bf4a7311b83f352
1032 508033812c776a0e00c003c7e0d628e50736c7512df0acfa9f2320bd102229f46495ae6d0857cc452a84",
1033 );
1034 (public_key, sig, message, true)
1035 }
1036}