1 //! ASN.1 `NULL` support.
2 
3 use crate::{
4     asn1::AnyRef, ord::OrdIsValueOrd, BytesRef, DecodeValue, EncodeValue, Error, ErrorKind,
5     FixedTag, Header, Length, Reader, Result, Tag, Writer,
6 };
7 
8 /// ASN.1 `NULL` type.
9 #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
10 pub struct Null;
11 
12 impl_any_conversions!(Null);
13 
14 impl<'a> DecodeValue<'a> for Null {
decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self>15     fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
16         if header.length.is_zero() {
17             Ok(Null)
18         } else {
19             Err(reader.error(ErrorKind::Length { tag: Self::TAG }))
20         }
21     }
22 }
23 
24 impl EncodeValue for Null {
value_len(&self) -> Result<Length>25     fn value_len(&self) -> Result<Length> {
26         Ok(Length::ZERO)
27     }
28 
encode_value(&self, _writer: &mut impl Writer) -> Result<()>29     fn encode_value(&self, _writer: &mut impl Writer) -> Result<()> {
30         Ok(())
31     }
32 }
33 
34 impl FixedTag for Null {
35     const TAG: Tag = Tag::Null;
36 }
37 
38 impl OrdIsValueOrd for Null {}
39 
40 impl<'a> From<Null> for AnyRef<'a> {
from(_: Null) -> AnyRef<'a>41     fn from(_: Null) -> AnyRef<'a> {
42         AnyRef::from_tag_and_value(Tag::Null, BytesRef::default())
43     }
44 }
45 
46 impl TryFrom<AnyRef<'_>> for () {
47     type Error = Error;
48 
try_from(any: AnyRef<'_>) -> Result<()>49     fn try_from(any: AnyRef<'_>) -> Result<()> {
50         Null::try_from(any).map(|_| ())
51     }
52 }
53 
54 impl<'a> From<()> for AnyRef<'a> {
from(_: ()) -> AnyRef<'a>55     fn from(_: ()) -> AnyRef<'a> {
56         Null.into()
57     }
58 }
59 
60 impl<'a> DecodeValue<'a> for () {
decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self>61     fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
62         Null::decode_value(reader, header)?;
63         Ok(())
64     }
65 }
66 
67 impl EncodeValue for () {
value_len(&self) -> Result<Length>68     fn value_len(&self) -> Result<Length> {
69         Ok(Length::ZERO)
70     }
71 
encode_value(&self, _writer: &mut impl Writer) -> Result<()>72     fn encode_value(&self, _writer: &mut impl Writer) -> Result<()> {
73         Ok(())
74     }
75 }
76 
77 impl FixedTag for () {
78     const TAG: Tag = Tag::Null;
79 }
80 
81 #[cfg(test)]
82 mod tests {
83     use super::Null;
84     use crate::{Decode, Encode};
85 
86     #[test]
decode()87     fn decode() {
88         Null::from_der(&[0x05, 0x00]).unwrap();
89     }
90 
91     #[test]
encode()92     fn encode() {
93         let mut buffer = [0u8; 2];
94         assert_eq!(&[0x05, 0x00], Null.encode_to_slice(&mut buffer).unwrap());
95         assert_eq!(&[0x05, 0x00], ().encode_to_slice(&mut buffer).unwrap());
96     }
97 
98     #[test]
reject_non_canonical()99     fn reject_non_canonical() {
100         assert!(Null::from_der(&[0x05, 0x81, 0x00]).is_err());
101     }
102 }
103