1use crate::{
2 AlgorithmInfo, CertificateInfo, DistinguishedName, ExtensionDetails, KeyDataStatus,
3 NameAttribute, ParameterStatus, PssParameters, Validity,
4};
5
6#[derive(Clone, Debug, PartialEq, Eq)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize))]
9#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
10#[non_exhaustive]
11pub struct NameSummary {
12 pub display: String,
14 pub rdns: Vec<Vec<NameAttribute>>,
16}
17impl From<&DistinguishedName> for NameSummary {
18 fn from(name: &DistinguishedName) -> Self {
19 Self {
20 display: name.display.clone(),
21 rdns: name.rdns.clone(),
22 }
23 }
24}
25
26#[derive(Clone, Debug, PartialEq, Eq)]
28#[cfg_attr(feature = "serde", derive(serde::Serialize))]
29#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
30#[non_exhaustive]
31pub struct AlgorithmSummary {
32 pub oid: String,
34 pub name: Option<String>,
36 pub parameter_status: ParameterStatus,
38 pub pss: Option<PssParameters>,
40}
41impl From<&AlgorithmInfo> for AlgorithmSummary {
42 fn from(alg: &AlgorithmInfo) -> Self {
43 Self {
44 oid: alg.oid.clone(),
45 name: alg.name.clone(),
46 parameter_status: alg.parameter_status,
47 pss: alg.pss.clone(),
48 }
49 }
50}
51
52#[derive(Clone, Debug, PartialEq, Eq)]
54#[cfg_attr(feature = "serde", derive(serde::Serialize))]
55#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
56#[non_exhaustive]
57pub struct PublicKeySummary {
58 pub algorithm: AlgorithmSummary,
60 pub key_data_status: KeyDataStatus,
62 pub curve_oid: Option<String>,
64 pub curve_name: Option<String>,
66 pub key_size_bits: Option<usize>,
68}
69
70#[derive(Clone, Debug, PartialEq, Eq)]
72#[cfg_attr(feature = "serde", derive(serde::Serialize))]
73#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
74#[non_exhaustive]
75pub struct ExtensionSummary {
76 pub oid: String,
78 pub critical: bool,
80 pub duplicate: bool,
82 pub details: ExtensionDetails,
84}
85
86#[derive(Clone, Debug, PartialEq, Eq)]
96#[cfg_attr(feature = "serde", derive(serde::Serialize))]
97#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
98#[non_exhaustive]
99pub struct CertificateSummary {
100 pub schema_version: u32,
102 pub version: u32,
104 pub subject: NameSummary,
106 pub issuer: NameSummary,
108 pub validity: Validity,
110 pub serial_number_hex: String,
112 pub sha256_fingerprint_hex: String,
114 pub signature_algorithm: AlgorithmSummary,
116 pub tbs_signature_algorithm: AlgorithmSummary,
118 pub public_key: PublicKeySummary,
120 pub extensions: Vec<ExtensionSummary>,
122}
123
124impl CertificateInfo {
125 pub fn summary(&self) -> CertificateSummary {
130 CertificateSummary {
131 schema_version: 1,
132 version: self.version,
133 subject: (&self.subject).into(),
134 issuer: (&self.issuer).into(),
135 validity: self.validity,
136 serial_number_hex: hex::encode(&self.serial_number),
137 sha256_fingerprint_hex: hex::encode(self.sha256_fingerprint()),
138 signature_algorithm: (&self.signature_algorithm).into(),
139 tbs_signature_algorithm: (&self.tbs_signature_algorithm).into(),
140 public_key: PublicKeySummary {
141 algorithm: (&self.public_key.algorithm).into(),
142 key_data_status: self.public_key.key_data_status,
143 curve_oid: self.public_key.curve_oid.clone(),
144 curve_name: self.public_key.curve_name.clone(),
145 key_size_bits: self.public_key.key_size_bits,
146 },
147 extensions: self
148 .extensions
149 .iter()
150 .map(|e| ExtensionSummary {
151 oid: e.oid.clone(),
152 critical: e.critical,
153 duplicate: e.duplicate,
154 details: e.details.clone(),
155 })
156 .collect(),
157 }
158 }
159}