Skip to content

Commit 0a9532d

Browse files
author
Juliette Pretot
committed
Add remote attestation test to the UEFI app
1 parent f7841d5 commit 0a9532d

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

experimental/uefi/app/Cargo.lock

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

experimental/uefi/app/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ uefi = { version = "*", features = ["exts"] }
1010
uefi-services = "*"
1111
log = { version = "*" }
1212
oak_remote_attestation = { path = "../../../remote_attestation/rust" }
13+
anyhow = { version = "*", default-features = false }
1314

1415
[dev-dependencies]
1516
uefi-services = { version = "*", features = ["qemu"] }

experimental/uefi/app/src/main.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@
2626

2727
#[macro_use]
2828
extern crate log;
29+
extern crate alloc;
30+
extern crate anyhow;
2931

32+
#[cfg(test)]
33+
use alloc::{boxed::Box, sync::Arc};
34+
#[cfg(test)]
35+
use oak_remote_attestation::handshaker::{AttestationBehavior, ClientHandshaker, ServerHandshaker};
3036
use uefi::{
3137
prelude::*,
3238
proto::console::serial::Serial,
@@ -130,3 +136,84 @@ fn test_simple() {
130136
let x = 1;
131137
assert_eq!(x, 1);
132138
}
139+
140+
#[cfg(test)]
141+
const TEE_MEASUREMENT: &str = "Test TEE measurement";
142+
#[cfg(test)]
143+
const DATA: [u8; 10] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
144+
145+
#[cfg(test)]
146+
fn create_handshakers() -> (ClientHandshaker, ServerHandshaker) {
147+
let bidirectional_attestation =
148+
AttestationBehavior::create_bidirectional_attestation(&[], TEE_MEASUREMENT.as_bytes())
149+
.unwrap();
150+
let client_handshaker = ClientHandshaker::new(
151+
bidirectional_attestation,
152+
Box::new(|server_identity| {
153+
if !server_identity.additional_info.is_empty() {
154+
Ok(())
155+
} else {
156+
anyhow::bail!("No additional info provided.")
157+
}
158+
}),
159+
);
160+
161+
let bidirectional_attestation =
162+
AttestationBehavior::create_bidirectional_attestation(&[], TEE_MEASUREMENT.as_bytes())
163+
.unwrap();
164+
165+
let additional_info = br"Additional Info".to_vec();
166+
let server_handshaker =
167+
ServerHandshaker::new(bidirectional_attestation, Arc::new(additional_info));
168+
169+
(client_handshaker, server_handshaker)
170+
}
171+
172+
#[test_case]
173+
fn test_handshake() {
174+
let (mut client_handshaker, mut server_handshaker) = create_handshakers();
175+
176+
let client_hello = client_handshaker
177+
.create_client_hello()
178+
.expect("Couldn't create client hello message");
179+
180+
let server_identity = server_handshaker
181+
.next_step(&client_hello)
182+
.expect("Couldn't process client hello message")
183+
.expect("Empty server identity message");
184+
185+
let client_identity = client_handshaker
186+
.next_step(&server_identity)
187+
.expect("Couldn't process server identity message")
188+
.expect("Empty client identity message");
189+
assert!(client_handshaker.is_completed());
190+
191+
let result = server_handshaker
192+
.next_step(&client_identity)
193+
.expect("Couldn't process client identity message");
194+
assert_eq!(result, None);
195+
assert!(server_handshaker.is_completed());
196+
197+
let mut client_encryptor = client_handshaker
198+
.get_encryptor()
199+
.expect("Couldn't get client encryptor");
200+
let mut server_encryptor = server_handshaker
201+
.get_encryptor()
202+
.expect("Couldn't get server encryptor");
203+
204+
let encrypted_client_data = client_encryptor
205+
.encrypt(&DATA)
206+
.expect("Couldn't encrypt client data");
207+
let decrypted_client_data = server_encryptor
208+
.decrypt(&encrypted_client_data)
209+
.expect("Couldn't decrypt client data");
210+
assert_eq!(decrypted_client_data, DATA);
211+
212+
let encrypted_server_data = server_encryptor
213+
.encrypt(&DATA)
214+
.expect("Couldn't encrypt server data");
215+
let decrypted_server_data = client_encryptor
216+
.decrypt(&encrypted_server_data)
217+
.expect("Couldn't decrypt server data");
218+
assert_eq!(decrypted_server_data, DATA);
219+
}

0 commit comments

Comments
 (0)