1use alloc::vec::Vec;
8use core::ops::Drop;
9
10#[cfg(feature = "serde")]
11use serde::ser::SerializeStruct;
12#[cfg(feature = "std")]
13use std::io::{Read, Write};
14use zeroize::Zeroize;
15
16use crate::{Deserialize, DeserializeBytes, Error, Serialize, SerializeBytes, Size, U24};
17
18macro_rules! impl_size {
19 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
20 #[inline(always)]
22 fn tls_serialized_length(&$self) -> usize {
23 $self.as_slice()
24 .iter()
25 .fold($len_len, |acc, e| acc + e.tls_serialized_len())
26 }
27 }
28}
29
30macro_rules! impl_byte_size {
31 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
32 #[inline(always)]
34 fn tls_serialized_byte_length(&$self) -> usize {
35 $self.as_slice().len() + $len_len
36 }
37 }
38}
39
40macro_rules! impl_byte_deserialize {
41 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
42 #[cfg(feature = "std")]
43 #[inline(always)]
44 fn deserialize_bytes<R: Read>(bytes: &mut R) -> Result<Self, Error> {
45 let len = <$size>::tls_deserialize(bytes)?.try_into().unwrap();
46 if cfg!(fuzzing) && len > u16::MAX as usize {
50 return Err(Error::DecodingError(format!(
51 "Trying to allocate {} bytes. Only {} allowed.",
52 len,
53 u16::MAX
54 )));
55 }
56 let mut result = Self {
57 vec: vec![0u8; len],
58 };
59 bytes.read_exact(result.vec.as_mut_slice())?;
60 Ok(result)
61 }
62
63 #[inline(always)]
64 fn deserialize_bytes_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
65 let (type_len, remainder) = <$size>::tls_deserialize_bytes(bytes)?;
66 let len = type_len.try_into().unwrap();
67 if cfg!(fuzzing) && len > u16::MAX as usize {
71 return Err(Error::DecodingError(alloc::format!(
72 "Trying to allocate {} bytes. Only {} allowed.",
73 len,
74 u16::MAX
75 )));
76 }
77 let vec = bytes
78 .get($len_len..len + $len_len)
79 .ok_or(Error::EndOfStream)?;
80 let result = Self { vec: vec.to_vec() };
81 Ok((result, &remainder.get(len..).ok_or(Error::EndOfStream)?))
82 }
83 };
84}
85
86macro_rules! impl_deserialize {
87 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
88 #[cfg(feature = "std")]
89 #[inline(always)]
90 fn deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
91 let mut result = Self { vec: Vec::new() };
92 let len = <$size>::tls_deserialize(bytes)?;
93 let mut read = len.tls_serialized_len();
94 let len_len = read;
95 while (read - len_len) < len.try_into().unwrap() {
96 let element = T::tls_deserialize(bytes)?;
97 read += element.tls_serialized_len();
98 result.push(element);
99 }
100 Ok(result)
101 }
102 };
103}
104
105macro_rules! impl_deserialize_bytes {
106 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
107 #[inline(always)]
108 fn deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
109 let mut result = Self { vec: Vec::new() };
110 let (len, mut remainder) = <$size>::tls_deserialize_bytes(bytes)?;
111 let mut read = len.tls_serialized_len();
112 let len_len = read;
113 while (read - len_len) < len.try_into().unwrap() {
114 let (element, next_remainder) = T::tls_deserialize_bytes(remainder)?;
115 remainder = next_remainder;
116 read += element.tls_serialized_len();
117 result.push(element);
118 }
119 Ok((result, remainder))
120 }
121 };
122}
123
124macro_rules! impl_serialize {
125 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
126 #[cfg(feature = "std")]
127 #[inline(always)]
128 fn serialize<W: Write>(&$self, writer: &mut W) -> Result<usize, Error> {
129 let (tls_serialized_len, byte_length) = $self.get_content_lengths()?;
132
133 let mut written = <$size as Serialize>::tls_serialize(&<$size>::try_from(byte_length).unwrap(), writer)?;
134
135 for e in $self.as_slice().iter() {
137 written += e.tls_serialize(writer)?;
138 }
139
140 $self.assert_written_bytes(tls_serialized_len, written)?;
141 Ok(written)
142 }
143 };
144}
145
146macro_rules! impl_byte_serialize {
147 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
148 #[cfg(feature = "std")]
149 #[inline(always)]
150 fn serialize_bytes<W: Write>(&$self, writer: &mut W) -> Result<usize, Error> {
151 let (tls_serialized_len, byte_length) = $self.get_content_lengths()?;
154
155 let mut written = <$size as Serialize>::tls_serialize(&<$size>::try_from(byte_length).unwrap(), writer)?;
156
157 written += writer.write($self.as_slice())?;
159
160 $self.assert_written_bytes(tls_serialized_len, written)?;
161 Ok(written)
162 }
163 };
164}
165
166macro_rules! impl_serialize_common {
167 ($self:ident, $size:ty, $name:ident, $len_len:literal $(,#[$std_enabled:meta])?) => {
168 $(#[$std_enabled])?
169 fn get_content_lengths(&$self) -> Result<(usize, usize), Error> {
170 let tls_serialized_len = $self.tls_serialized_len();
171 let byte_length = tls_serialized_len - $len_len;
172
173 let max_len = <$size>::MAX.try_into().unwrap();
174 debug_assert!(
175 byte_length <= max_len,
176 "Vector length can't be encoded in the vector length a {} >= {}",
177 byte_length,
178 max_len
179 );
180 if byte_length > max_len {
181 return Err(Error::InvalidVectorLength);
182 }
183 Ok((tls_serialized_len, byte_length))
184 }
185
186 $(#[$std_enabled])?
187 fn assert_written_bytes(&$self, tls_serialized_len: usize, written: usize) -> Result<(), Error> {
188 debug_assert_eq!(
189 written, tls_serialized_len,
190 "{} bytes should have been serialized but {} were written",
191 tls_serialized_len, written
192 );
193 if written != tls_serialized_len {
194 return Err(Error::EncodingError(format!(
195 "{} bytes should have been serialized but {} were written",
196 tls_serialized_len, written
197 )));
198 }
199 Ok(())
200 }
201 };
202}
203
204macro_rules! impl_serialize_bytes_bytes {
205 ($self:ident, $size:ty, $name:ident, $len_len:literal) => {
206 fn serialize_bytes_bytes(&$self) -> Result<Vec<u8>, Error> {
207 let (tls_serialized_len, byte_length) = $self.get_content_lengths()?;
208
209 let mut vec = Vec::<u8>::with_capacity(tls_serialized_len);
210 let length_vec = <$size as SerializeBytes>::tls_serialize(&byte_length.try_into().unwrap())?;
211 let mut written = length_vec.len();
212 vec.extend_from_slice(&length_vec);
213
214 let bytes = $self.as_slice();
215 vec.extend_from_slice(bytes);
216 written += bytes.len();
217
218 $self.assert_written_bytes(tls_serialized_len, written)?;
219
220 Ok(vec)
221 }
222 };
223}
224
225macro_rules! impl_tls_vec_codec_generic {
226 ($size:ty, $name:ident, $len_len: literal $(, $bounds:ident)*) => {
227 impl<T: $($bounds + )* Serialize> Serialize for $name<T> {
228 #[cfg(feature = "std")]
229 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
230 self.serialize(writer)
231 }
232 }
233
234 impl<T: $($bounds + )* Size> Size for $name<T> {
235 #[inline]
236 fn tls_serialized_len(&self) -> usize {
237 self.tls_serialized_length()
238 }
239 }
240
241 impl<T: $($bounds + )* Serialize> Serialize for &$name<T> {
242 #[cfg(feature = "std")]
243 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
244 self.serialize(writer)
245 }
246 }
247
248 impl<T: $($bounds + )* Size> Size for &$name<T> {
249 #[inline]
250 fn tls_serialized_len(&self) -> usize {
251 self.tls_serialized_length()
252 }
253 }
254
255 impl<T: $($bounds + )* Deserialize> Deserialize for $name<T> {
256 #[cfg(feature = "std")]
257 fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
258 Self::deserialize(bytes)
259 }
260 }
261
262 impl<T: $($bounds + )* DeserializeBytes> DeserializeBytes for $name<T> {
263 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
264 Self::deserialize_bytes(bytes)
265 }
266 }
267 };
268}
269
270macro_rules! impl_tls_vec_codec_bytes {
271 ($size:ty, $name:ident, $len_len: literal) => {
272 impl Serialize for $name {
273 #[cfg(feature = "std")]
274 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
275 self.serialize_bytes(writer)
276 }
277 }
278
279 impl Size for $name {
280 #[inline]
281 fn tls_serialized_len(&self) -> usize {
282 self.tls_serialized_byte_length()
283 }
284 }
285
286 impl Serialize for &$name {
287 #[cfg(feature = "std")]
288 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
289 self.serialize_bytes(writer)
290 }
291 }
292
293 impl Size for &$name {
294 #[inline]
295 fn tls_serialized_len(&self) -> usize {
296 self.tls_serialized_byte_length()
297 }
298 }
299
300 impl Deserialize for $name {
301 #[cfg(feature = "std")]
302 fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
303 Self::deserialize_bytes(bytes)
304 }
305 }
306
307 impl DeserializeBytes for $name {
308 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
309 Self::deserialize_bytes_bytes(bytes)
310 }
311 }
312
313 impl SerializeBytes for $name {
314 fn tls_serialize(&self) -> Result<Vec<u8>, Error> {
315 self.serialize_bytes_bytes()
316 }
317 }
318 };
319}
320
321macro_rules! impl_vec_members {
322 ($element_type:ident, $len_len:literal) => {
323 #[inline]
325 pub fn new(vec: Vec<$element_type>) -> Self {
326 Self { vec }
327 }
328
329 #[inline]
331 pub fn from_slice(slice: &[$element_type]) -> Self
332 where
333 $element_type: Clone,
334 {
335 Self {
336 vec: slice.to_vec(),
337 }
338 }
339
340 #[inline]
342 pub fn len(&self) -> usize {
343 self.vec.len()
344 }
345
346 #[inline]
348 pub fn as_slice(&self) -> &[$element_type] {
349 &self.vec
350 }
351
352 #[inline]
354 pub fn is_empty(&self) -> bool {
355 self.vec.is_empty()
356 }
357
358 #[inline]
360 pub fn into_vec(mut self) -> Vec<$element_type> {
361 core::mem::take(&mut self.vec)
362 }
363
364 #[inline]
366 pub fn push(&mut self, value: $element_type) {
367 self.vec.push(value);
368 }
369
370 #[inline]
372 pub fn pop(&mut self) -> Option<$element_type> {
373 self.vec.pop()
374 }
375
376 #[inline]
378 pub fn remove(&mut self, index: usize) -> $element_type {
379 self.vec.remove(index)
380 }
381
382 #[inline]
385 pub fn get(&self, index: usize) -> Option<&$element_type> {
386 self.vec.get(index)
387 }
388
389 #[inline]
391 pub fn iter(&self) -> core::slice::Iter<'_, $element_type> {
392 self.vec.iter()
393 }
394
395 #[inline]
397 pub fn retain<F>(&mut self, f: F)
398 where
399 F: FnMut(&$element_type) -> bool,
400 {
401 self.vec.retain(f)
402 }
403
404 #[inline(always)]
406 pub fn len_len() -> usize {
407 $len_len
408 }
409 };
410}
411
412macro_rules! impl_tls_vec_generic {
413 ($size:ty, $name:ident, $len_len: literal $(, $bounds:ident)*) => {
414 #[derive(Eq, Debug)]
415 pub struct $name<T: $($bounds + )*> {
416 vec: Vec<T>,
417 }
418
419 impl<T: $($bounds + )* Clone> Clone for $name<T> {
420 fn clone(&self) -> Self {
421 Self::new(self.vec.clone())
422 }
423 }
424
425 impl<T: $($bounds + )*> $name<T> {
426 impl_vec_members!(T, $len_len);
427 }
428
429 impl<T: $($bounds + )* core::hash::Hash> core::hash::Hash for $name<T> {
430 #[inline]
431 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
432 self.vec.hash(state)
433 }
434 }
435
436 impl<T: $($bounds + )*> core::ops::Index<usize> for $name<T> {
437 type Output = T;
438
439 #[inline]
440 fn index(&self, i: usize) -> &T {
441 self.vec.index(i)
442 }
443 }
444
445 impl<T: $($bounds + )* core::cmp::PartialEq> core::cmp::PartialEq for $name<T> {
446 fn eq(&self, other: &Self) -> bool {
447 self.vec.eq(&other.vec)
448 }
449 }
450
451 impl<T: $($bounds + )*> core::ops::IndexMut<usize> for $name<T> {
452 #[inline]
453 fn index_mut(&mut self, i: usize) -> &mut Self::Output {
454 self.vec.index_mut(i)
455 }
456 }
457
458 impl<T: $($bounds + )*> core::borrow::Borrow<[T]> for $name<T> {
459 #[inline]
460 fn borrow(&self) -> &[T] {
461 &self.vec
462 }
463 }
464
465 impl<T: $($bounds + )*> core::iter::FromIterator<T> for $name<T> {
466 #[inline]
467 fn from_iter<I>(iter: I) -> Self
468 where
469 I: IntoIterator<Item = T>,
470 {
471 let vec = Vec::<T>::from_iter(iter);
472 Self { vec }
473 }
474 }
475
476 impl<T: $($bounds + )*> From<Vec<T>> for $name<T> {
477 #[inline]
478 fn from(v: Vec<T>) -> Self {
479 Self::new(v)
480 }
481 }
482
483 impl<T: $($bounds + )* Clone> From<&[T]> for $name<T> {
484 #[inline]
485 fn from(v: &[T]) -> Self {
486 Self::from_slice(v)
487 }
488 }
489
490 impl<T: $($bounds + )*> From<$name<T>> for Vec<T> {
491 #[inline]
492 fn from(mut v: $name<T>) -> Self {
493 core::mem::take(&mut v.vec)
494 }
495 }
496
497 impl<T: $($bounds + )*> Default for $name<T> {
498 #[inline]
499 fn default() -> Self {
500 Self { vec: Vec::new() }
501 }
502 }
503
504 #[cfg(feature = "serde")]
505 impl<T> serde::Serialize for $name<T>
506 where
507 T: $($bounds + )* serde::Serialize,
508 {
509 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
510 where
511 S: serde::Serializer,
512 {
513 let mut state = serializer.serialize_struct(stringify!($name), 1)?;
514 state.serialize_field("vec", &self.vec)?;
515 state.end()
516 }
517 }
518
519 #[cfg(feature = "serde")]
520 impl<'de, T> serde::de::Deserialize<'de> for $name<T>
521 where
522 T: $($bounds + )* serde::de::Deserialize<'de>,
523 {
524 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
525 where
526 D: serde::de::Deserializer<'de>,
527 {
528 enum Field {
529 Vec,
530 }
531
532 impl<'de> serde::de::Deserialize<'de> for Field {
533 fn deserialize<D>(deserializer: D) -> Result<Field, D::Error>
534 where
535 D: serde::de::Deserializer<'de>,
536 {
537 struct FieldVisitor;
538
539 impl<'de> serde::de::Visitor<'de> for FieldVisitor {
540 type Value = Field;
541
542 fn expecting(
543 &self,
544 formatter: &mut core::fmt::Formatter<'_>,
545 ) -> core::fmt::Result {
546 formatter.write_str("`vec`")
547 }
548
549 fn visit_str<E>(self, value: &str) -> Result<Field, E>
550 where
551 E: serde::de::Error,
552 {
553 match value {
554 "vec" => Ok(Field::Vec),
555 _ => Err(serde::de::Error::unknown_field(value, &["vec"])),
556 }
557 }
558 }
559
560 deserializer.deserialize_identifier(FieldVisitor)
561 }
562 }
563
564 struct TlsVecVisitor<T> {
565 data: core::marker::PhantomData<T>,
566 }
567
568 impl<'de, T> serde::de::Visitor<'de> for TlsVecVisitor<T>
569 where
570 T: $($bounds + )* serde::de::Deserialize<'de>,
571 {
572 type Value = $name<T>;
573 fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
574 formatter.write_fmt(format_args!("struct {}<T>", stringify!($name)))
575 }
576 fn visit_seq<V>(self, mut seq: V) -> Result<$name<T>, V::Error>
577 where
578 V: serde::de::SeqAccess<'de>,
579 {
580 let vec = seq
581 .next_element()?
582 .ok_or_else(|| serde::de::Error::invalid_length(0, &self))?;
583 Ok($name::<T>::new(vec))
584 }
585 fn visit_map<V>(self, mut map: V) -> Result<$name<T>, V::Error>
586 where
587 V: serde::de::MapAccess<'de>,
588 {
589 let mut vec = None;
590 while let Some(key) = map.next_key()? {
591 match key {
592 Field::Vec => {
593 if vec.is_some() {
594 return Err(serde::de::Error::duplicate_field("vec"));
595 }
596 vec = Some(map.next_value()?);
597 }
598 }
599 }
600 let vec = vec.ok_or_else(|| serde::de::Error::missing_field("vec"))?;
601 Ok($name::<T>::new(vec))
602 }
603 }
604 deserializer.deserialize_struct(
605 stringify!($name),
606 &["vec"],
607 TlsVecVisitor {
608 data: core::marker::PhantomData,
609 },
610 )
611 }
612 }
613 };
614}
615
616macro_rules! impl_tls_vec {
617 ($name:ident, $len_len:literal) => {
618 #[derive(Eq, Clone, Debug)]
619 pub struct $name {
620 vec: Vec<u8>,
621 }
622
623 impl $name {
624 impl_vec_members!(u8, $len_len);
625 }
626
627 impl core::hash::Hash for $name {
628 #[inline]
629 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
630 self.vec.hash(state)
631 }
632 }
633
634 impl core::ops::Index<usize> for $name {
635 type Output = u8;
636
637 #[inline]
638 fn index(&self, i: usize) -> &u8 {
639 self.vec.index(i)
640 }
641 }
642
643 impl core::cmp::PartialEq for $name {
644 fn eq(&self, other: &Self) -> bool {
645 self.vec.eq(&other.vec)
646 }
647 }
648
649 impl core::ops::IndexMut<usize> for $name {
650 #[inline]
651 fn index_mut(&mut self, i: usize) -> &mut Self::Output {
652 self.vec.index_mut(i)
653 }
654 }
655
656 impl core::borrow::Borrow<[u8]> for $name {
657 #[inline]
658 fn borrow(&self) -> &[u8] {
659 &self.vec
660 }
661 }
662
663 impl core::iter::FromIterator<u8> for $name {
664 #[inline]
665 fn from_iter<I>(iter: I) -> Self
666 where
667 I: IntoIterator<Item = u8>,
668 {
669 let vec = Vec::<u8>::from_iter(iter);
670 Self { vec }
671 }
672 }
673
674 impl From<Vec<u8>> for $name {
675 #[inline]
676 fn from(v: Vec<u8>) -> Self {
677 Self::new(v)
678 }
679 }
680
681 impl From<&[u8]> for $name {
682 #[inline]
683 fn from(v: &[u8]) -> Self {
684 Self::from_slice(v)
685 }
686 }
687
688 impl From<$name> for Vec<u8> {
689 #[inline]
690 fn from(mut v: $name) -> Self {
691 core::mem::take(&mut v.vec)
692 }
693 }
694
695 impl Default for $name {
696 #[inline]
697 fn default() -> Self {
698 Self { vec: Vec::new() }
699 }
700 }
701
702 #[cfg(feature = "serde")]
703 impl serde::Serialize for $name {
704 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
705 where
706 S: serde::Serializer,
707 {
708 let mut state = serializer.serialize_struct(stringify!($name), 1)?;
709 state.serialize_field("vec", &self.vec)?;
710 state.end()
711 }
712 }
713
714 #[cfg(feature = "serde")]
715 impl<'de> serde::de::Deserialize<'de> for $name {
716 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
717 where
718 D: serde::de::Deserializer<'de>,
719 {
720 enum Field {
721 Vec,
722 }
723
724 impl<'de> serde::de::Deserialize<'de> for Field {
725 fn deserialize<D>(deserializer: D) -> Result<Field, D::Error>
726 where
727 D: serde::de::Deserializer<'de>,
728 {
729 struct FieldVisitor;
730
731 impl<'de> serde::de::Visitor<'de> for FieldVisitor {
732 type Value = Field;
733
734 fn expecting(
735 &self,
736 formatter: &mut core::fmt::Formatter<'_>,
737 ) -> core::fmt::Result {
738 formatter.write_str("`vec`")
739 }
740
741 fn visit_str<E>(self, value: &str) -> Result<Field, E>
742 where
743 E: serde::de::Error,
744 {
745 match value {
746 "vec" => Ok(Field::Vec),
747 _ => Err(serde::de::Error::unknown_field(value, &["vec"])),
748 }
749 }
750 }
751
752 deserializer.deserialize_identifier(FieldVisitor)
753 }
754 }
755
756 struct TlsVecVisitor {
757 data: core::marker::PhantomData<u8>,
758 }
759
760 impl<'de> serde::de::Visitor<'de> for TlsVecVisitor {
761 type Value = $name;
762 fn expecting(
763 &self,
764 formatter: &mut core::fmt::Formatter<'_>,
765 ) -> core::fmt::Result {
766 formatter.write_fmt(format_args!("struct {}", stringify!($name)))
767 }
768 fn visit_seq<V>(self, mut seq: V) -> Result<$name, V::Error>
769 where
770 V: serde::de::SeqAccess<'de>,
771 {
772 let vec = seq
773 .next_element()?
774 .ok_or_else(|| serde::de::Error::invalid_length(0, &self))?;
775 Ok($name::new(vec))
776 }
777 fn visit_map<V>(self, mut map: V) -> Result<$name, V::Error>
778 where
779 V: serde::de::MapAccess<'de>,
780 {
781 let mut vec = None;
782 while let Some(key) = map.next_key()? {
783 match key {
784 Field::Vec => {
785 if vec.is_some() {
786 return Err(serde::de::Error::duplicate_field("vec"));
787 }
788 vec = Some(map.next_value()?);
789 }
790 }
791 }
792 let vec = vec.ok_or_else(|| serde::de::Error::missing_field("vec"))?;
793 Ok($name::new(vec))
794 }
795 }
796 deserializer.deserialize_struct(
797 stringify!($name),
798 &["vec"],
799 TlsVecVisitor {
800 data: core::marker::PhantomData,
801 },
802 )
803 }
804 }
805 };
806}
807
808macro_rules! impl_secret_tls_vec {
809 ($size:ty, $name:ident, $len_len: literal) => {
810 impl_tls_vec_generic!($size, $name, $len_len, Zeroize);
811 impl_tls_vec_codec_generic!($size, $name, $len_len, Zeroize);
812
813 impl<T: Serialize + Zeroize> $name<T> {
814 impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]);
815 impl_serialize!(self, $size, $name, $len_len);
816 }
817
818 impl<T: Size + Zeroize> $name<T> {
819 impl_size!(self, $size, $name, $len_len);
820 }
821
822 impl<T: Deserialize + Zeroize> $name<T> {
823 impl_deserialize!(self, $size, $name, $len_len);
824 }
825
826 impl<T: DeserializeBytes + Zeroize> $name<T> {
827 impl_deserialize_bytes!(self, $size, $name, $len_len);
828 }
829
830 impl<T: Zeroize> Zeroize for $name<T> {
831 fn zeroize(&mut self) {
832 self.vec.zeroize()
833 }
834 }
835
836 impl<T: Zeroize> Drop for $name<T> {
837 fn drop(&mut self) {
838 self.zeroize()
839 }
840 }
841 };
842}
843
844macro_rules! impl_public_tls_vec {
845 ($size:ty, $name:ident, $len_len: literal) => {
846 impl_tls_vec_generic!($size, $name, $len_len);
847
848 impl_tls_vec_codec_generic!($size, $name, $len_len);
849
850 impl<T: Serialize> $name<T> {
851 impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]);
852 impl_serialize!(self, $size, $name, $len_len);
853 }
854
855 impl<T: Size> $name<T> {
856 impl_size!(self, $size, $name, $len_len);
857 }
858
859 impl<T: Deserialize> $name<T> {
860 impl_deserialize!(self, $size, $name, $len_len);
861 }
862
863 impl<T: DeserializeBytes> $name<T> {
864 impl_deserialize_bytes!(self, $size, $name, $len_len);
865 }
866 };
867}
868
869macro_rules! impl_tls_byte_vec {
870 ($size:ty, $name:ident, $len_len: literal) => {
871 impl_tls_vec!($name, $len_len);
872
873 impl $name {
874 impl_serialize_common!(self, $size, $name, $len_len);
876 impl_byte_serialize!(self, $size, $name, $len_len);
877 impl_serialize_bytes_bytes!(self, $size, $name, $len_len);
878 impl_byte_size!(self, $size, $name, $len_len);
879 impl_byte_deserialize!(self, $size, $name, $len_len);
880 }
881
882 impl_tls_vec_codec_bytes!($size, $name, $len_len);
883 };
884}
885
886impl_public_tls_vec!(u8, TlsVecU8, 1);
887impl_public_tls_vec!(u16, TlsVecU16, 2);
888impl_public_tls_vec!(U24, TlsVecU24, 3);
889impl_public_tls_vec!(u32, TlsVecU32, 4);
890
891impl_tls_byte_vec!(u8, TlsByteVecU8, 1);
892impl_tls_byte_vec!(u16, TlsByteVecU16, 2);
893impl_tls_byte_vec!(U24, TlsByteVecU24, 3);
894impl_tls_byte_vec!(u32, TlsByteVecU32, 4);
895
896impl_secret_tls_vec!(u8, SecretTlsVecU8, 1);
898impl_secret_tls_vec!(u16, SecretTlsVecU16, 2);
899impl_secret_tls_vec!(U24, SecretTlsVecU24, 3);
900impl_secret_tls_vec!(u32, SecretTlsVecU32, 4);
901
902macro_rules! impl_tls_byte_slice {
905 ($size:ty, $name:ident, $len_len:literal) => {
906 pub struct $name<'a>(pub &'a [u8]);
907
908 impl<'a> $name<'a> {
909 #[inline(always)]
911 pub fn as_slice(&self) -> &[u8] {
912 self.0
913 }
914 }
915
916 impl<'a> $name<'a> {
917 impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]);
918 impl_byte_serialize!(self, $size, $name, $len_len);
919 impl_byte_size!(self, $size, $name, $len_len);
920 }
921
922 impl<'a> Serialize for &$name<'a> {
923 #[cfg(feature = "std")]
924 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
925 self.serialize_bytes(writer)
926 }
927 }
928
929 impl<'a> Serialize for $name<'a> {
930 #[cfg(feature = "std")]
931 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
932 self.serialize_bytes(writer)
933 }
934 }
935
936 impl<'a> Size for &$name<'a> {
937 #[inline]
938 fn tls_serialized_len(&self) -> usize {
939 self.tls_serialized_byte_length()
940 }
941 }
942
943 impl<'a> Size for $name<'a> {
944 #[inline]
945 fn tls_serialized_len(&self) -> usize {
946 self.tls_serialized_byte_length()
947 }
948 }
949 };
950}
951
952impl_tls_byte_slice!(u8, TlsByteSliceU8, 1);
953impl_tls_byte_slice!(u16, TlsByteSliceU16, 2);
954impl_tls_byte_slice!(U24, TlsByteSliceU24, 3);
955impl_tls_byte_slice!(u32, TlsByteSliceU32, 4);
956
957macro_rules! impl_tls_slice {
958 ($size:ty, $name:ident, $len_len: literal) => {
959 pub struct $name<'a, T>(pub &'a [T]);
960
961 impl<'a, T> $name<'a, T> {
962 #[inline(always)]
964 pub fn as_slice(&self) -> &[T] {
965 self.0
966 }
967 }
968
969 impl<'a, T: Size> $name<'a, T> {
970 impl_size!(self, $size, $name, $len_len);
971 }
972
973 impl<'a, T: Serialize> $name<'a, T> {
974 impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]);
975 impl_serialize!(self, $size, $name, $len_len);
976 }
977
978 impl<'a, T: Serialize> Serialize for &$name<'a, T> {
979 #[cfg(feature = "std")]
980 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
981 self.serialize(writer)
982 }
983 }
984
985 impl<'a, T: Serialize> Serialize for $name<'a, T> {
986 #[cfg(feature = "std")]
987 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
988 self.serialize(writer)
989 }
990 }
991
992 impl<'a, T: Size> Size for &$name<'a, T> {
993 #[inline]
994 fn tls_serialized_len(&self) -> usize {
995 self.tls_serialized_length()
996 }
997 }
998
999 impl<'a, T: Size> Size for $name<'a, T> {
1000 #[inline]
1001 fn tls_serialized_len(&self) -> usize {
1002 self.tls_serialized_length()
1003 }
1004 }
1005 };
1006}
1007
1008impl_tls_slice!(u8, TlsSliceU8, 1);
1009impl_tls_slice!(u16, TlsSliceU16, 2);
1010impl_tls_slice!(U24, TlsSliceU24, 3);
1011impl_tls_slice!(u32, TlsSliceU32, 4);
1012
1013impl From<core::num::TryFromIntError> for Error {
1014 fn from(_e: core::num::TryFromIntError) -> Self {
1015 Self::InvalidVectorLength
1016 }
1017}
1018
1019impl From<core::convert::Infallible> for Error {
1020 fn from(_e: core::convert::Infallible) -> Self {
1021 Self::InvalidVectorLength
1022 }
1023}