xref: /dpdk/examples/fips_validation/fips_validation_tdes.c (revision 527cbf3d5ee380f49db828957de4ba75f71e4311)
1*527cbf3dSMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2*527cbf3dSMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
3*527cbf3dSMarko Kovacevic  */
4*527cbf3dSMarko Kovacevic 
5*527cbf3dSMarko Kovacevic #include <string.h>
6*527cbf3dSMarko Kovacevic #include <stdio.h>
7*527cbf3dSMarko Kovacevic 
8*527cbf3dSMarko Kovacevic #include <rte_malloc.h>
9*527cbf3dSMarko Kovacevic #include <rte_cryptodev.h>
10*527cbf3dSMarko Kovacevic 
11*527cbf3dSMarko Kovacevic #include "fips_validation.h"
12*527cbf3dSMarko Kovacevic 
13*527cbf3dSMarko Kovacevic #define NEW_LINE_STR	"#"
14*527cbf3dSMarko Kovacevic #define TEST_TYPE_KEY	" for CBC"
15*527cbf3dSMarko Kovacevic #define TEST_CBCI_KEY	" for CBCI"
16*527cbf3dSMarko Kovacevic 
17*527cbf3dSMarko Kovacevic #define ENC_STR		"[ENCRYPT]"
18*527cbf3dSMarko Kovacevic #define DEC_STR		"[DECRYPT]"
19*527cbf3dSMarko Kovacevic 
20*527cbf3dSMarko Kovacevic #define COUNT_STR	"COUNT = "
21*527cbf3dSMarko Kovacevic #define KEY1_STR	"KEY1 = "
22*527cbf3dSMarko Kovacevic #define KEY2_STR	"KEY2 = "
23*527cbf3dSMarko Kovacevic #define KEY3_STR	"KEY3 = "
24*527cbf3dSMarko Kovacevic 
25*527cbf3dSMarko Kovacevic #define KEYS_STR	"KEYs = "
26*527cbf3dSMarko Kovacevic #define IV_STR		"IV = "
27*527cbf3dSMarko Kovacevic #define PT_STR		"PLAINTEXT = "
28*527cbf3dSMarko Kovacevic #define CT_STR		"CIPHERTEXT = "
29*527cbf3dSMarko Kovacevic #define NK_STR		"NumKeys = "
30*527cbf3dSMarko Kovacevic 
31*527cbf3dSMarko Kovacevic #define SET_STR		" = "
32*527cbf3dSMarko Kovacevic 
33*527cbf3dSMarko Kovacevic #define PLAIN_TEXT	0
34*527cbf3dSMarko Kovacevic #define CIPHER_TEXT	1
35*527cbf3dSMarko Kovacevic #define KEY_TEXT	2
36*527cbf3dSMarko Kovacevic #define IV_TEXT		3
37*527cbf3dSMarko Kovacevic 
38*527cbf3dSMarko Kovacevic #define DEVICE_STR	"# Config Info for : "
39*527cbf3dSMarko Kovacevic 
40*527cbf3dSMarko Kovacevic struct {
41*527cbf3dSMarko Kovacevic 	uint32_t type;
42*527cbf3dSMarko Kovacevic 	const char *desc;
43*527cbf3dSMarko Kovacevic } test_types[] = {
44*527cbf3dSMarko Kovacevic 		{TDES_INVERSE_PERMUTATION, "INVERSE PERMUTATION"},
45*527cbf3dSMarko Kovacevic 		{TDES_PERMUTATION, "PERMUTATION OPERATION"},
46*527cbf3dSMarko Kovacevic 		{TDES_SUBSTITUTION_TABLE, "SUBSTITUTION TABLE"},
47*527cbf3dSMarko Kovacevic 		{TDES_VARIABLE_KEY, "VARIABLE KEY"},
48*527cbf3dSMarko Kovacevic 		{TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"},
49*527cbf3dSMarko Kovacevic 		{TDES_VARIABLE_TEXT, "KAT"},
50*527cbf3dSMarko Kovacevic 		{TDES_MCT, "Monte Carlo (Modes) Test"},
51*527cbf3dSMarko Kovacevic 		{TDES_MMT, "Multi block Message Test"},
52*527cbf3dSMarko Kovacevic };
53*527cbf3dSMarko Kovacevic 
54*527cbf3dSMarko Kovacevic static int
55*527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val);
56*527cbf3dSMarko Kovacevic 
57*527cbf3dSMarko Kovacevic static int
58*527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val);
59*527cbf3dSMarko Kovacevic 
60*527cbf3dSMarko Kovacevic static int
61*527cbf3dSMarko Kovacevic parse_tdes_interim(const char *key,
62*527cbf3dSMarko Kovacevic 		__attribute__((__unused__)) char *text,
63*527cbf3dSMarko Kovacevic 		struct fips_val *val);
64*527cbf3dSMarko Kovacevic 
65*527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_vectors[] = {
66*527cbf3dSMarko Kovacevic 		{KEYS_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
67*527cbf3dSMarko Kovacevic 		{KEY1_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
68*527cbf3dSMarko Kovacevic 		{KEY2_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
69*527cbf3dSMarko Kovacevic 		{KEY3_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
70*527cbf3dSMarko Kovacevic 		{IV_STR, parse_uint8_hex_str, &vec.iv},
71*527cbf3dSMarko Kovacevic 		{PT_STR, parse_uint8_hex_str, &vec.pt},
72*527cbf3dSMarko Kovacevic 		{CT_STR, parse_uint8_hex_str, &vec.ct},
73*527cbf3dSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
74*527cbf3dSMarko Kovacevic };
75*527cbf3dSMarko Kovacevic 
76*527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_interim_vectors[] = {
77*527cbf3dSMarko Kovacevic 		{ENC_STR, parse_tdes_interim, NULL},
78*527cbf3dSMarko Kovacevic 		{DEC_STR, parse_tdes_interim, NULL},
79*527cbf3dSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
80*527cbf3dSMarko Kovacevic };
81*527cbf3dSMarko Kovacevic 
82*527cbf3dSMarko Kovacevic struct fips_test_callback tdes_writeback_callbacks[] = {
83*527cbf3dSMarko Kovacevic 		/** First element is used to pass COUNT string */
84*527cbf3dSMarko Kovacevic 		{COUNT_STR, NULL, NULL},
85*527cbf3dSMarko Kovacevic 		{IV_STR, writeback_hex_str, &vec.iv},
86*527cbf3dSMarko Kovacevic 		{KEY1_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
87*527cbf3dSMarko Kovacevic 		{KEY2_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
88*527cbf3dSMarko Kovacevic 		{KEY3_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
89*527cbf3dSMarko Kovacevic 		{KEYS_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
90*527cbf3dSMarko Kovacevic 		{PT_STR, writeback_hex_str, &vec.pt},
91*527cbf3dSMarko Kovacevic 		{CT_STR, writeback_hex_str, &vec.ct},
92*527cbf3dSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
93*527cbf3dSMarko Kovacevic };
94*527cbf3dSMarko Kovacevic 
95*527cbf3dSMarko Kovacevic static int
96*527cbf3dSMarko Kovacevic parse_tdes_interim(const char *key,
97*527cbf3dSMarko Kovacevic 		__attribute__((__unused__)) char *text,
98*527cbf3dSMarko Kovacevic 		__attribute__((__unused__)) struct fips_val *val)
99*527cbf3dSMarko Kovacevic {
100*527cbf3dSMarko Kovacevic 	if (strstr(key, ENC_STR))
101*527cbf3dSMarko Kovacevic 		info.op = FIPS_TEST_ENC_AUTH_GEN;
102*527cbf3dSMarko Kovacevic 	else if (strstr(key, DEC_STR))
103*527cbf3dSMarko Kovacevic 		info.op = FIPS_TEST_DEC_AUTH_VERIF;
104*527cbf3dSMarko Kovacevic 	else if (strstr(NK_STR, "NumKeys = 1"))
105*527cbf3dSMarko Kovacevic 		info.interim_info.tdes_data.nb_keys = 1;
106*527cbf3dSMarko Kovacevic 	else if (strstr(NK_STR, "NumKeys = 2"))
107*527cbf3dSMarko Kovacevic 		info.interim_info.tdes_data.nb_keys = 2;
108*527cbf3dSMarko Kovacevic 	else if (strstr(NK_STR, "NumKeys = 3"))
109*527cbf3dSMarko Kovacevic 		info.interim_info.tdes_data.nb_keys = 3;
110*527cbf3dSMarko Kovacevic 	else
111*527cbf3dSMarko Kovacevic 		return -EINVAL;
112*527cbf3dSMarko Kovacevic 
113*527cbf3dSMarko Kovacevic 	return 0;
114*527cbf3dSMarko Kovacevic }
115*527cbf3dSMarko Kovacevic 
116*527cbf3dSMarko Kovacevic static int
117*527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val)
118*527cbf3dSMarko Kovacevic {
119*527cbf3dSMarko Kovacevic 	uint8_t tmp_key[24] = {0};
120*527cbf3dSMarko Kovacevic 	uint32_t len, i;
121*527cbf3dSMarko Kovacevic 
122*527cbf3dSMarko Kovacevic 	src += strlen(key);
123*527cbf3dSMarko Kovacevic 
124*527cbf3dSMarko Kovacevic 	len = strlen(src) / 2;
125*527cbf3dSMarko Kovacevic 
126*527cbf3dSMarko Kovacevic 	if (val->val) {
127*527cbf3dSMarko Kovacevic 		memcpy(tmp_key, val->val, val->len);
128*527cbf3dSMarko Kovacevic 		rte_free(val->val);
129*527cbf3dSMarko Kovacevic 	}
130*527cbf3dSMarko Kovacevic 
131*527cbf3dSMarko Kovacevic 	val->val = rte_zmalloc(NULL, 24, 0);
132*527cbf3dSMarko Kovacevic 	if (!val->val)
133*527cbf3dSMarko Kovacevic 		return -1;
134*527cbf3dSMarko Kovacevic 
135*527cbf3dSMarko Kovacevic 	memcpy(val->val, tmp_key, 24);
136*527cbf3dSMarko Kovacevic 
137*527cbf3dSMarko Kovacevic 	if (strstr(key, KEYS_STR)) {
138*527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
139*527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
140*527cbf3dSMarko Kovacevic 
141*527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i], byte) < 0)
142*527cbf3dSMarko Kovacevic 				goto error_exit;
143*527cbf3dSMarko Kovacevic 		}
144*527cbf3dSMarko Kovacevic 
145*527cbf3dSMarko Kovacevic 		memcpy(val->val + 8, val->val, 8);
146*527cbf3dSMarko Kovacevic 		memcpy(val->val + 16, val->val, 8);
147*527cbf3dSMarko Kovacevic 
148*527cbf3dSMarko Kovacevic 	} else if (strstr(key, KEY1_STR)) {
149*527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
150*527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
151*527cbf3dSMarko Kovacevic 
152*527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i], byte) < 0)
153*527cbf3dSMarko Kovacevic 				goto error_exit;
154*527cbf3dSMarko Kovacevic 		}
155*527cbf3dSMarko Kovacevic 
156*527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 2)
157*527cbf3dSMarko Kovacevic 			memcpy(val->val + 16, val->val, 8);
158*527cbf3dSMarko Kovacevic 
159*527cbf3dSMarko Kovacevic 	} else if (strstr(key, KEY2_STR)) {
160*527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
161*527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
162*527cbf3dSMarko Kovacevic 
163*527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i + 8], byte) < 0)
164*527cbf3dSMarko Kovacevic 				goto error_exit;
165*527cbf3dSMarko Kovacevic 		}
166*527cbf3dSMarko Kovacevic 
167*527cbf3dSMarko Kovacevic 	} else if (strstr(key, KEY3_STR)) {
168*527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
169*527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
170*527cbf3dSMarko Kovacevic 
171*527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i + 16], byte) < 0)
172*527cbf3dSMarko Kovacevic 				goto error_exit;
173*527cbf3dSMarko Kovacevic 		}
174*527cbf3dSMarko Kovacevic 	} else
175*527cbf3dSMarko Kovacevic 		return -EINVAL;
176*527cbf3dSMarko Kovacevic 
177*527cbf3dSMarko Kovacevic 	val->len = 24;
178*527cbf3dSMarko Kovacevic 
179*527cbf3dSMarko Kovacevic 	return 0;
180*527cbf3dSMarko Kovacevic 
181*527cbf3dSMarko Kovacevic error_exit:
182*527cbf3dSMarko Kovacevic 	rte_free(val->val);
183*527cbf3dSMarko Kovacevic 	memset(val, 0, sizeof(*val));
184*527cbf3dSMarko Kovacevic 	return -EINVAL;
185*527cbf3dSMarko Kovacevic }
186*527cbf3dSMarko Kovacevic 
187*527cbf3dSMarko Kovacevic static int
188*527cbf3dSMarko Kovacevic parse_test_tdes_writeback(struct fips_val *val)
189*527cbf3dSMarko Kovacevic {
190*527cbf3dSMarko Kovacevic 
191*527cbf3dSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
192*527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "%s", CT_STR);
193*527cbf3dSMarko Kovacevic 	else
194*527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "%s", PT_STR);
195*527cbf3dSMarko Kovacevic 
196*527cbf3dSMarko Kovacevic 	parse_write_hex_str(val);
197*527cbf3dSMarko Kovacevic 
198*527cbf3dSMarko Kovacevic 	return 0;
199*527cbf3dSMarko Kovacevic 
200*527cbf3dSMarko Kovacevic }
201*527cbf3dSMarko Kovacevic 
202*527cbf3dSMarko Kovacevic static int
203*527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val)
204*527cbf3dSMarko Kovacevic {
205*527cbf3dSMarko Kovacevic 	struct fips_val tmp_val;
206*527cbf3dSMarko Kovacevic 
207*527cbf3dSMarko Kovacevic 	tmp_val.len = 8;
208*527cbf3dSMarko Kovacevic 
209*527cbf3dSMarko Kovacevic 	if (strstr(key, KEY1_STR))
210*527cbf3dSMarko Kovacevic 		tmp_val.val = val->val;
211*527cbf3dSMarko Kovacevic 	else if (strstr(key, KEY2_STR))
212*527cbf3dSMarko Kovacevic 		tmp_val.val = val->val + 8;
213*527cbf3dSMarko Kovacevic 	else if (strstr(key, KEY3_STR))
214*527cbf3dSMarko Kovacevic 		tmp_val.val = val->val + 16;
215*527cbf3dSMarko Kovacevic 
216*527cbf3dSMarko Kovacevic 	return writeback_hex_str(key, dst, &tmp_val);
217*527cbf3dSMarko Kovacevic }
218*527cbf3dSMarko Kovacevic 
219*527cbf3dSMarko Kovacevic static int
220*527cbf3dSMarko Kovacevic rsp_test_tdes_check(struct fips_val *val)
221*527cbf3dSMarko Kovacevic {
222*527cbf3dSMarko Kovacevic 	struct fips_val *data;
223*527cbf3dSMarko Kovacevic 
224*527cbf3dSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
225*527cbf3dSMarko Kovacevic 		data = &vec.ct;
226*527cbf3dSMarko Kovacevic 	else
227*527cbf3dSMarko Kovacevic 		data = &vec.pt;
228*527cbf3dSMarko Kovacevic 
229*527cbf3dSMarko Kovacevic 	if (memcmp(val->val, data->val, val->len) == 0)
230*527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "Success\n");
231*527cbf3dSMarko Kovacevic 	else
232*527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "Failed\n");
233*527cbf3dSMarko Kovacevic 
234*527cbf3dSMarko Kovacevic 	return 0;
235*527cbf3dSMarko Kovacevic }
236*527cbf3dSMarko Kovacevic 
237*527cbf3dSMarko Kovacevic int
238*527cbf3dSMarko Kovacevic parse_test_tdes_init(void)
239*527cbf3dSMarko Kovacevic {
240*527cbf3dSMarko Kovacevic 	uint32_t i;
241*527cbf3dSMarko Kovacevic 
242*527cbf3dSMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++) {
243*527cbf3dSMarko Kovacevic 		char *line = info.vec[i];
244*527cbf3dSMarko Kovacevic 		uint32_t j;
245*527cbf3dSMarko Kovacevic 
246*527cbf3dSMarko Kovacevic 		if (strstr(line, TEST_CBCI_KEY))
247*527cbf3dSMarko Kovacevic 			return -EPERM;
248*527cbf3dSMarko Kovacevic 
249*527cbf3dSMarko Kovacevic 		for (j = 0; j < RTE_DIM(test_types); j++)
250*527cbf3dSMarko Kovacevic 			if (strstr(line, test_types[j].desc)) {
251*527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.test_type =
252*527cbf3dSMarko Kovacevic 						test_types[j].type;
253*527cbf3dSMarko Kovacevic 				break;
254*527cbf3dSMarko Kovacevic 			}
255*527cbf3dSMarko Kovacevic 	}
256*527cbf3dSMarko Kovacevic 
257*527cbf3dSMarko Kovacevic 	info.parse_writeback = parse_test_tdes_writeback;
258*527cbf3dSMarko Kovacevic 	info.callbacks = tdes_tests_vectors;
259*527cbf3dSMarko Kovacevic 	info.interim_callbacks = tdes_tests_interim_vectors;
260*527cbf3dSMarko Kovacevic 	info.writeback_callbacks = tdes_writeback_callbacks;
261*527cbf3dSMarko Kovacevic 	info.kat_check = rsp_test_tdes_check;
262*527cbf3dSMarko Kovacevic 
263*527cbf3dSMarko Kovacevic 	return 0;
264*527cbf3dSMarko Kovacevic }
265