1*d5a9ea55SSucharitha Sarananaga /* SPDX-License-Identifier: BSD-3-Clause
2*d5a9ea55SSucharitha Sarananaga  * Copyright (C) 2020 Marvell International Ltd.
3*d5a9ea55SSucharitha Sarananaga  */
4*d5a9ea55SSucharitha Sarananaga 
5*d5a9ea55SSucharitha Sarananaga #include <string.h>
6*d5a9ea55SSucharitha Sarananaga #include <stdio.h>
7*d5a9ea55SSucharitha Sarananaga #include <time.h>
8*d5a9ea55SSucharitha Sarananaga 
9*d5a9ea55SSucharitha Sarananaga #include <rte_cryptodev.h>
10*d5a9ea55SSucharitha Sarananaga 
11*d5a9ea55SSucharitha Sarananaga #include "fips_validation.h"
12*d5a9ea55SSucharitha Sarananaga 
13*d5a9ea55SSucharitha Sarananaga #define MODE_STR	"XTS"
14*d5a9ea55SSucharitha Sarananaga #define ALGO_STR	"test data for "
15*d5a9ea55SSucharitha Sarananaga #define OP_STR		"State"
16*d5a9ea55SSucharitha Sarananaga #define KEY_SIZE_STR	"Key Length : "
17*d5a9ea55SSucharitha Sarananaga 
18*d5a9ea55SSucharitha Sarananaga #define COUNT_STR	"COUNT = "
19*d5a9ea55SSucharitha Sarananaga #define KEY_STR		"Key = "
20*d5a9ea55SSucharitha Sarananaga #define IV_STR		"i = "
21*d5a9ea55SSucharitha Sarananaga #define PT_STR		"PT = "
22*d5a9ea55SSucharitha Sarananaga #define CT_STR		"CT = "
23*d5a9ea55SSucharitha Sarananaga 
24*d5a9ea55SSucharitha Sarananaga #define OP_ENC_STR	"ENCRYPT"
25*d5a9ea55SSucharitha Sarananaga #define OP_DEC_STR	"DECRYPT"
26*d5a9ea55SSucharitha Sarananaga 
27*d5a9ea55SSucharitha Sarananaga static int
parse_interim_xts_enc_dec(const char * key,__rte_unused char * text,__rte_unused struct fips_val * val)28*d5a9ea55SSucharitha Sarananaga parse_interim_xts_enc_dec(const char *key,
29*d5a9ea55SSucharitha Sarananaga 		__rte_unused char *text,
30*d5a9ea55SSucharitha Sarananaga 		__rte_unused struct fips_val *val)
31*d5a9ea55SSucharitha Sarananaga {
32*d5a9ea55SSucharitha Sarananaga 	if (strcmp(key, OP_ENC_STR) == 0)
33*d5a9ea55SSucharitha Sarananaga 		info.op = FIPS_TEST_ENC_AUTH_GEN;
34*d5a9ea55SSucharitha Sarananaga 	else if (strcmp(key, OP_DEC_STR) == 0)
35*d5a9ea55SSucharitha Sarananaga 		info.op = FIPS_TEST_DEC_AUTH_VERIF;
36*d5a9ea55SSucharitha Sarananaga 	else
37*d5a9ea55SSucharitha Sarananaga 		return -1;
38*d5a9ea55SSucharitha Sarananaga 	return 0;
39*d5a9ea55SSucharitha Sarananaga }
40*d5a9ea55SSucharitha Sarananaga 
41*d5a9ea55SSucharitha Sarananaga struct fips_test_callback xts_tests_vectors[] = {
42*d5a9ea55SSucharitha Sarananaga 		{KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
43*d5a9ea55SSucharitha Sarananaga 		{IV_STR, parse_uint8_hex_str, &vec.iv},
44*d5a9ea55SSucharitha Sarananaga 		{PT_STR, parse_uint8_hex_str, &vec.pt},
45*d5a9ea55SSucharitha Sarananaga 		{CT_STR, parse_uint8_hex_str, &vec.ct},
46*d5a9ea55SSucharitha Sarananaga 		{NULL, NULL, NULL} /**< end pointer */
47*d5a9ea55SSucharitha Sarananaga };
48*d5a9ea55SSucharitha Sarananaga 
49*d5a9ea55SSucharitha Sarananaga struct fips_test_callback xts_tests_interim_vectors[] = {
50*d5a9ea55SSucharitha Sarananaga 		{OP_ENC_STR, parse_interim_xts_enc_dec, NULL},
51*d5a9ea55SSucharitha Sarananaga 		{OP_DEC_STR, parse_interim_xts_enc_dec, NULL},
52*d5a9ea55SSucharitha Sarananaga 		{NULL, NULL, NULL} /**< end pointer */
53*d5a9ea55SSucharitha Sarananaga };
54*d5a9ea55SSucharitha Sarananaga 
55*d5a9ea55SSucharitha Sarananaga struct fips_test_callback xts_writeback_callbacks[] = {
56*d5a9ea55SSucharitha Sarananaga 		/** First element is used to pass COUNT string */
57*d5a9ea55SSucharitha Sarananaga 		{COUNT_STR, NULL, NULL},
58*d5a9ea55SSucharitha Sarananaga 		{IV_STR, writeback_hex_str, &vec.iv},
59*d5a9ea55SSucharitha Sarananaga 		{KEY_STR, writeback_hex_str, &vec.cipher_auth.key},
60*d5a9ea55SSucharitha Sarananaga 		{PT_STR, writeback_hex_str, &vec.pt},
61*d5a9ea55SSucharitha Sarananaga 		{CT_STR, writeback_hex_str, &vec.ct},
62*d5a9ea55SSucharitha Sarananaga 		{NULL, NULL, NULL} /**< end pointer */
63*d5a9ea55SSucharitha Sarananaga };
64*d5a9ea55SSucharitha Sarananaga 
65*d5a9ea55SSucharitha Sarananaga static int
parse_test_xts_writeback(struct fips_val * val)66*d5a9ea55SSucharitha Sarananaga parse_test_xts_writeback(struct fips_val *val)
67*d5a9ea55SSucharitha Sarananaga {
68*d5a9ea55SSucharitha Sarananaga 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
69*d5a9ea55SSucharitha Sarananaga 		fprintf(info.fp_wr, "%s", CT_STR);
70*d5a9ea55SSucharitha Sarananaga 	else
71*d5a9ea55SSucharitha Sarananaga 		fprintf(info.fp_wr, "%s", PT_STR);
72*d5a9ea55SSucharitha Sarananaga 
73*d5a9ea55SSucharitha Sarananaga 	parse_write_hex_str(val);
74*d5a9ea55SSucharitha Sarananaga 	return 0;
75*d5a9ea55SSucharitha Sarananaga }
76*d5a9ea55SSucharitha Sarananaga 
77*d5a9ea55SSucharitha Sarananaga static int
rsp_test_xts_check(struct fips_val * val)78*d5a9ea55SSucharitha Sarananaga rsp_test_xts_check(struct fips_val *val)
79*d5a9ea55SSucharitha Sarananaga {
80*d5a9ea55SSucharitha Sarananaga 	struct fips_val *data;
81*d5a9ea55SSucharitha Sarananaga 	if (info.op == FIPS_TEST_ENC_AUTH_GEN)
82*d5a9ea55SSucharitha Sarananaga 		data = &vec.ct;
83*d5a9ea55SSucharitha Sarananaga 	else
84*d5a9ea55SSucharitha Sarananaga 		data = &vec.pt;
85*d5a9ea55SSucharitha Sarananaga 
86*d5a9ea55SSucharitha Sarananaga 	if (memcmp(val->val, data->val, val->len) == 0)
87*d5a9ea55SSucharitha Sarananaga 		fprintf(info.fp_wr, "Success\n");
88*d5a9ea55SSucharitha Sarananaga 	else
89*d5a9ea55SSucharitha Sarananaga 		fprintf(info.fp_wr, "Failed\n");
90*d5a9ea55SSucharitha Sarananaga 	return 0;
91*d5a9ea55SSucharitha Sarananaga }
92*d5a9ea55SSucharitha Sarananaga 
parse_test_xts_init(void)93*d5a9ea55SSucharitha Sarananaga int parse_test_xts_init(void)
94*d5a9ea55SSucharitha Sarananaga {
95*d5a9ea55SSucharitha Sarananaga 	char *tmp;
96*d5a9ea55SSucharitha Sarananaga 	uint32_t i;
97*d5a9ea55SSucharitha Sarananaga 	for (i = 0; i < info.nb_vec_lines; i++) {
98*d5a9ea55SSucharitha Sarananaga 		char *line = info.vec[i];
99*d5a9ea55SSucharitha Sarananaga 		tmp = strstr(line, KEY_SIZE_STR);
100*d5a9ea55SSucharitha Sarananaga 		if (tmp) {
101*d5a9ea55SSucharitha Sarananaga 			tmp += (strlen(KEY_SIZE_STR) + strlen("AES"));
102*d5a9ea55SSucharitha Sarananaga 			if (parser_read_uint32(
103*d5a9ea55SSucharitha Sarananaga 				&info.interim_info.aes_data.key_len,
104*d5a9ea55SSucharitha Sarananaga 					tmp) < 0)
105*d5a9ea55SSucharitha Sarananaga 				return -EINVAL;
106*d5a9ea55SSucharitha Sarananaga 			info.interim_info.aes_data.key_len =
107*d5a9ea55SSucharitha Sarananaga 			(info.interim_info.aes_data.key_len*2) / 8;
108*d5a9ea55SSucharitha Sarananaga 			continue;
109*d5a9ea55SSucharitha Sarananaga 		}
110*d5a9ea55SSucharitha Sarananaga 
111*d5a9ea55SSucharitha Sarananaga 	}
112*d5a9ea55SSucharitha Sarananaga 	info.parse_writeback = parse_test_xts_writeback;
113*d5a9ea55SSucharitha Sarananaga 	info.callbacks = xts_tests_vectors;
114*d5a9ea55SSucharitha Sarananaga 	info.interim_callbacks = xts_tests_interim_vectors;
115*d5a9ea55SSucharitha Sarananaga 	info.writeback_callbacks = xts_writeback_callbacks;
116*d5a9ea55SSucharitha Sarananaga 	info.kat_check = rsp_test_xts_check;
117*d5a9ea55SSucharitha Sarananaga 
118*d5a9ea55SSucharitha Sarananaga 	return 0;
119*d5a9ea55SSucharitha Sarananaga }
120