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