Skip to content

Commit 18f8ad9

Browse files
authored
Merge pull request #139 from flashbots/peg/additional-logging
Add additional logging of remote measurements at the point of connecting or accepting connection
2 parents b5ff02f + 1a9d3cf commit 18f8ad9

2 files changed

Lines changed: 72 additions & 2 deletions

File tree

attested-tls/src/attestation/measurements.rs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Measurements and policy for enforcing them when validating a remote attestation
22
use crate::attestation::{dcap::DcapVerificationError, AttestationError, AttestationType};
33
use std::{collections::HashMap, path::PathBuf};
4+
use std::{fmt, fmt::Formatter};
45

56
use dcap_qvl::quote::Report;
67
use http::{header::InvalidHeaderValue, HeaderValue};
@@ -34,13 +35,63 @@ impl TryFrom<u8> for DcapMeasurementRegister {
3435
}
3536

3637
/// Represents a set of measurements values for one of the supported CVM platforms
37-
#[derive(Debug, Clone, PartialEq)]
38+
#[derive(Clone, PartialEq)]
3839
pub enum MultiMeasurements {
3940
Dcap(HashMap<DcapMeasurementRegister, [u8; 48]>),
4041
Azure(HashMap<u32, [u8; 32]>),
4142
NoAttestation,
4243
}
4344

45+
impl fmt::Debug for MultiMeasurements {
46+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
47+
match self {
48+
Self::Dcap(measurements) => f
49+
.debug_tuple("Dcap")
50+
.field(&DcapHexDebug(measurements))
51+
.finish(),
52+
Self::Azure(measurements) => f
53+
.debug_tuple("Azure")
54+
.field(&AzureHexDebug(measurements))
55+
.finish(),
56+
Self::NoAttestation => f.write_str("NoAttestation"),
57+
}
58+
}
59+
}
60+
61+
/// Used to display measurements as hex
62+
struct DcapHexDebug<'a>(&'a HashMap<DcapMeasurementRegister, [u8; 48]>);
63+
64+
impl fmt::Debug for DcapHexDebug<'_> {
65+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
66+
let mut entries: Vec<_> = self.0.iter().collect();
67+
entries.sort_by_key(|(register, _)| (*register).clone() as u8);
68+
69+
let mut map = f.debug_map();
70+
for (register, value) in entries {
71+
let hex_value = hex::encode(value);
72+
map.entry(register, &hex_value);
73+
}
74+
map.finish()
75+
}
76+
}
77+
78+
/// Used to display measurements as hex
79+
struct AzureHexDebug<'a>(&'a HashMap<u32, [u8; 32]>);
80+
81+
impl fmt::Debug for AzureHexDebug<'_> {
82+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
83+
let mut entries: Vec<_> = self.0.iter().collect();
84+
entries.sort_by_key(|(index, _)| **index);
85+
86+
let mut map = f.debug_map();
87+
for (index, value) in entries {
88+
let hex_value = hex::encode(value);
89+
map.entry(index, &hex_value);
90+
}
91+
map.finish()
92+
}
93+
}
94+
4495
/// Expected measurement values for policy enforcement
4596
#[derive(Debug, Clone, PartialEq)]
4697
pub enum ExpectedMeasurements {
@@ -749,4 +800,22 @@ mod tests {
749800
]));
750801
assert!(policy.check_measurement(&measurements3).is_err());
751802
}
803+
804+
#[test]
805+
fn test_multi_measurements_debug_prints_hex() {
806+
let dcap = MultiMeasurements::Dcap(HashMap::from([(
807+
DcapMeasurementRegister::MRTD,
808+
[0xabu8; 48],
809+
)]));
810+
let dcap_debug = format!("{dcap:?}");
811+
assert!(dcap_debug.contains("Dcap"));
812+
assert!(dcap_debug.contains("abababab"));
813+
assert!(!dcap_debug.contains("[171"));
814+
815+
let azure = MultiMeasurements::Azure(HashMap::from([(9u32, [0x11u8; 32])]));
816+
let azure_debug = format!("{azure:?}");
817+
assert!(azure_debug.contains("Azure"));
818+
assert!(azure_debug.contains("11111111"));
819+
assert!(!azure_debug.contains("[17"));
820+
}
752821
}

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ impl ProxyServer {
195195
target: String,
196196
client_addr: SocketAddr,
197197
) -> Result<(), ProxyError> {
198-
debug!("[proxy-server] accepted connection");
198+
debug!("[proxy-server] accepted connection with measurements: {measurements:?}");
199199

200200
let http_version = HttpVersion::from_negotiated_protocol_server(&tls_stream);
201201

@@ -629,6 +629,7 @@ impl ProxyClient {
629629
ProxyError,
630630
> {
631631
let (tls_stream, measurements, remote_attestation_type) = inner.connect_tcp(target).await?;
632+
debug!("[proxy-client] Connected to proxy server with measurements: {measurements:?}");
632633

633634
// The attestation exchange is now complete - setup an HTTP client
634635
let http_version = HttpVersion::from_negotiated_protocol_client(&tls_stream);

0 commit comments

Comments
 (0)