use crate::{
algorithm_identifier_types::{DigestAlgorithmIdentifier, SignatureAlgorithmIdentifier},
cms_version::CmsVersion,
};
use der::{
asn1::{OctetStringRef, SetOfVec},
Choice, Sequence, ValueOrd,
};
use x509_cert::{
attr::Attribute, ext::pkix::SubjectKeyIdentifier, name::Name, serial_number::SerialNumber,
};
type SignedAttributes<'a> = SetOfVec<Attribute>;
type UnsignedAttributes<'a> = SetOfVec<Attribute>;
#[derive(Clone, Debug, PartialEq, Eq, Choice, ValueOrd)]
pub enum SignerIdentifier {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[asn1(context_specific = "0")]
SubjectKeyIdentifier(SubjectKeyIdentifier),
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence, ValueOrd)]
#[allow(missing_docs)]
pub struct IssuerAndSerialNumber {
pub name: Name,
pub serial_number: SerialNumber,
}
pub type SignerInfos<'a> = SetOfVec<SignerInfo<'a>>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence, ValueOrd)]
pub struct SignerInfo<'a> {
pub version: CmsVersion,
pub sid: SignerIdentifier,
pub digest_algorithm: DigestAlgorithmIdentifier<'a>,
#[asn1(context_specific = "0", tag_mode = "IMPLICIT", optional = "true")]
pub signed_attributes: Option<SignedAttributes<'a>>,
pub signature_algorithm: SignatureAlgorithmIdentifier<'a>,
pub signature: OctetStringRef<'a>,
#[asn1(context_specific = "1", tag_mode = "IMPLICIT", optional = "true")]
pub unsigned_attributes: Option<UnsignedAttributes<'a>>,
}