]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/dpdk/examples/fips_validation/fips_validation.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Intel Corporation
8 #include <rte_string_fns.h>
9 #include <rte_cryptodev.h>
10 #include <rte_malloc.h>
12 #include "fips_validation.h"
14 #define skip_white_spaces(pos) \
16 __typeof__(pos) _p = (pos); \
17 for ( ; isspace(*_p); _p++) \
25 FILE *fp
= info
.fp_rd
;
26 char *line
= info
.one_line_text
;
30 memset(line
, 0, MAX_LINE_CHAR
);
31 while ((ret
= fgetc(fp
)) != EOF
) {
34 if (loc
>= MAX_LINE_CHAR
- 1)
48 fips_test_fetch_one_block(void)
54 for (i
= 0; i
< info
.nb_vec_lines
; i
++) {
61 if (i
>= MAX_LINE_PER_VECTOR
) {
66 ret
= get_file_line();
67 size
= strlen(info
.one_line_text
);
71 info
.vec
[i
] = calloc(1, size
+ 5);
72 if (info
.vec
[i
] == NULL
)
75 strlcpy(info
.vec
[i
], info
.one_line_text
, size
+ 1);
79 info
.nb_vec_lines
= i
;
84 for (i
= 0; i
< MAX_LINE_PER_VECTOR
; i
++)
85 if (info
.vec
[i
] != NULL
) {
90 info
.nb_vec_lines
= 0;
96 fips_test_parse_header(void)
102 time_t t
= time(NULL
);
103 struct tm
*tm_now
= localtime(&t
);
105 ret
= fips_test_fetch_one_block();
109 for (i
= 0; i
< info
.nb_vec_lines
; i
++) {
111 if (strstr(info
.vec
[i
], "AESVS")) {
113 info
.algo
= FIPS_TEST_ALGO_AES
;
114 ret
= parse_test_aes_init();
117 } else if (strstr(info
.vec
[i
], "GCM")) {
119 info
.algo
= FIPS_TEST_ALGO_AES_GCM
;
120 ret
= parse_test_gcm_init();
123 } else if (strstr(info
.vec
[i
], "CMAC")) {
125 info
.algo
= FIPS_TEST_ALGO_AES_CMAC
;
126 ret
= parse_test_cmac_init();
129 } else if (strstr(info
.vec
[i
], "CCM")) {
131 info
.algo
= FIPS_TEST_ALGO_AES_CCM
;
132 ret
= parse_test_ccm_init();
135 } else if (strstr(info
.vec
[i
], "HMAC")) {
137 info
.algo
= FIPS_TEST_ALGO_HMAC
;
138 ret
= parse_test_hmac_init();
141 } else if (strstr(info
.vec
[i
], "TDES")) {
143 info
.algo
= FIPS_TEST_ALGO_TDES
;
144 ret
= parse_test_tdes_init();
147 } else if (strstr(info
.vec
[i
], "SHA-")) {
149 info
.algo
= FIPS_TEST_ALGO_SHA
;
150 ret
= parse_test_sha_init();
156 tmp
= strstr(info
.vec
[i
], "# Config info for ");
158 fprintf(info
.fp_wr
, "%s%s\n", "# Config info for DPDK Cryptodev ",
163 tmp
= strstr(info
.vec
[i
], "# HMAC information for ");
165 fprintf(info
.fp_wr
, "%s%s\n", "# HMAC information for "
171 tmp
= strstr(info
.vec
[i
], "# Config Info for : ");
174 fprintf(info
.fp_wr
, "%s%s\n", "# Config Info for DPDK Cryptodev : ",
179 tmp
= strstr(info
.vec
[i
], "# information for ");
182 char tmp_output
[128] = {0};
184 strlcpy(tmp_output
, info
.vec
[i
], tmp
- info
.vec
[i
] + 1);
186 fprintf(info
.fp_wr
, "%s%s%s\n", tmp_output
,
187 "information for DPDK Cryptodev ",
192 tmp
= strstr(info
.vec
[i
], " test information for ");
194 char tmp_output
[128] = {0};
196 strlcpy(tmp_output
, info
.vec
[i
], tmp
- info
.vec
[i
] + 1);
198 fprintf(info
.fp_wr
, "%s%s%s\n", tmp_output
,
199 "test information for DPDK Cryptodev ",
204 tmp
= strstr(info
.vec
[i
], "\" information for \"");
206 char tmp_output
[128] = {0};
208 strlcpy(tmp_output
, info
.vec
[i
], tmp
- info
.vec
[i
] + 1);
210 fprintf(info
.fp_wr
, "%s%s%s\n", tmp_output
,
211 "\" information for DPDK Cryptodev ",
216 if (i
== info
.nb_vec_lines
- 1) {
217 /** update the time as current time, write to file */
218 fprintf(info
.fp_wr
, "%s%s\n", "# Generated on ",
223 /* to this point, no field need to update,
224 * only copy to rsp file
226 fprintf(info
.fp_wr
, "%s\n", info
.vec
[i
]);
233 parse_file_type(const char *path
)
235 const char *tmp
= path
+ strlen(path
) - 3;
237 if (strstr(tmp
, REQ_FILE_PERFIX
))
238 info
.file_type
= FIPS_TYPE_REQ
;
239 else if (strstr(tmp
, RSP_FILE_PERFIX
))
240 info
.file_type
= FIPS_TYPE_RSP
;
241 else if (strstr(path
, FAX_FILE_PERFIX
))
242 info
.file_type
= FIPS_TYPE_FAX
;
250 fips_test_init(const char *req_file_path
, const char *rsp_file_path
,
251 const char *device_name
)
253 if (strcmp(req_file_path
, rsp_file_path
) == 0) {
254 RTE_LOG(ERR
, USER1
, "File paths cannot be the same\n");
260 info
.algo
= FIPS_TEST_ALGO_MAX
;
261 if (parse_file_type(req_file_path
) < 0) {
262 RTE_LOG(ERR
, USER1
, "File %s type not supported\n",
267 info
.fp_rd
= fopen(req_file_path
, "r");
269 RTE_LOG(ERR
, USER1
, "Cannot open file %s\n", req_file_path
);
273 info
.fp_wr
= fopen(rsp_file_path
, "w");
275 RTE_LOG(ERR
, USER1
, "Cannot open file %s\n", rsp_file_path
);
279 info
.one_line_text
= calloc(1, MAX_LINE_CHAR
);
280 if (!info
.one_line_text
) {
281 RTE_LOG(ERR
, USER1
, "Insufficient memory\n");
285 strlcpy(info
.device_name
, device_name
, sizeof(info
.device_name
));
287 if (fips_test_parse_header() < 0) {
288 RTE_LOG(ERR
, USER1
, "Failed parsing header\n");
296 fips_test_clear(void)
302 if (info
.one_line_text
)
303 free(info
.one_line_text
);
304 if (info
.nb_vec_lines
) {
307 for (i
= 0; i
< info
.nb_vec_lines
; i
++)
311 memset(&info
, 0, sizeof(info
));
315 fips_test_parse_one_case(void)
318 uint32_t is_interim
= 0;
321 if (info
.interim_callbacks
) {
322 for (i
= 0; i
< info
.nb_vec_lines
; i
++) {
323 for (j
= 0; info
.interim_callbacks
[j
].key
!= NULL
; j
++)
324 if (strstr(info
.vec
[i
],
325 info
.interim_callbacks
[j
].key
)) {
328 ret
= info
.interim_callbacks
[j
].cb(
329 info
.interim_callbacks
[j
].key
,
331 info
.interim_callbacks
[j
].val
);
339 for (i
= 0; i
< info
.nb_vec_lines
; i
++)
340 fprintf(info
.fp_wr
, "%s\n", info
.vec
[i
]);
341 fprintf(info
.fp_wr
, "\n");
345 for (i
= 0; i
< info
.nb_vec_lines
; i
++) {
346 for (j
= 0; info
.callbacks
[j
].key
!= NULL
; j
++)
347 if (strstr(info
.vec
[i
], info
.callbacks
[j
].key
)) {
348 ret
= info
.callbacks
[j
].cb(
349 info
.callbacks
[j
].key
,
350 info
.vec
[i
], info
.callbacks
[j
].val
);
361 fips_test_write_one_case(void)
365 for (i
= 0; i
< info
.nb_vec_lines
; i
++)
366 fprintf(info
.fp_wr
, "%s\n", info
.vec
[i
]);
370 parser_read_uint64_hex(uint64_t *value
, const char *p
)
375 p
= skip_white_spaces(p
);
377 val
= strtoul(p
, &next
, 16);
381 p
= skip_white_spaces(next
);
390 parser_read_uint8_hex(uint8_t *value
, const char *p
)
393 int ret
= parser_read_uint64_hex(&val
, p
);
406 parse_uint8_known_len_hex_str(const char *key
, char *src
, struct fips_val
*val
)
408 struct fips_val tmp_val
= {0};
409 uint32_t len
= val
->len
;
413 if (val
->val
!= NULL
) {
421 ret
= parse_uint8_hex_str(key
, src
, &tmp_val
);
425 if (tmp_val
.len
== val
->len
) {
426 val
->val
= tmp_val
.val
;
430 if (tmp_val
.len
< val
->len
) {
431 rte_free(tmp_val
.val
);
435 val
->val
= rte_zmalloc(NULL
, val
->len
, 0);
437 rte_free(tmp_val
.val
);
438 memset(val
, 0, sizeof(*val
));
442 memcpy(val
->val
, tmp_val
.val
, val
->len
);
443 rte_free(tmp_val
.val
);
449 parse_uint8_hex_str(const char *key
, char *src
, struct fips_val
*val
)
455 len
= strlen(src
) / 2;
462 val
->val
= rte_zmalloc(NULL
, len
, 0);
466 for (j
= 0; j
< len
; j
++) {
467 char byte
[3] = {src
[j
* 2], src
[j
* 2 + 1], '\0'};
469 if (parser_read_uint8_hex(&val
->val
[j
], byte
) < 0) {
471 memset(val
, 0, sizeof(*val
));
482 parser_read_uint32_val(const char *key
, char *src
, struct fips_val
*val
)
484 char *data
= src
+ strlen(key
);
485 size_t data_len
= strlen(data
);
488 if (data
[data_len
- 1] == ']') {
489 char *tmp_data
= calloc(1, data_len
+ 1);
491 if (tmp_data
== NULL
)
494 strlcpy(tmp_data
, data
, data_len
);
496 ret
= parser_read_uint32(&val
->len
, tmp_data
);
500 ret
= parser_read_uint32(&val
->len
, data
);
506 parser_read_uint32_bit_val(const char *key
, char *src
, struct fips_val
*val
)
510 ret
= parser_read_uint32_val(key
, src
, val
);
521 writeback_hex_str(const char *key
, char *dst
, struct fips_val
*val
)
528 for (len
= 0; len
< val
->len
; len
++)
529 snprintf(str
+ len
* 2, 255, "%02x", val
->val
[len
]);
535 parser_read_uint64(uint64_t *value
, const char *p
)
540 p
= skip_white_spaces(p
);
544 val
= strtoul(p
, &next
, 10);
566 p
= skip_white_spaces(p
);
575 parser_read_uint32(uint32_t *value
, char *p
)
578 int ret
= parser_read_uint64(&val
, p
);
583 if (val
> UINT32_MAX
)
591 parse_write_hex_str(struct fips_val
*src
)
593 writeback_hex_str("", info
.one_line_text
, src
);
595 fprintf(info
.fp_wr
, "%s\n", info
.one_line_text
);
599 update_info_vec(uint32_t count
)
601 const struct fips_test_callback
*cb
;
604 if (!info
.writeback_callbacks
)
607 cb
= &info
.writeback_callbacks
[0];
609 snprintf(info
.vec
[0], strlen(info
.vec
[0]) + 4, "%s%u", cb
->key
, count
);
611 for (i
= 1; i
< info
.nb_vec_lines
; i
++) {
612 for (j
= 1; info
.writeback_callbacks
[j
].key
!= NULL
; j
++) {
613 cb
= &info
.writeback_callbacks
[j
];
614 if (strstr(info
.vec
[i
], cb
->key
)) {
615 cb
->cb(cb
->key
, info
.vec
[i
], cb
->val
);