On 24/10/2018 13:31, Akhil Goyal wrote:
better to be uniform with the name
TDES or 3DES
sure will make it uniform

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
good catch will fix it.
+               }
+
+               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;
+}
+

Reply via email to