use alloc::vec::Vec;
use const_oid::ObjectIdentifier;
use der::asn1::OctetString;
use der::{AnyRef, Decode, Enumerated, Sequence};
use spki::AlgorithmIdentifierOwned;
use x509_cert::attr::Attributes;
pub type SafeContents = Vec<SafeBag>;
#[derive(Clone, Debug, Eq, PartialEq)]
#[allow(missing_docs)]
pub struct SafeBag {
pub bag_id: ObjectIdentifier,
pub bag_value: Vec<u8>,
pub bag_attributes: Option<Attributes>,
}
impl<'a> ::der::DecodeValue<'a> for SafeBag {
fn decode_value<R: ::der::Reader<'a>>(
reader: &mut R,
header: ::der::Header,
) -> ::der::Result<Self> {
use ::der::Reader as _;
reader.read_nested(header.length, |reader| {
let bag_id = reader.decode()?;
let bag_value = match reader.tlv_bytes() {
Ok(v) => v.to_vec(),
Err(e) => return Err(e),
};
let bag_attributes = reader.decode()?;
Ok(Self {
bag_id,
bag_value,
bag_attributes,
})
})
}
}
impl ::der::EncodeValue for SafeBag {
fn value_len(&self) -> ::der::Result<::der::Length> {
let content = AnyRef::from_der(&self.bag_value)?;
use ::der::Encode as _;
[
self.bag_id.encoded_len()?,
::der::asn1::ContextSpecificRef {
tag_number: ::der::TagNumber::N0,
tag_mode: ::der::TagMode::Explicit,
value: &content,
}
.encoded_len()?,
self.bag_attributes.encoded_len()?,
]
.into_iter()
.try_fold(::der::Length::ZERO, |acc, len| acc + len)
}
fn encode_value(&self, writer: &mut impl ::der::Writer) -> ::der::Result<()> {
use ::der::Encode as _;
self.bag_id.encode(writer)?;
let content = AnyRef::from_der(&self.bag_value)?;
::der::asn1::ContextSpecificRef {
tag_number: ::der::TagNumber::N0,
tag_mode: ::der::TagMode::Explicit,
value: &content,
}
.encode(writer)?;
self.bag_attributes.encode(writer)?;
Ok(())
}
}
impl<'a> ::der::Sequence<'a> for SafeBag {}
#[derive(Clone, Copy, Debug, Enumerated, Eq, PartialEq, PartialOrd, Ord)]
#[asn1(type = "INTEGER")]
#[repr(u8)]
pub enum Pkcs8Version {
V0 = 0,
}
#[derive(Clone, Debug, PartialEq, Eq, Sequence)]
pub struct PrivateKeyInfo {
pub version: Pkcs8Version,
pub algorithm: AlgorithmIdentifierOwned,
pub private_key: OctetString,
#[asn1(context_specific = "0", tag_mode = "IMPLICIT", optional = "true")]
pub attributes: Option<Attributes>,
}