mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-04 05:51:34 +00:00
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>
61 lines
1.3 KiB
C
61 lines
1.3 KiB
C
/* 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();
|
|
}
|