Skip to content

Commit 9802e4a

Browse files
pinkforesttarcieri
andauthored
Add rustls builder integration tests (#48)
Co-authored-by: Tony Arcieri <bascule@gmail.com>
1 parent f2579b6 commit 9802e4a

File tree

5 files changed

+239
-0
lines changed

5 files changed

+239
-0
lines changed

tests/builder.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
use std::sync::Arc;
2+
3+
use rustls::ClientConfig as RusTlsClientConfig;
4+
use rustls::ServerConfig as RusTlsServerConfig;
5+
6+
use rustls_rustcrypto::provider as rustcrypto_provider;
7+
8+
mod fake_time;
9+
use fake_time::FakeTime;
10+
11+
mod fake_cert_server_verifier;
12+
use fake_cert_server_verifier::FakeServerCertVerifier;
13+
14+
mod fake_cert_client_verifier;
15+
use fake_cert_client_verifier::FakeClientCertVerifier;
16+
17+
mod fake_cert_server_resolver;
18+
use fake_cert_server_resolver::FakeServerCertResolver;
19+
20+
// Test integration between rustls and rustls in Client builder context
21+
#[test]
22+
fn integrate_client_builder_with_details_fake() {
23+
let provider = rustcrypto_provider();
24+
let time_provider = FakeTime {};
25+
26+
let fake_server_cert_verifier = FakeServerCertVerifier {};
27+
28+
let builder_init =
29+
RusTlsClientConfig::builder_with_details(Arc::new(provider), Arc::new(time_provider));
30+
31+
let builder_default_versions = builder_init
32+
.with_safe_default_protocol_versions()
33+
.expect("Default protocol versions error?");
34+
35+
let dangerous_verifier = builder_default_versions
36+
.dangerous()
37+
.with_custom_certificate_verifier(Arc::new(fake_server_cert_verifier));
38+
39+
// Out of scope
40+
let rustls_client_config = dangerous_verifier.with_no_client_auth();
41+
42+
// RustCrypto is not fips
43+
assert_eq!(rustls_client_config.fips(), false);
44+
}
45+
46+
use rustls::DistinguishedName;
47+
48+
// Test integration between rustls and rustls in Server builder context
49+
#[test]
50+
fn integrate_server_builder_with_details_fake() {
51+
let provider = rustcrypto_provider();
52+
let time_provider = FakeTime {};
53+
54+
let builder_init =
55+
RusTlsServerConfig::builder_with_details(Arc::new(provider), Arc::new(time_provider));
56+
57+
let builder_default_versions = builder_init
58+
.with_safe_default_protocol_versions()
59+
.expect("Default protocol versions error?");
60+
61+
// A DistinguishedName is a Vec<u8> wrapped in internal types.
62+
// DER or BER encoded Subject field from RFC 5280 for a single certificate.
63+
// The Subject field is encoded as an RFC 5280 Name
64+
//let b_wrap_in: &[u8] = b""; // TODO: should have constant somewhere
65+
66+
let dummy_entry: &[u8] = b"";
67+
68+
let client_dn = [DistinguishedName::in_sequence(dummy_entry)];
69+
70+
let client_cert_verifier = FakeClientCertVerifier { dn: client_dn };
71+
72+
let dangerous_verifier =
73+
builder_default_versions.with_client_cert_verifier(Arc::new(client_cert_verifier));
74+
75+
let server_cert_resolver = FakeServerCertResolver {};
76+
77+
// Out of scope
78+
let rustls_client_config =
79+
dangerous_verifier.with_cert_resolver(Arc::new(server_cert_resolver));
80+
81+
// RustCrypto is not fips
82+
assert_eq!(rustls_client_config.fips(), false);
83+
}

tests/fake_cert_client_verifier.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use rustls::DistinguishedName;
2+
use rustls::Error;
3+
4+
use rustls::SignatureScheme;
5+
6+
use rustls::pki_types::CertificateDer;
7+
use rustls::pki_types::UnixTime;
8+
use rustls::DigitallySignedStruct;
9+
10+
use rustls::client::danger::HandshakeSignatureValid;
11+
use rustls::server::danger::ClientCertVerified;
12+
use rustls::server::danger::ClientCertVerifier;
13+
14+
#[derive(Debug)]
15+
pub struct FakeClientCertVerifier {
16+
pub dn: [DistinguishedName; 1],
17+
}
18+
19+
impl ClientCertVerifier for FakeClientCertVerifier {
20+
fn root_hint_subjects(&self) -> &[DistinguishedName] {
21+
&self.dn
22+
}
23+
fn verify_client_cert(
24+
&self,
25+
_end_entity: &CertificateDer<'_>,
26+
_intermediates: &[CertificateDer<'_>],
27+
_now: UnixTime,
28+
) -> Result<ClientCertVerified, Error> {
29+
Ok(ClientCertVerified::assertion())
30+
}
31+
fn verify_tls12_signature(
32+
&self,
33+
_message: &[u8],
34+
_cert: &CertificateDer<'_>,
35+
_dss: &DigitallySignedStruct,
36+
) -> Result<HandshakeSignatureValid, Error> {
37+
Ok(HandshakeSignatureValid::assertion())
38+
}
39+
fn verify_tls13_signature(
40+
&self,
41+
_message: &[u8],
42+
_cert: &CertificateDer<'_>,
43+
_dss: &DigitallySignedStruct,
44+
) -> Result<HandshakeSignatureValid, Error> {
45+
Ok(HandshakeSignatureValid::assertion())
46+
}
47+
fn supported_verify_schemes(&self) -> Vec<SignatureScheme> {
48+
vec![
49+
SignatureScheme::RSA_PKCS1_SHA1,
50+
SignatureScheme::ECDSA_SHA1_Legacy,
51+
SignatureScheme::RSA_PKCS1_SHA256,
52+
SignatureScheme::ECDSA_NISTP256_SHA256,
53+
SignatureScheme::RSA_PKCS1_SHA384,
54+
SignatureScheme::ECDSA_NISTP384_SHA384,
55+
SignatureScheme::RSA_PKCS1_SHA512,
56+
SignatureScheme::ECDSA_NISTP521_SHA512,
57+
SignatureScheme::RSA_PSS_SHA256,
58+
SignatureScheme::RSA_PSS_SHA384,
59+
SignatureScheme::RSA_PSS_SHA512,
60+
SignatureScheme::ED25519,
61+
SignatureScheme::ED448,
62+
//SignatureScheme::Unknown(u16),
63+
]
64+
}
65+
fn offer_client_auth(&self) -> bool {
66+
true
67+
}
68+
fn client_auth_mandatory(&self) -> bool {
69+
false
70+
}
71+
}

tests/fake_cert_server_resolver.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use std::sync::Arc;
2+
3+
use rustls::server::ClientHello;
4+
5+
use rustls::server::ResolvesServerCert;
6+
use rustls::sign::CertifiedKey;
7+
8+
#[derive(Debug)]
9+
pub struct FakeServerCertResolver;
10+
11+
impl ResolvesServerCert for FakeServerCertResolver {
12+
fn resolve(&self, _client_hello: ClientHello<'_>) -> Option<Arc<CertifiedKey>> {
13+
None
14+
}
15+
}

tests/fake_cert_server_verifier.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
use rustls::client::danger::HandshakeSignatureValid;
2+
use rustls::client::danger::ServerCertVerified;
3+
use rustls::client::danger::ServerCertVerifier;
4+
use rustls::pki_types::CertificateDer;
5+
use rustls::pki_types::ServerName;
6+
use rustls::pki_types::UnixTime;
7+
use rustls::DigitallySignedStruct;
8+
use rustls::Error;
9+
use rustls::SignatureScheme;
10+
11+
#[derive(Debug)]
12+
pub struct FakeServerCertVerifier;
13+
14+
impl ServerCertVerifier for FakeServerCertVerifier {
15+
fn verify_server_cert(
16+
&self,
17+
_end_entity: &CertificateDer<'_>,
18+
_intermediates: &[CertificateDer<'_>],
19+
_server_name: &ServerName<'_>,
20+
_ocsp_response: &[u8],
21+
_now: UnixTime,
22+
) -> Result<ServerCertVerified, Error> {
23+
Ok(ServerCertVerified::assertion())
24+
}
25+
fn verify_tls12_signature(
26+
&self,
27+
_message: &[u8],
28+
_cert: &CertificateDer<'_>,
29+
_dss: &DigitallySignedStruct,
30+
) -> Result<HandshakeSignatureValid, Error> {
31+
Ok(HandshakeSignatureValid::assertion())
32+
}
33+
fn verify_tls13_signature(
34+
&self,
35+
_message: &[u8],
36+
_cert: &CertificateDer<'_>,
37+
_dss: &DigitallySignedStruct,
38+
) -> Result<HandshakeSignatureValid, Error> {
39+
Ok(HandshakeSignatureValid::assertion())
40+
}
41+
fn supported_verify_schemes(&self) -> Vec<SignatureScheme> {
42+
vec![
43+
SignatureScheme::RSA_PKCS1_SHA1,
44+
SignatureScheme::ECDSA_SHA1_Legacy,
45+
SignatureScheme::RSA_PKCS1_SHA256,
46+
SignatureScheme::ECDSA_NISTP256_SHA256,
47+
SignatureScheme::RSA_PKCS1_SHA384,
48+
SignatureScheme::ECDSA_NISTP384_SHA384,
49+
SignatureScheme::RSA_PKCS1_SHA512,
50+
SignatureScheme::ECDSA_NISTP521_SHA512,
51+
SignatureScheme::RSA_PSS_SHA256,
52+
SignatureScheme::RSA_PSS_SHA384,
53+
SignatureScheme::RSA_PSS_SHA512,
54+
SignatureScheme::ED25519,
55+
SignatureScheme::ED448,
56+
//SignatureScheme::Unknown(u16),
57+
]
58+
}
59+
}

tests/fake_time.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use rustls::pki_types::UnixTime;
2+
use rustls::time_provider::TimeProvider;
3+
4+
#[derive(Debug)]
5+
pub struct FakeTime;
6+
7+
impl TimeProvider for FakeTime {
8+
fn current_time(&self) -> Option<UnixTime> {
9+
None
10+
}
11+
}

0 commit comments

Comments
 (0)