Skip to content

Commit c4b846c

Browse files
committed
Fix dummy server
1 parent 3392f22 commit c4b846c

File tree

6 files changed

+59
-54
lines changed

6 files changed

+59
-54
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
${{ runner.os }}-cargo-
3434
3535
- name: Run cargo clippy
36-
run: cargo clippy -- -D warnings
36+
run: cargo clippy --workspace -- -D warnings
3737

3838
- name: Run cargo test
39-
run: cargo test
39+
run: cargo test --workspace --all-targets

Cargo.lock

Lines changed: 0 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dummy-attestation-server/Cargo.toml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,15 @@ publish = false
99
attested-tls-proxy = { path = ".." }
1010
tokio = { version = "1.48.0", features = ["full"] }
1111
axum = "0.8.6"
12-
tokio-rustls = { version = "0.26.4", default-features = false, features = ["ring"] }
1312
thiserror = "2.0.17"
1413
clap = { version = "4.5.51", features = ["derive", "env"] }
15-
webpki-roots = "1.0.4"
16-
rustls-pemfile = "2.2.0"
1714
anyhow = "1.0.100"
1815
configfs-tsm = "0.0.2"
1916
hex = "0.4.3"
2017
serde_json = "1.0.145"
2118
serde = "1.0.228"
2219
tracing = "0.1.41"
2320
tracing-subscriber = { version = "0.3.20", features = ["env-filter", "json"] }
24-
rcgen = "0.14.5"
2521
parity-scale-codec = "3.7.5"
2622
reqwest = { version = "0.12.23", default-features = false }
2723

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
1-
use std::{
2-
net::{IpAddr, SocketAddr},
3-
sync::Arc,
4-
};
1+
use std::net::SocketAddr;
52

6-
use attested_tls_proxy::{attestation::AttestationExchangeMessage, QuoteGenerator};
3+
use attested_tls_proxy::attestation::{
4+
AttestationExchangeMessage, AttestationGenerator, AttestationVerifier,
5+
};
76
use axum::{
87
extract::{Path, State},
98
http::StatusCode,
109
response::{IntoResponse, Response},
1110
};
1211
use parity_scale_codec::{Decode, Encode};
1312
use tokio::net::TcpListener;
14-
use tokio_rustls::rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer};
1513

1614
#[derive(Clone)]
1715
struct SharedState {
18-
attestation_generator: Arc<dyn QuoteGenerator>,
16+
attestation_generator: AttestationGenerator,
1917
}
2018

