On 20 November 2014 10:17, Alexandru Badicioiu <
[email protected]> wrote:

> It seems I missed odp_hw_random_get() - as we discussed we just need to
> verify that the function succeeds.
> The others are for the special case of async session creation, we don't
> have yet an implementation supporting this mode.
>

There may not be enough information in the header file to define the
functionality, but in theory can't we create a test that attempts to call
these as described?
The cases will fail on linux-generic currently, but other implementations
may be able to pass them, the documentation should be good enough in theory
for this.

Taras, Bala do either of you have async support ?




>
> Alex
>
> On 20 November 2014 17:12, Mike Holmes <[email protected]> wrote:
>
>> Looks like we need to add tests for the following public functions to
>> this suite:-
>>
>> odp_crypto_get_ses_create_compl_session
>> <http://docs.opendataplane.org/linux-generic-gcov-html/linux-generic/odp_crypto.c.gcov.html#463>
>> odp_crypto_get_ses_create_compl_status
>> <http://docs.opendataplane.org/linux-generic-gcov-html/linux-generic/odp_crypto.c.gcov.html#453>
>> odp_crypto_session_create_async
>> <http://docs.opendataplane.org/linux-generic-gcov-html/linux-generic/odp_crypto.c.gcov.html#336>
>> odp_hw_random_get
>> <http://docs.opendataplane.org/linux-generic-gcov-html/linux-generic/odp_crypto.c.gcov.html#429>
>>
>>
>> On 20 November 2014 09:26, Mike Holmes <[email protected]> wrote:
>>
>>>
>>> http://docs.opendataplane.org/linux-generic-gcov-html/linux-generic/index.html
>>>
>>> We now have ~ 70% coverage for linux-generic crypto.
>>>
>>> On 20 November 2014 09:22, Maxim Uvarov <[email protected]> wrote:
>>>
>>>> Applied with minimal fixes:
>>>>
>>>> 1.
>>>> sed -i s/ODP_ERR\(/fprintf\(stderr,\ /g 0001-cunit-add-tests-for-
>>>> crypto-APIs.patch
>>>>
>>>> 2. remove setting:
>>>>  -Wno-error
>>>>
>>>> 3. in main()
>>>> no need to set up pool_base to NULL.
>>>>
>>>> 4. added binary to .gitignore
>>>>
>>>> Maxim.
>>>>
>>>> On 11/18/2014 01:39 PM, [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]>
>>>>> ---
>>>>>   test/cunit/Makefile.am                        |    9 +-
>>>>>   test/cunit/crypto/odp_crypto_test_async_inp.c |  363
>>>>> +++++++++++++++++++++++++
>>>>>   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 +++++++
>>>>>   test/cunit/odp_crypto.c                       |  100 +++++++
>>>>>   7 files changed, 858 insertions(+), 2 deletions(-)
>>>>>   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
>>>>>   create mode 100644 test/cunit/odp_crypto.c
>>>>>
>>>>> diff --git a/test/cunit/Makefile.am b/test/cunit/Makefile.am
>>>>> index 439e134..9fefdd4 100644
>>>>> --- a/test/cunit/Makefile.am
>>>>> +++ b/test/cunit/Makefile.am
>>>>> @@ -1,15 +1,20 @@
>>>>>   include $(top_srcdir)/test/Makefile.inc
>>>>>   -AM_CFLAGS += -I$(CUNIT_PATH)/include
>>>>> +AM_CFLAGS += -I$(CUNIT_PATH)/include -Wno-error
>>>>>   AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static -lcunit
>>>>>     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_init_LDFLAGS = $(AM_LDFLAGS)
>>>>>   odp_queue_LDFLAGS = $(AM_LDFLAGS)
>>>>> +odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto
>>>>> +odp_crypto_LDFLAGS = $(AM_LDFLAGS)
>>>>>   endif
>>>>>     dist_odp_init_SOURCES = odp_init.c
>>>>>   dist_odp_queue_SOURCES = odp_queue.c
>>>>> +dist_odp_crypto_SOURCES = crypto/odp_crypto_test_async_inp.c \
>>>>> +                         crypto/odp_crypto_test_sync_inp.c \
>>>>> +                         odp_crypto.c
>>>>> 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..6b9a1b2
>>>>> --- /dev/null
>>>>> +++ b/test/cunit/crypto/odp_crypto_test_async_inp.c
>>>>> @@ -0,0 +1,363 @@
>>>>> +/* 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.
>>>>> + * */
>>>>> +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;
>>>>> +
>>>>> +       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");
>>>>> +       }
>>>>> +
>>>>> +       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)
>>>>> +
>>>>> +       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);
>>>>> +
>>>>> +       odp_packet_t out_pkt;
>>>>> +       out_pkt = odp_crypto_get_operation_compl_packet(compl_event);
>>>>> +       CU_ASSERT(out_pkt == pkt);
>>>>> +
>>>>> +       CU_ASSERT(!memcmp(data_addr, output_vec, output_vec_len));
>>>>> +
>>>>> +       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 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 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 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 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 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 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, enc_alg_3des_cbc },
>>>>> +       {ASYNC_INP_DEC_ALG_3DES_CBC, dec_alg_3des_cbc },
>>>>> +       {ASYNC_INP_ENC_ALG_3DES_CBC_OVR_IV, enc_alg_3des_cbc_ovr_iv },
>>>>> +       {ASYNC_INP_DEC_ALG_3DES_CBC_OVR_IV, dec_alg_3des_cbc_ovr_iv },
>>>>> +       {ASYNC_INP_ALG_HMAC_MD5, alg_hmac_md5 },
>>>>> +       {ASYNC_INP_ENC_ALG_3DES_CBC_COMPL_NEW,
>>>>> 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..0d4360f
>>>>> --- /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 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 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"
>>>>> +static void 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,
>>>>> +                        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
>>>>> operation IV.
>>>>> + * */
>>>>> +#define SYNC_INP_ENC_ALG_3DES_CBC_OVR_IV
>>>>>  "ENC_ALG_3DES_CBC_OVR_IV"
>>>>> +static void 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,
>>>>> +                        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_OVR_IV
>>>>>  "DEC_ALG_3DES_CBC_OVR_IV"
>>>>> +static void 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,
>>>>> +                        tdes_cbc_reference_ciphertext[i],
>>>>> +                        tdes_cbc_reference_length[i],
>>>>> +                        tdes_cbc_reference_plaintext[i],
>>>>> +                        tdes_cbc_reference_length[i]);
>>>>> +       }
>>>>> +}
>>>>> +
>>>>> +CU_TestInfo test_array_sync[] = {
>>>>> +       {SYNC_INP_ENC_ALG_3DES_CBC, enc_alg_3des_cbc },
>>>>> +       {SYNC_INP_DEC_ALG_3DES_CBC, dec_alg_3des_cbc },
>>>>> +       {SYNC_INP_ENC_ALG_3DES_CBC_OVR_IV, enc_alg_3des_cbc_ovr_iv },
>>>>> +       {SYNC_INP_DEC_ALG_3DES_CBC_OVR_IV, dec_alg_3des_cbc_ovr_iv },
>>>>> +       {SYNC_INP_ALG_HMAC_MD5, alg_hmac_md5 },
>>>>> +       CU_TEST_INFO_NULL,
>>>>> +};
>>>>> diff --git a/test/cunit/crypto/odp_crypto_test_sync_inp.h
>>>>> b/test/cunit/crypto/odp_crypto_test_sync_inp.h
>>>>> new file mode 100644
>>>>> index 0000000..6a8511d
>>>>> --- /dev/null
>>>>> +++ b/test/cunit/crypto/odp_crypto_test_sync_inp.h
>>>>> @@ -0,0 +1,17 @@
>>>>> +/* Copyright (c) 2014, Linaro Limited
>>>>> + * All rights reserved.
>>>>> + *
>>>>> + * SPDX-License-Identifier:    BSD-3-Clause
>>>>> + */
>>>>> +#ifndef ODP_CRYPTO_TEST_SYNC_INP_
>>>>> +#define ODP_CRYPTO_TEST_SYNC_INP_
>>>>> +
>>>>> +#include "CUnit/TestDB.h"
>>>>> +
>>>>> +/* Suite name */
>>>>> +#define ODP_CRYPTO_SYNC_INP    "odp_crypto_sync_inp"
>>>>> +
>>>>> +/* Suite test array */
>>>>> +CU_TestInfo test_array_sync[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 }
>>>>> +};
>>>>> diff --git a/test/cunit/odp_crypto.c b/test/cunit/odp_crypto.c
>>>>> new file mode 100644
>>>>> index 0000000..87298cc
>>>>> --- /dev/null
>>>>> +++ b/test/cunit/odp_crypto.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
>>>>> +
>>>>> +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)) {
>>>>> +               printf("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 (ODP_BUFFER_POOL_INVALID == pool) {
>>>>> +               ODP_ERR("Packet pool creation failed.\n");
>>>>> +               return -1;
>>>>> +       }
>>>>> +       out_queue = odp_queue_create("crypto-out",
>>>>> +                                    ODP_QUEUE_TYPE_POLL, NULL);
>>>>> +       if (ODP_QUEUE_INVALID == out_queue) {
>>>>> +               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 (ODP_BUFFER_POOL_INVALID == pool) {
>>>>> +               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();
>>>>> +}
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> lng-odp mailing list
>>>> [email protected]
>>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>>>>
>>>
>>>
>>>
>>> --
>>> *Mike Holmes*
>>> Linaro  Sr Technical Manager
>>> LNG - ODP
>>>
>>
>>
>>
>> --
>> *Mike Holmes*
>> Linaro  Sr Technical Manager
>> LNG - ODP
>>
>> _______________________________________________
>> lng-odp mailing list
>> [email protected]
>> http://lists.linaro.org/mailman/listinfo/lng-odp
>>
>>
>


-- 
*Mike Holmes*
Linaro  Sr Technical Manager
LNG - ODP
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to