commonware_cryptography/bls12381/
scheme.rs

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