Skip to contentSkip to conversation

FIPS validation capability

PATCH Superseded Marko Kovacevic 3 participants 52 messages Oct 12, 2018 – Nov 2, 2018 Arm/Amlogic Meson SoC support

lore
Share & tools
lore
#0 lore raw

v4 cover FIPS validation capability

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Marko Kovacevic (8):
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples: add fips validation into examples
examples: add aes parser and enablement for test types
examples: add hmac parser
examples: add TDES parser and enablement for test types
examples: add gcm parser
examples: add cmac parser and enablement for test types
examples: add ccm parser and enablement for test types
doc: add guides for fips validation

 doc/guides/rel_notes/release_18_11.rst             |    6 +
 doc/guides/sample_app_ug/fips_validation.rst       |  105 ++
 doc/guides/sample_app_ug/index.rst                 |    1 +
 examples/cryptodev_fips_validate/Makefile          |   75 ++
 .../cryptodev_fips_parse_3des.c                    |  259 +++++
 .../cryptodev_fips_parse_aes.c                     |  188 +++
 .../cryptodev_fips_parse_ccm.c                     |  272 +++++
 .../cryptodev_fips_parse_cmac.c                    |  116 ++
 .../cryptodev_fips_parse_gcm.c                     |  125 ++
 .../cryptodev_fips_parse_hmac.c                    |  105 ++
 .../cryptodev_fips_parse_validate.c                |  593 ++++++++++
 .../cryptodev_fips_validate.h                      |  234 ++++
 examples/cryptodev_fips_validate/main.c            | 1221 ++++++++++++++++++++
 examples/cryptodev_fips_validate/meson.build       |   20 +
 14 files changed, 3320 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
 create mode 100644 examples/cryptodev_fips_validate/Makefile
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h
 create mode 100644 examples/cryptodev_fips_validate/main.c
 create mode 100644 examples/cryptodev_fips_validate/meson.build
Signature · 1 line
2.9.5
#1 lore raw

PATCH v4 1/8 examples: add fips validation into examples

Added FIPS application into the examples to allow users to use a simple sample app to validate their systems and be able to get FIPS certification.

---
 examples/cryptodev_fips_validate/Makefile          |  69 +++
 .../cryptodev_fips_parse_validate.c                | 562 +++++++++++++++++++++
 .../cryptodev_fips_validate.h                      | 150 ++++++
 examples/cryptodev_fips_validate/main.c            | 388 ++++++++++++++
 examples/cryptodev_fips_validate/meson.build       |  14 +
 5 files changed, 1183 insertions(+)
 create mode 100644 examples/cryptodev_fips_validate/Makefile
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h
 create mode 100644 examples/cryptodev_fips_validate/main.c
 create mode 100644 examples/cryptodev_fips_validate/meson.build
examples/cryptodev_fips_validate/Makefile new file +69 -0
new file mode 100644
index 0000000..5515aa6
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2014 Intel Corporation
+
+# binary name
+APP = cryptodev_fips_validate_app
+
+# all source are stored in SRCS-y
+SRCS-y += cryptodev_fips_parse_validate.c
+SRCS-y += main.c
+
+# Build using pkg-config variables if possible
+$(shell pkg-config --exists libdpdk)
+ifeq ($(.SHELLSTATUS),0)
+
+all: shared
+.PHONY: shared static
+shared: build/$(APP)-shared
+	ln -sf $(APP)-shared build/$(APP)
+static: build/$(APP)-static
+	ln -sf $(APP)-static build/$(APP)
+
+PC_FILE := $(shell pkg-config --path libdpdk)
+CFLAGS += -O3 $(shell pkg-config --cflags libdpdk)
+LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk)
+LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk)
+
+build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
+
+build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)
+
+build:
+	@mkdir -p $@
+
+.PHONY: clean
+clean:
+	rm -f build/$(APP) build/$(APP)-static build/$(APP)-shared
+	rmdir --ignore-fail-on-non-empty build
+
+else
+
+ifeq ($(RTE_SDK),)
+$(error "Please define RTE_SDK environment variable")
+endif
+
+# Default target, can be overridden by command line or environment
+RTE_TARGET ?= x86_64-native-linuxapp-gcc
+
+INC += $(sort $(wildcard *.h))
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+CFLAGS += $(WERROR_FLAGS)
+
+# workaround for a gcc bug with noreturn attribute
+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603
+ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)
+CFLAGS_main.o += -Wno-return-type
+endif
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+CFLAGS += -I$(SRCDIR)
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+include $(RTE_SDK)/mk/rte.extapp.mk
+
+endif
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +562 -0

562 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +150 -0

150 lines not on this page · raw message

examples/cryptodev_fips_validate/main.c new file +388 -0

388 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build new file +14 -0
new file mode 100644
index 0000000..e417733
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 Intel Corporation
+
+# meson file, for building this example as part of a main DPDK build.
+#
+# To build this example as a standalone application with an already-installed
+# DPDK instance, use 'make'
+
+deps += ['cryptodev', 'bus_pci']
+allow_experimental_apis = true
+sources = files(
+	'cryptodev_fips_parse_validate.c',
+	'main.c'
+)
Signature · 1 line
2.9.5
#2 lore raw

PATCH v4 2/8 examples: add aes parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for AES-CBC parser, to allow the application to parser the aes request file and to validate all test types supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_aes.c                     | 186 +++++++++++
 .../cryptodev_fips_parse_validate.c                |   6 +
 .../cryptodev_fips_validate.h                      |  24 ++
 examples/cryptodev_fips_validate/main.c            | 346 ++++++++++++++++++++-
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 563 insertions(+), 1 deletion(-)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c
examples/cryptodev_fips_validate/Makefile +1 -0
index 5515aa6..f058081 100644
@@ -5,6 +5,7 @@
 APP = cryptodev_fips_validate_app
 
 # all source are stored in SRCS-y
+SRCS-y := cryptodev_fips_parse_aes.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c new file +186 -0

