diff options
author | Nicolas Boichat <drinkcat@google.com> | 2017-05-31 12:12:12 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-06-06 08:52:16 -0700 |
commit | 39db721f9ace13cc210278c88c3f364b5d67b5b8 (patch) | |
tree | 6a0ca910942bf8c41560e91b73a8a58d04bc146c /test | |
parent | 2f436f4cc9bd026ed83511401ab17d68f5f8e5a3 (diff) | |
download | chrome-ec-39db721f9ace13cc210278c88c3f364b5d67b5b8.tar.gz |
hammer: Add board_get_entropy function (and test)
This function will be used to generate some entropy using the
Clock Recovery System.
BRANCH=none
BUG=b:38486828
TEST=make BOARD=hammer -j tests
./util/flash_ec --board=hammer --image=build/hammer/test-entropy.bin
EC console: runtest
TEST=Test fails when no USB connection is active
TEST=Test passes when USB connection is active
TEST=Pasting the values into:
tr ';' '\n' | awk 'BEGIN { e = 0; tot=16384.0 }
{ p = $1/tot; if (p > 0) { e -= p*log(p)/log(2) } }
END { print e }'
shows an entropy > 4 bits per sample.
Change-Id: I2363c7bce42c72c33ef0bf3f099d709ee9c13d13
Reviewed-on: https://chromium-review.googlesource.com/518608
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/build.mk | 3 | ||||
-rw-r--r-- | test/entropy.c | 60 | ||||
-rw-r--r-- | test/entropy.tasklist | 17 |
3 files changed, 80 insertions, 0 deletions
diff --git a/test/build.mk b/test/build.mk index b92e263e8f..807d0f57b7 100644 --- a/test/build.mk +++ b/test/build.mk @@ -12,6 +12,8 @@ test-list-y=pingpong timer_calib timer_dos timer_jump mutex utils utils_str test-list-$(BOARD_BDS)+= test-list-$(BOARD_PIT)+=kb_scan stress +test-list-$(BOARD_HAMMER)+=entropy + # Samus has board-specific chipset code, and the tests don't # compile with it. Disable them for now. test-list-$(BOARD_SAMUS)= @@ -85,6 +87,7 @@ charge_manager-y=charge_manager.o charge_manager_drp_charging-y=charge_manager.o charge_ramp-y+=charge_ramp.o console_edit-y=console_edit.o +entropy-y=entropy.o extpwr_gpio-y=extpwr_gpio.o fan-y=fan.o flash-y=flash.o diff --git a/test/entropy.c b/test/entropy.c new file mode 100644 index 0000000000..f01a3dd0a0 --- /dev/null +++ b/test/entropy.c @@ -0,0 +1,60 @@ +/* Copyright 2017 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Tests entropy source. + */ + +#include "console.h" +#include "common.h" +#include "rollback.h" +#include "test_util.h" +#include "timer.h" +#include "util.h" +#include "watchdog.h" + +static int buckets[256]; + +void run_test(void) +{ + const int loopcount = 512; + + uint8_t buffer[32]; + timestamp_t t0, t1; + int i, j; + + memset(buckets, 0, sizeof(buckets)); + + for (i = 0; i < loopcount; i++) { + t0 = get_time(); + if (!board_get_entropy(buffer, sizeof(buffer))) { + ccprintf("Cannot get entropy\n"); + test_fail(); + return; + } + t1 = get_time(); + if (i == 0) + ccprintf("Got %d bytes in %ld us\n", + sizeof(buffer), t1.val - t0.val); + + for (j = 0; j < sizeof(buffer); j++) + buckets[buffer[j]]++; + + watchdog_reload(); + } + + ccprintf("Total count: %d\n", loopcount * sizeof(buffer)); + ccprintf("Buckets: "); + for (j = 0; j < 256; j++) { + ccprintf("%d;", buckets[j]); + cflush(); + } + ccprintf("\n"); + /* + * From the data above, entropy can be obtained with this command: + * tr ';' '\n' | awk 'BEGIN { e = 0; tot=16384.0 } + { p = $1/tot; if (p > 0) { e -= p*log(p)/log(2) } } + END { print e }' + */ + test_pass(); +} diff --git a/test/entropy.tasklist b/test/entropy.tasklist new file mode 100644 index 0000000000..e76178ba0a --- /dev/null +++ b/test/entropy.tasklist @@ -0,0 +1,17 @@ +/* Copyright 2017 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** + * List of enabled tasks in the priority order + * + * The first one has the lowest priority. + * + * For each task, use the macro TASK_TEST(n, r, d, s) where : + * 'n' in the name of the task + * 'r' in the main routine of the task + * 'd' in an opaque parameter passed to the routine at startup + * 's' is the stack size in bytes; must be a multiple of 8 + */ +#define CONFIG_TEST_TASK_LIST |