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>
326df3ef80SGreg Tucker #include <openssl/sha.h>
336df3ef80SGreg Tucker #include "sha256_mb.h"
3492aa5aa4SGreg Tucker #include "endian_helper.h"
356df3ef80SGreg Tucker
366df3ef80SGreg Tucker #define TEST_LEN (1024 * 1024)
376df3ef80SGreg Tucker #define TEST_BUFS 200
386df3ef80SGreg Tucker #ifndef RANDOMS
396df3ef80SGreg Tucker #define RANDOMS 10
406df3ef80SGreg Tucker #endif
416df3ef80SGreg Tucker #ifndef TEST_SEED
426df3ef80SGreg Tucker #define TEST_SEED 0x1234
436df3ef80SGreg Tucker #endif
446df3ef80SGreg Tucker
456df3ef80SGreg Tucker /* Reference digest global to reduce stack usage */
460a437795SPablo de Lara static uint8_t digest_ssl[TEST_BUFS][4 * ISAL_SHA256_DIGEST_NWORDS];
476df3ef80SGreg Tucker
486df3ef80SGreg Tucker // Generates pseudo-random data
499ba6f238SMarcel Cornu void
rand_buffer(unsigned char * buf,const long buffer_size)509ba6f238SMarcel Cornu rand_buffer(unsigned char *buf, const long buffer_size)
516df3ef80SGreg Tucker {
526df3ef80SGreg Tucker long i;
536df3ef80SGreg Tucker for (i = 0; i < buffer_size; i++)
546df3ef80SGreg Tucker buf[i] = rand();
556df3ef80SGreg Tucker }
566df3ef80SGreg Tucker
579ba6f238SMarcel Cornu int
main(void)589ba6f238SMarcel Cornu main(void)
596df3ef80SGreg Tucker {
600a437795SPablo de Lara ISAL_SHA256_HASH_CTX_MGR *mgr = NULL;
61*487b772bSPablo de Lara ISAL_SHA256_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL;
626df3ef80SGreg Tucker unsigned char *bufs[TEST_BUFS];
636df3ef80SGreg Tucker uint32_t i, j, fail = 0;
646df3ef80SGreg Tucker uint32_t lens[TEST_BUFS];
656df3ef80SGreg Tucker unsigned int jobs, t;
66c91caf97STom Cosgrove int ret;
676df3ef80SGreg Tucker
689ba6f238SMarcel Cornu printf("multibinary_sha256 test, %d sets of %dx%d max: ", RANDOMS, TEST_BUFS, TEST_LEN);
696df3ef80SGreg Tucker
706df3ef80SGreg Tucker srand(TEST_SEED);
716df3ef80SGreg Tucker
720a437795SPablo de Lara ret = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SHA256_HASH_CTX_MGR));
73c91caf97STom Cosgrove if ((ret != 0) || (mgr == NULL)) {
74c91caf97STom Cosgrove printf("posix_memalign failed test aborted\n");
75c91caf97STom Cosgrove return 1;
76c91caf97STom Cosgrove }
77c91caf97STom Cosgrove
78*487b772bSPablo de Lara ret = isal_sha256_ctx_mgr_init(mgr);
79*487b772bSPablo de Lara if (ret)
80*487b772bSPablo de Lara return 1;
816df3ef80SGreg Tucker
826df3ef80SGreg Tucker for (i = 0; i < TEST_BUFS; i++) {
836df3ef80SGreg Tucker // Allocate and fill buffer
846df3ef80SGreg Tucker bufs[i] = (unsigned char *) malloc(TEST_LEN);
856df3ef80SGreg Tucker if (bufs[i] == NULL) {
866df3ef80SGreg Tucker printf("malloc failed test aborted\n");
876df3ef80SGreg Tucker return 1;
886df3ef80SGreg Tucker }
896df3ef80SGreg Tucker rand_buffer(bufs[i], TEST_LEN);
906df3ef80SGreg Tucker
916df3ef80SGreg Tucker // Init ctx contents
928cb7fe78SPablo de Lara isal_hash_ctx_init(&ctxpool[i]);
936df3ef80SGreg Tucker ctxpool[i].user_data = (void *) ((uint64_t) i);
946df3ef80SGreg Tucker
956df3ef80SGreg Tucker // SSL test
966df3ef80SGreg Tucker SHA256(bufs[i], TEST_LEN, digest_ssl[i]);
976df3ef80SGreg Tucker
986df3ef80SGreg Tucker // sb_sha256 test
99*487b772bSPablo de Lara ret = isal_sha256_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], TEST_LEN,
100*487b772bSPablo de Lara ISAL_HASH_ENTIRE);
101*487b772bSPablo de Lara if (ret)
102*487b772bSPablo de Lara return 1;
1036df3ef80SGreg Tucker }
1046df3ef80SGreg Tucker
105*487b772bSPablo de Lara do {
106*487b772bSPablo de Lara ret = isal_sha256_ctx_mgr_flush(mgr, &ctx);
107*487b772bSPablo de Lara if (ret)
108*487b772bSPablo de Lara return 1;
109*487b772bSPablo de Lara } while (ctx != NULL);
1106df3ef80SGreg Tucker
1116df3ef80SGreg Tucker for (i = 0; i < TEST_BUFS; i++) {
1120a437795SPablo de Lara for (j = 0; j < ISAL_SHA256_DIGEST_NWORDS; j++) {
1136df3ef80SGreg Tucker if (ctxpool[i].job.result_digest[j] !=
114e3f7d4fbSUlrich Weigand to_be32(((uint32_t *) digest_ssl[i])[j])) {
1156df3ef80SGreg Tucker fail++;
1169ba6f238SMarcel Cornu printf("Test%d, digest%d fail %08X <=> %08X\n", i, j,
1179ba6f238SMarcel Cornu ctxpool[i].job.result_digest[j],
118e3f7d4fbSUlrich Weigand to_be32(((uint32_t *) digest_ssl[i])[j]));
1196df3ef80SGreg Tucker }
1206df3ef80SGreg Tucker }
1216df3ef80SGreg Tucker }
1226df3ef80SGreg Tucker putchar('.');
1236df3ef80SGreg Tucker
1246df3ef80SGreg Tucker // Run tests with random size and number of jobs
1256df3ef80SGreg Tucker for (t = 0; t < RANDOMS; t++) {
1266df3ef80SGreg Tucker jobs = rand() % (TEST_BUFS);
1276df3ef80SGreg Tucker
128*487b772bSPablo de Lara ret = isal_sha256_ctx_mgr_init(mgr);
129*487b772bSPablo de Lara if (ret)
130*487b772bSPablo de Lara return 1;
1316df3ef80SGreg Tucker
1326df3ef80SGreg Tucker for (i = 0; i < jobs; i++) {
1336a128452SXinze Zhang // Random buffer with random len and contents
1346df3ef80SGreg Tucker lens[i] = rand() % (TEST_LEN);
1356df3ef80SGreg Tucker rand_buffer(bufs[i], lens[i]);
1366df3ef80SGreg Tucker
1376df3ef80SGreg Tucker // Run SSL test
1386df3ef80SGreg Tucker SHA256(bufs[i], lens[i], digest_ssl[i]);
1396df3ef80SGreg Tucker
1406df3ef80SGreg Tucker // Run sb_sha256 test
141*487b772bSPablo de Lara ret = isal_sha256_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], lens[i],
142*487b772bSPablo de Lara ISAL_HASH_ENTIRE);
143*487b772bSPablo de Lara if (ret)
144*487b772bSPablo de Lara return 1;
1456df3ef80SGreg Tucker }
1466df3ef80SGreg Tucker
147*487b772bSPablo de Lara do {
148*487b772bSPablo de Lara ret = isal_sha256_ctx_mgr_flush(mgr, &ctx);
149*487b772bSPablo de Lara if (ret)
150*487b772bSPablo de Lara return 1;
151*487b772bSPablo de Lara } while (ctx != NULL);
1526df3ef80SGreg Tucker
1536df3ef80SGreg Tucker for (i = 0; i < jobs; i++) {
1540a437795SPablo de Lara for (j = 0; j < ISAL_SHA256_DIGEST_NWORDS; j++) {
1556df3ef80SGreg Tucker if (ctxpool[i].job.result_digest[j] !=
156e3f7d4fbSUlrich Weigand to_be32(((uint32_t *) digest_ssl[i])[j])) {
1576df3ef80SGreg Tucker fail++;
1589ba6f238SMarcel Cornu printf("Test%d, digest%d fail %08X <=> %08X\n", i, j,
1599ba6f238SMarcel Cornu ctxpool[i].job.result_digest[j],
160e3f7d4fbSUlrich Weigand to_be32(((uint32_t *) digest_ssl[i])[j]));
1616df3ef80SGreg Tucker }
1626df3ef80SGreg Tucker }
1636df3ef80SGreg Tucker }
1646df3ef80SGreg Tucker if (fail) {
1656df3ef80SGreg Tucker printf("Test failed function check %d\n", fail);
1666df3ef80SGreg Tucker return fail;
1676df3ef80SGreg Tucker }
1686df3ef80SGreg Tucker
1696df3ef80SGreg Tucker putchar('.');
1706df3ef80SGreg Tucker fflush(0);
1716df3ef80SGreg Tucker } // random test t
1726df3ef80SGreg Tucker
1736df3ef80SGreg Tucker if (fail)
1746df3ef80SGreg Tucker printf("Test failed function check %d\n", fail);
1756df3ef80SGreg Tucker else
1766df3ef80SGreg Tucker printf(" multibinary_sha256_ssl rand: Pass\n");
1776df3ef80SGreg Tucker
1786df3ef80SGreg Tucker return fail;
1796df3ef80SGreg Tucker }
180