#include #include #include #include #include #include /* * 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; } }