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