blob: 983e5485e774e38ec2374de01cb589ad874a0a40 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <zircon/syscalls.h>
#include <unittest/unittest.h>
bool cprng_test_draw_buf_too_large(void) {
uint8_t buf[ZX_CPRNG_DRAW_MAX_LEN + 1];
BEGIN_TEST;
size_t sz;
zx_status_t status = zx_cprng_draw(buf, sizeof(buf), &sz);
EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
END_TEST;
}
bool cprng_test_draw_bad_buf(void) {
uint8_t buf[ZX_CPRNG_DRAW_MAX_LEN];
BEGIN_TEST;
size_t sz;
zx_status_t status = zx_cprng_draw((void*)4, sizeof(buf), &sz);
EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
END_TEST;
}
bool cprng_test_draw_success(void) {
uint8_t buf[ZX_CPRNG_DRAW_MAX_LEN] = { 0 };
BEGIN_TEST;
size_t sz;
zx_status_t status = zx_cprng_draw(buf, sizeof(buf), &sz);
EXPECT_EQ(status, ZX_OK, "");
EXPECT_EQ(sz, sizeof(buf), "");
int num_zeros = 0;
for (unsigned int i = 0; i < sizeof(buf); ++i) {
if (buf[i] == 0) {
num_zeros++;
}
}
// The probability of getting more than 16 zeros if the buf is 256 bytes
// is 6.76 * 10^-16, so probably not gonna happen.
EXPECT_LE(num_zeros, 16, "buffer wasn't written to");
END_TEST;
}
bool cprng_test_add_entropy_bad_buf(void) {
uint8_t buf[ZX_CPRNG_ADD_ENTROPY_MAX_LEN];
BEGIN_TEST;
zx_status_t status = zx_cprng_add_entropy((void*)4, sizeof(buf));
EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
END_TEST;
}
bool cprng_test_add_entropy_buf_too_large(void) {
uint8_t buf[ZX_CPRNG_ADD_ENTROPY_MAX_LEN + 1];
BEGIN_TEST;
zx_status_t status = zx_cprng_add_entropy(buf, sizeof(buf));
EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
END_TEST;
}
BEGIN_TEST_CASE(cprng_tests)
RUN_TEST(cprng_test_draw_buf_too_large)
RUN_TEST(cprng_test_draw_bad_buf)
RUN_TEST(cprng_test_draw_success)
RUN_TEST(cprng_test_add_entropy_buf_too_large)
RUN_TEST(cprng_test_add_entropy_bad_buf)
END_TEST_CASE(cprng_tests)
int main(int argc, char** argv) {
return unittest_run_all_tests(argc, argv) ? 0 : -1;
}