os161/kern/test/lib.c
Scott Haseley 01f2d3ea2c Added ksecprintf for securely printing messages from the kernel.
If SECRET_TESTING is defined, the function will compute and print
a salt value and the hmac/sha256 hash of the message, which can be
verified from the test161 server.
2016-02-11 01:30:33 -05:00

79 lines
1.5 KiB
C

#include <kern/secret.h>
#include <types.h>
#include <thread.h>
#include <test.h>
#include <lib.h>
#include <kern/secure.h>
/*
* Common success function for kernel tests. If SECRET_TESTING is defined,
* ksecprintf will compute the hmac/sha256 hash of any message using the
* shared secret and a random salt value. The (secure) server also knows
* the secret and can verify the message was generated by a trusted source.
* The salt value prevents against replay attacks.
*/
int
success(bool status, const char * secret, const char * name) {
if (status == SUCCESS) {
return ksecprintf(secret, "SUCCESS", name);
} else {
return ksecprintf(secret, "FAIL", name);
}
}
#ifndef SECRET_TESTING
int
ksecprintf(const char * secret, const char * msg, const char * name)
{
(void)secret;
return kprintf("%s: %s\n", name, msg);
}
#else
int
ksecprintf(const char * secret, const char * msg, const char * name)
{
char *hash;
char *salt;
int res;
res = hmac_salted(msg, strlen(msg), secret, strlen(secret), &hash, &salt);
if (res)
return -res;
res = kprintf("(%s, %s, %s, %s: %s)\n", name, hash, salt, name, msg);
kfree(hash);
kfree(salt);
return res;
}
#endif
/*
* Helper functions used by testing and problem driver code
* to establish better mixtures of threads.
*/
void
random_yielder(uint32_t max_yield_count)
{
uint32_t i;
for (i = 0; i < random() % max_yield_count; i++) {
thread_yield();
}
}
void
random_spinner(uint32_t max_spin_count)
{
uint32_t i;
volatile int spin;
for (i = 0; i < random() % max_spin_count; i++) {
spin += i;
}
}