1f64adb67SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2f64adb67SMarko Kovacevic * Copyright(c) 2018 Intel Corporation
3f64adb67SMarko Kovacevic */
4f64adb67SMarko Kovacevic
5f64adb67SMarko Kovacevic #include <string.h>
6f64adb67SMarko Kovacevic #include <time.h>
7f64adb67SMarko Kovacevic #include <stdio.h>
8f64adb67SMarko Kovacevic
9f64adb67SMarko Kovacevic #include <rte_cryptodev.h>
10f64adb67SMarko Kovacevic
11f64adb67SMarko Kovacevic #include "fips_validation.h"
12f64adb67SMarko Kovacevic
13f64adb67SMarko Kovacevic #define ALGO_PREFIX "[L="
14f64adb67SMarko Kovacevic #define KEYLEN_STR "Klen = "
15f64adb67SMarko Kovacevic #define TAGLEN_STR "Tlen = "
16f64adb67SMarko Kovacevic
17f64adb67SMarko Kovacevic #define COUNT_STR "Count = "
18f64adb67SMarko Kovacevic #define KEY_STR "Key = "
19f64adb67SMarko Kovacevic #define PT_STR "Msg = "
20f64adb67SMarko Kovacevic #define TAG_STR "Mac = "
21f64adb67SMarko Kovacevic
22443c93d8SBrandon Lo #define ALGO_JSON_STR "algorithm"
23443c93d8SBrandon Lo
24443c93d8SBrandon Lo #define KEYLEN_JSON_STR "keyLen"
25443c93d8SBrandon Lo #define TAGLEN_JSON_STR "macLen"
26443c93d8SBrandon Lo
27443c93d8SBrandon Lo #define KEY_JSON_STR "key"
28443c93d8SBrandon Lo #define PT_JSON_STR "msg"
29443c93d8SBrandon Lo #define TAG_JSON_STR "mac"
30443c93d8SBrandon Lo
31f64adb67SMarko Kovacevic struct hash_size_conversion {
32f64adb67SMarko Kovacevic const char *str;
33f64adb67SMarko Kovacevic enum rte_crypto_auth_algorithm algo;
34f64adb67SMarko Kovacevic } hsc[] = {
35f64adb67SMarko Kovacevic {"20", RTE_CRYPTO_AUTH_SHA1_HMAC},
36f64adb67SMarko Kovacevic {"28", RTE_CRYPTO_AUTH_SHA224_HMAC},
37f64adb67SMarko Kovacevic {"32", RTE_CRYPTO_AUTH_SHA256_HMAC},
38f64adb67SMarko Kovacevic {"48", RTE_CRYPTO_AUTH_SHA384_HMAC},
39f64adb67SMarko Kovacevic {"64", RTE_CRYPTO_AUTH_SHA512_HMAC},
40*1ea7940eSGowrishankar Muthukrishnan {"28", RTE_CRYPTO_AUTH_SHA3_224_HMAC},
41*1ea7940eSGowrishankar Muthukrishnan {"32", RTE_CRYPTO_AUTH_SHA3_256_HMAC},
42*1ea7940eSGowrishankar Muthukrishnan {"48", RTE_CRYPTO_AUTH_SHA3_384_HMAC},
43*1ea7940eSGowrishankar Muthukrishnan {"64", RTE_CRYPTO_AUTH_SHA3_512_HMAC},
44f64adb67SMarko Kovacevic };
45f64adb67SMarko Kovacevic
46f64adb67SMarko Kovacevic static int
parse_interim_algo(__rte_unused const char * key,char * text,__rte_unused struct fips_val * val)47f2fc83b4SThomas Monjalon parse_interim_algo(__rte_unused const char *key,
48f64adb67SMarko Kovacevic char *text,
49f2fc83b4SThomas Monjalon __rte_unused struct fips_val *val)
50f64adb67SMarko Kovacevic {
51f64adb67SMarko Kovacevic
52f64adb67SMarko Kovacevic uint32_t i;
53f64adb67SMarko Kovacevic
54f64adb67SMarko Kovacevic for (i = 0; i < RTE_DIM(hsc); i++) {
55f64adb67SMarko Kovacevic if (strstr(text, hsc[i].str)) {
56f64adb67SMarko Kovacevic info.interim_info.hmac_data.algo = hsc[i].algo;
57f64adb67SMarko Kovacevic break;
58f64adb67SMarko Kovacevic }
59f64adb67SMarko Kovacevic }
60f64adb67SMarko Kovacevic
61f64adb67SMarko Kovacevic if (i == RTE_DIM(hsc))
62f64adb67SMarko Kovacevic return -1;
63f64adb67SMarko Kovacevic
64f64adb67SMarko Kovacevic return 0;
65f64adb67SMarko Kovacevic }
66f64adb67SMarko Kovacevic
67f64adb67SMarko Kovacevic struct fips_test_callback hmac_tests_vectors[] = {
68f64adb67SMarko Kovacevic {KEYLEN_STR, parser_read_uint32_val, &vec.cipher_auth.key},
69f64adb67SMarko Kovacevic {TAGLEN_STR, parser_read_uint32_val, &vec.cipher_auth.digest},
70f64adb67SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
71f64adb67SMarko Kovacevic {PT_STR, parse_uint8_hex_str, &vec.pt},
72f64adb67SMarko Kovacevic {TAG_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
73f64adb67SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */
74f64adb67SMarko Kovacevic };
75f64adb67SMarko Kovacevic
76f64adb67SMarko Kovacevic struct fips_test_callback hmac_tests_interim_vectors[] = {
77f64adb67SMarko Kovacevic {ALGO_PREFIX, parse_interim_algo, NULL},
78f64adb67SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */
79f64adb67SMarko Kovacevic };
80f64adb67SMarko Kovacevic
818d70a194SDavid Marchand #ifdef USE_JANSSON
82443c93d8SBrandon Lo struct hash_size_conversion json_algorithms[] = {
83443c93d8SBrandon Lo {"HMAC-SHA-1", RTE_CRYPTO_AUTH_SHA1_HMAC},
84443c93d8SBrandon Lo {"HMAC-SHA2-224", RTE_CRYPTO_AUTH_SHA224_HMAC},
85443c93d8SBrandon Lo {"HMAC-SHA2-256", RTE_CRYPTO_AUTH_SHA256_HMAC},
86443c93d8SBrandon Lo {"HMAC-SHA2-384", RTE_CRYPTO_AUTH_SHA384_HMAC},
87443c93d8SBrandon Lo {"HMAC-SHA2-512", RTE_CRYPTO_AUTH_SHA512_HMAC},
88*1ea7940eSGowrishankar Muthukrishnan {"HMAC-SHA3-224", RTE_CRYPTO_AUTH_SHA3_224_HMAC},
89*1ea7940eSGowrishankar Muthukrishnan {"HMAC-SHA3-256", RTE_CRYPTO_AUTH_SHA3_256_HMAC},
90*1ea7940eSGowrishankar Muthukrishnan {"HMAC-SHA3-384", RTE_CRYPTO_AUTH_SHA3_384_HMAC},
91*1ea7940eSGowrishankar Muthukrishnan {"HMAC-SHA3-512", RTE_CRYPTO_AUTH_SHA3_512_HMAC},
92443c93d8SBrandon Lo };
93443c93d8SBrandon Lo
94443c93d8SBrandon Lo struct fips_test_callback hmac_tests_json_vectors[] = {
95443c93d8SBrandon Lo {KEY_JSON_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
96443c93d8SBrandon Lo {PT_JSON_STR, parse_uint8_hex_str, &vec.pt},
97443c93d8SBrandon Lo {TAG_JSON_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
98443c93d8SBrandon Lo {NULL, NULL, NULL} /**< end pointer */
99443c93d8SBrandon Lo };
100443c93d8SBrandon Lo
101443c93d8SBrandon Lo struct fips_test_callback hmac_tests_interim_json_vectors[] = {
102443c93d8SBrandon Lo {KEYLEN_JSON_STR, parser_read_uint32_val, &vec.cipher_auth.key},
103443c93d8SBrandon Lo {TAGLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.digest},
104443c93d8SBrandon Lo {NULL, NULL, NULL} /**< end pointer */
105443c93d8SBrandon Lo };
1068d70a194SDavid Marchand #endif /* USE_JANSSON */
107443c93d8SBrandon Lo
108f64adb67SMarko Kovacevic static int
parse_test_hmac_writeback(struct fips_val * val)109f64adb67SMarko Kovacevic parse_test_hmac_writeback(struct fips_val *val)
110f64adb67SMarko Kovacevic {
111f64adb67SMarko Kovacevic struct fips_val val_local;
112f64adb67SMarko Kovacevic
113f64adb67SMarko Kovacevic fprintf(info.fp_wr, "%s", TAG_STR);
114f64adb67SMarko Kovacevic
115f64adb67SMarko Kovacevic val_local.val = val->val + vec.pt.len;
116f64adb67SMarko Kovacevic val_local.len = vec.cipher_auth.digest.len;
117f64adb67SMarko Kovacevic
118f64adb67SMarko Kovacevic parse_write_hex_str(&val_local);
119f64adb67SMarko Kovacevic return 0;
120f64adb67SMarko Kovacevic }
121f64adb67SMarko Kovacevic
122f64adb67SMarko Kovacevic static int
rsp_test_hmac_check(struct fips_val * val)123f64adb67SMarko Kovacevic rsp_test_hmac_check(struct fips_val *val)
124f64adb67SMarko Kovacevic {
125f64adb67SMarko Kovacevic if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val,
126f64adb67SMarko Kovacevic vec.cipher_auth.digest.len) == 0)
127f64adb67SMarko Kovacevic fprintf(info.fp_wr, "Success\n");
128f64adb67SMarko Kovacevic else
129f64adb67SMarko Kovacevic fprintf(info.fp_wr, "Failed\n");
130f64adb67SMarko Kovacevic
131f64adb67SMarko Kovacevic return 0;
132f64adb67SMarko Kovacevic }
133f64adb67SMarko Kovacevic
134f64adb67SMarko Kovacevic int
parse_test_hmac_init(void)135f64adb67SMarko Kovacevic parse_test_hmac_init(void)
136f64adb67SMarko Kovacevic {
137f64adb67SMarko Kovacevic info.op = FIPS_TEST_ENC_AUTH_GEN;
138f64adb67SMarko Kovacevic info.parse_writeback = parse_test_hmac_writeback;
139f64adb67SMarko Kovacevic info.callbacks = hmac_tests_vectors;
140f64adb67SMarko Kovacevic info.interim_callbacks = hmac_tests_interim_vectors;
141f64adb67SMarko Kovacevic info.writeback_callbacks = NULL;
142f64adb67SMarko Kovacevic info.kat_check = rsp_test_hmac_check;
143f64adb67SMarko Kovacevic
144f64adb67SMarko Kovacevic return 0;
145f64adb67SMarko Kovacevic }
146443c93d8SBrandon Lo
1478d70a194SDavid Marchand #ifdef USE_JANSSON
148443c93d8SBrandon Lo static int
parse_test_hmac_json_writeback(struct fips_val * val)149443c93d8SBrandon Lo parse_test_hmac_json_writeback(struct fips_val *val)
150443c93d8SBrandon Lo {
151443c93d8SBrandon Lo struct fips_val val_local;
152443c93d8SBrandon Lo json_t *tcId, *mac;
153443c93d8SBrandon Lo
154443c93d8SBrandon Lo tcId = json_object_get(json_info.json_test_case, "tcId");
155443c93d8SBrandon Lo
156443c93d8SBrandon Lo json_info.json_write_case = json_object();
157443c93d8SBrandon Lo json_object_set(json_info.json_write_case, "tcId", tcId);
158443c93d8SBrandon Lo
159443c93d8SBrandon Lo
160443c93d8SBrandon Lo val_local.val = val->val + vec.pt.len;
161443c93d8SBrandon Lo val_local.len = vec.cipher_auth.digest.len;
162443c93d8SBrandon Lo
163443c93d8SBrandon Lo writeback_hex_str("", info.one_line_text, &val_local);
164443c93d8SBrandon Lo
165443c93d8SBrandon Lo mac = json_string(info.one_line_text);
166443c93d8SBrandon Lo json_object_set_new(json_info.json_write_case, TAG_JSON_STR, mac);
167443c93d8SBrandon Lo
168443c93d8SBrandon Lo return 0;
169443c93d8SBrandon Lo }
170443c93d8SBrandon Lo
171443c93d8SBrandon Lo int
parse_test_hmac_json_algorithm(void)172443c93d8SBrandon Lo parse_test_hmac_json_algorithm(void)
173443c93d8SBrandon Lo {
174443c93d8SBrandon Lo json_t *algorithm_object;
175443c93d8SBrandon Lo const char *algorithm_str;
176443c93d8SBrandon Lo uint32_t i;
177443c93d8SBrandon Lo
178443c93d8SBrandon Lo algorithm_object = json_object_get(json_info.json_vector_set, "algorithm");
179443c93d8SBrandon Lo algorithm_str = json_string_value(algorithm_object);
180443c93d8SBrandon Lo
181443c93d8SBrandon Lo for (i = 0; i < RTE_DIM(json_algorithms); i++) {
182443c93d8SBrandon Lo if (strstr(algorithm_str, json_algorithms[i].str)) {
183443c93d8SBrandon Lo info.interim_info.hmac_data.algo = json_algorithms[i].algo;
184443c93d8SBrandon Lo return 0;
185443c93d8SBrandon Lo }
186443c93d8SBrandon Lo }
187443c93d8SBrandon Lo
188443c93d8SBrandon Lo return -1;
189443c93d8SBrandon Lo }
190443c93d8SBrandon Lo
191443c93d8SBrandon Lo int
parse_test_hmac_json_init(void)192443c93d8SBrandon Lo parse_test_hmac_json_init(void)
193443c93d8SBrandon Lo {
194443c93d8SBrandon Lo info.op = FIPS_TEST_ENC_AUTH_GEN;
195443c93d8SBrandon Lo info.parse_writeback = parse_test_hmac_json_writeback;
196443c93d8SBrandon Lo info.callbacks = hmac_tests_json_vectors;
197443c93d8SBrandon Lo info.writeback_callbacks = NULL;
198443c93d8SBrandon Lo info.kat_check = rsp_test_hmac_check;
199443c93d8SBrandon Lo info.interim_callbacks = hmac_tests_interim_json_vectors;
200443c93d8SBrandon Lo
201443c93d8SBrandon Lo if (parse_test_hmac_json_algorithm() < 0)
202443c93d8SBrandon Lo return -1;
203443c93d8SBrandon Lo
204443c93d8SBrandon Lo return 0;
205443c93d8SBrandon Lo }
2068d70a194SDavid Marchand #endif /* USE_JANSSON */
207