xref: /isa-l_crypto/mh_sha256/mh_sha256_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 #define MH_SHA256_REF mh_sha256_ref
667dc32ad5SXiaodong Liu 
677dc32ad5SXiaodong Liu // Generates pseudo-random data
6838e16e11SMarcel Cornu void
rand_buffer(uint8_t * buf,long buffer_size)6938e16e11SMarcel Cornu rand_buffer(uint8_t *buf, long buffer_size)
707dc32ad5SXiaodong Liu {
717dc32ad5SXiaodong Liu         long i;
727dc32ad5SXiaodong Liu         for (i = 0; i < buffer_size; i++)
737dc32ad5SXiaodong Liu                 buf[i] = rand();
747dc32ad5SXiaodong Liu }
757dc32ad5SXiaodong Liu 
7638e16e11SMarcel Cornu void
dump(char * buf,int len)7738e16e11SMarcel Cornu dump(char *buf, int len)
787dc32ad5SXiaodong Liu {
797dc32ad5SXiaodong Liu         int i;
807dc32ad5SXiaodong Liu         for (i = 0; i < len;) {
817dc32ad5SXiaodong Liu                 printf(" %2x", 0xff & buf[i++]);
827dc32ad5SXiaodong Liu                 if (i % 32 == 0)
837dc32ad5SXiaodong Liu                         printf("\n");
847dc32ad5SXiaodong Liu         }
857dc32ad5SXiaodong Liu         if (i % 32 != 0)
867dc32ad5SXiaodong Liu                 printf("\n");
877dc32ad5SXiaodong Liu }
887dc32ad5SXiaodong Liu 
8938e16e11SMarcel Cornu int
compare_digests(uint32_t hash_ref[ISAL_SHA256_DIGEST_WORDS],uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS])9015f45959SMarcel Cornu compare_digests(uint32_t hash_ref[ISAL_SHA256_DIGEST_WORDS],
9115f45959SMarcel Cornu                 uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS])
927dc32ad5SXiaodong Liu {
937dc32ad5SXiaodong Liu         int i;
947dc32ad5SXiaodong Liu         int mh_sha256_fail = 0;
957dc32ad5SXiaodong Liu 
9615f45959SMarcel Cornu         for (i = 0; i < ISAL_SHA256_DIGEST_WORDS; i++) {
977dc32ad5SXiaodong Liu                 if (hash_test[i] != hash_ref[i])
987dc32ad5SXiaodong Liu                         mh_sha256_fail++;
997dc32ad5SXiaodong Liu         }
1007dc32ad5SXiaodong Liu 
1017dc32ad5SXiaodong Liu         if (mh_sha256_fail) {
1027dc32ad5SXiaodong Liu                 printf("mh_sha256 fail test\n");
1037dc32ad5SXiaodong Liu                 printf("ref: ");
1047dc32ad5SXiaodong Liu                 dump((char *) hash_ref, 32);
1057dc32ad5SXiaodong Liu                 printf("test: ");
1067dc32ad5SXiaodong Liu                 dump((char *) hash_test, 32);
1077dc32ad5SXiaodong Liu         }
1087dc32ad5SXiaodong Liu 
1097dc32ad5SXiaodong Liu         return mh_sha256_fail;
1107dc32ad5SXiaodong Liu }
1117dc32ad5SXiaodong Liu 
11238e16e11SMarcel Cornu int
main(int argc,char * argv[])11338e16e11SMarcel Cornu main(int argc, char *argv[])
1147dc32ad5SXiaodong Liu {
1157dc32ad5SXiaodong Liu         int fail = 0;
11617a3a6ccSMarcel Cornu #ifndef FIPS_MODE
11715f45959SMarcel Cornu         uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS], hash_ref[ISAL_SHA256_DIGEST_WORDS];
1187dc32ad5SXiaodong Liu         uint8_t *buff = NULL;
1197dc32ad5SXiaodong Liu         int size, offset;
120*f6da0bf4SMarcel Cornu         struct isal_mh_sha256_ctx *update_ctx = NULL;
1217dc32ad5SXiaodong Liu 
1227dc32ad5SXiaodong Liu         printf(xstr(TEST_UPDATE_FUNCTION) "_test:\n");
1237dc32ad5SXiaodong Liu 
1247dc32ad5SXiaodong Liu         srand(TEST_SEED);
1257dc32ad5SXiaodong Liu 
1267dc32ad5SXiaodong Liu         buff = malloc(TEST_LEN);
1277dc32ad5SXiaodong Liu         update_ctx = malloc(sizeof(*update_ctx));
1287dc32ad5SXiaodong Liu 
1297dc32ad5SXiaodong Liu         if (buff == NULL || update_ctx == NULL) {
1307dc32ad5SXiaodong Liu                 printf("malloc failed test aborted\n");
131a5802248SMarcel Cornu                 fail++;
132a5802248SMarcel Cornu                 goto end;
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);
13817a3a6ccSMarcel Cornu         CHECK_RETURN(isal_mh_sha256_init(update_ctx));
1397dc32ad5SXiaodong Liu         CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, TEST_LEN));
1407dc32ad5SXiaodong Liu         CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
1417dc32ad5SXiaodong Liu 
1427dc32ad5SXiaodong Liu         fail = compare_digests(hash_ref, hash_test);
1437dc32ad5SXiaodong Liu 
1447dc32ad5SXiaodong Liu         if (fail) {
1457dc32ad5SXiaodong Liu                 printf("fail rand1 test\n");
146a5802248SMarcel Cornu                 goto end;
1477dc32ad5SXiaodong Liu         } else
1487dc32ad5SXiaodong Liu                 putchar('.');
1497dc32ad5SXiaodong Liu 
1507dc32ad5SXiaodong Liu         // Test various size messages
1517dc32ad5SXiaodong Liu         for (size = TEST_LEN; size >= 0; size--) {
1527dc32ad5SXiaodong Liu 
1537dc32ad5SXiaodong Liu                 // Fill with rand data
1547dc32ad5SXiaodong Liu                 rand_buffer(buff, size);
1557dc32ad5SXiaodong Liu 
1567dc32ad5SXiaodong Liu                 MH_SHA256_REF(buff, size, hash_ref);
15717a3a6ccSMarcel Cornu                 CHECK_RETURN(isal_mh_sha256_init(update_ctx));
1587dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, size));
1597dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
1607dc32ad5SXiaodong Liu 
1617dc32ad5SXiaodong Liu                 fail = compare_digests(hash_ref, hash_test);
1627dc32ad5SXiaodong Liu 
1637dc32ad5SXiaodong Liu                 if (fail) {
1647dc32ad5SXiaodong Liu                         printf("Fail size=%d\n", size);
165a5802248SMarcel Cornu                         goto end;
1667dc32ad5SXiaodong Liu                 }
1677dc32ad5SXiaodong Liu 
1687dc32ad5SXiaodong Liu                 if ((size & 0xff) == 0) {
1697dc32ad5SXiaodong Liu                         putchar('.');
1707dc32ad5SXiaodong Liu                         fflush(0);
1717dc32ad5SXiaodong Liu                 }
1727dc32ad5SXiaodong Liu         }
1737dc32ad5SXiaodong Liu 
1747dc32ad5SXiaodong Liu         // Test various buffer offsets and sizes
1757dc32ad5SXiaodong Liu         printf("offset tests");
1767dc32ad5SXiaodong Liu         for (size = TEST_LEN - 256; size > 256; size -= 11) {
1777dc32ad5SXiaodong Liu                 for (offset = 0; offset < 256; offset++) {
1787dc32ad5SXiaodong Liu                         MH_SHA256_REF(buff + offset, size, hash_ref);
1797dc32ad5SXiaodong Liu 
18017a3a6ccSMarcel Cornu                         CHECK_RETURN(isal_mh_sha256_init(update_ctx));
1817dc32ad5SXiaodong Liu                         CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + offset, size));
1827dc32ad5SXiaodong Liu                         CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
1837dc32ad5SXiaodong Liu 
1847dc32ad5SXiaodong Liu                         fail = compare_digests(hash_ref, hash_test);
1857dc32ad5SXiaodong Liu 
1867dc32ad5SXiaodong Liu                         if (fail) {
1877dc32ad5SXiaodong Liu                                 printf("Fail size=%d\n", size);
188a5802248SMarcel Cornu                                 goto end;
1897dc32ad5SXiaodong Liu                         }
1907dc32ad5SXiaodong Liu                 }
1917dc32ad5SXiaodong Liu                 if ((size & 0xf) == 0) {
1927dc32ad5SXiaodong Liu                         putchar('.');
1937dc32ad5SXiaodong Liu                         fflush(0);
1947dc32ad5SXiaodong Liu                 }
1957dc32ad5SXiaodong Liu         }
1967dc32ad5SXiaodong Liu 
1977dc32ad5SXiaodong Liu         // Run efence tests
1987dc32ad5SXiaodong Liu         printf("efence tests");
1997dc32ad5SXiaodong Liu         for (size = TEST_SIZE; size > 0; size--) {
2007dc32ad5SXiaodong Liu                 offset = TEST_LEN - size;
2017dc32ad5SXiaodong Liu 
2027dc32ad5SXiaodong Liu                 MH_SHA256_REF(buff + offset, size, hash_ref);
2037dc32ad5SXiaodong Liu 
20417a3a6ccSMarcel Cornu                 CHECK_RETURN(isal_mh_sha256_init(update_ctx));
2057dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + offset, size));
2067dc32ad5SXiaodong Liu                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
2077dc32ad5SXiaodong Liu 
2087dc32ad5SXiaodong Liu                 fail = compare_digests(hash_ref, hash_test);
2097dc32ad5SXiaodong Liu 
2107dc32ad5SXiaodong Liu                 if (fail) {
2117dc32ad5SXiaodong Liu                         printf("Fail size=%d\n", size);
212a5802248SMarcel Cornu                         goto end;
2137dc32ad5SXiaodong Liu                 }
2147dc32ad5SXiaodong Liu 
2157dc32ad5SXiaodong Liu                 if ((size & 0xf) == 0) {
2167dc32ad5SXiaodong Liu                         putchar('.');
2177dc32ad5SXiaodong Liu                         fflush(0);
2187dc32ad5SXiaodong Liu                 }
2197dc32ad5SXiaodong Liu         }
2207dc32ad5SXiaodong Liu 
221a5802248SMarcel Cornu end:
222a5802248SMarcel Cornu         if (buff != NULL)
223a5802248SMarcel Cornu                 free(buff);
224a5802248SMarcel Cornu         if (update_ctx != NULL)
225a5802248SMarcel Cornu                 free(update_ctx);
226a5802248SMarcel Cornu 
2277dc32ad5SXiaodong Liu         printf(xstr(TEST_UPDATE_FUNCTION) "_test:");
2287dc32ad5SXiaodong Liu         printf(" %s\n", fail == 0 ? "Pass" : "Fail");
22917a3a6ccSMarcel Cornu #else
23017a3a6ccSMarcel Cornu         printf("Not Executed\n");
23117a3a6ccSMarcel Cornu #endif /* FIPS_MODE */
2327dc32ad5SXiaodong Liu         return fail;
2337dc32ad5SXiaodong Liu }
234