Skip to content

Commit 29701dc

Browse files
committed
wip
1 parent 9c1c5b9 commit 29701dc

3 files changed

Lines changed: 85 additions & 56 deletions

File tree

tls/examples/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ async fn main() {
8888
resolve,
8989
};
9090

91-
let mut server = Server::new(server_config, listen_addr, log.clone())
91+
let server = Server::new(server_config, listen_addr, log.clone())
9292
.await
9393
.unwrap();
9494

tls/src/lib.rs

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,8 @@ mod tests {
320320
use slog::Drain;
321321
use std::net::SocketAddrV6;
322322
use std::str::FromStr;
323+
use std::sync::atomic::AtomicUsize;
324+
use std::sync::Arc;
323325
use std::time::Duration;
324326
use tokio::io::{AsyncReadExt, AsyncWriteExt};
325327
use tokio::time::sleep;
@@ -400,7 +402,7 @@ mod tests {
400402

401403
tokio::spawn(async move {
402404
let server_config = local_config(1);
403-
let mut server = Server::new(server_config, addr, log2.clone())
405+
let server = Server::new(server_config, addr, log2.clone())
404406
.await
405407
.unwrap();
406408

@@ -460,7 +462,7 @@ mod tests {
460462
];
461463

462464
tokio::spawn(async move {
463-
let mut server = Server::new(server_config, addr, log2.clone())
465+
let server = Server::new(server_config, addr, log2.clone())
464466
.await
465467
.unwrap();
466468

@@ -522,7 +524,7 @@ mod tests {
522524
];
523525

524526
let handle = tokio::spawn(async move {
525-
let mut server = Server::new(server_config, addr, log2.clone())
527+
let server = Server::new(server_config, addr, log2.clone())
526528
.await
527529
.unwrap();
528530

@@ -578,57 +580,83 @@ mod tests {
578580

579581
let server_config = local_config(1);
580582

583+
let max_connections = 3;
584+
let done_count = Arc::new(AtomicUsize::new(0));
585+
581586
// Message to send over TLS
582587
const MSG: &str = "Hello Joe";
583588

584-
let (done_tx, done_rx) = tokio::sync::oneshot::channel();
585589
let log2 = log.clone();
586590
let corpus = vec![
587591
pki_keydir.join("corim-rot.cbor"),
588592
pki_keydir.join("corim-sp.cbor"),
589593
];
590594

595+
// Accept connections from 3 clients in different tasks
596+
//
597+
// For this test, the clients all share a set of keys, because
598+
// we only generate 2 sets of keys from the KDL.
599+
let dc2 = done_count.clone();
591600
tokio::spawn(async move {
592-
let mut server = Server::new(server_config, addr, log2.clone())
601+
let server = Server::new(server_config, addr, log2.clone())
593602
.await
594603
.unwrap();
595604

596-
let (mut stream, _) =
597-
server.accept(corpus.clone()).await.await.unwrap();
598-
let mut buf = String::new();
599-
stream.read_to_string(&mut buf).await.unwrap();
600-
601-
assert_eq!(buf.as_str(), MSG);
602-
603-
// Inform the main task that the test is complete.
604-
let _ = done_tx.send(());
605+
for _ in 0..max_connections {
606+
let accept_fut = server.accept(corpus.clone()).await;
607+
let done_count = dc2.clone();
608+
tokio::spawn(async move {
609+
let (mut stream, _) = accept_fut.await.unwrap();
610+
let mut buf = String::new();
611+
stream.read_to_string(&mut buf).await.unwrap();
612+
613+
assert_eq!(buf.as_str(), MSG);
614+
done_count
615+
.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
616+
});
617+
}
605618
});
606619

607620
// Loop until we succesfully connect
608-
let mut stream = loop {
609-
let client_config = local_config(2);
610-
611-
let corpus = vec![
612-
pki_keydir.join("corim-rot.cbor"),
613-
pki_keydir.join("corim-sp.cbor"),
614-
];
615-
616-
if let Ok(stream) =
617-
Client::connect(client_config, addr, corpus, log.clone()).await
618-
{
619-
break stream;
620-
}
621-
sleep(Duration::from_millis(1)).await;
622-
};
623-
624-
stream.write_all(MSG.as_bytes()).await.unwrap();
625-
626-
// Trigger an EOF so that `read_to_string` in the acceptor task
627-
// completes.
628-
stream.shutdown().await.unwrap();
621+
for _ in 0..max_connections {
622+
let pki_keydir = pki_keydir.clone();
623+
let log = log.clone();
624+
tokio::spawn(async move {
625+
let mut stream = loop {
626+
let client_config = local_config(2);
627+
628+
let corpus = vec![
629+
pki_keydir.join("corim-rot.cbor"),
630+
pki_keydir.join("corim-sp.cbor"),
631+
];
632+
633+
if let Ok(stream) = Client::connect(
634+
client_config,
635+
addr,
636+
corpus,
637+
log.clone(),
638+
)
639+
.await
640+
{
641+
break stream;
642+
}
643+
sleep(Duration::from_millis(1)).await;
644+
};
645+
646+
stream.write_all(MSG.as_bytes()).await.unwrap();
647+
648+
// Trigger an EOF so that `read_to_string` in the acceptor task
649+
// completes.
650+
stream.shutdown().await.unwrap();
651+
});
652+
}
629653

630654
// Wait for the other side of the connection to receive and assert the
631655
// message
632-
let _ = done_rx.await;
656+
while done_count.load(std::sync::atomic::Ordering::Relaxed)
657+
!= max_connections
658+
{
659+
sleep(Duration::from_millis(1)).await;
660+
}
633661
}
634662
}

tls/src/server.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -250,17 +250,25 @@ impl Server {
250250
}
251251

252252
pub async fn accept(
253-
&mut self,
253+
&self,
254254
corpus: Vec<Utf8PathBuf>,
255255
) -> impl Future<
256256
Output = Result<(Stream<TcpStream>, core::net::SocketAddr), Error>,
257-
> + use<'_> {
257+
> {
258258
// This is where the actual socket accept occurs.
259259
//
260260
// Everything else takes a while and therefore we return a future that
261261
// can be awaited inside a spawned taks.
262262
let accept_res = self.tcp_listener.accept().await;
263-
async {
263+
264+
// Clone all our fields so that we don't hold a reference to `self`
265+
// This allows the future to be `Send` so it can be spawned into a task.
266+
let tls_acceptor = self.tls_acceptor.clone();
267+
let log = self.log.clone();
268+
let attest_config = self.attest_config.clone();
269+
let roots = self.roots.clone();
270+
271+
async move {
264272
let (stream, addr) = accept_res?;
265273
// load corims into a set of ReferenceMeasurements
266274
let mut corims = Vec::new();
@@ -269,7 +277,7 @@ impl Server {
269277
}
270278
let corpus = ReferenceMeasurements::try_from(corims.as_slice())?;
271279

272-
let mut stream = self.tls_acceptor.clone().accept(stream).await?;
280+
let mut stream = tls_acceptor.clone().accept(stream).await?;
273281

274282
// get PlatformId from server TLS / Trust Quorum cert chain
275283
let (_, conn) = stream.get_ref();
@@ -333,7 +341,7 @@ impl Server {
333341
}
334342

335343
// Right now all protocols are the same
336-
info!(self.log, "Running with protocol version {version}");
344+
info!(log, "Running with protocol version {version}");
337345

338346
// get Nonce from client
339347
let client_nonce = recv_msg(&mut stream).await?;
@@ -347,8 +355,7 @@ impl Server {
347355
// The attesation protocol has an inherent race condition between
348356
// getting the log and the attestation. We verify our own attestation
349357
// before sending it to the challenger to fail as early as possible.
350-
let attest_data =
351-
get_attest_data(&self.attest_config, &client_nonce)?;
358+
let attest_data = get_attest_data(&attest_config, &client_nonce)?;
352359
dice_verifier::verify_attestation(
353360
&attest_data.certs[0],
354361
&attest_data.attestation,
@@ -361,12 +368,12 @@ impl Server {
361368
let client_cert_chain = certs_from_der(&client_cert_chain)?;
362369
let root = dice_verifier::verify_cert_chain(
363370
&client_cert_chain,
364-
Some(&self.roots),
371+
Some(&roots),
365372
)?;
366373
let client_platform_id =
367374
dice_mfg_msgs::PlatformId::try_from(&client_cert_chain)?;
368375
info!(
369-
self.log,
376+
log,
370377
"Cert chain from peer \"{}\" verified against root \"{}\"",
371378
client_platform_id.as_str()?,
372379
root.tbs_certificate.subject,
@@ -375,10 +382,7 @@ impl Server {
375382
if tq_platform_id != client_platform_id {
376383
return Err(Error::PlatformIdMismatch);
377384
}
378-
info!(
379-
self.log,
380-
"TQ & attestation cert chains agree on platform id"
381-
);
385+
info!(log, "TQ & attestation cert chains agree on platform id");
382386

383387
// send server attestation cert chain to client
384388
let cert_chain_der = certs_to_der(&attest_data.certs)?;
@@ -405,7 +409,7 @@ impl Server {
405409
&client_log,
406410
&nonce,
407411
)?;
408-
info!(self.log, "Peer attestation verified");
412+
info!(log, "Peer attestation verified");
409413

410414
// appraise measurements from client attestation against reference
411415
// measurements
@@ -418,14 +422,11 @@ impl Server {
418422
&corpus,
419423
) {
420424
Ok(()) => {
421-
info!(self.log, "Peer measurements appraised successfully");
425+
info!(log, "Peer measurements appraised successfully");
422426
true
423427
}
424428
Err(e) => {
425-
info!(
426-
self.log,
427-
"Peer measurements appraisal failed: {}", e
428-
);
429+
info!(log, "Peer measurements appraisal failed: {}", e);
429430
false
430431
}
431432
};

0 commit comments

Comments
 (0)