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