1use crate::algorithm::{self, AlgorithmIdentifier};
7use crate::error::{Error, ErrorCode, Located, Result};
8use crate::extension::{self, Extensions};
9use crate::name::{self, Name};
10use crate::{Certificate, Time, oid, time};
11use structured_asn1::memory::{Memory, OwnedVec};
12use structured_asn1::{
13 BitString, Element, Encoding, Integer, Oid, Parser, Reader, Span, Tag, universal,
14};
15
16const FIELD: &str = "ocspResponse";
17const BASIC: &str = "ocspResponse.basic";
18const DATA: &str = "ocspResponse.responseData";
19const SINGLE: &str = "ocspResponse.singleResponse";
20
21mod digest;
22pub use digest::{CertMatch, Digest, DigestAlgorithm, ResolvedDigest};
23
24mod nonce;
25pub use nonce::{NonceBinding, NonceSizeError, RequestNonce};
26
27mod authentication;
28pub use authentication::{
29 SignatureAuthentication, SignatureError, SignatureFailure, SignedResponse,
30};
31
32mod delegation;
33pub(crate) use delegation::read_no_check;
34
35mod lookup;
36pub use delegation::{
37 DelegateFacts, Delegation, DelegationFailure, ResponderRevocation, check_delegate,
38};
39pub use lookup::Lookup;
40
41mod freshness;
42pub use freshness::UpdateWindow;
43
44mod authority;
45pub use authority::{AuthorityBinding, AuthorityFailure, AuthoritySource, ScopedResponse};
46
47mod extensions;
48pub use extensions::ExtensionProcessing;
49
50mod evidence;
51pub use evidence::{Evaluation, Evidence, RecipientBinding, Request, TargetEvidence};
52
53#[derive(Debug, Clone, Copy, PartialEq, Eq)]
55pub enum Failure {
56 MalformedRequest,
58 InternalError,
60 TryLater,
62 SignatureRequired,
64 Unauthorized,
66}
67
68#[derive(Debug)]
70pub enum Response<'a> {
71 Successful(ResponseBytes<'a>),
73 Failure {
75 failure: Failure,
77 span: Span,
79 },
80}
81
82#[derive(Debug)]
86pub struct ResponseBytes<'a> {
87 kind: Oid<'a>,
88 payload: &'a [u8],
89 span: Span,
90 reader: Reader<'a>,
91}
92
93impl<'a> ResponseBytes<'a> {
94 #[must_use]
96 pub fn kind(&self) -> Oid<'a> {
97 self.kind
98 }
99 #[must_use]
101 pub fn payload(&self) -> &'a [u8] {
102 self.payload
103 }
104 #[must_use]
106 pub fn span(&self) -> Span {
107 self.span
108 }
109 pub fn into_basic(self, execution: &Memory) -> Result<Option<BasicResponse<'a>>> {
113 let reader = self.reader.with_execution(execution);
114 reader.charge(19).field(FIELD)?;
115 if self.kind != oid::OCSP_BASIC {
116 return Ok(None);
117 }
118 let mut nested = reader
119 .parser()
120 .read_nested_in(
121 self.payload,
122 self.span.start,
123 Encoding::Der,
124 reader.depth(),
125 reader.memory(),
126 )
127 .field(BASIC)?;
128 let root = required(&mut nested, BASIC)?;
129 let basic = read_basic(&nested, &root)?;
130 end(&nested, BASIC)?;
131 Ok(Some(basic))
132 }
133}
134
135#[derive(Debug)]
137pub enum ResponderId<'a> {
138 Name(Name<'a>),
140 KeyHash(&'a [u8]),
143}
144
145#[derive(Debug, Clone, Copy)]
147pub struct CertId<'a> {
148 algorithm: AlgorithmIdentifier<'a>,
149 issuer_name_hash: &'a [u8],
150 issuer_key_hash: &'a [u8],
151 serial: Integer<'a>,
152 span: Span,
153}
154
155impl<'a> CertId<'a> {
156 #[must_use]
158 pub fn algorithm(self) -> AlgorithmIdentifier<'a> {
159 self.algorithm
160 }
161 #[must_use]
163 pub fn issuer_name_hash(self) -> &'a [u8] {
164 self.issuer_name_hash
165 }
166 #[must_use]
168 pub fn issuer_key_hash(self) -> &'a [u8] {
169 self.issuer_key_hash
170 }
171 #[must_use]
173 pub fn serial(self) -> Integer<'a> {
174 self.serial
175 }
176 #[must_use]
178 pub fn span(self) -> Span {
179 self.span
180 }
181}
182
183#[derive(Debug, Clone, Copy, PartialEq, Eq)]
185pub enum Status {
186 Good,
188 Revoked {
190 time: Time,
192 reason: Option<crate::crl::Reason>,
194 },
195 Unknown,
197}
198
199#[derive(Debug)]
200enum RecordedStatus {
201 Good,
202 Unknown,
203 Revoked {
204 time: Time,
205 reason: Option<crate::crl::Reason>,
206 offset: u64,
207 },
208}
209
210#[derive(Debug)]
212pub struct SingleResponse<'a> {
213 id: CertId<'a>,
214 status: RecordedStatus,
215 this_update: Time,
216 next_update: Option<Time>,
217 extensions: Extensions<'a>,
218 span: Span,
219}
220
221impl<'a> SingleResponse<'a> {
222 #[must_use]
224 pub fn id(&self) -> CertId<'a> {
225 self.id
226 }
227 #[must_use]
229 pub fn status(&self) -> Status {
230 match self.status {
231 RecordedStatus::Good => Status::Good,
232 RecordedStatus::Unknown => Status::Unknown,
233 RecordedStatus::Revoked { time, reason, .. } => Status::Revoked { time, reason },
234 }
235 }
236
237 pub fn revocation_relation(
240 &self,
241 now: crate::temporal::Reading,
242 utc: &crate::temporal::LeapTable<'_>,
243 execution: &Memory,
244 ) -> Result<Option<crate::time::Relation>> {
245 match self.status {
246 RecordedStatus::Good | RecordedStatus::Unknown => Ok(None),
247 RecordedStatus::Revoked { time, offset, .. } => crate::time::relation_in(
248 time.instant(),
249 now,
250 utc,
251 execution,
252 ("ocspResponse.singleResponse.revocationTime", offset),
253 )
254 .map(Some),
255 }
256 }
257 #[must_use]
259 pub fn this_update(&self) -> Time {
260 self.this_update
261 }
262 #[must_use]
265 pub fn next_update(&self) -> Option<Time> {
266 self.next_update
267 }
268 #[must_use]
270 pub fn extensions(&self) -> &Extensions<'a> {
271 &self.extensions
272 }
273 #[must_use]
275 pub fn span(&self) -> Span {
276 self.span
277 }
278}
279
280#[derive(Debug)]
282pub struct BasicResponse<'a> {
283 responder: ResponderId<'a>,
284 produced_at: Time,
285 responses: OwnedVec<SingleResponse<'a>>,
286 extensions: Extensions<'a>,
287 algorithm: AlgorithmIdentifier<'a>,
288 signature: BitString<'a>,
289 certificates: OwnedVec<Certificate<'a>>,
290 signed: &'a [u8],
291 bytes: &'a [u8],
292 span: Span,
293}
294
295impl<'a> BasicResponse<'a> {
296 #[must_use]
298 pub fn responder(&self) -> &ResponderId<'a> {
299 &self.responder
300 }
301 #[must_use]
303 pub fn produced_at(&self) -> Time {
304 self.produced_at
305 }
306 #[must_use]
308 pub fn responses(&self) -> &[SingleResponse<'a>] {
309 &self.responses
310 }
311 #[must_use]
313 pub fn extensions(&self) -> &Extensions<'a> {
314 &self.extensions
315 }
316 #[must_use]
318 pub fn signature_algorithm(&self) -> AlgorithmIdentifier<'a> {
319 self.algorithm
320 }
321 #[must_use]
323 pub fn signature(&self) -> BitString<'a> {
324 self.signature
325 }
326 #[must_use]
328 pub fn certificates(&self) -> &[Certificate<'a>] {
329 &self.certificates
330 }
331 #[must_use]
333 pub fn signed_bytes(&self) -> &'a [u8] {
334 self.signed
335 }
336 #[must_use]
338 pub fn as_bytes(&self) -> &'a [u8] {
339 self.bytes
340 }
341 #[must_use]
343 pub fn span(&self) -> Span {
344 self.span
345 }
346}
347
348impl<'a> Response<'a> {
349 pub fn read(parser: &'a Parser, bytes: &'a [u8], base: u64) -> Result<Self> {
352 let mut reader = parser.read(bytes, base).field(FIELD)?;
353 let element = required(&mut reader, FIELD)?;
354 let result = Self::read_element(&reader, &element)?;
355 end(&reader, FIELD)?;
356 Ok(result)
357 }
358
359 pub fn read_element(parent: &Reader<'a>, element: &Element<'a>) -> Result<Self> {
364 if element.tag() != Tag::constructed(universal::SEQUENCE) {
365 return Err(Error::new(
366 ErrorCode::Encoding(structured_asn1::ErrorCode::UnexpectedTag),
367 FIELD,
368 element.span().start,
369 ));
370 }
371 let mut distinguished = parent.reread(element, Encoding::Der).field(FIELD)?;
372 let root = distinguished
373 .expect(Tag::constructed(universal::SEQUENCE))
374 .field(FIELD)?;
375 let mut reader = distinguished.enter(&root).field(FIELD)?;
376 let code = reader.expect(Tag::primitive(10)).field(FIELD)?;
377 reader.charge(9).field(FIELD)?;
378 let code = reader.integer(&code).field(FIELD)?.as_u64();
379 let failure = match code {
380 Some(0) => None,
381 Some(1) => Some(Failure::MalformedRequest),
382 Some(2) => Some(Failure::InternalError),
383 Some(3) => Some(Failure::TryLater),
384 Some(5) => Some(Failure::SignatureRequired),
385 Some(6) => Some(Failure::Unauthorized),
386 _ => {
387 return Err(Error::new(
388 ErrorCode::MalformedValue,
389 FIELD,
390 root.span().start,
391 ));
392 }
393 };
394 if let Some(failure) = failure {
395 end(&reader, FIELD)?;
397 return Ok(Self::Failure {
398 failure,
399 span: root.span(),
400 });
401 }
402 let wrapper = reader.expect(Tag::context(true, 0)).field(FIELD)?;
403 end(&reader, FIELD)?;
404 let mut explicit = reader.enter(&wrapper).field(FIELD)?;
405 let response_bytes = explicit
406 .expect(Tag::constructed(universal::SEQUENCE))
407 .field(FIELD)?;
408 end(&explicit, FIELD)?;
409 let mut bytes_reader = explicit.enter(&response_bytes).field(FIELD)?;
410 let kind = bytes_reader.read_oid().field(FIELD)?;
411 let payload = bytes_reader
412 .expect(Tag::primitive(universal::OCTET_STRING))
413 .field(FIELD)?;
414 end(&bytes_reader, FIELD)?;
415 Ok(Self::Successful(ResponseBytes {
416 kind,
417 payload: payload.contents(),
418 span: payload.contents_span(),
419 reader: bytes_reader,
420 }))
421 }
422}
423
424fn read_basic<'a>(parent: &Reader<'a>, element: &Element<'a>) -> Result<BasicResponse<'a>> {
425 let mut reader = sequence(parent, element, BASIC)?;
426 let signed = required(&mut reader, DATA)?;
427 let mut data = sequence(&reader, &signed, DATA)?;
428 let responder = required(&mut data, DATA)?;
429 if responder.tag() == Tag::context(true, 0) {
430 let mut version = data.enter(&responder).field(DATA)?;
431 let value = version.read_integer().field(DATA)?;
432 version.charge(9).field(DATA)?;
433 end(&version, DATA)?;
434 return Err(Error::new(
435 if value.as_u64() == Some(0) {
436 ErrorCode::MalformedValue
437 } else {
438 ErrorCode::UnsupportedVersion
439 },
440 DATA,
441 responder.span().start,
442 ));
443 }
444 let responder = read_responder(&data, &responder)?;
445 let produced = required(&mut data, DATA)?;
446 let produced_at = generalized(&data, &produced, DATA)?;
447 let assertions = data
448 .expect(Tag::constructed(universal::SEQUENCE))
449 .field(DATA)?;
450 let mut assertions_reader = data.enter(&assertions).field(SINGLE)?;
451 let mut responses = parent.memory().vector();
452 while let Some(assertion) = assertions_reader.next_element().field(SINGLE)? {
453 responses
454 .try_push(read_single(&assertions_reader, &assertion)?)
455 .map_err(|reason| Error::resource(reason, SINGLE, assertion.span().start))?;
456 }
457 if responses.is_empty() {
458 return Err(Error::new(
459 ErrorCode::EmptySequence,
460 SINGLE,
461 assertions.span().start,
462 ));
463 }
464 let extensions = optional_extensions(&mut data, 1, DATA)?;
465 end(&data, DATA)?;
466 let algorithm = required(&mut reader, BASIC)?;
467 let algorithm = algorithm::read(&reader, &algorithm, BASIC)?;
468 let signature = reader.read_bit_string().field(BASIC)?;
469 let mut certificates = parent.memory().vector();
470 if let Some(wrapper) = reader.next_element().field(BASIC)? {
471 if wrapper.tag() != Tag::context(true, 0) {
472 return Err(Error::new(
473 ErrorCode::UnexpectedField,
474 BASIC,
475 wrapper.span().start,
476 ));
477 }
478 let mut explicit = reader.enter(&wrapper).field(BASIC)?;
479 let sequence = explicit
480 .expect(Tag::constructed(universal::SEQUENCE))
481 .field(BASIC)?;
482 end(&explicit, BASIC)?;
483 let mut inside = explicit.enter(&sequence).field(BASIC)?;
484 while let Some(certificate) = inside.next_element().field(BASIC)? {
485 certificates
486 .try_push(Certificate::read_element(&inside, &certificate)?)
487 .map_err(|reason| Error::resource(reason, BASIC, certificate.span().start))?;
488 }
489 }
490 end(&reader, BASIC)?;
491 Ok(BasicResponse {
492 responder,
493 produced_at,
494 responses,
495 extensions,
496 algorithm,
497 signature,
498 certificates,
499 signed: signed.as_bytes(),
500 bytes: element.as_bytes(),
501 span: element.span(),
502 })
503}
504
505fn read_responder<'a>(parent: &Reader<'a>, element: &Element<'a>) -> Result<ResponderId<'a>> {
506 if element.tag() != Tag::context(true, 1) && element.tag() != Tag::context(true, 2) {
507 return Err(Error::new(
508 ErrorCode::UnexpectedField,
509 DATA,
510 element.span().start,
511 ));
512 }
513 let mut wrapper = parent.enter(element).field(DATA)?;
514 let value = required(&mut wrapper, DATA)?;
515 end(&wrapper, DATA)?;
516 match element.tag() {
517 tag if tag == Tag::context(true, 1) => {
518 Ok(ResponderId::Name(name::read(&wrapper, &value, DATA)?))
519 }
520 tag if tag == Tag::context(true, 2) => {
521 if value.tag() != Tag::primitive(universal::OCTET_STRING)
522 || value.contents().len() != 20
523 {
524 return Err(Error::new(
525 ErrorCode::MalformedValue,
526 DATA,
527 value.span().start,
528 ));
529 }
530 Ok(ResponderId::KeyHash(value.contents()))
531 }
532 _ => Err(Error::new(
533 ErrorCode::UnexpectedField,
534 DATA,
535 element.span().start,
536 )),
537 }
538}
539
540fn read_single<'a>(parent: &Reader<'a>, element: &Element<'a>) -> Result<SingleResponse<'a>> {
541 let mut reader = sequence(parent, element, SINGLE)?;
542 let id = required(&mut reader, SINGLE)?;
543 let id = read_id(&reader, &id)?;
544 let status = required(&mut reader, SINGLE)?;
545 let status = match status.tag() {
546 tag if tag == Tag::context(false, 0) => {
547 reader.null(&status).field(SINGLE)?;
548 RecordedStatus::Good
549 }
550 tag if tag == Tag::context(false, 2) => {
551 reader.null(&status).field(SINGLE)?;
552 RecordedStatus::Unknown
553 }
554 tag if tag == Tag::context(true, 1) => {
555 let mut revoked = reader.enter(&status).field(SINGLE)?;
556 let date = required(&mut revoked, SINGLE)?;
557 let time = generalized(&revoked, &date, SINGLE)?;
558 let reason = if let Some(wrapper) = revoked.next_element().field(SINGLE)? {
559 if wrapper.tag() != Tag::context(true, 0) {
560 return Err(Error::new(
561 ErrorCode::UnexpectedField,
562 SINGLE,
563 wrapper.span().start,
564 ));
565 }
566 let mut explicit = revoked.enter(&wrapper).field(SINGLE)?;
567 let reason = explicit.expect(Tag::primitive(10)).field(SINGLE)?;
568 end(&explicit, SINGLE)?;
569 Some(crate::crl::reason_element(&explicit, &reason, SINGLE)?)
570 } else {
571 None
572 };
573 end(&revoked, SINGLE)?;
574 RecordedStatus::Revoked {
575 time,
576 reason,
577 offset: date.span().start,
578 }
579 }
580 _ => {
581 return Err(Error::new(
582 ErrorCode::UnexpectedField,
583 SINGLE,
584 status.span().start,
585 ));
586 }
587 };
588 let this = required(&mut reader, SINGLE)?;
589 let this_update = generalized(&reader, &this, SINGLE)?;
590 let mut next = reader.next_element().field(SINGLE)?;
591 let next_update =
592 if let Some(wrapper) = next.filter(|element| element.tag() == Tag::context(true, 0)) {
593 let mut explicit = reader.enter(&wrapper).field(SINGLE)?;
594 let value = required(&mut explicit, SINGLE)?;
595 end(&explicit, SINGLE)?;
596 let value = generalized(&explicit, &value, SINGLE)?;
597 next = reader.next_element().field(SINGLE)?;
598 Some(value)
599 } else {
600 None
601 };
602 let extensions = extensions_element(&reader, next.as_ref(), 1, SINGLE)?;
603 end(&reader, SINGLE)?;
604 Ok(SingleResponse {
605 id,
606 status,
607 this_update,
608 next_update,
609 extensions,
610 span: element.span(),
611 })
612}
613
614fn read_id<'a>(parent: &Reader<'a>, element: &Element<'a>) -> Result<CertId<'a>> {
615 let mut reader = sequence(parent, element, SINGLE)?;
616 let algorithm = required(&mut reader, SINGLE)?;
617 let algorithm = algorithm::read(&reader, &algorithm, SINGLE)?;
618 let name = reader
619 .expect(Tag::primitive(universal::OCTET_STRING))
620 .field(SINGLE)?;
621 let key = reader
622 .expect(Tag::primitive(universal::OCTET_STRING))
623 .field(SINGLE)?;
624 let serial = reader.read_integer().field(SINGLE)?;
625 end(&reader, SINGLE)?;
626 Ok(CertId {
627 algorithm,
628 issuer_name_hash: name.contents(),
629 issuer_key_hash: key.contents(),
630 serial,
631 span: element.span(),
632 })
633}
634
635fn generalized(parent: &Reader<'_>, element: &Element<'_>, field: &'static str) -> Result<Time> {
636 if element.tag() != Tag::primitive(universal::GENERALIZED_TIME) {
637 return Err(Error::new(
638 ErrorCode::Encoding(structured_asn1::ErrorCode::UnexpectedTag),
639 field,
640 element.span().start,
641 ));
642 }
643 time::read_in(parent, element, field)
644}
645fn sequence<'a>(
646 parent: &Reader<'a>,
647 element: &Element<'a>,
648 field: &'static str,
649) -> Result<Reader<'a>> {
650 if element.tag() != Tag::constructed(universal::SEQUENCE) {
651 return Err(Error::new(
652 ErrorCode::Encoding(structured_asn1::ErrorCode::UnexpectedTag),
653 field,
654 element.span().start,
655 ));
656 }
657 parent.enter(element).field(field)
658}
659fn optional_extensions<'a>(
660 reader: &mut Reader<'a>,
661 tag: u32,
662 field: &'static str,
663) -> Result<Extensions<'a>> {
664 let element = reader.next_element().field(field)?;
665 extensions_element(reader, element.as_ref(), tag, field)
666}
667fn extensions_element<'a>(
668 parent: &Reader<'a>,
669 element: Option<&Element<'a>>,
670 tag: u32,
671 field: &'static str,
672) -> Result<Extensions<'a>> {
673 let Some(element) = element else {
674 return Ok(Extensions::empty(parent.memory()));
675 };
676 if element.tag() != Tag::context(true, tag) {
677 return Err(Error::new(
678 ErrorCode::UnexpectedField,
679 field,
680 element.span().start,
681 ));
682 }
683 let mut explicit = parent.enter(element).field(field)?;
684 let value = required(&mut explicit, field)?;
685 end(&explicit, field)?;
686 extension::read(&explicit, &value, field)
687}
688fn required<'a>(reader: &mut Reader<'a>, field: &'static str) -> Result<Element<'a>> {
689 let at = reader.offset();
690 reader
691 .next_element()
692 .field(field)?
693 .ok_or_else(|| Error::new(ErrorCode::MissingField, field, at))
694}
695fn end(reader: &Reader<'_>, field: &'static str) -> Result<()> {
696 if reader.is_empty() {
697 Ok(())
698 } else {
699 Err(Error::new(ErrorCode::TrailingData, field, reader.offset()))
700 }
701}