use crate::cert::IssuerAndSerialNumber;
use crate::content_info::CmsVersion;
use crate::revocation::RevocationInfoChoices;
use crate::signed_data::CertificateSet;
use core::cmp::Ordering;
use der::asn1::{BitString, GeneralizedTime, ObjectIdentifier, OctetString, SetOfVec};
use der::{Any, Choice, Sequence, ValueOrd};
use spki::AlgorithmIdentifierOwned;
use x509_cert::attr::{Attribute, Attributes};
use x509_cert::ext::pkix::SubjectKeyIdentifier;
use x509_cert::impl_newtype;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct EnvelopedData {
pub version: CmsVersion,
#[asn1(
context_specific = "0",
tag_mode = "IMPLICIT",
constructed = "true",
optional = "true"
)]
pub originator_info: Option<OriginatorInfo>,
pub recip_infos: RecipientInfos,
pub encrypted_content: EncryptedContentInfo,
#[asn1(
context_specific = "1",
tag_mode = "IMPLICIT",
constructed = "true",
optional = "true"
)]
pub unprotected_attrs: Option<Attributes>,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct OriginatorInfo {
#[asn1(
context_specific = "0",
tag_mode = "IMPLICIT",
constructed = "true",
optional = "true"
)]
pub certs: Option<CertificateSet>,
#[asn1(
context_specific = "1",
tag_mode = "IMPLICIT",
constructed = "true",
optional = "true"
)]
pub crls: Option<RevocationInfoChoices>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct RecipientInfos(pub SetOfVec<RecipientInfo>);
impl_newtype!(RecipientInfos, SetOfVec<RecipientInfo>);
#[cfg(feature = "std")]
impl TryFrom<std::vec::Vec<RecipientInfo>> for RecipientInfos {
type Error = der::Error;
fn try_from(vec: std::vec::Vec<RecipientInfo>) -> der::Result<RecipientInfos> {
Ok(RecipientInfos(SetOfVec::try_from(vec)?))
}
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct EncryptedContentInfo {
pub content_type: ObjectIdentifier,
pub content_enc_alg: AlgorithmIdentifierOwned,
#[asn1(context_specific = "0", tag_mode = "IMPLICIT", optional = "true")]
pub encrypted_content: Option<OctetString>,
}
#[derive(Clone, Debug, Eq, PartialEq, Choice)]
#[allow(missing_docs)]
pub enum RecipientInfo {
Ktri(KeyTransRecipientInfo),
#[asn1(context_specific = "1", tag_mode = "IMPLICIT", constructed = "true")]
Kari(KeyAgreeRecipientInfo),
#[asn1(context_specific = "2", tag_mode = "IMPLICIT", constructed = "true")]
Kekri(KekRecipientInfo),
#[asn1(context_specific = "3", tag_mode = "IMPLICIT", constructed = "true")]
Pwri(PasswordRecipientInfo),
#[asn1(context_specific = "4", tag_mode = "IMPLICIT", constructed = "true")]
Ori(OtherRecipientInfo),
}
impl ValueOrd for RecipientInfo {
fn value_cmp(&self, other: &Self) -> der::Result<Ordering> {
use der::DerOrd;
use der::Encode;
self.to_der()?.der_cmp(&other.to_der()?)
}
}
pub type EncryptedKey = OctetString;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct KeyTransRecipientInfo {
pub version: CmsVersion,
pub rid: RecipientIdentifier,
pub key_enc_alg: AlgorithmIdentifierOwned,
pub enc_key: EncryptedKey,
}
#[derive(Clone, Debug, Eq, PartialEq, Choice)]
#[allow(missing_docs)]
pub enum RecipientIdentifier {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[asn1(context_specific = "0", tag_mode = "IMPLICIT")]
SubjectKeyIdentifier(SubjectKeyIdentifier),
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct KeyAgreeRecipientInfo {
pub version: CmsVersion,
#[asn1(context_specific = "0", tag_mode = "EXPLICIT")]
pub originator: OriginatorIdentifierOrKey,
#[asn1(context_specific = "1", tag_mode = "EXPLICIT", optional = "true")]
pub ukm: Option<UserKeyingMaterial>,
pub key_enc_alg: AlgorithmIdentifierOwned,
pub recipient_enc_keys: RecipientEncryptedKeys,
}
#[derive(Clone, Debug, Eq, PartialEq, Choice)]
#[allow(missing_docs)]
pub enum OriginatorIdentifierOrKey {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[asn1(context_specific = "0", tag_mode = "IMPLICIT")]
SubjectKeyIdentifier(SubjectKeyIdentifier),
#[asn1(context_specific = "1", tag_mode = "IMPLICIT", constructed = "true")]
OriginatorKey(OriginatorPublicKey),
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct OriginatorPublicKey {
pub algorithm: AlgorithmIdentifierOwned,
pub public_key: BitString,
}
pub type RecipientEncryptedKeys = alloc::vec::Vec<RecipientEncryptedKey>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct RecipientEncryptedKey {
pub rid: KeyAgreeRecipientIdentifier,
pub enc_key: EncryptedKey,
}
#[derive(Clone, Debug, Eq, PartialEq, Choice)]
#[allow(missing_docs)]
pub enum KeyAgreeRecipientIdentifier {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[asn1(context_specific = "0", tag_mode = "IMPLICIT")]
RKeyId(RecipientKeyIdentifier),
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct RecipientKeyIdentifier {
pub subject_key_identifier: SubjectKeyIdentifier,
pub date: Option<GeneralizedTime>,
pub other: Option<Attribute>,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct KekRecipientInfo {
pub version: CmsVersion,
pub kek_id: KekIdentifier,
pub key_enc_alg: AlgorithmIdentifierOwned,
pub encrypted_key: EncryptedKey,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct KekIdentifier {
pub kek_identifier: OctetString,
pub date: Option<GeneralizedTime>,
pub other: Option<Attribute>,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct PasswordRecipientInfo {
pub version: CmsVersion,
#[asn1(
context_specific = "0",
tag_mode = "IMPLICIT",
constructed = "true",
optional = "true"
)]
pub key_derivation_alg: Option<AlgorithmIdentifierOwned>,
pub key_enc_alg: AlgorithmIdentifierOwned,
pub enc_key: EncryptedKey,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct OtherRecipientInfo {
pub ori_type: ObjectIdentifier,
pub ori_value: Any,
}
pub type UserKeyingMaterial = OctetString;