1use yasna::{ASN1Error, ASN1ErrorKind, ASN1Result, BERDecodable, BERReader, DERWriter, Tag};
11
12use crate::{crmf::request::CertReqMessages, types::DerAnyOwned, DerWrite};
13
14#[derive(Clone, Debug, Eq, PartialEq, Hash)]
50pub enum PkiBody {
51 Ir(CertReqMessages),
53 Ip(CertRepMessage),
55 Cr(CertReqMessages),
57 Cp(CertRepMessage),
59 P10cr(CertReq),
61 Popdecc(PopoDecKeyChallContent),
63 Popdecr(PopoDecKeyRespContent),
65 KUr(CertReqMessages),
67 Kup(CertRepMessage),
69 Krr(CertReqMessages),
71 Krp(KeyRecRepContent),
73 Rr(RevReqContent),
75 Rp(RevRepContent),
77 Ccr(CertReqMessages),
79 Ccp(CertRepMessage),
81 Ckuann(CaKeyUpdAnnContent),
83 Cann(CertAnnContent),
85 Rann(RevAnnContent),
87 CrlAnn(CrlAnnContent),
89 PkiConf(PkiConfirmContent),
91 Nested(NestedMessageContent),
93 GenM(GenMsgContent),
95 GenP(GenRepContent),
97 Error(ErrorMsgContent),
99 CertConf(CertConfirmContent),
101 PollReq(PollReqContent),
103 PollRep(PollRepContent),
105}
106
107impl PkiBody {
108 const TAG_IR: u64 = 0;
110 const TAG_IP: u64 = 1;
112 const TAG_CR: u64 = 2;
114 const TAG_CP: u64 = 3;
116 const TAG_P10_CR: u64 = 4;
118 const TAG_POP_DE_CC: u64 = 5;
120 const TAG_POP_DE_CR: u64 = 6;
122 const TAG_KUR: u64 = 7;
124 const TAG_KUP: u64 = 8;
126 const TAG_KRR: u64 = 9;
128 const TAG_KRP: u64 = 10;
130 const TAG_RR: u64 = 11;
132 const TAG_RP: u64 = 12;
134 const TAG_CCR: u64 = 13;
136 const TAG_CCP: u64 = 14;
138 const TAG_CKU_ANN: u64 = 15;
140 const TAG_C_ANN: u64 = 16;
142 const TAG_R_ANN: u64 = 17;
144 const TAG_CRL_ANN: u64 = 18;
146 const TAG_PKI_CONF: u64 = 19;
148 const TAG_NESTED: u64 = 20;
150 const TAG_GEN_M: u64 = 21;
152 const TAG_GEN_P: u64 = 22;
154 const TAG_ERROR: u64 = 23;
156 const TAG_CERT_CONF: u64 = 24;
158 const TAG_POLL_REQ: u64 = 25;
160 const TAG_POLL_REP: u64 = 26;
162
163 fn tag(&self) -> Tag {
164 match self {
165 PkiBody::Ir(_) => Tag::context(Self::TAG_IR),
166 PkiBody::Ip(_) => Tag::context(Self::TAG_IP),
167 PkiBody::Cr(_) => Tag::context(Self::TAG_CR),
168 PkiBody::Cp(_) => Tag::context(Self::TAG_CP),
169 PkiBody::P10cr(_) => Tag::context(Self::TAG_P10_CR),
170 PkiBody::Popdecc(_) => Tag::context(Self::TAG_POP_DE_CC),
171 PkiBody::Popdecr(_) => Tag::context(Self::TAG_POP_DE_CR),
172 PkiBody::KUr(_) => Tag::context(Self::TAG_KUR),
173 PkiBody::Kup(_) => Tag::context(Self::TAG_KUP),
174 PkiBody::Krr(_) => Tag::context(Self::TAG_KRR),
175 PkiBody::Krp(_) => Tag::context(Self::TAG_KRP),
176 PkiBody::Rr(_) => Tag::context(Self::TAG_RR),
177 PkiBody::Rp(_) => Tag::context(Self::TAG_RP),
178 PkiBody::Ccr(_) => Tag::context(Self::TAG_CCR),
179 PkiBody::Ccp(_) => Tag::context(Self::TAG_CCP),
180 PkiBody::Ckuann(_) => Tag::context(Self::TAG_CKU_ANN),
181 PkiBody::Cann(_) => Tag::context(Self::TAG_C_ANN),
182 PkiBody::Rann(_) => Tag::context(Self::TAG_R_ANN),
183 PkiBody::CrlAnn(_) => Tag::context(Self::TAG_CRL_ANN),
184 PkiBody::PkiConf(_) => Tag::context(Self::TAG_PKI_CONF),
185 PkiBody::Nested(_) => Tag::context(Self::TAG_NESTED),
186 PkiBody::GenM(_) => Tag::context(Self::TAG_GEN_M),
187 PkiBody::GenP(_) => Tag::context(Self::TAG_GEN_P),
188 PkiBody::Error(_) => Tag::context(Self::TAG_ERROR),
189 PkiBody::CertConf(_) => Tag::context(Self::TAG_CERT_CONF),
190 PkiBody::PollReq(_) => Tag::context(Self::TAG_POLL_REQ),
191 PkiBody::PollRep(_) => Tag::context(Self::TAG_POLL_REP),
192 }
193 }
194}
195
196impl DerWrite for PkiBody {
197 #[rustfmt::skip]
198 fn write(&self, writer: DERWriter) {
199 match self {
200 PkiBody::Ir(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
201 PkiBody::Ip(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
202 PkiBody::Cr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
203 PkiBody::Cp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
204 PkiBody::P10cr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
205 PkiBody::Popdecc(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
206 PkiBody::Popdecr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
207 PkiBody::KUr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
208 PkiBody::Kup(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
209 PkiBody::Krr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
210 PkiBody::Krp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
211 PkiBody::Rr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
212 PkiBody::Rp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
213 PkiBody::Ccr(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
214 PkiBody::Ccp(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
215 PkiBody::Ckuann(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
216 PkiBody::Cann(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
217 PkiBody::Rann(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
218 PkiBody::CrlAnn(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
219 PkiBody::PkiConf(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
220 PkiBody::Nested(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
221 PkiBody::GenM(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
222 PkiBody::GenP(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
223 PkiBody::Error(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
224 PkiBody::CertConf(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
225 PkiBody::PollReq(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
226 PkiBody::PollRep(body) => writer.write_tagged(self.tag(), |w| body.write(w)),
227 }
228 }
229}
230
231impl BERDecodable for PkiBody {
232 #[rustfmt::skip]
233 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
234 let tag_number = reader.lookahead_tag()?.tag_number;
235 match tag_number {
236 Self::TAG_IR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ir(CertReqMessages::decode_ber(r)?))),
237 Self::TAG_IP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ip(CertRepMessage::decode_ber(r)?))),
238 Self::TAG_CR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Cr(CertReqMessages::decode_ber(r)?))),
239 Self::TAG_CP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Cp(CertRepMessage::decode_ber(r)?))),
240 Self::TAG_P10_CR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::P10cr(CertReq::decode_ber(r)?))),
241 Self::TAG_POP_DE_CC => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Popdecc(PopoDecKeyChallContent::decode_ber(r)?))),
242 Self::TAG_POP_DE_CR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Popdecr(PopoDecKeyRespContent::decode_ber(r)?))),
243 Self::TAG_KUR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::KUr(CertReqMessages::decode_ber(r)?))),
244 Self::TAG_KUP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Kup(CertRepMessage::decode_ber(r)?))),
245 Self::TAG_KRR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Krr(CertReqMessages::decode_ber(r)?))),
246 Self::TAG_KRP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Krp(KeyRecRepContent::decode_ber(r)?))),
247 Self::TAG_RR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Rr(RevReqContent::decode_ber(r)?))),
248 Self::TAG_RP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Rp(RevRepContent::decode_ber(r)?))),
249 Self::TAG_CCR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ccr(CertReqMessages::decode_ber(r)?))),
250 Self::TAG_CCP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ccp(CertRepMessage::decode_ber(r)?))),
251 Self::TAG_CKU_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Ckuann(CaKeyUpdAnnContent::decode_ber(r)?))),
252 Self::TAG_C_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Cann(CertAnnContent::decode_ber(r)?))),
253 Self::TAG_R_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Rann(RevAnnContent::decode_ber(r)?))),
254 Self::TAG_CRL_ANN => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::CrlAnn(CrlAnnContent::decode_ber(r)?))),
255 Self::TAG_PKI_CONF => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::PkiConf(PkiConfirmContent::decode_ber(r)?))),
256 Self::TAG_NESTED => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Nested(NestedMessageContent::decode_ber(r)?))),
257 Self::TAG_GEN_M => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::GenM(GenMsgContent::decode_ber(r)?))),
258 Self::TAG_GEN_P => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::GenP(GenRepContent::decode_ber(r)?))),
259 Self::TAG_ERROR => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::Error(ErrorMsgContent::decode_ber(r)?))),
260 Self::TAG_CERT_CONF => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::CertConf(CertConfirmContent::decode_ber(r)?))),
261 Self::TAG_POLL_REQ => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::PollReq(PollReqContent::decode_ber(r)?))),
262 Self::TAG_POLL_REP => reader.read_tagged(Tag::context(tag_number), |r| Ok(PkiBody::PollRep(PollRepContent::decode_ber(r)?))),
263 _ => Err(ASN1Error::new(ASN1ErrorKind::Invalid)),
264 }
265 }
266}
267
268type CertRepMessage = DerAnyOwned;
270type CertReq = DerAnyOwned;
272type PopoDecKeyChallContent = DerAnyOwned;
274type PopoDecKeyRespContent = DerAnyOwned;
276type KeyRecRepContent = DerAnyOwned;
278type RevReqContent = DerAnyOwned;
280type RevRepContent = DerAnyOwned;
282type CaKeyUpdAnnContent = DerAnyOwned;
284type CertAnnContent = DerAnyOwned;
286type RevAnnContent = DerAnyOwned;
288type CrlAnnContent = DerAnyOwned;
290type PkiConfirmContent = DerAnyOwned;
292type NestedMessageContent = DerAnyOwned;
294type GenMsgContent = DerAnyOwned;
296type GenRepContent = DerAnyOwned;
298type ErrorMsgContent = DerAnyOwned;
300type CertConfirmContent = DerAnyOwned;
302type PollReqContent = DerAnyOwned;
304type PollRepContent = DerAnyOwned;