|
26 | 26 |
|
27 | 27 | #[macro_use] |
28 | 28 | extern crate log; |
| 29 | +extern crate alloc; |
| 30 | +extern crate anyhow; |
29 | 31 |
|
| 32 | +#[cfg(test)] |
| 33 | +use alloc::{boxed::Box, sync::Arc}; |
| 34 | +#[cfg(test)] |
| 35 | +use oak_remote_attestation::handshaker::{AttestationBehavior, ClientHandshaker, ServerHandshaker}; |
30 | 36 | use uefi::{ |
31 | 37 | prelude::*, |
32 | 38 | proto::console::serial::Serial, |
@@ -130,3 +136,84 @@ fn test_simple() { |
130 | 136 | let x = 1; |
131 | 137 | assert_eq!(x, 1); |
132 | 138 | } |
| 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