aws_lc_rs/
encoding.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0 OR ISC
3
4//! Serialization formats
5
6use crate::buffer::Buffer;
7use paste::paste;
8
9macro_rules! generated_encodings {
10    ($($name:ident),*) => { paste! {
11        use core::fmt::{Debug, Error, Formatter};
12        use core::ops::Deref;
13        mod buffer_type {
14            $(
15                pub struct [<$name Type>] {
16                    _priv: (),
17                }
18            )*
19        }
20        $(
21            /// Serialized bytes
22            pub struct $name<'a>(Buffer<'a, buffer_type::[<$name Type>]>);
23
24            impl<'a> Deref for $name<'a> {
25                type Target = Buffer<'a, buffer_type::[<$name Type>]>;
26
27                fn deref(&self) -> &Self::Target {
28                    &self.0
29                }
30            }
31
32            impl $name<'static> {
33                #[allow(dead_code)]
34                pub(crate) fn new(owned: Vec<u8>) -> Self {
35                    Self(Buffer::new(owned))
36                }
37                #[allow(dead_code)]
38                pub(crate) fn take_from_slice(owned: &mut [u8]) -> Self {
39                    Self(Buffer::take_from_slice(owned))
40                }
41            }
42
43            impl Debug for $name<'_> {
44                fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
45                    f.debug_struct(stringify!($name)).finish()
46                }
47            }
48
49            impl<'a> From<Buffer<'a, buffer_type::[<$name Type>]>> for $name<'a> {
50                fn from(value: Buffer<'a, buffer_type::[<$name Type>]>) -> Self {
51                    Self(value)
52                }
53            }
54        )*
55    }}
56}
57pub(crate) use generated_encodings;
58generated_encodings!(
59    EcPrivateKeyBin,
60    EcPrivateKeyRfc5915Der,
61    EcPublicKeyUncompressedBin,
62    EcPublicKeyCompressedBin,
63    PublicKeyX509Der,
64    Curve25519SeedBin,
65    Pkcs8V1Der,
66    Pkcs8V2Der
67);
68
69/// Trait for types that can be serialized into a DER format.
70pub trait AsDer<T> {
71    /// Serializes into a DER format.
72    ///
73    /// # Errors
74    /// Returns Unspecified if serialization fails.
75    fn as_der(&self) -> Result<T, crate::error::Unspecified>;
76}
77
78/// Trait for values that can be serialized into a big-endian format
79pub trait AsBigEndian<T> {
80    /// Serializes into a big-endian format.
81    ///
82    /// # Errors
83    /// Returns Unspecified if serialization fails.
84    fn as_be_bytes(&self) -> Result<T, crate::error::Unspecified>;
85}