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