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