blob: e4384cd5c7ce1f3865f65a13c5a4b2db5c555898 [file] [log] [blame]
/**
* 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());
}