186 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +6 -0
index aec5bb9..32af47b 100644
@@ -104,6 +104,12 @@ fips_test_parse_header(void)
 		return ret;
 
 	for (i = 0; i < info.nb_vec_lines; i++) {
+		if (strstr(info.vec[i], "AESVS")) {
+			info.algo = FIPS_TEST_ALGO_AES;
+			ret = parse_test_aes_init();
+			if (ret < 0)
+				return ret;
+		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
 		if (tmp != NULL) {
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +24 -0
index beb6bed..5ac858d 100644
@@ -23,6 +23,7 @@
 #define FAX_FILE_PERFIX		"fax"
 
 enum fips_test_algorithms {
+		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -77,6 +78,21 @@ struct fips_test_callback {
 	struct fips_val *val;
 };
 
+enum fips_aesavs_test_types {
+	AESAVS_TYPE_GFXBOX = 0,
+	AESAVS_TYPE_KEYSBOX,
+	AESAVS_TYPE_VARKEY,
+	AESAVS_TYPE_VARTXT,
+	AESAVS_TYPE_MMT,
+	AESAVS_TYPE_MCT,
+};
+
+struct aesavs_interim_data {
+	enum fips_aesavs_test_types test_type;
+	uint32_t cipher_algo;
+	uint32_t key_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -88,6 +104,11 @@ struct fips_test_interim_info {
 	//uint8_t cryptodev_id;
 	char device_name[MAX_STRING_SIZE];
 
+	union {
+		struct aesavs_interim_data aes_data;
+
+	} interim_info;
+
 	enum fips_test_op op;
 
 	const struct fips_test_callback *callbacks;
@@ -118,6 +139,9 @@ void
 fips_test_write_one_case(void);
 
 int
+parse_test_aes_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +345 -1

368 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index e417733..d04e9bb 100644
@@ -9,6 +9,7 @@
 deps += ['cryptodev', 'bus_pci']
 allow_experimental_apis = true
 sources = files(
+	'cryptodev_fips_parse_aes.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#3 lore raw

PATCH v4 3/8 examples: add hmac parser

In reply to Marko Kovacevic

Added enablement for HMAC parser, to allow the application to parser the hmac request files and to validate all tests supported

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_hmac.c                    | 105 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |   9 ++
 examples/cryptodev_fips_validate/main.c            | 103 ++++++++++++++++++++
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 224 insertions(+)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c
examples/cryptodev_fips_validate/Makefile +1 -0
index f058081..50be23c 100644
@@ -6,6 +6,7 @@ APP = cryptodev_fips_validate_app
 
 # 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_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c new file +105 -0

105 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index 32af47b..f1cd802 100644
@@ -109,6 +109,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "HMAC")) {
+			info.algo = FIPS_TEST_ALGO_HMAC;
+			ret = parse_test_hmac_init();
+			if (ret < 0)
+				return ret;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +9 -0
index 5ac858d..3cda9fe 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -93,6 +94,10 @@ struct aesavs_interim_data {
 	uint32_t key_len;
 };
 
+struct hmac_interim_data {
+	enum rte_crypto_auth_algorithm algo;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -106,6 +111,7 @@ struct fips_test_interim_info {
 
 	union {
 		struct aesavs_interim_data aes_data;
+		struct hmac_interim_data hmac_data;
 
 	} interim_info;
 
@@ -142,6 +148,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_hmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +103 -0

121 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index d04e9bb..dcf90bb 100644
@@ -10,6 +10,7 @@ deps += ['cryptodev', 'bus_pci']
 allow_experimental_apis = true
 sources = files(
 	'cryptodev_fips_parse_aes.c',
+	'cryptodev_fips_parse_hmac.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#4 lore raw

PATCH v4 4/8 examples: add TDES parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for TDES parser, to allow the application to parser the TDES request files and to validate all test types supported.

---
 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
examples/cryptodev_fips_validate/Makefile +1 -0
index 50be23c..54ea43f 100644
@@ -7,6 +7,7 @@ APP = cryptodev_fips_validate_app
 # 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
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +259 -0

259 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c +2 -0
index 39dbd6f..cc27754 100644
@@ -33,6 +33,8 @@ struct {
 		{AESAVS_TYPE_KEYSBOX, "KeySbox"},
 		{AESAVS_TYPE_VARKEY, "VarKey"},
 		{AESAVS_TYPE_VARTXT, "VarTxt"},
+		{TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"},
+		{TDES_VARIABLE_TEXT, "KAT"},
 		{AESAVS_TYPE_MMT, "MMT"},
 		{AESAVS_TYPE_MCT, "MCT"},
 };
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index f1cd802..bb396e5 100644
@@ -114,6 +114,11 @@ fips_test_parse_header(void)
 			ret = parse_test_hmac_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "TDES")) {
+			info.algo = FIPS_TEST_ALGO_TDES;
+			ret = parse_test_tdes_init();
+			if (ret < 0)
+				return 0;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +21 -0
index 3cda9fe..c9b11dd 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_HMAC,
+		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -88,6 +89,17 @@ enum fips_aesavs_test_types {
 	AESAVS_TYPE_MCT,
 };
 
+enum fips_tdes_test_types {
+	TDES_INVERSE_PERMUTATION = 0,
+	TDES_PERMUTATION,
+	TDES_SUBSTITUTION_TABLE,
+	TDES_VARIABLE_KEY,
+	TDES_VARIABLE_TEXT,
+	TDES_KAT,
+	TDES_MCT, /* Monte Carlo (Modes) Test */
+	TDES_MMT /* Multi block Message Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -98,6 +110,11 @@ struct hmac_interim_data {
 	enum rte_crypto_auth_algorithm algo;
 };
 
+struct tdes_interim_data {
+	enum fips_tdes_test_types test_type;
+	uint32_t nb_keys;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -112,6 +129,7 @@ struct fips_test_interim_info {
 	union {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
+		struct tdes_interim_data tdes_data;
 
 	} interim_info;
 
@@ -148,6 +166,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_tdes_init(void);
+
+int
 parse_test_hmac_init(void);
 
 int
examples/cryptodev_fips_validate/main.c +175 -0

193 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index dcf90bb..a18e76d 100644
@@ -11,6 +11,7 @@ allow_experimental_apis = true
 sources = files(
 	'cryptodev_fips_parse_aes.c',
 	'cryptodev_fips_parse_hmac.c',
+	'cryptodev_fips_parse_3des.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#5 lore raw

PATCH v4 5/8 examples: add gcm parser

In reply to Marko Kovacevic

Added enablement for GCM parser, to allow the application to parser the GCM request file and to validate all tests supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_gcm.c                     | 125 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |   4 +
 examples/cryptodev_fips_validate/main.c            | 116 ++++++++++++++++++-
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 251 insertions(+), 1 deletion(-)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c
examples/cryptodev_fips_validate/Makefile +1 -0
index 54ea43f..1eb0108 100644
@@ -8,6 +8,7 @@ APP = cryptodev_fips_validate_app
 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_gcm.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c new file +125 -0

125 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index bb396e5..d45c88d 100644
@@ -109,6 +109,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "GCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_GCM;
+			ret = parse_test_gcm_init();
+			if (ret < 0)
+				return ret;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +4 -0
index c9b11dd..685bc0b 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -172,6 +173,9 @@ int
 parse_test_hmac_init(void);
 
 int
+parse_test_gcm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +115 -1

134 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index a18e76d..510d2a7 100644
@@ -12,6 +12,7 @@ sources = files(
 	'cryptodev_fips_parse_aes.c',
 	'cryptodev_fips_parse_hmac.c',
 	'cryptodev_fips_parse_3des.c',
+	'cryptodev_fips_parse_gcm.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#6 lore raw

PATCH v4 6/8 examples: add cmac parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for CMAC parser, to allow the application to parser the cmac request files and to validate all test types supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_cmac.c                    | 116 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |   4 +
 examples/cryptodev_fips_validate/main.c            |  43 ++++++++
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 170 insertions(+)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c
examples/cryptodev_fips_validate/Makefile +1 -0
index 1eb0108..f5c2705 100644
@@ -9,6 +9,7 @@ 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_gcm.c
+SRCS-y += cryptodev_fips_parse_cmac.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c new file +116 -0

116 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index d45c88d..4617c67 100644
@@ -114,6 +114,11 @@ fips_test_parse_header(void)
 			ret = parse_test_gcm_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "CMAC")) {
+			info.algo = FIPS_TEST_ALGO_AES_CMAC;
+			ret = parse_test_cmac_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +4 -0
index 685bc0b..7bd1e9a 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
+		FIPS_TEST_ALGO_AES_CMAC,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -176,6 +177,9 @@ int
 parse_test_gcm_init(void);
 
 int
+parse_test_cmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +43 -0

55 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index 510d2a7..4889d70 100644
@@ -13,6 +13,7 @@ sources = files(
 	'cryptodev_fips_parse_hmac.c',
 	'cryptodev_fips_parse_3des.c',
 	'cryptodev_fips_parse_gcm.c',
+	'cryptodev_fips_parse_cmac.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#7 lore raw

PATCH v4 7/8 examples: add ccm parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for CCM parser, to allow the application to parser the ccm request files and to validate all test types supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_ccm.c                     | 272 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |  22 ++
 examples/cryptodev_fips_validate/main.c            |  56 ++++-
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 356 insertions(+), 1 deletion(-)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c
examples/cryptodev_fips_validate/Makefile +1 -0
index f5c2705..4f1dc6b 100644
@@ -10,6 +10,7 @@ SRCS-y += cryptodev_fips_parse_hmac.c
 SRCS-y += cryptodev_fips_parse_3des.c
 SRCS-y += cryptodev_fips_parse_gcm.c
 SRCS-y += cryptodev_fips_parse_cmac.c
+SRCS-y += cryptodev_fips_parse_ccm.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c new file +272 -0

272 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index 4617c67..47e3732 100644
@@ -119,6 +119,11 @@ fips_test_parse_header(void)
 			ret = parse_test_cmac_init();
 			if (ret < 0)
 				return 0;
+		} else if (strstr(info.vec[i], "CCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_CCM;
+			ret = parse_test_ccm_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +22 -0
index 7bd1e9a..afa0c0a 100644
@@ -26,6 +26,7 @@ enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_AES_CMAC,
+		FIPS_TEST_ALGO_AES_CCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -102,6 +103,14 @@ enum fips_tdes_test_types {
 	TDES_MMT /* Multi block Message Test */
 };
 
+enum fips_ccm_test_types {
+	CCM_VADT	= 1, /* Variable Associated Data Test */
+	CCM_VPT,		 /* Variable Payload Test */
+	CCM_VNT,		 /* Variable Nonce Test */
+	CCM_VTT,		 /* Variable Tag Test */
+	CCM_DVPT,	 /*  Decryption-Verification Process Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -117,6 +126,15 @@ struct tdes_interim_data {
 	uint32_t nb_keys;
 };
 
+struct ccm_interim_data {
+	enum fips_ccm_test_types test_type;
+	uint32_t aad_len;
+	uint32_t pt_len;
+	uint32_t digest_len;
+	uint32_t key_len;
+	uint32_t iv_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -132,6 +150,7 @@ struct fips_test_interim_info {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
 		struct tdes_interim_data tdes_data;
+		struct ccm_interim_data ccm_data;
 
 	} interim_info;
 
@@ -180,6 +199,9 @@ int
 parse_test_cmac_init(void);
 
 int
+parse_test_ccm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +55 -1

74 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index 4889d70..e3bf7ac 100644
@@ -14,6 +14,7 @@ sources = files(
 	'cryptodev_fips_parse_3des.c',
 	'cryptodev_fips_parse_gcm.c',
 	'cryptodev_fips_parse_cmac.c',
+	'cryptodev_fips_parse_ccm.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#8 lore raw

PATCH v4 8/8 doc: add guides for fips validation

In reply to Marko Kovacevic

Document explains how to run the fips sample app and instructions users need to parser all the request files and generate the response files.

---
 doc/guides/rel_notes/release_18_11.rst       |   6 ++
 doc/guides/sample_app_ug/fips_validation.rst | 105 +++++++++++++++++++++++++++
 doc/guides/sample_app_ug/index.rst           |   1 +
 3 files changed, 112 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
doc/guides/rel_notes/release_18_11.rst +6 -0
index 436b20e..83ad92e 100644
@@ -54,6 +54,12 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Added Cryptodev Fips Validation Example Application.**
+
+  Added an example application to parse and perform symmetric cryptography
+  computation to the NIST Cryptographic Algorithm Validation Program (CAVP)
+  test vectors.
+
 * **Added support for using externally allocated memory in DPDK.**
 
   DPDK has gained support for creating new ``rte_malloc`` heaps referencing
doc/guides/sample_app_ug/fips_validation.rst new file +105 -0

105 lines not on this page · raw message

doc/guides/sample_app_ug/index.rst +1 -0
index 74b12af..65c12d9 100644
@@ -57,6 +57,7 @@ Sample Applications User Guides
     performance_thread
     ipsec_secgw
     bbdev_app
+    fips_validation
 
 **Figures**
 
Signature · 1 line
2.9.5
#9 lore raw
In reply to Marko Kovacevic
Quoted 76 lines

-----Original Message-----
From: Kovacevic, Marko
Sent: Friday, October 12, 2018 4:45 PM
To: [email protected]
Cc: Zhang, Roy Fan <[email protected]>; [email protected]; Kusztal, ArkadiuszX <[email protected]>; Kovacevic, Marko <[email protected]>
Subject: [PATCH v4 0/8] FIPS validation capability

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Marko Kovacevic (8):
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples: add fips validation into examples
examples: add aes parser and enablement for test types
examples: add hmac parser
examples: add TDES parser and enablement for test types
examples: add gcm parser
examples: add cmac parser and enablement for test types
examples: add ccm parser and enablement for test types
doc: add guides for fips validation

 doc/guides/rel_notes/release_18_11.rst             |    6 +
 doc/guides/sample_app_ug/fips_validation.rst       |  105 ++
 doc/guides/sample_app_ug/index.rst                 |    1 +
 examples/cryptodev_fips_validate/Makefile          |   75 ++
 .../cryptodev_fips_parse_3des.c                    |  259 +++++
 .../cryptodev_fips_parse_aes.c                     |  188 +++
 .../cryptodev_fips_parse_ccm.c                     |  272 +++++
 .../cryptodev_fips_parse_cmac.c                    |  116 ++
 .../cryptodev_fips_parse_gcm.c                     |  125 ++
 .../cryptodev_fips_parse_hmac.c                    |  105 ++
 .../cryptodev_fips_parse_validate.c                |  593 ++++++++++
 .../cryptodev_fips_validate.h                      |  234 ++++
 examples/cryptodev_fips_validate/main.c            | 1221
++++++++++++++++++++
 examples/cryptodev_fips_validate/meson.build       |   20 +
 14 files changed, 3320 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
 create mode 100644 examples/cryptodev_fips_validate/Makefile
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c
 create mode 100644
examples/cryptodev_fips_validate/cryptodev_fips_validate.h
 create mode 100644 examples/cryptodev_fips_validate/main.c
 create mode 100644 examples/cryptodev_fips_validate/meson.build
Quoted 2 lines

--
2.9.5

#10 lore raw
In reply to Marko Kovacevic

Hi Marko/Fan,

Quoted 43 lines · Marko Kovacevic

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Marko Kovacevic (8):
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples: add fips validation into examples
examples: add aes parser and enablement for test types
examples: add hmac parser
examples: add TDES parser and enablement for test types
examples: add gcm parser
examples: add cmac parser and enablement for test types
examples: add ccm parser and enablement for test types
doc: add guides for fips validation

  doc/guides/rel_notes/release_18_11.rst             |    6 +
  doc/guides/sample_app_ug/fips_validation.rst       |  105 ++
  doc/guides/sample_app_ug/index.rst                 |    1 +
  examples/cryptodev_fips_validate/Makefile          |   75 ++
  .../cryptodev_fips_parse_3des.c                    |  259 +++++
  .../cryptodev_fips_parse_aes.c                     |  188 +++
  .../cryptodev_fips_parse_ccm.c                     |  272 +++++
  .../cryptodev_fips_parse_cmac.c                    |  116 ++
  .../cryptodev_fips_parse_gcm.c                     |  125 ++
  .../cryptodev_fips_parse_hmac.c                    |  105 ++
  .../cryptodev_fips_parse_validate.c                |  593 ++++++++++
  .../cryptodev_fips_validate.h                      |  234 ++++
  examples/cryptodev_fips_validate/main.c            | 1221 ++++++++++++++++++++
  examples/cryptodev_fips_validate/meson.build       |   20 +
  14 files changed, 3320 insertions(+)
Quoted 13 lines

create mode 100644 doc/guides/sample_app_ug/fips_validation.rst create mode 100644 examples/cryptodev_fips_validate/Makefile
create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h create mode 100644 examples/cryptodev_fips_validate/main.c
create mode 100644 examples/cryptodev_fips_validate/meson.build

Some generic comments
- patch titles should be examples/cryptodev_fips_validate:XXX
- app name could be fips_validation. better to have same name file in doc.
- MAINTAINERS file is not updated.
- better to mention about Publication 140-2 of FIPS (which represent the crypto cases) in documentation
- Please mention in the documentation and the application as well that the .req file is optional and the application can be run without that. and the procedure to get the .req file as the documentation depicts that the .req file is present in the link provided.
- Why is the build dependent on bus_pci? Does it have limitation for not being used by any other buses? I think this should be bus independent.

Thanks,
Akhil

#11 lore raw

v5 cover FIPS validation capability

In reply to Marko Kovacevic

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Marko Kovacevic (8):
v5:
- Changed patch titles
- Added MAINTAINERS File
- Removed bus_pci Dependency
- Updated documentation
- Changed app name
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples/cryptodev_fips_validate: add fips validation into examples examples/cryptodev_fips_validate: add aes parser and enablement for
test types
examples/cryptodev_fips_validate: add hmac parser examples/cryptodev_fips_validate: add TDES parser and enablement for
test types
examples/cryptodev_fips_validate: add gcm parser examples/cryptodev_fips_validate: add cmac parser and enablement for
test types
examples/cryptodev_fips_validate: add ccm parser and enablement for
test types
doc/guides/sample_app_ug: add guides for fips validation

 MAINTAINERS                                        |    4 +
 doc/guides/rel_notes/release_18_11.rst             |    6 +
 doc/guides/sample_app_ug/fips_validation.rst       |  119 ++
 doc/guides/sample_app_ug/index.rst                 |    1 +
 examples/cryptodev_fips_validate/Makefile          |   75 ++
 .../cryptodev_fips_parse_3des.c                    |  259 +++++
 .../cryptodev_fips_parse_aes.c                     |  188 +++
 .../cryptodev_fips_parse_ccm.c                     |  272 +++++
 .../cryptodev_fips_parse_cmac.c                    |  116 ++
 .../cryptodev_fips_parse_gcm.c                     |  125 ++
 .../cryptodev_fips_parse_hmac.c                    |  105 ++
 .../cryptodev_fips_parse_validate.c                |  593 ++++++++++
 .../cryptodev_fips_validate.h                      |  234 ++++
 examples/cryptodev_fips_validate/main.c            | 1221 ++++++++++++++++++++
 examples/cryptodev_fips_validate/meson.build       |   20 +
 15 files changed, 3338 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
 create mode 100644 examples/cryptodev_fips_validate/Makefile
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h
 create mode 100644 examples/cryptodev_fips_validate/main.c
 create mode 100644 examples/cryptodev_fips_validate/meson.build
Signature · 1 line
2.9.5
#12 lore raw

PATCH v5 1/8 examples/cryptodev_fips_validate: add fips validation into examples

Added FIPS application into the examples to allow users to use a simple sample app to validate their systems and be able to get FIPS certification.

---
 examples/cryptodev_fips_validate/Makefile          |  69 +++
 .../cryptodev_fips_parse_validate.c                | 562 +++++++++++++++++++++
 .../cryptodev_fips_validate.h                      | 150 ++++++
 examples/cryptodev_fips_validate/main.c            | 388 ++++++++++++++
 examples/cryptodev_fips_validate/meson.build       |  14 +
 5 files changed, 1183 insertions(+)
 create mode 100644 examples/cryptodev_fips_validate/Makefile
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h
 create mode 100644 examples/cryptodev_fips_validate/main.c
 create mode 100644 examples/cryptodev_fips_validate/meson.build
examples/cryptodev_fips_validate/Makefile new file +69 -0
new file mode 100644
index 0000000..7f0e603
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2014 Intel Corporation
+
+# binary name
+APP = fips_validation
+
+# all source are stored in SRCS-y
+SRCS-y += cryptodev_fips_parse_validate.c
+SRCS-y += main.c
+
+# Build using pkg-config variables if possible
+$(shell pkg-config --exists libdpdk)
+ifeq ($(.SHELLSTATUS),0)
+
+all: shared
+.PHONY: shared static
+shared: build/$(APP)-shared
+	ln -sf $(APP)-shared build/$(APP)
+static: build/$(APP)-static
+	ln -sf $(APP)-static build/$(APP)
+
+PC_FILE := $(shell pkg-config --path libdpdk)
+CFLAGS += -O3 $(shell pkg-config --cflags libdpdk)
+LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk)
+LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk)
+
+build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
+
+build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)
+
+build:
+	@mkdir -p $@
+
+.PHONY: clean
+clean:
+	rm -f build/$(APP) build/$(APP)-static build/$(APP)-shared
+	rmdir --ignore-fail-on-non-empty build
+
+else
+
+ifeq ($(RTE_SDK),)
+$(error "Please define RTE_SDK environment variable")
+endif
+
+# Default target, can be overridden by command line or environment
+RTE_TARGET ?= x86_64-native-linuxapp-gcc
+
+INC += $(sort $(wildcard *.h))
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+CFLAGS += $(WERROR_FLAGS)
+
+# workaround for a gcc bug with noreturn attribute
+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603
+ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)
+CFLAGS_main.o += -Wno-return-type
+endif
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+CFLAGS += -I$(SRCDIR)
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+include $(RTE_SDK)/mk/rte.extapp.mk
+
+endif
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +562 -0

562 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +150 -0

150 lines not on this page · raw message

examples/cryptodev_fips_validate/main.c new file +388 -0

388 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build new file +14 -0
new file mode 100644
index 0000000..f44043c
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 Intel Corporation
+
+# meson file, for building this example as part of a main DPDK build.
+#
+# To build this example as a standalone application with an already-installed
+# DPDK instance, use 'make'
+
+deps += ['cryptodev']
+allow_experimental_apis = true
+sources = files(
+	'cryptodev_fips_parse_validate.c',
+	'main.c'
+)
Signature · 1 line
2.9.5
#13 lore raw

Re: [PATCH v5 1/8] examples/cryptodev_fips_validate: add fips validation into examples

Quoted 26 lines · Marko Kovacevic

Added FIPS application into the examples to allow users to use a simple sample app to validate their systems and be able to get FIPS certification.

---
  examples/cryptodev_fips_validate/Makefile          |  69 +++
  .../cryptodev_fips_parse_validate.c                | 562 +++++++++++++++++++++
  .../cryptodev_fips_validate.h                      | 150 ++++++
  examples/cryptodev_fips_validate/main.c            | 388 ++++++++++++++
  examples/cryptodev_fips_validate/meson.build       |  14 +
  5 files changed, 1183 insertions(+)

create mode 100644 examples/cryptodev_fips_validate/Makefile
create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h create mode 100644 examples/cryptodev_fips_validate/main.c
create mode 100644 examples/cryptodev_fips_validate/meson.build

examples/cryptodev_fips_validate/Makefile new file +0 -0
new file mode 100644
index 0000000..7f0e603

examples/cryptodev_fips_validate/Makefile line 2

Quoted 2 lines
examples/cryptodev_fips_validate/Makefile new file +2 -0
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2014 Intel Corporation

I believe this is a copy paste error, it should be 2018

Quoted 293 lines
examples/cryptodev_fips_validate/Makefile new file +67 -0
+
+# binary name
+APP = fips_validation
+
+# all source are stored in SRCS-y
+SRCS-y += cryptodev_fips_parse_validate.c
+SRCS-y += main.c
+
+# Build using pkg-config variables if possible
+$(shell pkg-config --exists libdpdk)
+ifeq ($(.SHELLSTATUS),0)
+
+all: shared
+.PHONY: shared static
+shared: build/$(APP)-shared
+	ln -sf $(APP)-shared build/$(APP)
+static: build/$(APP)-static
+	ln -sf $(APP)-static build/$(APP)
+
+PC_FILE := $(shell pkg-config --path libdpdk)
+CFLAGS += -O3 $(shell pkg-config --cflags libdpdk)
+LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk)
+LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk)
+
+build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
+
+build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)
+
+build:
+	@mkdir -p $@
+
+.PHONY: clean
+clean:
+	rm -f build/$(APP) build/$(APP)-static build/$(APP)-shared
+	rmdir --ignore-fail-on-non-empty build
+
+else
+
+ifeq ($(RTE_SDK),)
+$(error "Please define RTE_SDK environment variable")
+endif
+
+# Default target, can be overridden by command line or environment
+RTE_TARGET ?= x86_64-native-linuxapp-gcc
+
+INC += $(sort $(wildcard *.h))
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+CFLAGS += $(WERROR_FLAGS)
+
+# workaround for a gcc bug with noreturn attribute
+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603
+ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)
+CFLAGS_main.o += -Wno-return-type
+endif
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+CFLAGS += -I$(SRCDIR)
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+include $(RTE_SDK)/mk/rte.extapp.mk
+
+endif
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +220 -0
new file mode 100644
index 0000000..aec5bb9
@@ -0,0 +1,562 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <rte_string_fns.h>
+#include <rte_cryptodev.h>
+#include <rte_malloc.h>
+
+#include "cryptodev_fips_validate.h"
+
+#define skip_white_spaces(pos)			\
+({						\
+	__typeof__(pos) _p = (pos);		\
+	for ( ; isspace(*_p); _p++)		\
+		;				\
+	_p;					\
+})
+
+static int
+get_file_line(void)
+{
+	FILE *fp = info.fp_rd;
+	char *line = info.one_line_text;
+	char c;
+	uint32_t loc = 0;
+
+	memset(line, 0, MAX_LINE_CHAR);
+	while ((c = fgetc(fp)) != EOF) {
+		if (loc >= MAX_LINE_CHAR - 1)
+			return -ENOMEM;
+		if (c == '\n')
+			return 0;
+		line[loc++] = c;
+	}
+
+	if (c == EOF)
+		return -EOF;
+
+	return 0;
+}
+
+int
+fips_test_fetch_one_block(void)
+{
+	size_t size;
+	int ret = 0;
+	uint32_t i;
+
+	for (i = 0; i < info.nb_vec_lines; i++) {
+		free(info.vec[i]);
+		info.vec[i] = NULL;
+	}
+
+	i = 0;
+	do {
+		if (i >= MAX_LINE_PER_VECTOR) {
+			ret = -ENOMEM;
+			goto error_exit;
+		}
+
+		ret = get_file_line();
+		size = strlen(info.one_line_text);
+		if (size == 0)
+			break;
+
+		info.vec[i] = calloc(1, size + 5);
+		if (info.vec[i] == NULL)
+			goto error_exit;
+
+		strlcpy(info.vec[i], info.one_line_text, size + 1);
+		i++;
+	} while (ret == 0);
+
+	info.nb_vec_lines = i;
+
+	return ret;
+
+error_exit:
+	for (i = 0; i < MAX_LINE_PER_VECTOR; i++)
+		if (info.vec[i] != NULL) {
+			free(info.vec[i]);
+			info.vec[i] = NULL;
+		}
+
+	info.nb_vec_lines = 0;
+
+	return -ENOMEM;
+}
+
+static int
+fips_test_parse_header(void)
+{
+	uint32_t i;
+	char *tmp;
+	int ret;
+	time_t t = time(NULL);
+	struct tm *tm_now = localtime(&t);
+
+	ret = fips_test_fetch_one_block();
+	if (ret < 0)
+		return ret;
+
+	for (i = 0; i < info.nb_vec_lines; i++) {
+
+		tmp = strstr(info.vec[i], "# Config info for ");
+		if (tmp != NULL) {
+			fprintf(info.fp_wr, "%s%s\n", "# Config info for DPDK Cryptodev ",
+					info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], "#  HMAC information for ");
+		if (tmp != NULL) {
+			fprintf(info.fp_wr, "%s%s\n", "#  HMAC information for "
+				"DPDK Cryptodev ",
+				info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], "# Config Info for : ");
+		if (tmp != NULL) {
+
+			fprintf(info.fp_wr, "%s%s\n", "# Config Info for DPDK Cryptodev : ",
+					info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], "# information for ");
+		if (tmp != NULL) {
+
+			char tmp_output[128] = {0};
+
+			strlcpy(tmp_output, info.vec[i], tmp - info.vec[i] + 1);
+
+			fprintf(info.fp_wr, "%s%s%s\n", tmp_output,
+					"information for DPDK Cryptodev ",
+					info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], " test information for ");
+		if (tmp != NULL) {
+			char tmp_output[128] = {0};
+
+			strlcpy(tmp_output, info.vec[i], tmp - info.vec[i] + 1);
+
+			fprintf(info.fp_wr, "%s%s%s\n", tmp_output,
+					"test information for DPDK Cryptodev ",
+					info.device_name);
+			continue;
+		}
+
+		if (i == info.nb_vec_lines - 1) {
+			/** update the time as current time, write to file */
+			fprintf(info.fp_wr, "%s%s\n", "# Generated on ",
+					asctime(tm_now));
+			continue;
+		}
+
+		/* to this point, no field need to update,
+		 *  only copy to rsp file
+		 */
+		fprintf(info.fp_wr, "%s\n", info.vec[i]);
+	}
+
+	return 0;
+}
+
+static int
+parse_file_type(const char *path)
+{
+	const char *tmp = path + strlen(path) - 3;
+
+	if (strstr(tmp, REQ_FILE_PERFIX))
+		info.file_type = FIPS_TYPE_REQ;
+	else if (strstr(tmp, RSP_FILE_PERFIX))
+		info.file_type = FIPS_TYPE_RSP;
+	else if (strstr(path, FAX_FILE_PERFIX))
+		info.file_type = FIPS_TYPE_FAX;
+	else
+		return -EINVAL;
+
+	return 0;
+}
+
+int
+fips_test_init(const char *req_file_path, const char *rsp_file_path,
+		const char *device_name)
+{
+	if (strcmp(req_file_path, rsp_file_path) == 0) {
+		RTE_LOG(ERR, USER1, "File paths cannot be the same\n");
+		return -EINVAL;
+	}
+
+	fips_test_clear();
+
+	info.algo = FIPS_TEST_ALGO_MAX;
+	if (parse_file_type(req_file_path) < 0) {
+		RTE_LOG(ERR, USER1, "File %s type not supported\n",
+				req_file_path);
+		return -EINVAL;
+	}
+
+	info.fp_rd = fopen(req_file_path, "r");
+	if (!info.fp_rd) {
+		RTE_LOG(ERR, USER1, "Cannot open file %s\n", req_file_path);
+		return -EINVAL;
+	}
+
+	info.fp_wr = fopen(rsp_file_path, "w");
+	if (!info.fp_wr) {
+		RTE_LOG(ERR, USER1, "Cannot open file %s\n", rsp_file_path);
+		return -EINVAL;
+	}
+
+	info.one_line_text = calloc(1, MAX_LINE_CHAR);
+	if (!info.one_line_text) {

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 230

Quoted 10 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +10 -0
+		RTE_LOG(ERR, USER1, "Insufficient memory\n");
+		return -ENOMEM;
+	}
+
+	strlcpy(info.device_name, device_name, sizeof(info.device_name));
+
+	if (fips_test_parse_header() < 0) {
+		RTE_LOG(ERR, USER1, "Failed parsing header\n");
+		return -1;
+	}

memory leak for calloc done above in case of error. Also there is no fclose in case of errors.

Quoted 25 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +25 -0
+
+	return 0;
+}
+
+void
+fips_test_clear(void)
+{
+	if (info.fp_rd)
+		fclose(info.fp_rd);
+	if (info.fp_wr)
+		fclose(info.fp_wr);
+	if (info.one_line_text)
+		free(info.one_line_text);
+	if (info.nb_vec_lines) {
+		uint32_t i;
+
+		for (i = 0; i < info.nb_vec_lines; i++)
+			free(info.vec[i]);
+	}
+
+	memset(&info, 0, sizeof(info));
+}
+
+int
+fips_test_parse_one_case(void)

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 265

Quoted 10 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +10 -0
+{
+	uint32_t i, j = 0;
+	uint32_t is_interim = 0;
+	int ret;
+
+	if (info.interim_callbacks) {
+		for (i = 0; i < info.nb_vec_lines; i++) {
+			for (j = 0; info.interim_callbacks[j].key != NULL; j++)
+				if (strstr(info.vec[i],
+					info.interim_callbacks[j].key)) {

it looks interim_callback is a single structure and there is no need for treating as an array.

Quoted 129 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +129 -0
+					is_interim = 1;
+
+					ret = info.interim_callbacks[j].cb(
+						info.interim_callbacks[j].key,
+						info.vec[i],
+						info.interim_callbacks[j].val);
+					if (ret < 0)
+						return ret;
+				}
+		}
+	}
+
+	if (is_interim) {
+		for (i = 0; i < info.nb_vec_lines; i++)
+			fprintf(info.fp_wr, "%s\n", info.vec[i]);
+		fprintf(info.fp_wr, "\n");
+		return 1;
+	}
+
+	for (i = 0; i < info.nb_vec_lines; i++) {
+		for (j = 0; info.callbacks[j].key != NULL; j++)
+			if (strstr(info.vec[i], info.callbacks[j].key)) {
+				ret = info.callbacks[j].cb(
+					info.callbacks[j].key,
+					info.vec[i], info.callbacks[j].val);
+				if (ret < 0)
+					return ret;
+				break;
+			}
+	}
+
+	return 0;
+}
+
+void
+fips_test_write_one_case(void)
+{
+	uint32_t i;
+
+	for (i = 0; i < info.nb_vec_lines; i++)
+		fprintf(info.fp_wr, "%s\n", info.vec[i]);
+}
+
+static int
+parser_read_uint64_hex(uint64_t *value, const char *p)
+{
+	char *next;
+	uint64_t val;
+
+	p = skip_white_spaces(p);
+
+	val = strtoul(p, &next, 16);
+	if (p == next)
+		return -EINVAL;
+
+	p = skip_white_spaces(next);
+	if (*p != '\0')
+		return -EINVAL;
+
+	*value = val;
+	return 0;
+}
+
+int
+parser_read_uint8_hex(uint8_t *value, const char *p)
+{
+	uint64_t val = 0;
+	int ret = parser_read_uint64_hex(&val, p);
+
+	if (ret < 0)
+		return ret;
+
+	if (val > UINT8_MAX)
+		return -ERANGE;
+
+	*value = val;
+	return 0;
+}
+
+int
+parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val)
+{
+	struct fips_val tmp_val = {0};
+	uint32_t len = val->len;
+	int ret;
+
+	if (len == 0) {
+		if (val->val != NULL) {
+			rte_free(val->val);
+			val->val = NULL;
+		}
+
+		return 0;
+	}
+
+	ret = parse_uint8_hex_str(key, src, &tmp_val);
+	if (ret < 0)
+		return ret;
+
+	if (tmp_val.len == val->len) {
+		val->val = tmp_val.val;
+		return 0;
+	}
+
+	if (tmp_val.len < val->len) {
+		rte_free(tmp_val.val);
+		return -EINVAL;
+	}
+
+	val->val = rte_zmalloc(NULL, val->len, 0);
+	if (!val->val) {
+		rte_free(tmp_val.val);
+		memset(val, 0, sizeof(*val));
+		return -ENOMEM;
+	}
+
+	memcpy(val->val, tmp_val.val, val->len);
+	rte_free(tmp_val.val);
+
+	return 0;
+}
+
+int
+parse_uint8_hex_str(const char *key, char *src, struct fips_val *val)
+{
+	uint32_t len, j;
+
+	src += strlen(key);
+

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 404

Quoted 10 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +10 -0
+	len = strlen(src) / 2;
+
+	if (val->val) {
+		rte_free(val->val);
+		val->val = NULL;
+	}
+
+	val->val = rte_zmalloc(NULL, len, 0);
+	if (!val->val)
+		return -1;

should be -ENOMEM

Quoted 242 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +158 -0
+
+	for (j = 0; j < len; j++) {
+		char byte[3] = {src[j * 2], src[j * 2 + 1], '\0'};
+
+		if (parser_read_uint8_hex(&val->val[j], byte) < 0) {
+			rte_free(val->val);
+			memset(val, 0, sizeof(*val));
+			return -EINVAL;
+		}
+	}
+
+	val->len = len;
+
+	return 0;
+}
+
+int
+parser_read_uint32_val(const char *key, char *src, struct fips_val *val)
+{
+	char *data = src + strlen(key);
+	size_t data_len = strlen(data);
+	int ret;
+
+	if (data[data_len - 1] == ']') {
+		char *tmp_data = calloc(1, data_len + 1);
+
+		if (tmp_data == NULL)
+			return -ENOMEM;
+
+		strlcpy(tmp_data, data, data_len);
+
+		ret = parser_read_uint32(&val->len, tmp_data);
+
+		free(tmp_data);
+	} else
+		ret = parser_read_uint32(&val->len, data);
+
+	return ret;
+}
+
+int
+parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val)
+{
+	int ret;
+
+	ret = parser_read_uint32_val(key, src, val);
+
+	if (ret < 0)
+		return ret;
+
+	val->len /= 8;
+
+	return 0;
+}
+
+int
+writeback_hex_str(const char *key, char *dst, struct fips_val *val)
+{
+	char *str = dst;
+	uint32_t len;
+
+	str += strlen(key);
+
+	for (len = 0; len < val->len; len++)
+		snprintf(str + len * 2, 255, "%02x", val->val[len]);
+
+	return 0;
+}
+
+static int
+parser_read_uint64(uint64_t *value, const char *p)
+{
+	char *next;
+	uint64_t val;
+
+	p = skip_white_spaces(p);
+	if (!isdigit(*p))
+		return -EINVAL;
+
+	val = strtoul(p, &next, 10);
+	if (p == next)
+		return -EINVAL;
+
+	p = next;
+	switch (*p) {
+	case 'T':
+		val *= 1024ULL;
+		/* fall through */
+	case 'G':
+		val *= 1024ULL;
+		/* fall through */
+	case 'M':
+		val *= 1024ULL;
+		/* fall through */
+	case 'k':
+	case 'K':
+		val *= 1024ULL;
+		p++;
+		break;
+	}
+
+	p = skip_white_spaces(p);
+	if (*p != '\0')
+		return -EINVAL;
+
+	*value = val;
+	return 0;
+}
+
+int
+parser_read_uint32(uint32_t *value, char *p)
+{
+	uint64_t val = 0;
+	int ret = parser_read_uint64(&val, p);
+
+	if (ret < 0)
+		return ret;
+
+	if (val > UINT32_MAX)
+		return -EINVAL;
+
+	*value = val;
+	return 0;
+}
+
+void
+parse_write_hex_str(struct fips_val *src)
+{
+	writeback_hex_str("", info.one_line_text, src);
+
+	fprintf(info.fp_wr, "%s\n", info.one_line_text);
+}
+
+int
+update_info_vec(uint32_t count)
+{
+	const struct fips_test_callback *cb;
+	uint32_t i, j;
+
+	if (!info.writeback_callbacks)
+		return -1;
+
+	cb = &info.writeback_callbacks[0];
+
+	snprintf(info.vec[0], strlen(info.vec[0]) + 4, "%s%u", cb->key, count);
+
+	for (i = 1; i < info.nb_vec_lines; i++) {
+		for (j = 1; info.writeback_callbacks[j].key != NULL; j++) {
+			cb = &info.writeback_callbacks[j];
+			if (strstr(info.vec[i], cb->key)) {
+				cb->cb(cb->key, info.vec[i], cb->val);
+				break;
+			}
+		}
+	}
+
+	return 0;
+}
examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +78 -0
new file mode 100644
index 0000000..beb6bed
@@ -0,0 +1,150 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#ifndef _CRYPTODEV_NIST_FIPS_PARSER_H_
+#define _CRYPTODEV_NIST_FIPS_PARSER_H_
+
+#define FIPS_PARSE_ERR(fmt, args)					\
+	RTE_LOG(ERR, USER1, "FIPS parse error" ## fmt ## "\n", ## args)
+
+#define ERR_MSG_SIZE		128
+#define MAX_CASE_LINE		15
+#define MAX_LINE_CHAR		204800 /*< max number of characters per line */
+#define MAX_NB_TESTS		10240
+#define MAX_BUF_SIZE		2048
+#define MAX_STRING_SIZE		64
+
+#define POSITIVE_TEST		0
+#define NEGATIVE_TEST		-1
+
+#define REQ_FILE_PERFIX		"req"
+#define RSP_FILE_PERFIX		"rsp"
+#define FAX_FILE_PERFIX		"fax"
+
+enum fips_test_algorithms {
+		FIPS_TEST_ALGO_MAX
+};
+
+enum file_types {
+	FIPS_TYPE_REQ = 1,
+	FIPS_TYPE_FAX,
+	FIPS_TYPE_RSP
+};
+
+enum fips_test_op {
+	FIPS_TEST_ENC_AUTH_GEN = 1,
+	FIPS_TEST_DEC_AUTH_VERIF,
+};
+
+#define MAX_LINE_PER_VECTOR            16
+
+struct fips_val {
+	uint8_t *val;
+	uint32_t len;
+};
+
+struct fips_test_vector {
+	union {
+		struct {
+			struct fips_val key;
+			struct fips_val digest;
+			struct fips_val auth_aad;
+			struct fips_val aad;
+		} cipher_auth;
+		struct {
+			struct fips_val key;
+			struct fips_val digest;
+			struct fips_val aad;
+		} aead;
+	};
+
+	struct fips_val pt;
+	struct fips_val ct;
+	struct fips_val iv;
+
+	enum rte_crypto_op_status status;
+};
+
+typedef int (*post_prcess_t)(struct fips_val *val);
+
+typedef int (*parse_callback_t)(const char *key, char *text,
+		struct fips_val *val);
+
+struct fips_test_callback {
+	const char *key;
+	parse_callback_t cb;
+	struct fips_val *val;
+};

examples/cryptodev_fips_validate/cryptodev_fips_validate.h line 88

Quoted 10 lines
examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +10 -0
+
+struct fips_test_interim_info {
+	FILE *fp_rd;
+	FILE *fp_wr;
+	enum file_types file_type;
+	enum fips_test_algorithms algo;
+	char *one_line_text;
+	char *vec[MAX_LINE_PER_VECTOR];
+	uint32_t nb_vec_lines;
+	//uint8_t cryptodev_id;

remove if not needed

Quoted 429 lines
examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +62 -0
+	char device_name[MAX_STRING_SIZE];
+
+	enum fips_test_op op;
+
+	const struct fips_test_callback *callbacks;
+	const struct fips_test_callback *interim_callbacks;
+	const struct fips_test_callback *writeback_callbacks;
+
+	post_prcess_t parse_writeback;
+	post_prcess_t kat_check;
+};
+
+extern struct fips_test_vector vec;
+extern struct fips_test_interim_info info;
+
+int
+fips_test_init(const char *req_file_path, const char *rsp_file_path,
+		const char *device_name);
+
+void
+fips_test_clear(void);
+
+int
+fips_test_fetch_one_block(void);
+
+int
+fips_test_parse_one_case(void);
+
+void
+fips_test_write_one_case(void);
+
+int
+parser_read_uint8_hex(uint8_t *value, const char *p);
+
+int
+parse_uint8_hex_str(const char *key, char *src, struct fips_val *val);
+
+int
+parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val);
+
+int
+parser_read_uint32_val(const char *key, char *src, struct fips_val *val);
+
+int
+parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val);
+
+int
+parser_read_uint32(uint32_t *value, char *p);
+
+int
+parser_read_uint32_val(const char *key, char *src, struct fips_val *val);
+
+int
+writeback_hex_str(const char *key, char *dst, struct fips_val *val);
+
+void
+parse_write_hex_str(struct fips_val *src);
+
+int
+update_info_vec(uint32_t count);
+
+#endif
examples/cryptodev_fips_validate/main.c new file +361 -0
new file mode 100644
index 0000000..4f14b04
@@ -0,0 +1,388 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#include <sys/stat.h>
+#include <getopt.h>
+#include <dirent.h>
+
+#include <rte_cryptodev.h>
+#include <rte_cryptodev_pmd.h>
+#include <rte_mempool.h>
+#include <rte_mbuf.h>
+#include <rte_string_fns.h>
+
+#include "cryptodev_fips_validate.h"
+
+#define REQ_FILE_PATH_KEYWORD	"req-file"
+#define RSP_FILE_PATH_KEYWORD	"rsp-file"
+#define FOLDER_KEYWORD		"path-is-folder"
+#define CRYPTODEV_KEYWORD	"cryptodev"
+#define CRYPTODEV_ID_KEYWORD	"cryptodev-id"
+
+struct fips_test_vector vec;
+struct fips_test_interim_info info;
+
+struct cryptodev_fips_validate_env {
+	const char *req_path;
+	const char *rsp_path;
+	uint32_t is_path_folder;
+	uint32_t dev_id;
+	struct rte_mempool *mpool;
+	struct rte_mempool *op_pool;
+	struct rte_mbuf *mbuf;
+	struct rte_crypto_op *op;
+	struct rte_cryptodev_sym_session *sess;
+} env;
+
+static int
+cryptodev_fips_validate_app_int(void)
+{
+	struct rte_cryptodev_config conf = {rte_socket_id(), 1};
+	struct rte_cryptodev_qp_conf qp_conf = {128};
+	int ret;
+
+	ret = rte_cryptodev_configure(env.dev_id, &conf);
+	if (ret < 0)
+		return ret;
+
+	env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", 128, 0, 0,
+			UINT16_MAX, rte_socket_id());
+	if (!env.mpool)
+		return ret;
+
+	ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,
+			rte_socket_id(), env.mpool);
+	if (ret < 0)
+		return ret;
+
+	ret = -ENOMEM;
+
+	env.op_pool = rte_crypto_op_pool_create(
+			"FIPS_OP_POOL",
+			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
+			1, 0,
+			16,
+			rte_socket_id());
+	if (!env.op_pool)
+		goto error_exit;
+
+	env.mbuf = rte_pktmbuf_alloc(env.mpool);
+	if (!env.mbuf)
+		goto error_exit;
+
+	env.op = rte_crypto_op_alloc(env.op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
+	if (!env.op)
+		goto error_exit;
+
+	return 0;
+
+error_exit:
+	rte_mempool_free(env.mpool);
+	if (env.op_pool)
+		rte_mempool_free(env.op_pool);
+
+	return ret;
+}
+
+static void
+cryptodev_fips_validate_app_uninit(void)
+{
+	rte_pktmbuf_free(env.mbuf);
+	rte_crypto_op_free(env.op);
+	rte_cryptodev_sym_session_clear(env.dev_id, env.sess);
+	rte_cryptodev_sym_session_free(env.sess);
+	rte_mempool_free(env.mpool);
+	rte_mempool_free(env.op_pool);
+}
+
+static int
+fips_test_one_file(void);
+
+static int
+parse_cryptodev_arg(char *arg)
+{
+	int id = rte_cryptodev_get_dev_id(arg);
+
+	if (id < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n",
+				id, arg);
+		return id;
+	}
+
+	env.dev_id = (uint32_t)id;
+
+	return 0;
+}
+
+static int
+parse_cryptodev_id_arg(char *arg)
+{
+	uint32_t cryptodev_id;
+
+	if (parser_read_uint32(&cryptodev_id, arg) < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
+				-EINVAL, arg);
+		return -1;
+	}
+
+
+	if (!rte_cryptodev_pmd_is_valid_dev(cryptodev_id)) {
+		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
+				cryptodev_id, arg);
+		return -1;
+	}
+
+	env.dev_id = (uint32_t)cryptodev_id;
+
+	return 0;
+}
+
+static void
+cryptodev_fips_validate_usage(const char *prgname)
+{
+	printf("%s [EAL options] --\n"
+		"  --%s: REQUEST-FILE-PATH\n"
+		"  --%s: RESPONSE-FILE-PATH\n"
+		"  --%s: indicating both paths are folders\n"
+		"  --%s: CRYPTODEV-NAME\n"
+		"  --%s: CRYPTODEV-ID-NAME\n",
+		prgname, REQ_FILE_PATH_KEYWORD, RSP_FILE_PATH_KEYWORD,
+		FOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD);
+}
+
+static int
+cryptodev_fips_validate_parse_args(int argc, char **argv)
+{
+	int opt, ret;
+	char *prgname = argv[0];
+	char **argvopt;
+	int option_index;
+	struct option lgopts[] = {
+			{REQ_FILE_PATH_KEYWORD, required_argument, 0, 0},
+			{RSP_FILE_PATH_KEYWORD, required_argument, 0, 0},
+			{FOLDER_KEYWORD, no_argument, 0, 0},
+			{CRYPTODEV_KEYWORD, required_argument, 0, 0},
+			{CRYPTODEV_ID_KEYWORD, required_argument, 0, 0},
+			{NULL, 0, 0, 0}
+	};
+
+	argvopt = argv;
+
+	while ((opt = getopt_long(argc, argvopt, "s:",
+				  lgopts, &option_index)) != EOF) {
+
+		switch (opt) {
+		case 0:
+			if (strcmp(lgopts[option_index].name,
+					REQ_FILE_PATH_KEYWORD) == 0)
+				env.req_path = optarg;
+			else if (strcmp(lgopts[option_index].name,
+					RSP_FILE_PATH_KEYWORD) == 0)
+				env.rsp_path = optarg;
+			else if (strcmp(lgopts[option_index].name,
+					FOLDER_KEYWORD) == 0)
+				env.is_path_folder = 1;
+			else if (strcmp(lgopts[option_index].name,
+					CRYPTODEV_KEYWORD) == 0) {
+				ret = parse_cryptodev_arg(optarg);
+				if (ret < 0) {
+					cryptodev_fips_validate_usage(prgname);
+					return -EINVAL;
+				}
+			} else if (strcmp(lgopts[option_index].name,
+					CRYPTODEV_ID_KEYWORD) == 0) {
+				ret = parse_cryptodev_id_arg(optarg);
+				if (ret < 0) {
+					cryptodev_fips_validate_usage(prgname);
+					return -EINVAL;
+				}
+			} else {
+				cryptodev_fips_validate_usage(prgname);
+				return -EINVAL;
+			}
+			break;
+		default:
+			return -1;
+		}
+	}
+
+	if (env.req_path == NULL || env.rsp_path == NULL ||
+			env.dev_id == UINT32_MAX) {
+		cryptodev_fips_validate_usage(prgname);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+	int ret;
+
+	ret = rte_eal_init(argc, argv);
+	if (ret < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
+		return -1;
+	}
+
+	argc -= ret;
+	argv += ret;
+
+	ret = cryptodev_fips_validate_parse_args(argc, argv);
+	if (ret < 0)
+		rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n");
+
+	ret = cryptodev_fips_validate_app_int();
+	if (ret < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
+		return -1;
+	}
+
+	if (!env.is_path_folder) {
+		printf("Processing file %s... ", env.req_path);
+
+		ret = fips_test_init(env.req_path, env.rsp_path,
+			rte_cryptodev_name_get(env.dev_id));
+		if (ret < 0) {
+			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+					ret, env.req_path);
+			goto exit;
+		}
+
+
+		ret = fips_test_one_file();
+		if (ret < 0) {
+			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+					ret, env.req_path);
+			goto exit;
+		}
+
+		printf("Done\n");
+
+	} else {
+		struct dirent *dir;
+		DIR *d_req, *d_rsp;
+		char req_path[1024];
+		char rsp_path[1024];
+
+		d_req = opendir(env.req_path);
+		if (!d_req) {
+			RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n",
+					-EINVAL, env.req_path);
+			goto exit;
+		}
+
+		d_rsp = opendir(env.rsp_path);
+		if (!d_rsp) {
+			ret = mkdir(env.rsp_path, 0700);
+			if (ret == 0)
+				d_rsp = opendir(env.rsp_path);
+			else {
+				RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n",
+						-EINVAL, env.rsp_path);
+				goto exit;
+			}
+		}
+		closedir(d_rsp);
+
+		while ((dir = readdir(d_req)) != NULL) {
+			if (strstr(dir->d_name, "req") == NULL)
+				continue;
+
+			snprintf(req_path, 1023, "%s/%s", env.req_path,
+					dir->d_name);
+			snprintf(rsp_path, 1023, "%s/%s", env.rsp_path,
+					dir->d_name);
+			strlcpy(strstr(rsp_path, "req"), "rsp", 4);
+
+			printf("Processing file %s... ", req_path);
+
+			ret = fips_test_init(req_path, rsp_path,
+			rte_cryptodev_name_get(env.dev_id));
+			if (ret < 0) {
+				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+						ret, req_path);
+				break;
+			}
+
+			ret = fips_test_one_file();
+			if (ret < 0) {
+				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+						ret, req_path);
+				break;
+			}
+
+			printf("Done\n");
+		}
+
+		closedir(d_req);
+	}
+
+
+exit:
+	fips_test_clear();
+	cryptodev_fips_validate_app_uninit();
+
+	return ret;
+
+}
+
+static void
+print_test_block(void)
+{
+	uint32_t i;
+
+	for (i = 0; i < info.nb_vec_lines; i++)
+		printf("%s\n", info.vec[i]);
+
+	printf("\n");
+}
+
+static int
+fips_test_one_file(void)
+{
+	int fetch_ret = 0, ret;
+
+	while (fetch_ret == 0) {
+		fetch_ret = fips_test_fetch_one_block();
+		if (fetch_ret < 0) {
+			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
+					fetch_ret);
+			ret = fetch_ret;
+			goto error_one_case;
+		}
+
+		if (info.nb_vec_lines == 0) {
+			if (fetch_ret == -EOF)
+				break;
+
+			fprintf(info.fp_wr, "\n");

examples/cryptodev_fips_validate/main.c line 371

Quoted 10 lines
examples/cryptodev_fips_validate/main.c new file +10 -0
+			continue;
+		}
+
+		ret = fips_test_parse_one_case();
+		switch (ret) {
+		case 0:
+			if (ret == 0)
+				break;
+			RTE_LOG(ERR, USER1, "Error %i: test block\n",
+					ret);

this log is unreachable code.

examples/cryptodev_fips_validate/main.c line 379

Quoted 8 lines
examples/cryptodev_fips_validate/main.c new file +8 -0
+			goto error_one_case;
+		case 1:
+			break;
+		default:
+			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
+					ret);
+			goto error_one_case;
+		}

