xref: /dpdk/examples/fips_validation/fips_validation_aes.c (revision cd255ccf57647830bfdda8d760dad833f019b76a)
1*cd255ccfSMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2*cd255ccfSMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
3*cd255ccfSMarko Kovacevic  */
4*cd255ccfSMarko Kovacevic 
5*cd255ccfSMarko Kovacevic #include <string.h>
6*cd255ccfSMarko Kovacevic #include <time.h>
7*cd255ccfSMarko Kovacevic #include <stdio.h>
8*cd255ccfSMarko Kovacevic 
9*cd255ccfSMarko Kovacevic #include <rte_cryptodev.h>
10*cd255ccfSMarko Kovacevic 
11*cd255ccfSMarko Kovacevic #include "fips_validation.h"
12*cd255ccfSMarko Kovacevic 
13*cd255ccfSMarko Kovacevic #define MODE_STR	"AESVS"
14*cd255ccfSMarko Kovacevic #define ALGO_STR	"test data for "
15*cd255ccfSMarko Kovacevic #define OP_STR		"State"
16*cd255ccfSMarko Kovacevic #define KEY_SIZE_STR	"Key Length : "
17*cd255ccfSMarko Kovacevic 
18*cd255ccfSMarko Kovacevic 
19*cd255ccfSMarko Kovacevic #define COUNT_STR	"COUNT = "
20*cd255ccfSMarko Kovacevic #define KEY_STR		"KEY = "
21*cd255ccfSMarko Kovacevic #define IV_STR		"IV = "
22*cd255ccfSMarko Kovacevic #define PT_STR		"PLAINTEXT = "
23*cd255ccfSMarko Kovacevic #define CT_STR		"CIPHERTEXT = "
24*cd255ccfSMarko Kovacevic 
25*cd255ccfSMarko Kovacevic #define OP_ENC_STR	"ENCRYPT"
26*cd255ccfSMarko Kovacevic #define OP_DEC_STR	"DECRYPT"
27*cd255ccfSMarko Kovacevic 
28*cd255ccfSMarko Kovacevic struct {
29*cd255ccfSMarko Kovacevic 	uint32_t type;
30*cd255ccfSMarko Kovacevic 	const char *desc;
31*cd255ccfSMarko Kovacevic } aes_test_types[] = {
32*cd255ccfSMarko Kovacevic 		{AESAVS_TYPE_GFXBOX, "GFSbox"},
33*cd255ccfSMarko Kovacevic 		{AESAVS_TYPE_KEYSBOX, "KeySbox"},
34*cd255ccfSMarko Kovacevic 		{AESAVS_TYPE_VARKEY, "VarKey"},
35*cd255ccfSMarko Kovacevic 		{AESAVS_TYPE_VARTXT, "VarTxt"},
36*cd255ccfSMarko Kovacevic 		{AESAVS_TYPE_MMT, "MMT"},
37*cd255ccfSMarko Kovacevic 		{AESAVS_TYPE_MCT, "MCT"},
38*cd255ccfSMarko Kovacevic };
39*cd255ccfSMarko Kovacevic 
40*cd255ccfSMarko Kovacevic struct aes_test_algo {
41*cd255ccfSMarko Kovacevic 	const char *name;
42*cd255ccfSMarko Kovacevic 	enum rte_crypto_cipher_algorithm algo;
43*cd255ccfSMarko Kovacevic } const algo_con[] = {
44*cd255ccfSMarko Kovacevic 		{"CBC", RTE_CRYPTO_CIPHER_AES_CBC},
45*cd255ccfSMarko Kovacevic };
46*cd255ccfSMarko Kovacevic 
47*cd255ccfSMarko Kovacevic static int
48*cd255ccfSMarko Kovacevic parse_interim_enc_dec(const char *key,
49*cd255ccfSMarko Kovacevic 		__attribute__((__unused__)) char *text,
50*cd255ccfSMarko Kovacevic 		__attribute__((__unused__)) struct fips_val *val)
51*cd255ccfSMarko Kovacevic {
52*cd255ccfSMarko Kovacevic 	if (strcmp(key, OP_ENC_STR) == 0)
53*cd255ccfSMarko Kovacevic 		info.op = FIPS_TEST_ENC_AUTH_GEN;
54*cd255ccfSMarko Kovacevic 	else if (strcmp(key, OP_DEC_STR) == 0)
55*cd255ccfSMarko Kovacevic 		info.op = FIPS_TEST_DEC_AUTH_VERIF;
56*cd255ccfSMarko Kovacevic 	else
57*cd255ccfSMarko Kovacevic 		return -1;
58*cd255ccfSMarko Kovacevic 
59*cd255ccfSMarko Kovacevic 	return 0;
60*cd255ccfSMarko Kovacevic }
61*cd255ccfSMarko Kovacevic 
62*cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_interim[] = {
63*cd255ccfSMarko Kovacevic 		{OP_ENC_STR, parse_interim_enc_dec, NULL},
64*cd255ccfSMarko Kovacevic 		{OP_DEC_STR, parse_interim_enc_dec, NULL},
65*cd255ccfSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
66*cd255ccfSMarko Kovacevic };
67*cd255ccfSMarko Kovacevic 
68*cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_vectors[] = {
69*cd255ccfSMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
70*cd255ccfSMarko Kovacevic 		{IV_STR, parse_uint8_hex_str, &vec.iv},
71*cd255ccfSMarko Kovacevic 		{PT_STR, parse_uint8_hex_str, &vec.pt},
72*cd255ccfSMarko Kovacevic 		{CT_STR, parse_uint8_hex_str, &vec.ct},
73*cd255ccfSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
74*cd255ccfSMarko Kovacevic };
75*cd255ccfSMarko Kovacevic 
76*cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_interim_vectors[] = {
77*cd255ccfSMarko Kovacevic 		{OP_ENC_STR, parse_interim_enc_dec, NULL},
78*cd255ccfSMarko Kovacevic 		{OP_DEC_STR, parse_interim_enc_dec, NULL},
79*cd255ccfSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
80*cd255ccfSMarko Kovacevic };
81*cd255ccfSMarko Kovacevic 
82*cd255ccfSMarko Kovacevic struct fips_test_callback aes_writeback_callbacks[] = {
83*cd255ccfSMarko Kovacevic 		/** First element is used to pass COUNT string */
84*cd255ccfSMarko Kovacevic 		{COUNT_STR, NULL, NULL},
85*cd255ccfSMarko Kovacevic 		{IV_STR, writeback_hex_str, &vec.iv},
86*cd255ccfSMarko Kovacevic 		{KEY_STR, writeback_hex_str, &vec.cipher_auth.key},
87*cd255ccfSMarko Kovacevic 		{PT_STR, writeback_hex_str, &vec.pt},
88*cd255ccfSMarko Kovacevic 		{CT_STR, writeback_hex_str, &vec.ct},
89*cd255ccfSMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
90*cd255ccfSMarko Kovacevic };
91*cd255ccfSMarko Kovacevic 
92*cd255ccfSMarko Kovacevic static int
93*cd255ccfSMarko Kovacevic parse_test_aes_writeback(struct fips_val *val)
94*cd255ccfSMarko Kovacevic {
95*cd255ccfSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
96*cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "%s", CT_STR);
97*cd255ccfSMarko Kovacevic 	else
98*cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "%s", PT_STR);
99*cd255ccfSMarko Kovacevic 
100*cd255ccfSMarko Kovacevic 	parse_write_hex_str(val);
101*cd255ccfSMarko Kovacevic 
102*cd255ccfSMarko Kovacevic 	return 0;
103*cd255ccfSMarko Kovacevic }
104*cd255ccfSMarko Kovacevic 
105*cd255ccfSMarko Kovacevic static int
106*cd255ccfSMarko Kovacevic rsp_test_aes_check(struct fips_val *val)
107*cd255ccfSMarko Kovacevic {
108*cd255ccfSMarko Kovacevic 	struct fips_val *data;
109*cd255ccfSMarko Kovacevic 
110*cd255ccfSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
111*cd255ccfSMarko Kovacevic 		data = &vec.ct;
112*cd255ccfSMarko Kovacevic 	else
113*cd255ccfSMarko Kovacevic 		data = &vec.pt;
114*cd255ccfSMarko Kovacevic 
115*cd255ccfSMarko Kovacevic 	if (memcmp(val->val, data->val, val->len) == 0)
116*cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "Success\n");
117*cd255ccfSMarko Kovacevic 	else
118*cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "Failed\n");
119*cd255ccfSMarko Kovacevic 
120*cd255ccfSMarko Kovacevic 	return 0;
121*cd255ccfSMarko Kovacevic }
122*cd255ccfSMarko Kovacevic 
123*cd255ccfSMarko Kovacevic int
124*cd255ccfSMarko Kovacevic parse_test_aes_init(void)
125*cd255ccfSMarko Kovacevic {
126*cd255ccfSMarko Kovacevic 	char *tmp;
127*cd255ccfSMarko Kovacevic 	uint32_t i, j;
128*cd255ccfSMarko Kovacevic 
129*cd255ccfSMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++) {
130*cd255ccfSMarko Kovacevic 		char *line = info.vec[i];
131*cd255ccfSMarko Kovacevic 
132*cd255ccfSMarko Kovacevic 		tmp = strstr(line, MODE_STR);
133*cd255ccfSMarko Kovacevic 		if (tmp) {
134*cd255ccfSMarko Kovacevic 			for (j = 0; j < RTE_DIM(aes_test_types); j++)
135*cd255ccfSMarko Kovacevic 				if (strstr(line, aes_test_types[j].desc)) {
136*cd255ccfSMarko Kovacevic 					info.interim_info.aes_data.test_type =
137*cd255ccfSMarko Kovacevic 							aes_test_types[j].type;
138*cd255ccfSMarko Kovacevic 					break;
139*cd255ccfSMarko Kovacevic 				}
140*cd255ccfSMarko Kovacevic 
141*cd255ccfSMarko Kovacevic 			if (j >= RTE_DIM(aes_test_types))
142*cd255ccfSMarko Kovacevic 				return -EINVAL;
143*cd255ccfSMarko Kovacevic 
144*cd255ccfSMarko Kovacevic 			tmp = strstr(line, ALGO_STR);
145*cd255ccfSMarko Kovacevic 			if (!tmp)
146*cd255ccfSMarko Kovacevic 				return -EINVAL;
147*cd255ccfSMarko Kovacevic 
148*cd255ccfSMarko Kovacevic 			tmp += strlen(ALGO_STR);
149*cd255ccfSMarko Kovacevic 			for (j = 0; j < RTE_DIM(algo_con); j++)
150*cd255ccfSMarko Kovacevic 				if (strcmp(algo_con[j].name, tmp) == 0) {
151*cd255ccfSMarko Kovacevic 					info.interim_info.aes_data.cipher_algo =
152*cd255ccfSMarko Kovacevic 						(uint32_t)algo_con[j].algo;
153*cd255ccfSMarko Kovacevic 					break;
154*cd255ccfSMarko Kovacevic 				}
155*cd255ccfSMarko Kovacevic 			if (j >= RTE_DIM(algo_con))
156*cd255ccfSMarko Kovacevic 				return -EINVAL;
157*cd255ccfSMarko Kovacevic 
158*cd255ccfSMarko Kovacevic 			continue;
159*cd255ccfSMarko Kovacevic 		}
160*cd255ccfSMarko Kovacevic 
161*cd255ccfSMarko Kovacevic 		tmp = strstr(line, OP_STR);
162*cd255ccfSMarko Kovacevic 		if (tmp)
163*cd255ccfSMarko Kovacevic 			continue;
164*cd255ccfSMarko Kovacevic 
165*cd255ccfSMarko Kovacevic 		tmp = strstr(line, KEY_SIZE_STR);
166*cd255ccfSMarko Kovacevic 		if (tmp) {
167*cd255ccfSMarko Kovacevic 			tmp += strlen(KEY_SIZE_STR);
168*cd255ccfSMarko Kovacevic 			if (parser_read_uint32
169*cd255ccfSMarko Kovacevic 					(&info.interim_info.aes_data.key_len,
170*cd255ccfSMarko Kovacevic 							tmp) < 0)
171*cd255ccfSMarko Kovacevic 				return -EINVAL;
172*cd255ccfSMarko Kovacevic 
173*cd255ccfSMarko Kovacevic 			info.interim_info.aes_data.key_len /= 8;
174*cd255ccfSMarko Kovacevic 
175*cd255ccfSMarko Kovacevic 			continue;
176*cd255ccfSMarko Kovacevic 		}
177*cd255ccfSMarko Kovacevic 	}
178*cd255ccfSMarko Kovacevic 
179*cd255ccfSMarko Kovacevic 	info.parse_writeback = parse_test_aes_writeback;
180*cd255ccfSMarko Kovacevic 	info.callbacks = aes_tests_vectors;
181*cd255ccfSMarko Kovacevic 	info.interim_callbacks = aes_tests_interim_vectors;
182*cd255ccfSMarko Kovacevic 	info.writeback_callbacks = aes_writeback_callbacks;
183*cd255ccfSMarko Kovacevic 	info.kat_check = rsp_test_aes_check;
184*cd255ccfSMarko Kovacevic 
185*cd255ccfSMarko Kovacevic 	return 0;
186*cd255ccfSMarko Kovacevic }
187