| //! 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<R: Reader<'a>>(decoder: &mut R) -> der::Result<Self> { |
| Version::try_from(u8::decode(decoder)?).map_err(|_| Self::TAG.value_error()) |
| } |
| } |
| |
| impl Encode for Version { |
| fn encoded_len(&self) -> der::Result<der::Length> { |
| der::Length::from(1u8).for_tlv() |
| } |
| |
| fn encode(&self, writer: &mut impl Writer) -> der::Result<()> { |
| u8::from(*self).encode(writer) |
| } |
| } |
| |
| impl From<Version> for u8 { |
| fn from(version: Version) -> Self { |
| version as u8 |
| } |
| } |
| |
| impl TryFrom<u8> for Version { |
| type Error = Error; |
| fn try_from(byte: u8) -> Result<Version, Error> { |
| 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; |
| } |