do you really need this switch case here. In both the cases you are breaking without doing anything.
it should be something like
if (ret <= 0) {
    RTE_LOG(ERR, USER1, "Error %i: Parse block\n", ret); goto error_one_case;
}

Quoted 29 lines
examples/cryptodev_fips_validate/main.c new file +9 -0
+
+		continue;
+error_one_case:
+		print_test_block();
+	}
+
+	fips_test_clear();
+
+}
examples/cryptodev_fips_validate/meson.build new file +14 -0
new file mode 100644
index 0000000..f44043c
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 Intel Corporation
+
+# meson file, for building this example as part of a main DPDK build.
+#
+# To build this example as a standalone application with an already-installed
+# DPDK instance, use 'make'
+
+deps += ['cryptodev']
+allow_experimental_apis = true
+sources = files(
+	'cryptodev_fips_parse_validate.c',
+	'main.c'
+)
#14 lore raw

Re: [PATCH v5 1/8] examples/cryptodev_fips_validate: add fips validation into examples

Quoted 22 lines · Akhil Goyal
Quoted 20 lines · Marko Kovacevic

Added FIPS application into the examples to allow users to use a simple sample app to validate their systems and be able to get FIPS certification.

---
   examples/cryptodev_fips_validate/Makefile          |  69 +++
   .../cryptodev_fips_parse_validate.c                | 562 +++++++++++++++++++++
   .../cryptodev_fips_validate.h                      | 150 ++++++
   examples/cryptodev_fips_validate/main.c            | 388 ++++++++++++++
   examples/cryptodev_fips_validate/meson.build       |  14 +
   5 files changed, 1183 insertions(+)

create mode 100644 examples/cryptodev_fips_validate/Makefile
create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h create mode 100644 examples/cryptodev_fips_validate/main.c
create mode 100644 examples/cryptodev_fips_validate/meson.build

Quoted 9 lines

examples/cryptodev_fips_validate/Makefile line 2

Quoted 8 lines
examples/cryptodev_fips_validate/Makefile new file +2 -0
new file mode 100644
index 0000000..7f0e603
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2014 Intel Corporation

I believe this is a copy paste error, it should be 2018

Yeah your right will make the change.

