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