xref: /dpdk/examples/fips_validation/fips_validation_cmac.c (revision 8d70a19417ad70accc3e138190875ff8f2baae8c)
1ac026f46SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2ac026f46SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
3ac026f46SMarko Kovacevic  */
4ac026f46SMarko Kovacevic 
5ac026f46SMarko Kovacevic #include <string.h>
6ac026f46SMarko Kovacevic #include <time.h>
7ac026f46SMarko Kovacevic #include <stdio.h>
8ac026f46SMarko Kovacevic #include <rte_string_fns.h>
9ac026f46SMarko Kovacevic 
10ac026f46SMarko Kovacevic #include <rte_cryptodev.h>
11ac026f46SMarko Kovacevic 
12ac026f46SMarko Kovacevic #include "fips_validation.h"
13ac026f46SMarko Kovacevic 
14ac026f46SMarko Kovacevic #define NEW_LINE_STR	"#"
15ac026f46SMarko Kovacevic #define OP_STR		"CMAC"
16ac026f46SMarko Kovacevic 
17ac026f46SMarko Kovacevic #define ALGO_STR	"Alg = "
18ac026f46SMarko Kovacevic #define MODE_STR	"Mode = "
19ac026f46SMarko Kovacevic 
20ac026f46SMarko Kovacevic #define COUNT_STR	"Count = "
21ac026f46SMarko Kovacevic #define KLEN_STR	"Klen = "
22ac026f46SMarko Kovacevic #define PTLEN_STR	"Mlen = "
23ac026f46SMarko Kovacevic #define TAGLEN_STR	"Tlen = "
24ac026f46SMarko Kovacevic #define KEY_STR		"Key = "
25ac026f46SMarko Kovacevic #define PT_STR		"Msg = "
26ac026f46SMarko Kovacevic #define TAG_STR		"Mac = "
27ac026f46SMarko Kovacevic 
28ac026f46SMarko Kovacevic #define GEN_STR		"Generate"
29ac026f46SMarko Kovacevic #define VERIF_STR	"Verify"
30ac026f46SMarko Kovacevic 
31ac026f46SMarko Kovacevic #define POS_NEG_STR	"Result = "
32ac026f46SMarko Kovacevic #define PASS_STR	"P"
33ac026f46SMarko Kovacevic #define FAIL_STR	"F"
34ac026f46SMarko Kovacevic 
35d3b50557SBrandon Lo #define KLEN_JSON_STR		"keyLen"
36d3b50557SBrandon Lo #define PTLEN_JSON_STR		"msgLen"
37d3b50557SBrandon Lo #define TAGLEN_JSON_STR		"macLen"
38d3b50557SBrandon Lo #define KEY_JSON_STR		"key"
39d3b50557SBrandon Lo #define PT_JSON_STR			"message"
40d3b50557SBrandon Lo #define TAG_JSON_STR		"mac"
41d3b50557SBrandon Lo #define DIRECTION_JSON_STR	"direction"
42d3b50557SBrandon Lo #define POS_NEG_JSON_STR	"testPassed"
43d3b50557SBrandon Lo 
44d3b50557SBrandon Lo #define GEN_JSON_STR	"gen"
45d3b50557SBrandon Lo #define VERIF_JSON_STR	"ver"
46d3b50557SBrandon Lo 
47ac026f46SMarko Kovacevic struct hash_algo_conversion {
48ac026f46SMarko Kovacevic 	const char *str;
49ac026f46SMarko Kovacevic 	enum fips_test_algorithms algo;
50ac026f46SMarko Kovacevic } cmac_algo[] = {
51ac026f46SMarko Kovacevic 		{"AES", FIPS_TEST_ALGO_AES_CMAC},
52ac026f46SMarko Kovacevic };
53ac026f46SMarko Kovacevic 
54*8d70a194SDavid Marchand #ifdef USE_JANSSON
55d3b50557SBrandon Lo static int
parser_read_cmac_direction_str(__rte_unused const char * key,char * src,__rte_unused struct fips_val * val)56d3b50557SBrandon Lo parser_read_cmac_direction_str(__rte_unused const char *key, char *src,
57d3b50557SBrandon Lo 		__rte_unused struct fips_val *val)
58d3b50557SBrandon Lo {
59d3b50557SBrandon Lo 	if (strcmp(src, "gen") == 0)
60d3b50557SBrandon Lo 		info.op = FIPS_TEST_ENC_AUTH_GEN;
61d3b50557SBrandon Lo 	else if (strcmp(src, "ver") == 0)
62d3b50557SBrandon Lo 		info.op = FIPS_TEST_DEC_AUTH_VERIF;
63d3b50557SBrandon Lo 
64d3b50557SBrandon Lo 	return 0;
65d3b50557SBrandon Lo }
66d3b50557SBrandon Lo 
67d3b50557SBrandon Lo struct fips_test_callback cmac_tests_interim_json_vectors[] = {
68d3b50557SBrandon Lo 		{KLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.key},
69d3b50557SBrandon Lo 		{PTLEN_JSON_STR, parser_read_uint32_bit_val, &vec.pt},
70d3b50557SBrandon Lo 		{TAGLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.digest},
71d3b50557SBrandon Lo 		{DIRECTION_JSON_STR, parser_read_cmac_direction_str, NULL},
72d3b50557SBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
73d3b50557SBrandon Lo };
74d3b50557SBrandon Lo 
75d3b50557SBrandon Lo struct fips_test_callback cmac_tests_json_vectors[] = {
76d3b50557SBrandon Lo 		{KEY_JSON_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
77d3b50557SBrandon Lo 		{PT_JSON_STR, parse_uint8_known_len_hex_str, &vec.pt},
78d3b50557SBrandon Lo 		{TAG_JSON_STR, parse_uint8_known_len_hex_str,
79d3b50557SBrandon Lo 				&vec.cipher_auth.digest},
80d3b50557SBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
81d3b50557SBrandon Lo };
82d3b50557SBrandon Lo 
83d3b50557SBrandon Lo static int
parse_test_cmac_json_writeback(struct fips_val * val)84d3b50557SBrandon Lo parse_test_cmac_json_writeback(struct fips_val *val)
85d3b50557SBrandon Lo {
86d3b50557SBrandon Lo 	json_info.json_write_case = json_object();
87d3b50557SBrandon Lo 	json_object_set(json_info.json_write_case, "tcId",
88d3b50557SBrandon Lo 		json_object_get(json_info.json_test_case, "tcId"));
89d3b50557SBrandon Lo 
90d3b50557SBrandon Lo 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
91d3b50557SBrandon Lo 		struct fips_val tmp_val = {val->val + vec.pt.len,
92d3b50557SBrandon Lo 				vec.cipher_auth.digest.len};
93d3b50557SBrandon Lo 
94d3b50557SBrandon Lo 		writeback_hex_str("", info.one_line_text, &tmp_val);
95d3b50557SBrandon Lo 		json_object_set_new(json_info.json_write_case, TAG_JSON_STR,
96d3b50557SBrandon Lo 			json_string(info.one_line_text));
97d3b50557SBrandon Lo 	} else {
98d3b50557SBrandon Lo 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS)
99d3b50557SBrandon Lo 			json_object_set_new(json_info.json_write_case, POS_NEG_JSON_STR,
100d3b50557SBrandon Lo 				json_boolean(true));
101d3b50557SBrandon Lo 		else if (vec.status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED)
102d3b50557SBrandon Lo 			json_object_set_new(json_info.json_write_case, POS_NEG_JSON_STR,
103d3b50557SBrandon Lo 				json_boolean(false));
104d3b50557SBrandon Lo 	}
105d3b50557SBrandon Lo 
106d3b50557SBrandon Lo 	return 0;
107d3b50557SBrandon Lo }
108d3b50557SBrandon Lo 
109d3b50557SBrandon Lo int
parse_test_cmac_json_init(void)110d3b50557SBrandon Lo parse_test_cmac_json_init(void)
111d3b50557SBrandon Lo {
112d3b50557SBrandon Lo 	info.algo = FIPS_TEST_ALGO_AES_CMAC;
113d3b50557SBrandon Lo 
114d3b50557SBrandon Lo 	info.parse_writeback = parse_test_cmac_json_writeback;
115d3b50557SBrandon Lo 	info.callbacks = cmac_tests_json_vectors;
116d3b50557SBrandon Lo 	info.interim_callbacks = cmac_tests_interim_json_vectors;
117d3b50557SBrandon Lo 
118d3b50557SBrandon Lo 	return 0;
119d3b50557SBrandon Lo }
120*8d70a194SDavid Marchand #endif /* USE_JANSSON */
121d3b50557SBrandon Lo 
122ac026f46SMarko Kovacevic static int
parse_test_cmac_writeback(struct fips_val * val)123ac026f46SMarko Kovacevic parse_test_cmac_writeback(struct fips_val *val)
124ac026f46SMarko Kovacevic {
125ac026f46SMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
126ac026f46SMarko Kovacevic 		struct fips_val tmp_val = {val->val + vec.pt.len,
127ac026f46SMarko Kovacevic 				vec.cipher_auth.digest.len};
128ac026f46SMarko Kovacevic 
129ac026f46SMarko Kovacevic 		fprintf(info.fp_wr, "%s", TAG_STR);
130ac026f46SMarko Kovacevic 		parse_write_hex_str(&tmp_val);
131ac026f46SMarko Kovacevic 	} else {
132ac026f46SMarko Kovacevic 		fprintf(info.fp_wr, "%s", POS_NEG_STR);
133ac026f46SMarko Kovacevic 
134ac026f46SMarko Kovacevic 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS)
135ac026f46SMarko Kovacevic 			fprintf(info.fp_wr, "%s\n", PASS_STR);
136ac026f46SMarko Kovacevic 		else if (vec.status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED)
137ac026f46SMarko Kovacevic 			fprintf(info.fp_wr, "%s\n", FAIL_STR);
138ac026f46SMarko Kovacevic 		else
139ac026f46SMarko Kovacevic 			fprintf(info.fp_wr, "Error\n");
140ac026f46SMarko Kovacevic 	}
141ac026f46SMarko Kovacevic 
142ac026f46SMarko Kovacevic 	return 0;
143ac026f46SMarko Kovacevic }
144ac026f46SMarko Kovacevic 
145ac026f46SMarko Kovacevic struct fips_test_callback cmac_tests_vectors[] = {
146ac026f46SMarko Kovacevic 		{KLEN_STR, parser_read_uint32_val, &vec.cipher_auth.key},
147ac026f46SMarko Kovacevic 		{PTLEN_STR, parser_read_uint32_val, &vec.pt},
148ac026f46SMarko Kovacevic 		{TAGLEN_STR, parser_read_uint32_val, &vec.cipher_auth.digest},
149ac026f46SMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
150ac026f46SMarko Kovacevic 		{PT_STR, parse_uint8_known_len_hex_str, &vec.pt},
151ac026f46SMarko Kovacevic 		{TAG_STR, parse_uint8_known_len_hex_str,
152ac026f46SMarko Kovacevic 				&vec.cipher_auth.digest},
153ac026f46SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
154ac026f46SMarko Kovacevic };
155ac026f46SMarko Kovacevic 
156ac026f46SMarko Kovacevic int
parse_test_cmac_init(void)157ac026f46SMarko Kovacevic parse_test_cmac_init(void)
158ac026f46SMarko Kovacevic {
159ac026f46SMarko Kovacevic 	char *tmp;
160ac026f46SMarko Kovacevic 	uint32_t i, j;
161ac026f46SMarko Kovacevic 
162ac026f46SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++) {
163ac026f46SMarko Kovacevic 		char *line = info.vec[i];
164ac026f46SMarko Kovacevic 
165ac026f46SMarko Kovacevic 		tmp = strstr(line, ALGO_STR);
166ac026f46SMarko Kovacevic 		if (!tmp)
167ac026f46SMarko Kovacevic 			continue;
168ac026f46SMarko Kovacevic 
169ac026f46SMarko Kovacevic 		for (j = 0; j < RTE_DIM(cmac_algo); j++) {
170ac026f46SMarko Kovacevic 			if (!strstr(line, cmac_algo[j].str))
171ac026f46SMarko Kovacevic 				continue;
172ac026f46SMarko Kovacevic 
173ac026f46SMarko Kovacevic 			info.algo = cmac_algo[j].algo;
174ac026f46SMarko Kovacevic 			break;
175ac026f46SMarko Kovacevic 		}
176ac026f46SMarko Kovacevic 
177ac026f46SMarko Kovacevic 		if (j == RTE_DIM(cmac_algo))
178ac026f46SMarko Kovacevic 			return -EINVAL;
179ac026f46SMarko Kovacevic 
180ac026f46SMarko Kovacevic 		tmp = strstr(line, MODE_STR);
181ac026f46SMarko Kovacevic 		if (!tmp)
182ac026f46SMarko Kovacevic 			return -1;
183ac026f46SMarko Kovacevic 
184ac026f46SMarko Kovacevic 		if (strstr(tmp, GEN_STR))
185ac026f46SMarko Kovacevic 			info.op = FIPS_TEST_ENC_AUTH_GEN;
186ac026f46SMarko Kovacevic 		else if (strstr(tmp, VERIF_STR))
187ac026f46SMarko Kovacevic 			info.op = FIPS_TEST_DEC_AUTH_VERIF;
188ac026f46SMarko Kovacevic 		else
189ac026f46SMarko Kovacevic 			return -EINVAL;
190ac026f46SMarko Kovacevic 	}
191ac026f46SMarko Kovacevic 
192ac026f46SMarko Kovacevic 	info.parse_writeback = parse_test_cmac_writeback;
193ac026f46SMarko Kovacevic 	info.callbacks = cmac_tests_vectors;
194ac026f46SMarko Kovacevic 
195ac026f46SMarko Kovacevic 	return 0;
196ac026f46SMarko Kovacevic }
197