pub(crate) mod cert;
mod crl;
mod csr;
pub mod extension;
mod name;
pub mod ocsp;
mod pubkey;
mod signer;
mod time;
pub use cert::{Certificate, NameConstraints, SanIp};
pub use crl::{CertificateRevocationList, CrlBuilder, CrlReason, RevokedCertificate};
pub use csr::CertificationRequest;
pub use extension::{Extension, GeneralName, KeyUsageBits};
pub use name::DistinguishedName;
pub use ocsp::{
OcspCertStatus, OcspRequest, OcspRequestBuilder, OcspResponse, OcspResponseBuilder,
OcspResponseStatus, OcspSingleResponse,
};
pub use pubkey::AnyPublicKey;
pub use signer::CertSigner;
pub use time::{Time, Validity};
use alloc::vec::Vec;
pub mod oid {
pub const RSA_ENCRYPTION: &[u64] = &[1, 2, 840, 113549, 1, 1, 1];
pub const SHA1_WITH_RSA: &[u64] = &[1, 2, 840, 113549, 1, 1, 5];
pub const ID_RSASSA_PSS: &[u64] = &[1, 2, 840, 113549, 1, 1, 10];
pub const SHA256_WITH_RSA: &[u64] = &[1, 2, 840, 113549, 1, 1, 11];
pub const SHA384_WITH_RSA: &[u64] = &[1, 2, 840, 113549, 1, 1, 12];
pub const SHA512_WITH_RSA: &[u64] = &[1, 2, 840, 113549, 1, 1, 13];
pub const EC_PUBLIC_KEY: &[u64] = &[1, 2, 840, 10045, 2, 1];
pub const PRIME256V1: &[u64] = &[1, 2, 840, 10045, 3, 1, 7];
pub const SECP384R1: &[u64] = &[1, 3, 132, 0, 34];
pub const SECP521R1: &[u64] = &[1, 3, 132, 0, 35];
pub const SECP256K1: &[u64] = &[1, 3, 132, 0, 10];
pub const SM2_P256V1: &[u64] = &[1, 2, 156, 10197, 1, 301];
pub const SM2_WITH_SM3: &[u64] = &[1, 2, 156, 10197, 1, 501];
pub const ECDSA_WITH_SHA256: &[u64] = &[1, 2, 840, 10045, 4, 3, 2];
pub const ECDSA_WITH_SHA384: &[u64] = &[1, 2, 840, 10045, 4, 3, 3];
pub const ECDSA_WITH_SHA512: &[u64] = &[1, 2, 840, 10045, 4, 3, 4];
pub const ID_ED25519: &[u64] = &[1, 3, 101, 112];
pub const ID_ED448: &[u64] = &[1, 3, 101, 113];
pub const ID_ML_DSA_44: &[u64] = &[2, 16, 840, 1, 101, 3, 4, 3, 17];
pub const ID_ML_DSA_65: &[u64] = &[2, 16, 840, 1, 101, 3, 4, 3, 18];
pub const ID_ML_DSA_87: &[u64] = &[2, 16, 840, 1, 101, 3, 4, 3, 19];
pub const COMMON_NAME: &[u64] = &[2, 5, 4, 3];
pub const COUNTRY: &[u64] = &[2, 5, 4, 6];
pub const ORGANIZATION: &[u64] = &[2, 5, 4, 10];
pub const ORGANIZATIONAL_UNIT: &[u64] = &[2, 5, 4, 11];
pub const BASIC_CONSTRAINTS: &[u64] = &[2, 5, 29, 19];
pub const KEY_USAGE: &[u64] = &[2, 5, 29, 15];
pub const EXT_KEY_USAGE: &[u64] = &[2, 5, 29, 37];
pub const ID_KP_SERVER_AUTH: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 3, 1];
pub const ID_KP_CLIENT_AUTH: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 3, 2];
pub const SUBJECT_ALT_NAME: &[u64] = &[2, 5, 29, 17];
pub const SUBJECT_KEY_IDENTIFIER: &[u64] = &[2, 5, 29, 14];
pub const AUTHORITY_KEY_IDENTIFIER: &[u64] = &[2, 5, 29, 35];
pub const NAME_CONSTRAINTS: &[u64] = &[2, 5, 29, 30];
pub const CERTIFICATE_POLICIES: &[u64] = &[2, 5, 29, 32];
pub const CRL_DISTRIBUTION_POINTS: &[u64] = &[2, 5, 29, 31];
pub const ID_KP_CODE_SIGNING: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 3, 3];
pub const ID_KP_EMAIL_PROTECTION: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 3, 4];
pub const ID_KP_TIME_STAMPING: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 3, 8];
pub const ID_KP_OCSP_SIGNING: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 3, 9];
pub const EXTENSION_REQUEST: &[u64] = &[1, 2, 840, 113549, 1, 9, 14];
pub const CRL_REASON_CODE: &[u64] = &[2, 5, 29, 21];
pub const ID_PKIX_OCSP_BASIC: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 48, 1, 1];
pub const ID_PKIX_OCSP_NOCHECK: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 48, 1, 5];
pub const ID_PKIX_OCSP_NONCE: &[u64] = &[1, 3, 6, 1, 5, 5, 7, 48, 1, 2];
pub const ID_SHA1: &[u64] = &[1, 3, 14, 3, 2, 26];
pub const ID_SHA256: &[u64] = &[2, 16, 840, 1, 101, 3, 4, 2, 1];
pub const ID_SHA384: &[u64] = &[2, 16, 840, 1, 101, 3, 4, 2, 2];
pub const ID_SHA512: &[u64] = &[2, 16, 840, 1, 101, 3, 4, 2, 3];
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Error {
Der(crate::der::Error),
Rsa(crate::rsa::Error),
UnsupportedAlgorithm,
Malformed,
Verification,
Expired,
NameMismatch,
}
impl From<crate::der::Error> for Error {
fn from(e: crate::der::Error) -> Self {
Error::Der(e)
}
}
impl From<crate::rsa::Error> for Error {
fn from(e: crate::rsa::Error) -> Self {
Error::Rsa(e)
}
}
impl core::fmt::Display for Error {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Error::Der(e) => write!(f, "X.509 DER error: {e}"),
Error::Rsa(e) => write!(f, "X.509 RSA error: {e}"),
Error::UnsupportedAlgorithm => f.write_str("unsupported X.509 algorithm"),
Error::Malformed => f.write_str("malformed X.509 certificate"),
Error::Verification => f.write_str("X.509 signature verification failed"),
Error::Expired => f.write_str("X.509 certificate outside its validity period"),
Error::NameMismatch => f.write_str("X.509 certificate host name mismatch"),
}
}
}
impl core::error::Error for Error {}
pub(crate) fn algorithm_identifier(algorithm: &[u64], null_params: bool) -> Vec<u8> {
use crate::der::{encode_null, encode_sequence, oid_tlv};
let mut body = oid_tlv(algorithm);
if null_params {
body.extend_from_slice(&encode_null());
}
encode_sequence(&body)
}