Quoted 297 lines
Quoted 297 lines
examples/cryptodev_fips_validate/Makefile new file +67 -0
+
+# binary name
+APP = fips_validation
+
+# all source are stored in SRCS-y
+SRCS-y += cryptodev_fips_parse_validate.c
+SRCS-y += main.c
+
+# Build using pkg-config variables if possible
+$(shell pkg-config --exists libdpdk)
+ifeq ($(.SHELLSTATUS),0)
+
+all: shared
+.PHONY: shared static
+shared: build/$(APP)-shared
+	ln -sf $(APP)-shared build/$(APP)
+static: build/$(APP)-static
+	ln -sf $(APP)-static build/$(APP)
+
+PC_FILE := $(shell pkg-config --path libdpdk)
+CFLAGS += -O3 $(shell pkg-config --cflags libdpdk)
+LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk)
+LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk)
+
+build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
+
+build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build
+	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)
+
+build:
+	@mkdir -p $@
+
+.PHONY: clean
+clean:
+	rm -f build/$(APP) build/$(APP)-static build/$(APP)-shared
+	rmdir --ignore-fail-on-non-empty build
+
+else
+
+ifeq ($(RTE_SDK),)
+$(error "Please define RTE_SDK environment variable")
+endif
+
+# Default target, can be overridden by command line or environment
+RTE_TARGET ?= x86_64-native-linuxapp-gcc
+
+INC += $(sort $(wildcard *.h))
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+CFLAGS += $(WERROR_FLAGS)
+
+# workaround for a gcc bug with noreturn attribute
+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603
+ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)
+CFLAGS_main.o += -Wno-return-type
+endif
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+CFLAGS += -I$(SRCDIR)
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+include $(RTE_SDK)/mk/rte.extapp.mk
+
+endif
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +224 -0
new file mode 100644
index 0000000..aec5bb9
@@ -0,0 +1,562 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <rte_string_fns.h>
+#include <rte_cryptodev.h>
+#include <rte_malloc.h>
+
+#include "cryptodev_fips_validate.h"
+
+#define skip_white_spaces(pos)			\
+({						\
+	__typeof__(pos) _p = (pos);		\
+	for ( ; isspace(*_p); _p++)		\
+		;				\
+	_p;					\
+})
+
+static int
+get_file_line(void)
+{
+	FILE *fp = info.fp_rd;
+	char *line = info.one_line_text;
+	char c;
+	uint32_t loc = 0;
+
+	memset(line, 0, MAX_LINE_CHAR);
+	while ((c = fgetc(fp)) != EOF) {
+		if (loc >= MAX_LINE_CHAR - 1)
+			return -ENOMEM;
+		if (c == '\n')
+			return 0;
+		line[loc++] = c;
+	}
+
+	if (c == EOF)
+		return -EOF;
+
+	return 0;
+}
+
+int
+fips_test_fetch_one_block(void)
+{
+	size_t size;
+	int ret = 0;
+	uint32_t i;
+
+	for (i = 0; i < info.nb_vec_lines; i++) {
+		free(info.vec[i]);
+		info.vec[i] = NULL;
+	}
+
+	i = 0;
+	do {
+		if (i >= MAX_LINE_PER_VECTOR) {
+			ret = -ENOMEM;
+			goto error_exit;
+		}
+
+		ret = get_file_line();
+		size = strlen(info.one_line_text);
+		if (size == 0)
+			break;
+
+		info.vec[i] = calloc(1, size + 5);
+		if (info.vec[i] == NULL)
+			goto error_exit;
+
+		strlcpy(info.vec[i], info.one_line_text, size + 1);
+		i++;
+	} while (ret == 0);
+
+	info.nb_vec_lines = i;
+
+	return ret;
+
+error_exit:
+	for (i = 0; i < MAX_LINE_PER_VECTOR; i++)
+		if (info.vec[i] != NULL) {
+			free(info.vec[i]);
+			info.vec[i] = NULL;
+		}
+
+	info.nb_vec_lines = 0;
+
+	return -ENOMEM;
+}
+
+static int
+fips_test_parse_header(void)
+{
+	uint32_t i;
+	char *tmp;
+	int ret;
+	time_t t = time(NULL);
+	struct tm *tm_now = localtime(&t);
+
+	ret = fips_test_fetch_one_block();
+	if (ret < 0)
+		return ret;
+
+	for (i = 0; i < info.nb_vec_lines; i++) {
+
+		tmp = strstr(info.vec[i], "# Config info for ");
+		if (tmp != NULL) {
+			fprintf(info.fp_wr, "%s%s\n", "# Config info for DPDK Cryptodev ",
+					info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], "#  HMAC information for ");
+		if (tmp != NULL) {
+			fprintf(info.fp_wr, "%s%s\n", "#  HMAC information for "
+				"DPDK Cryptodev ",
+				info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], "# Config Info for : ");
+		if (tmp != NULL) {
+
+			fprintf(info.fp_wr, "%s%s\n", "# Config Info for DPDK Cryptodev : ",
+					info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], "# information for ");
+		if (tmp != NULL) {
+
+			char tmp_output[128] = {0};
+
+			strlcpy(tmp_output, info.vec[i], tmp - info.vec[i] + 1);
+
+			fprintf(info.fp_wr, "%s%s%s\n", tmp_output,
+					"information for DPDK Cryptodev ",
+					info.device_name);
+			continue;
+		}
+
+		tmp = strstr(info.vec[i], " test information for ");
+		if (tmp != NULL) {
+			char tmp_output[128] = {0};
+
+			strlcpy(tmp_output, info.vec[i], tmp - info.vec[i] + 1);
+
+			fprintf(info.fp_wr, "%s%s%s\n", tmp_output,
+					"test information for DPDK Cryptodev ",
+					info.device_name);
+			continue;
+		}
+
+		if (i == info.nb_vec_lines - 1) {
+			/** update the time as current time, write to file */
+			fprintf(info.fp_wr, "%s%s\n", "# Generated on ",
+					asctime(tm_now));
+			continue;
+		}
+
+		/* to this point, no field need to update,
+		 *  only copy to rsp file
+		 */
+		fprintf(info.fp_wr, "%s\n", info.vec[i]);
+	}
+
+	return 0;
+}
+
+static int
+parse_file_type(const char *path)
+{
+	const char *tmp = path + strlen(path) - 3;
+
+	if (strstr(tmp, REQ_FILE_PERFIX))
+		info.file_type = FIPS_TYPE_REQ;
+	else if (strstr(tmp, RSP_FILE_PERFIX))
+		info.file_type = FIPS_TYPE_RSP;
+	else if (strstr(path, FAX_FILE_PERFIX))
+		info.file_type = FIPS_TYPE_FAX;
+	else
+		return -EINVAL;
+
+	return 0;
+}
+
+int
+fips_test_init(const char *req_file_path, const char *rsp_file_path,
+		const char *device_name)
+{
+	if (strcmp(req_file_path, rsp_file_path) == 0) {
+		RTE_LOG(ERR, USER1, "File paths cannot be the same\n");
+		return -EINVAL;
+	}
+
+	fips_test_clear();
+
+	info.algo = FIPS_TEST_ALGO_MAX;
+	if (parse_file_type(req_file_path) < 0) {
+		RTE_LOG(ERR, USER1, "File %s type not supported\n",
+				req_file_path);
+		return -EINVAL;
+	}
+
+	info.fp_rd = fopen(req_file_path, "r");
+	if (!info.fp_rd) {
+		RTE_LOG(ERR, USER1, "Cannot open file %s\n", req_file_path);
+		return -EINVAL;
+	}
+
+	info.fp_wr = fopen(rsp_file_path, "w");
+	if (!info.fp_wr) {
+		RTE_LOG(ERR, USER1, "Cannot open file %s\n", rsp_file_path);
+		return -EINVAL;
+	}
+
+	info.one_line_text = calloc(1, MAX_LINE_CHAR);
+	if (!info.one_line_text) {
+		RTE_LOG(ERR, USER1, "Insufficient memory\n");
+		return -ENOMEM;
+	}
+
Quoted 8 lines

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 230

Quoted 6 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +6 -0
+	strlcpy(info.device_name, device_name, sizeof(info.device_name));
+
+	if (fips_test_parse_header() < 0) {
+		RTE_LOG(ERR, USER1, "Failed parsing header\n");
+		return -1;
+	}

memory leak for calloc done above in case of error. Also there is no fclose in case of errors.

All memory allocated will be freed and the files are closed in the fips_test_clear function and is called in the end of the main function.

Quoted 29 lines
Quoted 29 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +29 -0
+
+	return 0;
+}
+
+void
+fips_test_clear(void)
+{
+	if (info.fp_rd)
+		fclose(info.fp_rd);
+	if (info.fp_wr)
+		fclose(info.fp_wr);
+	if (info.one_line_text)
+		free(info.one_line_text);
+	if (info.nb_vec_lines) {
+		uint32_t i;
+
+		for (i = 0; i < info.nb_vec_lines; i++)
+			free(info.vec[i]);
+	}
+
+	memset(&info, 0, sizeof(info));
+}
+
+int
+fips_test_parse_one_case(void)
+{
+	uint32_t i, j = 0;
+	uint32_t is_interim = 0;
+	int ret;
Quoted 8 lines

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 265

Quoted 6 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +6 -0
+
+	if (info.interim_callbacks) {
+		for (i = 0; i < info.nb_vec_lines; i++) {
+			for (j = 0; info.interim_callbacks[j].key != NULL; j++)
+				if (strstr(info.vec[i],
+					info.interim_callbacks[j].key)) {

it looks interim_callback is a single structure and there is no need for treating as an array.

For some tests interim data could be multiple lines.

Quoted 132 lines
Quoted 132 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +132 -0
+					is_interim = 1;
+
+					ret = info.interim_callbacks[j].cb(
+						info.interim_callbacks[j].key,
+						info.vec[i],
+						info.interim_callbacks[j].val);
+					if (ret < 0)
+						return ret;
+				}
+		}
+	}
+
+	if (is_interim) {
+		for (i = 0; i < info.nb_vec_lines; i++)
+			fprintf(info.fp_wr, "%s\n", info.vec[i]);
+		fprintf(info.fp_wr, "\n");
+		return 1;
+	}
+
+	for (i = 0; i < info.nb_vec_lines; i++) {
+		for (j = 0; info.callbacks[j].key != NULL; j++)
+			if (strstr(info.vec[i], info.callbacks[j].key)) {
+				ret = info.callbacks[j].cb(
+					info.callbacks[j].key,
+					info.vec[i], info.callbacks[j].val);
+				if (ret < 0)
+					return ret;
+				break;
+			}
+	}
+
+	return 0;
+}
+
+void
+fips_test_write_one_case(void)
+{
+	uint32_t i;
+
+	for (i = 0; i < info.nb_vec_lines; i++)
+		fprintf(info.fp_wr, "%s\n", info.vec[i]);
+}
+
+static int
+parser_read_uint64_hex(uint64_t *value, const char *p)
+{
+	char *next;
+	uint64_t val;
+
+	p = skip_white_spaces(p);
+
+	val = strtoul(p, &next, 16);
+	if (p == next)
+		return -EINVAL;
+
+	p = skip_white_spaces(next);
+	if (*p != '\0')
+		return -EINVAL;
+
+	*value = val;
+	return 0;
+}
+
+int
+parser_read_uint8_hex(uint8_t *value, const char *p)
+{
+	uint64_t val = 0;
+	int ret = parser_read_uint64_hex(&val, p);
+
+	if (ret < 0)
+		return ret;
+
+	if (val > UINT8_MAX)
+		return -ERANGE;
+
+	*value = val;
+	return 0;
+}
+
+int
+parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val)
+{
+	struct fips_val tmp_val = {0};
+	uint32_t len = val->len;
+	int ret;
+
+	if (len == 0) {
+		if (val->val != NULL) {
+			rte_free(val->val);
+			val->val = NULL;
+		}
+
+		return 0;
+	}
+
+	ret = parse_uint8_hex_str(key, src, &tmp_val);
+	if (ret < 0)
+		return ret;
+
+	if (tmp_val.len == val->len) {
+		val->val = tmp_val.val;
+		return 0;
+	}
+
+	if (tmp_val.len < val->len) {
+		rte_free(tmp_val.val);
+		return -EINVAL;
+	}
+
+	val->val = rte_zmalloc(NULL, val->len, 0);
+	if (!val->val) {
+		rte_free(tmp_val.val);
+		memset(val, 0, sizeof(*val));
+		return -ENOMEM;
+	}
+
+	memcpy(val->val, tmp_val.val, val->len);
+	rte_free(tmp_val.val);
+
+	return 0;
+}
+
+int
+parse_uint8_hex_str(const char *key, char *src, struct fips_val *val)
+{
+	uint32_t len, j;
+
+	src += strlen(key);
+
+	len = strlen(src) / 2;
+
+	if (val->val) {
Quoted 8 lines

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 404

Quoted 7 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +7 -0
+		rte_free(val->val);
+		val->val = NULL;
+	}
+
+	val->val = rte_zmalloc(NULL, len, 0);
+	if (!val->val)
+		return -1;

should be -ENOMEM

will change it.

Quoted 245 lines
Quoted 245 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +158 -0
+
+	for (j = 0; j < len; j++) {
+		char byte[3] = {src[j * 2], src[j * 2 + 1], '\0'};
+
+		if (parser_read_uint8_hex(&val->val[j], byte) < 0) {
+			rte_free(val->val);
+			memset(val, 0, sizeof(*val));
+			return -EINVAL;
+		}
+	}
+
+	val->len = len;
+
+	return 0;
+}
+
+int
+parser_read_uint32_val(const char *key, char *src, struct fips_val *val)
+{
+	char *data = src + strlen(key);
+	size_t data_len = strlen(data);
+	int ret;
+
+	if (data[data_len - 1] == ']') {
+		char *tmp_data = calloc(1, data_len + 1);
+
+		if (tmp_data == NULL)
+			return -ENOMEM;
+
+		strlcpy(tmp_data, data, data_len);
+
+		ret = parser_read_uint32(&val->len, tmp_data);
+
+		free(tmp_data);
+	} else
+		ret = parser_read_uint32(&val->len, data);
+
+	return ret;
+}
+
+int
+parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val)
+{
+	int ret;
+
+	ret = parser_read_uint32_val(key, src, val);
+
+	if (ret < 0)
+		return ret;
+
+	val->len /= 8;
+
+	return 0;
+}
+
+int
+writeback_hex_str(const char *key, char *dst, struct fips_val *val)
+{
+	char *str = dst;
+	uint32_t len;
+
+	str += strlen(key);
+
+	for (len = 0; len < val->len; len++)
+		snprintf(str + len * 2, 255, "%02x", val->val[len]);
+
+	return 0;
+}
+
+static int
+parser_read_uint64(uint64_t *value, const char *p)
+{
+	char *next;
+	uint64_t val;
+
+	p = skip_white_spaces(p);
+	if (!isdigit(*p))
+		return -EINVAL;
+
+	val = strtoul(p, &next, 10);
+	if (p == next)
+		return -EINVAL;
+
+	p = next;
+	switch (*p) {
+	case 'T':
+		val *= 1024ULL;
+		/* fall through */
+	case 'G':
+		val *= 1024ULL;
+		/* fall through */
+	case 'M':
+		val *= 1024ULL;
+		/* fall through */
+	case 'k':
+	case 'K':
+		val *= 1024ULL;
+		p++;
+		break;
+	}
+
+	p = skip_white_spaces(p);
+	if (*p != '\0')
+		return -EINVAL;
+
+	*value = val;
+	return 0;
+}
+
+int
+parser_read_uint32(uint32_t *value, char *p)
+{
+	uint64_t val = 0;
+	int ret = parser_read_uint64(&val, p);
+
+	if (ret < 0)
+		return ret;
+
+	if (val > UINT32_MAX)
+		return -EINVAL;
+
+	*value = val;
+	return 0;
+}
+
+void
+parse_write_hex_str(struct fips_val *src)
+{
+	writeback_hex_str("", info.one_line_text, src);
+
+	fprintf(info.fp_wr, "%s\n", info.one_line_text);
+}
+
+int
+update_info_vec(uint32_t count)
+{
+	const struct fips_test_callback *cb;
+	uint32_t i, j;
+
+	if (!info.writeback_callbacks)
+		return -1;
+
+	cb = &info.writeback_callbacks[0];
+
+	snprintf(info.vec[0], strlen(info.vec[0]) + 4, "%s%u", cb->key, count);
+
+	for (i = 1; i < info.nb_vec_lines; i++) {
+		for (j = 1; info.writeback_callbacks[j].key != NULL; j++) {
+			cb = &info.writeback_callbacks[j];
+			if (strstr(info.vec[i], cb->key)) {
+				cb->cb(cb->key, info.vec[i], cb->val);
+				break;
+			}
+		}
+	}
+
+	return 0;
+}
examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +81 -0
new file mode 100644
index 0000000..beb6bed
@@ -0,0 +1,150 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#ifndef _CRYPTODEV_NIST_FIPS_PARSER_H_
+#define _CRYPTODEV_NIST_FIPS_PARSER_H_
+
+#define FIPS_PARSE_ERR(fmt, args)					\
+	RTE_LOG(ERR, USER1, "FIPS parse error" ## fmt ## "\n", ## args)
+
+#define ERR_MSG_SIZE		128
+#define MAX_CASE_LINE		15
+#define MAX_LINE_CHAR		204800 /*< max number of characters per line */
+#define MAX_NB_TESTS		10240
+#define MAX_BUF_SIZE		2048
+#define MAX_STRING_SIZE		64
+
+#define POSITIVE_TEST		0
+#define NEGATIVE_TEST		-1
+
+#define REQ_FILE_PERFIX		"req"
+#define RSP_FILE_PERFIX		"rsp"
+#define FAX_FILE_PERFIX		"fax"
+
+enum fips_test_algorithms {
+		FIPS_TEST_ALGO_MAX
+};
+
+enum file_types {
+	FIPS_TYPE_REQ = 1,
+	FIPS_TYPE_FAX,
+	FIPS_TYPE_RSP
+};
+
+enum fips_test_op {
+	FIPS_TEST_ENC_AUTH_GEN = 1,
+	FIPS_TEST_DEC_AUTH_VERIF,
+};
+
+#define MAX_LINE_PER_VECTOR            16
+
+struct fips_val {
+	uint8_t *val;
+	uint32_t len;
+};
+
+struct fips_test_vector {
+	union {
+		struct {
+			struct fips_val key;
+			struct fips_val digest;
+			struct fips_val auth_aad;
+			struct fips_val aad;
+		} cipher_auth;
+		struct {
+			struct fips_val key;
+			struct fips_val digest;
+			struct fips_val aad;
+		} aead;
+	};
+
+	struct fips_val pt;
+	struct fips_val ct;
+	struct fips_val iv;
+
+	enum rte_crypto_op_status status;
+};
+
+typedef int (*post_prcess_t)(struct fips_val *val);
+
+typedef int (*parse_callback_t)(const char *key, char *text,
+		struct fips_val *val);
+
+struct fips_test_callback {
+	const char *key;
+	parse_callback_t cb;
+	struct fips_val *val;
+};
+
+struct fips_test_interim_info {
+	FILE *fp_rd;
Quoted 8 lines

examples/cryptodev_fips_validate/cryptodev_fips_validate.h line 88

Quoted 7 lines
examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +7 -0
+	FILE *fp_wr;
+	enum file_types file_type;
+	enum fips_test_algorithms algo;
+	char *one_line_text;
+	char *vec[MAX_LINE_PER_VECTOR];
+	uint32_t nb_vec_lines;
+	//uint8_t cryptodev_id;

remove if not needed

will do missed it.

Quoted 432 lines
Quoted 432 lines
examples/cryptodev_fips_validate/cryptodev_fips_validate.h new file +62 -0
+	char device_name[MAX_STRING_SIZE];
+
+	enum fips_test_op op;
+
+	const struct fips_test_callback *callbacks;
+	const struct fips_test_callback *interim_callbacks;
+	const struct fips_test_callback *writeback_callbacks;
+
+	post_prcess_t parse_writeback;
+	post_prcess_t kat_check;
+};
+
+extern struct fips_test_vector vec;
+extern struct fips_test_interim_info info;
+
+int
+fips_test_init(const char *req_file_path, const char *rsp_file_path,
+		const char *device_name);
+
+void
+fips_test_clear(void);
+
+int
+fips_test_fetch_one_block(void);
+
+int
+fips_test_parse_one_case(void);
+
+void
+fips_test_write_one_case(void);
+
+int
+parser_read_uint8_hex(uint8_t *value, const char *p);
+
+int
+parse_uint8_hex_str(const char *key, char *src, struct fips_val *val);
+
+int
+parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val);
+
+int
+parser_read_uint32_val(const char *key, char *src, struct fips_val *val);
+
+int
+parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val);
+
+int
+parser_read_uint32(uint32_t *value, char *p);
+
+int
+parser_read_uint32_val(const char *key, char *src, struct fips_val *val);
+
+int
+writeback_hex_str(const char *key, char *dst, struct fips_val *val);
+
+void
+parse_write_hex_str(struct fips_val *src);
+
+int
+update_info_vec(uint32_t count);
+
+#endif
examples/cryptodev_fips_validate/main.c new file +364 -0
new file mode 100644
index 0000000..4f14b04
@@ -0,0 +1,388 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#include <sys/stat.h>
+#include <getopt.h>
+#include <dirent.h>
+
+#include <rte_cryptodev.h>
+#include <rte_cryptodev_pmd.h>
+#include <rte_mempool.h>
+#include <rte_mbuf.h>
+#include <rte_string_fns.h>
+
+#include "cryptodev_fips_validate.h"
+
+#define REQ_FILE_PATH_KEYWORD	"req-file"
+#define RSP_FILE_PATH_KEYWORD	"rsp-file"
+#define FOLDER_KEYWORD		"path-is-folder"
+#define CRYPTODEV_KEYWORD	"cryptodev"
+#define CRYPTODEV_ID_KEYWORD	"cryptodev-id"
+
+struct fips_test_vector vec;
+struct fips_test_interim_info info;
+
+struct cryptodev_fips_validate_env {
+	const char *req_path;
+	const char *rsp_path;
+	uint32_t is_path_folder;
+	uint32_t dev_id;
+	struct rte_mempool *mpool;
+	struct rte_mempool *op_pool;
+	struct rte_mbuf *mbuf;
+	struct rte_crypto_op *op;
+	struct rte_cryptodev_sym_session *sess;
+} env;
+
+static int
+cryptodev_fips_validate_app_int(void)
+{
+	struct rte_cryptodev_config conf = {rte_socket_id(), 1};
+	struct rte_cryptodev_qp_conf qp_conf = {128};
+	int ret;
+
+	ret = rte_cryptodev_configure(env.dev_id, &conf);
+	if (ret < 0)
+		return ret;
+
+	env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", 128, 0, 0,
+			UINT16_MAX, rte_socket_id());
+	if (!env.mpool)
+		return ret;
+
+	ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,
+			rte_socket_id(), env.mpool);
+	if (ret < 0)
+		return ret;
+
+	ret = -ENOMEM;
+
+	env.op_pool = rte_crypto_op_pool_create(
+			"FIPS_OP_POOL",
+			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
+			1, 0,
+			16,
+			rte_socket_id());
+	if (!env.op_pool)
+		goto error_exit;
+
+	env.mbuf = rte_pktmbuf_alloc(env.mpool);
+	if (!env.mbuf)
+		goto error_exit;
+
+	env.op = rte_crypto_op_alloc(env.op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
+	if (!env.op)
+		goto error_exit;
+
+	return 0;
+
+error_exit:
+	rte_mempool_free(env.mpool);
+	if (env.op_pool)
+		rte_mempool_free(env.op_pool);
+
+	return ret;
+}
+
+static void
+cryptodev_fips_validate_app_uninit(void)
+{
+	rte_pktmbuf_free(env.mbuf);
+	rte_crypto_op_free(env.op);
+	rte_cryptodev_sym_session_clear(env.dev_id, env.sess);
+	rte_cryptodev_sym_session_free(env.sess);
+	rte_mempool_free(env.mpool);
+	rte_mempool_free(env.op_pool);
+}
+
+static int
+fips_test_one_file(void);
+
+static int
+parse_cryptodev_arg(char *arg)
+{
+	int id = rte_cryptodev_get_dev_id(arg);
+
+	if (id < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n",
+				id, arg);
+		return id;
+	}
+
+	env.dev_id = (uint32_t)id;
+
+	return 0;
+}
+
+static int
+parse_cryptodev_id_arg(char *arg)
+{
+	uint32_t cryptodev_id;
+
+	if (parser_read_uint32(&cryptodev_id, arg) < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
+				-EINVAL, arg);
+		return -1;
+	}
+
+
+	if (!rte_cryptodev_pmd_is_valid_dev(cryptodev_id)) {
+		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
+				cryptodev_id, arg);
+		return -1;
+	}
+
+	env.dev_id = (uint32_t)cryptodev_id;
+
+	return 0;
+}
+
+static void
+cryptodev_fips_validate_usage(const char *prgname)
+{
+	printf("%s [EAL options] --\n"
+		"  --%s: REQUEST-FILE-PATH\n"
+		"  --%s: RESPONSE-FILE-PATH\n"
+		"  --%s: indicating both paths are folders\n"
+		"  --%s: CRYPTODEV-NAME\n"
+		"  --%s: CRYPTODEV-ID-NAME\n",
+		prgname, REQ_FILE_PATH_KEYWORD, RSP_FILE_PATH_KEYWORD,
+		FOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD);
+}
+
+static int
+cryptodev_fips_validate_parse_args(int argc, char **argv)
+{
+	int opt, ret;
+	char *prgname = argv[0];
+	char **argvopt;
+	int option_index;
+	struct option lgopts[] = {
+			{REQ_FILE_PATH_KEYWORD, required_argument, 0, 0},
+			{RSP_FILE_PATH_KEYWORD, required_argument, 0, 0},
+			{FOLDER_KEYWORD, no_argument, 0, 0},
+			{CRYPTODEV_KEYWORD, required_argument, 0, 0},
+			{CRYPTODEV_ID_KEYWORD, required_argument, 0, 0},
+			{NULL, 0, 0, 0}
+	};
+
+	argvopt = argv;
+
+	while ((opt = getopt_long(argc, argvopt, "s:",
+				  lgopts, &option_index)) != EOF) {
+
+		switch (opt) {
+		case 0:
+			if (strcmp(lgopts[option_index].name,
+					REQ_FILE_PATH_KEYWORD) == 0)
+				env.req_path = optarg;
+			else if (strcmp(lgopts[option_index].name,
+					RSP_FILE_PATH_KEYWORD) == 0)
+				env.rsp_path = optarg;
+			else if (strcmp(lgopts[option_index].name,
+					FOLDER_KEYWORD) == 0)
+				env.is_path_folder = 1;
+			else if (strcmp(lgopts[option_index].name,
+					CRYPTODEV_KEYWORD) == 0) {
+				ret = parse_cryptodev_arg(optarg);
+				if (ret < 0) {
+					cryptodev_fips_validate_usage(prgname);
+					return -EINVAL;
+				}
+			} else if (strcmp(lgopts[option_index].name,
+					CRYPTODEV_ID_KEYWORD) == 0) {
+				ret = parse_cryptodev_id_arg(optarg);
+				if (ret < 0) {
+					cryptodev_fips_validate_usage(prgname);
+					return -EINVAL;
+				}
+			} else {
+				cryptodev_fips_validate_usage(prgname);
+				return -EINVAL;
+			}
+			break;
+		default:
+			return -1;
+		}
+	}
+
+	if (env.req_path == NULL || env.rsp_path == NULL ||
+			env.dev_id == UINT32_MAX) {
+		cryptodev_fips_validate_usage(prgname);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+	int ret;
+
+	ret = rte_eal_init(argc, argv);
+	if (ret < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
+		return -1;
+	}
+
+	argc -= ret;
+	argv += ret;
+
+	ret = cryptodev_fips_validate_parse_args(argc, argv);
+	if (ret < 0)
+		rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n");
+
+	ret = cryptodev_fips_validate_app_int();
+	if (ret < 0) {
+		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
+		return -1;
+	}
+
+	if (!env.is_path_folder) {
+		printf("Processing file %s... ", env.req_path);
+
+		ret = fips_test_init(env.req_path, env.rsp_path,
+			rte_cryptodev_name_get(env.dev_id));
+		if (ret < 0) {
+			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+					ret, env.req_path);
+			goto exit;
+		}
+
+
+		ret = fips_test_one_file();
+		if (ret < 0) {
+			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+					ret, env.req_path);
+			goto exit;
+		}
+
+		printf("Done\n");
+
+	} else {
+		struct dirent *dir;
+		DIR *d_req, *d_rsp;
+		char req_path[1024];
+		char rsp_path[1024];
+
+		d_req = opendir(env.req_path);
+		if (!d_req) {
+			RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n",
+					-EINVAL, env.req_path);
+			goto exit;
+		}
+
+		d_rsp = opendir(env.rsp_path);
+		if (!d_rsp) {
+			ret = mkdir(env.rsp_path, 0700);
+			if (ret == 0)
+				d_rsp = opendir(env.rsp_path);
+			else {
+				RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n",
+						-EINVAL, env.rsp_path);
+				goto exit;
+			}
+		}
+		closedir(d_rsp);
+
+		while ((dir = readdir(d_req)) != NULL) {
+			if (strstr(dir->d_name, "req") == NULL)
+				continue;
+
+			snprintf(req_path, 1023, "%s/%s", env.req_path,
+					dir->d_name);
+			snprintf(rsp_path, 1023, "%s/%s", env.rsp_path,
+					dir->d_name);
+			strlcpy(strstr(rsp_path, "req"), "rsp", 4);
+
+			printf("Processing file %s... ", req_path);
+
+			ret = fips_test_init(req_path, rsp_path,
+			rte_cryptodev_name_get(env.dev_id));
+			if (ret < 0) {
+				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+						ret, req_path);
+				break;
+			}
+
+			ret = fips_test_one_file();
+			if (ret < 0) {
+				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
+						ret, req_path);
+				break;
+			}
+
+			printf("Done\n");
+		}
+
+		closedir(d_req);
+	}
+
+
+exit:
+	fips_test_clear();
+	cryptodev_fips_validate_app_uninit();
+
+	return ret;
+
+}
+
+static void
+print_test_block(void)
+{
+	uint32_t i;
+
+	for (i = 0; i < info.nb_vec_lines; i++)
+		printf("%s\n", info.vec[i]);
+
+	printf("\n");
+}
+
+static int
+fips_test_one_file(void)
+{
+	int fetch_ret = 0, ret;
+
+	while (fetch_ret == 0) {
+		fetch_ret = fips_test_fetch_one_block();
+		if (fetch_ret < 0) {
+			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
+					fetch_ret);
+			ret = fetch_ret;
+			goto error_one_case;
+		}
+
+		if (info.nb_vec_lines == 0) {
+			if (fetch_ret == -EOF)
+				break;
+
+			fprintf(info.fp_wr, "\n");
+			continue;
+		}
+
Quoted 8 lines

examples/cryptodev_fips_validate/main.c line 371

Quoted 7 lines
examples/cryptodev_fips_validate/main.c new file +7 -0
+		ret = fips_test_parse_one_case();
+		switch (ret) {
+		case 0:
+			if (ret == 0)
+				break;
+			RTE_LOG(ERR, USER1, "Error %i: test block\n",
+					ret);

this log is unreachable code.

The bit that is missing is being added in v2 when i was splitting the patch i forgot to remove this check until this was added

ret = test_ops.test();
            if (ret == 0)
                break;
            RTE_LOG(ERR, USER1, "Error %i: test block\n", ret);
            goto error_one_case;

Quoted 7 lines
Quoted 7 lines
examples/cryptodev_fips_validate/main.c new file +7 -0
+			goto error_one_case;
+		case 1:
+			break;
+		default:
+			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
+					ret);
+			goto error_one_case;
Quoted 8 lines

examples/cryptodev_fips_validate/main.c line 379

Quoted 1 line
examples/cryptodev_fips_validate/main.c new file +1 -0
+		}

