Skip to content

Commit ee80f79

Browse files
committed
Merge branch 'main' of https://github.com/swimos/swim-rust into no_publish
# Conflicts: # client/swimos_client/Cargo.toml # server/swimos_server_app/Cargo.toml # swimos_client/src/lib.rs
2 parents 14b0716 + cabecec commit ee80f79

File tree

12 files changed

+178
-65
lines changed

12 files changed

+178
-65
lines changed

client/swimos_client/Cargo.toml

Whitespace-only changes.

runtime/swimos_remote/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ edition = "2021"
77
[features]
88
default = []
99
tls = ["rustls", "webpki", "webpki-roots", "tokio-rustls", "rustls-pemfile"]
10+
ring_provider = []
11+
aws_lc_rs_provider = []
1012

1113
[dependencies]
1214
ratchet = { workspace = true, features = ["deflate", "split"] }

runtime/swimos_remote/src/tls/config/mod.rs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
use rustls::crypto::CryptoProvider;
16-
use std::sync::Arc;
17-
1815
/// Supported certificate formats for TLS connections.
1916
pub enum CertFormat {
2017
Pem,
@@ -87,18 +84,14 @@ pub struct ServerConfig {
8784
/// `SSLKEYLOGFILE` environment variable, and writes keys into it. While this may be enabled,
8885
/// if `SSLKEYLOGFILE` is not set, it will do nothing.
8986
pub enable_log_file: bool,
90-
/// Process-wide [`CryptoProvider`] that must already have been installed as the default
91-
/// provider.
92-
pub provider: Arc<CryptoProvider>,
9387
}
9488

9589
impl ServerConfig {
96-
pub fn new(chain: CertChain, key: PrivateKey, provider: Arc<CryptoProvider>) -> Self {
90+
pub fn new(chain: CertChain, key: PrivateKey) -> Self {
9791
ServerConfig {
9892
chain,
9993
key,
10094
enable_log_file: false,
101-
provider,
10295
}
10396
}
10497
}
@@ -117,12 +110,3 @@ impl ClientConfig {
117110
}
118111
}
119112
}
120-
121-
impl Default for ClientConfig {
122-
fn default() -> Self {
123-
Self {
124-
use_webpki_roots: true,
125-
custom_roots: vec![],
126-
}
127-
}
128-
}

runtime/swimos_remote/src/tls/errors.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,10 @@ pub enum TlsError {
3232
/// Performing the TLS handshake failed.
3333
#[error("TLS handshake failed: {0}")]
3434
HandshakeFailed(std::io::Error),
35+
/// User specified that a cryptographic provider had been installed but none was found.
36+
#[error("No default cryptographic provider has been installed")]
37+
NoCryptoProviderInstalled,
38+
/// User specified more than one cryptographic provider feature flag. Only one may be specified.
39+
#[error("Ambiguous cryptographic provider feature flags specified. Only \"ring_provider\" or \"aws_lc_rs_provider\" may be specified")]
40+
InvalidCryptoProvider,
3541
}

runtime/swimos_remote/src/tls/mod.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,40 @@ pub use config::{
2323
pub use errors::TlsError;
2424
pub use maybe::MaybeTlsStream;
2525
pub use net::{RustlsClientNetworking, RustlsListener, RustlsNetworking, RustlsServerNetworking};
26+
use rustls::crypto::CryptoProvider;
27+
use std::sync::Arc;
28+
29+
#[derive(Default)]
30+
pub enum CryptoProviderConfig {
31+
ProcessDefault,
32+
#[default]
33+
FromFeatureFlags,
34+
Provided(Arc<CryptoProvider>),
35+
}
36+
37+
impl CryptoProviderConfig {
38+
pub fn try_build(self) -> Result<Arc<CryptoProvider>, TlsError> {
39+
match self {
40+
CryptoProviderConfig::ProcessDefault => CryptoProvider::get_default()
41+
.ok_or(TlsError::NoCryptoProviderInstalled)
42+
.cloned(),
43+
CryptoProviderConfig::FromFeatureFlags => {
44+
#[cfg(all(feature = "ring_provider", not(feature = "aws_lc_rs_provider")))]
45+
{
46+
return Arc::new(rustls::crypto::ring::default_provider());
47+
}
48+
49+
#[cfg(all(feature = "aws_lc_rs_provider", not(feature = "ring_provider")))]
50+
{
51+
return Arc::new(rustls::crypto::aws_lc_rs::default_provider());
52+
}
53+
54+
#[allow(unreachable_code)]
55+
{
56+
Err(TlsError::InvalidCryptoProvider)
57+
}
58+
}
59+
CryptoProviderConfig::Provided(provider) => Ok(provider),
60+
}
61+
}
62+
}

runtime/swimos_remote/src/tls/net/client.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use std::{net::SocketAddr, sync::Arc};
1616

1717
use futures::{future::BoxFuture, FutureExt};
18+
use rustls::crypto::CryptoProvider;
1819
use rustls::pki_types::ServerName;
1920
use rustls::RootCertStore;
2021

@@ -40,9 +41,10 @@ impl RustlsClientNetworking {
4041
}
4142
}
4243

