xref: /dpdk/examples/fips_validation/fips_validation_ccm.c (revision 305921f4508d6a4c399ff99036e379e810455b9b)
1*305921f4SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2*305921f4SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
3*305921f4SMarko Kovacevic  */
4*305921f4SMarko Kovacevic 
5*305921f4SMarko Kovacevic #include <stdio.h>
6*305921f4SMarko Kovacevic #include <string.h>
7*305921f4SMarko Kovacevic 
8*305921f4SMarko Kovacevic #include <rte_string_fns.h>
9*305921f4SMarko Kovacevic #include <rte_cryptodev.h>
10*305921f4SMarko Kovacevic #include <rte_malloc.h>
11*305921f4SMarko Kovacevic 
12*305921f4SMarko Kovacevic #include "fips_validation.h"
13*305921f4SMarko Kovacevic 
14*305921f4SMarko Kovacevic #define DVPT_STR	"CCM-DVPT"
15*305921f4SMarko Kovacevic #define VADT_STR	"CCM-VADT"
16*305921f4SMarko Kovacevic #define VPT_STR		"CCM-VPT"
17*305921f4SMarko Kovacevic #define VNT_STR		"CCM-VNT"
18*305921f4SMarko Kovacevic #define VTT_STR		"CCM-VTT"
19*305921f4SMarko Kovacevic 
20*305921f4SMarko Kovacevic #define PARAM_PREFIX	"["
21*305921f4SMarko Kovacevic #define ALEN_PREFIX	"Alen = "
22*305921f4SMarko Kovacevic #define PLEN_PREFIX	"Plen = "
23*305921f4SMarko Kovacevic #define IVLEN_PREFIX	"Nlen = "
24*305921f4SMarko Kovacevic #define DIGESTL_PREFIX	"Tlen = "
25*305921f4SMarko Kovacevic 
26*305921f4SMarko Kovacevic #define COUNT_STR	"Count = "
27*305921f4SMarko Kovacevic #define KEY_STR		"Key = "
28*305921f4SMarko Kovacevic #define IV_STR		"Nonce = "
29*305921f4SMarko Kovacevic #define PT_STR		"Payload = "
30*305921f4SMarko Kovacevic #define CT_STR		"CT = "
31*305921f4SMarko Kovacevic #define AAD_STR		"Adata = "
32*305921f4SMarko Kovacevic #define POS_NEG_STR	"Result = "
33*305921f4SMarko Kovacevic 
34*305921f4SMarko Kovacevic #define POS_KEYWORD	"Pass"
35*305921f4SMarko Kovacevic #define NEG_KEYWORD	"Fail"
36*305921f4SMarko Kovacevic 
37*305921f4SMarko Kovacevic static int
38*305921f4SMarko Kovacevic parser_dvpt_interim(const char *key, char *src, struct fips_val *val)
39*305921f4SMarko Kovacevic {
40*305921f4SMarko Kovacevic 	char *tmp, c, value[10];
41*305921f4SMarko Kovacevic 	char num_pattern[] = "0123456789";
42*305921f4SMarko Kovacevic 	int i = 0;
43*305921f4SMarko Kovacevic 
44*305921f4SMarko Kovacevic 	memset(value, 0, 10);
45*305921f4SMarko Kovacevic 
46*305921f4SMarko Kovacevic 	tmp = strstr(src, key);
47*305921f4SMarko Kovacevic 	if (!tmp)
48*305921f4SMarko Kovacevic 		return -1;
49*305921f4SMarko Kovacevic 
50*305921f4SMarko Kovacevic 	tmp += strlen(key);
51*305921f4SMarko Kovacevic 
52*305921f4SMarko Kovacevic 	c = tmp[0];
53*305921f4SMarko Kovacevic 
54*305921f4SMarko Kovacevic 	while (strchr(num_pattern, c) && i < 10) {
55*305921f4SMarko Kovacevic 		value[i++] = c;
56*305921f4SMarko Kovacevic 		c = tmp[i];
57*305921f4SMarko Kovacevic 	}
58*305921f4SMarko Kovacevic 
59*305921f4SMarko Kovacevic 	return parser_read_uint32_val("", value, val);
60*305921f4SMarko Kovacevic }
61*305921f4SMarko Kovacevic 
62*305921f4SMarko Kovacevic static int
63*305921f4SMarko Kovacevic parse_dvpt_ct_hex_str(const char *key, char *src, struct fips_val *val)
64*305921f4SMarko Kovacevic {
65*305921f4SMarko Kovacevic 	int ret;
66*305921f4SMarko Kovacevic 
67*305921f4SMarko Kovacevic 	val->len = vec.pt.len;
68*305921f4SMarko Kovacevic 
69*305921f4SMarko Kovacevic 	ret = parse_uint8_known_len_hex_str(key, src, val);
70*305921f4SMarko Kovacevic 	if (ret < 0)
71*305921f4SMarko Kovacevic 		return ret;
72*305921f4SMarko Kovacevic 
73*305921f4SMarko Kovacevic 	src += strlen(key) + val->len * 2;
74*305921f4SMarko Kovacevic 
75*305921f4SMarko Kovacevic 	ret = parse_uint8_known_len_hex_str("", src, &vec.aead.digest);
76*305921f4SMarko Kovacevic 	if (ret < 0) {
77*305921f4SMarko Kovacevic 		rte_free(val->val);
78*305921f4SMarko Kovacevic 		memset(val, 0, sizeof(*val));
79*305921f4SMarko Kovacevic 		return ret;
80*305921f4SMarko Kovacevic 	}
81*305921f4SMarko Kovacevic 
82*305921f4SMarko Kovacevic 	return 0;
83*305921f4SMarko Kovacevic }
84*305921f4SMarko Kovacevic 
85*305921f4SMarko Kovacevic static int
86*305921f4SMarko Kovacevic parse_uint8_ccm_aad_str(const char *key, char *src, struct fips_val *val)
87*305921f4SMarko Kovacevic {
88*305921f4SMarko Kovacevic 	uint32_t len = val->len, j;
89*305921f4SMarko Kovacevic 
90*305921f4SMarko Kovacevic 	src += strlen(key);
91*305921f4SMarko Kovacevic 
92*305921f4SMarko Kovacevic 	/* CCM aad requires 18 bytes padding before the real content */
93*305921f4SMarko Kovacevic 	val->val = rte_zmalloc(NULL, len + 18, 0);
94*305921f4SMarko Kovacevic 	if (!val->val)
95*305921f4SMarko Kovacevic 		return -1;
96*305921f4SMarko Kovacevic 
97*305921f4SMarko Kovacevic 	for (j = 0; j < len; j++) {
98*305921f4SMarko Kovacevic 		char byte[3] = {src[j * 2], src[j * 2 + 1], '\0'};
99*305921f4SMarko Kovacevic 
100*305921f4SMarko Kovacevic 		if (parser_read_uint8_hex(&val->val[j + 18], byte) < 0) {
101*305921f4SMarko Kovacevic 			rte_free(val->val);
102*305921f4SMarko Kovacevic 			memset(val, 0, sizeof(*val));
103*305921f4SMarko Kovacevic 			return -EINVAL;
104*305921f4SMarko Kovacevic 		}
105*305921f4SMarko Kovacevic 	}
106*305921f4SMarko Kovacevic 
107*305921f4SMarko Kovacevic 	return 0;
108*305921f4SMarko Kovacevic }
109*305921f4SMarko Kovacevic 
110*305921f4SMarko Kovacevic struct fips_test_callback ccm_vnt_vec[] = {
111*305921f4SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
112*305921f4SMarko Kovacevic 		{AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad},
113*305921f4SMarko Kovacevic 		{PT_STR, parse_uint8_known_len_hex_str, &vec.pt},
114*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
115*305921f4SMarko Kovacevic };
116*305921f4SMarko Kovacevic 
117*305921f4SMarko Kovacevic struct fips_test_callback ccm_vnt_interim_vec[] = {
118*305921f4SMarko Kovacevic 		{ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad},
119*305921f4SMarko Kovacevic 		{PLEN_PREFIX, parser_read_uint32_val, &vec.pt},
120*305921f4SMarko Kovacevic 		{DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest},
121*305921f4SMarko Kovacevic 		{IVLEN_PREFIX, parser_read_uint32_val, &vec.iv},
122*305921f4SMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.aead.key},
123*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
124*305921f4SMarko Kovacevic };
125*305921f4SMarko Kovacevic 
126*305921f4SMarko Kovacevic struct fips_test_callback ccm_vtt_vec[] = {
127*305921f4SMarko Kovacevic 		{AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad},
128*305921f4SMarko Kovacevic 		{PT_STR, parse_uint8_known_len_hex_str, &vec.pt},
129*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
130*305921f4SMarko Kovacevic };
131*305921f4SMarko Kovacevic 
132*305921f4SMarko Kovacevic struct fips_test_callback ccm_vtt_interim_vec[] = {
133*305921f4SMarko Kovacevic 		{ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad},
134*305921f4SMarko Kovacevic 		{PLEN_PREFIX, parser_read_uint32_val, &vec.pt},
135*305921f4SMarko Kovacevic 		{IVLEN_PREFIX, parser_read_uint32_val, &vec.iv},
136*305921f4SMarko Kovacevic 		{DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest},
137*305921f4SMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.aead.key},
138*305921f4SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
139*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
140*305921f4SMarko Kovacevic };
141*305921f4SMarko Kovacevic 
142*305921f4SMarko Kovacevic struct fips_test_callback ccm_vadt_vec[] = {
143*305921f4SMarko Kovacevic 		{AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad},
144*305921f4SMarko Kovacevic 		{PT_STR, parse_uint8_known_len_hex_str, &vec.pt},
145*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
146*305921f4SMarko Kovacevic };
147*305921f4SMarko Kovacevic 
148*305921f4SMarko Kovacevic struct fips_test_callback ccm_vadt_interim_vec[] = {
149*305921f4SMarko Kovacevic 		{PLEN_PREFIX, parser_read_uint32_val, &vec.pt},
150*305921f4SMarko Kovacevic 		{IVLEN_PREFIX, parser_read_uint32_val, &vec.iv},
151*305921f4SMarko Kovacevic 		{ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad},
152*305921f4SMarko Kovacevic 		{DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest},
153*305921f4SMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.aead.key},
154*305921f4SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
155*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
156*305921f4SMarko Kovacevic };
157*305921f4SMarko Kovacevic 
158*305921f4SMarko Kovacevic struct fips_test_callback ccm_vpt_vec[] = {
159*305921f4SMarko Kovacevic 		{AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad},
160*305921f4SMarko Kovacevic 		{PT_STR, parse_uint8_known_len_hex_str, &vec.pt},
161*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
162*305921f4SMarko Kovacevic };
163*305921f4SMarko Kovacevic 
164*305921f4SMarko Kovacevic struct fips_test_callback ccm_vpt_interim_vec[] = {
165*305921f4SMarko Kovacevic 		{ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad},
166*305921f4SMarko Kovacevic 		{IVLEN_PREFIX, parser_read_uint32_val, &vec.iv},
167*305921f4SMarko Kovacevic 		{DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest},
168*305921f4SMarko Kovacevic 		{PLEN_PREFIX, parser_read_uint32_val, &vec.pt},
169*305921f4SMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.aead.key},
170*305921f4SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
171*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
172*305921f4SMarko Kovacevic };
173*305921f4SMarko Kovacevic 
174*305921f4SMarko Kovacevic struct fips_test_callback ccm_dvpt_vec[] = {
175*305921f4SMarko Kovacevic 		{IV_STR, parse_uint8_known_len_hex_str, &vec.iv},
176*305921f4SMarko Kovacevic 		{AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad},
177*305921f4SMarko Kovacevic 		{CT_STR, parse_dvpt_ct_hex_str, &vec.ct},
178*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
179*305921f4SMarko Kovacevic };
180*305921f4SMarko Kovacevic 
181*305921f4SMarko Kovacevic struct fips_test_callback ccm_dvpt_interim_vec[] = {
182*305921f4SMarko Kovacevic 		{ALEN_PREFIX, parser_dvpt_interim, &vec.aead.aad},
183*305921f4SMarko Kovacevic 		{PLEN_PREFIX, parser_dvpt_interim, &vec.pt},
184*305921f4SMarko Kovacevic 		{IVLEN_PREFIX, parser_dvpt_interim, &vec.iv},
185*305921f4SMarko Kovacevic 		{DIGESTL_PREFIX, parser_dvpt_interim, &vec.aead.digest},
186*305921f4SMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.aead.key},
187*305921f4SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
188*305921f4SMarko Kovacevic };
189*305921f4SMarko Kovacevic 
190*305921f4SMarko Kovacevic struct ccm_test_types {
191*305921f4SMarko Kovacevic 	const char *str;
192*305921f4SMarko Kovacevic 	uint32_t type;
193*305921f4SMarko Kovacevic 	const struct fips_test_callback *cb;
194*305921f4SMarko Kovacevic 	const struct fips_test_callback *cb_interim;
195*305921f4SMarko Kovacevic 	enum fips_test_op op;
196*305921f4SMarko Kovacevic } ctt[] = {
197*305921f4SMarko Kovacevic 		{DVPT_STR, CCM_DVPT, ccm_dvpt_vec, ccm_dvpt_interim_vec,
198*305921f4SMarko Kovacevic 			FIPS_TEST_DEC_AUTH_VERIF},
199*305921f4SMarko Kovacevic 		{VPT_STR, CCM_VPT, ccm_vpt_vec, ccm_vpt_interim_vec,
200*305921f4SMarko Kovacevic 			FIPS_TEST_ENC_AUTH_GEN},
201*305921f4SMarko Kovacevic 		{VADT_STR, CCM_VADT, ccm_vadt_vec, ccm_vadt_interim_vec,
202*305921f4SMarko Kovacevic 			FIPS_TEST_ENC_AUTH_GEN},
203*305921f4SMarko Kovacevic 		{VNT_STR, CCM_VNT, ccm_vnt_vec, ccm_vnt_interim_vec,
204*305921f4SMarko Kovacevic 			FIPS_TEST_ENC_AUTH_GEN},
205*305921f4SMarko Kovacevic 		{VTT_STR, CCM_VTT, ccm_vtt_vec, ccm_vtt_interim_vec,
206*305921f4SMarko Kovacevic 			FIPS_TEST_ENC_AUTH_GEN},
207*305921f4SMarko Kovacevic };
208*305921f4SMarko Kovacevic 
209*305921f4SMarko Kovacevic static int
210*305921f4SMarko Kovacevic parse_test_ccm_writeback(struct fips_val *val)
211*305921f4SMarko Kovacevic {
212*305921f4SMarko Kovacevic 	struct fips_val tmp_val;
213*305921f4SMarko Kovacevic 
214*305921f4SMarko Kovacevic 	switch (info.interim_info.ccm_data.test_type) {
215*305921f4SMarko Kovacevic 	case CCM_DVPT:
216*305921f4SMarko Kovacevic 		fprintf(info.fp_wr, "%s", POS_NEG_STR);
217*305921f4SMarko Kovacevic 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
218*305921f4SMarko Kovacevic 			fprintf(info.fp_wr, "%s\n", POS_KEYWORD);
219*305921f4SMarko Kovacevic 			fprintf(info.fp_wr, "%s", PT_STR);
220*305921f4SMarko Kovacevic 
221*305921f4SMarko Kovacevic 			tmp_val.val = val->val;
222*305921f4SMarko Kovacevic 			tmp_val.len = vec.pt.len;
223*305921f4SMarko Kovacevic 
224*305921f4SMarko Kovacevic 			if (tmp_val.len == 0)
225*305921f4SMarko Kovacevic 				fprintf(info.fp_wr, "00\n");
226*305921f4SMarko Kovacevic 			else
227*305921f4SMarko Kovacevic 				parse_write_hex_str(&tmp_val);
228*305921f4SMarko Kovacevic 		} else
229*305921f4SMarko Kovacevic 			fprintf(info.fp_wr, "%s\n", NEG_KEYWORD);
230*305921f4SMarko Kovacevic 
231*305921f4SMarko Kovacevic 		break;
232*305921f4SMarko Kovacevic 
233*305921f4SMarko Kovacevic 	case CCM_VADT:
234*305921f4SMarko Kovacevic 	case CCM_VNT:
235*305921f4SMarko Kovacevic 	case CCM_VPT:
236*305921f4SMarko Kovacevic 	case CCM_VTT:
237*305921f4SMarko Kovacevic 		fprintf(info.fp_wr, "%s", CT_STR);
238*305921f4SMarko Kovacevic 
239*305921f4SMarko Kovacevic 		parse_write_hex_str(val);
240*305921f4SMarko Kovacevic 
241*305921f4SMarko Kovacevic 		break;
242*305921f4SMarko Kovacevic 
243*305921f4SMarko Kovacevic 	}
244*305921f4SMarko Kovacevic 
245*305921f4SMarko Kovacevic 	return 0;
246*305921f4SMarko Kovacevic }
247*305921f4SMarko Kovacevic 
248*305921f4SMarko Kovacevic int
249*305921f4SMarko Kovacevic parse_test_ccm_init(void)
250*305921f4SMarko Kovacevic {
251*305921f4SMarko Kovacevic 
252*305921f4SMarko Kovacevic 	uint32_t i;
253*305921f4SMarko Kovacevic 
254*305921f4SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++) {
255*305921f4SMarko Kovacevic 		char *line = info.vec[i];
256*305921f4SMarko Kovacevic 		uint32_t j;
257*305921f4SMarko Kovacevic 
258*305921f4SMarko Kovacevic 		for (j = 0; j < RTE_DIM(ctt); j++)
259*305921f4SMarko Kovacevic 			if (strstr(line, ctt[j].str)) {
260*305921f4SMarko Kovacevic 				info.interim_info.ccm_data.test_type =
261*305921f4SMarko Kovacevic 						ctt[j].type;
262*305921f4SMarko Kovacevic 				info.callbacks = ctt[j].cb;
263*305921f4SMarko Kovacevic 				info.interim_callbacks = ctt[j].cb_interim;
264*305921f4SMarko Kovacevic 				info.op = ctt[j].op;
265*305921f4SMarko Kovacevic 				break;
266*305921f4SMarko Kovacevic 		}
267*305921f4SMarko Kovacevic 	}
268*305921f4SMarko Kovacevic 
269*305921f4SMarko Kovacevic 	info.parse_writeback = parse_test_ccm_writeback;
270*305921f4SMarko Kovacevic 
271*305921f4SMarko Kovacevic 	return 0;
272*305921f4SMarko Kovacevic }
273