Skip to content

Commit a7f31b0

Browse files
committed
feat(tls): Add CertificateDer to describe DER encoded certificate
1 parent eccb3f5 commit a7f31b0

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed

tonic/src/request.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::metadata::{MetadataMap, MetadataValue};
22
#[cfg(feature = "transport")]
33
use crate::transport::server::TcpConnectInfo;
44
#[cfg(feature = "tls")]
5-
use crate::transport::{server::TlsConnectInfo, Certificate};
5+
use crate::transport::{server::TlsConnectInfo, CertificateDer};
66
use crate::Extensions;
77
#[cfg(feature = "transport")]
88
use std::net::SocketAddr;
@@ -258,7 +258,7 @@ impl<T> Request<T> {
258258
/// TLS enabled connections.
259259
#[cfg(feature = "tls")]
260260
#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
261-
pub fn peer_certs(&self) -> Option<Arc<Vec<Certificate>>> {
261+
pub fn peer_certs(&self) -> Option<Arc<Vec<CertificateDer>>> {
262262
self.extensions()
263263
.get::<TlsConnectInfo<TcpConnectInfo>>()
264264
.and_then(|i| i.peer_certs())

tonic/src/transport/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ pub use self::server::Server;
106106
pub use self::service::grpc_timeout::TimeoutExpired;
107107
#[cfg(feature = "tls")]
108108
#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
109-
pub use self::tls::Certificate;
109+
pub use self::tls::{Certificate, CertificateDer};
110110
pub use axum::{body::BoxBody as AxumBoxBody, Router as AxumRouter};
111111
pub use hyper::{Body, Uri};
112112

tonic/src/transport/server/conn.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::net::SocketAddr;
33
use tokio::net::TcpStream;
44

55
#[cfg(feature = "tls")]
6-
use crate::transport::Certificate;
6+
use crate::transport::CertificateDer;
77
#[cfg(feature = "tls")]
88
use std::sync::Arc;
99
#[cfg(feature = "tls")]
@@ -126,7 +126,7 @@ where
126126
let inner = inner.connect_info();
127127

128128
let certs = if let Some(certs) = session.peer_certificates() {
129-
let certs = certs.iter().map(Certificate::from_pem).collect();
129+
let certs = certs.iter().map(CertificateDer::new).collect();
130130
Some(Arc::new(certs))
131131
} else {
132132
None
@@ -148,7 +148,7 @@ where
148148
#[derive(Debug, Clone)]
149149
pub struct TlsConnectInfo<T> {
150150
inner: T,
151-
certs: Option<Arc<Vec<Certificate>>>,
151+
certs: Option<Arc<Vec<CertificateDer>>>,
152152
}
153153

154154
#[cfg(feature = "tls")]
@@ -165,7 +165,7 @@ impl<T> TlsConnectInfo<T> {
165165
}
166166

167167
/// Return the set of connected peer TLS certificates.
168-
pub fn peer_certs(&self) -> Option<Arc<Vec<Certificate>>> {
168+
pub fn peer_certs(&self) -> Option<Arc<Vec<CertificateDer>>> {
169169
self.certs.clone()
170170
}
171171
}

tonic/src/transport/tls.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ pub struct Identity {
1111
pub(crate) key: Vec<u8>,
1212
}
1313

14+
/// Reprensents a DER encoded certificate.
15+
#[derive(Debug, Clone)]
16+
pub struct CertificateDer {
17+
bytes: Vec<u8>,
18+
}
19+
1420
impl Certificate {
1521
/// Parse a PEM encoded X509 Certificate.
1622
///
@@ -58,3 +64,27 @@ impl Identity {
5864
Self { cert, key }
5965
}
6066
}
67+
68+
impl CertificateDer {
69+
pub(crate) fn new(bytes: impl AsRef<[u8]>) -> Self {
70+
let bytes = bytes.as_ref().into();
71+
Self { bytes }
72+
}
73+
74+
/// Consumes `self`, returning the underlying DER encoded certificate
75+
pub fn into_bytes(self) -> Vec<u8> {
76+
self.bytes
77+
}
78+
}
79+
80+
impl AsRef<[u8]> for CertificateDer {
81+
fn as_ref(&self) -> &[u8] {
82+
self.bytes.as_ref()
83+
}
84+
}
85+
86+
impl AsMut<[u8]> for CertificateDer {
87+
fn as_mut(&mut self) -> &mut [u8] {
88+
self.bytes.as_mut()
89+
}
90+
}

0 commit comments

Comments
 (0)