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
parser_dvpt_interim(const char * key,char * src,struct fips_val * val)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
parse_dvpt_ct_hex_str(const char * key,char * src,struct fips_val * val)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
parse_uint8_ccm_aad_str(const char * key,char * src,struct fips_val * val)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
parse_test_ccm_writeback(struct fips_val * val)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
parse_test_ccm_init(void)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