use yasna::{ASN1Error, ASN1ErrorKind, ASN1Result, BERDecodable, BERReader, DERWriter, Tag};
use crate::{crmf::request::CertReqMessages, types::DerAnyOwned, DerWrite};
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum PkiBody {
Ir(CertReqMessages),
Ip(CertRepMessage),
Cr(CertReqMessages),
Cp(CertRepMessage),
P10cr(CertReq),
Popdecc(PopoDecKeyChallContent),
Popdecr(PopoDecKeyRespContent),
KUr(CertReqMessages),
Kup(CertRepMessage),
Krr(CertReqMessages),
Krp(KeyRecRepContent),
Rr(RevReqContent),
Rp(RevRepContent),
Ccr(CertReqMessages),
Ccp(CertRepMessage),
Ckuann(CaKeyUpdAnnContent),
Cann(CertAnnContent),
Rann(RevAnnContent),
CrlAnn(CrlAnnContent),
PkiConf(PkiConfirmContent),
Nested(NestedMessageContent),
GenM(GenMsgContent),
GenP(GenRepContent),
Error(ErrorMsgContent),
CertConf(CertConfirmContent),
PollReq(PollReqContent),
PollRep(PollRepContent),
}
impl PkiBody {
const TAG_IR: u64 = 0;
const TAG_IP: u64 = 1;
const TAG_CR: u64 = 2;
const TAG_CP: u64 = 3;
const TAG_P10_CR: u64 = 4;
const TAG_POP_DE_CC: u64 = 5;
const TAG_POP_DE_CR: u64 = 6;
const TAG_KUR: u64 = 7;
const TAG_KUP: u64 = 8;
const TAG_KRR: u64 = 9;
const TAG_KRP: u64 = 10;
const TAG_RR: u64 = 11;
const TAG_RP: u64 = 12;
const TAG_CCR: u64 = 13;
const TAG_CCP: u64 = 14;
const TAG_CKU_ANN: u64 = 15;
const TAG_C_ANN: u64 = 16;
const TAG_R_ANN: u64 = 17;
const TAG_CRL_ANN: u64 = 18;
const TAG_PKI_CONF: u64 = 19;
const TAG_NESTED: u64 = 20;
const TAG_GEN_M: u64 = 21;
const TAG_GEN_P: u64 = 22;
const TAG_ERROR: u64 = 23;
const TAG_CERT_CONF: u64 = 24;
const TAG_POLL_REQ: u64 = 25;
const TAG_POLL_REP: u64 = 26;
fn tag(&self) -> Tag {
match self {
PkiBody::Ir(_) => Tag::context(Self::TAG_IR),
PkiBody::Ip(_) => Tag::context(Self::TAG_IP),
PkiBody::Cr(_) => Tag::context(Self::TAG_CR),
PkiBody::Cp(_) => Tag::context(Self::TAG_CP),
PkiBody::P10cr(_) => Tag::context(Self::TAG_P10_CR),
PkiBody::Popdecc(_) => Tag::context(Self::TAG_POP_DE_CC),
PkiBody::Popdecr(_) => Tag::context(Self::TAG_POP_DE_CR),
PkiBody::KUr(_) => Tag::context(Self::TAG_KUR),
PkiBody::Kup(_) => Tag::context(Self::TAG_KUP),
PkiBody::Krr(_) => Tag::context(Self::TAG_KRR),
PkiBody::Krp(_) => Tag::context(Self::TAG_KRP),
PkiBody::Rr(_) => Tag::context(Self::TAG_RR),
PkiBody::Rp(_) => Tag::context(Self::TAG_RP),
PkiBody::Ccr(_) => Tag::context(Self::TAG_CCR),
PkiBody::Ccp(_) => Tag::context(Self::TAG_CCP),
PkiBody::Ckuann(_) => Tag::context(Self::TAG_CKU_ANN),
PkiBody::Cann(_) => Tag::context(Self::TAG_C_ANN),
PkiBody::Rann(_) => Tag::context(Self::TAG_R_ANN),
PkiBody::CrlAnn(_) => Tag::context(Self::TAG_CRL_ANN),
PkiBody::PkiConf(_) => Tag::context(Self::TAG_PKI_CONF),
PkiBody::Nested(_) => Tag::context(Self::TAG_NESTED),
PkiBody::GenM(_) => Tag::context(Self::TAG_GEN_M),
PkiBody::GenP(_) => Tag::context(Self::TAG_GEN_P),
PkiBody::Error(_) => Tag::context(Self::TAG_ERROR),
PkiBody::CertConf(_) => Tag::context(Self::TAG_CERT_CONF),
PkiBody::PollReq(_) => Tag::context(Self::TAG_POLL_REQ),
PkiBody::PollRep(_) => Tag::context(Self::TAG_POLL_REP),
}
}
}
impl DerWrite for PkiBody {
#[rustfmt::skip]
fn write(&self, writer: DERWriter) {
match self {
PkiBody::Ir(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Ip(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Cr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Cp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::P10cr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Popdecc(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Popdecr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::KUr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Kup(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Krr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Krp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Rr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Rp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Ccr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Ccp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Ckuann(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Cann(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Rann(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::CrlAnn(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::PkiConf(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Nested(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::GenM(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::GenP(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::Error(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::CertConf(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::PollReq(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
PkiBody::PollRep(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
}
}
}
impl BERDecodable for PkiBody {
#[rustfmt::skip]
fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
let tag_number = reader.lookahead_tag()?.tag_number;
match tag_number {
Self::TAG_IR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ir(CertReqMessages::decode_ber(r)?))),
Self::TAG_IP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ip(CertRepMessage::decode_ber(r)?))),
Self::TAG_CR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Cr(CertReqMessages::decode_ber(r)?))),
Self::TAG_CP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Cp(CertRepMessage::decode_ber(r)?))),
Self::TAG_P10_CR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::P10cr(CertReq::decode_ber(r)?))),
Self::TAG_POP_DE_CC => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Popdecc(PopoDecKeyChallContent::decode_ber(r)?))),
Self::TAG_POP_DE_CR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Popdecr(PopoDecKeyRespContent::decode_ber(r)?))),
Self::TAG_KUR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::KUr(CertReqMessages::decode_ber(r)?))),
Self::TAG_KUP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Kup(CertRepMessage::decode_ber(r)?))),
Self::TAG_KRR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Krr(CertReqMessages::decode_ber(r)?))),
Self::TAG_KRP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Krp(KeyRecRepContent::decode_ber(r)?))),
Self::TAG_RR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Rr(RevReqContent::decode_ber(r)?))),
Self::TAG_RP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Rp(RevRepContent::decode_ber(r)?))),
Self::TAG_CCR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ccr(CertReqMessages::decode_ber(r)?))),
Self::TAG_CCP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ccp(CertRepMessage::decode_ber(r)?))),
Self::TAG_CKU_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ckuann(CaKeyUpdAnnContent::decode_ber(r)?))),
Self::TAG_C_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Cann(CertAnnContent::decode_ber(r)?))),
Self::TAG_R_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Rann(RevAnnContent::decode_ber(r)?))),
Self::TAG_CRL_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::CrlAnn(CrlAnnContent::decode_ber(r)?))),
Self::TAG_PKI_CONF => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::PkiConf(PkiConfirmContent::decode_ber(r)?))),
Self::TAG_NESTED => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Nested(NestedMessageContent::decode_ber(r)?))),
Self::TAG_GEN_M => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::GenM(GenMsgContent::decode_ber(r)?))),
Self::TAG_GEN_P => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::GenP(GenRepContent::decode_ber(r)?))),
Self::TAG_ERROR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Error(ErrorMsgContent::decode_ber(r)?))),
Self::TAG_CERT_CONF => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::CertConf(CertConfirmContent::decode_ber(r)?))),
Self::TAG_POLL_REQ => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::PollReq(PollReqContent::decode_ber(r)?))),
Self::TAG_POLL_REP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::PollRep(PollRepContent::decode_ber(r)?))),
_ => Err(ASN1Error::new(ASN1ErrorKind::Invalid)),
}
}
}
type CertRepMessage = DerAnyOwned;
type CertReq = DerAnyOwned;
type PopoDecKeyChallContent = DerAnyOwned;
type PopoDecKeyRespContent = DerAnyOwned;
type KeyRecRepContent = DerAnyOwned;
type RevReqContent = DerAnyOwned;
type RevRepContent = DerAnyOwned;
type CaKeyUpdAnnContent = DerAnyOwned;
type CertAnnContent = DerAnyOwned;
type RevAnnContent = DerAnyOwned;
type CrlAnnContent = DerAnyOwned;
type PkiConfirmContent = DerAnyOwned;
type NestedMessageContent = DerAnyOwned;
type GenMsgContent = DerAnyOwned;
type GenRepContent = DerAnyOwned;
type ErrorMsgContent = DerAnyOwned;
type CertConfirmContent = DerAnyOwned;
type PollReqContent = DerAnyOwned;
type PollRepContent = DerAnyOwned;