43-
pub fn try_from_config(
44+
pub fn build(
4445
resolver: Arc<Resolver>,
4546
config: ClientConfig,
47+
provider: Arc<CryptoProvider>,
4648
) -> Result<Self, TlsError> {
4749
let ClientConfig {
4850
use_webpki_roots,
@@ -59,7 +61,8 @@ impl RustlsClientNetworking {
5961
}
6062
}
6163

62-
let config = rustls::ClientConfig::builder()
64+
let config = rustls::ClientConfig::builder_with_provider(provider)
65+
.with_safe_default_protocol_versions()?
6366
.with_root_certificates(root_store)
6467
.with_no_client_auth();
6568

runtime/swimos_remote/src/tls/net/server.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use futures::{
2222
stream::{unfold, BoxStream, FuturesUnordered},
2323
Future, FutureExt, Stream, StreamExt, TryStreamExt,
2424
};
25+
use rustls::crypto::CryptoProvider;
2526
use rustls::pki_types::PrivateKeyDer;
2627
use rustls::KeyLogFile;
2728
use rustls_pemfile::Item;
@@ -64,17 +65,15 @@ impl RustlsServerNetworking {
6465
pub fn new(acceptor: TlsAcceptor) -> Self {
6566
RustlsServerNetworking { acceptor }
6667
}
67-
}
68-
69-
impl TryFrom<ServerConfig> for RustlsServerNetworking {
70-
type Error = TlsError;
7168

72-
fn try_from(config: ServerConfig) -> Result<Self, Self::Error> {
69+
pub fn build(
70+
config: ServerConfig,
71+
provider: Arc<CryptoProvider>,
72+
) -> Result<RustlsServerNetworking, TlsError> {
7373
let ServerConfig {
7474
chain: CertChain(certs),
7575
key,
7676
enable_log_file,
77-
provider,
7877
} = config;
7978

8079
let mut chain = vec![];

runtime/swimos_remote/src/tls/net/tests.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use std::{net::SocketAddr, path::PathBuf, sync::Arc, time::Duration};
1717
use crate::dns::Resolver;
1818
use crate::net::{ClientConnections, ConnectionError, Listener, ListenerError, Scheme};
1919
use futures::{future::join, StreamExt};
20+
use rustls::crypto::aws_lc_rs;
2021

2122
use crate::tls::{
2223
CertChain, CertificateFile, ClientConfig, PrivateKey, RustlsClientNetworking,
@@ -46,18 +47,11 @@ fn make_server_config() -> ServerConfig {
4647
CertificateFile::der(ca_cert),
4748
]);
4849

49-
let provider = rustls::crypto::aws_lc_rs::default_provider();
50-
provider
51-
.clone()
52-
.install_default()
53-
.expect("Crypto Provider has already been initialised elsewhere.");
54-
5550
let key = PrivateKey::der(server_key);
5651
ServerConfig {
5752
chain,
5853
key,
5954
enable_log_file: false,
60-
provider: Arc::new(provider),
6155
}
6256
}
6357

@@ -72,11 +66,13 @@ fn make_client_config() -> ClientConfig {
7266

7367
#[tokio::test]
7468
async fn perform_handshake() {
75-
let server_net =
76-
RustlsServerNetworking::try_from(make_server_config()).expect("Invalid server config.");
77-
let client_net = RustlsClientNetworking::try_from_config(
69+
let crypto_provider = Arc::new(aws_lc_rs::default_provider());
70+
let server_net = RustlsServerNetworking::build(make_server_config(), crypto_provider.clone())
71+
.expect("Invalid server config.");
72+
let client_net = RustlsClientNetworking::build(
7873
Arc::new(Resolver::new().await),
7974
make_client_config(),
75+
crypto_provider,
8076
)
8177
.expect("Invalid client config.");
8278

server/swimos_server_app/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ authors = ["Swim Inc. developers info@swim.ai"]
55
edition = "2021"
66

77
[features]
8-
default = ["signal"]
8+
default = ["aws_lc_rs_provider", "signal"]
99
rocks_store = ["swimos_rocks_store"]
1010
trust_dns = ["swimos_runtime/trust_dns"]
1111
signal = ["tokio/signal"]
12+
ring_provider = ["swimos_remote/ring_provider"]
13+
aws_lc_rs_provider = ["swimos_remote/aws_lc_rs_provider"]
1214

1315
[dependencies]
1416
futures = { workspace = true }
@@ -36,6 +38,7 @@ parking_lot = { workspace = true }
3638
hyper = { workspace = true, features = ["server", "runtime", "tcp", "http1", "backports"] }
3739
pin-project = { workspace = true }
3840
percent-encoding = { workspace = true }
41+
rustls = { workspace = true }
3942

4043
[dev-dependencies]
4144
swimos_recon = { path = "../../api/formats/swimos_recon" }

server/swimos_server_app/src/server/builder/mod.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ use ratchet::{
2121
deflate::{DeflateConfig, DeflateExtProvider},
2222
NoExtProvider, WebSocketStream,
2323
};
24+
use rustls::crypto::CryptoProvider;
25+
2426
use swimos_api::{
2527
agent::Agent,
2628
error::StoreError,
@@ -29,7 +31,8 @@ use swimos_api::{
2931
use swimos_remote::dns::Resolver;
3032
use swimos_remote::plain::TokioPlainTextNetworking;
3133
use swimos_remote::tls::{
32-
ClientConfig, RustlsClientNetworking, RustlsNetworking, RustlsServerNetworking, TlsConfig,
34+
ClientConfig, CryptoProviderConfig, RustlsClientNetworking, RustlsNetworking,
35+
RustlsServerNetworking, TlsConfig,
3336
};
3437
use swimos_remote::ExternalConnections;
3538
use swimos_utilities::routing::RoutePattern;
@@ -57,6 +60,7 @@ pub struct ServerBuilder {
5760
config: SwimServerConfig,
5861
store_options: StoreConfig,
5962
introspection: Option<IntrospectionConfig>,
63+
crypto_provider: CryptoProviderConfig,
6064
}
6165

6266
#[non_exhaustive]
@@ -84,6 +88,7 @@ impl ServerBuilder {
8488
config: Default::default(),
8589
store_options: Default::default(),
8690
introspection: Default::default(),
91+
crypto_provider: CryptoProviderConfig::default(),
8792
}
8893
}
8994

@@ -159,6 +164,18 @@ impl ServerBuilder {
159164
self
160165
}
161166

167+
/// Uses the process-default [`CryptoProvider`] for any TLS connections.
168+
pub fn with_default_crypto_provider(mut self) -> Self {
169+
self.crypto_provider = CryptoProviderConfig::ProcessDefault;
170+
self
171+
}
172+
173+
/// Uses the provided [`CryptoProvider`] for any TLS connections.
174+
pub fn with_crypto_provider(mut self, provider: Arc<CryptoProvider>) -> Self {
175+
self.crypto_provider = CryptoProviderConfig::Provided(provider);
176+
self
177+
}
178+
162179
/// Attempt to make a server instance. This will fail if the routes specified for the
163180
/// agents are ambiguous.
164181
pub async fn build(self) -> Result<BoxServer, ServerBuilderError> {
@@ -170,6 +187,7 @@ impl ServerBuilder {
170187
config,
171188
store_options,
172189
introspection,
190+
crypto_provider,
173191
} = self;
174192
let routes = plane.build()?;
175193
if introspection.is_some() {
@@ -182,14 +200,20 @@ impl ServerBuilder {
182200
deflate,
183201
introspection,
184202
};
203+
let crypto_provider = crypto_provider.try_build()?;
204+
185205
if let Some(tls_conf) = tls_config {
186-
let client = RustlsClientNetworking::try_from_config(resolver, tls_conf.client)?;
187-
let server = RustlsServerNetworking::try_from(tls_conf.server)?;
206+
let client =
207+
RustlsClientNetworking::build(resolver, tls_conf.client, crypto_provider.clone())?;
208+
let server = RustlsServerNetworking::build(tls_conf.server, crypto_provider)?;
188209
let networking = RustlsNetworking::new_tls(client, server);
189210
Ok(with_store(bind_to, routes, networking, config)?)
190211
} else {
191-
let client =
192-
RustlsClientNetworking::try_from_config(resolver.clone(), ClientConfig::default())?;
212+
let client = RustlsClientNetworking::build(
213+
resolver.clone(),
214+
ClientConfig::new(Default::default()),
215+
crypto_provider,
216+
)?;
193217
let server = TokioPlainTextNetworking::new(resolver);
194218
let networking = RustlsNetworking::new_plain_text(client, server);
195219
Ok(with_store(bind_to, routes, networking, config)?)

0 commit comments

Comments
 (0)