1use super::primitives::{
28 group::{self, Scalar},
29 ops,
30 variant::{MinPk, Variant},
31};
32use crate::{Array, BatchVerifier, PrivateKeyExt, Signer as _};
33use bytes::{Buf, BufMut};
34use commonware_codec::{
35 DecodeExt, EncodeFixed, Error as CodecError, FixedSize, Read, ReadExt, Write,
36};
37use commonware_utils::{hex, union_unique};
38use rand::{CryptoRng, Rng};
39use std::{
40 borrow::Cow,
41 fmt::{Debug, Display},
42 hash::{Hash, Hasher},
43 ops::Deref,
44};
45use zeroize::{Zeroize, ZeroizeOnDrop};
46
47const CURVE_NAME: &str = "bls12381";
48
49#[derive(Clone, Eq, PartialEq, Zeroize, ZeroizeOnDrop)]
51pub struct PrivateKey {
52 raw: [u8; group::PRIVATE_KEY_LENGTH],
53 key: group::Private,
54}
55
56impl Write for PrivateKey {
57 fn write(&self, buf: &mut impl BufMut) {
58 self.raw.write(buf);
59 }
60}
61
62impl Read for PrivateKey {
63 type Cfg = ();
64
65 fn read_cfg(buf: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
66 let raw = <[u8; Self::SIZE]>::read(buf)?;
67 let key = group::Private::decode(raw.as_ref())
68 .map_err(|e| CodecError::Wrapped(CURVE_NAME, e.into()))?;
69 Ok(Self { raw, key })
70 }
71}
72
73impl FixedSize for PrivateKey {
74 const SIZE: usize = group::PRIVATE_KEY_LENGTH;
75}
76
77impl Array for PrivateKey {}
78
79impl Hash for PrivateKey {
80 fn hash<H: Hasher>(&self, state: &mut H) {
81 self.raw.hash(state);
82 }
83}
84
85impl Ord for PrivateKey {
86 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
87 self.raw.cmp(&other.raw)
88 }
89}
90
91impl PartialOrd for PrivateKey {
92 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
93 Some(self.cmp(other))
94 }
95}
96
97impl AsRef<[u8]> for PrivateKey {
98 fn as_ref(&self) -> &[u8] {
99 &self.raw
100 }
101}
102
103impl Deref for PrivateKey {
104 type Target = [u8];
105 fn deref(&self) -> &[u8] {
106 &self.raw
107 }
108}
109
110impl From<Scalar> for PrivateKey {
111 fn from(key: Scalar) -> Self {
112 let raw = key.encode_fixed();
113 Self { raw, key }
114 }
115}
116
117impl Debug for PrivateKey {
118 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
119 write!(f, "{}", hex(&self.raw))
120 }
121}
122
123impl Display for PrivateKey {
124 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
125 write!(f, "{}", hex(&self.raw))
126 }
127}
128
129impl crate::PrivateKey for PrivateKey {}
130
131impl crate::Signer for PrivateKey {
132 type Signature = Signature;
133 type PublicKey = PublicKey;
134
135 fn public_key(&self) -> Self::PublicKey {
136 PublicKey::from(ops::compute_public::<MinPk>(&self.key))
137 }
138
139 fn sign(&self, namespace: Option<&[u8]>, msg: &[u8]) -> Self::Signature {
140 let signature = ops::sign_message::<MinPk>(&self.key, namespace, msg);
141 Signature::from(signature)
142 }
143}
144
145impl PrivateKeyExt for PrivateKey {
146 fn from_rng<R: Rng + CryptoRng>(rng: &mut R) -> Self {
147 let (private, _) = ops::keypair::<_, MinPk>(rng);
148 let raw = private.encode_fixed();
149 Self { raw, key: private }
150 }
151}
152
153impl crate::PublicKey for PublicKey {}
154
155impl crate::Verifier for PublicKey {
156 type Signature = Signature;
157
158 fn verify(&self, namespace: Option<&[u8]>, msg: &[u8], sig: &Self::Signature) -> bool {
159 ops::verify_message::<MinPk>(&self.key, namespace, msg, &sig.signature).is_ok()
160 }
161}
162
163#[derive(Clone, Eq, PartialEq)]
165pub struct PublicKey {
166 raw: [u8; <MinPk as Variant>::Public::SIZE],
167 key: <MinPk as Variant>::Public,
168}
169
170impl From<PrivateKey> for PublicKey {
171 fn from(private_key: PrivateKey) -> Self {
172 private_key.public_key()
173 }
174}
175
176impl AsRef<<MinPk as Variant>::Public> for PublicKey {
177 fn as_ref(&self) -> &<MinPk as Variant>::Public {
178 &self.key
179 }
180}
181
182impl Write for PublicKey {
183 fn write(&self, buf: &mut impl BufMut) {
184 self.raw.write(buf);
185 }
186}
187
188impl Read for PublicKey {
189 type Cfg = ();
190
191 fn read_cfg(buf: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
192 let raw = <[u8; Self::SIZE]>::read(buf)?;
193 let key = <MinPk as Variant>::Public::decode(raw.as_ref())
194 .map_err(|e| CodecError::Wrapped(CURVE_NAME, e.into()))?;
195 Ok(Self { raw, key })
196 }
197}
198
199impl FixedSize for PublicKey {
200 const SIZE: usize = <MinPk as Variant>::Public::SIZE;
201}
202
203impl Array for PublicKey {}
204
205impl Hash for PublicKey {
206 fn hash<H: Hasher>(&self, state: &mut H) {
207 self.raw.hash(state);
208 }
209}
210
211impl Ord for PublicKey {
212 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
213 self.raw.cmp(&other.raw)
214 }
215}
216
217impl PartialOrd for PublicKey {
218 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
219 Some(self.cmp(other))
220 }
221}
222
223impl AsRef<[u8]> for PublicKey {
224 fn as_ref(&self) -> &[u8] {
225 &self.raw
226 }
227}
228
229impl Deref for PublicKey {
230 type Target = [u8];
231 fn deref(&self) -> &[u8] {
232 &self.raw
233 }
234}
235
236impl From<<MinPk as Variant>::Public> for PublicKey {
237 fn from(key: <MinPk as Variant>::Public) -> Self {
238 let raw = key.encode_fixed();
239 Self { raw, key }
240 }
241}
242
243impl Debug for PublicKey {
244 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
245 write!(f, "{}", hex(&self.raw))
246 }
247}
248
249impl Display for PublicKey {
250 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
251 write!(f, "{}", hex(&self.raw))
252 }
253}
254
255#[derive(Clone, Eq, PartialEq)]
257pub struct Signature {
258 raw: [u8; <MinPk as Variant>::Signature::SIZE],
259 signature: <MinPk as Variant>::Signature,
260}
261
262impl crate::Signature for Signature {}
263
264impl AsRef<<MinPk as Variant>::Signature> for Signature {
265 fn as_ref(&self) -> &<MinPk as Variant>::Signature {
266 &self.signature
267 }
268}
269
270impl Write for Signature {
271 fn write(&self, buf: &mut impl BufMut) {
272 self.raw.write(buf);
273 }
274}
275
276impl Read for Signature {
277 type Cfg = ();
278
279 fn read_cfg(buf: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
280 let raw = <[u8; Self::SIZE]>::read(buf)?;
281 let signature = <MinPk as Variant>::Signature::decode(raw.as_ref())
282 .map_err(|e| CodecError::Wrapped(CURVE_NAME, e.into()))?;
283 Ok(Self { raw, signature })
284 }
285}
286
287impl FixedSize for Signature {
288 const SIZE: usize = <MinPk as Variant>::Signature::SIZE;
289}
290
291impl Array for Signature {}
292
293impl Hash for Signature {
294 fn hash<H: Hasher>(&self, state: &mut H) {
295 self.raw.hash(state);
296 }
297}
298
299impl Ord for Signature {
300 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
301 self.raw.cmp(&other.raw)
302 }
303}
304
305impl PartialOrd for Signature {
306 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
307 Some(self.cmp(other))
308 }
309}
310
311impl AsRef<[u8]> for Signature {
312 fn as_ref(&self) -> &[u8] {
313 &self.raw
314 }
315}
316
317impl Deref for Signature {
318 type Target = [u8];
319 fn deref(&self) -> &[u8] {
320 &self.raw
321 }
322}
323
324impl From<<MinPk as Variant>::Signature> for Signature {
325 fn from(signature: <MinPk as Variant>::Signature) -> Self {
326 let raw = signature.encode_fixed();
327 Self { raw, signature }
328 }
329}
330
331impl Debug for Signature {
332 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
333 write!(f, "{}", hex(&self.raw))
334 }
335}
336
337impl Display for Signature {
338 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
339 write!(f, "{}", hex(&self.raw))
340 }
341}
342
343pub struct Batch {
345 publics: Vec<<MinPk as Variant>::Public>,
346 hms: Vec<<MinPk as Variant>::Signature>,
347 signatures: Vec<<MinPk as Variant>::Signature>,
348}
349
350impl BatchVerifier<PublicKey> for Batch {
351 fn new() -> Self {
352 Self {
353 publics: Vec::new(),
354 hms: Vec::new(),
355 signatures: Vec::new(),
356 }
357 }
358
359 fn add(
360 &mut self,
361 namespace: Option<&[u8]>,
362 message: &[u8],
363 public_key: &PublicKey,
364 signature: &Signature,
365 ) -> bool {
366 self.publics.push(public_key.key);
367 let payload = match namespace {
368 Some(namespace) => Cow::Owned(union_unique(namespace, message)),
369 None => Cow::Borrowed(message),
370 };
371 let hm = ops::hash_message::<MinPk>(MinPk::MESSAGE, &payload);
372 self.hms.push(hm);
373 self.signatures.push(signature.signature);
374 true
375 }
376
377 fn verify<R: rand::RngCore + CryptoRng>(self, rng: &mut R) -> bool {
378 MinPk::batch_verify(rng, &self.publics, &self.hms, &self.signatures).is_ok()
379 }
380}
381
382#[cfg(test)]
384mod tests {
385 use super::*;
386 use crate::{bls12381, Verifier as _};
387 use commonware_codec::{DecodeExt, Encode};
388
389 #[test]
390 fn test_codec_private_key() {
391 let original =
392 parse_private_key("0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3")
393 .unwrap();
394 let encoded = original.encode();
395 assert_eq!(encoded.len(), bls12381::PrivateKey::SIZE);
396 let decoded = bls12381::PrivateKey::decode(encoded).unwrap();
397 assert_eq!(original, decoded);
398 }
399
400 #[test]
401 fn test_codec_public_key() {
402 let original =
403 parse_public_key("0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a")
404 .unwrap();
405 let encoded = original.encode();
406 assert_eq!(encoded.len(), PublicKey::SIZE);
407 let decoded = PublicKey::decode(encoded).unwrap();
408 assert_eq!(original, decoded);
409 }
410
411 #[test]
412 fn test_codec_signature() {
413 let original =
414 parse_signature("0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb")
415 .unwrap();
416 let encoded = original.encode();
417 assert_eq!(encoded.len(), Signature::SIZE);
418 let decoded = Signature::decode(encoded).unwrap();
419 assert_eq!(original, decoded);
420 }
421
422 #[test]
423 fn test_sign() {
424 let cases = [
425 vector_sign_1(),
426 vector_sign_2(),
427 vector_sign_3(),
428 vector_sign_4(),
429 vector_sign_5(),
430 vector_sign_6(),
431 vector_sign_7(),
432 vector_sign_8(),
433 vector_sign_9(),
434 ];
435 for (index, test) in cases.into_iter().enumerate() {
436 let (private_key, message, expected) = test;
437 let signature = private_key.sign(None, &message);
438 assert_eq!(signature, expected, "vector_sign_{}", index + 1);
439 }
440 }
441
442 #[test]
443 fn test_sign_10() {
444 let result =
445 parse_private_key("0x0000000000000000000000000000000000000000000000000000000000000000");
446 assert!(result.is_err());
447 }
448
449 #[test]
450 fn test_verify() {
451 let cases = [
452 vector_verify_1(),
453 vector_verify_2(),
454 vector_verify_3(),
455 vector_verify_4(),
456 vector_verify_5(),
457 vector_verify_6(),
458 vector_verify_7(),
459 vector_verify_8(),
460 vector_verify_9(),
461 vector_verify_10(),
462 vector_verify_11(),
463 vector_verify_12(),
464 vector_verify_13(),
465 vector_verify_14(),
466 vector_verify_15(),
467 vector_verify_16(),
468 vector_verify_17(),
469 vector_verify_18(),
470 vector_verify_19(),
471 vector_verify_20(),
472 vector_verify_21(),
473 vector_verify_22(),
474 vector_verify_23(),
475 vector_verify_24(),
476 vector_verify_25(),
477 vector_verify_26(),
478 vector_verify_27(),
479 vector_verify_28(),
480 vector_verify_29(),
481 ];
482
483 let mut batch = Batch::new();
484 for (index, test) in cases.into_iter().enumerate() {
485 let (public_key, message, signature, expected) = test;
486 let expected = if !expected {
487 public_key.is_err()
488 || signature.is_err()
489 || !public_key
490 .unwrap()
491 .verify(None, &message, &signature.unwrap())
492 } else {
493 let public_key = public_key.unwrap();
494 let signature = signature.unwrap();
495 batch.add(None, &message, &public_key, &signature);
496 public_key.verify(None, &message, &signature)
497 };
498 assert!(expected, "vector_verify_{}", index + 1);
499 }
500 assert!(batch.verify(&mut rand::thread_rng()));
501 }
502
503 fn parse_sign_vector(
505 private_key: &str,
506 msg: &str,
507 signature: &str,
508 ) -> (PrivateKey, Vec<u8>, Signature) {
509 (
510 parse_private_key(private_key).unwrap(),
511 commonware_utils::from_hex_formatted(msg).unwrap(),
512 parse_signature(signature).unwrap(),
513 )
514 }
515
516 fn parse_private_key(private_key: &str) -> Result<PrivateKey, CodecError> {
517 PrivateKey::decode(
518 commonware_utils::from_hex_formatted(private_key)
519 .unwrap()
520 .as_ref(),
521 )
522 }
523 fn parse_public_key(public_key: &str) -> Result<PublicKey, CodecError> {
524 PublicKey::decode(
525 commonware_utils::from_hex_formatted(public_key)
526 .unwrap()
527 .as_ref(),
528 )
529 }
530 fn parse_signature(signature: &str) -> Result<Signature, CodecError> {
531 Signature::decode(
532 commonware_utils::from_hex_formatted(signature)
533 .unwrap()
534 .as_ref(),
535 )
536 }
537
538 fn vector_sign_1() -> (PrivateKey, Vec<u8>, Signature) {
540 parse_sign_vector(
541 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
542 "0x5656565656565656565656565656565656565656565656565656565656565656",
543 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb"
544 )
545 }
546
547 fn vector_sign_2() -> (PrivateKey, Vec<u8>, Signature) {
549 parse_sign_vector(
550 "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138",
551 "0x0000000000000000000000000000000000000000000000000000000000000000",
552 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9"
553 )
554 }
555
556 fn vector_sign_3() -> (PrivateKey, Vec<u8>, Signature) {
558 parse_sign_vector(
559 "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216",
560 "0xabababababababababababababababababababababababababababababababab",
561 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9"
562 )
563 }
564
565 fn vector_sign_4() -> (PrivateKey, Vec<u8>, Signature) {
567 parse_sign_vector(
568 "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138",
569 "0x5656565656565656565656565656565656565656565656565656565656565656",
570 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe"
571 )
572 }
573
574 fn vector_sign_5() -> (PrivateKey, Vec<u8>, Signature) {
576 parse_sign_vector(
577 "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138",
578 "0xabababababababababababababababababababababababababababababababab",
579 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df"
580 )
581 }
582
583 fn vector_sign_6() -> (PrivateKey, Vec<u8>, Signature) {
585 parse_sign_vector(
586 "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216",
587 "0x0000000000000000000000000000000000000000000000000000000000000000",
588 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115"
589 )
590 }
591
592 fn vector_sign_7() -> (PrivateKey, Vec<u8>, Signature) {
594 parse_sign_vector(
595 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
596 "0x0000000000000000000000000000000000000000000000000000000000000000",
597 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55"
598 )
599 }
600
601 fn vector_sign_8() -> (PrivateKey, Vec<u8>, Signature) {
603 parse_sign_vector(
604 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
605 "0x5656565656565656565656565656565656565656565656565656565656565656",
606 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb"
607 )
608 }
609
610 fn vector_sign_9() -> (PrivateKey, Vec<u8>, Signature) {
612 parse_sign_vector(
613 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
614 "0xabababababababababababababababababababababababababababababababab",
615 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121"
616 )
617 }
618
619 fn parse_verify_vector(
621 public_key: &str,
622 msg: &str,
623 signature: &str,
624 ) -> (
625 Result<PublicKey, CodecError>,
626 Vec<u8>,
627 Result<Signature, CodecError>,
628 ) {
629 (
630 parse_public_key(public_key),
631 commonware_utils::from_hex_formatted(msg).unwrap(),
632 parse_signature(signature),
633 )
634 }
635
636 fn vector_verify_1() -> (
638 Result<PublicKey, CodecError>,
639 Vec<u8>,
640 Result<Signature, CodecError>,
641 bool,
642 ) {
643 let v = parse_verify_vector(
644 "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
645 "0x1212121212121212121212121212121212121212121212121212121212121212",
646 "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
647 );
648 (v.0, v.1, v.2, false)
649 }
650
651 fn vector_verify_2() -> (
653 Result<PublicKey, CodecError>,
654 Vec<u8>,
655 Result<Signature, CodecError>,
656 bool,
657 ) {
658 let v = parse_verify_vector(
659 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
660 "0x5656565656565656565656565656565656565656565656565656565656565656",
661 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972ffffffff",
662 );
663 (v.0, v.1, v.2, false)
664 }
665
666 fn vector_verify_3() -> (
668 Result<PublicKey, CodecError>,
669 Vec<u8>,
670 Result<Signature, CodecError>,
671 bool,
672 ) {
673 let v = parse_verify_vector(
674 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
675 "0x0000000000000000000000000000000000000000000000000000000000000000",
676 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dffffffff",
677 );
678 (v.0, v.1, v.2, false)
679 }
680
681 fn vector_verify_4() -> (
683 Result<PublicKey, CodecError>,
684 Vec<u8>,
685 Result<Signature, CodecError>,
686 bool,
687 ) {
688 let v = parse_verify_vector(
689 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
690 "0x5656565656565656565656565656565656565656565656565656565656565656",
691 "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffffffff",
692 );
693 (v.0, v.1, v.2, false)
694 }
695
696 fn vector_verify_5() -> (
698 Result<PublicKey, CodecError>,
699 Vec<u8>,
700 Result<Signature, CodecError>,
701 bool,
702 ) {
703 let v = parse_verify_vector(
704 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
705 "0xabababababababababababababababababababababababababababababababab",
706 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5ffffffff",
707 );
708 (v.0, v.1, v.2, false)
709 }
710
711 fn vector_verify_6() -> (
713 Result<PublicKey, CodecError>,
714 Vec<u8>,
715 Result<Signature, CodecError>,
716 bool,
717 ) {
718 let v = parse_verify_vector(
719 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
720 "0xabababababababababababababababababababababababababababababababab",
721 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b71ffffffff",
722 );
723 (v.0, v.1, v.2, false)
724 }
725
726 fn vector_verify_7() -> (
728 Result<PublicKey, CodecError>,
729 Vec<u8>,
730 Result<Signature, CodecError>,
731 bool,
732 ) {
733 let v = parse_verify_vector(
734 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
735 "0xabababababababababababababababababababababababababababababababab",
736 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9ffffffff",
737 );
738 (v.0, v.1, v.2, false)
739 }
740
741 fn vector_verify_8() -> (
743 Result<PublicKey, CodecError>,
744 Vec<u8>,
745 Result<Signature, CodecError>,
746 bool,
747 ) {
748 let v = parse_verify_vector(
749 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
750 "0x5656565656565656565656565656565656565656565656565656565656565656",
751 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363ffffffff",
752 );
753 (v.0, v.1, v.2, false)
754 }
755
756 fn vector_verify_9() -> (
758 Result<PublicKey, CodecError>,
759 Vec<u8>,
760 Result<Signature, CodecError>,
761 bool,
762 ) {
763 let v = parse_verify_vector(
764 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
765 "0x0000000000000000000000000000000000000000000000000000000000000000",
766 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075effffffff",
767 );
768 (v.0, v.1, v.2, false)
769 }
770
771 fn vector_verify_10() -> (
773 Result<PublicKey, CodecError>,
774 Vec<u8>,
775 Result<Signature, CodecError>,
776 bool,
777 ) {
778 let v= parse_verify_vector(
779 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
780 "0x0000000000000000000000000000000000000000000000000000000000000000",
781 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380bffffffff",
782 );
783 (v.0, v.1, v.2, false)
784 }
785
786 fn vector_verify_11() -> (
788 Result<PublicKey, CodecError>,
789 Vec<u8>,
790 Result<Signature, CodecError>,
791 bool,
792 ) {
793 let v= parse_verify_vector(
794 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
795 "0x5656565656565656565656565656565656565656565656565656565656565656",
796 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb",
797 );
798 (v.0, v.1, v.2, true)
799 }
800
801 fn vector_verify_12() -> (
803 Result<PublicKey, CodecError>,
804 Vec<u8>,
805 Result<Signature, CodecError>,
806 bool,
807 ) {
808 let v = parse_verify_vector(
809 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
810 "0x0000000000000000000000000000000000000000000000000000000000000000",
811 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9",
812 );
813 (v.0, v.1, v.2, true)
814 }
815
816 fn vector_verify_13() -> (
818 Result<PublicKey, CodecError>,
819 Vec<u8>,
820 Result<Signature, CodecError>,
821 bool,
822 ) {
823 let v = parse_verify_vector(
824 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
825 "0x5656565656565656565656565656565656565656565656565656565656565656",
826 "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6",
827 );
828 (v.0, v.1, v.2, true)
829 }
830
831 fn vector_verify_14() -> (
833 Result<PublicKey, CodecError>,
834 Vec<u8>,
835 Result<Signature, CodecError>,
836 bool,
837 ) {
838 let v = parse_verify_vector(
839 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
840 "0xabababababababababababababababababababababababababababababababab",
841 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df",
842 );
843 (v.0, v.1, v.2, true)
844 }
845
846 fn vector_verify_15() -> (
848 Result<PublicKey, CodecError>,
849 Vec<u8>,
850 Result<Signature, CodecError>,
851 bool,
852 ) {
853 let v = parse_verify_vector(
854 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
855 "0xabababababababababababababababababababababababababababababababab",
856 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121",
857 );
858 (v.0, v.1, v.2, true)
859 }
860
861 fn vector_verify_16() -> (
863 Result<PublicKey, CodecError>,
864 Vec<u8>,
865 Result<Signature, CodecError>,
866 bool,
867 ) {
868 let v = parse_verify_vector(
869 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
870 "0xabababababababababababababababababababababababababababababababab",
871 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9",
872 );
873 (v.0, v.1, v.2, true)
874 }
875
876 fn vector_verify_17() -> (
878 Result<PublicKey, CodecError>,
879 Vec<u8>,
880 Result<Signature, CodecError>,
881 bool,
882 ) {
883 let v = parse_verify_vector(
884 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
885 "0x5656565656565656565656565656565656565656565656565656565656565656",
886 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe",
887 );
888 (v.0, v.1, v.2, true)
889 }
890
891 fn vector_verify_18() -> (
893 Result<PublicKey, CodecError>,
894 Vec<u8>,
895 Result<Signature, CodecError>,
896 bool,
897 ) {
898 let v = parse_verify_vector(
899 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
900 "0x0000000000000000000000000000000000000000000000000000000000000000",
901 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115",
902 );
903 (v.0, v.1, v.2, true)
904 }
905
906 fn vector_verify_19() -> (
908 Result<PublicKey, CodecError>,
909 Vec<u8>,
910 Result<Signature, CodecError>,
911 bool,
912 ) {
913 let v = parse_verify_vector(
914 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
915 "0x0000000000000000000000000000000000000000000000000000000000000000",
916 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55",
917 );
918 (v.0, v.1, v.2, true)
919 }
920
921 fn vector_verify_20() -> (
923 Result<PublicKey, CodecError>,
924 Vec<u8>,
925 Result<Signature, CodecError>,
926 bool,
927 ) {
928 let v = parse_verify_vector(
929 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
930 "0x5656565656565656565656565656565656565656565656565656565656565656",
931 "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6",
932 );
933 (v.0, v.1, v.2, false)
934 }
935
936 fn vector_verify_21() -> (
938 Result<PublicKey, CodecError>,
939 Vec<u8>,
940 Result<Signature, CodecError>,
941 bool,
942 ) {
943 let v = parse_verify_vector(
944 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
945 "0x0000000000000000000000000000000000000000000000000000000000000000",
946 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55",
947 );
948 (v.0, v.1, v.2, false)
949 }
950
951 fn vector_verify_22() -> (
953 Result<PublicKey, CodecError>,
954 Vec<u8>,
955 Result<Signature, CodecError>,
956 bool,
957 ) {
958 let v = parse_verify_vector(
959 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
960 "0x5656565656565656565656565656565656565656565656565656565656565656",
961 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe",
962 );
963 (v.0, v.1, v.2, false)
964 }
965
966 fn vector_verify_23() -> (
968 Result<PublicKey, CodecError>,
969 Vec<u8>,
970 Result<Signature, CodecError>,
971 bool,
972 ) {
973 let v = parse_verify_vector(
974 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
975 "0xabababababababababababababababababababababababababababababababab",
976 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121",
977 );
978 (v.0, v.1, v.2, false)
979 }
980
981 fn vector_verify_24() -> (
983 Result<PublicKey, CodecError>,
984 Vec<u8>,
985 Result<Signature, CodecError>,
986 bool,
987 ) {
988 let v = parse_verify_vector(
989 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
990 "0xabababababababababababababababababababababababababababababababab",
991 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9",
992 );
993 (v.0, v.1, v.2, false)
994 }
995
996 fn vector_verify_25() -> (
998 Result<PublicKey, CodecError>,
999 Vec<u8>,
1000 Result<Signature, CodecError>,
1001 bool,
1002 ) {
1003 let v = parse_verify_vector(
1004 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
1005 "0xabababababababababababababababababababababababababababababababab",
1006 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df",
1007 );
1008 (v.0, v.1, v.2, false)
1009 }
1010
1011 fn vector_verify_26() -> (
1013 Result<PublicKey, CodecError>,
1014 Vec<u8>,
1015 Result<Signature, CodecError>,
1016 bool,
1017 ) {
1018 let v = parse_verify_vector(
1019 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
1020 "0x5656565656565656565656565656565656565656565656565656565656565656",
1021 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb",
1022 );
1023 (v.0, v.1, v.2, false)
1024 }
1025
1026 fn vector_verify_27() -> (
1028 Result<PublicKey, CodecError>,
1029 Vec<u8>,
1030 Result<Signature, CodecError>,
1031 bool,
1032 ) {
1033 let v = parse_verify_vector(
1034 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
1035 "0x0000000000000000000000000000000000000000000000000000000000000000",
1036 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9",
1037 );
1038 (v.0, v.1, v.2, false)
1039 }
1040
1041 fn vector_verify_28() -> (
1043 Result<PublicKey, CodecError>,
1044 Vec<u8>,
1045 Result<Signature, CodecError>,
1046 bool,
1047 ) {
1048 let v = parse_verify_vector(
1049 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
1050 "0x0000000000000000000000000000000000000000000000000000000000000000",
1051 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115",
1052 );
1053 (v.0, v.1, v.2, false)
1054 }
1055
1056 fn vector_verify_29() -> (
1058 Result<PublicKey, CodecError>,
1059 Vec<u8>,
1060 Result<Signature, CodecError>,
1061 bool,
1062 ) {
1063 let v= parse_verify_vector(
1064 "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb",
1065 "0x1212121212121212121212121212121212121212121212121212121212121212",
1066 "0xa42ae16f1c2a5fa69c04cb5998d2add790764ce8dd45bf25b29b4700829232052b52352dcff1cf255b3a7810ad7269601810f03b2bc8b68cf289cf295b206770605a190b6842583e47c3d1c0f73c54907bfb2a602157d46a4353a20283018763",
1067 );
1068 (v.0, v.1, v.2, true)
1069 }
1070}