spiffe/bundle/x509/
mod.rs1use crate::bundle::{Bundle, BundleRefSource};
4use crate::cert::errors::CertificateError;
5use crate::cert::parsing::{parse_der_encoded_bytes_as_x509_certificate, to_certificate_vec};
6use crate::cert::Certificate;
7use crate::spiffe_id::TrustDomain;
8use std::collections::HashMap;
9use std::convert::TryFrom;
10use std::error::Error;
11
12#[derive(Debug, Clone, Eq, PartialEq)]
14pub struct X509Bundle {
15 trust_domain: TrustDomain,
16 x509_authorities: Vec<Certificate>,
17}
18
19impl Bundle for X509Bundle {}
20
21#[derive(Debug, Clone, Eq, PartialEq)]
23pub struct X509BundleSet {
24 bundles: HashMap<TrustDomain, X509Bundle>,
25}
26
27#[derive(Debug, thiserror::Error, PartialEq)]
30#[non_exhaustive]
31pub enum X509BundleError {
32 #[error(transparent)]
34 Certificate(#[from] CertificateError),
35}
36
37impl X509Bundle {
38 pub fn new(trust_domain: TrustDomain) -> Self {
40 X509Bundle {
41 trust_domain,
42 x509_authorities: Vec::new(),
43 }
44 }
45
46 pub fn from_x509_authorities(
56 trust_domain: TrustDomain,
57 authorities: &[&[u8]],
58 ) -> Result<Self, X509BundleError> {
59 let mut x509_authorities = vec![];
60 for authority in authorities
61 .iter()
62 .map(|&bytes| Certificate::try_from(bytes))
63 {
64 x509_authorities.push(authority?);
65 }
66
67 Ok(X509Bundle {
68 trust_domain,
69 x509_authorities,
70 })
71 }
72
73 pub fn parse_from_der(
84 trust_domain: TrustDomain,
85 bundle_der: &[u8],
86 ) -> Result<Self, X509BundleError> {
87 let x509_authorities = to_certificate_vec(bundle_der)?;
88
89 for authority in x509_authorities.iter() {
91 parse_der_encoded_bytes_as_x509_certificate(authority.content())?;
92 }
93
94 Ok(X509Bundle {
95 trust_domain,
96 x509_authorities,
97 })
98 }
99
100 pub fn add_authority(&mut self, authority_bytes: &[u8]) -> Result<(), X509BundleError> {
111 let certificate = Certificate::try_from(authority_bytes)?;
112 self.x509_authorities.push(certificate);
113 Ok(())
114 }
115
116 pub fn trust_domain(&self) -> &TrustDomain {
118 &self.trust_domain
119 }
120
121 pub fn authorities(&self) -> &Vec<Certificate> {
123 &self.x509_authorities
124 }
125}
126
127impl X509BundleSet {
128 pub fn new() -> Self {
130 X509BundleSet {
131 bundles: HashMap::new(),
132 }
133 }
134
135 pub fn add_bundle(&mut self, bundle: X509Bundle) {
138 self.bundles.insert(bundle.trust_domain().clone(), bundle);
139 }
140
141 pub fn get_bundle(&self, trust_domain: &TrustDomain) -> Option<&X509Bundle> {
143 self.bundles.get(trust_domain)
144 }
145}
146
147impl Default for X509BundleSet {
148 fn default() -> Self {
149 Self::new()
150 }
151}
152
153impl BundleRefSource for X509BundleSet {
154 type Item = X509Bundle;
155
156 fn get_bundle_for_trust_domain(
158 &self,
159 trust_domain: &TrustDomain,
160 ) -> Result<Option<&Self::Item>, Box<dyn Error + Send + Sync + 'static>> {
161 Ok(self.bundles.get(trust_domain))
162 }
163}