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