FIPS validation capability
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
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
@@ -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
@@ -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
PATCH v4 2/8 examples: add aes parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ voidfips_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
@@ -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
PATCH v4 3/8 examples: add hmac parser
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v4 4/8 examples: add TDES parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v4 5/8 examples: add gcm parser
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v4 6/8 examples: add cmac parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v4 7/8 examples: add ccm parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v4 8/8 doc: add guides for fips validation
In reply to Marko KovacevicDocument 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
@@ -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
@@ -57,6 +57,7 @@ Sample Applications User Guides performance_thread ipsec_secgw bbdev_app + fips_validation **Figures**
Signature · 1 line
2.9.5
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 capabilityThis 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 issuev2:
- Refactor the code.
- Move the code from test to sample applcationexamples: 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 validationdoc/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
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 issuev2:
- Refactor the code.
- Move the code from test to sample applcationexamples: 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 validationdoc/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.rstcreate mode 100644 examples/cryptodev_fips_validate/Makefile
create mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_validate.hcreate mode 100644examples/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
v5 cover FIPS validation capability
In reply to Marko KovacevicThis 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
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
@@ -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
@@ -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
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.
Signed-off-by Marko Kovacevic <[email protected]>Signed-off-by Fan Zhang <[email protected]>Acked-by Arek Kusztal <[email protected]>--- 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 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_validate.hcreate mode 100644examples/cryptodev_fips_validate/main.c
create mode 100644 examples/cryptodev_fips_validate/meson.buildexamples/cryptodev_fips_validate/Makefile new file +0
-0
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 + +endifexamples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +220
-0@@ -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@@ -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@@ -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@@ -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' +)
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.
Signed-off-by Marko Kovacevic <[email protected]>Signed-off-by Fan Zhang <[email protected]>Acked-by Arek Kusztal <[email protected]>--- 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 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_validate.hcreate mode 100644examples/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@@ -0,0 +1,69 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2010-2014 Intel CorporationI 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 + +endifexamples/cryptodev_fips_validate/cryptodev_fips_parse_validate.c new file +224
-0@@ -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_callbackis 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@@ -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@@ -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); gotoerror_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@@ -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' +)
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_callbackis 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.
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_callbackis 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
PATCH v5 2/8 examples/cryptodev_fips_validate: add aes parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ voidfips_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
@@ -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
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@@ -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.
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@@ -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
PATCH v5 3/8 examples/cryptodev_fips_validate: add hmac parser
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v5 4/8 examples/cryptodev_fips_validate: add TDES parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
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.
Signed-off-by Marko Kovacevic <[email protected]>Signed-off-by Fan Zhang <[email protected]>Acked-by Arek Kusztal <[email protected]>--- 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.cexamples/cryptodev_fips_validate/Makefile +1
-0@@ -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.cexamples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +132
-0@@ -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 ; +} +
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.
Signed-off-by Marko Kovacevic <[email protected]>Signed-off-by Fan Zhang <[email protected]>Acked-by Arek Kusztal <[email protected]>--- 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.cexamples/cryptodev_fips_validate/Makefile +1
-0@@ -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.cexamples/cryptodev_fips_validate/cryptodev_fips_parse_3des.c new file +135
-0@@ -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 ; +} +
PATCH v5 5/8 examples/cryptodev_fips_validate: add gcm parser
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v5 6/8 examples/cryptodev_fips_validate: add cmac parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v5 7/8 examples/cryptodev_fips_validate: add ccm parser and enablement for test types
In reply to Marko KovacevicAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v5 8/8 doc/guides/sample_app_ug: add guides for fips validation
In reply to Marko KovacevicDocument 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
@@ -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
@@ -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
@@ -57,6 +57,7 @@ Sample Applications User Guides performance_thread ipsec_secgw bbdev_app + fips_validation **Figures**
Signature · 1 line
2.9.5
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.
Signed-off-by Marko Kovacevic <[email protected]>Signed-off-by Fan Zhang <[email protected]>Acked-by Arek Kusztal <[email protected]>--- 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.rstMAINTAINERS +4
-0@@ -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.rstdoc/guides/rel_notes/release_18_11.rst +6
-0@@ -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 referencingdoc/guides/sample_app_ug/fips_validation.rst new file +90
-0@@ -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-folderdoc/guides/sample_app_ug/index.rst +1
-0@@ -57,6 +57,7 @@ Sample Applications User Guides performance_thread ipsec_secgw bbdev_app + fips_validation **Figures**
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
MAINTAINERSFile
- Removedbus_pciDependency
- 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 applcationexamples/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.rstcreate mode 100644 examples/cryptodev_fips_validate/Makefile
create mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_3des.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_aes.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_ccm.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_cmac.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_gcm.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_hmac.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_parse_validate.ccreate mode 100644examples/cryptodev_fips_validate/cryptodev_fips_validate.hcreate mode 100644examples/cryptodev_fips_validate/main.c
create mode 100644 examples/cryptodev_fips_validate/meson.build
v6 cover FIPS validation capability
In reply to Marko KovacevicFrom: "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
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
@@ -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
@@ -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
PATCH v6 2/8 examples/fips_validation: support AES parsing
In reply to Marko KovacevicFrom: "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
@@ -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
@@ -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
@@ -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 @@ voidfips_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
@@ -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
PATCH v6 3/8 examples/fips_validation: support HMAC parsing
In reply to Marko KovacevicFrom: "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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v6 4/8 examples/fips_validation: support TDES parsing
In reply to Marko KovacevicFrom: "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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
@@ -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
PATCH v6 5/8 examples/fips_validation: support GCM parsing
In reply to Marko KovacevicFrom: "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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v6 6/8 examples/fips_validation: support CMAC parsing
In reply to Marko KovacevicFrom: "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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v6 7/8 examples/fips_validation: support CCM parsing
In reply to Marko KovacevicFrom: "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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v6 8/8 doc: add fips validation application guide
In reply to Marko KovacevicFrom: "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
@@ -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
@@ -57,6 +57,7 @@ Sample Applications User Guides performance_thread ipsec_secgw bbdev_app + fips_validation **Figures**
Signature · 1 line
2.9.5
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
- AddedMAINTAINERSFile
- Removedbus_pciDependency
- 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 issuev2:
- Refactor the code.
- Move the code from test to sample applcationKovacevic, 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 guideMAINTAINERS | 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.rstcreate mode 100644 examples/fips_validation/Makefile create mode 100644examples/fips_validation/fips_validation.ccreate mode 100644examples/fips_validation/fips_validation.hcreate mode 100644examples/fips_validation/fips_validation_aes.ccreate mode 100644examples/fips_validation/fips_validation_ccm.ccreate mode 100644examples/fips_validation/fips_validation_cmac.ccreate mode 100644examples/fips_validation/fips_validation_gcm.ccreate mode 100644examples/fips_validation/fips_validation_hmac.ccreate mode 100644examples/fips_validation/fips_validation_tdes.ccreate mode 100644examples/fips_validation/main.ccreate mode 100644 examples/fips_validation/meson.build
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.
v7 cover FIPS validation capability
In reply to Marko KovacevicThis 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
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
@@ -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
@@ -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
PATCH v7 2/8 examples/fips_validation: support AES parsing
In reply to Kovacevic, MarkoAdded 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
@@ -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
@@ -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
@@ -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 @@ voidfips_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
@@ -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
PATCH v7 3/8 examples/fips_validation: support HMAC parsing
In reply to Kovacevic, MarkoAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v7 4/8 examples/fips_validation: support TDES parsing
In reply to Kovacevic, MarkoAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
@@ -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
PATCH v7 5/8 examples/fips_validation: support GCM parsing
In reply to Kovacevic, MarkoAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v7 6/8 examples/fips_validation: support CMAC parsing
In reply to Kovacevic, MarkoAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v7 7/8 examples/fips_validation: support CCM parsing
In reply to Kovacevic, MarkoAdded 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
@@ -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
@@ -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
@@ -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 @@ intparse_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
@@ -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
PATCH v7 8/8 doc: add fips validation application guide
In reply to Kovacevic, MarkoDocument 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
@@ -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
@@ -57,6 +57,7 @@ Sample Applications User Guides performance_thread ipsec_secgw bbdev_app + fips_validation **Figures**
Signature · 1 line
2.9.5
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
- AddedMAINTAINERSFile
- Removedbus_pciDependency
- 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 issuev2:
- Refactor the code.
- Move the code from test to sample applcationexamples/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 guideMAINTAINERS | 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.rstcreate mode 100644 examples/fips_validation/Makefile create mode 100644examples/fips_validation/fips_validation.ccreate mode 100644examples/fips_validation/fips_validation.hcreate mode 100644examples/fips_validation/fips_validation_aes.ccreate mode 100644examples/fips_validation/fips_validation_ccm.ccreate mode 100644examples/fips_validation/fips_validation_cmac.ccreate mode 100644examples/fips_validation/fips_validation_gcm.ccreate mode 100644examples/fips_validation/fips_validation_hmac.ccreate mode 100644examples/fips_validation/fips_validation_tdes.ccreate mode 100644examples/fips_validation/main.ccreate mode 100644 examples/fips_validation/meson.build
Series Reviewed-by: Akhil Goyal <[email protected]>
Akhil Goyal
AppliedQuoted 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
- AddedMAINTAINERSFile
- Removedbus_pciDependency
- 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 issuev2:
- Refactor the code.
- Move the code from test to sample applcationexamples/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 guideMAINTAINERS | 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.rstcreate mode 100644 examples/fips_validation/Makefile create mode 100644examples/fips_validation/fips_validation.ccreate mode 100644examples/fips_validation/fips_validation.hcreate mode 100644examples/fips_validation/fips_validation_aes.ccreate mode 100644examples/fips_validation/fips_validation_ccm.ccreate mode 100644examples/fips_validation/fips_validation_cmac.ccreate mode 100644examples/fips_validation/fips_validation_gcm.ccreate mode 100644examples/fips_validation/fips_validation_hmac.ccreate mode 100644examples/fips_validation/fips_validation_tdes.ccreate mode 100644examples/fips_validation/main.ccreate mode 100644 examples/fips_validation/meson.build
Quoted 1 line
Series Reviewed-by: Akhil Goyal <[email protected]>
Applied to dpdk-next-crypto
Thanks