1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
//! PKCS#8 attributes.
use core::convert::TryFrom;
use der::{asn1::Any, Encodable, Encoder, Length};
/// Attributes as defined in [RFC 5958 Section 2].
///
/// > attributes is OPTIONAL. It contains information corresponding to
/// > the public key (e.g., certificates). The attributes field uses the
/// > class `ATTRIBUTE` which is restricted by the
/// > `OneAsymmetricKeyAttributes` information object set.
/// > `OneAsymmetricKeyAttributes` is an open ended set in this document.
/// > Others documents can constrain these values. Attributes from
/// > RFC2985 MAY be supported.
///
/// Attributes have the following ASN.1 schema:
///
/// ```text
/// Attributes ::= SET OF Attribute { { OneAsymmetricKeyAttributes } }
/// ```
///
/// [RFC 5958 Section 2]: https://datatracker.ietf.org/doc/html/rfc5958
// TODO(tarcieri): support parsing attributes as a `der::SetOf`?
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
pub struct Attributes<'a>(Any<'a>);
impl<'a> From<Attributes<'a>> for Any<'a> {
fn from(attrs: Attributes<'a>) -> Any<'a> {
attrs.0
}
}
impl<'a> TryFrom<Any<'a>> for Attributes<'a> {
type Error = der::Error;
fn try_from(any: Any<'a>) -> der::Result<Attributes<'a>> {
Ok(Attributes(any))
}
}
impl<'a> Encodable for Attributes<'a> {
/// Compute the length of this value in bytes when encoded as ASN.1 DER.
fn encoded_len(&self) -> der::Result<Length> {
self.0.encoded_len()
}
/// Encode this value as ASN.1 DER using the provided [`Encoder`].
fn encode(&self, encoder: &mut Encoder<'_>) -> der::Result<()> {
self.0.encode(encoder)
}
}