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 crate::{bls12381, BatchVerifier as _, Signer as _, Verifier as _};
386
387 use super::*;
388 use commonware_codec::{DecodeExt, Encode};
389
390 #[test]
391 fn test_codec_private_key() {
392 let original =
393 parse_private_key("0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3")
394 .unwrap();
395 let encoded = original.encode();
396 assert_eq!(encoded.len(), bls12381::PrivateKey::SIZE);
397 let decoded = bls12381::PrivateKey::decode(encoded).unwrap();
398 assert_eq!(original, decoded);
399 }
400
401 #[test]
402 fn test_codec_public_key() {
403 let original =
404 parse_public_key("0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a")
405 .unwrap();
406 let encoded = original.encode();
407 assert_eq!(encoded.len(), PublicKey::SIZE);
408 let decoded = PublicKey::decode(encoded).unwrap();
409 assert_eq!(original, decoded);
410 }
411
412 #[test]
413 fn test_codec_signature() {
414 let original =
415 parse_signature("0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb")
416 .unwrap();
417 let encoded = original.encode();
418 assert_eq!(encoded.len(), Signature::SIZE);
419 let decoded = Signature::decode(encoded).unwrap();
420 assert_eq!(original, decoded);
421 }
422
423 #[test]
424 fn test_sign() {
425 let cases = [
426 vector_sign_1(),
427 vector_sign_2(),
428 vector_sign_3(),
429 vector_sign_4(),
430 vector_sign_5(),
431 vector_sign_6(),
432 vector_sign_7(),
433 vector_sign_8(),
434 vector_sign_9(),
435 ];
436 for (index, test) in cases.into_iter().enumerate() {
437 let (private_key, message, expected) = test;
438 let signature = private_key.sign(None, &message);
439 assert_eq!(signature, expected, "vector_sign_{}", index + 1);
440 }
441 }
442
443 #[test]
444 fn test_sign_10() {
445 let result =
446 parse_private_key("0x0000000000000000000000000000000000000000000000000000000000000000");
447 assert!(result.is_err());
448 }
449
450 #[test]
451 fn test_verify() {
452 let cases = [
453 vector_verify_1(),
454 vector_verify_2(),
455 vector_verify_3(),
456 vector_verify_4(),
457 vector_verify_5(),
458 vector_verify_6(),
459 vector_verify_7(),
460 vector_verify_8(),
461 vector_verify_9(),
462 vector_verify_10(),
463 vector_verify_11(),
464 vector_verify_12(),
465 vector_verify_13(),
466 vector_verify_14(),
467 vector_verify_15(),
468 vector_verify_16(),
469 vector_verify_17(),
470 vector_verify_18(),
471 vector_verify_19(),
472 vector_verify_20(),
473 vector_verify_21(),
474 vector_verify_22(),
475 vector_verify_23(),
476 vector_verify_24(),
477 vector_verify_25(),
478 vector_verify_26(),
479 vector_verify_27(),
480 vector_verify_28(),
481 vector_verify_29(),
482 ];
483
484 let mut batch = Batch::new();
485 for (index, test) in cases.into_iter().enumerate() {
486 let (public_key, message, signature, expected) = test;
487 let expected = if !expected {
488 public_key.is_err()
489 || signature.is_err()
490 || !public_key
491 .unwrap()
492 .verify(None, &message, &signature.unwrap())
493 } else {
494 let public_key = public_key.unwrap();
495 let signature = signature.unwrap();
496 batch.add(None, &message, &public_key, &signature);
497 public_key.verify(None, &message, &signature)
498 };
499 assert!(expected, "vector_verify_{}", index + 1);
500 }
501 assert!(batch.verify(&mut rand::thread_rng()));
502 }
503
504 fn parse_sign_vector(
506 private_key: &str,
507 msg: &str,
508 signature: &str,
509 ) -> (PrivateKey, Vec<u8>, Signature) {
510 (
511 parse_private_key(private_key).unwrap(),
512 commonware_utils::from_hex_formatted(msg).unwrap(),
513 parse_signature(signature).unwrap(),
514 )
515 }
516
517 fn parse_private_key(private_key: &str) -> Result<PrivateKey, CodecError> {
518 PrivateKey::decode(
519 commonware_utils::from_hex_formatted(private_key)
520 .unwrap()
521 .as_ref(),
522 )
523 }
524 fn parse_public_key(public_key: &str) -> Result<PublicKey, CodecError> {
525 PublicKey::decode(
526 commonware_utils::from_hex_formatted(public_key)
527 .unwrap()
528 .as_ref(),
529 )
530 }
531 fn parse_signature(signature: &str) -> Result<Signature, CodecError> {
532 Signature::decode(
533 commonware_utils::from_hex_formatted(signature)
534 .unwrap()
535 .as_ref(),
536 )
537 }
538
539 fn vector_sign_1() -> (PrivateKey, Vec<u8>, Signature) {
541 parse_sign_vector(
542 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
543 "0x5656565656565656565656565656565656565656565656565656565656565656",
544 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb"
545 )
546 }
547
548 fn vector_sign_2() -> (PrivateKey, Vec<u8>, Signature) {
550 parse_sign_vector(
551 "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138",
552 "0x0000000000000000000000000000000000000000000000000000000000000000",
553 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9"
554 )
555 }
556
557 fn vector_sign_3() -> (PrivateKey, Vec<u8>, Signature) {
559 parse_sign_vector(
560 "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216",
561 "0xabababababababababababababababababababababababababababababababab",
562 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9"
563 )
564 }
565
566 fn vector_sign_4() -> (PrivateKey, Vec<u8>, Signature) {
568 parse_sign_vector(
569 "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138",
570 "0x5656565656565656565656565656565656565656565656565656565656565656",
571 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe"
572 )
573 }
574
575 fn vector_sign_5() -> (PrivateKey, Vec<u8>, Signature) {
577 parse_sign_vector(
578 "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138",
579 "0xabababababababababababababababababababababababababababababababab",
580 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df"
581 )
582 }
583
584 fn vector_sign_6() -> (PrivateKey, Vec<u8>, Signature) {
586 parse_sign_vector(
587 "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216",
588 "0x0000000000000000000000000000000000000000000000000000000000000000",
589 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115"
590 )
591 }
592
593 fn vector_sign_7() -> (PrivateKey, Vec<u8>, Signature) {
595 parse_sign_vector(
596 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
597 "0x0000000000000000000000000000000000000000000000000000000000000000",
598 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55"
599 )
600 }
601
602 fn vector_sign_8() -> (PrivateKey, Vec<u8>, Signature) {
604 parse_sign_vector(
605 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
606 "0x5656565656565656565656565656565656565656565656565656565656565656",
607 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb"
608 )
609 }
610
611 fn vector_sign_9() -> (PrivateKey, Vec<u8>, Signature) {
613 parse_sign_vector(
614 "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3",
615 "0xabababababababababababababababababababababababababababababababab",
616 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121"
617 )
618 }
619
620 fn parse_verify_vector(
622 public_key: &str,
623 msg: &str,
624 signature: &str,
625 ) -> (
626 Result<PublicKey, CodecError>,
627 Vec<u8>,
628 Result<Signature, CodecError>,
629 ) {
630 (
631 parse_public_key(public_key),
632 commonware_utils::from_hex_formatted(msg).unwrap(),
633 parse_signature(signature),
634 )
635 }
636
637 fn vector_verify_1() -> (
639 Result<PublicKey, CodecError>,
640 Vec<u8>,
641 Result<Signature, CodecError>,
642 bool,
643 ) {
644 let v = parse_verify_vector(
645 "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
646 "0x1212121212121212121212121212121212121212121212121212121212121212",
647 "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
648 );
649 (v.0, v.1, v.2, false)
650 }
651
652 fn vector_verify_2() -> (
654 Result<PublicKey, CodecError>,
655 Vec<u8>,
656 Result<Signature, CodecError>,
657 bool,
658 ) {
659 let v = parse_verify_vector(
660 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
661 "0x5656565656565656565656565656565656565656565656565656565656565656",
662 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972ffffffff",
663 );
664 (v.0, v.1, v.2, false)
665 }
666
667 fn vector_verify_3() -> (
669 Result<PublicKey, CodecError>,
670 Vec<u8>,
671 Result<Signature, CodecError>,
672 bool,
673 ) {
674 let v = parse_verify_vector(
675 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
676 "0x0000000000000000000000000000000000000000000000000000000000000000",
677 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dffffffff",
678 );
679 (v.0, v.1, v.2, false)
680 }
681
682 fn vector_verify_4() -> (
684 Result<PublicKey, CodecError>,
685 Vec<u8>,
686 Result<Signature, CodecError>,
687 bool,
688 ) {
689 let v = parse_verify_vector(
690 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
691 "0x5656565656565656565656565656565656565656565656565656565656565656",
692 "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffffffff",
693 );
694 (v.0, v.1, v.2, false)
695 }
696
697 fn vector_verify_5() -> (
699 Result<PublicKey, CodecError>,
700 Vec<u8>,
701 Result<Signature, CodecError>,
702 bool,
703 ) {
704 let v = parse_verify_vector(
705 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
706 "0xabababababababababababababababababababababababababababababababab",
707 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5ffffffff",
708 );
709 (v.0, v.1, v.2, false)
710 }
711
712 fn vector_verify_6() -> (
714 Result<PublicKey, CodecError>,
715 Vec<u8>,
716 Result<Signature, CodecError>,
717 bool,
718 ) {
719 let v = parse_verify_vector(
720 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
721 "0xabababababababababababababababababababababababababababababababab",
722 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b71ffffffff",
723 );
724 (v.0, v.1, v.2, false)
725 }
726
727 fn vector_verify_7() -> (
729 Result<PublicKey, CodecError>,
730 Vec<u8>,
731 Result<Signature, CodecError>,
732 bool,
733 ) {
734 let v = parse_verify_vector(
735 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
736 "0xabababababababababababababababababababababababababababababababab",
737 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9ffffffff",
738 );
739 (v.0, v.1, v.2, false)
740 }
741
742 fn vector_verify_8() -> (
744 Result<PublicKey, CodecError>,
745 Vec<u8>,
746 Result<Signature, CodecError>,
747 bool,
748 ) {
749 let v = parse_verify_vector(
750 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
751 "0x5656565656565656565656565656565656565656565656565656565656565656",
752 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363ffffffff",
753 );
754 (v.0, v.1, v.2, false)
755 }
756
757 fn vector_verify_9() -> (
759 Result<PublicKey, CodecError>,
760 Vec<u8>,
761 Result<Signature, CodecError>,
762 bool,
763 ) {
764 let v = parse_verify_vector(
765 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
766 "0x0000000000000000000000000000000000000000000000000000000000000000",
767 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075effffffff",
768 );
769 (v.0, v.1, v.2, false)
770 }
771
772 fn vector_verify_10() -> (
774 Result<PublicKey, CodecError>,
775 Vec<u8>,
776 Result<Signature, CodecError>,
777 bool,
778 ) {
779 let v= parse_verify_vector(
780 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
781 "0x0000000000000000000000000000000000000000000000000000000000000000",
782 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380bffffffff",
783 );
784 (v.0, v.1, v.2, false)
785 }
786
787 fn vector_verify_11() -> (
789 Result<PublicKey, CodecError>,
790 Vec<u8>,
791 Result<Signature, CodecError>,
792 bool,
793 ) {
794 let v= parse_verify_vector(
795 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
796 "0x5656565656565656565656565656565656565656565656565656565656565656",
797 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb",
798 );
799 (v.0, v.1, v.2, true)
800 }
801
802 fn vector_verify_12() -> (
804 Result<PublicKey, CodecError>,
805 Vec<u8>,
806 Result<Signature, CodecError>,
807 bool,
808 ) {
809 let v = parse_verify_vector(
810 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
811 "0x0000000000000000000000000000000000000000000000000000000000000000",
812 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9",
813 );
814 (v.0, v.1, v.2, true)
815 }
816
817 fn vector_verify_13() -> (
819 Result<PublicKey, CodecError>,
820 Vec<u8>,
821 Result<Signature, CodecError>,
822 bool,
823 ) {
824 let v = parse_verify_vector(
825 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
826 "0x5656565656565656565656565656565656565656565656565656565656565656",
827 "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6",
828 );
829 (v.0, v.1, v.2, true)
830 }
831
832 fn vector_verify_14() -> (
834 Result<PublicKey, CodecError>,
835 Vec<u8>,
836 Result<Signature, CodecError>,
837 bool,
838 ) {
839 let v = parse_verify_vector(
840 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
841 "0xabababababababababababababababababababababababababababababababab",
842 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df",
843 );
844 (v.0, v.1, v.2, true)
845 }
846
847 fn vector_verify_15() -> (
849 Result<PublicKey, CodecError>,
850 Vec<u8>,
851 Result<Signature, CodecError>,
852 bool,
853 ) {
854 let v = parse_verify_vector(
855 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
856 "0xabababababababababababababababababababababababababababababababab",
857 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121",
858 );
859 (v.0, v.1, v.2, true)
860 }
861
862 fn vector_verify_16() -> (
864 Result<PublicKey, CodecError>,
865 Vec<u8>,
866 Result<Signature, CodecError>,
867 bool,
868 ) {
869 let v = parse_verify_vector(
870 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
871 "0xabababababababababababababababababababababababababababababababab",
872 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9",
873 );
874 (v.0, v.1, v.2, true)
875 }
876
877 fn vector_verify_17() -> (
879 Result<PublicKey, CodecError>,
880 Vec<u8>,
881 Result<Signature, CodecError>,
882 bool,
883 ) {
884 let v = parse_verify_vector(
885 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
886 "0x5656565656565656565656565656565656565656565656565656565656565656",
887 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe",
888 );
889 (v.0, v.1, v.2, true)
890 }
891
892 fn vector_verify_18() -> (
894 Result<PublicKey, CodecError>,
895 Vec<u8>,
896 Result<Signature, CodecError>,
897 bool,
898 ) {
899 let v = parse_verify_vector(
900 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
901 "0x0000000000000000000000000000000000000000000000000000000000000000",
902 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115",
903 );
904 (v.0, v.1, v.2, true)
905 }
906
907 fn vector_verify_19() -> (
909 Result<PublicKey, CodecError>,
910 Vec<u8>,
911 Result<Signature, CodecError>,
912 bool,
913 ) {
914 let v = parse_verify_vector(
915 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
916 "0x0000000000000000000000000000000000000000000000000000000000000000",
917 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55",
918 );
919 (v.0, v.1, v.2, true)
920 }
921
922 fn vector_verify_20() -> (
924 Result<PublicKey, CodecError>,
925 Vec<u8>,
926 Result<Signature, CodecError>,
927 bool,
928 ) {
929 let v = parse_verify_vector(
930 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
931 "0x5656565656565656565656565656565656565656565656565656565656565656",
932 "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6",
933 );
934 (v.0, v.1, v.2, false)
935 }
936
937 fn vector_verify_21() -> (
939 Result<PublicKey, CodecError>,
940 Vec<u8>,
941 Result<Signature, CodecError>,
942 bool,
943 ) {
944 let v = parse_verify_vector(
945 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
946 "0x0000000000000000000000000000000000000000000000000000000000000000",
947 "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55",
948 );
949 (v.0, v.1, v.2, false)
950 }
951
952 fn vector_verify_22() -> (
954 Result<PublicKey, CodecError>,
955 Vec<u8>,
956 Result<Signature, CodecError>,
957 bool,
958 ) {
959 let v = parse_verify_vector(
960 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
961 "0x5656565656565656565656565656565656565656565656565656565656565656",
962 "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe",
963 );
964 (v.0, v.1, v.2, false)
965 }
966
967 fn vector_verify_23() -> (
969 Result<PublicKey, CodecError>,
970 Vec<u8>,
971 Result<Signature, CodecError>,
972 bool,
973 ) {
974 let v = parse_verify_vector(
975 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
976 "0xabababababababababababababababababababababababababababababababab",
977 "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121",
978 );
979 (v.0, v.1, v.2, false)
980 }
981
982 fn vector_verify_24() -> (
984 Result<PublicKey, CodecError>,
985 Vec<u8>,
986 Result<Signature, CodecError>,
987 bool,
988 ) {
989 let v = parse_verify_vector(
990 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
991 "0xabababababababababababababababababababababababababababababababab",
992 "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9",
993 );
994 (v.0, v.1, v.2, false)
995 }
996
997 fn vector_verify_25() -> (
999 Result<PublicKey, CodecError>,
1000 Vec<u8>,
1001 Result<Signature, CodecError>,
1002 bool,
1003 ) {
1004 let v = parse_verify_vector(
1005 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
1006 "0xabababababababababababababababababababababababababababababababab",
1007 "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df",
1008 );
1009 (v.0, v.1, v.2, false)
1010 }
1011
1012 fn vector_verify_26() -> (
1014 Result<PublicKey, CodecError>,
1015 Vec<u8>,
1016 Result<Signature, CodecError>,
1017 bool,
1018 ) {
1019 let v = parse_verify_vector(
1020 "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81",
1021 "0x5656565656565656565656565656565656565656565656565656565656565656",
1022 "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb",
1023 );
1024 (v.0, v.1, v.2, false)
1025 }
1026
1027 fn vector_verify_27() -> (
1029 Result<PublicKey, CodecError>,
1030 Vec<u8>,
1031 Result<Signature, CodecError>,
1032 bool,
1033 ) {
1034 let v = parse_verify_vector(
1035 "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f",
1036 "0x0000000000000000000000000000000000000000000000000000000000000000",
1037 "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9",
1038 );
1039 (v.0, v.1, v.2, false)
1040 }
1041
1042 fn vector_verify_28() -> (
1044 Result<PublicKey, CodecError>,
1045 Vec<u8>,
1046 Result<Signature, CodecError>,
1047 bool,
1048 ) {
1049 let v = parse_verify_vector(
1050 "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a",
1051 "0x0000000000000000000000000000000000000000000000000000000000000000",
1052 "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115",
1053 );
1054 (v.0, v.1, v.2, false)
1055 }
1056
1057 fn vector_verify_29() -> (
1059 Result<PublicKey, CodecError>,
1060 Vec<u8>,
1061 Result<Signature, CodecError>,
1062 bool,
1063 ) {
1064 let v= parse_verify_vector(
1065 "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb",
1066 "0x1212121212121212121212121212121212121212121212121212121212121212",
1067 "0xa42ae16f1c2a5fa69c04cb5998d2add790764ce8dd45bf25b29b4700829232052b52352dcff1cf255b3a7810ad7269601810f03b2bc8b68cf289cf295b206770605a190b6842583e47c3d1c0f73c54907bfb2a602157d46a4353a20283018763",
1068 );
1069 (v.0, v.1, v.2, true)
1070 }
1071}