xtest/perfs: fix option for random initialization of input buffers
Before this change, AES and SHA performance tests always filled
input buffers with random values, wherever option "-r" was set or
not.
This change allows the run SHA performance test with zero-initialized
input buffers or random-initialized input buffers.
This change allows the run AES performance test with zero-initialized
input buffers, random-initialized input buffers or with uninitialized
input buffers (which is quite handy when testing with input buffers
into SDP secure memory).
A new option is added in "xtest --aes-perf": argument "--not-inited"
specifies that input buffer does not need to be initialized.
Since the initialization of crypto test buffers can use several
configuration, this change clarifies then, renaming the macro
CRYPTO_NOT_RANDOM into CRYPTO_USE_ZEROS.
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
diff --git a/host/xtest/aes_perf.c b/host/xtest/aes_perf.c
index 59e6eaa..bbf4903 100644
--- a/host/xtest/aes_perf.c
+++ b/host/xtest/aes_perf.c
@@ -207,7 +207,7 @@
{
fprintf(stderr, "Usage: %s [-h]\n", progname);
fprintf(stderr, "Usage: %s [-d] [-i] [-k SIZE]", progname);
- fprintf(stderr, " [-l LOOP] [-m MODE] [-n LOOP] [-r] [-s SIZE]");
+ fprintf(stderr, " [-l LOOP] [-m MODE] [-n LOOP] [-r|--no-inited] [-s SIZE]");
fprintf(stderr, " [-v [-v]] [-w SEC]");
#ifdef CFG_SECURE_DATA_PATH
fprintf(stderr, " [--sdp [-Id|-Ir|-IR] [-Od|-Or|-OR] [--ion-heap ID]]");
@@ -223,7 +223,8 @@
fprintf(stderr, " -l LOOP Inner loop iterations (TA calls TEE_CipherUpdate() <x> times) [%u]\n", l);
fprintf(stderr, " -m MODE AES mode: ECB, CBC, CTR, XTS [%s]\n", mode_str(mode));
fprintf(stderr, " -n LOOP Outer test loop iterations [%u]\n", n);
- fprintf(stderr, " -r|--random Get input data from /dev/urandom (default: all-zeros)\n");
+ fprintf(stderr, " --not-inited Do not initialize input buffer content.\n");
+ fprintf(stderr, " -r|--random Get input data from /dev/urandom (default: all zeros)\n");
fprintf(stderr, " -s SIZE Test buffer size in bytes [%zu]\n", size);
fprintf(stderr, " -v Be verbose (use twice for greater effect)\n");
fprintf(stderr, " -w|--warmup SEC Warm-up time in seconds: execute a busy loop before\n");
@@ -405,17 +406,25 @@
return (1000000000/usec)*((double)size/(1024*1024));
}
-
-static void run_feed_input(void *in, size_t size, int random_in)
+static void feed_input(void *in, size_t size, int random)
{
- if (!random_in)
- return;
-
- if (!is_sdp_test)
+ if (random)
read_random(in, size);
+ else
+ memset(in, 0, size);
+}
+
+static void run_feed_input(void *in, size_t size, int random)
+{
+ if (!is_sdp_test) {
+ feed_input(in, size, random);
+ return;
+ }
#ifdef CFG_SECURE_DATA_PATH
- if (input_buffer != BUFFER_SHM_ALLOCATED) {
+ if (input_buffer == BUFFER_SHM_ALLOCATED) {
+ feed_input(in, size, random);
+ } else {
char *data = mmap(NULL, size, PROT_WRITE, MAP_SHARED,
input_sdp_fd, 0);
@@ -423,15 +432,16 @@
perror("failed to map input buffer");
exit(-1);
}
- read_random(data, size);
+ feed_input(data, size, random);
munmap(data, size);
}
#endif
}
+
/* Encryption test: buffer of tsize byte. Run test n times. */
void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
- unsigned int n, unsigned int l, int random_in,
+ unsigned int n, unsigned int l, int input_data_init,
int in_place, int warmup, int verbosity)
{
struct statistics stats;
@@ -458,22 +468,8 @@
memset(&stats, 0, sizeof(stats));
alloc_buffers(size, in_place, verbosity);
-
- if (input_buffer == BUFFER_SHM_ALLOCATED && !random_in)
- memset(in_shm.buffer, 0, size);
-#ifdef CFG_SECURE_DATA_PATH
- else {
- char *data = mmap(NULL, size, PROT_WRITE, MAP_SHARED,
- input_sdp_fd, 0);
-
- if (data == MAP_FAILED) {
- perror("failed to map input buffer");
- exit(-1);
- }
- memset(in_shm.buffer, 0, size);
- munmap(data, size);
- }
-#endif
+ if (input_data_init == CRYPTO_USE_ZEROS)
+ run_feed_input(in_shm.buffer, size, 0);
memset(&op, 0, sizeof(op));
/* Using INOUT to handle the case in_place == 1 */
@@ -488,7 +484,7 @@
verbose("Starting test: %s, %scrypt, keysize=%u bits, size=%zu bytes, ",
mode_str(mode), (decrypt ? "de" : "en"), keysize, size);
- verbose("random=%s, ", yesno(random_in));
+ verbose("random=%s, ", yesno(input_data_init == CRYPTO_USE_RANDOM));
verbose("in place=%s, ", yesno(in_place));
verbose("inner loops=%u, loops=%u, warm-up=%u s\n", l, n, warmup);
@@ -500,7 +496,8 @@
uint32_t ret_origin;
struct timespec t0, t1;
- run_feed_input(in_shm.buffer, size, random_in);
+ if (input_data_init == CRYPTO_USE_RANDOM)
+ run_feed_input(in_shm.buffer, size, 1);
get_current_time(&t0);
@@ -565,7 +562,7 @@
int keysize = AES_128; /* AES key size (-k) */
int mode = TA_AES_ECB; /* AES mode (-m) */
/* Get input data from /dev/urandom (-r) */
- int random_in = CRYPTO_USE_RANDOM;
+ int input_data_init = CRYPTO_USE_ZEROS;
/* Use same buffer for in and out (-i) */
int in_place = AES_PERF_INPLACE;
int warmup = CRYPTO_DEF_WARMUP; /* Start with a 2-second busy loop (-w) */
@@ -617,7 +614,19 @@
n = atoi(argv[i]);
} else if (!strcmp(argv[i], "--random") ||
!strcmp(argv[i], "-r")) {
- random_in = 1;
+ if (input_data_init == CRYPTO_NOT_INITED) {
+ perror("--random is not compatible with --not-inited\n");
+ usage(argv[0], keysize, mode, size, warmup, l, n);
+ return 1;
+ }
+ input_data_init = CRYPTO_USE_RANDOM;
+ } else if (!strcmp(argv[i], "--not-inited")) {
+ if (input_data_init == CRYPTO_USE_RANDOM) {
+ perror("--random is not compatible with --not-inited\n");
+ usage(argv[0], keysize, mode, size, warmup, l, n);
+ return 1;
+ }
+ input_data_init = CRYPTO_NOT_INITED;
} else if (!strcmp(argv[i], "-s")) {
NEXT_ARG(i);
size = atoi(argv[i]);
@@ -671,7 +680,7 @@
}
- aes_perf_run_test(mode, keysize, decrypt, size, n, l, random_in,
+ aes_perf_run_test(mode, keysize, decrypt, size, n, l, input_data_init,
in_place, warmup, verbosity);
return 0;
diff --git a/host/xtest/crypto_common.h b/host/xtest/crypto_common.h
index 096c27b..c686c84 100644
--- a/host/xtest/crypto_common.h
+++ b/host/xtest/crypto_common.h
@@ -38,8 +38,9 @@
#define CRYPTO_DEF_LOOPS 1 /* Default amount of inner loops */
+#define CRYPTO_USE_ZEROS 0 /* Init input data to zero */
#define CRYPTO_USE_RANDOM 1 /* Get input data from /dev/urandom */
-#define CRYPTO_NOT_RANDOM 0
+#define CRYPTO_NOT_INITED 2 /* Input data are not initialized */
#define CRYPTO_DEF_WARMUP 2 /* Start with a 2-second busy loop */
#define CRYPTO_DEF_COUNT 5000 /* Default number of measurements */
diff --git a/host/xtest/sha_perf.c b/host/xtest/sha_perf.c
index 85fa7cd..1f645f0 100644
--- a/host/xtest/sha_perf.c
+++ b/host/xtest/sha_perf.c
@@ -239,8 +239,9 @@
TEEC_Result res;
uint32_t ret_origin;
- if (random_in)
+ if (random_in == CRYPTO_USE_RANDOM)
read_random(in, size);
+
get_current_time(&t0);
res = TEEC_InvokeCommand(&sess, TA_SHA_PERF_CMD_PROCESS, op,
&ret_origin);
@@ -324,7 +325,7 @@
alloc_shm(size, algo, offset);
- if (!random_in)
+ if (random_in == CRYPTO_USE_ZEROS)
memset((uint8_t *)in_shm.buffer + offset, 0, size);
memset(&op, 0, sizeof(op));
@@ -342,7 +343,7 @@
verbose("Starting test: %s, size=%zu bytes, ",
algo_str(algo), size);
- verbose("random=%s, ", yesno(random_in));
+ verbose("random=%s, ", yesno(random_in == CRYPTO_USE_RANDOM));
verbose("unaligned=%s, ", yesno(offset));
verbose("inner loops=%u, loops=%u, warm-up=%u s\n", l, n, warmup);
@@ -411,7 +412,7 @@
int verbosity = CRYPTO_DEF_VERBOSITY; /* Verbosity (-v) */
int algo = TA_SHA_SHA1; /* Algorithm (-a) */
/* Get input data from /dev/urandom (-r) */
- int random_in = CRYPTO_USE_RANDOM;
+ int random_in = CRYPTO_USE_ZEROS;
/* Start with a 2-second busy loop (-w) */
int warmup = CRYPTO_DEF_WARMUP;
int offset = 0; /* Buffer offset wrt. alloc'ed address (-u) */
@@ -450,7 +451,7 @@
n = atoi(argv[i]);
} else if (!strcmp(argv[i], "--random") ||
!strcmp(argv[i], "-r")) {
- random_in = 1;
+ random_in = CRYPTO_USE_RANDOM;
} else if (!strcmp(argv[i], "-s")) {
NEXT_ARG(i);
size = atoi(argv[i]);