From e6918187568dbd01842d8d1d2c808ce16a894239 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 21 Apr 2024 13:54:28 +0200 Subject: Adding upstream version 18.2.2. Signed-off-by: Daniel Baumann --- .../isa-l/isa-l_crypto/tests/extended/Makefile | 19 +++ .../isa-l_crypto/tests/extended/Makefile.nmake | 58 ++++++++ .../tests/extended/md5_mb_over_4GB_test.c | 155 ++++++++++++++++++++ .../tests/extended/sha1_mb_over_4GB_test.c | 156 ++++++++++++++++++++ .../tests/extended/sha256_mb_over_4GB_test.c | 156 ++++++++++++++++++++ .../tests/extended/sha512_mb_over_4GB_test.c | 156 ++++++++++++++++++++ .../tests/extended/sm3_mb_over_4GB_test.c | 162 +++++++++++++++++++++ 7 files changed, 862 insertions(+) create mode 100644 src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile create mode 100644 src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile.nmake create mode 100644 src/crypto/isa-l/isa-l_crypto/tests/extended/md5_mb_over_4GB_test.c create mode 100644 src/crypto/isa-l/isa-l_crypto/tests/extended/sha1_mb_over_4GB_test.c create mode 100644 src/crypto/isa-l/isa-l_crypto/tests/extended/sha256_mb_over_4GB_test.c create mode 100644 src/crypto/isa-l/isa-l_crypto/tests/extended/sha512_mb_over_4GB_test.c create mode 100644 src/crypto/isa-l/isa-l_crypto/tests/extended/sm3_mb_over_4GB_test.c (limited to 'src/crypto/isa-l/isa-l_crypto/tests/extended') diff --git a/src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile b/src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile new file mode 100644 index 000000000..964baee11 --- /dev/null +++ b/src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile @@ -0,0 +1,19 @@ +CFLAGS += -I ../../include +libs += ../../bin/isa-l_crypto.a +tests = $(patsubst %test.c, %test, $(wildcard *_test.c)) + +tests: $(tests) +$(tests): $(libs) +%test: %test.c + $(CC) $< $(libs) $(CFLAGS) $(LDLIBS) -o $@ +$(libs): + $(MAKE) -C ../../ -f Makefile.unx +test: $(addsuffix .run,$(tests)) + @echo ALL PASS +$(addsuffix .run,$(tests)): %.run: % + $(SIM) ./$< + @echo Completed run: $< +clean: + $(RM) *.o $(tests) + +$(tests): LDLIBS += -lcrypto diff --git a/src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile.nmake b/src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile.nmake new file mode 100644 index 000000000..daaf04e79 --- /dev/null +++ b/src/crypto/isa-l/isa-l_crypto/tests/extended/Makefile.nmake @@ -0,0 +1,58 @@ +######################################################################## +# Copyright(c) 2011-2017 Intel Corporation All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +######################################################################## + +tests = md5_mb_over_4GB_test.exe sha1_mb_over_4GB_test.exe \ +sha256_mb_over_4GB_test.exe sha512_mb_over_4GB_test.exe + +INCLUDES = -I../../include +LINKFLAGS = /nologo +INCLUDES = $(INCLUDES) -Ic:\OpenSSL-Win64\include +CFLAGS = -O2 -D NDEBUG /nologo -D_USE_MATH_DEFINES -Qstd=c99 $(INCLUDES) /c +LINKFLAGS = $(LINKFLAGS) /libpath:c:\OpenSSL-Win64\lib +LIBS = ../../isa-l_crypto.lib +DLL = isa-l_crypto.dll + +tests: lib $(tests) +$(tests): $(@B).obj + link /out:$@ $(LINKFLAGS) libeay32.lib $(LIBS) $*.obj +%.obj: %.c + $(CC) $(CFLAGS) -Fo$@ $? + +lib: + cd ../../ && nmake -f Makefile.nmake + cd ../../ && copy $(DLL) "tests\extended" + +test: $(tests) + !$? + echo ALL PASS + +clean: + -if exist *.obj del *.obj + -if exist *.exe del *.exe + -if exist *.dll del *.dll diff --git a/src/crypto/isa-l/isa-l_crypto/tests/extended/md5_mb_over_4GB_test.c b/src/crypto/isa-l/isa-l_crypto/tests/extended/md5_mb_over_4GB_test.c new file mode 100644 index 000000000..5eb7be75f --- /dev/null +++ b/src/crypto/isa-l/isa-l_crypto/tests/extended/md5_mb_over_4GB_test.c @@ -0,0 +1,155 @@ +/********************************************************************** + Copyright(c) 2011-2017 Intel Corporation All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**********************************************************************/ + +#include +#include +#include "md5_mb.h" +#include "endian_helper.h" +#include +#define TEST_LEN (1024*1024ull) //1M +#define TEST_BUFS MD5_MIN_LANES +#define ROTATION_TIMES 10000 //total length processing = TEST_LEN * ROTATION_TIMES +#define UPDATE_SIZE (13*MD5_BLOCK_SIZE) +#define LEN_TOTAL (TEST_LEN * ROTATION_TIMES) + +/* Reference digest global to reduce stack usage */ +static uint8_t digest_ref_upd[4 * MD5_DIGEST_NWORDS]; + +struct user_data { + int idx; + uint64_t processed; +}; + +int main(void) +{ + MD5_CTX o_ctx; //openSSL + MD5_HASH_CTX_MGR *mgr = NULL; + MD5_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL; + uint32_t i, j, k, fail = 0; + unsigned char *bufs[TEST_BUFS]; + struct user_data udata[TEST_BUFS]; + int ret; + + ret = posix_memalign((void *)&mgr, 16, sizeof(MD5_HASH_CTX_MGR)); + if ((ret != 0) || (mgr == NULL)) { + printf("posix_memalign failed test aborted\n"); + return 1; + } + md5_ctx_mgr_init(mgr); + + printf("md5_large_test\n"); + + // Init ctx contents + for (i = 0; i < TEST_BUFS; i++) { + bufs[i] = (unsigned char *)calloc((size_t)TEST_LEN, 1); + if (bufs[i] == NULL) { + printf("malloc failed test aborted\n"); + return 1; + } + hash_ctx_init(&ctxpool[i]); + ctxpool[i].user_data = (void *)&udata[i]; + } + + //Openssl MD5 update test + MD5_Init(&o_ctx); + for (k = 0; k < ROTATION_TIMES; k++) { + MD5_Update(&o_ctx, bufs[k % TEST_BUFS], TEST_LEN); + } + MD5_Final(digest_ref_upd, &o_ctx); + + // Initialize pool + for (i = 0; i < TEST_BUFS; i++) { + struct user_data *u = (struct user_data *)ctxpool[i].user_data; + u->idx = i; + u->processed = 0; + } + + printf("Starting updates\n"); + int highest_pool_idx = 0; + ctx = &ctxpool[highest_pool_idx++]; + while (ctx) { + int len = UPDATE_SIZE; + int update_type = HASH_UPDATE; + struct user_data *u = (struct user_data *)ctx->user_data; + int idx = u->idx; + + if (u->processed == 0) + update_type = HASH_FIRST; + + else if (hash_ctx_complete(ctx)) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = md5_ctx_mgr_flush(mgr); + continue; + } else if (u->processed >= (LEN_TOTAL - UPDATE_SIZE)) { + len = (LEN_TOTAL - u->processed); + update_type = HASH_LAST; + } + u->processed += len; + ctx = md5_ctx_mgr_submit(mgr, ctx, bufs[idx], len, update_type); + + if (NULL == ctx) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = md5_ctx_mgr_flush(mgr); + } + } + + printf("multibuffer md5 digest: \n"); + for (i = 0; i < TEST_BUFS; i++) { + printf("Total processing size of buf[%d] is %ld \n", i, + ctxpool[i].total_length); + for (j = 0; j < MD5_DIGEST_NWORDS; j++) { + printf("digest%d : %08X\n", j, ctxpool[i].job.result_digest[j]); + } + } + printf("\n"); + + printf("openssl md5 update digest: \n"); + for (i = 0; i < MD5_DIGEST_NWORDS; i++) + printf("%08X - ", to_le32(((uint32_t *) digest_ref_upd)[i])); + printf("\n"); + + for (i = 0; i < TEST_BUFS; i++) { + for (j = 0; j < MD5_DIGEST_NWORDS; j++) { + if (ctxpool[i].job.result_digest[j] != + to_le32(((uint32_t *) digest_ref_upd)[j])) { + fail++; + } + } + } + + if (fail) + printf("Test failed md5 hash large file check %d\n", fail); + else + printf(" md5_hash_large_test: Pass\n"); + return fail; +} diff --git a/src/crypto/isa-l/isa-l_crypto/tests/extended/sha1_mb_over_4GB_test.c b/src/crypto/isa-l/isa-l_crypto/tests/extended/sha1_mb_over_4GB_test.c new file mode 100644 index 000000000..af94a8098 --- /dev/null +++ b/src/crypto/isa-l/isa-l_crypto/tests/extended/sha1_mb_over_4GB_test.c @@ -0,0 +1,156 @@ +/********************************************************************** + Copyright(c) 2011-2017 Intel Corporation All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**********************************************************************/ + +#include +#include +#include "sha1_mb.h" +#include "endian_helper.h" +#include +#define TEST_LEN (1024*1024ull) //1M +#define TEST_BUFS SHA1_MIN_LANES +#define ROTATION_TIMES 10000 //total length processing = TEST_LEN * ROTATION_TIMES +#define UPDATE_SIZE (13*SHA1_BLOCK_SIZE) +#define LEN_TOTAL (TEST_LEN * ROTATION_TIMES) + +/* Reference digest global to reduce stack usage */ +static uint8_t digest_ref_upd[4 * SHA1_DIGEST_NWORDS]; + +struct user_data { + int idx; + uint64_t processed; +}; + +int main(void) +{ + SHA_CTX o_ctx; //openSSL + SHA1_HASH_CTX_MGR *mgr = NULL; + SHA1_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL; + uint32_t i, j, k, fail = 0; + unsigned char *bufs[TEST_BUFS]; + struct user_data udata[TEST_BUFS]; + int ret; + + ret = posix_memalign((void *)&mgr, 16, sizeof(SHA1_HASH_CTX_MGR)); + if ((ret != 0) || (mgr == NULL)) { + printf("posix_memalign failed test aborted\n"); + return 1; + } + + sha1_ctx_mgr_init(mgr); + + printf("sha1_large_test\n"); + + // Init ctx contents + for (i = 0; i < TEST_BUFS; i++) { + bufs[i] = (unsigned char *)calloc((size_t)TEST_LEN, 1); + if (bufs[i] == NULL) { + printf("malloc failed test aborted\n"); + return 1; + } + hash_ctx_init(&ctxpool[i]); + ctxpool[i].user_data = (void *)&udata[i]; + } + + //Openssl SHA1 update test + SHA1_Init(&o_ctx); + for (k = 0; k < ROTATION_TIMES; k++) { + SHA1_Update(&o_ctx, bufs[k % TEST_BUFS], TEST_LEN); + } + SHA1_Final(digest_ref_upd, &o_ctx); + + // Initialize pool + for (i = 0; i < TEST_BUFS; i++) { + struct user_data *u = (struct user_data *)ctxpool[i].user_data; + u->idx = i; + u->processed = 0; + } + + printf("Starting updates\n"); + int highest_pool_idx = 0; + ctx = &ctxpool[highest_pool_idx++]; + while (ctx) { + int len = UPDATE_SIZE; + int update_type = HASH_UPDATE; + struct user_data *u = (struct user_data *)ctx->user_data; + int idx = u->idx; + + if (u->processed == 0) + update_type = HASH_FIRST; + + else if (hash_ctx_complete(ctx)) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sha1_ctx_mgr_flush(mgr); + continue; + } else if (u->processed >= (LEN_TOTAL - UPDATE_SIZE)) { + len = (LEN_TOTAL - u->processed); + update_type = HASH_LAST; + } + u->processed += len; + ctx = sha1_ctx_mgr_submit(mgr, ctx, bufs[idx], len, update_type); + + if (NULL == ctx) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sha1_ctx_mgr_flush(mgr); + } + } + + printf("multibuffer SHA1 digest: \n"); + for (i = 0; i < TEST_BUFS; i++) { + printf("Total processing size of buf[%d] is %ld \n", i, + ctxpool[i].total_length); + for (j = 0; j < SHA1_DIGEST_NWORDS; j++) { + printf("digest%d : %08X\n", j, ctxpool[i].job.result_digest[j]); + } + } + printf("\n"); + + printf("openssl SHA1 update digest: \n"); + for (i = 0; i < SHA1_DIGEST_NWORDS; i++) + printf("%08X - ", to_be32(((uint32_t *) digest_ref_upd)[i])); + printf("\n"); + + for (i = 0; i < TEST_BUFS; i++) { + for (j = 0; j < SHA1_DIGEST_NWORDS; j++) { + if (ctxpool[i].job.result_digest[j] != + to_be32(((uint32_t *) digest_ref_upd)[j])) { + fail++; + } + } + } + + if (fail) + printf("Test failed SHA1 hash large file check %d\n", fail); + else + printf(" SHA1_hash_large_test: Pass\n"); + return fail; +} diff --git a/src/crypto/isa-l/isa-l_crypto/tests/extended/sha256_mb_over_4GB_test.c b/src/crypto/isa-l/isa-l_crypto/tests/extended/sha256_mb_over_4GB_test.c new file mode 100644 index 000000000..35bbdcbae --- /dev/null +++ b/src/crypto/isa-l/isa-l_crypto/tests/extended/sha256_mb_over_4GB_test.c @@ -0,0 +1,156 @@ +/********************************************************************** + Copyright(c) 2011-2017 Intel Corporation All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**********************************************************************/ + +#include +#include +#include "sha256_mb.h" +#include "endian_helper.h" +#include +#define TEST_LEN (1024*1024ull) //1M +#define TEST_BUFS SHA256_MIN_LANES +#define ROTATION_TIMES 10000 //total length processing = TEST_LEN * ROTATION_TIMES +#define UPDATE_SIZE (13*SHA256_BLOCK_SIZE) +#define LEN_TOTAL (TEST_LEN * ROTATION_TIMES) + +/* Reference digest global to reduce stack usage */ +static uint8_t digest_ref_upd[4 * SHA256_DIGEST_NWORDS]; + +struct user_data { + int idx; + uint64_t processed; +}; + +int main(void) +{ + SHA256_CTX o_ctx; //openSSL + SHA256_HASH_CTX_MGR *mgr = NULL; + SHA256_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL; + uint32_t i, j, k, fail = 0; + unsigned char *bufs[TEST_BUFS]; + struct user_data udata[TEST_BUFS]; + int ret; + + ret = posix_memalign((void *)&mgr, 16, sizeof(SHA256_HASH_CTX_MGR)); + if ((ret != 0) || (mgr == NULL)) { + printf("posix_memalign failed test aborted\n"); + return 1; + } + + sha256_ctx_mgr_init(mgr); + + printf("sha256_large_test\n"); + + // Init ctx contents + for (i = 0; i < TEST_BUFS; i++) { + bufs[i] = (unsigned char *)calloc((size_t)TEST_LEN, 1); + if (bufs[i] == NULL) { + printf("malloc failed test aborted\n"); + return 1; + } + hash_ctx_init(&ctxpool[i]); + ctxpool[i].user_data = (void *)&udata[i]; + } + + //Openssl SHA256 update test + SHA256_Init(&o_ctx); + for (k = 0; k < ROTATION_TIMES; k++) { + SHA256_Update(&o_ctx, bufs[k % TEST_BUFS], TEST_LEN); + } + SHA256_Final(digest_ref_upd, &o_ctx); + + // Initialize pool + for (i = 0; i < TEST_BUFS; i++) { + struct user_data *u = (struct user_data *)ctxpool[i].user_data; + u->idx = i; + u->processed = 0; + } + + printf("Starting updates\n"); + int highest_pool_idx = 0; + ctx = &ctxpool[highest_pool_idx++]; + while (ctx) { + int len = UPDATE_SIZE; + int update_type = HASH_UPDATE; + struct user_data *u = (struct user_data *)ctx->user_data; + int idx = u->idx; + + if (u->processed == 0) + update_type = HASH_FIRST; + + else if (hash_ctx_complete(ctx)) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sha256_ctx_mgr_flush(mgr); + continue; + } else if (u->processed >= (LEN_TOTAL - UPDATE_SIZE)) { + len = (LEN_TOTAL - u->processed); + update_type = HASH_LAST; + } + u->processed += len; + ctx = sha256_ctx_mgr_submit(mgr, ctx, bufs[idx], len, update_type); + + if (NULL == ctx) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sha256_ctx_mgr_flush(mgr); + } + } + + printf("multibuffer SHA256 digest: \n"); + for (i = 0; i < TEST_BUFS; i++) { + printf("Total processing size of buf[%d] is %ld \n", i, + ctxpool[i].total_length); + for (j = 0; j < SHA256_DIGEST_NWORDS; j++) { + printf("digest%d : %08X\n", j, ctxpool[i].job.result_digest[j]); + } + } + printf("\n"); + + printf("openssl SHA256 update digest: \n"); + for (i = 0; i < SHA256_DIGEST_NWORDS; i++) + printf("%08X - ", to_be32(((uint32_t *) digest_ref_upd)[i])); + printf("\n"); + + for (i = 0; i < TEST_BUFS; i++) { + for (j = 0; j < SHA256_DIGEST_NWORDS; j++) { + if (ctxpool[i].job.result_digest[j] != + to_be32(((uint32_t *) digest_ref_upd)[j])) { + fail++; + } + } + } + + if (fail) + printf("Test failed SHA256 hash large file check %d\n", fail); + else + printf(" SHA256_hash_large_test: Pass\n"); + return fail; +} diff --git a/src/crypto/isa-l/isa-l_crypto/tests/extended/sha512_mb_over_4GB_test.c b/src/crypto/isa-l/isa-l_crypto/tests/extended/sha512_mb_over_4GB_test.c new file mode 100644 index 000000000..9c2aeaead --- /dev/null +++ b/src/crypto/isa-l/isa-l_crypto/tests/extended/sha512_mb_over_4GB_test.c @@ -0,0 +1,156 @@ +/********************************************************************** + Copyright(c) 2011-2017 Intel Corporation All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**********************************************************************/ + +#include +#include +#include "sha512_mb.h" +#include "endian_helper.h" +#include +#define TEST_LEN (1024*1024ull) //1M +#define TEST_BUFS SHA512_MIN_LANES +#define ROTATION_TIMES 10000 //total length processing = TEST_LEN * ROTATION_TIMES +#define UPDATE_SIZE (13*SHA512_BLOCK_SIZE) +#define LEN_TOTAL (TEST_LEN * ROTATION_TIMES) + +/* Reference digest global to reduce stack usage */ +static uint8_t digest_ref_upd[8 * SHA512_DIGEST_NWORDS]; + +struct user_data { + int idx; + uint64_t processed; +}; + +int main(void) +{ + SHA512_CTX o_ctx; //openSSL + SHA512_HASH_CTX_MGR *mgr = NULL; + SHA512_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL; + uint32_t i, j, k, fail = 0; + unsigned char *bufs[TEST_BUFS]; + struct user_data udata[TEST_BUFS]; + int ret; + + ret = posix_memalign((void *)&mgr, 16, sizeof(SHA512_HASH_CTX_MGR)); + if ((ret != 0) || (mgr == NULL)) { + printf("posix_memalign failed test aborted\n"); + return 1; + } + + sha512_ctx_mgr_init(mgr); + + printf("sha512_large_test\n"); + + // Init ctx contents + for (i = 0; i < TEST_BUFS; i++) { + bufs[i] = (unsigned char *)calloc((size_t)TEST_LEN, 1); + if (bufs[i] == NULL) { + printf("malloc failed test aborted\n"); + return 1; + } + hash_ctx_init(&ctxpool[i]); + ctxpool[i].user_data = (void *)&udata[i]; + } + + //Openssl SHA512 update test + SHA512_Init(&o_ctx); + for (k = 0; k < ROTATION_TIMES; k++) { + SHA512_Update(&o_ctx, bufs[k % TEST_BUFS], TEST_LEN); + } + SHA512_Final(digest_ref_upd, &o_ctx); + + // Initialize pool + for (i = 0; i < TEST_BUFS; i++) { + struct user_data *u = (struct user_data *)ctxpool[i].user_data; + u->idx = i; + u->processed = 0; + } + + printf("Starting updates\n"); + int highest_pool_idx = 0; + ctx = &ctxpool[highest_pool_idx++]; + while (ctx) { + int len = UPDATE_SIZE; + int update_type = HASH_UPDATE; + struct user_data *u = (struct user_data *)ctx->user_data; + int idx = u->idx; + + if (u->processed == 0) + update_type = HASH_FIRST; + + else if (hash_ctx_complete(ctx)) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sha512_ctx_mgr_flush(mgr); + continue; + } else if (u->processed >= (LEN_TOTAL - UPDATE_SIZE)) { + len = (LEN_TOTAL - u->processed); + update_type = HASH_LAST; + } + u->processed += len; + ctx = sha512_ctx_mgr_submit(mgr, ctx, bufs[idx], len, update_type); + + if (NULL == ctx) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sha512_ctx_mgr_flush(mgr); + } + } + + printf("multibuffer sha512 digest: \n"); + for (i = 0; i < TEST_BUFS; i++) { + printf("Total processing size of buf[%d] is %ld \n", i, + ctxpool[i].total_length); + for (j = 0; j < SHA512_DIGEST_NWORDS; j++) { + printf("digest%d : %016lX\n", j, ctxpool[i].job.result_digest[j]); + } + } + printf("\n"); + + printf("openssl sha512 update digest: \n"); + for (i = 0; i < SHA512_DIGEST_NWORDS; i++) + printf("%016lX - ", to_be64(((uint64_t *) digest_ref_upd)[i])); + printf("\n"); + + for (i = 0; i < TEST_BUFS; i++) { + for (j = 0; j < SHA512_DIGEST_NWORDS; j++) { + if (ctxpool[i].job.result_digest[j] != + to_be64(((uint64_t *) digest_ref_upd)[j])) { + fail++; + } + } + } + + if (fail) + printf("Test failed sha512 hash large file check %d\n", fail); + else + printf(" sha512_hash_large_test: Pass\n"); + return fail; +} diff --git a/src/crypto/isa-l/isa-l_crypto/tests/extended/sm3_mb_over_4GB_test.c b/src/crypto/isa-l/isa-l_crypto/tests/extended/sm3_mb_over_4GB_test.c new file mode 100644 index 000000000..ea98e29b5 --- /dev/null +++ b/src/crypto/isa-l/isa-l_crypto/tests/extended/sm3_mb_over_4GB_test.c @@ -0,0 +1,162 @@ +/********************************************************************** + Copyright(c) 2011-2019 Intel Corporation All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**********************************************************************/ + +#include +#include +#include "sm3_mb.h" +#include "endian_helper.h" +#include + +#define TEST_LEN (1024*1024ull) //1M +#define TEST_BUFS SM3_MAX_LANES +#define ROTATION_TIMES 10000 //total length processing = TEST_LEN * ROTATION_TIMES +#define UPDATE_SIZE (13*SM3_BLOCK_SIZE) +#define LEN_TOTAL (TEST_LEN * ROTATION_TIMES) + +/* Reference digest global to reduce stack usage */ +static uint8_t digest_ref_upd[4 * SM3_DIGEST_NWORDS]; + +struct user_data { + int idx; + uint64_t processed; +}; + +int main(void) +{ + SM3_HASH_CTX_MGR *mgr = NULL; + SM3_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL; + uint32_t i, j, k, fail = 0; + unsigned char *bufs[TEST_BUFS]; + struct user_data udata[TEST_BUFS]; + EVP_MD_CTX *md_ctx; + const EVP_MD *md; + unsigned int md_len; + int ret; + + ret = posix_memalign((void *)&mgr, 16, sizeof(SM3_HASH_CTX_MGR)); + if ((ret != 0) || (mgr == NULL)) { + printf("posix_memalign failed test aborted\n"); + return 1; + } + + sm3_ctx_mgr_init(mgr); + + printf("sm3_large_test\n"); + + // Init ctx contents + for (i = 0; i < TEST_BUFS; i++) { + bufs[i] = (unsigned char *)calloc((size_t)TEST_LEN, 1); + if (bufs[i] == NULL) { + printf("malloc failed test aborted\n"); + return 1; + } + hash_ctx_init(&ctxpool[i]); + ctxpool[i].user_data = (void *)&udata[i]; + } + + //Openssl SM3 update test + md = EVP_sm3(); + md_ctx = EVP_MD_CTX_new(); + EVP_DigestInit_ex(md_ctx, md, NULL); + for (k = 0; k < ROTATION_TIMES; k++) { + EVP_DigestUpdate(md_ctx, bufs[k % TEST_BUFS], TEST_LEN); + } + EVP_DigestFinal_ex(md_ctx, digest_ref_upd, &md_len); + EVP_MD_CTX_free(md_ctx); + + // Initialize pool + for (i = 0; i < TEST_BUFS; i++) { + struct user_data *u = (struct user_data *)ctxpool[i].user_data; + u->idx = i; + u->processed = 0; + } + + printf("Starting updates\n"); + int highest_pool_idx = 0; + ctx = &ctxpool[highest_pool_idx++]; + while (ctx) { + int len = UPDATE_SIZE; + int update_type = HASH_UPDATE; + struct user_data *u = (struct user_data *)ctx->user_data; + int idx = u->idx; + + if (u->processed == 0) + update_type = HASH_FIRST; + + else if (hash_ctx_complete(ctx)) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sm3_ctx_mgr_flush(mgr); + continue; + } else if (u->processed >= (LEN_TOTAL - UPDATE_SIZE)) { + len = (LEN_TOTAL - u->processed); + update_type = HASH_LAST; + } + u->processed += len; + ctx = sm3_ctx_mgr_submit(mgr, ctx, bufs[idx], len, update_type); + + if (NULL == ctx) { + if (highest_pool_idx < TEST_BUFS) + ctx = &ctxpool[highest_pool_idx++]; + else + ctx = sm3_ctx_mgr_flush(mgr); + } + } + + printf("multibuffer SM3 digest: \n"); + for (i = 0; i < TEST_BUFS; i++) { + printf("Total processing size of buf[%d] is %ld \n", i, + ctxpool[i].total_length); + for (j = 0; j < SM3_DIGEST_NWORDS; j++) { + printf("digest%d : %08X\n", j, ctxpool[i].job.result_digest[j]); + } + } + printf("\n"); + + printf("openssl SM3 update digest: \n"); + for (i = 0; i < SM3_DIGEST_NWORDS; i++) + printf("%08X - ", to_le32(((uint32_t *) digest_ref_upd)[i])); + printf("\n"); + + for (i = 0; i < TEST_BUFS; i++) { + for (j = 0; j < SM3_DIGEST_NWORDS; j++) { + if (ctxpool[i].job.result_digest[j] != + to_le32(((uint32_t *) digest_ref_upd)[j])) { + fail++; + } + } + } + + if (fail) + printf("Test failed SM3_hash_large check %d\n", fail); + else + printf(" SM3_hash_large_test: Pass\n"); + return fail; +} -- cgit v1.2.3