On 2014-11-13 16:14, [email protected] wrote:
> From: Alexandru Badicioiu <[email protected]>
>
> This patch adds a suite for sync and async inplace mode of crypto APIs.
> Correctness of crypto operation output is verified with known test
> vectors. Various options and functionalities like use session IV
> or operation IV for ciphering are exercised for both modes.
> For async mode there are options to use input packet buffer or a
> separate buffer as the completion event and to set and retrieve the
> context associated with an operation from the completion event.
>
> Signed-off-by: Alexandru Badicioiu <[email protected]>
> ---
> configure.ac | 1 +
> test/cunit/Makefile.am | 2 +
> test/cunit/crypto/Makefile.am | 14 +
> test/cunit/crypto/odp_crypto_test.c | 100 +++++++
> test/cunit/crypto/odp_crypto_test_async_inp.c | 371
> +++++++++++++++++++++++++
> test/cunit/crypto/odp_crypto_test_async_inp.h | 17 ++
> test/cunit/crypto/odp_crypto_test_sync_inp.c | 260 +++++++++++++++++
> test/cunit/crypto/odp_crypto_test_sync_inp.h | 17 ++
> test/cunit/crypto/test_vectors.h | 94 +++++++
Remove _test from the file names.
> 9 files changed, 876 insertions(+), 0 deletions(-)
> create mode 100644 test/cunit/crypto/Makefile.am
> create mode 100644 test/cunit/crypto/odp_crypto_test.c
> create mode 100644 test/cunit/crypto/odp_crypto_test_async_inp.c
> create mode 100644 test/cunit/crypto/odp_crypto_test_async_inp.h
> create mode 100644 test/cunit/crypto/odp_crypto_test_sync_inp.c
> create mode 100644 test/cunit/crypto/odp_crypto_test_sync_inp.h
> create mode 100644 test/cunit/crypto/test_vectors.h
$ ./bootstrap
$ ./configure --with-cunit-path=/home/anders/src/install-native-cunit
$ make check
PASS: odp_init
PASS: odp_queue
make[6]: Entering directory '/home/anders/src/odp/test/cunit'
Making all in crypto
make[7]: Entering directory '/home/anders/src/odp/test/cunit/crypto'
make[7]: Nothing to be done for 'all'.
make[7]: Leaving directory '/home/anders/src/odp/test/cunit/crypto'
make[7]: Entering directory '/home/anders/src/odp/test/cunit'
make[7]: Nothing to be done for 'all-am'.
make[7]: Leaving directory '/home/anders/src/odp/test/cunit'
make[6]: Leaving directory '/home/anders/src/odp/test/cunit'
============================================================================
Testsuite summary for OpenDataPlane 0.3.0
============================================================================
# TOTAL: 2
# PASS: 2
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
============================================================================
And when I run the binary standalone I get a seg fault.
$ ./test/cunit/crypto/odp_crypto
odp_buffer_pool.c:137:odp_buffer_pool_init_global():
Buffer pool init global
odp_buffer_pool.c:138:odp_buffer_pool_init_global(): pool_entry_s size 192
odp_buffer_pool.c:139:odp_buffer_pool_init_global(): pool_entry_t size 192
odp_buffer_pool.c:140:odp_buffer_pool_init_global(): odp_buffer_hdr_t size 120
odp_buffer_pool.c:141:odp_buffer_pool_init_global():
odp_queue.c:99:odp_queue_init_global():Queue init ...
odp_queue.c:119:odp_queue_init_global():done
odp_queue.c:120:odp_queue_init_global():Queue init global
odp_queue.c:122:odp_queue_init_global(): struct queue_entry_s size 192
odp_queue.c:124:odp_queue_init_global(): queue_entry_t size 192
odp_queue.c:125:odp_queue_init_global():
odp_schedule.c:89:odp_schedule_init_global():Schedule init ...
odp_schedule.c:149:odp_schedule_init_global():done
odp_timer.c:219:odp_timer_init_global():Timer init
...odp_timer.c:225:odp_timer_init_global():done
ODP version: 0.3.0
CUnit - A unit testing framework for C - Version 2.1-3
http://cunit.sourceforge.net/
Suite: odp_crypto_sync_inp
Test: ENC_ALG_3DES_CBC ...passed
Test: DEC_ALG_3DES_CBC ...passed
Test: ENC_ALG_3DES_CBC_OVR_IV ...zsh: segmentation fault (core dumped)
./test/cunit/crypto/odp_crypto
Any Idea why?
For 1.0 "make check" must work and the solution should would be to move
odp_crypto up a level, and that means that you can remove the makefile
structure.
When I tried this with the patch pasted below I got the same seg fault.
diff --git a/configure.ac b/configure.ac
index 616ea64..fcd7279 100644
--- a/configure.ac
+++ b/configure.ac
@@ -173,7 +173,6 @@ AC_CONFIG_FILES([Makefile
test/Makefile
test/api_test/Makefile
test/cunit/Makefile
- test/cunit/crypto/Makefile
pkgconfig/libodp.pc])
AC_SEARCH_LIBS([timer_create],[rt posix4])
diff --git a/test/cunit/Makefile.am b/test/cunit/Makefile.am
index 33e1a41..97ab393 100644
--- a/test/cunit/Makefile.am
+++ b/test/cunit/Makefile.am
@@ -3,15 +3,18 @@ include $(top_srcdir)/test/Makefile.inc
AM_CFLAGS += -I$(CUNIT_PATH)/include
AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static -lcunit
-SUBDIRS = crypto
-
if ODP_CUNIT_ENABLED
TESTS = ${bin_PROGRAMS}
check_PROGRAMS = ${bin_PROGRAMS}
-bin_PROGRAMS = odp_init odp_queue
+bin_PROGRAMS = odp_init odp_queue odp_crypto
+odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto
+odp_crypto_LDFLAGS = $(AM_LDFLAGS)
odp_init_LDFLAGS = $(AM_LDFLAGS)
odp_queue_LDFLAGS = $(AM_LDFLAGS)
endif
+dist_odp_crypto_SOURCES = crypto/odp_crypto_test_async_inp.c \
+ crypto/odp_crypto_test_sync_inp.c \
+ odp_crypto.c
dist_odp_init_SOURCES = odp_init.c
dist_odp_queue_SOURCES = odp_queue.c
diff --git a/test/cunit/crypto/odp_crypto_test.c b/test/cunit/odp_crypto.c
similarity index 96%
rename from test/cunit/crypto/odp_crypto_test.c
rename to test/cunit/odp_crypto.c
index 4026be0..f8f7775 100644
--- a/test/cunit/crypto/odp_crypto_test.c
+++ b/test/cunit/odp_crypto.c
@@ -7,8 +7,8 @@
#include <odp.h>
#include "CUnit/Basic.h"
#include "CUnit/TestDB.h"
-#include "odp_crypto_test_async_inp.h"
-#include "odp_crypto_test_sync_inp.h"
+#include "crypto/odp_crypto_test_async_inp.h"
+#include "crypto/odp_crypto_test_sync_inp.h"
#define SHM_PKT_POOL_SIZE (512*2048*2)
#define SHM_PKT_POOL_BUF_SIZE (1024 * 32)
>
> diff --git a/configure.ac b/configure.ac
> index fcd7279..616ea64 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -173,6 +173,7 @@ AC_CONFIG_FILES([Makefile
> test/Makefile
> test/api_test/Makefile
> test/cunit/Makefile
> + test/cunit/crypto/Makefile
> pkgconfig/libodp.pc])
>
> AC_SEARCH_LIBS([timer_create],[rt posix4])
> diff --git a/test/cunit/Makefile.am b/test/cunit/Makefile.am
> index 439e134..33e1a41 100644
> --- a/test/cunit/Makefile.am
> +++ b/test/cunit/Makefile.am
> @@ -3,6 +3,8 @@ include $(top_srcdir)/test/Makefile.inc
> AM_CFLAGS += -I$(CUNIT_PATH)/include
> AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static -lcunit
>
> +SUBDIRS = crypto
> +
> if ODP_CUNIT_ENABLED
> TESTS = ${bin_PROGRAMS}
> check_PROGRAMS = ${bin_PROGRAMS}
> diff --git a/test/cunit/crypto/Makefile.am b/test/cunit/crypto/Makefile.am
> new file mode 100644
> index 0000000..d785602
> --- /dev/null
> +++ b/test/cunit/crypto/Makefile.am
> @@ -0,0 +1,14 @@
> +include $(top_srcdir)/test/Makefile.inc
> +
> +AM_CFLAGS += -I$(CUNIT_PATH)/include
> +AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static -lcunit
> +
> +if ODP_CUNIT_ENABLED
> +bin_PROGRAMS = odp_crypto
> +odp_crypto_CFLAGS = $(AM_CFLAGS)
> +odp_crypto_LDFLAGS = $(AM_LDFLAGS)
> +endif
> +
> +dist_odp_crypto_SOURCES = odp_crypto_test_async_inp.c \
> + odp_crypto_test_sync_inp.c \
> + odp_crypto_test.c
> diff --git a/test/cunit/crypto/odp_crypto_test.c
> b/test/cunit/crypto/odp_crypto_test.c
> new file mode 100644
> index 0000000..4026be0
> --- /dev/null
> +++ b/test/cunit/crypto/odp_crypto_test.c
> @@ -0,0 +1,100 @@
> +/* Copyright (c) 2014, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: BSD-3-Clause
> + */
> +
> +#include <odp.h>
> +#include "CUnit/Basic.h"
> +#include "CUnit/TestDB.h"
> +#include "odp_crypto_test_async_inp.h"
> +#include "odp_crypto_test_sync_inp.h"
> +
> +#define SHM_PKT_POOL_SIZE (512*2048*2)
> +#define SHM_PKT_POOL_BUF_SIZE (1024 * 32)
> +
> +#define SHM_COMPL_POOL_SIZE (128*1024)
> +#define SHM_COMPL_POOL_BUF_SIZE 128
Be consisent don't mix tabs and spaces.
> +
> +CU_SuiteInfo suites[] = {
> + { ODP_CRYPTO_SYNC_INP , NULL, NULL, NULL, NULL, test_array_sync },
> + { ODP_CRYPTO_ASYNC_INP , NULL, NULL, NULL, NULL, test_array_async },
> + CU_SUITE_INFO_NULL,
> +};
> +
> +int main(void)
> +{
> + odp_shm_t shm;
> + void *pool_base = NULL;
> + odp_buffer_pool_t pool;
> + odp_queue_t out_queue;
> +
> + if (odp_init_global(NULL, NULL)) {
> + ODP_ERR("ODP global init failed.\n");
change ODP_ERR to printf.
> + return -1;
> + }
> + odp_init_local();
> +
> + shm = odp_shm_reserve("shm_packet_pool",
> + SHM_PKT_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE, 0);
> +
> + pool_base = odp_shm_addr(shm);
> + if (!pool_base) {
> + ODP_ERR("Packet pool allocation failed.\n");
> + return -1;
> + }
> +
> + pool = odp_buffer_pool_create("packet_pool", pool_base,
> + SHM_PKT_POOL_SIZE,
> + SHM_PKT_POOL_BUF_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_PACKET);
> + if (pool == ODP_BUFFER_POOL_INVALID) {
Mixture of style "the ordering of the variable and the constant"
In the validation testsuit we started to set the precidence that it
should be constant first.
> + ODP_ERR("Packet pool creation failed.\n");
> + return -1;
> + }
> + out_queue = odp_queue_create("crypto-out",
> + ODP_QUEUE_TYPE_POLL, NULL);
> + if (out_queue == ODP_QUEUE_INVALID) {
> + ODP_ERR("Crypto outq creation failed.\n");
> + return -1;
> + }
> + shm = odp_shm_reserve("shm_compl_pool",
> + SHM_COMPL_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_SHM_SW_ONLY);
> + pool_base = odp_shm_addr(shm);
> + if (!pool_base) {
> + ODP_ERR("Completion pool allocation failed.\n");
> + return -1;
> + }
> + pool = odp_buffer_pool_create("compl_pool", pool_base,
> + SHM_COMPL_POOL_SIZE,
> + SHM_COMPL_POOL_BUF_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_RAW);
> + if (pool == ODP_BUFFER_POOL_INVALID) {
> + ODP_ERR("Completion pool creation failed.\n");
> + return -1;
> + }
> +
> + printf("\tODP version: %s\n", odp_version_api_str());
> +
> +
> + /* initialize the CUnit test registry */
> + if (CUE_SUCCESS != CU_initialize_registry())
> + return CU_get_error();
> +
> + /* register suites */
> + CU_register_suites(suites);
> + /* Run all tests using the CUnit Basic interface */
> + CU_basic_set_mode(CU_BRM_VERBOSE);
> + CU_basic_run_tests();
> + CU_cleanup_registry();
> +
> + odp_term_local();
> + odp_term_global();
> +
> + return CU_get_error();
> +}
> diff --git a/test/cunit/crypto/odp_crypto_test_async_inp.c
> b/test/cunit/crypto/odp_crypto_test_async_inp.c
> new file mode 100644
> index 0000000..dca44fd
> --- /dev/null
> +++ b/test/cunit/crypto/odp_crypto_test_async_inp.c
> @@ -0,0 +1,371 @@
> +/* Copyright (c) 2014, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: BSD-3-Clause
> + */
> +
> +#include <odp.h>
> +#include <odp_crypto.h>
> +#include "CUnit/Basic.h"
> +#include "CUnit/TestDB.h"
> +#include "test_vectors.h"
> +
> +/* Basic algorithm run function for async inplace mode.
> + * Creates a session from input parameters and runs one operation
> + * on input_vec. Checks the output of the crypto operation against
> + * output_vec. Operation completion event is dequeued polling the
> + * session output queue. Completion context pointer is retrieved
> + * and checked against the one set before the operation.
> + * Completion event can be a separate buffer or the input packet
> + * buffer can be used.
> + * */
Clarify that this function is runned more than once.
> +static void alg_test(enum odp_crypto_op op,
> + enum odp_cipher_alg cipher_alg,
> + odp_crypto_iv_t ses_iv,
> + uint8_t *op_iv_ptr,
> + odp_crypto_key_t cipher_key,
> + enum odp_auth_alg auth_alg,
> + odp_crypto_key_t auth_key,
> + odp_buffer_t compl_new,
> + uint8_t *input_vec,
> + unsigned int input_vec_len,
> + uint8_t *output_vec,
> + unsigned int output_vec_len)
> +{
> + odp_crypto_session_t session;
> + int rc;
> + enum odp_crypto_ses_create_err status;
> + bool posted;
> + odp_buffer_t compl_event;
> +
> + odp_queue_t compl_queue = odp_queue_lookup("crypto-out");
> + CU_ASSERT(compl_queue != ODP_QUEUE_INVALID);
> + odp_buffer_pool_t pool = odp_buffer_pool_lookup("packet_pool");
> + CU_ASSERT(pool != ODP_BUFFER_POOL_INVALID);
> +
> + /* Create a crypto session */
> + odp_crypto_session_params_t ses_params;
> + memset(&ses_params, 0, sizeof(ses_params));
> + ses_params.op = op;
> + ses_params.auth_cipher_text = false;
> + ses_params.pref_mode = ODP_CRYPTO_ASYNC;
> + ses_params.cipher_alg = cipher_alg;
> + ses_params.auth_alg = auth_alg;
> + ses_params.compl_queue = compl_queue;
> + ses_params.output_pool = pool;
> + ses_params.cipher_key = cipher_key;
> + ses_params.iv = ses_iv;
> + ses_params.auth_key = auth_key;
> +
> + /* TEST : odp_crypto_session_create */
This comment dosen't add any value.
> + rc = odp_crypto_session_create(&ses_params, &session, &status);
> + CU_ASSERT(!rc);
> + CU_ASSERT(status == ODP_CRYPTO_SES_CREATE_ERR_NONE);
> +
> + /* Prepare input data */
> + odp_buffer_t buf = odp_buffer_alloc(pool);
> + CU_ASSERT(buf != ODP_BUFFER_INVALID);
> + odp_packet_t pkt = odp_packet_from_buffer(buf);
> + CU_ASSERT(pkt != ODP_PACKET_INVALID);
> + uint8_t *data_addr = odp_packet_data(pkt);
> + memcpy(data_addr, input_vec, input_vec_len);
> + /* offsets are relative to buffer address (not packet data)
> + until https://bugs.linaro.org/show_bug.cgi?id=387 is fixed */
I like that you linked to the bug.
> + int data_off = data_addr - (uint8_t *)odp_buffer_addr(buf);
> +
> + /* Prepare input/output params */
> + odp_crypto_op_params_t op_params;
> + memset(&op_params, 0, sizeof(op_params));
> + op_params.session = session;
> + op_params.pkt = pkt;
> + op_params.out_pkt = pkt;
> + if (cipher_alg != ODP_CIPHER_ALG_NULL &&
> + auth_alg == ODP_AUTH_ALG_NULL) {
> + op_params.cipher_range.offset = data_off;
> + op_params.cipher_range.length = input_vec_len;
> + if (op_iv_ptr)
> + op_params.override_iv_ptr = op_iv_ptr;
> + } else if (cipher_alg == ODP_CIPHER_ALG_NULL &&
> + auth_alg != ODP_AUTH_ALG_NULL) {
> + op_params.auth_range.offset = data_off;
> + op_params.auth_range.length = input_vec_len;
> + op_params.hash_result_offset = data_off;
> + } else {
> + CU_FAIL("%s : not implemented for combined alg mode\n");
> + }
> +
> + /* TEST : odp_crypto_set_operation_compl_ctx */
> + /* TEST : odp_crypto_operation */
This comment dosen't add any value.
And most of the comments that has prefix "TEST : " appears not to add
much value.
> + if (compl_new == ODP_BUFFER_INVALID) {
> + odp_crypto_set_operation_compl_ctx(buf, (void *)0xdeadbeef);
> + rc = odp_crypto_operation(&op_params, &posted, buf);
> + } else {
> + odp_crypto_set_operation_compl_ctx(compl_new,
> + (void *)0xdeadbeef);
> + rc = odp_crypto_operation(&op_params, &posted, compl_new);
> + }
> + CU_ASSERT(posted);
> +
> + /* Poll completion queue for results */
> + do {
> + compl_event = odp_queue_deq(compl_queue);
> + } while (compl_event == ODP_BUFFER_INVALID);
> +
> + if (compl_new == ODP_BUFFER_INVALID) {
> + CU_ASSERT(compl_event == buf);
> + } else {
> + CU_ASSERT(compl_event == compl_new);
> + }
> +
> + /* TEST : odp_crypto_get_operation_compl_status */
> + struct odp_crypto_compl_status auth_status, cipher_status;
> + odp_crypto_get_operation_compl_status(compl_event,
> + &auth_status, &cipher_status);
> + CU_ASSERT(auth_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
> + CU_ASSERT(auth_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
> + CU_ASSERT(cipher_status.alg_err == ODP_CRYPTO_ALG_ERR_NONE);
> + CU_ASSERT(cipher_status.hw_err == ODP_CRYPTO_HW_ERR_NONE);
> +
> + /* TEST : odp_crypto_get_operation_compl_packet */
> + odp_packet_t out_pkt;
> + out_pkt = odp_crypto_get_operation_compl_packet(compl_event);
> + CU_ASSERT(out_pkt == pkt);
> +
> + /* TEST : operation output was correct */
> + CU_ASSERT(!memcmp(data_addr, output_vec, output_vec_len));
> +
> + /* TEST : we got back the context pointer */
> + void *ctx = odp_crypto_get_operation_compl_ctx(compl_event);
> + CU_ASSERT(ctx == (void *)0xdeadbeef);
> +
> + odp_buffer_free(buf);
> +}
> +
> +/* This test verifies the correctness of encode (plaintext -> ciphertext)
> + * operation for 3DES_CBC algorithm. IV for the operation is the session IV.
> + * In addition the test verifies if the implementation can use the
> + * packet buffer as completion event buffer.*/
> +#define ASYNC_INP_ENC_ALG_3DES_CBC "ENC_ALG_3DES_CBC"
If I would be able to run without seg fault can I tell ASYNC_... and
SYNC_... apart in the results, when run "make check"?
> +static void test_async_enc_alg_3des_cbc(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv;
> + unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
> + sizeof(tdes_cbc_reference_length[0]));
> +
> + unsigned int i;
> + for (i = 0; i < test_vec_num; i++) {
> + cipher_key.data = tdes_cbc_reference_key[i];
> + cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
> + iv.data = tdes_cbc_reference_iv[i];
> + iv.length = sizeof(tdes_cbc_reference_iv[i]);
> +
> + alg_test(ODP_CRYPTO_OP_ENCODE,
> + ODP_CIPHER_ALG_3DES_CBC,
> + iv,
> + NULL,
> + cipher_key,
> + ODP_AUTH_ALG_NULL,
> + auth_key,
> + ODP_BUFFER_INVALID,
> + tdes_cbc_reference_plaintext[i],
> + tdes_cbc_reference_length[i],
> + tdes_cbc_reference_ciphertext[i],
> + tdes_cbc_reference_length[i]);
> + }
> +}
> +
> +/* This test verifies the correctness of encode (plaintext -> ciphertext)
> + * operation for 3DES_CBC algorithm. IV for the operation is the operation
> IV.
> + * */
> +#define ASYNC_INP_ENC_ALG_3DES_CBC_OVR_IV "ENC_ALG_3DES_CBC_OVR_IV"
> +static void test_async_enc_alg_3des_cbc_ovr_iv(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv = { .data = NULL, .length = TDES_CBC_IV_LEN };
> + unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
> + sizeof(tdes_cbc_reference_length[0]));
> +
> + unsigned int i;
> + for (i = 0; i < test_vec_num; i++) {
> + cipher_key.data = tdes_cbc_reference_key[i];
> + cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
> +
> + alg_test(ODP_CRYPTO_OP_ENCODE,
> + ODP_CIPHER_ALG_3DES_CBC,
> + iv,
> + tdes_cbc_reference_iv[i],
> + cipher_key,
> + ODP_AUTH_ALG_NULL,
> + auth_key,
> + ODP_BUFFER_INVALID,
> + tdes_cbc_reference_plaintext[i],
> + tdes_cbc_reference_length[i],
> + tdes_cbc_reference_ciphertext[i],
> + tdes_cbc_reference_length[i]);
> + }
> +}
> +
> +
> +/* This test verifies the correctness of decode (ciphertext -> plaintext)
> + * operation for 3DES_CBC algorithm. IV for the operation is the session IV
> + * In addition the test verifies if the implementation can use the
> + * packet buffer as completion event buffer.
> + * */
> +#define ASYNC_INP_DEC_ALG_3DES_CBC "DEC_ALG_3DES_CBC"
> +static void test_async_dec_alg_3des_cbc(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
> + unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
> + sizeof(tdes_cbc_reference_length[0]));
> +
> + unsigned int i;
> + for (i = 0; i < test_vec_num; i++) {
> + cipher_key.data = tdes_cbc_reference_key[i];
> + cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
> + iv.data = tdes_cbc_reference_iv[i];
> + iv.length = sizeof(tdes_cbc_reference_iv[i]);
> +
> + alg_test(ODP_CRYPTO_OP_DECODE,
> + ODP_CIPHER_ALG_3DES_CBC,
> + iv,
> + NULL,
> + cipher_key,
> + ODP_AUTH_ALG_NULL,
> + auth_key,
> + ODP_BUFFER_INVALID,
> + tdes_cbc_reference_ciphertext[i],
> + tdes_cbc_reference_length[i],
> + tdes_cbc_reference_plaintext[i],
> + tdes_cbc_reference_length[i]);
> + }
> +}
> +
> +/* This test verifies the correctness of decode (ciphertext -> plaintext)
> + * operation for 3DES_CBC algorithm. IV for the operation is the session IV
> + * In addition the test verifies if the implementation can use the
> + * packet buffer as completion event buffer.
> + * */
> +#define ASYNC_INP_DEC_ALG_3DES_CBC_OVR_IV "DEC_ALG_3DES_CBC_OVR_IV"
> +static void test_async_dec_alg_3des_cbc_ovr_iv(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv = { .data = NULL, .length = TDES_CBC_IV_LEN };
> + unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
> + sizeof(tdes_cbc_reference_length[0]));
> +
> + unsigned int i;
> + for (i = 0; i < test_vec_num; i++) {
> + cipher_key.data = tdes_cbc_reference_key[i];
> + cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
> +
> + alg_test(ODP_CRYPTO_OP_DECODE,
> + ODP_CIPHER_ALG_3DES_CBC,
> + iv,
> + tdes_cbc_reference_iv[i],
> + cipher_key,
> + ODP_AUTH_ALG_NULL,
> + auth_key,
> + ODP_BUFFER_INVALID,
> + tdes_cbc_reference_ciphertext[i],
> + tdes_cbc_reference_length[i],
> + tdes_cbc_reference_plaintext[i],
> + tdes_cbc_reference_length[i]);
> + }
> +}
> +
> +
> +/* This test verifies the correctness of HMAC_MD5 digest operation.
> + * The output check length is truncated to 12 bytes (96 bits) as
> + * returned by the crypto operation API call.
> + * Note that hash digest is a one-way operation.
> + * In addition the test verifies if the implementation can use the
> + * packet buffer as completion event buffer.
> + * */
> +#define ASYNC_INP_ALG_HMAC_MD5 "ALG_HMAC_MD5"
Don't mix tab and spaces.
> +static void test_async_alg_hmac_md5(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
> +
> + unsigned int test_vec_num = (sizeof(hmac_md5_reference_length)/
> + sizeof(hmac_md5_reference_length[0]));
> +
> + unsigned int i;
> + for (i = 0; i < test_vec_num; i++) {
> + auth_key.data = hmac_md5_reference_key[i];
> + auth_key.length = sizeof(hmac_md5_reference_key[i]);
> +
> + alg_test(ODP_CRYPTO_OP_ENCODE,
> + ODP_CIPHER_ALG_NULL,
> + iv,
> + iv.data,
> + cipher_key,
> + ODP_AUTH_ALG_MD5_96,
> + auth_key,
> + ODP_BUFFER_INVALID,
> + hmac_md5_reference_plaintext[i],
> + hmac_md5_reference_length[i],
> + hmac_md5_reference_digest[i],
> + HMAC_MD5_96_CHECK_LEN);
> + }
> +}
> +
> +/* This test verifies the correctness of encode (plaintext -> ciphertext)
> + * operation for 3DES_CBC algorithm. IV for the operation is the session IV.
> + * Uses a separate buffer for completion event
> + * */
> +#define ASYNC_INP_ENC_ALG_3DES_CBC_COMPL_NEW "ENC_ALG_3DES_CBC_COMPL_NEW"
Don't mix tab and spaces.
> +static void test_async_enc_alg_3des_cbc_compl_new(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv;
> + unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
> + sizeof(tdes_cbc_reference_length[0]));
> +
> + odp_buffer_pool_t pool = odp_buffer_pool_lookup("compl_pool");
> + CU_ASSERT(pool != ODP_BUFFER_POOL_INVALID);
> +
> + unsigned int i;
> + odp_buffer_t compl_new;
> + for (i = 0; i < test_vec_num; i++) {
> + compl_new = odp_buffer_alloc(pool);
> + CU_ASSERT(compl_new != ODP_BUFFER_INVALID);
> +
> + cipher_key.data = tdes_cbc_reference_key[i];
> + cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
> + iv.data = tdes_cbc_reference_iv[i];
> + iv.length = sizeof(tdes_cbc_reference_iv[i]);
> +
> + alg_test(ODP_CRYPTO_OP_ENCODE,
> + ODP_CIPHER_ALG_3DES_CBC,
> + iv,
> + NULL,
> + cipher_key,
> + ODP_AUTH_ALG_NULL,
> + auth_key,
> + compl_new,
> + tdes_cbc_reference_plaintext[i],
> + tdes_cbc_reference_length[i],
> + tdes_cbc_reference_ciphertext[i],
> + tdes_cbc_reference_length[i]);
> + odp_buffer_free(compl_new);
> + }
> +}
> +
> +CU_TestInfo test_array_async[] = {
> + {ASYNC_INP_ENC_ALG_3DES_CBC, test_async_enc_alg_3des_cbc },
> + {ASYNC_INP_DEC_ALG_3DES_CBC, test_async_dec_alg_3des_cbc },
> + {ASYNC_INP_ENC_ALG_3DES_CBC_OVR_IV, test_async_enc_alg_3des_cbc_ovr_iv
> },
> + {ASYNC_INP_DEC_ALG_3DES_CBC_OVR_IV, test_async_dec_alg_3des_cbc_ovr_iv
> },
> + {ASYNC_INP_ALG_HMAC_MD5, test_async_alg_hmac_md5 },
> + {ASYNC_INP_ENC_ALG_3DES_CBC_COMPL_NEW,
> test_async_enc_alg_3des_cbc_compl_new },
> + CU_TEST_INFO_NULL,
> +};
> diff --git a/test/cunit/crypto/odp_crypto_test_async_inp.h
> b/test/cunit/crypto/odp_crypto_test_async_inp.h
> new file mode 100644
> index 0000000..ffad83c
> --- /dev/null
> +++ b/test/cunit/crypto/odp_crypto_test_async_inp.h
> @@ -0,0 +1,17 @@
> +/* Copyright (c) 2014, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: BSD-3-Clause
> + */
> +#ifndef ODP_CRYPTO_TEST_ASYNC_INP_
> +#define ODP_CRYPTO_TEST_ASYNC_INP_
> +
> +#include "CUnit/TestDB.h"
> +
> +/* Suite name */
> +#define ODP_CRYPTO_ASYNC_INP "odp_crypto_async_inp"
> +
> +/* Suite test array */
> +CU_TestInfo test_array_async[1];
> +
> +#endif
> diff --git a/test/cunit/crypto/odp_crypto_test_sync_inp.c
> b/test/cunit/crypto/odp_crypto_test_sync_inp.c
> new file mode 100644
> index 0000000..bc782b5
> --- /dev/null
> +++ b/test/cunit/crypto/odp_crypto_test_sync_inp.c
> @@ -0,0 +1,260 @@
> +#include <odp.h>
> +#include <odp_crypto.h>
> +#include "CUnit/Basic.h"
> +#include "CUnit/TestDB.h"
> +#include "test_vectors.h"
> +
> +/* Basic algorithm run function for sync inplace.
> + * Creates a session from input parameters and runs one operation
> + * on input_vec. Checks the output of the crypto operation against
> + * output_vec.
> + */
> +static void alg_test(enum odp_crypto_op op,
> + enum odp_cipher_alg cipher_alg,
> + odp_crypto_iv_t ses_iv,
> + uint8_t *op_iv_ptr,
> + odp_crypto_key_t cipher_key,
> + enum odp_auth_alg auth_alg,
> + odp_crypto_key_t auth_key,
> + uint8_t *input_vec,
> + unsigned int input_vec_len,
> + uint8_t *output_vec,
> + unsigned int output_vec_len)
> +{
> + odp_crypto_session_t session;
> + int rc;
> + enum odp_crypto_ses_create_err status;
> + bool posted;
> +
> + odp_queue_t compl_queue = odp_queue_lookup("crypto-out");
> + CU_ASSERT(compl_queue != ODP_QUEUE_INVALID);
> + odp_buffer_pool_t pool = odp_buffer_pool_lookup("packet_pool");
> + CU_ASSERT(pool != ODP_BUFFER_POOL_INVALID);
> +
> + /* Create a crypto session */
> + odp_crypto_session_params_t ses_params;
> + memset(&ses_params, 0, sizeof(ses_params));
> + ses_params.op = op;
> + ses_params.auth_cipher_text = false;
> + ses_params.pref_mode = ODP_CRYPTO_SYNC;
> + ses_params.cipher_alg = cipher_alg;
> + ses_params.auth_alg = auth_alg;
> + ses_params.compl_queue = ODP_QUEUE_INVALID;
> + ses_params.output_pool = pool;
> + ses_params.cipher_key = cipher_key;
> + ses_params.iv = ses_iv;
> + ses_params.auth_key = auth_key;
> +
> + /* TEST : odp_crypto_session_create */
> + rc = odp_crypto_session_create(&ses_params, &session, &status);
> + CU_ASSERT(!rc);
> + CU_ASSERT(status == ODP_CRYPTO_SES_CREATE_ERR_NONE);
> +
> + /* Prepare input data */
> + odp_buffer_t buf = odp_buffer_alloc(pool);
> + CU_ASSERT(buf != ODP_BUFFER_INVALID);
> + odp_packet_t pkt = odp_packet_from_buffer(buf);
> + CU_ASSERT(pkt != ODP_PACKET_INVALID);
> + uint8_t *data_addr = odp_packet_data(pkt);
> + memcpy(data_addr, input_vec, input_vec_len);
> + /* offsets are relative to buffer address (not packet data)
> + until https://bugs.linaro.org/show_bug.cgi?id=387 is fixed */
> + int data_off = data_addr - (uint8_t *)odp_buffer_addr(buf);
> +
> + /* Prepare input/output params */
> + odp_crypto_op_params_t op_params;
> + memset(&op_params, 0, sizeof(op_params));
> + op_params.session = session;
> + op_params.pkt = pkt;
> + op_params.out_pkt = pkt;
> + if (cipher_alg != ODP_CIPHER_ALG_NULL &&
> + auth_alg == ODP_AUTH_ALG_NULL) {
> + op_params.cipher_range.offset = data_off;
> + op_params.cipher_range.length = input_vec_len;
> + if (op_iv_ptr)
> + op_params.override_iv_ptr = op_iv_ptr;
> + } else if (cipher_alg == ODP_CIPHER_ALG_NULL &&
> + auth_alg != ODP_AUTH_ALG_NULL) {
> + op_params.auth_range.offset = data_off;
> + op_params.auth_range.length = input_vec_len;
> + op_params.hash_result_offset = data_off;
> + } else {
> + CU_FAIL("%s : not implemented for combined alg mode\n");
> + }
> +
> + /* TEST : odp_crypto_operation */
> + rc = odp_crypto_operation(&op_params, &posted, buf);
> + CU_ASSERT(!rc);
> + /* indication that the operation completed */
> + CU_ASSERT(!posted);
> +
> + /* TEST : operation output was correct */
> + CU_ASSERT(!memcmp(data_addr, output_vec, output_vec_len));
> +}
> +
> +#define SYNC_INP_ENC_ALG_3DES_CBC "ENC_ALG_3DES_CBC"
> +static void test_sync_enc_alg_3des_cbc(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv;
> + unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
> + sizeof(tdes_cbc_reference_length[0]));
> + unsigned int i;
> + for (i = 0; i < test_vec_num; i++) {
> + cipher_key.data = tdes_cbc_reference_key[i];
> + cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
> + iv.data = tdes_cbc_reference_iv[i];
> + iv.length = sizeof(tdes_cbc_reference_iv[i]);
> +
> + alg_test(ODP_CRYPTO_OP_ENCODE,
> + ODP_CIPHER_ALG_3DES_CBC,
> + iv,
> + NULL,
> + cipher_key,
> + ODP_AUTH_ALG_NULL,
> + auth_key,
> + tdes_cbc_reference_plaintext[i],
> + tdes_cbc_reference_length[i],
> + tdes_cbc_reference_ciphertext[i],
> + tdes_cbc_reference_length[i]);
> + }
> +}
> +
> +/* This test verifies the correctness of decode (ciphertext -> plaintext)
> + * operation for 3DES_CBC algorithm. IV for the operation is the session IV
> + * */
> +#define SYNC_INP_DEC_ALG_3DES_CBC "DEC_ALG_3DES_CBC"
> +static void test_sync_dec_alg_3des_cbc(void)
> +{
> + odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
> + auth_key = { .data = NULL, .length = 0 };
> + odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
> + unsigned int test_vec_num = (sizeof(tdes_cbc_reference_length)/
> + sizeof(tdes_cbc_reference_length[0]));
> +
> + unsigned int i;
> + for (i = 0; i < test_vec_num; i++) {
> + cipher_key.data = tdes_cbc_reference_key[i];
> + cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
> + iv.data = tdes_cbc_reference_iv[i];
> + iv.length = sizeof(tdes_cbc_reference_iv[i]);
> +
> + alg_test(ODP_CRYPTO_OP_DECODE,
> + ODP_CIPHER_ALG_3DES_CBC,
> + iv,
> + NULL,
> + cipher_key,
> + ODP_AUTH_ALG_NULL,
> + auth_key,
> + tdes_cbc_reference_ciphertext[i],
> + tdes_cbc_reference_length[i],
> + tdes_cbc_reference_plaintext[i],
> + tdes_cbc_reference_length[i]);
> + }
> +}
> +
> +/* This test verifies the correctness of HMAC_MD5 digest operation.
> + * The output check length is truncated to 12 bytes (96 bits) as
> + * returned by the crypto operation API call.
> + * Note that hash digest is a one-way operation.
> + * */
> +#define SYNC_INP_ALG_HMAC_MD5 "ALG_HMAC_MD5"
Don't mix tab and spaces.
Cheers,
Anders
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp