use bit_vec::BitVec;
use num_bigint::{BigInt, BigUint};
use yasna::{ASN1Result, BERDecodable, BERReader, DERWriter, Tag};
use crate::{
types::{Attribute, Extensions, Name, DerAnyOwned, AlgorithmIdentifierOwned},
x509::{SubjectPublicKeyInfo, Version},
DerWrite,
};
use super::{controls::Controls, pop::ProofOfPossession};
derive_sequence_of!{
CertReqMsg => CertReqMessages
}
derive_sequence! {
CertReqMsg {
cert_req: [_] UNTAGGED REQUIRED: CertRequest,
popo: [_] UNTAGGED OPTIONAL: Option<ProofOfPossession>,
reg_info: [_] UNTAGGED OPTIONAL: Option<AttributeSeq>,
}
}
derive_sequence! {
CertRequest {
cert_req_id: [_] UNTAGGED REQUIRED: BigInt,
cert_template: [_] UNTAGGED REQUIRED: CertTemplate,
controls: [_] UNTAGGED OPTIONAL: Option<Controls>,
}
}
derive_sequence_of!{
Attribute<'static> => AttributeSeq
}
derive_sequence! {
CertTemplate {
version: [0] IMPLICIT OPTIONAL: Option<Version>,
serial_number: [1] IMPLICIT OPTIONAL: Option<SerialNumber>,
signing_alg: [2] IMPLICIT OPTIONAL: Option<AlgorithmIdentifierOwned>,
issuer: [3] EXPLICIT OPTIONAL: Option<Name>,
validity: [4] IMPLICIT OPTIONAL: Option<Validity>,
subject: [5] EXPLICIT OPTIONAL: Option<Name>,
subject_public_key_info: [6] IMPLICIT OPTIONAL: Option<SubjectPublicKeyInfo>,
issuer_unique_id: [7] IMPLICIT OPTIONAL: Option<BitVec>,
subject_unique_id: [8] IMPLICIT OPTIONAL: Option<BitVec>,
extensions: [9] IMPLICIT OPTIONAL: Option<Extensions>,
}
}
pub type SerialNumber = BigUint;
pub type Validity = DerAnyOwned;