aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJerome Forissier2018-03-08 03:36:37 -0600
committerJérôme Forissier2019-01-14 04:17:13 -0600
commita410edbe61415501b11718d4b364a3ed8faa6e79 (patch)
tree867c8928ef4d672729910724c5a8f95f0a0a6d89
parent5401161c93cedaba594e297951bbdf2553668d02 (diff)
downloadti-optee-test-a410edbe61415501b11718d4b364a3ed8faa6e79.tar.gz
ti-optee-test-a410edbe61415501b11718d4b364a3ed8faa6e79.tar.xz
ti-optee-test-a410edbe61415501b11718d4b364a3ed8faa6e79.zip
xtest --aes-perf: add -u option to process buffer in several steps
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> Suggested-by: Tetsuya Yoshizaki <yoshizaki.tetsuya@socionext.com> Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
-rw-r--r--host/xtest/aes_perf.c41
-rw-r--r--host/xtest/benchmark_2000.c12
-rw-r--r--host/xtest/crypto_common.h5
-rw-r--r--ta/aes_perf/ta_aes_perf.c32
4 files changed, 56 insertions, 34 deletions
diff --git a/host/xtest/aes_perf.c b/host/xtest/aes_perf.c
index c5902a3..3484270 100644
--- a/host/xtest/aes_perf.c
+++ b/host/xtest/aes_perf.c
@@ -204,8 +204,8 @@ static const char *mode_str(uint32_t mode)
204#define _TO_STR(x) #x 204#define _TO_STR(x) #x
205#define TO_STR(x) _TO_STR(x) 205#define TO_STR(x) _TO_STR(x)
206 206
207static void usage(const char *progname, int keysize, int mode, 207static void usage(const char *progname, int keysize, int mode, size_t size,
208 size_t size, int warmup, unsigned int l, unsigned int n) 208 size_t unit, int warmup, unsigned int l, unsigned int n)
209{ 209{
210 fprintf(stderr, "Usage: %s [-h]\n", progname); 210 fprintf(stderr, "Usage: %s [-h]\n", progname);
211 fprintf(stderr, "Usage: %s [-d] [-i] [-k SIZE]", progname); 211 fprintf(stderr, "Usage: %s [-d] [-i] [-k SIZE]", progname);
@@ -222,12 +222,14 @@ static void usage(const char *progname, int keysize, int mode,
222 fprintf(stderr, " -h|--help Print this help and exit\n"); 222 fprintf(stderr, " -h|--help Print this help and exit\n");
223 fprintf(stderr, " -i|--in-place Use same buffer for input and output (decrypt in place)\n"); 223 fprintf(stderr, " -i|--in-place Use same buffer for input and output (decrypt in place)\n");
224 fprintf(stderr, " -k SIZE Key size in bits: 128, 192 or 256 [%u]\n", keysize); 224 fprintf(stderr, " -k SIZE Key size in bits: 128, 192 or 256 [%u]\n", keysize);
225 fprintf(stderr, " -l LOOP Inner loop iterations (TA calls TEE_CipherUpdate() <x> times) [%u]\n", l); 225 fprintf(stderr, " -l LOOP Inner loop iterations [%u]\n", l);
226 fprintf(stderr, " -m MODE AES mode: ECB, CBC, CTR, XTS, GCM [%s]\n", mode_str(mode)); 226 fprintf(stderr, " -m MODE AES mode: ECB, CBC, CTR, XTS, GCM [%s]\n", mode_str(mode));
227 fprintf(stderr, " -n LOOP Outer test loop iterations [%u]\n", n); 227 fprintf(stderr, " -n LOOP Outer test loop iterations [%u]\n", n);
228 fprintf(stderr, " --not-inited Do not initialize input buffer content.\n"); 228 fprintf(stderr, " --not-inited Do not initialize input buffer content.\n");
229 fprintf(stderr, " -r|--random Get input data from /dev/urandom (default: all zeros)\n"); 229 fprintf(stderr, " -r|--random Get input data from /dev/urandom (default: all zeros)\n");
230 fprintf(stderr, " -s SIZE Test buffer size in bytes [%zu]\n", size); 230 fprintf(stderr, " -s SIZE Test buffer size in bytes [%zu]\n", size);
231 fprintf(stderr, " -u UNIT Divide buffer in UNIT-byte increments (+ remainder)\n");
232 fprintf(stderr, " (0 to ignore) [%zu]\n", unit);
231 fprintf(stderr, " -v Be verbose (use twice for greater effect)\n"); 233 fprintf(stderr, " -v Be verbose (use twice for greater effect)\n");
232 fprintf(stderr, " -w|--warmup SEC Warm-up time in seconds: execute a busy loop before\n"); 234 fprintf(stderr, " -w|--warmup SEC Warm-up time in seconds: execute a busy loop before\n");
233 fprintf(stderr, " the test to mitigate the effects of cpufreq etc. [%u]\n", warmup); 235 fprintf(stderr, " the test to mitigate the effects of cpufreq etc. [%u]\n", warmup);
@@ -441,8 +443,7 @@ static void run_feed_input(void *in, size_t size, int random)
441} 443}
442 444
443 445
444/* Encryption test: buffer of tsize byte. Run test n times. */ 446void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size, size_t unit,
445void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
446 unsigned int n, unsigned int l, int input_data_init, 447 unsigned int n, unsigned int l, int input_data_init,
447 int in_place, int warmup, int verbosity) 448 int in_place, int warmup, int verbosity)
448{ 449{
@@ -493,12 +494,14 @@ void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
493 op.params[1].memref.parent = in_place ? &in_shm : &out_shm; 494 op.params[1].memref.parent = in_place ? &in_shm : &out_shm;
494 op.params[1].memref.size = size; 495 op.params[1].memref.size = size;
495 op.params[2].value.a = l; 496 op.params[2].value.a = l;
497 op.params[2].value.b = unit;
496 498
497 verbose("Starting test: %s, %scrypt, keysize=%u bits, size=%zu bytes, ", 499 verbose("Starting test: %s, %scrypt, keysize=%u bits, size=%zu bytes, ",
498 mode_str(mode), (decrypt ? "de" : "en"), keysize, size); 500 mode_str(mode), (decrypt ? "de" : "en"), keysize, size);
499 verbose("random=%s, ", yesno(input_data_init == CRYPTO_USE_RANDOM)); 501 verbose("random=%s, ", yesno(input_data_init == CRYPTO_USE_RANDOM));
500 verbose("in place=%s, ", yesno(in_place)); 502 verbose("in place=%s, ", yesno(in_place));
501 verbose("inner loops=%u, loops=%u, warm-up=%u s\n", l, n, warmup); 503 verbose("inner loops=%u, loops=%u, warm-up=%u s, ", l, n, warmup);
504 verbose("unit=%zu\n", unit);
502 505
503 if (warmup) 506 if (warmup)
504 do_warmup(warmup); 507 do_warmup(warmup);
@@ -558,6 +561,8 @@ void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
558 } \ 561 } \
559 } while (0); 562 } while (0);
560 563
564#define USAGE() usage(argv[0], keysize, mode, size, unit, warmup, l, n)
565
561int aes_perf_runner_cmd_parser(int argc, char *argv[]) 566int aes_perf_runner_cmd_parser(int argc, char *argv[])
562{ 567{
563 int i; 568 int i;
@@ -567,6 +572,7 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
567 */ 572 */
568 573
569 size_t size = 1024; /* Buffer size (-s) */ 574 size_t size = 1024; /* Buffer size (-s) */
575 size_t unit = CRYPTO_DEF_UNIT_SIZE; /* Divide buffer (-u) */
570 unsigned int n = CRYPTO_DEF_COUNT; /*Number of measurements (-n)*/ 576 unsigned int n = CRYPTO_DEF_COUNT; /*Number of measurements (-n)*/
571 unsigned int l = CRYPTO_DEF_LOOPS; /* Inner loops (-l) */ 577 unsigned int l = CRYPTO_DEF_LOOPS; /* Inner loops (-l) */
572 int verbosity = CRYPTO_DEF_VERBOSITY; /* Verbosity (-v) */ 578 int verbosity = CRYPTO_DEF_VERBOSITY; /* Verbosity (-v) */
@@ -582,7 +588,7 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
582 /* Parse command line */ 588 /* Parse command line */
583 for (i = 1; i < argc; i++) { 589 for (i = 1; i < argc; i++) {
584 if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { 590 if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
585 usage(argv[0], keysize, mode, size, warmup, l, n); 591 USAGE();
586 return 0; 592 return 0;
587 } 593 }
588 } 594 }
@@ -599,7 +605,7 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
599 keysize != AES_256) { 605 keysize != AES_256) {
600 fprintf(stderr, "%s: invalid key size\n", 606 fprintf(stderr, "%s: invalid key size\n",
601 argv[0]); 607 argv[0]);
602 usage(argv[0], keysize, mode, size, warmup, l, n); 608 USAGE();
603 return 1; 609 return 1;
604 } 610 }
605 } else if (!strcmp(argv[i], "-l")) { 611 } else if (!strcmp(argv[i], "-l")) {
@@ -620,7 +626,7 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
620 else { 626 else {
621 fprintf(stderr, "%s, invalid mode\n", 627 fprintf(stderr, "%s, invalid mode\n",
622 argv[0]); 628 argv[0]);
623 usage(argv[0], keysize, mode, size, warmup, l, n); 629 USAGE();
624 return 1; 630 return 1;
625 } 631 }
626 } else if (!strcmp(argv[i], "-n")) { 632 } else if (!strcmp(argv[i], "-n")) {
@@ -630,14 +636,14 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
630 !strcmp(argv[i], "-r")) { 636 !strcmp(argv[i], "-r")) {
631 if (input_data_init == CRYPTO_NOT_INITED) { 637 if (input_data_init == CRYPTO_NOT_INITED) {
632 perror("--random is not compatible with --not-inited\n"); 638 perror("--random is not compatible with --not-inited\n");
633 usage(argv[0], keysize, mode, size, warmup, l, n); 639 USAGE();
634 return 1; 640 return 1;
635 } 641 }
636 input_data_init = CRYPTO_USE_RANDOM; 642 input_data_init = CRYPTO_USE_RANDOM;
637 } else if (!strcmp(argv[i], "--not-inited")) { 643 } else if (!strcmp(argv[i], "--not-inited")) {
638 if (input_data_init == CRYPTO_USE_RANDOM) { 644 if (input_data_init == CRYPTO_USE_RANDOM) {
639 perror("--random is not compatible with --not-inited\n"); 645 perror("--random is not compatible with --not-inited\n");
640 usage(argv[0], keysize, mode, size, warmup, l, n); 646 USAGE();
641 return 1; 647 return 1;
642 } 648 }
643 input_data_init = CRYPTO_NOT_INITED; 649 input_data_init = CRYPTO_NOT_INITED;
@@ -663,6 +669,9 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
663 NEXT_ARG(i); 669 NEXT_ARG(i);
664 ion_heap = atoi(argv[i]); 670 ion_heap = atoi(argv[i]);
665#endif 671#endif
672 } else if (!strcmp(argv[i], "-u")) {
673 NEXT_ARG(i);
674 unit = atoi(argv[i]);
666 } else if (!strcmp(argv[i], "-v")) { 675 } else if (!strcmp(argv[i], "-v")) {
667 verbosity++; 676 verbosity++;
668 } else if (!strcmp(argv[i], "--warmup") || 677 } else if (!strcmp(argv[i], "--warmup") ||
@@ -672,20 +681,20 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
672 } else { 681 } else {
673 fprintf(stderr, "%s: invalid argument: %s\n", 682 fprintf(stderr, "%s: invalid argument: %s\n",
674 argv[0], argv[i]); 683 argv[0], argv[i]);
675 usage(argv[0], keysize, mode, size, warmup, l, n); 684 USAGE();
676 return 1; 685 return 1;
677 } 686 }
678 } 687 }
679 688
680 if (size & (16 - 1)) { 689 if (size & (16 - 1)) {
681 fprintf(stderr, "invalid buffer size argument, must be a multiple of 16\n\n"); 690 fprintf(stderr, "invalid buffer size argument, must be a multiple of 16\n\n");
682 usage(argv[0], keysize, mode, size, warmup, l, n); 691 USAGE();
683 return 1; 692 return 1;
684 } 693 }
685 694
686 695
687 aes_perf_run_test(mode, keysize, decrypt, size, n, l, input_data_init, 696 aes_perf_run_test(mode, keysize, decrypt, size, unit, n, l,
688 in_place, warmup, verbosity); 697 input_data_init, in_place, warmup, verbosity);
689 698
690 return 0; 699 return 0;
691} 700}
diff --git a/host/xtest/benchmark_2000.c b/host/xtest/benchmark_2000.c
index 7ab9cb8..96a1d75 100644
--- a/host/xtest/benchmark_2000.c
+++ b/host/xtest/benchmark_2000.c
@@ -80,9 +80,9 @@ static void xtest_tee_benchmark_2011(ADBG_Case_t *c)
80 int keysize = AES_128; 80 int keysize = AES_128;
81 size_t size = 1024; /* Buffer size */ 81 size_t size = 1024; /* Buffer size */
82 82
83 aes_perf_run_test(mode, keysize, decrypt, size, CRYPTO_DEF_COUNT, 83 aes_perf_run_test(mode, keysize, decrypt, size, CRYPTO_DEF_UNIT_SIZE,
84 CRYPTO_DEF_LOOPS, CRYPTO_USE_RANDOM, AES_PERF_INPLACE, 84 CRYPTO_DEF_COUNT, CRYPTO_DEF_LOOPS, CRYPTO_USE_RANDOM,
85 CRYPTO_DEF_WARMUP, CRYPTO_DEF_VERBOSITY); 85 AES_PERF_INPLACE, CRYPTO_DEF_WARMUP, CRYPTO_DEF_VERBOSITY);
86} 86}
87 87
88static void xtest_tee_benchmark_2012(ADBG_Case_t *c) 88static void xtest_tee_benchmark_2012(ADBG_Case_t *c)
@@ -94,9 +94,9 @@ static void xtest_tee_benchmark_2012(ADBG_Case_t *c)
94 int keysize = AES_256; 94 int keysize = AES_256;
95 size_t size = 1024; /* Buffer size */ 95 size_t size = 1024; /* Buffer size */
96 96
97 aes_perf_run_test(mode, keysize, decrypt, size, CRYPTO_DEF_COUNT, 97 aes_perf_run_test(mode, keysize, decrypt, size, CRYPTO_DEF_UNIT_SIZE,
98 CRYPTO_DEF_LOOPS, CRYPTO_USE_RANDOM, AES_PERF_INPLACE, 98 CRYPTO_DEF_COUNT, CRYPTO_DEF_LOOPS, CRYPTO_USE_RANDOM,
99 CRYPTO_DEF_WARMUP, CRYPTO_DEF_VERBOSITY); 99 AES_PERF_INPLACE, CRYPTO_DEF_WARMUP, CRYPTO_DEF_VERBOSITY);
100} 100}
101 101
102ADBG_CASE_DEFINE(benchmark, 2011, xtest_tee_benchmark_2011, 102ADBG_CASE_DEFINE(benchmark, 2011, xtest_tee_benchmark_2011,
diff --git a/host/xtest/crypto_common.h b/host/xtest/crypto_common.h
index c686c84..1cc67a9 100644
--- a/host/xtest/crypto_common.h
+++ b/host/xtest/crypto_common.h
@@ -45,6 +45,7 @@
45#define CRYPTO_DEF_WARMUP 2 /* Start with a 2-second busy loop */ 45#define CRYPTO_DEF_WARMUP 2 /* Start with a 2-second busy loop */
46#define CRYPTO_DEF_COUNT 5000 /* Default number of measurements */ 46#define CRYPTO_DEF_COUNT 5000 /* Default number of measurements */
47#define CRYPTO_DEF_VERBOSITY 0 47#define CRYPTO_DEF_VERBOSITY 0
48#define CRYPTO_DEF_UNIT_SIZE 0 /* Process whole buffer */
48 49
49 50
50#define _verbose(lvl, ...) \ 51#define _verbose(lvl, ...) \
@@ -61,8 +62,8 @@
61 62
62int aes_perf_runner_cmd_parser(int argc, char *argv[]); 63int aes_perf_runner_cmd_parser(int argc, char *argv[]);
63void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size, 64void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
64 unsigned int n, unsigned int l, int random_in, 65 size_t unit, unsigned int n, unsigned int l,
65 int in_place, int warmup, int verbosity); 66 int random_in, int in_place, int warmup, int verbosity);
66 67
67int sha_perf_runner_cmd_parser(int argc, char *argv[]); 68int sha_perf_runner_cmd_parser(int argc, char *argv[]);
68void sha_perf_run_test(int algo, size_t size, unsigned int n, 69void sha_perf_run_test(int algo, size_t size, unsigned int n,
diff --git a/ta/aes_perf/ta_aes_perf.c b/ta/aes_perf/ta_aes_perf.c
index 6a64f4b..6fbdca4 100644
--- a/ta/aes_perf/ta_aes_perf.c
+++ b/ta/aes_perf/ta_aes_perf.c
@@ -107,6 +107,7 @@ TEE_Result cmd_process(uint32_t param_types,
107{ 107{
108 TEE_Result res; 108 TEE_Result res;
109 int n; 109 int n;
110 int unit;
110 void *in, *out; 111 void *in, *out;
111 uint32_t insz; 112 uint32_t insz;
112 uint32_t outsz; 113 uint32_t outsz;
@@ -116,6 +117,8 @@ TEE_Result cmd_process(uint32_t param_types,
116 TEE_PARAM_TYPE_NONE); 117 TEE_PARAM_TYPE_NONE);
117 bool secure_in; 118 bool secure_in;
118 bool secure_out = false; 119 bool secure_out = false;
120 TEE_Result (*do_update)(TEE_OperationHandle, const void *, uint32_t,
121 void *, uint32_t *);
119 122
120 if (param_types != exp_param_types) 123 if (param_types != exp_param_types)
121 return TEE_ERROR_BAD_PARAMETERS; 124 return TEE_ERROR_BAD_PARAMETERS;
@@ -152,17 +155,26 @@ TEE_Result cmd_process(uint32_t param_types,
152 out = params[1].memref.buffer; 155 out = params[1].memref.buffer;
153 outsz = params[1].memref.size; 156 outsz = params[1].memref.size;
154 n = params[2].value.a; 157 n = params[2].value.a;
155 158 unit = params[2].value.b;
156 if (algo == TEE_ALG_AES_GCM) { 159 if (!unit)
157 while (n--) { 160 unit = insz;
158 res = TEE_AEUpdate(crypto_op, in, insz, out, &outsz); 161
159 CHECK(res, "TEE_AEUpdate", return res;); 162 if (algo == TEE_ALG_AES_GCM)
163 do_update = TEE_AEUpdate;
164 else
165 do_update = TEE_CipherUpdate;
166
167 while (n--) {
168 uint32_t i;
169 for (i = 0; i < insz / unit; i++) {
170 res = do_update(crypto_op, in, unit, out, &outsz);
171 CHECK(res, "TEE_CipherUpdate/TEE_AEUpdate", return res;);
172 in = (void *)((uintptr_t)in + unit);
173 out = (void *)((uintptr_t)out + unit);
160 } 174 }
161 } else { 175 if (insz % unit) {
162 while (n--) { 176 res = do_update(crypto_op, in, insz % unit, out, &outsz);
163 res = TEE_CipherUpdate(crypto_op, in, insz, 177 CHECK(res, "TEE_CipherUpdate/TEE_AEUpdate", return res;);
164 out, &outsz);
165 CHECK(res, "TEE_CipherUpdate", return res;);
166 } 178 }
167 } 179 }
168 180