do you really need this switch case here. In both the cases you are breaking without doing anything.
it should be something like
if (ret <= 0) {
    RTE_LOG(ERR, USER1, "Error %i: Parse block\n", ret); goto error_one_case;
}

1 = test-interim data and 0 = test-data will add  a comment with more info inside the files of what the return cases mean

Quoted 29 lines
Quoted 29 lines
examples/cryptodev_fips_validate/main.c new file +9 -0
+
+		continue;
+error_one_case:
+		print_test_block();
+	}
+
+	fips_test_clear();
+
+}
examples/cryptodev_fips_validate/meson.build new file +14 -0
new file mode 100644
index 0000000..f44043c
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 Intel Corporation
+
+# meson file, for building this example as part of a main DPDK build.
+#
+# To build this example as a standalone application with an already-installed
+# DPDK instance, use 'make'
+
+deps += ['cryptodev']
+allow_experimental_apis = true
+sources = files(
+	'cryptodev_fips_parse_validate.c',
+	'main.c'
+)
#15 lore raw

Re: [PATCH v5 1/8] examples/cryptodev_fips_validate: add fips validation into examples

Quoted 4 lines · Marko Kovacevic
Quoted 2 lines · Akhil Goyal

On 10/17/2018 6:19 PM, Marko Kovacevic wrote:

snip [..]

Quoted 16 lines
Quoted 16 lines
Quoted 4 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +2 -0
+int
+fips_test_parse_one_case(void)

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 265

