This suite is only for async inplace mode.The tests can be reused, with
some modifications, for other modes too (sync/inplace/outplace/). Command
line argument to select the the suite(s) or separate test programs could
work too.

On 31 October 2014 16:28, Jerin Jacob <jerin.ja...@caviumnetworks.com>
wrote:

> On Fri, Oct 31, 2014 at 02:08:47PM +0200, alexandru.badici...@linaro.org
> wrote:
> > From: Alexandru Badicioiu <alexandru.badici...@linaro.org>
> >
> > This patch adds a suite for async inplace mode of crypto APIs.
> > Correctness of crypto operations output is verified with known
> > test vectors  as well as various options and functionalities:
> > use session IV or operation IV for ciphering, use input packet
> > buffer or a separate buffer as the completion event, set and
> > retrieve the context associated with an operation.
>
> IMO crypto functionality unit tests should be capable of running on both
> sync and async modes.
> Platform like octeon supports only sync crypto mode.
> We can introduce a command-line option to select the mode for functional
> testcases.
> We can have separate  dedicated test to verify async/sync operation but
> crypto functional tests
> should cater both.
>
> Jerin
>
> >
> > Signed-off-by: Alexandru Badicioiu <alexandru.badici...@linaro.org>
> > ---
> >  configure.ac                                  |    1 +
> >  test/cunit/Makefile.am                        |    2 +
> >  test/cunit/crypto/Makefile.am                 |    9 +
> >  test/cunit/crypto/odp_crypto_test.c           |   26 ++
> >  test/cunit/crypto/odp_crypto_test_async_inp.c |  459
> +++++++++++++++++++++++++
> >  test/cunit/crypto/odp_crypto_test_async_inp.h |   13 +
> >  test/cunit/crypto/test_vectors.h              |   94 +++++
> >  7 files changed, 604 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/test_vectors.h
> >
> > diff --git a/configure.ac b/configure.ac
> > index fd69e85..b1785e9 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -166,6 +166,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 927a5a5..7611145 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
> >
> > +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..b984eaa
> > --- /dev/null
> > +++ b/test/cunit/crypto/Makefile.am
> > @@ -0,0 +1,9 @@
> > +include $(top_srcdir)/test/Makefile.inc
> > +
> > +if ODP_CUNIT_ENABLED
> > +bin_PROGRAMS = odp_crypto
> > +odp_crypto_LDFLAGS = $(AM_LDFLAGS) -static -lcunit
> > +endif
> > +
> > +dist_odp_crypto_SOURCES = odp_crypto_test_async_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..b5d0dea
> > --- /dev/null
> > +++ b/test/cunit/crypto/odp_crypto_test.c
> > @@ -0,0 +1,26 @@
> > +/* Copyright (c) 2014, Linaro Limited
> > + * All rights reserved.
> > + *
> > + * SPDX-License-Identifier:     BSD-3-Clause
> > + */
> > +
> > +#include <odp.h>
> > +#include "CUnit/Headers/Basic.h"
> > +#include "CUnit/Headers/TestDB.h"
> > +#include "odp_crypto_test_async_inp.h"
> > +
> > +int main(void)
> > +{
> > +     /* 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();
> > +
> > +     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..dd5fb5f
> > --- /dev/null
> > +++ b/test/cunit/crypto/odp_crypto_test_async_inp.c
> > @@ -0,0 +1,458 @@
> > +/* Copyright (c) 2014, Linaro Limited
> > + * All rights reserved.
> > + *
> > + * SPDX-License-Identifier:  BSD-3-Clause
> > + */
> > +
> > +#include <odp.h>
> > +#include <odp_crypto.h>
> > +#include "CUnit/Headers/Basic.h"
> > +#include "CUnit/Headers/TestDB.h"
> > +#include "test_vectors.h"
> > +
> > +/* Suite name */
> > +#define ODP_CRYPTO_ASYNC_INP "odp_crypto_async_inp"
> > +
> > +/* Suite init/finalize funcs */
> > +/* ODP global/local initialization
> > + * Packet pool creation
> > + * Crypto output queue creation */
> > +
> > +#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
> > +
> > +static int init(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");
> > +             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) {
> > +             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());
> > +     return 0;
> > +}
> > +
> > +/* ODP cleanup */
> > +static int finalize(void)
> > +{
> > +     odp_term_local();
> > +     odp_term_global();
> > +     return 0;
> > +}
> > +
> > +
> > +/* Basic algorithm run function.
> > + * 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.
> > + * */
> > +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 */
> > +     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_set_operation_compl_ctx */
> > +     /* TEST : odp_crypto_operation */
> > +     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"
> > +static void test_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_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_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_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"
> > +static void test_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"
> > +static void test_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);
> > +     }
> > +}
> > +
> > +static CU_TestInfo test_array[] = {
> > +     {ASYNC_INP_ENC_ALG_3DES_CBC, test_enc_alg_3des_cbc },
> > +     {ASYNC_INP_DEC_ALG_3DES_CBC, test_dec_alg_3des_cbc },
> > +     {ASYNC_INP_ENC_ALG_3DES_CBC_OVR_IV, test_enc_alg_3des_cbc_ovr_iv },
> > +     {ASYNC_INP_DEC_ALG_3DES_CBC_OVR_IV, test_dec_alg_3des_cbc_ovr_iv },
> > +     {ASYNC_INP_ALG_HMAC_MD5, test_alg_hmac_md5 },
> > +     {ASYNC_INP_ENC_ALG_3DES_CBC_COMPL_NEW,
> test_enc_alg_3des_cbc_compl_new },
> > +     CU_TEST_INFO_NULL,
> > +};
> > +
> > +CU_SuiteInfo suites[] = {
> > +     { ODP_CRYPTO_ASYNC_INP , init, finalize, NULL, NULL, test_array },
> > +     CU_SUITE_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..818f7e7
> > --- /dev/null
> > +++ b/test/cunit/crypto/odp_crypto_test_async_inp.h
> > @@ -0,0 +1,13 @@
> > +/* 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/Headers/TestDB.h"
> > +
> > +CU_SuiteInfo suites[1];
> > +
> > +#endif
> > diff --git a/test/cunit/crypto/test_vectors.h
> b/test/cunit/crypto/test_vectors.h
> > new file mode 100644
> > index 0000000..c151952
> > --- /dev/null
> > +++ b/test/cunit/crypto/test_vectors.h
> > @@ -0,0 +1,94 @@
> > +/* Copyright (c) 2014, Linaro Limited
> > + * All rights reserved.
> > + *
> > + * SPDX-License-Identifier:  BSD-3-Clause
> > + */
> > +
> > +
> > +/* TDES-CBC reference vectors, according to
> > + * "http://csrc.nist.gov/groups/STM/cavp/documents/des/DESMMT.pdf";
> > + */
> > +
> > +#define TDES_CBC_KEY_LEN     24      /* key length(in bytes) for
> tdes-cbc */
> > +#define TDES_CBC_IV_LEN              8       /* IV length(in bytes) for
> tdes-cbc */
> > +#define TDES_CBC_MAX_DATA_LEN        16      /* max. plain text
> length(in bytes) */
> > +
> > +static uint8_t tdes_cbc_reference_key[][TDES_CBC_KEY_LEN] = {
> > +     {0x62, 0x7f, 0x46, 0x0e, 0x08, 0x10, 0x4a, 0x10, 0x43, 0xcd, 0x26,
> 0x5d,
> > +      0x58, 0x40, 0xea, 0xf1, 0x31, 0x3e, 0xdf, 0x97, 0xdf, 0x2a, 0x8a,
> 0x8c,
> > +      },
> > +
> > +     {0x37, 0xae, 0x5e, 0xbf, 0x46, 0xdf, 0xf2, 0xdc, 0x07, 0x54, 0xb9,
> 0x4f,
> > +      0x31, 0xcb, 0xb3, 0x85, 0x5e, 0x7f, 0xd3, 0x6d, 0xc8, 0x70, 0xbf,
> 0xae}
> > +};
> > +
> > +static uint8_t tdes_cbc_reference_iv[][TDES_CBC_IV_LEN] = {
> > +     {0x8e, 0x29, 0xf7, 0x5e, 0xa7, 0x7e, 0x54, 0x75},
> > +
> > +     {0x3d, 0x1d, 0xe3, 0xcc, 0x13, 0x2e, 0x3b, 0x65}
> > +};
> > +
> > +/** length in bytes */
> > +static uint32_t tdes_cbc_reference_length[] = { 8, 16 };
> > +
> > +static uint8_t tdes_cbc_reference_plaintext[][TDES_CBC_MAX_DATA_LEN] = {
> > +     {0x32, 0x6a, 0x49, 0x4c, 0xd3, 0x3f, 0xe7, 0x56},
> > +
> > +     {0x84, 0x40, 0x1f, 0x78, 0xfe, 0x6c, 0x10, 0x87, 0x6d, 0x8e, 0xa2,
> 0x30,
> > +      0x94, 0xea, 0x53, 0x09}
> > +};
> > +
> > +static uint8_t tdes_cbc_reference_ciphertext[][TDES_CBC_MAX_DATA_LEN] =
> {
> > +     {0xb2, 0x2b, 0x8d, 0x66, 0xde, 0x97, 0x06, 0x92},
> > +
> > +     {0x7b, 0x1f, 0x7c, 0x7e, 0x3b, 0x1c, 0x94, 0x8e, 0xbd, 0x04, 0xa7,
> 0x5f,
> > +      0xfb, 0xa7, 0xd2, 0xf5}
> > +};
> > +
> > +
> > +/* HMAC-MD5 test vectors  - RFC2104 */
> > +#define HMAC_MD5_KEY_LEN     16
> > +#define HMAC_MD5_MAX_DATA_LEN        128
> > +#define HMAC_MD5_DIGEST_LEN  16
> > +#define HMAC_MD5_96_CHECK_LEN        12
> > +
> > +static uint8_t hmac_md5_reference_key[][HMAC_MD5_KEY_LEN] = {
> > +     { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
> > +       0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b } ,
> > +
> > +     /* "Jefe" */
> > +     { 0x4a, 0x65, 0x66, 0x65 },
> > +
> > +     { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
> > +       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }
> > +};
> > +
> > +static uint32_t hmac_md5_reference_length[] = { 8, 28, 50 };
> > +
> > +static uint8_t hmac_md5_reference_plaintext[][HMAC_MD5_MAX_DATA_LEN] = {
> > +     /* "Hi There" */
> > +     { 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65},
> > +
> > +     /* what do ya want for nothing?*/
> > +     { 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20,
> > +       0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20,
> > +       0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
> > +       0x69, 0x6e, 0x67, 0x3f },
> > +
> > +     { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
> > +       0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
> > +       0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
> > +       0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
> > +       0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd }
> > +};
> > +
> > +static uint8_t hmac_md5_reference_digest[][HMAC_MD5_DIGEST_LEN] = {
> > +     { 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
> > +       0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d },
> > +
> > +     { 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
> > +       0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 },
> > +
> > +     { 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
> > +       0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 }
> > +};
> > --
> > 1.7.3.4
> >
> >
> > _______________________________________________
> > lng-odp mailing list
> > lng-odp@lists.linaro.org
> > http://lists.linaro.org/mailman/listinfo/lng-odp
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to