use alloc::vec::Vec;
use der::asn1::{BitString, Int};
use der::Sequence;
use spki::{AlgorithmIdentifierOwned, SubjectPublicKeyInfoOwned};
use x509_cert::attr::Attribute;
use x509_cert::ext::Extensions;
use x509_cert::name::Name;
use x509_cert::serial_number::SerialNumber;
use x509_cert::time::{Time, Validity};
use x509_cert::Version;
use crate::controls::Controls;
use crate::pop::ProofOfPossession;
pub type CertReqMessages = Vec<CertReqMsg>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct CertReqMsg {
pub cert_req: CertRequest,
pub popo: Option<ProofOfPossession>,
pub reg_info: Option<AttributeSeq>,
}
pub type AttributeSeq = Vec<Attribute>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct CertRequest {
pub cert_req_id: Int,
pub cert_template: CertTemplate,
pub controls: Option<Controls>,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct CertTemplate {
#[asn1(context_specific = "0", tag_mode = "IMPLICIT", optional = "true")]
pub version: Option<Version>,
#[asn1(context_specific = "1", tag_mode = "IMPLICIT", optional = "true")]
pub serial_number: Option<SerialNumber>,
#[asn1(context_specific = "2", tag_mode = "IMPLICIT", optional = "true")]
pub signature: Option<AlgorithmIdentifierOwned>,
#[asn1(context_specific = "3", tag_mode = "EXPLICIT", optional = "true")]
pub issuer: Option<Name>,
#[asn1(context_specific = "4", tag_mode = "IMPLICIT", optional = "true")]
pub validity: Option<Validity>,
#[asn1(context_specific = "5", tag_mode = "EXPLICIT", optional = "true")]
pub subject: Option<Name>,
#[asn1(context_specific = "6", tag_mode = "IMPLICIT", optional = "true")]
pub subject_public_key_info: Option<SubjectPublicKeyInfoOwned>,
#[asn1(context_specific = "7", tag_mode = "IMPLICIT", optional = "true")]
pub issuer_unique_id: Option<BitString>,
#[asn1(context_specific = "8", tag_mode = "IMPLICIT", optional = "true")]
pub subject_unique_id: Option<BitString>,
#[asn1(context_specific = "9", tag_mode = "IMPLICIT", optional = "true")]
pub extensions: Option<Extensions>,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct OptionalValidity {
#[asn1(
context_specific = "0",
tag_mode = "EXPLICIT",
constructed = "false",
optional = "true"
)]
pub not_before: Option<Time>,
#[asn1(
context_specific = "1",
tag_mode = "EXPLICIT",
constructed = "false",
optional = "true"
)]
pub not_after: Option<Time>,
}