Quoted 10 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +10 -0
+{
+    uint32_t i, j = 0;
+    uint32_t is_interim = 0;
+    int ret;
+
+    if (info.interim_callbacks) {
+        for (i = 0; i < info.nb_vec_lines; i++) {
+            for (j = 0; info.interim_callbacks[j].key != NULL; j++)
+                if (strstr(info.vec[i],
+                    info.interim_callbacks[j].key)) {

it looks interim_callback is a single structure and there is no need for treating as an array.

Quoted 1 line

For some tests interim data could be multiple lines.

here you are not incrementing j, which means you are not using the other ones. Also I cannot see it getting incremented in this function in rest of the patches.

#16 lore raw

Re: [PATCH v5 1/8] examples/cryptodev_fips_validate: add fips validation into examples

Quoted 19 lines · Akhil Goyal
Quoted 2 lines · Marko Kovacevic
Quoted 1 line · Akhil Goyal

On 10/17/2018 6:19 PM, Marko Kovacevic wrote:

snip [..]

Quoted 14 lines
Quoted 14 lines

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c line 265

Quoted 12 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +12 -0
+int
+fips_test_parse_one_case(void)
+{
+    uint32_t i, j = 0;
+    uint32_t is_interim = 0;
+    int ret;
+
+    if (info.interim_callbacks) {
+        for (i = 0; i < info.nb_vec_lines; i++) {
+            for (j = 0; info.interim_callbacks[j].key != NULL; j++)
+                if (strstr(info.vec[i],
+                    info.interim_callbacks[j].key)) {

it looks interim_callback is a single structure and there is no need for treating as an array.

Quoted 4 lines
Quoted 1 line

For some tests interim data could be multiple lines.

here you are not incrementing j, which means you are not using the other ones. Also I cannot see it getting incremented in this function in rest of the patches.

  for (j = 0; info.interim_callbacks[j].key != NULL; j++) j is incremented as shown in the above line

#17 lore raw

PATCH v5 2/8 examples/cryptodev_fips_validate: add aes parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for AES-CBC parser, to allow the application to parser the aes request file and to validate all test types supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_aes.c                     | 186 +++++++++++
 .../cryptodev_fips_parse_validate.c                |   6 +
 .../cryptodev_fips_validate.h                      |  24 ++
 examples/cryptodev_fips_validate/main.c            | 346 ++++++++++++++++++++-
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 563 insertions(+), 1 deletion(-)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c
examples/cryptodev_fips_validate/Makefile +1 -0
index 7f0e603..2fc5689 100644
@@ -5,6 +5,7 @@
 APP = fips_validation
 
 # all source are stored in SRCS-y
+SRCS-y := cryptodev_fips_parse_aes.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c new file +186 -0

186 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +6 -0
index aec5bb9..32af47b 100644
@@ -104,6 +104,12 @@ fips_test_parse_header(void)
 		return ret;
 
 	for (i = 0; i < info.nb_vec_lines; i++) {
+		if (strstr(info.vec[i], "AESVS")) {
+			info.algo = FIPS_TEST_ALGO_AES;
+			ret = parse_test_aes_init();
+			if (ret < 0)
+				return ret;
+		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
 		if (tmp != NULL) {
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +24 -0
index beb6bed..5ac858d 100644
@@ -23,6 +23,7 @@
 #define FAX_FILE_PERFIX		"fax"
 
 enum fips_test_algorithms {
+		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -77,6 +78,21 @@ struct fips_test_callback {
 	struct fips_val *val;
 };
 
+enum fips_aesavs_test_types {
+	AESAVS_TYPE_GFXBOX = 0,
+	AESAVS_TYPE_KEYSBOX,
+	AESAVS_TYPE_VARKEY,
+	AESAVS_TYPE_VARTXT,
+	AESAVS_TYPE_MMT,
+	AESAVS_TYPE_MCT,
+};
+
+struct aesavs_interim_data {
+	enum fips_aesavs_test_types test_type;
+	uint32_t cipher_algo;
+	uint32_t key_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -88,6 +104,11 @@ struct fips_test_interim_info {
 	//uint8_t cryptodev_id;
 	char device_name[MAX_STRING_SIZE];
 
+	union {
+		struct aesavs_interim_data aes_data;
+
+	} interim_info;
+
 	enum fips_test_op op;
 
 	const struct fips_test_callback *callbacks;
@@ -118,6 +139,9 @@ void
 fips_test_write_one_case(void);
 
 int
+parse_test_aes_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +345 -1

368 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index f44043c..b8c662e 100644
@@ -9,6 +9,7 @@
 deps += ['cryptodev']
 allow_experimental_apis = true
 sources = files(
+	'cryptodev_fips_parse_aes.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#18 lore raw

Re: [PATCH v5 2/8] examples/cryptodev_fips_validate: add aes parser and enablement for test types

Quoted 14 lines · Marko Kovacevic
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +1 -0
index beb6bed..5ac858d 100644
@@ -23,6 +23,7 @@
  #define FAX_FILE_PERFIX		"fax"
 
  enum fips_test_algorithms {
+		FIPS_TEST_ALGO_AES = 0,
  		FIPS_TEST_ALGO_MAX
  };
 
@@ -77,6 +78,21 @@ struct fips_test_callback {
  	struct fips_val *val;

examples/cryptodev_fips_validate/cryptodev_fips_validate.h struct fips_test_callback { · line 88

Quoted 10 lines
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +8 -0
  };
 
+enum fips_aesavs_test_types {
+	AESAVS_TYPE_GFXBOX = 0,
+	AESAVS_TYPE_KEYSBOX,
+	AESAVS_TYPE_VARKEY,
+	AESAVS_TYPE_VARTXT,
+	AESAVS_TYPE_MMT,
+	AESAVS_TYPE_MCT,
+};

It would be better to start the enums from 1. Consider a case when an uninitialized/unsupported type is accidentally used and it would be treated as AES and would be processed accordingly.

#19 lore raw

Re: [PATCH v5 2/8] examples/cryptodev_fips_validate: add aes parser and enablement for test types

Quoted 18 lines · Akhil Goyal
Quoted 16 lines · Marko Kovacevic
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +1 -0
index beb6bed..5ac858d 100644
@@ -23,6 +23,7 @@
   #define FAX_FILE_PERFIX		"fax"
 
   enum fips_test_algorithms {
+		FIPS_TEST_ALGO_AES = 0,
   		FIPS_TEST_ALGO_MAX
   };
 
@@ -77,6 +78,21 @@ struct fips_test_callback {
   	struct fips_val *val;
   };
 
Quoted 11 lines

examples/cryptodev_fips_validate/cryptodev_fips_validate.h struct fips_test_callback { · line 88

Quoted 8 lines
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +8 -0
+enum fips_aesavs_test_types {
+	AESAVS_TYPE_GFXBOX = 0,
+	AESAVS_TYPE_KEYSBOX,
+	AESAVS_TYPE_VARKEY,
+	AESAVS_TYPE_VARTXT,
+	AESAVS_TYPE_MMT,
+	AESAVS_TYPE_MCT,
+};

It would be better to start the enums from 1. Consider a case when an uninitialized/unsupported type is accidentally used and it would be treated as AES and would be processed accordingly.

sure ill change that

#20 lore raw

PATCH v5 3/8 examples/cryptodev_fips_validate: add hmac parser

In reply to Marko Kovacevic

Added enablement for HMAC parser, to allow the application to parser the hmac request files and to validate all tests supported

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_hmac.c                    | 105 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |   9 ++
 examples/cryptodev_fips_validate/main.c            | 103 ++++++++++++++++++++
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 224 insertions(+)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c
examples/cryptodev_fips_validate/Makefile +1 -0
index 2fc5689..c85c76c 100644
@@ -6,6 +6,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_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c new file +105 -0

105 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index 32af47b..f1cd802 100644
@@ -109,6 +109,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "HMAC")) {
+			info.algo = FIPS_TEST_ALGO_HMAC;
+			ret = parse_test_hmac_init();
+			if (ret < 0)
+				return ret;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +9 -0
index 5ac858d..3cda9fe 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -93,6 +94,10 @@ struct aesavs_interim_data {
 	uint32_t key_len;
 };
 
+struct hmac_interim_data {
+	enum rte_crypto_auth_algorithm algo;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -106,6 +111,7 @@ struct fips_test_interim_info {
 
 	union {
 		struct aesavs_interim_data aes_data;
+		struct hmac_interim_data hmac_data;
 
 	} interim_info;
 
@@ -142,6 +148,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_hmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +103 -0

121 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index b8c662e..3e06f59 100644
@@ -10,6 +10,7 @@ deps += ['cryptodev']
 allow_experimental_apis = true
 sources = files(
 	'cryptodev_fips_parse_aes.c',
+	'cryptodev_fips_parse_hmac.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#21 lore raw

PATCH v5 4/8 examples/cryptodev_fips_validate: add TDES parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for TDES parser, to allow the application to parser the TDES request files and to validate all test types supported.

---
 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
examples/cryptodev_fips_validate/Makefile +1 -0
index c85c76c..2ddf326 100644
@@ -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
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +259 -0

259 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c +2 -0
index 39dbd6f..cc27754 100644
@@ -33,6 +33,8 @@ struct {
 		{AESAVS_TYPE_KEYSBOX, "KeySbox"},
 		{AESAVS_TYPE_VARKEY, "VarKey"},
 		{AESAVS_TYPE_VARTXT, "VarTxt"},
+		{TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"},
+		{TDES_VARIABLE_TEXT, "KAT"},
 		{AESAVS_TYPE_MMT, "MMT"},
 		{AESAVS_TYPE_MCT, "MCT"},
 };
examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index f1cd802..bb396e5 100644
@@ -114,6 +114,11 @@ fips_test_parse_header(void)
 			ret = parse_test_hmac_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "TDES")) {
+			info.algo = FIPS_TEST_ALGO_TDES;
+			ret = parse_test_tdes_init();
+			if (ret < 0)
+				return 0;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +21 -0
index 3cda9fe..c9b11dd 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_HMAC,
+		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -88,6 +89,17 @@ enum fips_aesavs_test_types {
 	AESAVS_TYPE_MCT,
 };
 
+enum fips_tdes_test_types {
+	TDES_INVERSE_PERMUTATION = 0,
+	TDES_PERMUTATION,
+	TDES_SUBSTITUTION_TABLE,
+	TDES_VARIABLE_KEY,
+	TDES_VARIABLE_TEXT,
+	TDES_KAT,
+	TDES_MCT, /* Monte Carlo (Modes) Test */
+	TDES_MMT /* Multi block Message Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -98,6 +110,11 @@ struct hmac_interim_data {
 	enum rte_crypto_auth_algorithm algo;
 };
 
+struct tdes_interim_data {
+	enum fips_tdes_test_types test_type;
+	uint32_t nb_keys;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -112,6 +129,7 @@ struct fips_test_interim_info {
 	union {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
+		struct tdes_interim_data tdes_data;
 
 	} interim_info;
 
@@ -148,6 +166,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_tdes_init(void);
+
+int
 parse_test_hmac_init(void);
 
 int
examples/cryptodev_fips_validate/main.c +175 -0

193 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index 3e06f59..997ee4e 100644
@@ -11,6 +11,7 @@ allow_experimental_apis = true
 sources = files(
 	'cryptodev_fips_parse_aes.c',
 	'cryptodev_fips_parse_hmac.c',
+	'cryptodev_fips_parse_3des.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#22 lore raw

Re: [PATCH v5 4/8] examples/cryptodev_fips_validate: add TDES parser and enablement for test types

better to be uniform with the name
TDES or 3DES

Quoted 168 lines · Marko Kovacevic

Added enablement for TDES parser, to allow the application to parser the TDES request files and to validate all test types supported.

---
  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

examples/cryptodev_fips_validate/Makefile +1 -0
index c85c76c..2ddf326 100644
@@ -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
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +132 -0
new file mode 100644
index 0000000..82e9132
@@ -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)

examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c line 142

Quoted 10 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +10 -0
+		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

Quoted 40 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +39 -0
+		}
+
+		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;
+}
+
#23 lore raw

Re: [PATCH v5 4/8] examples/cryptodev_fips_validate: add TDES parser and enablement for test types

Quoted 2 lines · Akhil Goyal

better to be uniform with the name
TDES or 3DES

sure will make it uniform

Quoted 173 lines · Marko Kovacevic
Quoted 171 lines

Added enablement for TDES parser, to allow the application to parser the TDES request files and to validate all test types supported.

---
   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

examples/cryptodev_fips_validate/Makefile +1 -0
index c85c76c..2ddf326 100644
@@ -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
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +135 -0
new file mode 100644
index 0000000..82e9132
@@ -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);
Quoted 8 lines

examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c line 142

Quoted 7 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +7 -0
+
+	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.

Quoted 40 lines
Quoted 40 lines
examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +39 -0
+		}
+
+		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;
+}
+
#24 lore raw

PATCH v5 5/8 examples/cryptodev_fips_validate: add gcm parser

In reply to Marko Kovacevic

Added enablement for GCM parser, to allow the application to parser the GCM request file and to validate all tests supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_gcm.c                     | 125 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |   4 +
 examples/cryptodev_fips_validate/main.c            | 116 ++++++++++++++++++-
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 251 insertions(+), 1 deletion(-)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c
examples/cryptodev_fips_validate/Makefile +1 -0
index 2ddf326..f8cfda7 100644
@@ -8,6 +8,7 @@ APP = fips_validation
 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_gcm.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c new file +125 -0

125 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index bb396e5..d45c88d 100644
@@ -109,6 +109,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "GCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_GCM;
+			ret = parse_test_gcm_init();
+			if (ret < 0)
+				return ret;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +4 -0
index c9b11dd..685bc0b 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -172,6 +173,9 @@ int
 parse_test_hmac_init(void);
 
 int
+parse_test_gcm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +115 -1

134 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index 997ee4e..3175993 100644
@@ -12,6 +12,7 @@ sources = files(
 	'cryptodev_fips_parse_aes.c',
 	'cryptodev_fips_parse_hmac.c',
 	'cryptodev_fips_parse_3des.c',
+	'cryptodev_fips_parse_gcm.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#25 lore raw

PATCH v5 6/8 examples/cryptodev_fips_validate: add cmac parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for CMAC parser, to allow the application to parser the cmac request files and to validate all test types supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_cmac.c                    | 116 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |   4 +
 examples/cryptodev_fips_validate/main.c            |  43 ++++++++
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 170 insertions(+)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c
examples/cryptodev_fips_validate/Makefile +1 -0
index f8cfda7..09acfd3 100644
@@ -9,6 +9,7 @@ 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_gcm.c
+SRCS-y += cryptodev_fips_parse_cmac.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c new file +116 -0

116 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index d45c88d..4617c67 100644
@@ -114,6 +114,11 @@ fips_test_parse_header(void)
 			ret = parse_test_gcm_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "CMAC")) {
+			info.algo = FIPS_TEST_ALGO_AES_CMAC;
+			ret = parse_test_cmac_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +4 -0
index 685bc0b..7bd1e9a 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
+		FIPS_TEST_ALGO_AES_CMAC,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -176,6 +177,9 @@ int
 parse_test_gcm_init(void);
 
 int
+parse_test_cmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +43 -0

55 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index 3175993..de6de7b 100644
@@ -13,6 +13,7 @@ sources = files(
 	'cryptodev_fips_parse_hmac.c',
 	'cryptodev_fips_parse_3des.c',
 	'cryptodev_fips_parse_gcm.c',
+	'cryptodev_fips_parse_cmac.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#26 lore raw

PATCH v5 7/8 examples/cryptodev_fips_validate: add ccm parser and enablement for test types

In reply to Marko Kovacevic

Added enablement for CCM parser, to allow the application to parser the ccm request files and to validate all test types supported.

---
 examples/cryptodev_fips_validate/Makefile          |   1 +
 .../cryptodev_fips_parse_ccm.c                     | 272 +++++++++++++++++++++
 .../cryptodev_fips_parse_validate.c                |   5 +
 .../cryptodev_fips_validate.h                      |  22 ++
 examples/cryptodev_fips_validate/main.c            |  56 ++++-
 examples/cryptodev_fips_validate/meson.build       |   1 +
 6 files changed, 356 insertions(+), 1 deletion(-)
 create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c
examples/cryptodev_fips_validate/Makefile +1 -0
index 09acfd3..c07d35a 100644
@@ -10,6 +10,7 @@ SRCS-y += cryptodev_fips_parse_hmac.c
 SRCS-y += cryptodev_fips_parse_3des.c
 SRCS-y += cryptodev_fips_parse_gcm.c
 SRCS-y += cryptodev_fips_parse_cmac.c
+SRCS-y += cryptodev_fips_parse_ccm.c
 SRCS-y += cryptodev_fips_parse_validate.c
 SRCS-y += main.c
 
examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c new file +272 -0

272 lines not on this page · raw message

examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c +5 -0
index 4617c67..47e3732 100644
@@ -119,6 +119,11 @@ fips_test_parse_header(void)
 			ret = parse_test_cmac_init();
 			if (ret < 0)
 				return 0;
+		} else if (strstr(info.vec[i], "CCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_CCM;
+			ret = parse_test_ccm_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/cryptodev_fips_validate/cryptodev_fips_validate.h +22 -0
index 7bd1e9a..afa0c0a 100644
@@ -26,6 +26,7 @@ enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_AES_CMAC,
+		FIPS_TEST_ALGO_AES_CCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -102,6 +103,14 @@ enum fips_tdes_test_types {
 	TDES_MMT /* Multi block Message Test */
 };
 
+enum fips_ccm_test_types {
+	CCM_VADT	= 1, /* Variable Associated Data Test */
+	CCM_VPT,		 /* Variable Payload Test */
+	CCM_VNT,		 /* Variable Nonce Test */
+	CCM_VTT,		 /* Variable Tag Test */
+	CCM_DVPT,	 /*  Decryption-Verification Process Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -117,6 +126,15 @@ struct tdes_interim_data {
 	uint32_t nb_keys;
 };
 
+struct ccm_interim_data {
+	enum fips_ccm_test_types test_type;
+	uint32_t aad_len;
+	uint32_t pt_len;
+	uint32_t digest_len;
+	uint32_t key_len;
+	uint32_t iv_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -132,6 +150,7 @@ struct fips_test_interim_info {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
 		struct tdes_interim_data tdes_data;
+		struct ccm_interim_data ccm_data;
 
 	} interim_info;
 
@@ -180,6 +199,9 @@ int
 parse_test_cmac_init(void);
 
 int
+parse_test_ccm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/cryptodev_fips_validate/main.c +55 -1

74 lines not on this page · raw message

examples/cryptodev_fips_validate/meson.build +1 -0
index de6de7b..fd83d1a 100644
@@ -14,6 +14,7 @@ sources = files(
 	'cryptodev_fips_parse_3des.c',
 	'cryptodev_fips_parse_gcm.c',
 	'cryptodev_fips_parse_cmac.c',
+	'cryptodev_fips_parse_ccm.c',
 	'cryptodev_fips_parse_validate.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#27 lore raw

PATCH v5 8/8 doc/guides/sample_app_ug: add guides for fips validation

In reply to Marko Kovacevic

Document explains how to run the fips sample app and instructions users need to parser all the request files and generate the response files.

---
 MAINTAINERS                                  |   4 +
 doc/guides/rel_notes/release_18_11.rst       |   6 ++
 doc/guides/sample_app_ug/fips_validation.rst | 119 +++++++++++++++++++++++++++
 doc/guides/sample_app_ug/index.rst           |   1 +
 4 files changed, 130 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
MAINTAINERS +4 -0
index 5d73756..31c9c65 100644
@@ -1314,3 +1314,7 @@ F: examples/tep_termination/
 F: examples/vmdq/
 F: examples/vmdq_dcb/
 F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst
+
+M: Marko Kovacevic <[email protected]>
+F: examples/cryptodev_fips_validate
+F: doc/guides/sample_app_ug/fips_validation.rst
doc/guides/rel_notes/release_18_11.rst +6 -0
index 436b20e..83ad92e 100644
@@ -54,6 +54,12 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Added Cryptodev Fips Validation Example Application.**
+
+  Added an example application to parse and perform symmetric cryptography
+  computation to the NIST Cryptographic Algorithm Validation Program (CAVP)
+  test vectors.
+
 * **Added support for using externally allocated memory in DPDK.**
 
   DPDK has gained support for creating new ``rte_malloc`` heaps referencing
doc/guides/sample_app_ug/fips_validation.rst new file +119 -0

119 lines not on this page · raw message

doc/guides/sample_app_ug/index.rst +1 -0
index 74b12af..65c12d9 100644
@@ -57,6 +57,7 @@ Sample Applications User Guides
     performance_thread
     ipsec_secgw
     bbdev_app
+    fips_validation
 
 **Figures**
 
Signature · 1 line
2.9.5
#28 lore raw

Re: [PATCH v5 8/8] doc/guides/sample_app_ug: add guides for fips validation

++ John

Quoted 140 lines · Marko Kovacevic

Document explains how to run the fips sample app and instructions users need to parser all the request files and generate the response files.

---
  MAINTAINERS                                  |   4 +
  doc/guides/rel_notes/release_18_11.rst       |   6 ++
  doc/guides/sample_app_ug/fips_validation.rst | 119 +++++++++++++++++++++++++++
  doc/guides/sample_app_ug/index.rst           |   1 +
  4 files changed, 130 insertions(+)

create mode 100644 doc/guides/sample_app_ug/fips_validation.rst

MAINTAINERS +4 -0
index 5d73756..31c9c65 100644
@@ -1314,3 +1314,7 @@ F: examples/tep_termination/
  F: examples/vmdq/
  F: examples/vmdq_dcb/
  F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst
+
+M: Marko Kovacevic <[email protected]>
+F: examples/cryptodev_fips_validate
+F: doc/guides/sample_app_ug/fips_validation.rst
doc/guides/rel_notes/release_18_11.rst +6 -0
index 436b20e..83ad92e 100644
@@ -54,6 +54,12 @@ New Features
       Also, make sure to start the actual text at the margin.
       =========================================================
 
+* **Added Cryptodev Fips Validation Example Application.**
+
+  Added an example application to parse and perform symmetric cryptography
+  computation to the NIST Cryptographic Algorithm Validation Program (CAVP)
+  test vectors.
+
  * **Added support for using externally allocated memory in DPDK.**
 
    DPDK has gained support for creating new ``rte_malloc`` heaps referencing
doc/guides/sample_app_ug/fips_validation.rst new file +90 -0
new file mode 100644
index 0000000..9e0db23
@@ -0,0 +1,119 @@
+..  SPDX-License-Identifier: BSD-3-Clause
+    Copyright(c) 2018 Intel Corporation.
+
+Federal Information Processing Standards (FIPS) CryptoDev Validation
+====================================================================
+
+Overview
+--------
+
+Federal Information Processing Standards (FIPS) are publicly announced standards
+developed by the United States federal government for use in computer systems by
+non-military government agencies and government contractors.
+
+This application is used to parse and perform symmetric cryptography
+computation to the NIST Cryptographic Algorithm Validation Program (CAVP) test
+vectors.
+
+For an algorithm implementation to be listed on a cryptographic module
+validation certificate as an Approved security function, the algorithm
+implementation must meet all the requirements of FIPS 140-2 and must
+successfully complete the cryptographic algorithm validation process.
+
+Limitations
+-----------
+
+* Only NIST CAVP request files are parsed by this application.
+* The version of request file supported is ``CAVS 21.0``
+* If the header comment in a ``.req`` file does not contain a Algo tag
+  i.e ``AES,TDES,GCM`` you need to manually add it into the head comment for
+  example::
+
+      # VARIABLE KEY - KAT for CBC / # TDES VARIABLE KEY - KAT for CBC
+
+* The application does not supply the test vectors. The user is expected to
+  obtain the test vector files from `NIST
+  <https://csrc.nist.gov/projects/cryptographic-algorithm-validation-
+  program/block-ciphers>`_ website. To obtain the ``.req`` files you need to
+  email a person from the NIST webiste and pay for the ``.req`` files.
+  The ``.rsp`` files from the site can be used to validate and compare with
+  the ``.rsp`` files created by the FIPS application.
+
+* Supported test vectors
+    * AES-CBC (128,192,256) - GFSbox, KeySbox, MCT, MMT
+    * AES-GCM (128,192,256) - EncryptExtIV, Decrypt
+    * AES-CCM (128) - VADT, VNT, VPT, VTT, DVPT
+    * AES-CMAC (128) - Generate, Verify
+    * HMAC (SHA1, SHA224, SHA256, SHA384, SHA512)
+    * TDES-CBC (1 Key, 2 Keys, 3 Keys) - MMT, Monte, Permop, Subkey, Varkey,
+      VarText
+
+Compiling the Application
+-------------------------
+
+* Compile Application
+
+    .. code-block:: console
+
+         make -C examples/cryptodev_fips_validate
+
+*  Run ``dos2unix`` on the request files
+
+    .. code-block:: console
+
+         dos2unix AES/req/*
+         dos2unix AES_GCM/req/*
+         dos2unix CCM/req/*
+         dos2unix CMAC/req/*
+         dos2unix HMAC/req/*
+         dos2unix TDES/req/*
+
+Running the Application
+-----------------------
+
+The application requires a number of command line options:
+
+    .. code-block:: console
+
+         ./cryptodev_fips_validate_app [EAL options]
+         -- --req-file FILE_PATH/FOLDER_PATH
+         --rsp-file FILE_PATH/FOLDER_PATH
+         [--cryptodev DEVICE_NAME] [--cryptodev-id ID] [--path-is-folder]
+
+where,
+  * req-file: The path of the request file or folder, separated by
+    ``path-is-folder`` option.
+
+  * rsp-file: The path that the response file or folder is stored. separated by
+    ``path-is-folder`` option.
+
+  * cryptodev: The name of the target DPDK Crypto device to be validated.

doc/guides/sample_app_ug/fips_validation.rst line 100

Quoted 10 lines
doc/guides/sample_app_ug/fips_validation.rst new file +10 -0
+
+  * cryptodev-id: The id of the target DPDK Crypto device to be validated.
+
+  * path-is-folder: If presented the application expects req-file and rsp-file
+    are folder paths.
+
+.. note::
+
+    The .req file is optional and the application can be run without it, but
+    .req files are the only ones that will be parsed by the application.

I am a bit confused here, I believe .rsp files downloaded from the website can be used to run the application
as it has both the cipher as well as plain text. So the application will be able to compare the data from .rsp file only.
Could you please elaborate both the scenarios of running the application with and without .req file.

Quoted 31 lines
doc/guides/sample_app_ug/fips_validation.rst new file +19 -0
+
+To run the application in linuxapp environment to test one AES FIPS test data
+file for crypto_aesni_mb PMD, issue the command:
+
+.. code-block:: console
+
+    $ ./cryptodev_fips_validate_app --vdev crypto_aesni_mb --
+    --req-file /PATH/TO/REQUEST/FILE.req --rsp-file ./PATH/TO/RESPONSE/FILE.rsp
+    --cryptodev crypto_aesni_mb
+
+To run the application in linuxapp environment to test all AES-GCM FIPS test
+data files in one folder for crypto_aesni_gcm PMD, issue the command:
+
+.. code-block:: console
+
+    $ ./cryptodev_fips_validate_app --vdev crypto_aesni_gcm0 --
+    --req-file /PATH/TO/REQUEST/FILE/FOLDER/
+    --rsp-file ./PATH/TO/RESPONSE/FILE/FOLDER/
+    --cryptodev-id 0 --path-is-folder
doc/guides/sample_app_ug/index.rst +1 -0
index 74b12af..65c12d9 100644
@@ -57,6 +57,7 @@ Sample Applications User Guides
      performance_thread
      ipsec_secgw
      bbdev_app
+    fips_validation
 
  **Figures**
 
#29 lore raw
In reply to Marko Kovacevic

Hi Marko,

Quoted 10 lines · Marko Kovacevic

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Marko Kovacevic (8):
v5:
- Changed patch titles

patch titles are still not correct

Quoted 4 lines

- Added MAINTAINERS File
- Removed bus_pci Dependency
- Updated documentation
- Changed app name

I do not see app name changed? Also there is mismatch in the file name for doc(.rst file and app name).
I can see that in fips_validation.rst, cryptodev_fips_validate_app is used. The app name looks pretty long,  I suggested for a shorter name like fips_validation

Quoted 8 lines

v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

Quoted 5 lines

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples/cryptodev_fips_validate: add fips validation into examples

examples/fips_validation: add cryptodev fips compliant application

Quoted 2 lines

examples/cryptodev_fips_validate: add aes parser and enablement for
test types

should not this be only examples/fips_validation: support AES parsing

Quoted 1 line

examples/cryptodev_fips_validate: add hmac parser

examples/fips_validation: support HMAC parsing

Quoted 2 lines

examples/cryptodev_fips_validate: add TDES parser and enablement for
test types

same for this one -- examples/fips_validation: support TDES parsing

Quoted 1 line

examples/cryptodev_fips_validate: add gcm parser

examples/cryptodev_fips_validate: support GCM parsing

Quoted 2 lines

examples/cryptodev_fips_validate: add cmac parser and enablement for
test types

examples/fips_validation: support CMAC parsing

Quoted 2 lines

examples/cryptodev_fips_validate: add ccm parser and enablement for
test types

examples/fips_validation: support CCM parsing

Quoted 1 line

doc/guides/sample_app_ug: add guides for fips validation

doc: add fips validation application guide

Quoted 2 lines
  MAINTAINERS                                        |    4 +

MAINTAINERS changes shall be split in 2 patches. for examples/fips_validation add in 1/8 and for rst file 8/8

Quoted 28 lines
  doc/guides/rel_notes/release_18_11.rst             |    6 +
  doc/guides/sample_app_ug/fips_validation.rst       |  119 ++
  doc/guides/sample_app_ug/index.rst                 |    1 +
  examples/cryptodev_fips_validate/Makefile          |   75 ++
  .../cryptodev_fips_parse_3des.c                    |  259 +++++
  .../cryptodev_fips_parse_aes.c                     |  188 +++
  .../cryptodev_fips_parse_ccm.c                     |  272 +++++
  .../cryptodev_fips_parse_cmac.c                    |  116 ++
  .../cryptodev_fips_parse_gcm.c                     |  125 ++
  .../cryptodev_fips_parse_hmac.c                    |  105 ++
  .../cryptodev_fips_parse_validate.c                |  593 ++++++++++
  .../cryptodev_fips_validate.h                      |  234 ++++
  examples/cryptodev_fips_validate/main.c            | 1221 ++++++++++++++++++++
  examples/cryptodev_fips_validate/meson.build       |   20 +
  15 files changed, 3338 insertions(+)

create mode 100644 doc/guides/sample_app_ug/fips_validation.rst create mode 100644 examples/cryptodev_fips_validate/Makefile
create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c create mode 100644 examples/cryptodev_fips_validate/cryptodev_fips_validate.h create mode 100644 examples/cryptodev_fips_validate/main.c
create mode 100644 examples/cryptodev_fips_validate/meson.build

#30 lore raw

v6 cover FIPS validation capability

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Marko Kovacevic (8):
v6:
- Added MAINTAINER file into different patch
- Udpated documentation
- Changed app name and file location
- Fixed memory leak in TDES
- Changed patch titles
- Made other changes from comments
v5:
- Changed patch titles
- Added MAINTAINERS File
- Removed bus_pci Dependency
- Updated documentation
- Changed app name
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

Kovacevic, Marko (8):
examples/fips_validation: add cryptodev fips compliant application examples/fips_validation: support AES parsing examples/fips_validation: support HMAC parsing examples/fips_validation: support TDES parsing examples/fips_validation: support GCM parsing examples/fips_validation: support CMAC parsing examples/fips_validation: support CCM parsing
doc: add fips validation application guide

 MAINTAINERS                                     |    4 +
 doc/guides/rel_notes/release_18_11.rst          |    5 +
 doc/guides/sample_app_ug/fips_validation.rst    |  132 +++
 doc/guides/sample_app_ug/index.rst              |    1 +
 examples/fips_validation/Makefile               |   75 ++
 examples/fips_validation/fips_validation.c      |  593 +++++++++++
 examples/fips_validation/fips_validation.h      |  233 +++++
 examples/fips_validation/fips_validation_aes.c  |  188 ++++
 examples/fips_validation/fips_validation_ccm.c  |  272 +++++
 examples/fips_validation/fips_validation_cmac.c |  116 +++
 examples/fips_validation/fips_validation_gcm.c  |  125 +++
 examples/fips_validation/fips_validation_hmac.c |  105 ++
 examples/fips_validation/fips_validation_tdes.c |  264 +++++
 examples/fips_validation/main.c                 | 1221 +++++++++++++++++++++++
 examples/fips_validation/meson.build            |   20 +
 15 files changed, 3354 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
 create mode 100644 examples/fips_validation/Makefile
 create mode 100644 examples/fips_validation/fips_validation.c
 create mode 100644 examples/fips_validation/fips_validation.h
 create mode 100644 examples/fips_validation/fips_validation_aes.c
 create mode 100644 examples/fips_validation/fips_validation_ccm.c
 create mode 100644 examples/fips_validation/fips_validation_cmac.c
 create mode 100644 examples/fips_validation/fips_validation_gcm.c
 create mode 100644 examples/fips_validation/fips_validation_hmac.c
 create mode 100644 examples/fips_validation/fips_validation_tdes.c
 create mode 100644 examples/fips_validation/main.c
 create mode 100644 examples/fips_validation/meson.build
Signature · 1 line
2.9.5
#31 lore raw

PATCH v6 1/8 examples/fips_validation: add cryptodev fips compliant application

From: "Kovacevic, Marko" <[email protected]>

Added FIPS application into the examples to allow users to use a simple sample app to validate their systems and be able to get FIPS certification.

---
 MAINTAINERS                                |   4 +
 examples/fips_validation/Makefile          |  69 ++++
 examples/fips_validation/fips_validation.c | 562 +++++++++++++++++++++++++++++
 examples/fips_validation/fips_validation.h | 149 ++++++++
 examples/fips_validation/main.c            | 388 ++++++++++++++++++++
 examples/fips_validation/meson.build       |  14 +
 6 files changed, 1186 insertions(+)
 create mode 100644 examples/fips_validation/Makefile
 create mode 100644 examples/fips_validation/fips_validation.c
 create mode 100644 examples/fips_validation/fips_validation.h
 create mode 100644 examples/fips_validation/main.c
 create mode 100644 examples/fips_validation/meson.build
MAINTAINERS +4 -0
index b220479..8e0d3a5 100644
@@ -1336,3 +1336,7 @@ F: examples/tep_termination/
 F: examples/vmdq/
 F: examples/vmdq_dcb/
 F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst
+
+M: Marko Kovacevic <[email protected]>
+F: examples/fips_validation
+F: doc/guides/sample_app_ug/fips_validation.rst
examples/fips_validation/Makefile new file +69 -0

69 lines not on this page · raw message

examples/fips_validation/fips_validation.c new file +562 -0

562 lines not on this page · raw message

examples/fips_validation/fips_validation.h new file +149 -0

149 lines not on this page · raw message

examples/fips_validation/main.c new file +388 -0

388 lines not on this page · raw message

examples/fips_validation/meson.build new file +14 -0
new file mode 100644
index 0000000..cceed4f
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 Intel Corporation
+
+# meson file, for building this example as part of a main DPDK build.
+#
+# To build this example as a standalone application with an already-installed
+# DPDK instance, use 'make'
+
+deps += ['cryptodev']
+allow_experimental_apis = true
+sources = files(
+	'fips_validation.c',
+	'main.c'
+)
Signature · 1 line
2.9.5
#32 lore raw

PATCH v6 2/8 examples/fips_validation: support AES parsing

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

Added enablement for AES-CBC parser, to allow the application to parser the aes request file and to validate all test types supported.

---
 examples/fips_validation/Makefile              |   1 +
 examples/fips_validation/fips_validation.c     |   6 +
 examples/fips_validation/fips_validation.h     |  24 ++
 examples/fips_validation/fips_validation_aes.c | 186 +++++++++++++
 examples/fips_validation/main.c                | 346 ++++++++++++++++++++++++-
 examples/fips_validation/meson.build           |   1 +
 6 files changed, 563 insertions(+), 1 deletion(-)
 create mode 100644 examples/fips_validation/fips_validation_aes.c
examples/fips_validation/Makefile +1 -0
index 59d56c7..1eb1bc5 100644
@@ -6,6 +6,7 @@ APP = fips_validation
 
 # all source are stored in SRCS-y
 SRCS-y := fips_validation.c
+SRCS-y += fips_validation_aes.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +6 -0
index 8ed15f4..9e70a47 100644
@@ -104,6 +104,12 @@ fips_test_parse_header(void)
 		return ret;
 
 	for (i = 0; i < info.nb_vec_lines; i++) {
+		if (strstr(info.vec[i], "AESVS")) {
+			info.algo = FIPS_TEST_ALGO_AES;
+			ret = parse_test_aes_init();
+			if (ret < 0)
+				return ret;
+		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
 		if (tmp != NULL) {
examples/fips_validation/fips_validation.h +24 -0
index dd3bc09..e947de1 100644
@@ -23,6 +23,7 @@
 #define FAX_FILE_PERFIX		"fax"
 
 enum fips_test_algorithms {
+		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -77,6 +78,21 @@ struct fips_test_callback {
 	struct fips_val *val;
 };
 
+enum fips_aesavs_test_types {
+	AESAVS_TYPE_GFXBOX = 1,
+	AESAVS_TYPE_KEYSBOX,
+	AESAVS_TYPE_VARKEY,
+	AESAVS_TYPE_VARTXT,
+	AESAVS_TYPE_MMT,
+	AESAVS_TYPE_MCT,
+};
+
+struct aesavs_interim_data {
+	enum fips_aesavs_test_types test_type;
+	uint32_t cipher_algo;
+	uint32_t key_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -87,6 +103,11 @@ struct fips_test_interim_info {
 	uint32_t nb_vec_lines;
 	char device_name[MAX_STRING_SIZE];
 
+	union {
+		struct aesavs_interim_data aes_data;
+
+	} interim_info;
+
 	enum fips_test_op op;
 
 	const struct fips_test_callback *callbacks;
@@ -117,6 +138,9 @@ void
 fips_test_write_one_case(void);
 
 int
+parse_test_aes_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_aes.c new file +186 -0

186 lines not on this page · raw message

examples/fips_validation/main.c +345 -1

368 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index cceed4f..fb20541 100644
@@ -9,6 +9,7 @@
 deps += ['cryptodev']
 allow_experimental_apis = true
 sources = files(
+	'fips_validation_aes.c',
 	'fips_validation.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#33 lore raw

PATCH v6 3/8 examples/fips_validation: support HMAC parsing

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

Added enablement for HMAC parser, to allow the application to parser the hmac request files and to validate all tests supported

---
 examples/fips_validation/Makefile               |   1 +
 examples/fips_validation/fips_validation.c      |   5 ++
 examples/fips_validation/fips_validation.h      |   9 ++
 examples/fips_validation/fips_validation_hmac.c | 105 ++++++++++++++++++++++++
 examples/fips_validation/main.c                 | 103 +++++++++++++++++++++++
 examples/fips_validation/meson.build            |   1 +
 6 files changed, 224 insertions(+)
 create mode 100644 examples/fips_validation/fips_validation_hmac.c
examples/fips_validation/Makefile +1 -0
index 1eb1bc5..0d76101 100644
@@ -7,6 +7,7 @@ APP = fips_validation
 # all source are stored in SRCS-y
 SRCS-y := fips_validation.c
 SRCS-y += fips_validation_aes.c
+SRCS-y += fips_validation_hmac.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index 9e70a47..994bd0c 100644
@@ -109,6 +109,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "HMAC")) {
+			info.algo = FIPS_TEST_ALGO_HMAC;
+			ret = parse_test_hmac_init();
+			if (ret < 0)
+				return ret;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/fips_validation/fips_validation.h +9 -0
index e947de1..f9e3a3b 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -93,6 +94,10 @@ struct aesavs_interim_data {
 	uint32_t key_len;
 };
 
+struct hmac_interim_data {
+	enum rte_crypto_auth_algorithm algo;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -105,6 +110,7 @@ struct fips_test_interim_info {
 
 	union {
 		struct aesavs_interim_data aes_data;
+		struct hmac_interim_data hmac_data;
 
 	} interim_info;
 
@@ -141,6 +147,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_hmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_hmac.c new file +105 -0

105 lines not on this page · raw message

examples/fips_validation/main.c +103 -0

121 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index fb20541..57bcf81 100644
@@ -11,5 +11,6 @@ allow_experimental_apis = true
 sources = files(
 	'fips_validation_aes.c',
 	'fips_validation.c',
+	'fips_validation_hmac.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#34 lore raw

PATCH v6 4/8 examples/fips_validation: support TDES parsing

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

Added enablement for TDES parser, to allow the application to parser the TDES request files and to validate all test types supported.

---
 examples/fips_validation/Makefile               |   1 +
 examples/fips_validation/fips_validation.c      |   5 +
 examples/fips_validation/fips_validation.h      |  21 ++
 examples/fips_validation/fips_validation_aes.c  |   2 +
 examples/fips_validation/fips_validation_tdes.c | 264 ++++++++++++++++++++++++
 examples/fips_validation/main.c                 | 175 ++++++++++++++++
 examples/fips_validation/meson.build            |   1 +
 7 files changed, 469 insertions(+)
 create mode 100644 examples/fips_validation/fips_validation_tdes.c
examples/fips_validation/Makefile +1 -0
index 0d76101..57cc778 100644
@@ -8,6 +8,7 @@ APP = fips_validation
 SRCS-y := fips_validation.c
 SRCS-y += fips_validation_aes.c
 SRCS-y += fips_validation_hmac.c
+SRCS-y += fips_validation_tdes.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index 994bd0c..ce66b9b 100644
@@ -114,6 +114,11 @@ fips_test_parse_header(void)
 			ret = parse_test_hmac_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "TDES")) {
+			info.algo = FIPS_TEST_ALGO_TDES;
+			ret = parse_test_tdes_init();
+			if (ret < 0)
+				return 0;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/fips_validation/fips_validation.h +21 -0
index f9e3a3b..69a2116 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_HMAC,
+		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -88,6 +89,17 @@ enum fips_aesavs_test_types {
 	AESAVS_TYPE_MCT,
 };
 
+enum fips_tdes_test_types {
+	TDES_INVERSE_PERMUTATION = 0,
+	TDES_PERMUTATION,
+	TDES_SUBSTITUTION_TABLE,
+	TDES_VARIABLE_KEY,
+	TDES_VARIABLE_TEXT,
+	TDES_KAT,
+	TDES_MCT, /* Monte Carlo (Modes) Test */
+	TDES_MMT /* Multi block Message Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -98,6 +110,11 @@ struct hmac_interim_data {
 	enum rte_crypto_auth_algorithm algo;
 };
 
+struct tdes_interim_data {
+	enum fips_tdes_test_types test_type;
+	uint32_t nb_keys;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -111,6 +128,7 @@ struct fips_test_interim_info {
 	union {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
+		struct tdes_interim_data tdes_data;
 
 	} interim_info;
 
@@ -147,6 +165,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_tdes_init(void);
+
+int
 parse_test_hmac_init(void);
 
 int
examples/fips_validation/fips_validation_aes.c +2 -0
index f60b864..8cbc158 100644
@@ -33,6 +33,8 @@ struct {
 		{AESAVS_TYPE_KEYSBOX, "KeySbox"},
 		{AESAVS_TYPE_VARKEY, "VarKey"},
 		{AESAVS_TYPE_VARTXT, "VarTxt"},
+		{TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"},
+		{TDES_VARIABLE_TEXT, "KAT"},
 		{AESAVS_TYPE_MMT, "MMT"},
 		{AESAVS_TYPE_MCT, "MCT"},
 };
examples/fips_validation/fips_validation_tdes.c new file +264 -0

264 lines not on this page · raw message

examples/fips_validation/main.c +175 -0

193 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index 57bcf81..781ad5f 100644
@@ -12,5 +12,6 @@ sources = files(
 	'fips_validation_aes.c',
 	'fips_validation.c',
 	'fips_validation_hmac.c',
+	'fips_validation_tdes.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#35 lore raw

PATCH v6 5/8 examples/fips_validation: support GCM parsing

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

Added enablement for GCM parser, to allow the application to parser the GCM request file and to validate all tests supported.

---
 examples/fips_validation/Makefile              |   1 +
 examples/fips_validation/fips_validation.c     |   5 +
 examples/fips_validation/fips_validation.h     |   4 +
 examples/fips_validation/fips_validation_gcm.c | 125 +++++++++++++++++++++++++
 examples/fips_validation/main.c                | 116 ++++++++++++++++++++++-
 examples/fips_validation/meson.build           |   1 +
 6 files changed, 251 insertions(+), 1 deletion(-)
 create mode 100644 examples/fips_validation/fips_validation_gcm.c
examples/fips_validation/Makefile +1 -0
index 57cc778..6373ac3 100644
@@ -9,6 +9,7 @@ SRCS-y := fips_validation.c
 SRCS-y += fips_validation_aes.c
 SRCS-y += fips_validation_hmac.c
 SRCS-y += fips_validation_tdes.c
+SRCS-y += fips_validation_gcm.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index ce66b9b..9a6005a 100644
@@ -109,6 +109,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "GCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_GCM;
+			ret = parse_test_gcm_init();
+			if (ret < 0)
+				return ret;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/fips_validation/fips_validation.h +4 -0
index 69a2116..4cceff5 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -171,6 +172,9 @@ int
 parse_test_hmac_init(void);
 
 int
+parse_test_gcm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_gcm.c new file +125 -0

125 lines not on this page · raw message

examples/fips_validation/main.c +115 -1

134 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index 781ad5f..0cc8bc4 100644
@@ -13,5 +13,6 @@ sources = files(
 	'fips_validation.c',
 	'fips_validation_hmac.c',
 	'fips_validation_tdes.c',
+	'fips_validation_gcm.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#36 lore raw

PATCH v6 6/8 examples/fips_validation: support CMAC parsing

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

Added enablement for CMAC parser, to allow the application to parser the cmac request files and to validate all test types supported.

---
 examples/fips_validation/Makefile               |   1 +
 examples/fips_validation/fips_validation.c      |   5 +
 examples/fips_validation/fips_validation.h      |   4 +
 examples/fips_validation/fips_validation_cmac.c | 116 ++++++++++++++++++++++++
 examples/fips_validation/main.c                 |  43 +++++++++
 examples/fips_validation/meson.build            |   1 +
 6 files changed, 170 insertions(+)
 create mode 100644 examples/fips_validation/fips_validation_cmac.c
examples/fips_validation/Makefile +1 -0
index 6373ac3..77b15ae 100644
@@ -10,6 +10,7 @@ SRCS-y += fips_validation_aes.c
 SRCS-y += fips_validation_hmac.c
 SRCS-y += fips_validation_tdes.c
 SRCS-y += fips_validation_gcm.c
+SRCS-y += fips_validation_cmac.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index 9a6005a..3b8f1ae 100644
@@ -114,6 +114,11 @@ fips_test_parse_header(void)
 			ret = parse_test_gcm_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "CMAC")) {
+			info.algo = FIPS_TEST_ALGO_AES_CMAC;
+			ret = parse_test_cmac_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/fips_validation/fips_validation.h +4 -0
index 4cceff5..8dffe8e 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
+		FIPS_TEST_ALGO_AES_CMAC,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -175,6 +176,9 @@ int
 parse_test_gcm_init(void);
 
 int
+parse_test_cmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_cmac.c new file +116 -0

116 lines not on this page · raw message

examples/fips_validation/main.c +43 -0

55 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index 0cc8bc4..a0d38fa 100644
@@ -14,5 +14,6 @@ sources = files(
 	'fips_validation_hmac.c',
 	'fips_validation_tdes.c',
 	'fips_validation_gcm.c',
+	'fips_validation_cmac.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#37 lore raw

PATCH v6 7/8 examples/fips_validation: support CCM parsing

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

Added enablement for CCM parser, to allow the application to parser the ccm request files and to validate all test types supported.

---
 examples/fips_validation/Makefile              |   1 +
 examples/fips_validation/fips_validation.c     |   5 +
 examples/fips_validation/fips_validation.h     |  22 ++
 examples/fips_validation/fips_validation_ccm.c | 272 +++++++++++++++++++++++++
 examples/fips_validation/main.c                |  56 ++++-
 examples/fips_validation/meson.build           |   1 +
 6 files changed, 356 insertions(+), 1 deletion(-)
 create mode 100644 examples/fips_validation/fips_validation_ccm.c
examples/fips_validation/Makefile +1 -0
index 77b15ae..7b1fe34 100644
@@ -11,6 +11,7 @@ SRCS-y += fips_validation_hmac.c
 SRCS-y += fips_validation_tdes.c
 SRCS-y += fips_validation_gcm.c
 SRCS-y += fips_validation_cmac.c
+SRCS-y += fips_validation_ccm.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index 3b8f1ae..d5a16b3 100644
@@ -119,6 +119,11 @@ fips_test_parse_header(void)
 			ret = parse_test_cmac_init();
 			if (ret < 0)
 				return 0;
+		} else if (strstr(info.vec[i], "CCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_CCM;
+			ret = parse_test_ccm_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/fips_validation/fips_validation.h +22 -0
index 8dffe8e..3e291bc 100644
@@ -26,6 +26,7 @@ enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_AES_CMAC,
+		FIPS_TEST_ALGO_AES_CCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -102,6 +103,14 @@ enum fips_tdes_test_types {
 	TDES_MMT /* Multi block Message Test */
 };
 
+enum fips_ccm_test_types {
+	CCM_VADT	= 1, /* Variable Associated Data Test */
+	CCM_VPT,		 /* Variable Payload Test */
+	CCM_VNT,		 /* Variable Nonce Test */
+	CCM_VTT,		 /* Variable Tag Test */
+	CCM_DVPT,	 /*  Decryption-Verification Process Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -117,6 +126,15 @@ struct tdes_interim_data {
 	uint32_t nb_keys;
 };
 
+struct ccm_interim_data {
+	enum fips_ccm_test_types test_type;
+	uint32_t aad_len;
+	uint32_t pt_len;
+	uint32_t digest_len;
+	uint32_t key_len;
+	uint32_t iv_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -131,6 +149,7 @@ struct fips_test_interim_info {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
 		struct tdes_interim_data tdes_data;
+		struct ccm_interim_data ccm_data;
 
 	} interim_info;
 
@@ -179,6 +198,9 @@ int
 parse_test_cmac_init(void);
 
 int
+parse_test_ccm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_ccm.c new file +272 -0

272 lines not on this page · raw message

examples/fips_validation/main.c +55 -1

74 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index a0d38fa..498c9ba 100644
@@ -15,5 +15,6 @@ sources = files(
 	'fips_validation_tdes.c',
 	'fips_validation_gcm.c',
 	'fips_validation_cmac.c',
+	'fips_validation_ccm.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#38 lore raw

PATCH v6 8/8 doc: add fips validation application guide

In reply to Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

Document explains how to run the fips sample app and instructions users need to parser all the request files and generate the response files.

---
 doc/guides/rel_notes/release_18_11.rst       |   5 +
 doc/guides/sample_app_ug/fips_validation.rst | 132 +++++++++++++++++++++++++++
 doc/guides/sample_app_ug/index.rst           |   1 +
 3 files changed, 138 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
doc/guides/rel_notes/release_18_11.rst +5 -0
index 04f3745..c085d4b 100644
@@ -198,6 +198,11 @@ New Features
   this application doesn't need to launch dedicated worker threads for vhost
   enqueue/dequeue operations.
 
+* **Added Cryptodev Fips Validation Example Application.**
+
+  Added an example application to parse and perform symmetric cryptography
+  computation to the NIST Cryptographic Algorithm Validation Program (CAVP)
+  test vectors.
 
 API Changes
 -----------
doc/guides/sample_app_ug/fips_validation.rst new file +132 -0

132 lines not on this page · raw message

doc/guides/sample_app_ug/index.rst +1 -0
index 74b12af..65c12d9 100644
@@ -57,6 +57,7 @@ Sample Applications User Guides
     performance_thread
     ipsec_secgw
     bbdev_app
+    fips_validation
 
 **Figures**
 
Signature · 1 line
2.9.5
#39 lore raw
In reply to Marko Kovacevic

Hi Marko,

I can see a compilation issue in the app.

/home/akhil/netperf/dpdk_up/dpdk-next-crypto/examples/fips_validation/fips_validation.c:
In function 'get_file_line':
/home/akhil/netperf/dpdk_up/dpdk-next-crypto/examples/fips_validation/fips_validation.c:31:25:
error: comparison is always true due to limited range of data type [-Werror=type-limits]
  while ((c = fgetc(fp)) != EOF) {
                         ^~
/home/akhil/netperf/dpdk_up/dpdk-next-crypto/examples/fips_validation/fips_validation.c:39:8:
error: comparison is always false due to limited range of data type [-Werror=type-limits]
  if (c == EOF)
        ^~
cc1: all warnings being treated as errors /home/akhil/netperf/dpdk_up/dpdk-next-crypto/mk/internal/rte.compile-pre.mk:114:
recipe for target 'fips_validation.o' failed

Quoted 74 lines · Marko Kovacevic

From: "Kovacevic, Marko" <[email protected]>

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Marko Kovacevic (8):
v6:
- Added MAINTAINER file into different patch
- Udpated documentation
- Changed app name and file location
- Fixed memory leak in TDES
- Changed patch titles
- Made other changes from comments
v5:
- Changed patch titles
- Added MAINTAINERS File
- Removed bus_pci Dependency
- Updated documentation
- Changed app name
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

Kovacevic, Marko (8):
examples/fips_validation: add cryptodev fips compliant application examples/fips_validation: support AES parsing examples/fips_validation: support HMAC parsing examples/fips_validation: support TDES parsing examples/fips_validation: support GCM parsing examples/fips_validation: support CMAC parsing examples/fips_validation: support CCM parsing
doc: add fips validation application guide

  MAINTAINERS                                     |    4 +
  doc/guides/rel_notes/release_18_11.rst          |    5 +
  doc/guides/sample_app_ug/fips_validation.rst    |  132 +++
  doc/guides/sample_app_ug/index.rst              |    1 +
  examples/fips_validation/Makefile               |   75 ++
  examples/fips_validation/fips_validation.c      |  593 +++++++++++
  examples/fips_validation/fips_validation.h      |  233 +++++
  examples/fips_validation/fips_validation_aes.c  |  188 ++++
  examples/fips_validation/fips_validation_ccm.c  |  272 +++++
  examples/fips_validation/fips_validation_cmac.c |  116 +++
  examples/fips_validation/fips_validation_gcm.c  |  125 +++
  examples/fips_validation/fips_validation_hmac.c |  105 ++
  examples/fips_validation/fips_validation_tdes.c |  264 +++++
  examples/fips_validation/main.c                 | 1221 +++++++++++++++++++++++
  examples/fips_validation/meson.build            |   20 +
  15 files changed, 3354 insertions(+)

create mode 100644 doc/guides/sample_app_ug/fips_validation.rst create mode 100644 examples/fips_validation/Makefile create mode 100644 examples/fips_validation/fips_validation.c create mode 100644 examples/fips_validation/fips_validation.h create mode 100644 examples/fips_validation/fips_validation_aes.c create mode 100644 examples/fips_validation/fips_validation_ccm.c create mode 100644 examples/fips_validation/fips_validation_cmac.c create mode 100644 examples/fips_validation/fips_validation_gcm.c create mode 100644 examples/fips_validation/fips_validation_hmac.c create mode 100644 examples/fips_validation/fips_validation_tdes.c create mode 100644 examples/fips_validation/main.c create mode 100644 examples/fips_validation/meson.build

#40 lore raw
Quoted 15 lines

Hi Marko,

I can see a compilation issue in the app.

/home/akhil/netperf/dpdk_up/dpdk-next- crypto/examples/fips_validation/fips_validation.c:
In function 'get_file_line':
/home/akhil/netperf/dpdk_up/dpdk-next- crypto/examples/fips_validation/fips_validation.c:31:25:
error: comparison is always true due to limited range of data type [- Werror=type-limits]
  while ((c = fgetc(fp)) != EOF) {
                         ^~
/home/akhil/netperf/dpdk_up/dpdk-next- crypto/examples/fips_validation/fips_validation.c:39:8:

Quoted 9 lines

error: comparison is always false due to limited range of data type [- Werror=type-limits]
  if (c == EOF)
        ^~
cc1: all warnings being treated as errors /home/akhil/netperf/dpdk_up/dpdk-next-crypto/mk/internal/rte.compile- pre.mk:114:
recipe for target 'fips_validation.o' failed

That didn’t pop up for me on my side when compiling but I see the error sending a fix now.

Thanks Akhil.

#41 lore raw

v7 cover FIPS validation capability

In reply to Marko Kovacevic

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Kovacevic, Marko (8):
v7:
- Fixed compilation issue.
v6:
- Added MAINTAINER file into different patch
- Udpated documentation
- Changed app name and file location
- Fixed memory leak in TDES
- Changed patch titles
- Made other changes from comments
v5:
- Changed patch titles
- Added MAINTAINERS File
- Removed bus_pci Dependency
- Updated documentation
- Changed app name
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples/fips_validation: add cryptodev fips compliant application examples/fips_validation: support AES parsing examples/fips_validation: support HMAC parsing examples/fips_validation: support TDES parsing examples/fips_validation: support GCM parsing examples/fips_validation: support CMAC parsing examples/fips_validation: support CCM parsing
doc: add fips validation application guide

 MAINTAINERS                                     |    4 +
 doc/guides/rel_notes/release_18_11.rst          |    5 +
 doc/guides/sample_app_ug/fips_validation.rst    |  132 +++
 doc/guides/sample_app_ug/index.rst              |    1 +
 examples/fips_validation/Makefile               |   75 ++
 examples/fips_validation/fips_validation.c      |  595 +++++++++++
 examples/fips_validation/fips_validation.h      |  233 +++++
 examples/fips_validation/fips_validation_aes.c  |  188 ++++
 examples/fips_validation/fips_validation_ccm.c  |  272 +++++
 examples/fips_validation/fips_validation_cmac.c |  116 +++
 examples/fips_validation/fips_validation_gcm.c  |  125 +++
 examples/fips_validation/fips_validation_hmac.c |  105 ++
 examples/fips_validation/fips_validation_tdes.c |  264 +++++
 examples/fips_validation/main.c                 | 1221 +++++++++++++++++++++++
 examples/fips_validation/meson.build            |   20 +
 15 files changed, 3356 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
 create mode 100644 examples/fips_validation/Makefile
 create mode 100644 examples/fips_validation/fips_validation.c
 create mode 100644 examples/fips_validation/fips_validation.h
 create mode 100644 examples/fips_validation/fips_validation_aes.c
 create mode 100644 examples/fips_validation/fips_validation_ccm.c
 create mode 100644 examples/fips_validation/fips_validation_cmac.c
 create mode 100644 examples/fips_validation/fips_validation_gcm.c
 create mode 100644 examples/fips_validation/fips_validation_hmac.c
 create mode 100644 examples/fips_validation/fips_validation_tdes.c
 create mode 100644 examples/fips_validation/main.c
 create mode 100644 examples/fips_validation/meson.build
Signature · 1 line
2.9.5
#42 lore raw

PATCH v7 1/8 examples/fips_validation: add cryptodev fips compliant application

Added FIPS application into the examples to allow users to use a simple sample app to validate their systems and be able to get FIPS certification.

---
 MAINTAINERS                                |   4 +
 examples/fips_validation/Makefile          |  69 ++++
 examples/fips_validation/fips_validation.c | 564 +++++++++++++++++++++++++++++
 examples/fips_validation/fips_validation.h | 149 ++++++++
 examples/fips_validation/main.c            | 388 ++++++++++++++++++++
 examples/fips_validation/meson.build       |  14 +
 6 files changed, 1188 insertions(+)
 create mode 100644 examples/fips_validation/Makefile
 create mode 100644 examples/fips_validation/fips_validation.c
 create mode 100644 examples/fips_validation/fips_validation.h
 create mode 100644 examples/fips_validation/main.c
 create mode 100644 examples/fips_validation/meson.build
MAINTAINERS +4 -0
index e60379d..f52b8b9 100644
@@ -1343,3 +1343,7 @@ F: examples/tep_termination/
 F: examples/vmdq/
 F: examples/vmdq_dcb/
 F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst
+
+M: Marko Kovacevic <[email protected]>
+F: examples/fips_validation
+F: doc/guides/sample_app_ug/fips_validation.rst
examples/fips_validation/Makefile new file +69 -0

69 lines not on this page · raw message

examples/fips_validation/fips_validation.c new file +564 -0

564 lines not on this page · raw message

examples/fips_validation/fips_validation.h new file +149 -0

149 lines not on this page · raw message

examples/fips_validation/main.c new file +388 -0

388 lines not on this page · raw message

examples/fips_validation/meson.build new file +14 -0
new file mode 100644
index 0000000..cceed4f
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 Intel Corporation
+
+# meson file, for building this example as part of a main DPDK build.
+#
+# To build this example as a standalone application with an already-installed
+# DPDK instance, use 'make'
+
+deps += ['cryptodev']
+allow_experimental_apis = true
+sources = files(
+	'fips_validation.c',
+	'main.c'
+)
Signature · 1 line
2.9.5
#43 lore raw

PATCH v7 2/8 examples/fips_validation: support AES parsing

In reply to Kovacevic, Marko

Added enablement for AES-CBC parser, to allow the application to parser the aes request file and to validate all test types supported.

---
 examples/fips_validation/Makefile              |   1 +
 examples/fips_validation/fips_validation.c     |   6 +
 examples/fips_validation/fips_validation.h     |  24 ++
 examples/fips_validation/fips_validation_aes.c | 186 +++++++++++++
 examples/fips_validation/main.c                | 346 ++++++++++++++++++++++++-
 examples/fips_validation/meson.build           |   1 +
 6 files changed, 563 insertions(+), 1 deletion(-)
 create mode 100644 examples/fips_validation/fips_validation_aes.c
examples/fips_validation/Makefile +1 -0
index 59d56c7..1eb1bc5 100644
@@ -6,6 +6,7 @@ APP = fips_validation
 
 # all source are stored in SRCS-y
 SRCS-y := fips_validation.c
+SRCS-y += fips_validation_aes.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +6 -0
index 58a3c1b..dba26d8 100644
@@ -106,6 +106,12 @@ fips_test_parse_header(void)
 		return ret;
 
 	for (i = 0; i < info.nb_vec_lines; i++) {
+		if (strstr(info.vec[i], "AESVS")) {
+			info.algo = FIPS_TEST_ALGO_AES;
+			ret = parse_test_aes_init();
+			if (ret < 0)
+				return ret;
+		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
 		if (tmp != NULL) {
examples/fips_validation/fips_validation.h +24 -0
index dd3bc09..e947de1 100644
@@ -23,6 +23,7 @@
 #define FAX_FILE_PERFIX		"fax"
 
 enum fips_test_algorithms {
+		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -77,6 +78,21 @@ struct fips_test_callback {
 	struct fips_val *val;
 };
 
+enum fips_aesavs_test_types {
+	AESAVS_TYPE_GFXBOX = 1,
+	AESAVS_TYPE_KEYSBOX,
+	AESAVS_TYPE_VARKEY,
+	AESAVS_TYPE_VARTXT,
+	AESAVS_TYPE_MMT,
+	AESAVS_TYPE_MCT,
+};
+
+struct aesavs_interim_data {
+	enum fips_aesavs_test_types test_type;
+	uint32_t cipher_algo;
+	uint32_t key_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -87,6 +103,11 @@ struct fips_test_interim_info {
 	uint32_t nb_vec_lines;
 	char device_name[MAX_STRING_SIZE];
 
+	union {
+		struct aesavs_interim_data aes_data;
+
+	} interim_info;
+
 	enum fips_test_op op;
 
 	const struct fips_test_callback *callbacks;
@@ -117,6 +138,9 @@ void
 fips_test_write_one_case(void);
 
 int
+parse_test_aes_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_aes.c new file +186 -0

186 lines not on this page · raw message

examples/fips_validation/main.c +345 -1

368 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index cceed4f..fb20541 100644
@@ -9,6 +9,7 @@
 deps += ['cryptodev']
 allow_experimental_apis = true
 sources = files(
+	'fips_validation_aes.c',
 	'fips_validation.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#44 lore raw

PATCH v7 3/8 examples/fips_validation: support HMAC parsing

In reply to Kovacevic, Marko

Added enablement for HMAC parser, to allow the application to parser the hmac request files and to validate all tests supported

---
 examples/fips_validation/Makefile               |   1 +
 examples/fips_validation/fips_validation.c      |   5 ++
 examples/fips_validation/fips_validation.h      |   9 ++
 examples/fips_validation/fips_validation_hmac.c | 105 ++++++++++++++++++++++++
 examples/fips_validation/main.c                 | 103 +++++++++++++++++++++++
 examples/fips_validation/meson.build            |   1 +
 6 files changed, 224 insertions(+)
 create mode 100644 examples/fips_validation/fips_validation_hmac.c
examples/fips_validation/Makefile +1 -0
index 1eb1bc5..0d76101 100644
@@ -7,6 +7,7 @@ APP = fips_validation
 # all source are stored in SRCS-y
 SRCS-y := fips_validation.c
 SRCS-y += fips_validation_aes.c
+SRCS-y += fips_validation_hmac.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index dba26d8..24307b6 100644
@@ -111,6 +111,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "HMAC")) {
+			info.algo = FIPS_TEST_ALGO_HMAC;
+			ret = parse_test_hmac_init();
+			if (ret < 0)
+				return ret;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/fips_validation/fips_validation.h +9 -0
index e947de1..f9e3a3b 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -93,6 +94,10 @@ struct aesavs_interim_data {
 	uint32_t key_len;
 };
 
+struct hmac_interim_data {
+	enum rte_crypto_auth_algorithm algo;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -105,6 +110,7 @@ struct fips_test_interim_info {
 
 	union {
 		struct aesavs_interim_data aes_data;
+		struct hmac_interim_data hmac_data;
 
 	} interim_info;
 
@@ -141,6 +147,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_hmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_hmac.c new file +105 -0

105 lines not on this page · raw message

examples/fips_validation/main.c +103 -0

121 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index fb20541..57bcf81 100644
@@ -11,5 +11,6 @@ allow_experimental_apis = true
 sources = files(
 	'fips_validation_aes.c',
 	'fips_validation.c',
+	'fips_validation_hmac.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#45 lore raw

PATCH v7 4/8 examples/fips_validation: support TDES parsing

In reply to Kovacevic, Marko

Added enablement for TDES parser, to allow the application to parser the TDES request files and to validate all test types supported.

---
 examples/fips_validation/Makefile               |   1 +
 examples/fips_validation/fips_validation.c      |   5 +
 examples/fips_validation/fips_validation.h      |  21 ++
 examples/fips_validation/fips_validation_aes.c  |   2 +
 examples/fips_validation/fips_validation_tdes.c | 264 ++++++++++++++++++++++++
 examples/fips_validation/main.c                 | 175 ++++++++++++++++
 examples/fips_validation/meson.build            |   1 +
 7 files changed, 469 insertions(+)
 create mode 100644 examples/fips_validation/fips_validation_tdes.c
examples/fips_validation/Makefile +1 -0
index 0d76101..57cc778 100644
@@ -8,6 +8,7 @@ APP = fips_validation
 SRCS-y := fips_validation.c
 SRCS-y += fips_validation_aes.c
 SRCS-y += fips_validation_hmac.c
+SRCS-y += fips_validation_tdes.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index 24307b6..86f443d 100644
@@ -116,6 +116,11 @@ fips_test_parse_header(void)
 			ret = parse_test_hmac_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "TDES")) {
+			info.algo = FIPS_TEST_ALGO_TDES;
+			ret = parse_test_tdes_init();
+			if (ret < 0)
+				return 0;
 		}
 
 		tmp = strstr(info.vec[i], "# Config info for ");
examples/fips_validation/fips_validation.h +21 -0
index f9e3a3b..69a2116 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_HMAC,
+		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
 };
 
@@ -88,6 +89,17 @@ enum fips_aesavs_test_types {
 	AESAVS_TYPE_MCT,
 };
 
+enum fips_tdes_test_types {
+	TDES_INVERSE_PERMUTATION = 0,
+	TDES_PERMUTATION,
+	TDES_SUBSTITUTION_TABLE,
+	TDES_VARIABLE_KEY,
+	TDES_VARIABLE_TEXT,
+	TDES_KAT,
+	TDES_MCT, /* Monte Carlo (Modes) Test */
+	TDES_MMT /* Multi block Message Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -98,6 +110,11 @@ struct hmac_interim_data {
 	enum rte_crypto_auth_algorithm algo;
 };
 
+struct tdes_interim_data {
+	enum fips_tdes_test_types test_type;
+	uint32_t nb_keys;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -111,6 +128,7 @@ struct fips_test_interim_info {
 	union {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
+		struct tdes_interim_data tdes_data;
 
 	} interim_info;
 
@@ -147,6 +165,9 @@ int
 parse_test_aes_init(void);
 
 int
+parse_test_tdes_init(void);
+
+int
 parse_test_hmac_init(void);
 
 int
examples/fips_validation/fips_validation_aes.c +2 -0
index f60b864..8cbc158 100644
@@ -33,6 +33,8 @@ struct {
 		{AESAVS_TYPE_KEYSBOX, "KeySbox"},
 		{AESAVS_TYPE_VARKEY, "VarKey"},
 		{AESAVS_TYPE_VARTXT, "VarTxt"},
+		{TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"},
+		{TDES_VARIABLE_TEXT, "KAT"},
 		{AESAVS_TYPE_MMT, "MMT"},
 		{AESAVS_TYPE_MCT, "MCT"},
 };
examples/fips_validation/fips_validation_tdes.c new file +264 -0

264 lines not on this page · raw message

examples/fips_validation/main.c +175 -0

193 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index 57bcf81..781ad5f 100644
@@ -12,5 +12,6 @@ sources = files(
 	'fips_validation_aes.c',
 	'fips_validation.c',
 	'fips_validation_hmac.c',
+	'fips_validation_tdes.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#46 lore raw

PATCH v7 5/8 examples/fips_validation: support GCM parsing

In reply to Kovacevic, Marko

Added enablement for GCM parser, to allow the application to parser the GCM request file and to validate all tests supported.

---
 examples/fips_validation/Makefile              |   1 +
 examples/fips_validation/fips_validation.c     |   5 +
 examples/fips_validation/fips_validation.h     |   4 +
 examples/fips_validation/fips_validation_gcm.c | 125 +++++++++++++++++++++++++
 examples/fips_validation/main.c                | 116 ++++++++++++++++++++++-
 examples/fips_validation/meson.build           |   1 +
 6 files changed, 251 insertions(+), 1 deletion(-)
 create mode 100644 examples/fips_validation/fips_validation_gcm.c
examples/fips_validation/Makefile +1 -0
index 57cc778..6373ac3 100644
@@ -9,6 +9,7 @@ SRCS-y := fips_validation.c
 SRCS-y += fips_validation_aes.c
 SRCS-y += fips_validation_hmac.c
 SRCS-y += fips_validation_tdes.c
+SRCS-y += fips_validation_gcm.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index 86f443d..1b926b8 100644
@@ -111,6 +111,11 @@ fips_test_parse_header(void)
 			ret = parse_test_aes_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "GCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_GCM;
+			ret = parse_test_gcm_init();
+			if (ret < 0)
+				return ret;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/fips_validation/fips_validation.h +4 -0
index 69a2116..4cceff5 100644
@@ -24,6 +24,7 @@
 
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
+		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -171,6 +172,9 @@ int
 parse_test_hmac_init(void);
 
 int
+parse_test_gcm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_gcm.c new file +125 -0

125 lines not on this page · raw message

examples/fips_validation/main.c +115 -1

134 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index 781ad5f..0cc8bc4 100644
@@ -13,5 +13,6 @@ sources = files(
 	'fips_validation.c',
 	'fips_validation_hmac.c',
 	'fips_validation_tdes.c',
+	'fips_validation_gcm.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#47 lore raw

PATCH v7 6/8 examples/fips_validation: support CMAC parsing

In reply to Kovacevic, Marko

Added enablement for CMAC parser, to allow the application to parser the cmac request files and to validate all test types supported.

---
 examples/fips_validation/Makefile               |   1 +
 examples/fips_validation/fips_validation.c      |   5 +
 examples/fips_validation/fips_validation.h      |   4 +
 examples/fips_validation/fips_validation_cmac.c | 116 ++++++++++++++++++++++++
 examples/fips_validation/main.c                 |  43 +++++++++
 examples/fips_validation/meson.build            |   1 +
 6 files changed, 170 insertions(+)
 create mode 100644 examples/fips_validation/fips_validation_cmac.c
examples/fips_validation/Makefile +1 -0
index 6373ac3..77b15ae 100644
@@ -10,6 +10,7 @@ SRCS-y += fips_validation_aes.c
 SRCS-y += fips_validation_hmac.c
 SRCS-y += fips_validation_tdes.c
 SRCS-y += fips_validation_gcm.c
+SRCS-y += fips_validation_cmac.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index 1b926b8..fdf6f64 100644
@@ -116,6 +116,11 @@ fips_test_parse_header(void)
 			ret = parse_test_gcm_init();
 			if (ret < 0)
 				return ret;
+		} else if (strstr(info.vec[i], "CMAC")) {
+			info.algo = FIPS_TEST_ALGO_AES_CMAC;
+			ret = parse_test_cmac_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/fips_validation/fips_validation.h +4 -0
index 4cceff5..8dffe8e 100644
@@ -25,6 +25,7 @@
 enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
+		FIPS_TEST_ALGO_AES_CMAC,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -175,6 +176,9 @@ int
 parse_test_gcm_init(void);
 
 int
+parse_test_cmac_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_cmac.c new file +116 -0

116 lines not on this page · raw message

examples/fips_validation/main.c +43 -0

55 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index 0cc8bc4..a0d38fa 100644
@@ -14,5 +14,6 @@ sources = files(
 	'fips_validation_hmac.c',
 	'fips_validation_tdes.c',
 	'fips_validation_gcm.c',
+	'fips_validation_cmac.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#48 lore raw

PATCH v7 7/8 examples/fips_validation: support CCM parsing

In reply to Kovacevic, Marko

Added enablement for CCM parser, to allow the application to parser the ccm request files and to validate all test types supported.

---
 examples/fips_validation/Makefile              |   1 +
 examples/fips_validation/fips_validation.c     |   5 +
 examples/fips_validation/fips_validation.h     |  22 ++
 examples/fips_validation/fips_validation_ccm.c | 272 +++++++++++++++++++++++++
 examples/fips_validation/main.c                |  56 ++++-
 examples/fips_validation/meson.build           |   1 +
 6 files changed, 356 insertions(+), 1 deletion(-)
 create mode 100644 examples/fips_validation/fips_validation_ccm.c
examples/fips_validation/Makefile +1 -0
index 77b15ae..7b1fe34 100644
@@ -11,6 +11,7 @@ SRCS-y += fips_validation_hmac.c
 SRCS-y += fips_validation_tdes.c
 SRCS-y += fips_validation_gcm.c
 SRCS-y += fips_validation_cmac.c
+SRCS-y += fips_validation_ccm.c
 SRCS-y += main.c
 
 # Build using pkg-config variables if possible
examples/fips_validation/fips_validation.c +5 -0
index fdf6f64..a835cc3 100644
@@ -121,6 +121,11 @@ fips_test_parse_header(void)
 			ret = parse_test_cmac_init();
 			if (ret < 0)
 				return 0;
+		} else if (strstr(info.vec[i], "CCM")) {
+			info.algo = FIPS_TEST_ALGO_AES_CCM;
+			ret = parse_test_ccm_init();
+			if (ret < 0)
+				return 0;
 		} else if (strstr(info.vec[i], "HMAC")) {
 			info.algo = FIPS_TEST_ALGO_HMAC;
 			ret = parse_test_hmac_init();
examples/fips_validation/fips_validation.h +22 -0
index 8dffe8e..3e291bc 100644
@@ -26,6 +26,7 @@ enum fips_test_algorithms {
 		FIPS_TEST_ALGO_AES = 0,
 		FIPS_TEST_ALGO_AES_GCM,
 		FIPS_TEST_ALGO_AES_CMAC,
+		FIPS_TEST_ALGO_AES_CCM,
 		FIPS_TEST_ALGO_HMAC,
 		FIPS_TEST_ALGO_TDES,
 		FIPS_TEST_ALGO_MAX
@@ -102,6 +103,14 @@ enum fips_tdes_test_types {
 	TDES_MMT /* Multi block Message Test */
 };
 
+enum fips_ccm_test_types {
+	CCM_VADT	= 1, /* Variable Associated Data Test */
+	CCM_VPT,		 /* Variable Payload Test */
+	CCM_VNT,		 /* Variable Nonce Test */
+	CCM_VTT,		 /* Variable Tag Test */
+	CCM_DVPT,	 /*  Decryption-Verification Process Test */
+};
+
 struct aesavs_interim_data {
 	enum fips_aesavs_test_types test_type;
 	uint32_t cipher_algo;
@@ -117,6 +126,15 @@ struct tdes_interim_data {
 	uint32_t nb_keys;
 };
 
+struct ccm_interim_data {
+	enum fips_ccm_test_types test_type;
+	uint32_t aad_len;
+	uint32_t pt_len;
+	uint32_t digest_len;
+	uint32_t key_len;
+	uint32_t iv_len;
+};
+
 struct fips_test_interim_info {
 	FILE *fp_rd;
 	FILE *fp_wr;
@@ -131,6 +149,7 @@ struct fips_test_interim_info {
 		struct aesavs_interim_data aes_data;
 		struct hmac_interim_data hmac_data;
 		struct tdes_interim_data tdes_data;
+		struct ccm_interim_data ccm_data;
 
 	} interim_info;
 
@@ -179,6 +198,9 @@ int
 parse_test_cmac_init(void);
 
 int
+parse_test_ccm_init(void);
+
+int
 parser_read_uint8_hex(uint8_t *value, const char *p);
 
 int
examples/fips_validation/fips_validation_ccm.c new file +272 -0

272 lines not on this page · raw message

examples/fips_validation/main.c +55 -1

74 lines not on this page · raw message

examples/fips_validation/meson.build +1 -0
index a0d38fa..498c9ba 100644
@@ -15,5 +15,6 @@ sources = files(
 	'fips_validation_tdes.c',
 	'fips_validation_gcm.c',
 	'fips_validation_cmac.c',
+	'fips_validation_ccm.c',
 	'main.c'
 )
Signature · 1 line
2.9.5
#49 lore raw

PATCH v7 8/8 doc: add fips validation application guide

In reply to Kovacevic, Marko

Document explains how to run the fips sample app and instructions users need to parser all the request files and generate the response files.

---
 doc/guides/rel_notes/release_18_11.rst       |   5 +
 doc/guides/sample_app_ug/fips_validation.rst | 132 +++++++++++++++++++++++++++
 doc/guides/sample_app_ug/index.rst           |   1 +
 3 files changed, 138 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/fips_validation.rst
doc/guides/rel_notes/release_18_11.rst +5 -0
index 376128f..8fa0441 100644
@@ -285,6 +285,11 @@ New Features
   this application doesn't need to launch dedicated worker threads for vhost
   enqueue/dequeue operations.
 
+* **Added Cryptodev Fips Validation Example Application.**
+
+  Added an example application to parse and perform symmetric cryptography
+  computation to the NIST Cryptographic Algorithm Validation Program (CAVP)
+  test vectors.
 
 API Changes
 -----------
doc/guides/sample_app_ug/fips_validation.rst new file +132 -0

132 lines not on this page · raw message

doc/guides/sample_app_ug/index.rst +1 -0
index 74b12af..65c12d9 100644
@@ -57,6 +57,7 @@ Sample Applications User Guides
     performance_thread
     ipsec_secgw
     bbdev_app
+    fips_validation
 
 **Figures**
 
Signature · 1 line
2.9.5
#50 lore raw
In reply to Kovacevic, Marko
Quoted 59 lines · Marko

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Kovacevic, Marko (8):
v7:
- Fixed compilation issue.
v6:
- Added MAINTAINER file into different patch
- Udpated documentation
- Changed app name and file location
- Fixed memory leak in TDES
- Changed patch titles
- Made other changes from comments
v5:
- Changed patch titles
- Added MAINTAINERS File
- Removed bus_pci Dependency
- Updated documentation
- Changed app name
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples/fips_validation: add cryptodev fips compliant application examples/fips_validation: support AES parsing examples/fips_validation: support HMAC parsing examples/fips_validation: support TDES parsing examples/fips_validation: support GCM parsing examples/fips_validation: support CMAC parsing examples/fips_validation: support CCM parsing
doc: add fips validation application guide

  MAINTAINERS                                     |    4 +
  doc/guides/rel_notes/release_18_11.rst          |    5 +
  doc/guides/sample_app_ug/fips_validation.rst    |  132 +++
  doc/guides/sample_app_ug/index.rst              |    1 +
  examples/fips_validation/Makefile               |   75 ++
  examples/fips_validation/fips_validation.c      |  595 +++++++++++
  examples/fips_validation/fips_validation.h      |  233 +++++
  examples/fips_validation/fips_validation_aes.c  |  188 ++++
  examples/fips_validation/fips_validation_ccm.c  |  272 +++++
  examples/fips_validation/fips_validation_cmac.c |  116 +++
  examples/fips_validation/fips_validation_gcm.c  |  125 +++
  examples/fips_validation/fips_validation_hmac.c |  105 ++
  examples/fips_validation/fips_validation_tdes.c |  264 +++++
  examples/fips_validation/main.c                 | 1221 +++++++++++++++++++++++
  examples/fips_validation/meson.build            |   20 +
  15 files changed, 3356 insertions(+)
Quoted 13 lines

create mode 100644 doc/guides/sample_app_ug/fips_validation.rst create mode 100644 examples/fips_validation/Makefile create mode 100644 examples/fips_validation/fips_validation.c create mode 100644 examples/fips_validation/fips_validation.h create mode 100644 examples/fips_validation/fips_validation_aes.c create mode 100644 examples/fips_validation/fips_validation_ccm.c create mode 100644 examples/fips_validation/fips_validation_cmac.c create mode 100644 examples/fips_validation/fips_validation_gcm.c create mode 100644 examples/fips_validation/fips_validation_hmac.c create mode 100644 examples/fips_validation/fips_validation_tdes.c create mode 100644 examples/fips_validation/main.c create mode 100644 examples/fips_validation/meson.build

Series Reviewed-by: Akhil Goyal <[email protected]>

Applied
#51 lore raw
Quoted 74 lines · Akhil Goyal
Quoted 59 lines · Marko

This sample application is made for the purpose so that users of DPDK who wish to get FIPS certification for their platforms, this sample app enables users to parse test vectors that is gotten from NIST and be able to get a generated response file which they can then verify and be sure their system will pass FIPS certification.

Kovacevic, Marko (8):
v7:
- Fixed compilation issue.
v6:
- Added MAINTAINER file into different patch
- Udpated documentation
- Changed app name and file location
- Fixed memory leak in TDES
- Changed patch titles
- Made other changes from comments
v5:
- Changed patch titles
- Added MAINTAINERS File
- Removed bus_pci Dependency
- Updated documentation
- Changed app name
v4:
- Added Limitation
- Changed TDES BLOCK SIZE from 16 -> 8
as DES block size is 64bits (main.c)
v3:
- Fixed a no-testing bug
- Fixed some code style issue

v2:
- Refactor the code.
- Move the code from test to sample applcation

examples/fips_validation: add cryptodev fips compliant application examples/fips_validation: support AES parsing examples/fips_validation: support HMAC parsing examples/fips_validation: support TDES parsing examples/fips_validation: support GCM parsing examples/fips_validation: support CMAC parsing examples/fips_validation: support CCM parsing
doc: add fips validation application guide

   MAINTAINERS                                     |    4 +
   doc/guides/rel_notes/release_18_11.rst          |    5 +
   doc/guides/sample_app_ug/fips_validation.rst    |  132 +++
   doc/guides/sample_app_ug/index.rst              |    1 +
   examples/fips_validation/Makefile               |   75 ++
   examples/fips_validation/fips_validation.c      |  595 +++++++++++
   examples/fips_validation/fips_validation.h      |  233 +++++
   examples/fips_validation/fips_validation_aes.c  |  188 ++++
   examples/fips_validation/fips_validation_ccm.c  |  272 +++++
   examples/fips_validation/fips_validation_cmac.c |  116 +++
   examples/fips_validation/fips_validation_gcm.c  |  125 +++
   examples/fips_validation/fips_validation_hmac.c |  105 ++
   examples/fips_validation/fips_validation_tdes.c |  264 +++++
   examples/fips_validation/main.c                 | 1221 +++++++++++++++++++++++
   examples/fips_validation/meson.build            |   20 +
   15 files changed, 3356 insertions(+)
Quoted 13 lines

create mode 100644 doc/guides/sample_app_ug/fips_validation.rst create mode 100644 examples/fips_validation/Makefile create mode 100644 examples/fips_validation/fips_validation.c create mode 100644 examples/fips_validation/fips_validation.h create mode 100644 examples/fips_validation/fips_validation_aes.c create mode 100644 examples/fips_validation/fips_validation_ccm.c create mode 100644 examples/fips_validation/fips_validation_cmac.c create mode 100644 examples/fips_validation/fips_validation_gcm.c create mode 100644 examples/fips_validation/fips_validation_hmac.c create mode 100644 examples/fips_validation/fips_validation_tdes.c create mode 100644 examples/fips_validation/main.c create mode 100644 examples/fips_validation/meson.build

Quoted 1 line

Series Reviewed-by: Akhil Goyal <[email protected]>

Applied to dpdk-next-crypto

Thanks