]>
Commit | Line | Data |
---|---|---|
49aad941 | 1 | //! Support for decoding/encoding [`Uint`] as an ASN.1 DER `INTEGER`. |
0a29b90c | 2 | |
49aad941 | 3 | use crate::{generic_array::GenericArray, ArrayEncoding, Uint}; |
0a29b90c | 4 | use ::der::{ |
49aad941 | 5 | asn1::{AnyRef, UintRef}, |
0a29b90c FG |
6 | DecodeValue, EncodeValue, FixedTag, Length, Tag, |
7 | }; | |
8 | ||
49aad941 | 9 | impl<'a, const LIMBS: usize> TryFrom<AnyRef<'a>> for Uint<LIMBS> |
0a29b90c | 10 | where |
49aad941 | 11 | Uint<LIMBS>: ArrayEncoding, |
0a29b90c FG |
12 | { |
13 | type Error = der::Error; | |
14 | ||
49aad941 FG |
15 | fn try_from(any: AnyRef<'a>) -> der::Result<Uint<LIMBS>> { |
16 | UintRef::try_from(any)?.try_into() | |
0a29b90c FG |
17 | } |
18 | } | |
19 | ||
49aad941 | 20 | impl<'a, const LIMBS: usize> TryFrom<UintRef<'a>> for Uint<LIMBS> |
0a29b90c | 21 | where |
49aad941 | 22 | Uint<LIMBS>: ArrayEncoding, |
0a29b90c FG |
23 | { |
24 | type Error = der::Error; | |
25 | ||
49aad941 | 26 | fn try_from(bytes: UintRef<'a>) -> der::Result<Uint<LIMBS>> { |
0a29b90c FG |
27 | let mut array = GenericArray::default(); |
28 | let offset = array.len().saturating_sub(bytes.len().try_into()?); | |
29 | array[offset..].copy_from_slice(bytes.as_bytes()); | |
49aad941 | 30 | Ok(Uint::from_be_byte_array(array)) |
0a29b90c FG |
31 | } |
32 | } | |
33 | ||
49aad941 | 34 | impl<'a, const LIMBS: usize> DecodeValue<'a> for Uint<LIMBS> |
0a29b90c | 35 | where |
49aad941 | 36 | Uint<LIMBS>: ArrayEncoding, |
0a29b90c FG |
37 | { |
38 | fn decode_value<R: der::Reader<'a>>(reader: &mut R, header: der::Header) -> der::Result<Self> { | |
49aad941 | 39 | UintRef::decode_value(reader, header)?.try_into() |
0a29b90c FG |
40 | } |
41 | } | |
42 | ||
49aad941 | 43 | impl<const LIMBS: usize> EncodeValue for Uint<LIMBS> |
0a29b90c | 44 | where |
49aad941 | 45 | Uint<LIMBS>: ArrayEncoding, |
0a29b90c FG |
46 | { |
47 | fn value_len(&self) -> der::Result<Length> { | |
48 | // TODO(tarcieri): more efficient length calculation | |
49 | let array = self.to_be_byte_array(); | |
49aad941 | 50 | UintRef::new(&array)?.value_len() |
0a29b90c FG |
51 | } |
52 | ||
49aad941 | 53 | fn encode_value(&self, encoder: &mut impl der::Writer) -> der::Result<()> { |
0a29b90c | 54 | let array = self.to_be_byte_array(); |
49aad941 | 55 | UintRef::new(&array)?.encode_value(encoder) |
0a29b90c FG |
56 | } |
57 | } | |
58 | ||
49aad941 | 59 | impl<const LIMBS: usize> FixedTag for Uint<LIMBS> |
0a29b90c | 60 | where |
49aad941 | 61 | Uint<LIMBS>: ArrayEncoding, |
0a29b90c FG |
62 | { |
63 | const TAG: Tag = Tag::Integer; | |
64 | } |