//! PKCS#8 version identifier. use crate::Error; use der::{Decode, Encode, FixedTag, Reader, Tag, Writer}; /// Version identifier for PKCS#8 documents. /// /// (RFC 5958 designates `0` and `1` as the only valid versions for PKCS#8 documents) #[derive(Clone, Debug, Copy, PartialEq, Eq)] pub enum Version { /// Denotes PKCS#8 v1: no public key field. V1 = 0, /// Denotes PKCS#8 v2: `OneAsymmetricKey` with public key field. V2 = 1, } impl Version { /// Is this version expected to have a public key? pub fn has_public_key(self) -> bool { match self { Version::V1 => false, Version::V2 => true, } } } impl<'a> Decode<'a> for Version { fn decode>(decoder: &mut R) -> der::Result { Version::try_from(u8::decode(decoder)?).map_err(|_| Self::TAG.value_error()) } } impl Encode for Version { fn encoded_len(&self) -> der::Result { der::Length::from(1u8).for_tlv() } fn encode(&self, writer: &mut impl Writer) -> der::Result<()> { u8::from(*self).encode(writer) } } impl From for u8 { fn from(version: Version) -> Self { version as u8 } } impl TryFrom for Version { type Error = Error; fn try_from(byte: u8) -> Result { match byte { 0 => Ok(Version::V1), 1 => Ok(Version::V2), _ => Err(Self::TAG.value_error().into()), } } } impl FixedTag for Version { const TAG: Tag = Tag::Integer; }