16df3ef80SGreg Tucker /**********************************************************************
26df3ef80SGreg Tucker Copyright(c) 2011-2016 Intel Corporation All rights reserved.
36df3ef80SGreg Tucker
46df3ef80SGreg Tucker Redistribution and use in source and binary forms, with or without
56df3ef80SGreg Tucker modification, are permitted provided that the following conditions
66df3ef80SGreg Tucker are met:
76df3ef80SGreg Tucker * Redistributions of source code must retain the above copyright
86df3ef80SGreg Tucker notice, this list of conditions and the following disclaimer.
96df3ef80SGreg Tucker * Redistributions in binary form must reproduce the above copyright
106df3ef80SGreg Tucker notice, this list of conditions and the following disclaimer in
116df3ef80SGreg Tucker the documentation and/or other materials provided with the
126df3ef80SGreg Tucker distribution.
136df3ef80SGreg Tucker * Neither the name of Intel Corporation nor the names of its
146df3ef80SGreg Tucker contributors may be used to endorse or promote products derived
156df3ef80SGreg Tucker from this software without specific prior written permission.
166df3ef80SGreg Tucker
176df3ef80SGreg Tucker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186df3ef80SGreg Tucker "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196df3ef80SGreg Tucker LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206df3ef80SGreg Tucker A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216df3ef80SGreg Tucker OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226df3ef80SGreg Tucker SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236df3ef80SGreg Tucker LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246df3ef80SGreg Tucker DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256df3ef80SGreg Tucker THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266df3ef80SGreg Tucker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276df3ef80SGreg Tucker OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286df3ef80SGreg Tucker **********************************************************************/
296df3ef80SGreg Tucker
306df3ef80SGreg Tucker #include <stdio.h>
316df3ef80SGreg Tucker #include <stdlib.h>
3204ca2090SMarcel Cornu #include <string.h>
336df3ef80SGreg Tucker #include "sha1_mb.h"
346df3ef80SGreg Tucker
356df3ef80SGreg Tucker #define TEST_LEN (1024 * 1024)
366df3ef80SGreg Tucker #define TEST_BUFS 100
376df3ef80SGreg Tucker #ifndef RANDOMS
386df3ef80SGreg Tucker #define RANDOMS 10
396df3ef80SGreg Tucker #endif
406df3ef80SGreg Tucker #ifndef TEST_SEED
416df3ef80SGreg Tucker #define TEST_SEED 0x1234
426df3ef80SGreg Tucker #endif
436df3ef80SGreg Tucker
440106da91SPablo de Lara static uint32_t digest_ref[TEST_BUFS][ISAL_SHA1_DIGEST_NWORDS];
456df3ef80SGreg Tucker
466df3ef80SGreg Tucker // Compare against reference function
47868f05eaSMarcel Cornu extern void
48868f05eaSMarcel Cornu sha1_ref(uint8_t *input_data, uint32_t *digest, uint32_t len);
496df3ef80SGreg Tucker
506df3ef80SGreg Tucker // Generates pseudo-random data
51868f05eaSMarcel Cornu void
rand_buffer(unsigned char * buf,const long buffer_size)52868f05eaSMarcel Cornu rand_buffer(unsigned char *buf, const long buffer_size)
536df3ef80SGreg Tucker {
546df3ef80SGreg Tucker long i;
556df3ef80SGreg Tucker for (i = 0; i < buffer_size; i++)
566df3ef80SGreg Tucker buf[i] = rand();
576df3ef80SGreg Tucker }
586df3ef80SGreg Tucker
59868f05eaSMarcel Cornu int
main(void)60868f05eaSMarcel Cornu main(void)
616df3ef80SGreg Tucker {
620106da91SPablo de Lara ISAL_SHA1_HASH_CTX_MGR *mgr = NULL;
630106da91SPablo de Lara ISAL_SHA1_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL;
646df3ef80SGreg Tucker uint32_t i, j, fail = 0;
656df3ef80SGreg Tucker unsigned char *bufs[TEST_BUFS];
666df3ef80SGreg Tucker uint32_t lens[TEST_BUFS];
676df3ef80SGreg Tucker unsigned int jobs, t;
6804ca2090SMarcel Cornu uint8_t *tmp_buf = NULL;
69c91caf97STom Cosgrove int ret;
706df3ef80SGreg Tucker
716df3ef80SGreg Tucker printf("multibinary_sha1 test, %d sets of %dx%d max: ", RANDOMS, TEST_BUFS, TEST_LEN);
726df3ef80SGreg Tucker
730106da91SPablo de Lara ret = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SHA1_HASH_CTX_MGR));
74c91caf97STom Cosgrove if ((ret != 0) || (mgr == NULL)) {
75c91caf97STom Cosgrove printf("posix_memalign failed test aborted\n");
76c91caf97STom Cosgrove return 1;
77c91caf97STom Cosgrove }
78c91caf97STom Cosgrove
7914a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_init(mgr);
8014a3d258SPablo de Lara if (ret)
8114a3d258SPablo de Lara return 1;
826df3ef80SGreg Tucker
836df3ef80SGreg Tucker srand(TEST_SEED);
846df3ef80SGreg Tucker
856df3ef80SGreg Tucker for (i = 0; i < TEST_BUFS; i++) {
866df3ef80SGreg Tucker // Allocate and fill buffer
876df3ef80SGreg Tucker bufs[i] = (unsigned char *) malloc(TEST_LEN);
886df3ef80SGreg Tucker if (bufs[i] == NULL) {
896df3ef80SGreg Tucker printf("malloc failed test aborted\n");
9004ca2090SMarcel Cornu fail++;
9104ca2090SMarcel Cornu goto end;
926df3ef80SGreg Tucker }
936df3ef80SGreg Tucker rand_buffer(bufs[i], TEST_LEN);
946df3ef80SGreg Tucker
956df3ef80SGreg Tucker // Init ctx contexts
96*8cb7fe78SPablo de Lara isal_hash_ctx_init(&ctxpool[i]);
976df3ef80SGreg Tucker ctxpool[i].user_data = (void *) ((uint64_t) i);
986df3ef80SGreg Tucker
996df3ef80SGreg Tucker // Run reference test
1006df3ef80SGreg Tucker sha1_ref(bufs[i], digest_ref[i], TEST_LEN);
1016df3ef80SGreg Tucker
1026df3ef80SGreg Tucker // Run sb_sha1 test
10314a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], TEST_LEN,
104*8cb7fe78SPablo de Lara ISAL_HASH_ENTIRE);
10514a3d258SPablo de Lara if (ret)
10614a3d258SPablo de Lara return 1;
1076df3ef80SGreg Tucker }
1086df3ef80SGreg Tucker
10914a3d258SPablo de Lara do {
11014a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_flush(mgr, &ctx);
11114a3d258SPablo de Lara if (ret)
11214a3d258SPablo de Lara return 1;
11314a3d258SPablo de Lara } while (ctx != NULL);
1146df3ef80SGreg Tucker
1156df3ef80SGreg Tucker for (i = 0; i < TEST_BUFS; i++) {
1160106da91SPablo de Lara for (j = 0; j < ISAL_SHA1_DIGEST_NWORDS; j++) {
1176df3ef80SGreg Tucker if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
1186df3ef80SGreg Tucker fail++;
1196df3ef80SGreg Tucker printf("Test%d fixed size, digest%d "
1206df3ef80SGreg Tucker "fail 0x%08X <=> 0x%08X \n",
121868f05eaSMarcel Cornu i, j, ctxpool[i].job.result_digest[j], digest_ref[i][j]);
1226df3ef80SGreg Tucker }
1236df3ef80SGreg Tucker }
1246df3ef80SGreg Tucker }
1256df3ef80SGreg Tucker
1266df3ef80SGreg Tucker if (fail) {
1276df3ef80SGreg Tucker printf("Test failed function check %d\n", fail);
12804ca2090SMarcel Cornu goto end;
1296df3ef80SGreg Tucker }
1306df3ef80SGreg Tucker // Run tests with random size and number of jobs
1316df3ef80SGreg Tucker for (t = 0; t < RANDOMS; t++) {
1326df3ef80SGreg Tucker jobs = rand() % (TEST_BUFS);
1336df3ef80SGreg Tucker
13414a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_init(mgr);
13514a3d258SPablo de Lara if (ret)
13614a3d258SPablo de Lara return 1;
1376df3ef80SGreg Tucker
1386df3ef80SGreg Tucker for (i = 0; i < jobs; i++) {
1396df3ef80SGreg Tucker // Use buffer with random len and contents
1406df3ef80SGreg Tucker lens[i] = rand() % (TEST_LEN);
1416df3ef80SGreg Tucker rand_buffer(bufs[i], lens[i]);
1426df3ef80SGreg Tucker
1436df3ef80SGreg Tucker // Run reference test
1446df3ef80SGreg Tucker sha1_ref(bufs[i], digest_ref[i], lens[i]);
1456df3ef80SGreg Tucker
1466df3ef80SGreg Tucker // Run sha1_mb test
14714a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], lens[i],
148*8cb7fe78SPablo de Lara ISAL_HASH_ENTIRE);
14914a3d258SPablo de Lara if (ret)
15014a3d258SPablo de Lara return 1;
1516df3ef80SGreg Tucker }
1526df3ef80SGreg Tucker
15314a3d258SPablo de Lara do {
15414a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_flush(mgr, &ctx);
15514a3d258SPablo de Lara if (ret)
15614a3d258SPablo de Lara return 1;
15714a3d258SPablo de Lara } while (ctx != NULL);
1586df3ef80SGreg Tucker
1596df3ef80SGreg Tucker for (i = 0; i < jobs; i++) {
1600106da91SPablo de Lara for (j = 0; j < ISAL_SHA1_DIGEST_NWORDS; j++) {
1616df3ef80SGreg Tucker if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
1626df3ef80SGreg Tucker fail++;
1636df3ef80SGreg Tucker printf("Test%d, digest%d fail "
1646df3ef80SGreg Tucker "0x%08X <=> 0x%08X\n",
1656df3ef80SGreg Tucker i, j, ctxpool[i].job.result_digest[j],
1666df3ef80SGreg Tucker digest_ref[i][j]);
1676df3ef80SGreg Tucker }
1686df3ef80SGreg Tucker }
1696df3ef80SGreg Tucker }
1706df3ef80SGreg Tucker if (fail) {
1716df3ef80SGreg Tucker printf("Test failed function check %d\n", fail);
17204ca2090SMarcel Cornu goto end;
1736df3ef80SGreg Tucker }
1746df3ef80SGreg Tucker
1756df3ef80SGreg Tucker putchar('.');
1766df3ef80SGreg Tucker fflush(0);
1776df3ef80SGreg Tucker } // random test t
1786df3ef80SGreg Tucker
1796df3ef80SGreg Tucker // Test at the end of buffer
1806df3ef80SGreg Tucker jobs = rand() % TEST_BUFS;
1816df3ef80SGreg Tucker tmp_buf = (uint8_t *) malloc(sizeof(uint8_t) * jobs);
1826df3ef80SGreg Tucker if (!tmp_buf) {
1836df3ef80SGreg Tucker printf("malloc failed, end test aborted.\n");
18404ca2090SMarcel Cornu goto end;
1856df3ef80SGreg Tucker }
1866df3ef80SGreg Tucker
1876df3ef80SGreg Tucker rand_buffer(tmp_buf, jobs);
1886df3ef80SGreg Tucker
18914a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_init(mgr);
19014a3d258SPablo de Lara if (ret)
19114a3d258SPablo de Lara return 1;
1926df3ef80SGreg Tucker
19304ca2090SMarcel Cornu for (i = 0; i < TEST_BUFS; i++)
19404ca2090SMarcel Cornu free(bufs[i]);
19504ca2090SMarcel Cornu
1966df3ef80SGreg Tucker // Extend to the end of allocated buffer to construct jobs
1976df3ef80SGreg Tucker for (i = 0; i < jobs; i++) {
1986df3ef80SGreg Tucker bufs[i] = (uint8_t *) &tmp_buf[i];
1996df3ef80SGreg Tucker lens[i] = jobs - i;
2006df3ef80SGreg Tucker
2016df3ef80SGreg Tucker // Reference test
2026df3ef80SGreg Tucker sha1_ref(bufs[i], digest_ref[i], lens[i]);
2036df3ef80SGreg Tucker
2046df3ef80SGreg Tucker // sb_sha1 test
20514a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], lens[i],
206*8cb7fe78SPablo de Lara ISAL_HASH_ENTIRE);
20714a3d258SPablo de Lara if (ret)
20814a3d258SPablo de Lara return 1;
2096df3ef80SGreg Tucker }
21004ca2090SMarcel Cornu // Clear bufs
21104ca2090SMarcel Cornu memset(bufs, 0, sizeof(bufs));
2126df3ef80SGreg Tucker
21314a3d258SPablo de Lara do {
21414a3d258SPablo de Lara ret = isal_sha1_ctx_mgr_flush(mgr, &ctx);
21514a3d258SPablo de Lara if (ret)
21614a3d258SPablo de Lara return 1;
21714a3d258SPablo de Lara } while (ctx != NULL);
2186df3ef80SGreg Tucker
2196df3ef80SGreg Tucker for (i = 0; i < jobs; i++) {
2200106da91SPablo de Lara for (j = 0; j < ISAL_SHA1_DIGEST_NWORDS; j++) {
2216df3ef80SGreg Tucker if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
2226df3ef80SGreg Tucker fail++;
2236df3ef80SGreg Tucker printf("End test failed at offset %d - result: 0x%08X"
224868f05eaSMarcel Cornu ", ref: 0x%08X\n",
225868f05eaSMarcel Cornu i, ctxpool[i].job.result_digest[j], digest_ref[i][j]);
2266df3ef80SGreg Tucker }
2276df3ef80SGreg Tucker }
2286df3ef80SGreg Tucker }
2296df3ef80SGreg Tucker putchar('.');
2306df3ef80SGreg Tucker
23104ca2090SMarcel Cornu end:
23204ca2090SMarcel Cornu for (i = 0; i < TEST_BUFS; i++)
23304ca2090SMarcel Cornu free(bufs[i]);
23404ca2090SMarcel Cornu free(tmp_buf);
23504ca2090SMarcel Cornu aligned_free(mgr);
23604ca2090SMarcel Cornu
2376df3ef80SGreg Tucker if (fail)
2386df3ef80SGreg Tucker printf("Test failed function check %d\n", fail);
2396df3ef80SGreg Tucker else
2406df3ef80SGreg Tucker printf(" multibinary_sha1 rand: Pass\n");
2416df3ef80SGreg Tucker
2426df3ef80SGreg Tucker return fail;
2436df3ef80SGreg Tucker }
244