xref: /isa-l_crypto/mh_sha256/mh_sha256_update_test.c (revision f6da0bf48af4a49143c2bd4ecaa976ae453273d6)
17dc32ad5SXiaodong Liu /**********************************************************************
27dc32ad5SXiaodong Liu   Copyright(c) 2011-2017 Intel Corporation All rights reserved.
37dc32ad5SXiaodong Liu 
47dc32ad5SXiaodong Liu   Redistribution and use in source and binary forms, with or without
57dc32ad5SXiaodong Liu   modification, are permitted provided that the following conditions
67dc32ad5SXiaodong Liu   are met:
77dc32ad5SXiaodong Liu     * Redistributions of source code must retain the above copyright
87dc32ad5SXiaodong Liu       notice, this list of conditions and the following disclaimer.
97dc32ad5SXiaodong Liu     * Redistributions in binary form must reproduce the above copyright
107dc32ad5SXiaodong Liu       notice, this list of conditions and the following disclaimer in
117dc32ad5SXiaodong Liu       the documentation and/or other materials provided with the
127dc32ad5SXiaodong Liu       distribution.
137dc32ad5SXiaodong Liu     * Neither the name of Intel Corporation nor the names of its
147dc32ad5SXiaodong Liu       contributors may be used to endorse or promote products derived
157dc32ad5SXiaodong Liu       from this software without specific prior written permission.
167dc32ad5SXiaodong Liu 
177dc32ad5SXiaodong Liu   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
187dc32ad5SXiaodong Liu   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
197dc32ad5SXiaodong Liu   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
207dc32ad5SXiaodong Liu   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
217dc32ad5SXiaodong Liu   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
227dc32ad5SXiaodong Liu   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
237dc32ad5SXiaodong Liu   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
247dc32ad5SXiaodong Liu   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
257dc32ad5SXiaodong Liu   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
267dc32ad5SXiaodong Liu   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
277dc32ad5SXiaodong Liu   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
287dc32ad5SXiaodong Liu **********************************************************************/
297dc32ad5SXiaodong Liu 
307dc32ad5SXiaodong Liu #include <stdio.h>
317dc32ad5SXiaodong Liu #include <stdlib.h>
32421a5829SMarcel Cornu #include "isal_crypto_api.h"
337dc32ad5SXiaodong Liu #include "mh_sha256.h"
347dc32ad5SXiaodong Liu 
357dc32ad5SXiaodong Liu #define TEST_LEN  16 * 1024
367dc32ad5SXiaodong Liu #define TEST_SIZE 8 * 1024
377dc32ad5SXiaodong Liu #define TEST_MEM  TEST_LEN
387dc32ad5SXiaodong Liu #ifndef TEST_SEED
397dc32ad5SXiaodong Liu #define TEST_SEED 0x1234
407dc32ad5SXiaodong Liu #endif
417dc32ad5SXiaodong Liu 
427dc32ad5SXiaodong Liu #define str(s)  #s
437dc32ad5SXiaodong Liu #define xstr(s) str(s)
447dc32ad5SXiaodong Liu 
457dc32ad5SXiaodong Liu #define _FUNC_TOKEN(func, type) func##type
467dc32ad5SXiaodong Liu #define FUNC_TOKEN(func, type)  _FUNC_TOKEN(func, type)
477dc32ad5SXiaodong Liu 
487dc32ad5SXiaodong Liu #ifndef MH_SHA256_FUNC_TYPE
497dc32ad5SXiaodong Liu #define MH_SHA256_FUNC_TYPE
507dc32ad5SXiaodong Liu #endif
517dc32ad5SXiaodong Liu 
5217a3a6ccSMarcel Cornu #define TEST_UPDATE_FUNCTION FUNC_TOKEN(isal_mh_sha256_update, MH_SHA256_FUNC_TYPE)
5317a3a6ccSMarcel Cornu #define TEST_FINAL_FUNCTION  FUNC_TOKEN(isal_mh_sha256_finalize, MH_SHA256_FUNC_TYPE)
547dc32ad5SXiaodong Liu 
5538e16e11SMarcel Cornu #define CHECK_RETURN(state)                                                                        \
5638e16e11SMarcel Cornu         do {                                                                                       \
57421a5829SMarcel Cornu                 if ((state) != ISAL_CRYPTO_ERR_NONE) {                                             \
587dc32ad5SXiaodong Liu                         printf("The mh_sha256 function is failed.\n");                             \
597dc32ad5SXiaodong Liu                         return 1;                                                                  \
607dc32ad5SXiaodong Liu                 }                                                                                  \
617dc32ad5SXiaodong Liu         } while (0)
627dc32ad5SXiaodong Liu 
6338e16e11SMarcel Cornu extern void
6438e16e11SMarcel Cornu mh_sha256_ref(const void *buffer, uint32_t len, uint32_t *mh_sha256_digest);
657dc32ad5SXiaodong Liu 
667dc32ad5SXiaodong Liu // Generates pseudo-random data
6738e16e11SMarcel Cornu void
rand_buffer(uint8_t * buf,long buffer_size)6838e16e11SMarcel Cornu rand_buffer(uint8_t *buf, long buffer_size)
697dc32ad5SXiaodong Liu {
707dc32ad5SXiaodong Liu         long i;
717dc32ad5SXiaodong Liu         for (i = 0; i < buffer_size; i++)
727dc32ad5SXiaodong Liu                 buf[i] = rand();
737dc32ad5SXiaodong Liu }
747dc32ad5SXiaodong Liu 
7538e16e11SMarcel Cornu void
dump(char * buf,int len)7638e16e11SMarcel Cornu dump(char *buf, int len)
777dc32ad5SXiaodong Liu {
787dc32ad5SXiaodong Liu         int i;
797dc32ad5SXiaodong Liu         for (i = 0; i < len;) {
807dc32ad5SXiaodong Liu                 printf(" %2x", 0xff & buf[i++]);
817dc32ad5SXiaodong Liu                 if (i % 20 == 0)
827dc32ad5SXiaodong Liu                         printf("\n");
837dc32ad5SXiaodong Liu         }
847dc32ad5SXiaodong Liu         if (i % 20 != 0)
857dc32ad5SXiaodong Liu                 printf("\n");
867dc32ad5SXiaodong Liu }
877dc32ad5SXiaodong Liu 
8838e16e11SMarcel Cornu int
compare_digests(uint32_t hash_ref[ISAL_SHA256_DIGEST_WORDS],uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS])8915f45959SMarcel Cornu compare_digests(uint32_t hash_ref[ISAL_SHA256_DIGEST_WORDS],
9015f45959SMarcel Cornu                 uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS])
917dc32ad5SXiaodong Liu {
927dc32ad5SXiaodong Liu         int i;
937dc32ad5SXiaodong Liu         int mh_sha256_fail = 0;
947dc32ad5SXiaodong Liu 
9515f45959SMarcel Cornu         for (i = 0; i < ISAL_SHA256_DIGEST_WORDS; i++) {
967dc32ad5SXiaodong Liu                 if (hash_test[i] != hash_ref[i])
977dc32ad5SXiaodong Liu                         mh_sha256_fail++;
987dc32ad5SXiaodong Liu         }
997dc32ad5SXiaodong Liu 
1007dc32ad5SXiaodong Liu         if (mh_sha256_fail) {
1017dc32ad5SXiaodong Liu                 printf("mh_sha256 fail test\n");
1027dc32ad5SXiaodong Liu                 printf("ref: ");
1037dc32ad5SXiaodong Liu                 dump((char *) hash_ref, 20);
1047dc32ad5SXiaodong Liu                 printf("test: ");
1057dc32ad5SXiaodong Liu                 dump((char *) hash_test, 20);
1067dc32ad5SXiaodong Liu         }
1077dc32ad5SXiaodong Liu 
1087dc32ad5SXiaodong Liu         return mh_sha256_fail;
1097dc32ad5SXiaodong Liu }
1107dc32ad5SXiaodong Liu 
11138e16e11SMarcel Cornu int
main(int argc,char * argv[])11238e16e11SMarcel Cornu main(int argc, char *argv[])
1137dc32ad5SXiaodong Liu {
11417a3a6ccSMarcel Cornu         int fail = 0;
11517a3a6ccSMarcel Cornu #ifndef FIPS_MODE
11615f45959SMarcel Cornu         uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS], hash_ref[ISAL_SHA256_DIGEST_WORDS];
1177dc32ad5SXiaodong Liu         uint8_t *buff = NULL;
11817a3a6ccSMarcel Cornu         int i, update_count;
1197dc32ad5SXiaodong Liu         int size1, size2, offset, addr_offset;
120*f6da0bf4SMarcel Cornu         struct isal_mh_sha256_ctx *update_ctx = NULL;
1217dc32ad5SXiaodong Liu         uint8_t *mem_addr = NULL;
1227dc32ad5SXiaodong Liu 
1237dc32ad5SXiaodong Liu         printf(xstr(TEST_UPDATE_FUNCTION) "_test:");
1247dc32ad5SXiaodong Liu 
1257dc32ad5SXiaodong Liu         srand(TEST_SEED);
1267dc32ad5SXiaodong Liu 
1277dc32ad5SXiaodong Liu         buff = malloc(TEST_LEN);
1287dc32ad5SXiaodong Liu         update_ctx = malloc(sizeof(*update_ctx));
1297dc32ad5SXiaodong Liu 
1307dc32ad5SXiaodong Liu         if (buff == NULL || update_ctx == NULL) {
1317dc32ad5SXiaodong Liu                 printf("malloc failed test aborted\n");
132a5802248SMarcel Cornu                 goto end_ctx;
1337dc32ad5SXiaodong Liu         }
1347dc32ad5SXiaodong Liu         // Rand test1
1357dc32ad5SXiaodong Liu         rand_buffer(buff, TEST_LEN);
1367dc32ad5SXiaodong Liu 
1377dc32ad5SXiaodong Liu         mh_sha256_ref(buff, TEST_LEN, hash_ref);
1387dc32ad5SXiaodong Liu 
13917a3a6ccSMarcel Cornu         CHECK_RETURN(isal_mh_sha256_init(update_ctx));
1407dc32ad5SXiaodong Liu         CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, TEST_LEN));
1417dc32ad5SXiaodong Liu         CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
1427dc32ad5SXiaodong Liu 
1437dc32ad5SXiaodong Liu         fail = compare_digests(hash_ref, hash_test);
1447dc32ad5SXiaodong Liu 
1457dc32ad5SXiaodong Liu         if (fail) {
1467dc32ad5SXiaodong Liu                 printf("fail rand1 test\n");
147a5802248SMarcel Cornu                 goto end_ctx;
1487dc32ad5SXiaodong Liu         } else
1497dc32ad5SXiaodong Liu                 putchar('.');
1507dc32ad5SXiaodong Liu 
1517dc32ad5SXiaodong Liu         // Test various size messages by update twice.
1527dc32ad5SXiaodong Liu         printf("\n various size messages by update twice tests");
1537dc32ad5SXiaodong Liu         for (size1 = TEST_LEN; size1 >= 0; size1--) {
1547dc32ad5SXiaodong Liu 
1557dc32ad5SXiaodong Liu                 // Fill with rand data
1567dc32ad5SXiaodong Liu                 rand_buffer(buff, TEST_LEN);
1577dc32ad5SXiaodong Liu 
1587dc32ad5SXiaodong Liu                 mh_sha256_ref(buff, TEST_LEN, hash_ref);
1597dc32ad5SXiaodong Liu 
1607dc32ad5SXiaodong Liu                 // subsequent update
1617dc32ad5SXiaodong Liu                 size2 = TEST_LEN - size1; // size2 is different with the former
16217a3a6ccSMarcel Cornu                 CHECK_RETURN(isal_mh_sha256_init(update_ctx));
1637dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, size1));
1647dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + size1, size2));
1657dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
1667dc32ad5SXiaodong Liu 
1677dc32ad5SXiaodong Liu                 fail = compare_digests(hash_ref, hash_test);
1687dc32ad5SXiaodong Liu 
1697dc32ad5SXiaodong Liu                 if (fail) {
1707dc32ad5SXiaodong Liu                         printf("Fail size1=%d\n", size1);
171a5802248SMarcel Cornu                         goto end_ctx;
1727dc32ad5SXiaodong Liu                 }
1737dc32ad5SXiaodong Liu 
1747dc32ad5SXiaodong Liu                 if ((size2 & 0xff) == 0) {
1757dc32ad5SXiaodong Liu                         putchar('.');
1767dc32ad5SXiaodong Liu                         fflush(0);
1777dc32ad5SXiaodong Liu                 }
1787dc32ad5SXiaodong Liu         }
1797dc32ad5SXiaodong Liu 
1807dc32ad5SXiaodong Liu         // Test various update count
1817dc32ad5SXiaodong Liu         printf("\n various update count tests");
1827dc32ad5SXiaodong Liu         for (update_count = 1; update_count <= TEST_LEN; update_count++) {
1837dc32ad5SXiaodong Liu 
1847dc32ad5SXiaodong Liu                 // Fill with rand data
1857dc32ad5SXiaodong Liu                 rand_buffer(buff, TEST_LEN);
1867dc32ad5SXiaodong Liu 
1877dc32ad5SXiaodong Liu                 mh_sha256_ref(buff, TEST_LEN, hash_ref);
1887dc32ad5SXiaodong Liu 
1897dc32ad5SXiaodong Liu                 // subsequent update
1907dc32ad5SXiaodong Liu                 size1 = TEST_LEN / update_count;
1917dc32ad5SXiaodong Liu                 size2 = TEST_LEN - size1 * (update_count - 1); // size2 is different with the former
1927dc32ad5SXiaodong Liu 
19317a3a6ccSMarcel Cornu                 CHECK_RETURN(isal_mh_sha256_init(update_ctx));
1947dc32ad5SXiaodong Liu                 for (i = 1, offset = 0; i < update_count; i++) {
1957dc32ad5SXiaodong Liu                         CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + offset, size1));
1967dc32ad5SXiaodong Liu                         offset += size1;
1977dc32ad5SXiaodong Liu                 }
1987dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + offset, size2));
1997dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
2007dc32ad5SXiaodong Liu 
2017dc32ad5SXiaodong Liu                 fail = compare_digests(hash_ref, hash_test);
2027dc32ad5SXiaodong Liu 
2037dc32ad5SXiaodong Liu                 if (fail) {
2047dc32ad5SXiaodong Liu                         printf("Fail size1=%d\n", size1);
205a5802248SMarcel Cornu                         goto end_ctx;
2067dc32ad5SXiaodong Liu                 }
2077dc32ad5SXiaodong Liu 
2087dc32ad5SXiaodong Liu                 if ((size2 & 0xff) == 0) {
2097dc32ad5SXiaodong Liu                         putchar('.');
2107dc32ad5SXiaodong Liu                         fflush(0);
2117dc32ad5SXiaodong Liu                 }
2127dc32ad5SXiaodong Liu         }
2137dc32ad5SXiaodong Liu 
2147dc32ad5SXiaodong Liu         // test various start address of ctx.
2157dc32ad5SXiaodong Liu         printf("\n various start address of ctx test");
216a5802248SMarcel Cornu 
2177dc32ad5SXiaodong Liu         free(update_ctx);
218a5802248SMarcel Cornu 
219a5802248SMarcel Cornu         // test various start address of ctx.
220a5802248SMarcel Cornu         printf("\n various start address of ctx test");
22127316f25SMarcel Cornu         mem_addr = (uint8_t *) malloc(sizeof(*update_ctx) + ISAL_AVX512_ALIGNED * 10);
222a5802248SMarcel Cornu         if (mem_addr == NULL) {
223a5802248SMarcel Cornu                 fail++;
224a5802248SMarcel Cornu                 goto end;
225a5802248SMarcel Cornu         }
226a5802248SMarcel Cornu 
22727316f25SMarcel Cornu         for (addr_offset = ISAL_AVX512_ALIGNED * 10; addr_offset >= 0; addr_offset--) {
2287dc32ad5SXiaodong Liu 
2297dc32ad5SXiaodong Liu                 // Fill with rand data
2307dc32ad5SXiaodong Liu                 rand_buffer(buff, TEST_LEN);
2317dc32ad5SXiaodong Liu 
2327dc32ad5SXiaodong Liu                 mh_sha256_ref(buff, TEST_LEN, hash_ref);
2337dc32ad5SXiaodong Liu 
2347dc32ad5SXiaodong Liu                 // a unaligned offset
235*f6da0bf4SMarcel Cornu                 update_ctx = (struct isal_mh_sha256_ctx *) (mem_addr + addr_offset);
23617a3a6ccSMarcel Cornu                 CHECK_RETURN(isal_mh_sha256_init(update_ctx));
2377dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, TEST_LEN));
2387dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
2397dc32ad5SXiaodong Liu 
2407dc32ad5SXiaodong Liu                 fail = compare_digests(hash_ref, hash_test);
2417dc32ad5SXiaodong Liu 
2427dc32ad5SXiaodong Liu                 if (fail) {
2437dc32ad5SXiaodong Liu                         printf("Fail addr_offset=%d\n", addr_offset);
244a5802248SMarcel Cornu                         goto end;
2457dc32ad5SXiaodong Liu                 }
2467dc32ad5SXiaodong Liu 
2477dc32ad5SXiaodong Liu                 if ((addr_offset & 0xf) == 0) {
2487dc32ad5SXiaodong Liu                         putchar('.');
2497dc32ad5SXiaodong Liu                         fflush(0);
2507dc32ad5SXiaodong Liu                 }
2517dc32ad5SXiaodong Liu         }
252a5802248SMarcel Cornu end:
253a5802248SMarcel Cornu         if (mem_addr != NULL)
254a5802248SMarcel Cornu                 free(mem_addr);
255a5802248SMarcel Cornu         if (buff != NULL)
256a5802248SMarcel Cornu                 free(buff);
2577dc32ad5SXiaodong Liu 
2587dc32ad5SXiaodong Liu         printf("\n" xstr(TEST_UPDATE_FUNCTION) "_test: %s\n", fail == 0 ? "Pass" : "Fail");
25917a3a6ccSMarcel Cornu #else
26017a3a6ccSMarcel Cornu         printf("Not Executed\n");
26117a3a6ccSMarcel Cornu #endif /* FIPS_MODE */
2627dc32ad5SXiaodong Liu         return fail;
2637dc32ad5SXiaodong Liu 
26417a3a6ccSMarcel Cornu #ifndef FIPS_MODE
265a5802248SMarcel Cornu end_ctx:
266a5802248SMarcel Cornu         if (update_ctx != NULL)
267a5802248SMarcel Cornu                 free(update_ctx);
268a5802248SMarcel Cornu         goto end;
26917a3a6ccSMarcel Cornu #endif
2707dc32ad5SXiaodong Liu }
271