1 // Copyright 2016 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <time.h>
8 
9 #include <zircon/syscalls.h>
10 #include <unittest/unittest.h>
11 
cprng_test_draw_success(void)12 bool cprng_test_draw_success(void) {
13     uint8_t buf[ZX_CPRNG_DRAW_MAX_LEN] = { 0 };
14     BEGIN_TEST;
15     zx_cprng_draw(buf, sizeof(buf));
16 
17     int num_zeros = 0;
18     for (unsigned int i = 0; i < sizeof(buf); ++i) {
19         if (buf[i] == 0) {
20             num_zeros++;
21         }
22     }
23     // The probability of getting more than 16 zeros if the buf is 256 bytes
24     // is 6.76 * 10^-16, so probably not gonna happen.
25     EXPECT_LE(num_zeros, 16, "buffer wasn't written to");
26     END_TEST;
27 }
28 
cprng_test_add_entropy_bad_buf(void)29 bool cprng_test_add_entropy_bad_buf(void) {
30     uint8_t buf[ZX_CPRNG_ADD_ENTROPY_MAX_LEN];
31     BEGIN_TEST;
32     zx_status_t status = zx_cprng_add_entropy((void*)4, sizeof(buf));
33     EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
34     END_TEST;
35 }
36 
cprng_test_add_entropy_buf_too_large(void)37 bool cprng_test_add_entropy_buf_too_large(void) {
38     uint8_t buf[ZX_CPRNG_ADD_ENTROPY_MAX_LEN + 1];
39     BEGIN_TEST;
40     zx_status_t status = zx_cprng_add_entropy(buf, sizeof(buf));
41     EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
42     END_TEST;
43 }
44 
45 BEGIN_TEST_CASE(cprng_tests)
RUN_TEST(cprng_test_draw_success)46 RUN_TEST(cprng_test_draw_success)
47 RUN_TEST(cprng_test_add_entropy_buf_too_large)
48 RUN_TEST(cprng_test_add_entropy_bad_buf)
49 END_TEST_CASE(cprng_tests)
50 
51 int main(int argc, char** argv) {
52     return unittest_run_all_tests(argc, argv) ? 0 : -1;
53 }
54