162c012adSMarcel Cornu /**********************************************************************
262c012adSMarcel Cornu Copyright(c) 2024 Intel Corporation All rights reserved.
362c012adSMarcel Cornu Redistribution and use in source and binary forms, with or without
462c012adSMarcel Cornu modification, are permitted provided that the following conditions
562c012adSMarcel Cornu are met:
662c012adSMarcel Cornu * Redistributions of source code must retain the above copyright
762c012adSMarcel Cornu notice, this list of conditions and the following disclaimer.
862c012adSMarcel Cornu * Redistributions in binary form must reproduce the above copyright
962c012adSMarcel Cornu notice, this list of conditions and the following disclaimer in
1062c012adSMarcel Cornu the documentation and/or other materials provided with the
1162c012adSMarcel Cornu distribution.
1262c012adSMarcel Cornu * Neither the name of Intel Corporation nor the names of its
1362c012adSMarcel Cornu contributors may be used to endorse or promote products derived
1462c012adSMarcel Cornu from this software without specific prior written permission.
1562c012adSMarcel Cornu THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1662c012adSMarcel Cornu "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1762c012adSMarcel Cornu LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1862c012adSMarcel Cornu A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1962c012adSMarcel Cornu OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2062c012adSMarcel Cornu SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2162c012adSMarcel Cornu LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2262c012adSMarcel Cornu DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2362c012adSMarcel Cornu THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2462c012adSMarcel Cornu (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2562c012adSMarcel Cornu OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2662c012adSMarcel Cornu **********************************************************************/
2762c012adSMarcel Cornu
2862c012adSMarcel Cornu #include <stdio.h>
2962c012adSMarcel Cornu #include <stdlib.h>
3062c012adSMarcel Cornu #include "isal_crypto_api.h"
3162c012adSMarcel Cornu #include "rolling_hashx.h"
3262c012adSMarcel Cornu #include "multi_buffer.h"
3362c012adSMarcel Cornu #include "test.h"
3462c012adSMarcel Cornu
3562c012adSMarcel Cornu #ifdef SAFE_PARAM
3662c012adSMarcel Cornu
3762c012adSMarcel Cornu static int
test_rolling_hash2_init_api(void)3862c012adSMarcel Cornu test_rolling_hash2_init_api(void)
3962c012adSMarcel Cornu {
4062c012adSMarcel Cornu int ret = -1;
4162c012adSMarcel Cornu const char *fn_name = "isal_rolling_hash2_init";
42*1e0b122eSMarcel Cornu struct isal_rh_state2 state = { 0 };
4362c012adSMarcel Cornu
448c212bb2SPablo de Lara #ifdef FIPS_MODE
458c212bb2SPablo de Lara // check for invalid algorithm
468c212bb2SPablo de Lara CHECK_RETURN_GOTO(isal_rolling_hash2_init(&state, 5), ISAL_CRYPTO_ERR_FIPS_INVALID_ALGO,
478c212bb2SPablo de Lara fn_name, end_init);
488c212bb2SPablo de Lara #else
4962c012adSMarcel Cornu // check NULL state
5062c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_init(NULL, 32), ISAL_CRYPTO_ERR_NULL_CTX, fn_name,
5162c012adSMarcel Cornu end_init);
5262c012adSMarcel Cornu // check invalid window size
5362c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_init(&state, 500), ISAL_CRYPTO_ERR_WINDOW_SIZE,
5462c012adSMarcel Cornu fn_name, end_init);
5562c012adSMarcel Cornu
5662c012adSMarcel Cornu // check valid args
5762c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_init(&state, 5), ISAL_CRYPTO_ERR_NONE, fn_name,
5862c012adSMarcel Cornu end_init);
598c212bb2SPablo de Lara #endif
6062c012adSMarcel Cornu
6162c012adSMarcel Cornu ret = 0;
6262c012adSMarcel Cornu end_init:
6362c012adSMarcel Cornu return ret;
6462c012adSMarcel Cornu }
6562c012adSMarcel Cornu
6662c012adSMarcel Cornu static int
test_rolling_hash2_reset_api(void)6762c012adSMarcel Cornu test_rolling_hash2_reset_api(void)
6862c012adSMarcel Cornu {
6962c012adSMarcel Cornu int ret = -1;
7062c012adSMarcel Cornu const char *fn_name = "isal_rolling_hash2_reset";
71*1e0b122eSMarcel Cornu struct isal_rh_state2 state = { 0 };
7262c012adSMarcel Cornu uint8_t init_bytes[64] = { 0 };
7362c012adSMarcel Cornu
748c212bb2SPablo de Lara #ifdef FIPS_MODE
758c212bb2SPablo de Lara // check for invalid algorithm
768c212bb2SPablo de Lara CHECK_RETURN_GOTO(isal_rolling_hash2_reset(&state, init_bytes),
778c212bb2SPablo de Lara ISAL_CRYPTO_ERR_FIPS_INVALID_ALGO, fn_name, end_reset);
788c212bb2SPablo de Lara #else
7962c012adSMarcel Cornu // check NULL state
8062c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_reset(NULL, init_bytes), ISAL_CRYPTO_ERR_NULL_CTX,
8162c012adSMarcel Cornu fn_name, end_reset);
8262c012adSMarcel Cornu
8362c012adSMarcel Cornu // check NULL init bytes
84c38e3475SPablo de Lara CHECK_RETURN_GOTO(isal_rolling_hash2_reset(&state, NULL), ISAL_CRYPTO_ERR_NULL_INIT_VAL,
8562c012adSMarcel Cornu fn_name, end_reset);
8662c012adSMarcel Cornu
8762c012adSMarcel Cornu // check valid args
8862c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_reset(&state, init_bytes), ISAL_CRYPTO_ERR_NONE,
8962c012adSMarcel Cornu fn_name, end_reset);
908c212bb2SPablo de Lara #endif
9162c012adSMarcel Cornu
9262c012adSMarcel Cornu ret = 0;
9362c012adSMarcel Cornu end_reset:
9462c012adSMarcel Cornu return ret;
9562c012adSMarcel Cornu }
9662c012adSMarcel Cornu
9762c012adSMarcel Cornu static int
test_rolling_hash2_run_api(void)9862c012adSMarcel Cornu test_rolling_hash2_run_api(void)
9962c012adSMarcel Cornu {
10062c012adSMarcel Cornu int ret = -1;
10162c012adSMarcel Cornu const char *fn_name = "isal_rolling_hash2_run";
102*1e0b122eSMarcel Cornu struct isal_rh_state2 state = { 0 };
10362c012adSMarcel Cornu uint8_t buffer[64] = { 0 };
10462c012adSMarcel Cornu uint32_t len = (uint32_t) sizeof(buffer);
10562c012adSMarcel Cornu uint32_t mask = 0xffff0;
10662c012adSMarcel Cornu uint32_t trigger = 0x3df0;
10762c012adSMarcel Cornu uint32_t offset = 0;
10862c012adSMarcel Cornu int match = -1;
10962c012adSMarcel Cornu
1108c212bb2SPablo de Lara #ifdef FIPS_MODE
1118c212bb2SPablo de Lara // check for invalid algorithm
1128c212bb2SPablo de Lara CHECK_RETURN_GOTO(
1138c212bb2SPablo de Lara isal_rolling_hash2_run(&state, buffer, len, mask, trigger, &offset, &match),
1148c212bb2SPablo de Lara ISAL_CRYPTO_ERR_FIPS_INVALID_ALGO, fn_name, end_run);
1158c212bb2SPablo de Lara #else
11662c012adSMarcel Cornu // check NULL state
11762c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_run(NULL, buffer, len, mask, trigger, &offset, &match),
11862c012adSMarcel Cornu ISAL_CRYPTO_ERR_NULL_CTX, fn_name, end_run);
11962c012adSMarcel Cornu
12062c012adSMarcel Cornu // check NULL source buffer
12162c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_run(&state, NULL, len, mask, trigger, &offset, &match),
12262c012adSMarcel Cornu ISAL_CRYPTO_ERR_NULL_SRC, fn_name, end_run);
12362c012adSMarcel Cornu
12462c012adSMarcel Cornu // check NULL offset
12562c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_run(&state, buffer, len, mask, trigger, NULL, &match),
12662c012adSMarcel Cornu ISAL_CRYPTO_ERR_NULL_OFFSET, fn_name, end_run);
12762c012adSMarcel Cornu
12862c012adSMarcel Cornu // check NULL match
12962c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hash2_run(&state, buffer, len, mask, trigger, &offset, NULL),
13062c012adSMarcel Cornu ISAL_CRYPTO_ERR_NULL_MATCH, fn_name, end_run);
13162c012adSMarcel Cornu
13262c012adSMarcel Cornu // check valid args
13362c012adSMarcel Cornu CHECK_RETURN_GOTO(
13462c012adSMarcel Cornu isal_rolling_hash2_run(&state, buffer, len, mask, trigger, &offset, &match),
13562c012adSMarcel Cornu ISAL_CRYPTO_ERR_NONE, fn_name, end_run);
1368c212bb2SPablo de Lara #endif
13762c012adSMarcel Cornu
13862c012adSMarcel Cornu ret = 0;
13962c012adSMarcel Cornu end_run:
14062c012adSMarcel Cornu return ret;
14162c012adSMarcel Cornu }
14262c012adSMarcel Cornu
14362c012adSMarcel Cornu static int
test_rolling_hashx_mask_gen_api(void)14462c012adSMarcel Cornu test_rolling_hashx_mask_gen_api(void)
14562c012adSMarcel Cornu {
14662c012adSMarcel Cornu int ret = -1;
14762c012adSMarcel Cornu const char *fn_name = "isal_rolling_hashx_mask_gen";
14862c012adSMarcel Cornu uint32_t mean = 0;
14962c012adSMarcel Cornu uint32_t shift = 0;
1500200e16bSMarcel Cornu uint32_t mask = ISAL_FINGERPRINT_RET_OTHER + 1;
15162c012adSMarcel Cornu
1528c212bb2SPablo de Lara #ifdef FIPS_MODE
1538c212bb2SPablo de Lara // check for invalid algorithm
1548c212bb2SPablo de Lara CHECK_RETURN_GOTO(isal_rolling_hashx_mask_gen(mean, shift, &mask),
1558c212bb2SPablo de Lara ISAL_CRYPTO_ERR_FIPS_INVALID_ALGO, fn_name, end_mask_gen);
1568c212bb2SPablo de Lara #else
15762c012adSMarcel Cornu // check NULL mask
15862c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hashx_mask_gen(mean, shift, NULL), ISAL_CRYPTO_ERR_NULL_MASK,
15962c012adSMarcel Cornu fn_name, end_mask_gen);
16062c012adSMarcel Cornu
16162c012adSMarcel Cornu // check valid args
16262c012adSMarcel Cornu CHECK_RETURN_GOTO(isal_rolling_hashx_mask_gen(mean, shift, &mask), ISAL_CRYPTO_ERR_NONE,
16362c012adSMarcel Cornu fn_name, end_mask_gen);
16462c012adSMarcel Cornu
16562c012adSMarcel Cornu // check mask was set to valid value
1660200e16bSMarcel Cornu if (mask >= ISAL_FINGERPRINT_RET_OTHER) {
16762c012adSMarcel Cornu printf("test: %s() - unexpected mask set\n", fn_name);
16862c012adSMarcel Cornu goto end_mask_gen;
16962c012adSMarcel Cornu }
1708c212bb2SPablo de Lara #endif
17162c012adSMarcel Cornu
17262c012adSMarcel Cornu ret = 0;
17362c012adSMarcel Cornu end_mask_gen:
17462c012adSMarcel Cornu return ret;
17562c012adSMarcel Cornu }
17662c012adSMarcel Cornu
17762c012adSMarcel Cornu #endif /* SAFE_PARAM */
17862c012adSMarcel Cornu
17962c012adSMarcel Cornu int
main(void)18062c012adSMarcel Cornu main(void)
18162c012adSMarcel Cornu {
18262c012adSMarcel Cornu int fail = 0;
18362c012adSMarcel Cornu
18462c012adSMarcel Cornu #ifdef SAFE_PARAM
18562c012adSMarcel Cornu fail |= test_rolling_hash2_init_api();
18662c012adSMarcel Cornu fail |= test_rolling_hash2_reset_api();
18762c012adSMarcel Cornu fail |= test_rolling_hash2_run_api();
18862c012adSMarcel Cornu fail |= test_rolling_hashx_mask_gen_api();
18962c012adSMarcel Cornu
19062c012adSMarcel Cornu printf(fail ? "Fail\n" : "Pass\n");
19162c012adSMarcel Cornu #else
19262c012adSMarcel Cornu printf("Not Executed\n");
19362c012adSMarcel Cornu #endif
19462c012adSMarcel Cornu return fail;
19562c012adSMarcel Cornu }
196