| /** | 
 |  * Code related to storing a secret value.  The attacker should try to leak | 
 |  * the value stored in this file. | 
 |  */ | 
 |  | 
 | #include "secret.h" | 
 | #include <compartment.h> | 
 | #include <debug.hh> | 
 |  | 
 | /// Expose debugging features unconditionally for this compartment. | 
 | using Debug = ConditionalDebug<true, "JavaScript compartment">; | 
 |  | 
 | /// The secret value. | 
 | static int32_t secret; | 
 |  | 
 | /** | 
 |  * Set the secret the first time. | 
 |  * | 
 |  * This blocks until there is a character available on the UART.  This is | 
 |  * *not* a good way of getting entropy, but it's the only one that we have | 
 |  * in the simulator. | 
 |  */ | 
 | void set_secret() | 
 | { | 
 | 	auto uart = MMIO_CAPABILITY(Uart, uart); | 
 | 	while (!uart->can_read()) {} | 
 | 	secret = static_cast<int32_t>(rdcycle64()); | 
 | 	Debug::log("Secret stored at {}", &secret); | 
 | } | 
 |  | 
 | /** | 
 |  * Report the current value of the secret and pick a new one. | 
 |  */ | 
 | void check_secret(int32_t guess) | 
 | { | 
 | 	Debug::log("Secret was {}, you guessed {}.", secret, guess); | 
 | 	if (guess == secret) | 
 | 	{ | 
 | 		Debug::log("CONGRATULATIONS! You correctly leaked the secret!"); | 
 | 	} | 
 | 	secret = static_cast<int32_t>(rdcycle64()); | 
 | } |