xref: /isa-l_crypto/sha512_mb/sha512_mb_rand_test.c (revision 34bf6af21bafe61f414035ed3ba9f4578d60309f)
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>
320cabffc5SMarcel Cornu #include <string.h>
336df3ef80SGreg Tucker #include "sha512_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 
44592e639eSPablo de Lara static uint64_t digest_ref[TEST_BUFS][ISAL_SHA512_DIGEST_NWORDS];
456df3ef80SGreg Tucker 
466df3ef80SGreg Tucker // Compare against reference function
473fb7b5f1SMarcel Cornu extern void
483fb7b5f1SMarcel Cornu sha512_ref(uint8_t *input_data, uint64_t *digest, uint32_t len);
496df3ef80SGreg Tucker 
506df3ef80SGreg Tucker // Generates pseudo-random data
513fb7b5f1SMarcel Cornu void
rand_buffer(unsigned char * buf,const long buffer_size)523fb7b5f1SMarcel 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 
593fb7b5f1SMarcel Cornu int
main(void)603fb7b5f1SMarcel Cornu main(void)
616df3ef80SGreg Tucker {
62592e639eSPablo de Lara         ISAL_SHA512_HASH_CTX_MGR *mgr = NULL;
63*34bf6af2SPablo de Lara         ISAL_SHA512_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL;
646df3ef80SGreg Tucker         uint32_t i, j, fail = 0;
650cabffc5SMarcel Cornu         unsigned char *bufs[TEST_BUFS] = { 0 };
666df3ef80SGreg Tucker         uint32_t lens[TEST_BUFS];
676df3ef80SGreg Tucker         unsigned int jobs, t;
680cabffc5SMarcel Cornu         uint8_t *tmp_buf = NULL;
69c91caf97STom Cosgrove         int ret;
706df3ef80SGreg Tucker 
713fb7b5f1SMarcel Cornu         printf("multibinary_sha512 test, %d sets of %dx%d max: ", RANDOMS, TEST_BUFS, TEST_LEN);
726df3ef80SGreg Tucker 
73592e639eSPablo de Lara         ret = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SHA512_HASH_CTX_MGR));
74c91caf97STom Cosgrove         if ((ret != 0) || (mgr == NULL)) {
75c91caf97STom Cosgrove                 printf("posix_memalign failed test aborted\n");
760cabffc5SMarcel Cornu                 goto end;
77c91caf97STom Cosgrove         }
78c91caf97STom Cosgrove 
79*34bf6af2SPablo de Lara         ret = isal_sha512_ctx_mgr_init(mgr);
80*34bf6af2SPablo de Lara         if (ret)
81*34bf6af2SPablo 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");
900cabffc5SMarcel Cornu                         goto end;
916df3ef80SGreg Tucker                 }
926df3ef80SGreg Tucker                 rand_buffer(bufs[i], TEST_LEN);
936df3ef80SGreg Tucker 
946df3ef80SGreg Tucker                 // Init ctx contexts
958cb7fe78SPablo de Lara                 isal_hash_ctx_init(&ctxpool[i]);
966df3ef80SGreg Tucker                 ctxpool[i].user_data = (void *) ((uint64_t) i);
976df3ef80SGreg Tucker 
986df3ef80SGreg Tucker                 // Run reference test
996df3ef80SGreg Tucker                 sha512_ref(bufs[i], digest_ref[i], TEST_LEN);
1006df3ef80SGreg Tucker 
1016df3ef80SGreg Tucker                 // Run sb_sha512 test
102*34bf6af2SPablo de Lara                 ret = isal_sha512_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], TEST_LEN,
103*34bf6af2SPablo de Lara                                                  ISAL_HASH_ENTIRE);
104*34bf6af2SPablo de Lara                 if (ret)
105*34bf6af2SPablo de Lara                         return 1;
1066df3ef80SGreg Tucker         }
1076df3ef80SGreg Tucker 
108*34bf6af2SPablo de Lara         do {
109*34bf6af2SPablo de Lara                 ret = isal_sha512_ctx_mgr_flush(mgr, &ctx);
110*34bf6af2SPablo de Lara                 if (ret)
111*34bf6af2SPablo de Lara                         return 1;
112*34bf6af2SPablo de Lara         } while (ctx != NULL);
1136df3ef80SGreg Tucker 
1146df3ef80SGreg Tucker         for (i = 0; i < TEST_BUFS; i++) {
115592e639eSPablo de Lara                 for (j = 0; j < ISAL_SHA512_DIGEST_NWORDS; j++) {
1166df3ef80SGreg Tucker                         if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
1176df3ef80SGreg Tucker                                 fail++;
1186df3ef80SGreg Tucker                                 printf("Test%d fixed size, digest%d "
11987dde3adSTomasz Kantecki                                        "fail 0x%016llX <=> 0x%016llX \n",
12087dde3adSTomasz Kantecki                                        i, j, (unsigned long long) ctxpool[i].job.result_digest[j],
12187dde3adSTomasz Kantecki                                        (unsigned long long) 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);
1280cabffc5SMarcel 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 
134*34bf6af2SPablo de Lara                 ret = isal_sha512_ctx_mgr_init(mgr);
135*34bf6af2SPablo de Lara                 if (ret)
136*34bf6af2SPablo 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                         sha512_ref(bufs[i], digest_ref[i], lens[i]);
1456df3ef80SGreg Tucker 
1466df3ef80SGreg Tucker                         // Run sha512_mb test
147*34bf6af2SPablo de Lara                         ret = isal_sha512_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], lens[i],
148*34bf6af2SPablo de Lara                                                          ISAL_HASH_ENTIRE);
149*34bf6af2SPablo de Lara                         if (ret)
150*34bf6af2SPablo de Lara                                 return 1;
1516df3ef80SGreg Tucker                 }
1526df3ef80SGreg Tucker 
153*34bf6af2SPablo de Lara                 do {
154*34bf6af2SPablo de Lara                         ret = isal_sha512_ctx_mgr_flush(mgr, &ctx);
155*34bf6af2SPablo de Lara                         if (ret)
156*34bf6af2SPablo de Lara                                 return 1;
157*34bf6af2SPablo de Lara                 } while (ctx != NULL);
1586df3ef80SGreg Tucker 
1596df3ef80SGreg Tucker                 for (i = 0; i < jobs; i++) {
160592e639eSPablo de Lara                         for (j = 0; j < ISAL_SHA512_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 "
16487dde3adSTomasz Kantecki                                                "0x%016llX <=> 0x%016llX\n",
16587dde3adSTomasz Kantecki                                                i, j,
16687dde3adSTomasz Kantecki                                                (unsigned long long) ctxpool[i].job.result_digest[j],
16787dde3adSTomasz Kantecki                                                (unsigned long long) digest_ref[i][j]);
1686df3ef80SGreg Tucker                                 }
1696df3ef80SGreg Tucker                         }
1706df3ef80SGreg Tucker                 }
1716df3ef80SGreg Tucker                 if (fail) {
1726df3ef80SGreg Tucker                         printf("Test failed function check %d\n", fail);
1730cabffc5SMarcel Cornu                         goto end;
1746df3ef80SGreg Tucker                 }
1756df3ef80SGreg Tucker 
1766df3ef80SGreg Tucker                 putchar('.');
1776df3ef80SGreg Tucker                 fflush(0);
1786df3ef80SGreg Tucker         } // random test t
1796df3ef80SGreg Tucker 
1806df3ef80SGreg Tucker         // Test at the end of buffer
1816df3ef80SGreg Tucker         jobs = rand() % TEST_BUFS;
1826df3ef80SGreg Tucker         tmp_buf = (uint8_t *) malloc(sizeof(uint8_t) * jobs);
1836df3ef80SGreg Tucker         if (!tmp_buf) {
1846df3ef80SGreg Tucker                 printf("malloc failed, end test aborted.\n");
1850cabffc5SMarcel Cornu                 goto end;
1866df3ef80SGreg Tucker         }
1876df3ef80SGreg Tucker 
1886df3ef80SGreg Tucker         rand_buffer(tmp_buf, jobs);
1896df3ef80SGreg Tucker 
190*34bf6af2SPablo de Lara         ret = isal_sha512_ctx_mgr_init(mgr);
191*34bf6af2SPablo de Lara         if (ret)
192*34bf6af2SPablo de Lara                 return 1;
1936df3ef80SGreg Tucker 
1940cabffc5SMarcel Cornu         for (i = 0; i < TEST_BUFS; i++)
1950cabffc5SMarcel Cornu                 free(bufs[i]);
1960cabffc5SMarcel Cornu 
1976df3ef80SGreg Tucker         // Extend to the end of allocated buffer to construct jobs
1986df3ef80SGreg Tucker         for (i = 0; i < jobs; i++) {
1996df3ef80SGreg Tucker                 bufs[i] = (uint8_t *) &tmp_buf[i];
2006df3ef80SGreg Tucker                 lens[i] = jobs - i;
2016df3ef80SGreg Tucker 
2026df3ef80SGreg Tucker                 // Reference test
2036df3ef80SGreg Tucker                 sha512_ref(bufs[i], digest_ref[i], lens[i]);
2046df3ef80SGreg Tucker 
2056df3ef80SGreg Tucker                 // sb_sha512 test
206*34bf6af2SPablo de Lara                 ret = isal_sha512_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], lens[i],
207*34bf6af2SPablo de Lara                                                  ISAL_HASH_ENTIRE);
208*34bf6af2SPablo de Lara                 if (ret)
209*34bf6af2SPablo de Lara                         return 1;
2106df3ef80SGreg Tucker         }
2110cabffc5SMarcel Cornu         // Clear bufs
2120cabffc5SMarcel Cornu         memset(bufs, 0, sizeof(bufs));
2136df3ef80SGreg Tucker 
214*34bf6af2SPablo de Lara         do {
215*34bf6af2SPablo de Lara                 ret = isal_sha512_ctx_mgr_flush(mgr, &ctx);
216*34bf6af2SPablo de Lara                 if (ret)
217*34bf6af2SPablo de Lara                         return 1;
218*34bf6af2SPablo de Lara         } while (ctx != NULL);
2196df3ef80SGreg Tucker 
2206df3ef80SGreg Tucker         for (i = 0; i < jobs; i++) {
221592e639eSPablo de Lara                 for (j = 0; j < ISAL_SHA512_DIGEST_NWORDS; j++) {
2226df3ef80SGreg Tucker                         if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
2236df3ef80SGreg Tucker                                 fail++;
22487dde3adSTomasz Kantecki                                 printf("End test failed at offset %d - result: 0x%016llX"
22587dde3adSTomasz Kantecki                                        ", ref: 0x%016llX\n",
22687dde3adSTomasz Kantecki                                        i, (unsigned long long) ctxpool[i].job.result_digest[j],
22787dde3adSTomasz Kantecki                                        (unsigned long long) digest_ref[i][j]);
2286df3ef80SGreg Tucker                         }
2296df3ef80SGreg Tucker                 }
2306df3ef80SGreg Tucker         }
2316df3ef80SGreg Tucker 
2326df3ef80SGreg Tucker         putchar('.');
2336df3ef80SGreg Tucker 
2340cabffc5SMarcel Cornu end:
2350cabffc5SMarcel Cornu         for (i = 0; i < TEST_BUFS; i++)
2360cabffc5SMarcel Cornu                 free(bufs[i]);
2370cabffc5SMarcel Cornu         free(tmp_buf);
2380cabffc5SMarcel Cornu         aligned_free(mgr);
2390cabffc5SMarcel Cornu 
2406df3ef80SGreg Tucker         if (fail)
2416df3ef80SGreg Tucker                 printf("Test failed function check %d\n", fail);
2426df3ef80SGreg Tucker         else
2436df3ef80SGreg Tucker                 printf(" multibinary_sha512 rand: Pass\n");
2446df3ef80SGreg Tucker 
2456df3ef80SGreg Tucker         return fail;
2466df3ef80SGreg Tucker }
247