xref: /dpdk/examples/fips_validation/fips_validation_tdes.c (revision a18622864c8e9e7f7eea463db69ec3d4df00efdc)
1527cbf3dSMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2527cbf3dSMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
3527cbf3dSMarko Kovacevic  */
4527cbf3dSMarko Kovacevic 
5527cbf3dSMarko Kovacevic #include <string.h>
6527cbf3dSMarko Kovacevic #include <stdio.h>
7527cbf3dSMarko Kovacevic 
8527cbf3dSMarko Kovacevic #include <rte_malloc.h>
9527cbf3dSMarko Kovacevic #include <rte_cryptodev.h>
10527cbf3dSMarko Kovacevic 
11527cbf3dSMarko Kovacevic #include "fips_validation.h"
12527cbf3dSMarko Kovacevic 
13527cbf3dSMarko Kovacevic #define NEW_LINE_STR	"#"
14527cbf3dSMarko Kovacevic #define TEST_TYPE_KEY	" for CBC"
15efe3a8dbSMichael Shamis #define TEST_TYPE_ECB_KEY	" for ECB"
16527cbf3dSMarko Kovacevic #define TEST_CBCI_KEY	" for CBCI"
17527cbf3dSMarko Kovacevic 
18527cbf3dSMarko Kovacevic #define ENC_STR		"[ENCRYPT]"
19527cbf3dSMarko Kovacevic #define DEC_STR		"[DECRYPT]"
20527cbf3dSMarko Kovacevic 
21527cbf3dSMarko Kovacevic #define COUNT_STR	"COUNT = "
22527cbf3dSMarko Kovacevic #define KEY1_STR	"KEY1 = "
23527cbf3dSMarko Kovacevic #define KEY2_STR	"KEY2 = "
24527cbf3dSMarko Kovacevic #define KEY3_STR	"KEY3 = "
25527cbf3dSMarko Kovacevic 
26527cbf3dSMarko Kovacevic #define KEYS_STR	"KEYs = "
27527cbf3dSMarko Kovacevic #define IV_STR		"IV = "
28527cbf3dSMarko Kovacevic #define PT_STR		"PLAINTEXT = "
29527cbf3dSMarko Kovacevic #define CT_STR		"CIPHERTEXT = "
30527cbf3dSMarko Kovacevic #define NK_STR		"NumKeys = "
31527cbf3dSMarko Kovacevic 
32527cbf3dSMarko Kovacevic #define SET_STR		" = "
33527cbf3dSMarko Kovacevic 
34527cbf3dSMarko Kovacevic #define PLAIN_TEXT	0
35527cbf3dSMarko Kovacevic #define CIPHER_TEXT	1
36527cbf3dSMarko Kovacevic #define KEY_TEXT	2
37527cbf3dSMarko Kovacevic #define IV_TEXT		3
38527cbf3dSMarko Kovacevic 
39527cbf3dSMarko Kovacevic #define DEVICE_STR	"# Config Info for : "
40527cbf3dSMarko Kovacevic 
41527cbf3dSMarko Kovacevic struct {
42527cbf3dSMarko Kovacevic 	uint32_t type;
43527cbf3dSMarko Kovacevic 	const char *desc;
44527cbf3dSMarko Kovacevic } test_types[] = {
45527cbf3dSMarko Kovacevic 		{TDES_INVERSE_PERMUTATION, "INVERSE PERMUTATION"},
46527cbf3dSMarko Kovacevic 		{TDES_PERMUTATION, "PERMUTATION OPERATION"},
47527cbf3dSMarko Kovacevic 		{TDES_SUBSTITUTION_TABLE, "SUBSTITUTION TABLE"},
48527cbf3dSMarko Kovacevic 		{TDES_VARIABLE_KEY, "VARIABLE KEY"},
49527cbf3dSMarko Kovacevic 		{TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"},
50527cbf3dSMarko Kovacevic 		{TDES_VARIABLE_TEXT, "KAT"},
51527cbf3dSMarko Kovacevic 		{TDES_MCT, "Monte Carlo (Modes) Test"},
52527cbf3dSMarko Kovacevic 		{TDES_MMT, "Multi block Message Test"},
53527cbf3dSMarko Kovacevic };
54527cbf3dSMarko Kovacevic 
55527cbf3dSMarko Kovacevic static int
56527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val);
57527cbf3dSMarko Kovacevic 
58527cbf3dSMarko Kovacevic static int
59527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val);
60527cbf3dSMarko Kovacevic 
61527cbf3dSMarko Kovacevic static int
62*a1862286SArchana Muniganti parse_tdes_interim(const char *key, char *text, struct fips_val *val);
63527cbf3dSMarko Kovacevic 
64527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_vectors[] = {
65527cbf3dSMarko Kovacevic 		{KEYS_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
66527cbf3dSMarko Kovacevic 		{KEY1_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
67527cbf3dSMarko Kovacevic 		{KEY2_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
68527cbf3dSMarko Kovacevic 		{KEY3_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key},
69527cbf3dSMarko Kovacevic 		{IV_STR, parse_uint8_hex_str, &vec.iv},
70527cbf3dSMarko Kovacevic 		{PT_STR, parse_uint8_hex_str, &vec.pt},
71527cbf3dSMarko Kovacevic 		{CT_STR, parse_uint8_hex_str, &vec.ct},
72527cbf3dSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
73527cbf3dSMarko Kovacevic };
74527cbf3dSMarko Kovacevic 
75527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_interim_vectors[] = {
76527cbf3dSMarko Kovacevic 		{ENC_STR, parse_tdes_interim, NULL},
77527cbf3dSMarko Kovacevic 		{DEC_STR, parse_tdes_interim, NULL},
78*a1862286SArchana Muniganti 		{NK_STR, parse_tdes_interim, NULL},
79527cbf3dSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
80527cbf3dSMarko Kovacevic };
81527cbf3dSMarko Kovacevic 
82527cbf3dSMarko Kovacevic struct fips_test_callback tdes_writeback_callbacks[] = {
83527cbf3dSMarko Kovacevic 		/** First element is used to pass COUNT string */
84527cbf3dSMarko Kovacevic 		{COUNT_STR, NULL, NULL},
85527cbf3dSMarko Kovacevic 		{IV_STR, writeback_hex_str, &vec.iv},
86527cbf3dSMarko Kovacevic 		{KEY1_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
87527cbf3dSMarko Kovacevic 		{KEY2_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
88527cbf3dSMarko Kovacevic 		{KEY3_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
89527cbf3dSMarko Kovacevic 		{KEYS_STR, writeback_tdes_hex_str, &vec.cipher_auth.key},
90527cbf3dSMarko Kovacevic 		{PT_STR, writeback_hex_str, &vec.pt},
91527cbf3dSMarko Kovacevic 		{CT_STR, writeback_hex_str, &vec.ct},
92527cbf3dSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
93527cbf3dSMarko Kovacevic };
94527cbf3dSMarko Kovacevic 
95527cbf3dSMarko Kovacevic static int
96*a1862286SArchana Muniganti parse_tdes_interim(const char *key, char *text,
97f2fc83b4SThomas Monjalon 		__rte_unused struct fips_val *val)
98527cbf3dSMarko Kovacevic {
99527cbf3dSMarko Kovacevic 	if (strstr(key, ENC_STR))
100527cbf3dSMarko Kovacevic 		info.op = FIPS_TEST_ENC_AUTH_GEN;
101527cbf3dSMarko Kovacevic 	else if (strstr(key, DEC_STR))
102527cbf3dSMarko Kovacevic 		info.op = FIPS_TEST_DEC_AUTH_VERIF;
103*a1862286SArchana Muniganti 	else if (strstr(key, NK_STR)) {
104*a1862286SArchana Muniganti 		if (strcmp(text, "NumKeys = 1") == 0)
105527cbf3dSMarko Kovacevic 			info.interim_info.tdes_data.nb_keys = 1;
106*a1862286SArchana Muniganti 		else if (strcmp(text, "NumKeys = 2") == 0)
107527cbf3dSMarko Kovacevic 			info.interim_info.tdes_data.nb_keys = 2;
108*a1862286SArchana Muniganti 		else if (strcmp(text, "NumKeys = 3") == 0)
109527cbf3dSMarko Kovacevic 			info.interim_info.tdes_data.nb_keys = 3;
110527cbf3dSMarko Kovacevic 		else
111527cbf3dSMarko Kovacevic 			return -EINVAL;
112*a1862286SArchana Muniganti 	} else
113*a1862286SArchana Muniganti 		return -EINVAL;
114527cbf3dSMarko Kovacevic 
115527cbf3dSMarko Kovacevic 	return 0;
116527cbf3dSMarko Kovacevic }
117527cbf3dSMarko Kovacevic 
118527cbf3dSMarko Kovacevic static int
119527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val)
120527cbf3dSMarko Kovacevic {
121527cbf3dSMarko Kovacevic 	uint8_t tmp_key[24] = {0};
122527cbf3dSMarko Kovacevic 	uint32_t len, i;
123527cbf3dSMarko Kovacevic 
124527cbf3dSMarko Kovacevic 	src += strlen(key);
125527cbf3dSMarko Kovacevic 
126527cbf3dSMarko Kovacevic 	len = strlen(src) / 2;
127527cbf3dSMarko Kovacevic 
128527cbf3dSMarko Kovacevic 	if (val->val) {
129527cbf3dSMarko Kovacevic 		memcpy(tmp_key, val->val, val->len);
130527cbf3dSMarko Kovacevic 		rte_free(val->val);
131527cbf3dSMarko Kovacevic 	}
132527cbf3dSMarko Kovacevic 
133527cbf3dSMarko Kovacevic 	val->val = rte_zmalloc(NULL, 24, 0);
134527cbf3dSMarko Kovacevic 	if (!val->val)
135527cbf3dSMarko Kovacevic 		return -1;
136527cbf3dSMarko Kovacevic 
137527cbf3dSMarko Kovacevic 	memcpy(val->val, tmp_key, 24);
138527cbf3dSMarko Kovacevic 
139527cbf3dSMarko Kovacevic 	if (strstr(key, KEYS_STR)) {
140527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
141527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
142527cbf3dSMarko Kovacevic 
143527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i], byte) < 0)
144527cbf3dSMarko Kovacevic 				goto error_exit;
145527cbf3dSMarko Kovacevic 		}
146527cbf3dSMarko Kovacevic 
147527cbf3dSMarko Kovacevic 		memcpy(val->val + 8, val->val, 8);
148527cbf3dSMarko Kovacevic 		memcpy(val->val + 16, val->val, 8);
149527cbf3dSMarko Kovacevic 
150527cbf3dSMarko Kovacevic 	} else if (strstr(key, KEY1_STR)) {
151527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
152527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
153527cbf3dSMarko Kovacevic 
154527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i], byte) < 0)
155527cbf3dSMarko Kovacevic 				goto error_exit;
156527cbf3dSMarko Kovacevic 		}
157527cbf3dSMarko Kovacevic 
158527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 2)
159527cbf3dSMarko Kovacevic 			memcpy(val->val + 16, val->val, 8);
160527cbf3dSMarko Kovacevic 
161527cbf3dSMarko Kovacevic 	} else if (strstr(key, KEY2_STR)) {
162527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
163527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
164527cbf3dSMarko Kovacevic 
165527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i + 8], byte) < 0)
166527cbf3dSMarko Kovacevic 				goto error_exit;
167527cbf3dSMarko Kovacevic 		}
168527cbf3dSMarko Kovacevic 
169527cbf3dSMarko Kovacevic 	} else if (strstr(key, KEY3_STR)) {
170527cbf3dSMarko Kovacevic 		for (i = 0; i < len; i++) {
171527cbf3dSMarko Kovacevic 			char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'};
172527cbf3dSMarko Kovacevic 
173527cbf3dSMarko Kovacevic 			if (parser_read_uint8_hex(&val->val[i + 16], byte) < 0)
174527cbf3dSMarko Kovacevic 				goto error_exit;
175527cbf3dSMarko Kovacevic 		}
176527cbf3dSMarko Kovacevic 	} else
177527cbf3dSMarko Kovacevic 		return -EINVAL;
178527cbf3dSMarko Kovacevic 
179527cbf3dSMarko Kovacevic 	val->len = 24;
180527cbf3dSMarko Kovacevic 
181527cbf3dSMarko Kovacevic 	return 0;
182527cbf3dSMarko Kovacevic 
183527cbf3dSMarko Kovacevic error_exit:
184527cbf3dSMarko Kovacevic 	rte_free(val->val);
185527cbf3dSMarko Kovacevic 	memset(val, 0, sizeof(*val));
186527cbf3dSMarko Kovacevic 	return -EINVAL;
187527cbf3dSMarko Kovacevic }
188527cbf3dSMarko Kovacevic 
189527cbf3dSMarko Kovacevic static int
190527cbf3dSMarko Kovacevic parse_test_tdes_writeback(struct fips_val *val)
191527cbf3dSMarko Kovacevic {
192527cbf3dSMarko Kovacevic 
193527cbf3dSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
194527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "%s", CT_STR);
195527cbf3dSMarko Kovacevic 	else
196527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "%s", PT_STR);
197527cbf3dSMarko Kovacevic 
198527cbf3dSMarko Kovacevic 	parse_write_hex_str(val);
199527cbf3dSMarko Kovacevic 
200527cbf3dSMarko Kovacevic 	return 0;
201527cbf3dSMarko Kovacevic 
202527cbf3dSMarko Kovacevic }
203527cbf3dSMarko Kovacevic 
204527cbf3dSMarko Kovacevic static int
205527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val)
206527cbf3dSMarko Kovacevic {
20786ce81afSMarko Kovacevic 	struct fips_val tmp_val = {0};
208527cbf3dSMarko Kovacevic 
209527cbf3dSMarko Kovacevic 	tmp_val.len = 8;
210527cbf3dSMarko Kovacevic 
211527cbf3dSMarko Kovacevic 	if (strstr(key, KEY1_STR))
212527cbf3dSMarko Kovacevic 		tmp_val.val = val->val;
213527cbf3dSMarko Kovacevic 	else if (strstr(key, KEY2_STR))
214527cbf3dSMarko Kovacevic 		tmp_val.val = val->val + 8;
215527cbf3dSMarko Kovacevic 	else if (strstr(key, KEY3_STR))
216527cbf3dSMarko Kovacevic 		tmp_val.val = val->val + 16;
21775b3dddfSChaitanya Babu Talluri 	else
21875b3dddfSChaitanya Babu Talluri 		return -EINVAL;
219527cbf3dSMarko Kovacevic 
220527cbf3dSMarko Kovacevic 	return writeback_hex_str(key, dst, &tmp_val);
221527cbf3dSMarko Kovacevic }
222527cbf3dSMarko Kovacevic 
223527cbf3dSMarko Kovacevic static int
224527cbf3dSMarko Kovacevic rsp_test_tdes_check(struct fips_val *val)
225527cbf3dSMarko Kovacevic {
226527cbf3dSMarko Kovacevic 	struct fips_val *data;
227527cbf3dSMarko Kovacevic 
228527cbf3dSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
229527cbf3dSMarko Kovacevic 		data = &vec.ct;
230527cbf3dSMarko Kovacevic 	else
231527cbf3dSMarko Kovacevic 		data = &vec.pt;
232527cbf3dSMarko Kovacevic 
233527cbf3dSMarko Kovacevic 	if (memcmp(val->val, data->val, val->len) == 0)
234527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "Success\n");
235527cbf3dSMarko Kovacevic 	else
236527cbf3dSMarko Kovacevic 		fprintf(info.fp_wr, "Failed\n");
237527cbf3dSMarko Kovacevic 
238527cbf3dSMarko Kovacevic 	return 0;
239527cbf3dSMarko Kovacevic }
240527cbf3dSMarko Kovacevic 
241527cbf3dSMarko Kovacevic int
242527cbf3dSMarko Kovacevic parse_test_tdes_init(void)
243527cbf3dSMarko Kovacevic {
244527cbf3dSMarko Kovacevic 	uint32_t i;
245527cbf3dSMarko Kovacevic 
246527cbf3dSMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++) {
247527cbf3dSMarko Kovacevic 		char *line = info.vec[i];
248527cbf3dSMarko Kovacevic 		uint32_t j;
249527cbf3dSMarko Kovacevic 
250527cbf3dSMarko Kovacevic 		if (strstr(line, TEST_CBCI_KEY))
251527cbf3dSMarko Kovacevic 			return -EPERM;
252527cbf3dSMarko Kovacevic 
253527cbf3dSMarko Kovacevic 		for (j = 0; j < RTE_DIM(test_types); j++)
254527cbf3dSMarko Kovacevic 			if (strstr(line, test_types[j].desc)) {
255527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.test_type =
256527cbf3dSMarko Kovacevic 						test_types[j].type;
257efe3a8dbSMichael Shamis 				if (strstr(line, TEST_TYPE_ECB_KEY))
258efe3a8dbSMichael Shamis 					info.interim_info.tdes_data.test_mode =
259efe3a8dbSMichael Shamis 						TDES_MODE_ECB;
260efe3a8dbSMichael Shamis 				else
261efe3a8dbSMichael Shamis 					info.interim_info.tdes_data.test_mode =
262efe3a8dbSMichael Shamis 						TDES_MODE_CBC;
263527cbf3dSMarko Kovacevic 				break;
264527cbf3dSMarko Kovacevic 			}
265527cbf3dSMarko Kovacevic 	}
266527cbf3dSMarko Kovacevic 
267527cbf3dSMarko Kovacevic 	info.parse_writeback = parse_test_tdes_writeback;
268527cbf3dSMarko Kovacevic 	info.callbacks = tdes_tests_vectors;
269527cbf3dSMarko Kovacevic 	info.interim_callbacks = tdes_tests_interim_vectors;
270527cbf3dSMarko Kovacevic 	info.writeback_callbacks = tdes_writeback_callbacks;
271527cbf3dSMarko Kovacevic 	info.kat_check = rsp_test_tdes_check;
272527cbf3dSMarko Kovacevic 
273527cbf3dSMarko Kovacevic 	return 0;
274527cbf3dSMarko Kovacevic }
275