2119
pub async fn dummy_attestation_server(
2220
listener: TcpListener,
23-
attestation_generator: Arc<dyn QuoteGenerator>,
21+
attestation_generator: AttestationGenerator,
2422
) -> anyhow::Result<SocketAddr> {
2523
let addr = listener.local_addr()?;
2624

@@ -41,20 +39,21 @@ async fn get_attest(
4139
State(shared_state): State<SharedState>,
4240
Path(input_data): Path<String>,
4341
) -> Result<(StatusCode, Vec<u8>), ServerError> {
44-
let (cert_chain, _) = generate_certificate_chain("0.0.0.0".parse().unwrap());
4542
let input_data: [u8; 64] = hex::decode(input_data).unwrap().try_into().unwrap();
4643

47-
let attestation = AttestationExchangeMessage::from_attestation_generator(
48-
&cert_chain,
49-
input_data[..32].try_into().unwrap(),
50-
shared_state.attestation_generator,
51-
)?
52-
.encode();
44+
let attestation = shared_state
45+
.attestation_generator
46+
.generate_attestation(input_data)
47+
.await?
48+
.encode();
5349

5450
Ok((StatusCode::OK, attestation))
5551
}
5652

57-
pub async fn dummy_attestation_client(server_addr: SocketAddr) -> anyhow::Result<()> {
53+
pub async fn dummy_attestation_client(
54+
server_addr: SocketAddr,
55+
attestation_verifier: AttestationVerifier,
56+
) -> anyhow::Result<AttestationExchangeMessage> {
5857
let input_data = [0; 64];
5958
let response = reqwest::get(format!(
6059
"http://{server_addr}/attest/{}",
@@ -68,10 +67,14 @@ pub async fn dummy_attestation_client(server_addr: SocketAddr) -> anyhow::Result
6867

6968
let remote_attestation_message = AttestationExchangeMessage::decode(&mut &response[..])?;
7069
let remote_attestation_type = remote_attestation_message.attestation_type;
71-
println!("{remote_attestation_type}");
7270

73-
// TODO validate the attestation
74-
Ok(())
71+
println!("Remote attestation type: {remote_attestation_type}");
72+
73+
attestation_verifier
74+
.verify_attestation(remote_attestation_message.clone(), input_data)
75+
.await?;
76+
77+
Ok(remote_attestation_message)
7578
}
7679

7780
struct ServerError(pub anyhow::Error);
@@ -92,24 +95,6 @@ impl IntoResponse for ServerError {
9295
}
9396
}
9497

95-
/// Helper to generate a self-signed certificate for testing
96-
fn generate_certificate_chain(
97-
ip: IpAddr,
98-
) -> (Vec<CertificateDer<'static>>, PrivateKeyDer<'static>) {
99-
let mut params = rcgen::CertificateParams::new(vec![]).unwrap();
100-
params.subject_alt_names.push(rcgen::SanType::IpAddress(ip));
101-
params
102-
.distinguished_name
103-
.push(rcgen::DnType::CommonName, ip.to_string());
104-
105-
let keypair = rcgen::KeyPair::generate().unwrap();
106-
let cert = params.self_signed(&keypair).unwrap();
107-
108-
let certs = vec![CertificateDer::from(cert)];
109-
let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(keypair.serialize_der()));
110-
(certs, key)
111-
}
112-
11398
#[cfg(test)]
11499
mod tests {
115100

@@ -119,13 +104,17 @@ mod tests {
119104

120105
#[tokio::test]
121106
async fn test_dummy_server() {
122-
let attestation_generator = AttestationType::None.get_quote_generator().unwrap();
107+
let attestation_generator = AttestationGenerator {
108+
attestation_type: AttestationType::None,
109+
};
123110

124111
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
125112
let server_addr = listener.local_addr().unwrap();
126113
dummy_attestation_server(listener, attestation_generator)
127114
.await
128115
.unwrap();
129-
dummy_attestation_client(server_addr).await.unwrap();
116+
dummy_attestation_client(server_addr, AttestationVerifier::do_not_verify())
117+
.await
118+
.unwrap();
130119
}
131120
}

dummy-attestation-server/src/main.rs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
use attested_tls_proxy::attestation::AttestationType;
1+
use attested_tls_proxy::attestation::{
2+
measurements::get_measurements_from_file, AttestationGenerator, AttestationType,
3+
AttestationVerifier,
4+
};
25
use clap::{Parser, Subcommand};
36
use dummy_attestation_server::{dummy_attestation_client, dummy_attestation_server};
4-
use std::net::SocketAddr;
7+
use std::{net::SocketAddr, path::PathBuf};
58
use tokio::net::TcpListener;
69
use tracing::level_filters::LevelFilter;
710

@@ -30,6 +33,9 @@ enum CliCommand {
3033
Client {
3134
/// Socket address of a dummy attestation server
3235
server_addr: SocketAddr,
36+
/// Optional path to file containing JSON measurements to be enforced on the server
37+
#[arg(long, env = "SERVER_MEASUREMENTS")]
38+
server_measurements: Option<PathBuf>,
3339
},
3440
}
3541

@@ -64,12 +70,30 @@ async fn main() -> anyhow::Result<()> {
6470
serde_json::Value::String(server_attestation_type.unwrap_or("none".to_string())),
6571
)?;
6672

67-
let attestation_generator = server_attestation_type.get_quote_generator()?;
73+
let attestation_generator = AttestationGenerator {
74+
attestation_type: server_attestation_type,
75+
};
6876

6977
let listener = TcpListener::bind(listen_addr).await?;
7078
dummy_attestation_server(listener, attestation_generator).await?;
7179
}
72-
CliCommand::Client { server_addr } => dummy_attestation_client(server_addr).await?,
80+
CliCommand::Client {
81+
server_addr,
82+
server_measurements,
83+
} => {
84+
let attestation_verifier = match server_measurements {
85+
Some(server_measurements) => AttestationVerifier {
86+
accepted_measurements: get_measurements_from_file(server_measurements).await?,
87+
pccs_url: None,
88+
},
89+
None => AttestationVerifier::do_not_verify(),
90+
};
91+
92+
let attestation_message =
93+
dummy_attestation_client(server_addr, attestation_verifier).await?;
94+
95+
println!("{attestation_message:?}")
96+
}
7397
}
7498

7599
Ok(())

src/attestation/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use tdx_quote::QuoteParseError;
1515
use thiserror::Error;
1616

1717
/// This is the type sent over the channel to provide an attestation
18-
#[derive(Debug, Serialize, Deserialize, Encode, Decode)]
18+
#[derive(Clone, Debug, Serialize, Deserialize, Encode, Decode)]
1919
pub struct AttestationExchangeMessage {
2020
/// What CVM platform is used (including none)
2121
pub attestation_type: AttestationType,

0 commit comments

Comments
 (0)