better to be uniform with the name TDES or 3DES
On 10/17/2018 6:19 PM, Marko Kovacevic wrote: > Added enablement for TDES parser, to allow the > application to parser the TDES request files and to validate all > test types supported. > > Signed-off-by: Marko Kovacevic <marko.kovace...@intel.com> > Signed-off-by: Fan Zhang <roy.fan.zh...@intel.com> > Acked-by: Arek Kusztal <arkadiuszx.kusz...@intel.com> > --- > examples/cryptodev_fips_validate/Makefile | 1 + > .../cryptodev_fips_parse_3des.c | 259 > +++++++++++++++++++++ > .../cryptodev_fips_parse_aes.c | 2 + > .../cryptodev_fips_parse_validate.c | 5 + > .../cryptodev_fips_validate.h | 21 ++ > examples/cryptodev_fips_validate/main.c | 175 ++++++++++++++ > examples/cryptodev_fips_validate/meson.build | 1 + > 7 files changed, 464 insertions(+) > create mode 100644 > examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c > > diff --git a/examples/cryptodev_fips_validate/Makefile > b/examples/cryptodev_fips_validate/Makefile > index c85c76c..2ddf326 100644 > --- a/examples/cryptodev_fips_validate/Makefile > +++ b/examples/cryptodev_fips_validate/Makefile > @@ -7,6 +7,7 @@ APP = fips_validation > # all source are stored in SRCS-y > SRCS-y := cryptodev_fips_parse_aes.c > SRCS-y += cryptodev_fips_parse_hmac.c > +SRCS-y += cryptodev_fips_parse_3des.c > SRCS-y += cryptodev_fips_parse_validate.c > SRCS-y += main.c > > diff --git a/examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c > b/examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c > new file mode 100644 > index 0000000..82e9132 > --- /dev/null > +++ b/examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c > @@ -0,0 +1,259 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2018 Intel Corporation > + */ > + > +#include <string.h> > +#include <stdio.h> > + > +#include <rte_malloc.h> > +#include <rte_cryptodev.h> > + > +#include "cryptodev_fips_validate.h" > + > +#define NEW_LINE_STR "#" > +#define TEST_TYPE_KEY " for CBC" > +#define TEST_CBCI_KEY " for CBCI" > + > +#define ENC_STR "[ENCRYPT]" > +#define DEC_STR "[DECRYPT]" > + > +#define COUNT_STR "COUNT = " > +#define KEY1_STR "KEY1 = " > +#define KEY2_STR "KEY2 = " > +#define KEY3_STR "KEY3 = " > + > +#define KEYS_STR "KEYs = " > +#define IV_STR "IV = " > +#define PT_STR "PLAINTEXT = " > +#define CT_STR "CIPHERTEXT = " > +#define NK_STR "NumKeys = " > + > +#define SET_STR " = " > + > +#define PLAIN_TEXT 0 > +#define CIPHER_TEXT 1 > +#define KEY_TEXT 2 > +#define IV_TEXT 3 > + > +#define DEVICE_STR "# Config Info for : " > + > +struct { > + uint32_t type; > + const char *desc; > +} test_types[] = { > + {TDES_INVERSE_PERMUTATION, "INVERSE PERMUTATION"}, > + {TDES_PERMUTATION, "PERMUTATION OPERATION"}, > + {TDES_SUBSTITUTION_TABLE, "SUBSTITUTION TABLE"}, > + {TDES_VARIABLE_KEY, "VARIABLE KEY"}, > + {TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"}, > + {TDES_VARIABLE_TEXT, "KAT"}, > + {TDES_MCT, "Monte Carlo (Modes) Test"}, > + {TDES_MMT, "Multi block Message Test"}, > +}; > + > +static int > +writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val); > + > +static int > +parse_3des_uint8_hex_str(const char *key, char *src, struct fips_val *val); > + > +static int > +parse_tdes_interim(const char *key, > + __attribute__((__unused__)) char *text, > + struct fips_val *val); > + > +struct fips_test_callback tdes_tests_vectors[] = { > + {KEYS_STR, parse_3des_uint8_hex_str, &vec.cipher_auth.key}, > + {KEY1_STR, parse_3des_uint8_hex_str, &vec.cipher_auth.key}, > + {KEY2_STR, parse_3des_uint8_hex_str, &vec.cipher_auth.key}, > + {KEY3_STR, parse_3des_uint8_hex_str, &vec.cipher_auth.key}, > + {IV_STR, parse_uint8_hex_str, &vec.iv}, > + {PT_STR, parse_uint8_hex_str, &vec.pt}, > + {CT_STR, parse_uint8_hex_str, &vec.ct}, > + {NULL, NULL, NULL} /**< end pointer */ > +}; > + > +struct fips_test_callback tdes_tests_interim_vectors[] = { > + {ENC_STR, parse_tdes_interim, NULL}, > + {DEC_STR, parse_tdes_interim, NULL}, > + {NULL, NULL, NULL} /**< end pointer */ > +}; > + > +struct fips_test_callback tdes_writeback_callbacks[] = { > + /** First element is used to pass COUNT string */ > + {COUNT_STR, NULL, NULL}, > + {IV_STR, writeback_hex_str, &vec.iv}, > + {KEY1_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, > + {KEY2_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, > + {KEY3_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, > + {KEYS_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, > + {PT_STR, writeback_hex_str, &vec.pt}, > + {CT_STR, writeback_hex_str, &vec.ct}, > + {NULL, NULL, NULL} /**< end pointer */ > +}; > + > +static int > +parse_tdes_interim(const char *key, > + __attribute__((__unused__)) char *text, > + __attribute__((__unused__)) struct fips_val *val) > +{ > + if (strstr(key, ENC_STR)) > + info.op = FIPS_TEST_ENC_AUTH_GEN; > + else if (strstr(key, DEC_STR)) > + info.op = FIPS_TEST_DEC_AUTH_VERIF; > + else if (strstr(NK_STR, "NumKeys = 1")) > + info.interim_info.tdes_data.nb_keys = 1; > + else if (strstr(NK_STR, "NumKeys = 2")) > + info.interim_info.tdes_data.nb_keys = 2; > + else if (strstr(NK_STR, "NumKeys = 3")) > + info.interim_info.tdes_data.nb_keys = 3; > + else > + return -EINVAL; > + > + return 0; > +} > + > +static int > +parse_3des_uint8_hex_str(const char *key, char *src, struct fips_val *val) > +{ > + uint8_t tmp_key[24] = {0}; > + uint32_t len, i; > + > + src += strlen(key); > + > + len = strlen(src) / 2; > + > + if (val->val) { > + memcpy(tmp_key, val->val, val->len); > + rte_free(val->val); > + } > + > + val->val = rte_zmalloc(NULL, 24, 0); > + if (!val->val) > + return -1; > + > + memcpy(val->val, tmp_key, 24); > + > + if (strstr(key, KEYS_STR)) { > + for (i = 0; i < len; i++) { > + char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; > + > + if (parser_read_uint8_hex(&val->val[i], byte) < 0) > + return -EINVAL; memory leak for val->val > + } > + > + memcpy(val->val + 8, val->val, 8); > + memcpy(val->val + 16, val->val, 8); > + > + } else if (strstr(key, KEY1_STR)) { > + for (i = 0; i < len; i++) { > + char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; > + > + if (parser_read_uint8_hex(&val->val[i], byte) < 0) > + return -EINVAL; > + } > + > + if (info.interim_info.tdes_data.nb_keys == 2) > + memcpy(val->val + 16, val->val, 8); > + > + } else if (strstr(key, KEY2_STR)) { > + for (i = 0; i < len; i++) { > + char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; > + > + if (parser_read_uint8_hex(&val->val[i + 8], byte) < 0) > + return -EINVAL; > + } > + > + } else if (strstr(key, KEY3_STR)) { > + for (i = 0; i < len; i++) { > + char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; > + > + if (parser_read_uint8_hex(&val->val[i + 16], byte) < 0) > + return -EINVAL; > + } > + } else > + return -EINVAL; > + > + val->len = 24; > + > + return 0; > +} > + >