use const_oid::AssociatedOid;
use core::option::Option;
use der::{
asn1::{Null, ObjectIdentifier, OctetString},
Enumerated, Sequence,
};
pub type OcspNoCheck = Null;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct OcspResponse {
pub response_status: OcspResponseStatus,
#[asn1(context_specific = "0", optional = "true", tag_mode = "EXPLICIT")]
pub response_bytes: Option<ResponseBytes>,
}
impl OcspResponse {
pub fn successful(res: impl AsResponseBytes) -> Result<Self, der::Error> {
Ok(OcspResponse {
response_status: OcspResponseStatus::Successful,
response_bytes: Some(res.to_response_bytes()?),
})
}
pub fn malformed_request() -> Self {
OcspResponse {
response_status: OcspResponseStatus::MalformedRequest,
response_bytes: None,
}
}
pub fn internal_error() -> Self {
OcspResponse {
response_status: OcspResponseStatus::InternalError,
response_bytes: None,
}
}
pub fn try_later() -> Self {
OcspResponse {
response_status: OcspResponseStatus::TryLater,
response_bytes: None,
}
}
pub fn sig_required() -> Self {
OcspResponse {
response_status: OcspResponseStatus::SigRequired,
response_bytes: None,
}
}
pub fn unauthorized() -> Self {
OcspResponse {
response_status: OcspResponseStatus::Unauthorized,
response_bytes: None,
}
}
}
#[derive(Enumerated, Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u32)]
#[allow(missing_docs)]
pub enum OcspResponseStatus {
Successful = 0,
MalformedRequest = 1,
InternalError = 2,
TryLater = 3,
SigRequired = 5,
Unauthorized = 6,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct ResponseBytes {
pub response_type: ObjectIdentifier,
pub response: OctetString,
}
pub trait AsResponseBytes: AssociatedOid + der::Encode {
fn to_response_bytes(&self) -> Result<ResponseBytes, der::Error> {
Ok(ResponseBytes {
response_type: <Self as AssociatedOid>::OID,
response: OctetString::new(self.to_der()?)?,
})
}
}