Skip to content

Commit 7c47daa

Browse files
committed
Add an unattested client test
Mock up what happens if we have a client who doesn't follow the protocol and just sends messages
1 parent 20201a3 commit 7c47daa

2 files changed

Lines changed: 83 additions & 2 deletions

File tree

tls/src/client.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ impl Client {
167167
.await
168168
}
169169

170-
fn new_tls_local_client_config(
170+
// For some testing shenanigans
171+
pub(crate) fn new_tls_local_client_config(
171172
priv_key: Utf8PathBuf,
172173
cert_chain: Utf8PathBuf,
173174
roots: Vec<Utf8PathBuf>,

tls/src/lib.rs

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ impl<T> Stream<T> {
151151
&self.platform_id
152152
}
153153

154-
pub fn appraisal_status(&self) -> bool {
154+
pub fn appraisal_success(&self) -> bool {
155155
self.corpus_appraisal_success
156156
}
157157
}
@@ -505,4 +505,84 @@ mod tests {
505505
// message
506506
let _ = done_rx.await;
507507
}
508+
509+
#[tokio::test]
510+
async fn unattested_client() {
511+
let mut pki_keydir = Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR"));
512+
pki_keydir.push("test-keys");
513+
let log = logger();
514+
515+
let addr: SocketAddrV6 = SocketAddrV6::from_str("[::1]:46459").unwrap();
516+
517+
let server_config = keys::SprocketsConfig {
518+
attest: keys::AttestConfig::Local {
519+
priv_key: pki_keydir.join("test-alias-1.key.pem"),
520+
cert_chain: pki_keydir.join("test-alias-1.certlist.pem"),
521+
log: pki_keydir.join("log.bin"),
522+
},
523+
roots: vec![pki_keydir.join("test-root-a.cert.pem")],
524+
resolve: keys::ResolveSetting::Local {
525+
priv_key: pki_keydir.join("test-sprockets-auth-1.key.pem"),
526+
cert_chain: pki_keydir
527+
.join("test-sprockets-auth-1.certlist.pem"),
528+
},
529+
};
530+
531+
// Message to send over TLS
532+
const MSG: &str = "Hello Joe";
533+
534+
let (done_tx, done_rx) = tokio::sync::oneshot::channel::<()>();
535+
let log2 = log.clone();
536+
let corpus = vec![
537+
pki_keydir.join("corim-rot.cbor"),
538+
pki_keydir.join("corim-sp.cbor"),
539+
];
540+
541+
let handle = tokio::spawn(async move {
542+
let mut server = Server::new(server_config, addr, log2.clone())
543+
.await
544+
.unwrap();
545+
546+
// We never expect this to succeed
547+
let _ = match server.accept(corpus.as_slice()).await {
548+
Ok(_) => panic!("This should not succed"),
549+
Err(_) => done_tx.send(()),
550+
};
551+
});
552+
553+
let client_config = client::Client::new_tls_local_client_config(
554+
pki_keydir.join("test-sprockets-auth-2.key.pem"),
555+
pki_keydir.join("test-sprockets-auth-2.certlist.pem"),
556+
vec![pki_keydir.join("test-root-a.cert.pem")],
557+
log,
558+
)
559+
.unwrap();
560+
561+
let dnsname =
562+
rustls::pki_types::ServerName::try_from("unknown.com").unwrap();
563+
564+
let connector = tokio_rustls::TlsConnector::from(std::sync::Arc::new(
565+
client_config,
566+
));
567+
let stream = loop {
568+
if let Ok(s) = tokio::net::TcpStream::connect(addr).await {
569+
break s;
570+
};
571+
sleep(Duration::from_millis(1)).await;
572+
};
573+
574+
let mut stream = connector.connect(dnsname, stream).await.unwrap();
575+
576+
stream.write_all(MSG.as_bytes()).await.unwrap();
577+
578+
// Trigger an EOF so that `read_to_string` in the acceptor task
579+
// completes.
580+
stream.shutdown().await.unwrap();
581+
582+
// Wait for the other side of the connection to receive and assert the
583+
// message
584+
let _ = done_rx.await;
585+
586+
handle.await.unwrap();
587+
}
508588
}

0 commit comments

Comments
 (0)