asn1_rs/asn1_types/strings/
string.rs

1use crate::*;
2#[cfg(not(feature = "std"))]
3use alloc::string::String;
4use core::convert::TryFrom;
5
6impl<'a> TryFrom<Any<'a>> for String {
7    type Error = Error;
8
9    fn try_from(any: Any<'a>) -> Result<String> {
10        TryFrom::try_from(&any)
11    }
12}
13
14impl<'a, 'b> TryFrom<&'b Any<'a>> for String {
15    type Error = Error;
16
17    fn try_from(any: &'b Any<'a>) -> Result<String> {
18        any.tag().assert_eq(Self::TAG)?;
19        let s = Utf8String::try_from(any)?;
20        Ok(s.data.into_owned())
21    }
22}
23
24impl CheckDerConstraints for String {
25    fn check_constraints(any: &Any) -> Result<()> {
26        // X.690 section 10.2
27        any.header.assert_primitive()?;
28        Ok(())
29    }
30}
31
32impl DerAutoDerive for String {}
33
34impl Tagged for String {
35    const TAG: Tag = Tag::Utf8String;
36}
37
38#[cfg(feature = "std")]
39impl ToDer for String {
40    fn to_der_len(&self) -> Result<usize> {
41        let sz = self.as_bytes().len();
42        if sz < 127 {
43            // 1 (class+tag) + 1 (length) + len
44            Ok(2 + sz)
45        } else {
46            // 1 (class+tag) + n (length) + len
47            let n = Length::Definite(sz).to_der_len()?;
48            Ok(1 + n + sz)
49        }
50    }
51
52    fn write_der_header(&self, writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
53        let header = Header::new(
54            Class::Universal,
55            false,
56            Self::TAG,
57            Length::Definite(self.len()),
58        );
59        header.write_der_header(writer).map_err(Into::into)
60    }
61
62    fn write_der_content(&self, writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
63        writer.write(self.as_ref()).map_err(Into::into)
64    }
65}