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