1use phantom_type::PhantomType;
78
79use crate::core::Curve;
80
81#[derive(Debug, Clone, Copy, Eq, PartialEq, PartialOrd, Ord, Hash)]
110pub struct CurveName<E: Curve>(PhantomType<E>);
111
112impl<E: Curve> CurveName<E> {
113 pub fn new() -> Self {
115 Self(PhantomType::new())
116 }
117}
118
119impl<E: Curve> Default for CurveName<E> {
120 fn default() -> Self {
121 Self::new()
122 }
123}
124
125#[cfg(feature = "serde")]
126impl<E: Curve> serde::Serialize for CurveName<E> {
127 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
128 where
129 S: serde::Serializer,
130 {
131 serializer.serialize_str(E::CURVE_NAME)
132 }
133}
134
135#[cfg(feature = "serde")]
136impl<'de, E: Curve> serde::Deserialize<'de> for CurveName<E> {
137 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
138 where
139 D: serde::Deserializer<'de>,
140 {
141 pub struct CurveNameVisitor<E: Curve>(PhantomType<E>);
142 impl<E: Curve> serde::de::Visitor<'_> for CurveNameVisitor<E> {
143 type Value = CurveName<E>;
144 fn expecting(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
145 write!(f, "curve {name}", name = E::CURVE_NAME)
146 }
147 fn visit_str<Error>(self, v: &str) -> Result<Self::Value, Error>
148 where
149 Error: serde::de::Error,
150 {
151 if v == E::CURVE_NAME {
152 Ok(CurveName::default())
153 } else {
154 Err(Error::custom(optional::error_msg::ExpectedCurve {
155 expected: E::CURVE_NAME,
156 got: v,
157 }))
158 }
159 }
160 }
161 deserializer.deserialize_str(CurveNameVisitor(PhantomType::new()))
162 }
163}
164
165#[cfg(feature = "serde")]
166pub use optional::*;
167#[cfg(feature = "serde")]
168mod optional {
169 use crate::{core::Curve, Point, Scalar, SecretPoint, SecretScalar};
170
171 use super::CurveName;
172
173 impl<E: Curve> serde::Serialize for Point<E> {
174 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
175 where
176 S: serde::Serializer,
177 {
178 models::PointUncompressed::from(self).serialize(serializer)
179 }
180 }
181
182 impl<'de, E: Curve> serde::Deserialize<'de> for Point<E> {
183 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
184 where
185 D: serde::Deserializer<'de>,
186 {
187 models::PointUncompressed::deserialize(deserializer)?
188 .try_into()
189 .map_err(<D::Error as serde::de::Error>::custom)
190 }
191 }
192
193 impl<E: Curve> serde::Serialize for SecretPoint<E> {
194 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
195 where
196 S: serde::Serializer,
197 {
198 self.as_ref().serialize(serializer)
199 }
200 }
201
202 impl<'de, E: Curve> serde::Deserialize<'de> for SecretPoint<E> {
203 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
204 where
205 D: serde::Deserializer<'de>,
206 {
207 Ok(SecretPoint::new(&mut Point::deserialize(deserializer)?))
208 }
209 }
210
211 impl<E: Curve> serde::Serialize for Scalar<E> {
212 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
213 where
214 S: serde::Serializer,
215 {
216 models::ScalarUncompressed::from(self).serialize(serializer)
217 }
218 }
219
220 impl<'de, E: Curve> serde::Deserialize<'de> for Scalar<E> {
221 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
222 where
223 D: serde::Deserializer<'de>,
224 {
225 models::ScalarUncompressed::deserialize(deserializer)?
226 .try_into()
227 .map_err(<D::Error as serde::de::Error>::custom)
228 }
229 }
230
231 impl<E: Curve> serde::Serialize for SecretScalar<E> {
232 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
233 where
234 S: serde::Serializer,
235 {
236 self.as_ref().serialize(serializer)
237 }
238 }
239
240 impl<'de, E: Curve> serde::Deserialize<'de> for SecretScalar<E> {
241 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
242 where
243 D: serde::Deserializer<'de>,
244 {
245 Ok(SecretScalar::new(&mut Scalar::deserialize(deserializer)?))
246 }
247 }
248
249 pub struct Compact;
251
252 impl<E: Curve> serde_with::SerializeAs<Point<E>> for Compact {
253 fn serialize_as<S>(source: &Point<E>, serializer: S) -> Result<S::Ok, S::Error>
254 where
255 S: serde::Serializer,
256 {
257 use serde::Serialize;
258 models::PointCompact::from(source).serialize(serializer)
259 }
260 }
261
262 impl<'de, E: Curve> serde_with::DeserializeAs<'de, Point<E>> for Compact {
263 fn deserialize_as<D>(deserializer: D) -> Result<Point<E>, D::Error>
264 where
265 D: serde::Deserializer<'de>,
266 {
267 use serde::Deserialize;
268 models::PointCompact::deserialize(deserializer)?
269 .try_into()
270 .map_err(<D::Error as serde::de::Error>::custom)
271 }
272 }
273
274 impl<E: Curve> serde_with::SerializeAs<SecretPoint<E>> for Compact {
275 fn serialize_as<S>(source: &SecretPoint<E>, serializer: S) -> Result<S::Ok, S::Error>
276 where
277 S: serde::Serializer,
278 {
279 use serde::Serialize;
280 models::PointCompact::from(source.as_ref()).serialize(serializer)
281 }
282 }
283
284 impl<'de, E: Curve> serde_with::DeserializeAs<'de, SecretPoint<E>> for Compact {
285 fn deserialize_as<D>(deserializer: D) -> Result<SecretPoint<E>, D::Error>
286 where
287 D: serde::Deserializer<'de>,
288 {
289 let mut point = <Compact as serde_with::DeserializeAs<'de, Point<E>>>::deserialize_as(
290 deserializer,
291 )?;
292 Ok(SecretPoint::new(&mut point))
293 }
294 }
295
296 impl<E: Curve> serde_with::SerializeAs<Scalar<E>> for Compact {
297 fn serialize_as<S>(source: &Scalar<E>, serializer: S) -> Result<S::Ok, S::Error>
298 where
299 S: serde::Serializer,
300 {
301 use serde::Serialize;
302 models::ScalarCompact::from(source).serialize(serializer)
303 }
304 }
305
306 impl<'de, E: Curve> serde_with::DeserializeAs<'de, Scalar<E>> for Compact {
307 fn deserialize_as<D>(deserializer: D) -> Result<Scalar<E>, D::Error>
308 where
309 D: serde::Deserializer<'de>,
310 {
311 use serde::Deserialize;
312 models::ScalarCompact::deserialize(deserializer)?
313 .try_into()
314 .map_err(<D::Error as serde::de::Error>::custom)
315 }
316 }
317
318 impl<E: Curve> serde_with::SerializeAs<SecretScalar<E>> for Compact {
319 fn serialize_as<S>(source: &SecretScalar<E>, serializer: S) -> Result<S::Ok, S::Error>
320 where
321 S: serde::Serializer,
322 {
323 use serde::Serialize;
324 models::ScalarCompact::from(source.as_ref()).serialize(serializer)
325 }
326 }
327
328 impl<'de, E: Curve> serde_with::DeserializeAs<'de, SecretScalar<E>> for Compact {
329 fn deserialize_as<D>(deserializer: D) -> Result<SecretScalar<E>, D::Error>
330 where
331 D: serde::Deserializer<'de>,
332 {
333 let mut scalar =
334 <Compact as serde_with::DeserializeAs<'de, Scalar<E>>>::deserialize_as(
335 deserializer,
336 )?;
337 Ok(SecretScalar::new(&mut scalar))
338 }
339 }
340
341 impl<T> serde_with::SerializeAs<crate::NonZero<T>> for Compact
342 where
343 Compact: serde_with::SerializeAs<T>,
344 {
345 fn serialize_as<S>(source: &crate::NonZero<T>, serializer: S) -> Result<S::Ok, S::Error>
346 where
347 S: serde::Serializer,
348 {
349 Compact::serialize_as(source.as_ref(), serializer)
350 }
351 }
352
353 impl<'de, T> serde_with::DeserializeAs<'de, crate::NonZero<T>> for Compact
354 where
355 Compact: serde_with::DeserializeAs<'de, T>,
356 crate::NonZero<T>: TryFrom<T>,
357 <crate::NonZero<T> as TryFrom<T>>::Error: core::fmt::Display,
358 {
359 fn deserialize_as<D>(deserializer: D) -> Result<crate::NonZero<T>, D::Error>
360 where
361 D: serde::Deserializer<'de>,
362 {
363 let value = Compact::deserialize_as(deserializer)?;
364 crate::NonZero::try_from(value).map_err(<D::Error as serde::de::Error>::custom)
365 }
366 }
367
368 impl<'a, T> serde_with::SerializeAs<&'a T> for Compact
369 where
370 Compact: serde_with::SerializeAs<T>,
371 {
372 fn serialize_as<S>(source: &&'a T, serializer: S) -> Result<S::Ok, S::Error>
373 where
374 S: serde::Serializer,
375 {
376 Compact::serialize_as(*source, serializer)
377 }
378 }
379
380 pub struct PreferCompact;
393
394 impl<T> serde_with::SerializeAs<T> for PreferCompact
395 where
396 Compact: serde_with::SerializeAs<T>,
397 {
398 fn serialize_as<S>(source: &T, serializer: S) -> Result<S::Ok, S::Error>
399 where
400 S: serde::Serializer,
401 {
402 <Compact as serde_with::SerializeAs<T>>::serialize_as(source, serializer)
403 }
404 }
405
406 impl<'de, T> serde_with::DeserializeAs<'de, T> for PreferCompact
407 where
408 T: serde::Deserialize<'de>,
409 Compact: serde_with::DeserializeAs<'de, T>,
410 {
411 fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
412 where
413 D: serde::Deserializer<'de>,
414 {
415 use serde_with::DeserializeAs;
416
417 struct Visitor<T> {
418 is_human_readable: bool,
419 _out: core::marker::PhantomData<T>,
420 }
421 impl<'de, T> serde::de::Visitor<'de> for Visitor<T>
422 where
423 T: serde::Deserialize<'de>,
424 Compact: serde_with::DeserializeAs<'de, T>,
425 {
426 type Value = T;
427 fn expecting(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
428 f.write_str("preferably compact point/scalar")
429 }
430
431 fn visit_bytes<Err>(self, v: &[u8]) -> Result<Self::Value, Err>
432 where
433 Err: serde::de::Error,
434 {
435 Compact::deserialize_as(NewTypeDeserializer::new(OverrideHumanReadable {
436 deserializer: serde::de::value::BytesDeserializer::<Err>::new(v),
437 is_human_readable: self.is_human_readable,
438 }))
439 }
440 fn visit_str<Err>(self, v: &str) -> Result<Self::Value, Err>
441 where
442 Err: serde::de::Error,
443 {
444 Compact::deserialize_as(NewTypeDeserializer::new(OverrideHumanReadable {
445 deserializer: serde::de::value::StrDeserializer::<Err>::new(v),
446 is_human_readable: self.is_human_readable,
447 }))
448 }
449
450 fn visit_seq<A>(self, _seq: A) -> Result<Self::Value, A::Error>
451 where
452 A: serde::de::SeqAccess<'de>,
453 {
454 Err(<A::Error as serde::de::Error>::custom(
455 "cannot deserialize in `PreferCompact` mode \
456 from sequence: it's ambiguous",
457 ))
458 }
459 fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
460 where
461 A: serde::de::MapAccess<'de>,
462 {
463 T::deserialize(OverrideHumanReadable {
464 deserializer: serde::de::value::MapAccessDeserializer::new(map),
465 is_human_readable: self.is_human_readable,
466 })
467 }
468
469 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
470 where
471 D: serde::Deserializer<'de>,
472 {
473 Compact::deserialize_as(NewTypeDeserializer::new(OverrideHumanReadable {
474 deserializer,
475 is_human_readable: self.is_human_readable,
476 }))
477 }
478 }
479
480 let is_human_readable = deserializer.is_human_readable();
481 deserializer.deserialize_any(Visitor {
482 is_human_readable,
483 _out: core::marker::PhantomData::<T>,
484 })
485 }
486 }
487
488 struct OverrideHumanReadable<D> {
490 is_human_readable: bool,
491 deserializer: D,
492 }
493 impl<'de, D> serde::Deserializer<'de> for OverrideHumanReadable<D>
494 where
495 D: serde::Deserializer<'de>,
496 {
497 type Error = <D as serde::Deserializer<'de>>::Error;
498
499 fn is_human_readable(&self) -> bool {
500 self.is_human_readable
501 }
502
503 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
504 where
505 V: serde::de::Visitor<'de>,
506 {
507 self.deserializer.deserialize_any(visitor)
508 }
509
510 serde::forward_to_deserialize_any! {
511 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
512 bytes byte_buf option unit unit_struct newtype_struct seq tuple
513 tuple_struct map struct enum identifier ignored_any
514 }
515 }
516
517 struct NewTypeDeserializer<D> {
519 deserializer: D,
520 }
521 impl<D> NewTypeDeserializer<D> {
522 pub fn new(deserializer: D) -> Self {
523 Self { deserializer }
524 }
525 }
526 impl<'de, D> serde::Deserializer<'de> for NewTypeDeserializer<D>
527 where
528 D: serde::Deserializer<'de>,
529 {
530 type Error = D::Error;
531 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
532 where
533 V: serde::de::Visitor<'de>,
534 {
535 visitor.visit_newtype_struct(self.deserializer)
536 }
537 fn is_human_readable(&self) -> bool {
538 self.deserializer.is_human_readable()
539 }
540 serde::forward_to_deserialize_any! {
541 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
542 bytes byte_buf option unit unit_struct newtype_struct seq tuple
543 tuple_struct map struct enum identifier ignored_any
544 }
545 }
546
547 mod models {
548 use core::convert::TryFrom;
549
550 use serde::{Deserialize, Serialize};
551 use serde_with::serde_as;
552
553 use crate::core::{CompressedEncoding, IntegerEncoding, UncompressedEncoding};
554 use crate::{as_raw::AsRaw, Curve, Point, Scalar};
555
556 use super::{
557 error_msg::{InvalidPoint, InvalidScalar},
558 CurveName,
559 };
560
561 #[serde_as]
562 #[derive(Serialize, Deserialize)]
563 #[serde(bound = "")]
564 pub struct PointUncompressed<E: Curve> {
565 curve: CurveName<E>,
566 #[serde_as(as = "super::utils::Bytes")]
567 point: E::UncompressedPointArray,
568 }
569 impl<E: Curve> From<&Point<E>> for PointUncompressed<E> {
570 fn from(p: &Point<E>) -> Self {
571 let bytes = p.as_raw().to_bytes_uncompressed();
572 Self {
573 curve: CurveName::new(),
574 point: bytes,
575 }
576 }
577 }
578 impl<E: Curve> TryFrom<PointUncompressed<E>> for Point<E> {
579 type Error = InvalidPoint;
580 fn try_from(value: PointUncompressed<E>) -> Result<Self, Self::Error> {
581 Point::from_bytes(value.point).or(Err(InvalidPoint))
582 }
583 }
584
585 #[serde_as]
586 #[derive(Serialize, Deserialize)]
587 #[serde(bound = "")]
588 pub struct PointCompact<E: Curve>(
589 #[serde_as(as = "super::utils::Bytes")] E::CompressedPointArray,
590 );
591 impl<E: Curve> From<&Point<E>> for PointCompact<E> {
592 fn from(p: &Point<E>) -> Self {
593 let bytes = p.as_raw().to_bytes_compressed();
594 Self(bytes)
595 }
596 }
597 impl<E: Curve> TryFrom<PointCompact<E>> for Point<E> {
598 type Error = InvalidPoint;
599 fn try_from(value: PointCompact<E>) -> Result<Self, Self::Error> {
600 Point::from_bytes(value.0).or(Err(InvalidPoint))
601 }
602 }
603
604 #[serde_as]
605 #[derive(Serialize, Deserialize)]
606 #[serde(bound = "")]
607 pub struct ScalarUncompressed<E: Curve> {
608 curve: CurveName<E>,
609 #[serde_as(as = "super::utils::Bytes")]
610 scalar: E::ScalarArray,
611 }
612 impl<E: Curve> From<&Scalar<E>> for ScalarUncompressed<E> {
613 fn from(s: &Scalar<E>) -> Self {
614 let bytes = s.as_raw().to_be_bytes();
615 Self {
616 curve: CurveName::new(),
617 scalar: bytes,
618 }
619 }
620 }
621 impl<E: Curve> TryFrom<ScalarUncompressed<E>> for Scalar<E> {
622 type Error = InvalidScalar;
623 fn try_from(value: ScalarUncompressed<E>) -> Result<Self, Self::Error> {
624 Scalar::from_be_bytes(value.scalar).or(Err(InvalidScalar))
625 }
626 }
627
628 #[serde_as]
629 #[derive(Serialize, Deserialize)]
630 #[serde(bound = "")]
631 pub struct ScalarCompact<E: Curve>(#[serde_as(as = "super::utils::Bytes")] E::ScalarArray);
632 impl<E: Curve> From<&Scalar<E>> for ScalarCompact<E> {
633 fn from(s: &Scalar<E>) -> Self {
634 let bytes = s.as_raw().to_be_bytes();
635 Self(bytes)
636 }
637 }
638 impl<E: Curve> TryFrom<ScalarCompact<E>> for Scalar<E> {
639 type Error = InvalidScalar;
640 fn try_from(value: ScalarCompact<E>) -> Result<Self, Self::Error> {
641 Scalar::from_be_bytes(&value.0).or(Err(InvalidScalar))
642 }
643 }
644 }
645
646 mod utils {
647 use core::fmt;
648
649 use serde::de::{self, Visitor};
650 use serde_with::{DeserializeAs, SerializeAs};
651
652 use crate::core::ByteArray;
653
654 pub struct Bytes;
655
656 impl<T> SerializeAs<T> for Bytes
657 where
658 T: AsRef<[u8]>,
659 {
660 fn serialize_as<S>(source: &T, serializer: S) -> Result<S::Ok, S::Error>
661 where
662 S: serde::Serializer,
663 {
664 if serializer.is_human_readable() {
665 let mut buf = [0u8; 256];
668
669 if source.as_ref().len() * 2 > buf.len() {
670 return Err(<S::Error as serde::ser::Error>::custom(
671 super::error_msg::ByteArrayTooLarge {
672 len: source.as_ref().len(),
673 supported_len: buf.len() / 2,
674 },
675 ));
676 }
677 let buf = &mut buf[..2 * source.as_ref().len()];
678 hex::encode_to_slice(source, buf)
679 .map_err(<S::Error as serde::ser::Error>::custom)?;
680 let buf_str = core::str::from_utf8(buf).map_err(|e| {
681 <S::Error as serde::ser::Error>::custom(super::error_msg::MalformedHex(e))
682 })?;
683 serializer.serialize_str(buf_str)
684 } else {
685 serializer.serialize_bytes(source.as_ref())
686 }
687 }
688 }
689
690 impl<'de, T> DeserializeAs<'de, T> for Bytes
691 where
692 T: ByteArray,
693 {
694 fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
695 where
696 D: serde::Deserializer<'de>,
697 {
698 pub struct BytesVisitor<T>(T);
699 impl<'de, T: AsMut<[u8]>> Visitor<'de> for BytesVisitor<T> {
700 type Value = T;
701 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
702 write!(f, "bytes")
703 }
704 fn visit_str<E>(mut self, v: &str) -> Result<Self::Value, E>
705 where
706 E: serde::de::Error,
707 {
708 hex::decode_to_slice(v, self.0.as_mut()).map_err(E::custom)?;
709 Ok(self.0)
710 }
711 fn visit_bytes<E>(mut self, v: &[u8]) -> Result<Self::Value, E>
712 where
713 E: serde::de::Error,
714 {
715 let expected_len = self.0.as_mut().len();
716 if v.len() != expected_len {
717 return Err(E::invalid_length(
718 v.len(),
719 &super::error_msg::ExpectedLen(expected_len),
720 ));
721 }
722 self.0.as_mut().copy_from_slice(v);
723 Ok(self.0)
724 }
725 fn visit_seq<A>(mut self, mut seq: A) -> Result<Self::Value, A::Error>
726 where
727 A: serde::de::SeqAccess<'de>,
728 {
729 let expected_len = self.0.as_mut().len();
730 let bytes = self.0.as_mut().iter_mut().enumerate();
731
732 for (i, byte_i) in bytes {
733 let byte_parsed = seq.next_element()?.ok_or_else(|| {
734 <A::Error as de::Error>::invalid_length(
735 i,
736 &super::error_msg::ExpectedLen(expected_len),
737 )
738 })?;
739 *byte_i = byte_parsed;
740 }
741
742 let mut unparsed_bytes = 0;
743 while seq.next_element::<serde::de::IgnoredAny>()?.is_some() {
744 unparsed_bytes += 1
745 }
746
747 if unparsed_bytes > 0 {
748 Err(<A::Error as de::Error>::invalid_length(
749 expected_len + unparsed_bytes,
750 &super::error_msg::ExpectedLen(expected_len),
751 ))
752 } else {
753 Ok(self.0)
754 }
755 }
756 }
757 let visitor = BytesVisitor(T::zeroes());
758 if deserializer.is_human_readable() {
759 deserializer.deserialize_str(visitor)
760 } else {
761 deserializer.deserialize_bytes(visitor)
762 }
763 }
764 }
765 }
766
767 pub(super) mod error_msg {
768 use core::fmt;
769
770 use serde::de::Expected;
771
772 pub struct ExpectedCurve<'g> {
773 pub expected: &'static str,
774 pub got: &'g str,
775 }
776
777 impl fmt::Display for ExpectedCurve<'_> {
778 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
779 write!(
780 f,
781 "expected {e} curve, got {g}",
782 e = self.expected,
783 g = self.got
784 )
785 }
786 }
787
788 pub struct ExpectedLen(pub usize);
789
790 impl Expected for ExpectedLen {
791 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
792 write!(f, "{} bytes", self.0)
793 }
794 }
795
796 pub struct InvalidPoint;
797 impl fmt::Display for InvalidPoint {
798 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
799 write!(f, "invalid point")
800 }
801 }
802
803 pub struct InvalidScalar;
804 impl fmt::Display for InvalidScalar {
805 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
806 write!(f, "invalid scalar")
807 }
808 }
809
810 pub struct MalformedHex(pub core::str::Utf8Error);
811 impl fmt::Display for MalformedHex {
812 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
813 write!(f, "malformed hex: {}", self.0)
814 }
815 }
816
817 pub struct ByteArrayTooLarge {
818 pub len: usize,
819 pub supported_len: usize,
820 }
821 impl fmt::Display for ByteArrayTooLarge {
822 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
823 write!(f, "byte array is too large: its length is {} bytes, but only up to {} bytes can be serialized", self.len, self.supported_len)
824 }
825 }
826 }
827}