1ac026f46SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2ac026f46SMarko Kovacevic * Copyright(c) 2018 Intel Corporation
3ac026f46SMarko Kovacevic */
4ac026f46SMarko Kovacevic
5ac026f46SMarko Kovacevic #include <string.h>
6ac026f46SMarko Kovacevic #include <time.h>
7ac026f46SMarko Kovacevic #include <stdio.h>
8ac026f46SMarko Kovacevic #include <rte_string_fns.h>
9ac026f46SMarko Kovacevic
10ac026f46SMarko Kovacevic #include <rte_cryptodev.h>
11ac026f46SMarko Kovacevic
12ac026f46SMarko Kovacevic #include "fips_validation.h"
13ac026f46SMarko Kovacevic
14ac026f46SMarko Kovacevic #define NEW_LINE_STR "#"
15ac026f46SMarko Kovacevic #define OP_STR "CMAC"
16ac026f46SMarko Kovacevic
17ac026f46SMarko Kovacevic #define ALGO_STR "Alg = "
18ac026f46SMarko Kovacevic #define MODE_STR "Mode = "
19ac026f46SMarko Kovacevic
20ac026f46SMarko Kovacevic #define COUNT_STR "Count = "
21ac026f46SMarko Kovacevic #define KLEN_STR "Klen = "
22ac026f46SMarko Kovacevic #define PTLEN_STR "Mlen = "
23ac026f46SMarko Kovacevic #define TAGLEN_STR "Tlen = "
24ac026f46SMarko Kovacevic #define KEY_STR "Key = "
25ac026f46SMarko Kovacevic #define PT_STR "Msg = "
26ac026f46SMarko Kovacevic #define TAG_STR "Mac = "
27ac026f46SMarko Kovacevic
28ac026f46SMarko Kovacevic #define GEN_STR "Generate"
29ac026f46SMarko Kovacevic #define VERIF_STR "Verify"
30ac026f46SMarko Kovacevic
31ac026f46SMarko Kovacevic #define POS_NEG_STR "Result = "
32ac026f46SMarko Kovacevic #define PASS_STR "P"
33ac026f46SMarko Kovacevic #define FAIL_STR "F"
34ac026f46SMarko Kovacevic
35d3b50557SBrandon Lo #define KLEN_JSON_STR "keyLen"
36d3b50557SBrandon Lo #define PTLEN_JSON_STR "msgLen"
37d3b50557SBrandon Lo #define TAGLEN_JSON_STR "macLen"
38d3b50557SBrandon Lo #define KEY_JSON_STR "key"
39d3b50557SBrandon Lo #define PT_JSON_STR "message"
40d3b50557SBrandon Lo #define TAG_JSON_STR "mac"
41d3b50557SBrandon Lo #define DIRECTION_JSON_STR "direction"
42d3b50557SBrandon Lo #define POS_NEG_JSON_STR "testPassed"
43d3b50557SBrandon Lo
44d3b50557SBrandon Lo #define GEN_JSON_STR "gen"
45d3b50557SBrandon Lo #define VERIF_JSON_STR "ver"
46d3b50557SBrandon Lo
47ac026f46SMarko Kovacevic struct hash_algo_conversion {
48ac026f46SMarko Kovacevic const char *str;
49ac026f46SMarko Kovacevic enum fips_test_algorithms algo;
50ac026f46SMarko Kovacevic } cmac_algo[] = {
51ac026f46SMarko Kovacevic {"AES", FIPS_TEST_ALGO_AES_CMAC},
52ac026f46SMarko Kovacevic };
53ac026f46SMarko Kovacevic
54*8d70a194SDavid Marchand #ifdef USE_JANSSON
55d3b50557SBrandon Lo static int
parser_read_cmac_direction_str(__rte_unused const char * key,char * src,__rte_unused struct fips_val * val)56d3b50557SBrandon Lo parser_read_cmac_direction_str(__rte_unused const char *key, char *src,
57d3b50557SBrandon Lo __rte_unused struct fips_val *val)
58d3b50557SBrandon Lo {
59d3b50557SBrandon Lo if (strcmp(src, "gen") == 0)
60d3b50557SBrandon Lo info.op = FIPS_TEST_ENC_AUTH_GEN;
61d3b50557SBrandon Lo else if (strcmp(src, "ver") == 0)
62d3b50557SBrandon Lo info.op = FIPS_TEST_DEC_AUTH_VERIF;
63d3b50557SBrandon Lo
64d3b50557SBrandon Lo return 0;
65d3b50557SBrandon Lo }
66d3b50557SBrandon Lo
67d3b50557SBrandon Lo struct fips_test_callback cmac_tests_interim_json_vectors[] = {
68d3b50557SBrandon Lo {KLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.key},
69d3b50557SBrandon Lo {PTLEN_JSON_STR, parser_read_uint32_bit_val, &vec.pt},
70d3b50557SBrandon Lo {TAGLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.digest},
71d3b50557SBrandon Lo {DIRECTION_JSON_STR, parser_read_cmac_direction_str, NULL},
72d3b50557SBrandon Lo {NULL, NULL, NULL} /**< end pointer */
73d3b50557SBrandon Lo };
74d3b50557SBrandon Lo
75d3b50557SBrandon Lo struct fips_test_callback cmac_tests_json_vectors[] = {
76d3b50557SBrandon Lo {KEY_JSON_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
77d3b50557SBrandon Lo {PT_JSON_STR, parse_uint8_known_len_hex_str, &vec.pt},
78d3b50557SBrandon Lo {TAG_JSON_STR, parse_uint8_known_len_hex_str,
79d3b50557SBrandon Lo &vec.cipher_auth.digest},
80d3b50557SBrandon Lo {NULL, NULL, NULL} /**< end pointer */
81d3b50557SBrandon Lo };
82d3b50557SBrandon Lo
83d3b50557SBrandon Lo static int
parse_test_cmac_json_writeback(struct fips_val * val)84d3b50557SBrandon Lo parse_test_cmac_json_writeback(struct fips_val *val)
85d3b50557SBrandon Lo {
86d3b50557SBrandon Lo json_info.json_write_case = json_object();
87d3b50557SBrandon Lo json_object_set(json_info.json_write_case, "tcId",
88d3b50557SBrandon Lo json_object_get(json_info.json_test_case, "tcId"));
89d3b50557SBrandon Lo
90d3b50557SBrandon Lo if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
91d3b50557SBrandon Lo struct fips_val tmp_val = {val->val + vec.pt.len,
92d3b50557SBrandon Lo vec.cipher_auth.digest.len};
93d3b50557SBrandon Lo
94d3b50557SBrandon Lo writeback_hex_str("", info.one_line_text, &tmp_val);
95d3b50557SBrandon Lo json_object_set_new(json_info.json_write_case, TAG_JSON_STR,
96d3b50557SBrandon Lo json_string(info.one_line_text));
97d3b50557SBrandon Lo } else {
98d3b50557SBrandon Lo if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS)
99d3b50557SBrandon Lo json_object_set_new(json_info.json_write_case, POS_NEG_JSON_STR,
100d3b50557SBrandon Lo json_boolean(true));
101d3b50557SBrandon Lo else if (vec.status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED)
102d3b50557SBrandon Lo json_object_set_new(json_info.json_write_case, POS_NEG_JSON_STR,
103d3b50557SBrandon Lo json_boolean(false));
104d3b50557SBrandon Lo }
105d3b50557SBrandon Lo
106d3b50557SBrandon Lo return 0;
107d3b50557SBrandon Lo }
108d3b50557SBrandon Lo
109d3b50557SBrandon Lo int
parse_test_cmac_json_init(void)110d3b50557SBrandon Lo parse_test_cmac_json_init(void)
111d3b50557SBrandon Lo {
112d3b50557SBrandon Lo info.algo = FIPS_TEST_ALGO_AES_CMAC;
113d3b50557SBrandon Lo
114d3b50557SBrandon Lo info.parse_writeback = parse_test_cmac_json_writeback;
115d3b50557SBrandon Lo info.callbacks = cmac_tests_json_vectors;
116d3b50557SBrandon Lo info.interim_callbacks = cmac_tests_interim_json_vectors;
117d3b50557SBrandon Lo
118d3b50557SBrandon Lo return 0;
119d3b50557SBrandon Lo }
120*8d70a194SDavid Marchand #endif /* USE_JANSSON */
121d3b50557SBrandon Lo
122ac026f46SMarko Kovacevic static int
parse_test_cmac_writeback(struct fips_val * val)123ac026f46SMarko Kovacevic parse_test_cmac_writeback(struct fips_val *val)
124ac026f46SMarko Kovacevic {
125ac026f46SMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
126ac026f46SMarko Kovacevic struct fips_val tmp_val = {val->val + vec.pt.len,
127ac026f46SMarko Kovacevic vec.cipher_auth.digest.len};
128ac026f46SMarko Kovacevic
129ac026f46SMarko Kovacevic fprintf(info.fp_wr, "%s", TAG_STR);
130ac026f46SMarko Kovacevic parse_write_hex_str(&tmp_val);
131ac026f46SMarko Kovacevic } else {
132ac026f46SMarko Kovacevic fprintf(info.fp_wr, "%s", POS_NEG_STR);
133ac026f46SMarko Kovacevic
134ac026f46SMarko Kovacevic if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS)
135ac026f46SMarko Kovacevic fprintf(info.fp_wr, "%s\n", PASS_STR);
136ac026f46SMarko Kovacevic else if (vec.status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED)
137ac026f46SMarko Kovacevic fprintf(info.fp_wr, "%s\n", FAIL_STR);
138ac026f46SMarko Kovacevic else
139ac026f46SMarko Kovacevic fprintf(info.fp_wr, "Error\n");
140ac026f46SMarko Kovacevic }
141ac026f46SMarko Kovacevic
142ac026f46SMarko Kovacevic return 0;
143ac026f46SMarko Kovacevic }
144ac026f46SMarko Kovacevic
145ac026f46SMarko Kovacevic struct fips_test_callback cmac_tests_vectors[] = {
146ac026f46SMarko Kovacevic {KLEN_STR, parser_read_uint32_val, &vec.cipher_auth.key},
147ac026f46SMarko Kovacevic {PTLEN_STR, parser_read_uint32_val, &vec.pt},
148ac026f46SMarko Kovacevic {TAGLEN_STR, parser_read_uint32_val, &vec.cipher_auth.digest},
149ac026f46SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
150ac026f46SMarko Kovacevic {PT_STR, parse_uint8_known_len_hex_str, &vec.pt},
151ac026f46SMarko Kovacevic {TAG_STR, parse_uint8_known_len_hex_str,
152ac026f46SMarko Kovacevic &vec.cipher_auth.digest},
153ac026f46SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */
154ac026f46SMarko Kovacevic };
155ac026f46SMarko Kovacevic
156ac026f46SMarko Kovacevic int
parse_test_cmac_init(void)157ac026f46SMarko Kovacevic parse_test_cmac_init(void)
158ac026f46SMarko Kovacevic {
159ac026f46SMarko Kovacevic char *tmp;
160ac026f46SMarko Kovacevic uint32_t i, j;
161ac026f46SMarko Kovacevic
162ac026f46SMarko Kovacevic for (i = 0; i < info.nb_vec_lines; i++) {
163ac026f46SMarko Kovacevic char *line = info.vec[i];
164ac026f46SMarko Kovacevic
165ac026f46SMarko Kovacevic tmp = strstr(line, ALGO_STR);
166ac026f46SMarko Kovacevic if (!tmp)
167ac026f46SMarko Kovacevic continue;
168ac026f46SMarko Kovacevic
169ac026f46SMarko Kovacevic for (j = 0; j < RTE_DIM(cmac_algo); j++) {
170ac026f46SMarko Kovacevic if (!strstr(line, cmac_algo[j].str))
171ac026f46SMarko Kovacevic continue;
172ac026f46SMarko Kovacevic
173ac026f46SMarko Kovacevic info.algo = cmac_algo[j].algo;
174ac026f46SMarko Kovacevic break;
175ac026f46SMarko Kovacevic }
176ac026f46SMarko Kovacevic
177ac026f46SMarko Kovacevic if (j == RTE_DIM(cmac_algo))
178ac026f46SMarko Kovacevic return -EINVAL;
179ac026f46SMarko Kovacevic
180ac026f46SMarko Kovacevic tmp = strstr(line, MODE_STR);
181ac026f46SMarko Kovacevic if (!tmp)
182ac026f46SMarko Kovacevic return -1;
183ac026f46SMarko Kovacevic
184ac026f46SMarko Kovacevic if (strstr(tmp, GEN_STR))
185ac026f46SMarko Kovacevic info.op = FIPS_TEST_ENC_AUTH_GEN;
186ac026f46SMarko Kovacevic else if (strstr(tmp, VERIF_STR))
187ac026f46SMarko Kovacevic info.op = FIPS_TEST_DEC_AUTH_VERIF;
188ac026f46SMarko Kovacevic else
189ac026f46SMarko Kovacevic return -EINVAL;
190ac026f46SMarko Kovacevic }
191ac026f46SMarko Kovacevic
192ac026f46SMarko Kovacevic info.parse_writeback = parse_test_cmac_writeback;
193ac026f46SMarko Kovacevic info.callbacks = cmac_tests_vectors;
194ac026f46SMarko Kovacevic
195ac026f46SMarko Kovacevic return 0;
196ac026f46SMarko Kovacevic }
197