1f36dbb84SChunyang Hui /**********************************************************************
2f36dbb84SChunyang Hui Copyright(c) 2011-2019 Intel Corporation All rights reserved.
3f36dbb84SChunyang Hui
4f36dbb84SChunyang Hui Redistribution and use in source and binary forms, with or without
5f36dbb84SChunyang Hui modification, are permitted provided that the following conditions
6f36dbb84SChunyang Hui are met:
7f36dbb84SChunyang Hui * Redistributions of source code must retain the above copyright
8f36dbb84SChunyang Hui notice, this list of conditions and the following disclaimer.
9f36dbb84SChunyang Hui * Redistributions in binary form must reproduce the above copyright
10f36dbb84SChunyang Hui notice, this list of conditions and the following disclaimer in
11f36dbb84SChunyang Hui the documentation and/or other materials provided with the
12f36dbb84SChunyang Hui distribution.
13f36dbb84SChunyang Hui * Neither the name of Intel Corporation nor the names of its
14f36dbb84SChunyang Hui contributors may be used to endorse or promote products derived
15f36dbb84SChunyang Hui from this software without specific prior written permission.
16f36dbb84SChunyang Hui
17f36dbb84SChunyang Hui THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18f36dbb84SChunyang Hui "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19f36dbb84SChunyang Hui LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20f36dbb84SChunyang Hui A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21f36dbb84SChunyang Hui OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22f36dbb84SChunyang Hui SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23f36dbb84SChunyang Hui LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24f36dbb84SChunyang Hui DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25f36dbb84SChunyang Hui THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26f36dbb84SChunyang Hui (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27f36dbb84SChunyang Hui OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28f36dbb84SChunyang Hui **********************************************************************/
29a8b637dbSGreg Tucker #define ISAL_UNIT_TEST
30f36dbb84SChunyang Hui #include <stdio.h>
31f36dbb84SChunyang Hui #include <stdlib.h>
32*6801b27bSTomasz Kantecki
33*6801b27bSTomasz Kantecki #ifndef FIPS_MODE
34f36dbb84SChunyang Hui #include "sm3_mb.h"
3592aa5aa4SGreg Tucker #include "endian_helper.h"
36f36dbb84SChunyang Hui
37f36dbb84SChunyang Hui #define TEST_LEN (1024 * 1024)
38f36dbb84SChunyang Hui #define TEST_BUFS 200
39f36dbb84SChunyang Hui #ifndef RANDOMS
40f36dbb84SChunyang Hui #define RANDOMS 10
41f36dbb84SChunyang Hui #endif
42f36dbb84SChunyang Hui #ifndef TEST_SEED
43f36dbb84SChunyang Hui #define TEST_SEED 0x1234
44f36dbb84SChunyang Hui #endif
45f36dbb84SChunyang Hui
46f36dbb84SChunyang Hui /* Reference digest global to reduce stack usage */
47*6801b27bSTomasz Kantecki static uint8_t digest_ssl[TEST_BUFS][4 * ISAL_SM3_DIGEST_NWORDS];
48f36dbb84SChunyang Hui
49b923697dSMarcel Cornu extern void
50b923697dSMarcel Cornu sm3_ossl(const unsigned char *buf, size_t length, unsigned char *digest);
51f36dbb84SChunyang Hui
52f36dbb84SChunyang Hui // Generates pseudo-random data
53b923697dSMarcel Cornu static void
rand_buffer(unsigned char * buf,const long buffer_size)54b923697dSMarcel Cornu rand_buffer(unsigned char *buf, const long buffer_size)
55f36dbb84SChunyang Hui {
56f36dbb84SChunyang Hui long i;
57f36dbb84SChunyang Hui for (i = 0; i < buffer_size; i++)
58f36dbb84SChunyang Hui buf[i] = rand();
59f36dbb84SChunyang Hui }
60*6801b27bSTomasz Kantecki #endif /* !FIPS_MODE */
61f36dbb84SChunyang Hui
62b923697dSMarcel Cornu int
main(void)63b923697dSMarcel Cornu main(void)
64f36dbb84SChunyang Hui {
65*6801b27bSTomasz Kantecki #ifndef FIPS_MODE
66*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX_MGR *mgr = NULL;
67*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX ctxpool[TEST_BUFS];
68*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX *ctx = NULL;
69f36dbb84SChunyang Hui unsigned char *bufs[TEST_BUFS];
70f36dbb84SChunyang Hui uint32_t i, j, fail = 0;
71f36dbb84SChunyang Hui uint32_t lens[TEST_BUFS];
72f36dbb84SChunyang Hui unsigned int jobs, t;
73c91caf97STom Cosgrove int ret;
74f36dbb84SChunyang Hui
75f36dbb84SChunyang Hui printf("multibinary_sm3 test, %d sets of %dx%d max: ", RANDOMS, TEST_BUFS, TEST_LEN);
76f36dbb84SChunyang Hui
77f36dbb84SChunyang Hui srand(TEST_SEED);
78f36dbb84SChunyang Hui
79*6801b27bSTomasz Kantecki ret = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SM3_HASH_CTX_MGR));
80c91caf97STom Cosgrove if ((ret != 0) || (mgr == NULL)) {
81c91caf97STom Cosgrove printf("posix_memalign failed test aborted\n");
82c91caf97STom Cosgrove return 1;
83c91caf97STom Cosgrove }
84c91caf97STom Cosgrove
85*6801b27bSTomasz Kantecki isal_sm3_ctx_mgr_init(mgr);
86f36dbb84SChunyang Hui
87f36dbb84SChunyang Hui for (i = 0; i < TEST_BUFS; i++) {
88f36dbb84SChunyang Hui // Allocate and fill buffer
89f36dbb84SChunyang Hui bufs[i] = (unsigned char *) malloc(TEST_LEN);
90f36dbb84SChunyang Hui if (bufs[i] == NULL) {
91f36dbb84SChunyang Hui printf("malloc failed test aborted\n");
92f36dbb84SChunyang Hui return 1;
93f36dbb84SChunyang Hui }
94f36dbb84SChunyang Hui rand_buffer(bufs[i], TEST_LEN);
95f36dbb84SChunyang Hui
96f36dbb84SChunyang Hui // Init ctx contents
978cb7fe78SPablo de Lara isal_hash_ctx_init(&ctxpool[i]);
98f36dbb84SChunyang Hui ctxpool[i].user_data = (void *) ((uint64_t) i);
99f36dbb84SChunyang Hui
100f36dbb84SChunyang Hui // SSL test
101f36dbb84SChunyang Hui sm3_ossl(bufs[i], TEST_LEN, digest_ssl[i]);
102f36dbb84SChunyang Hui
103f36dbb84SChunyang Hui // sb_sm3 test
104*6801b27bSTomasz Kantecki isal_sm3_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], TEST_LEN,
105*6801b27bSTomasz Kantecki ISAL_HASH_ENTIRE);
106f36dbb84SChunyang Hui }
107f36dbb84SChunyang Hui
108*6801b27bSTomasz Kantecki while (isal_sm3_ctx_mgr_flush(mgr, &ctx) == 0)
109*6801b27bSTomasz Kantecki if (ctx == NULL)
110*6801b27bSTomasz Kantecki break;
111f36dbb84SChunyang Hui
112f36dbb84SChunyang Hui for (i = 0; i < TEST_BUFS; i++) {
113*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
114e3f7d4fbSUlrich Weigand if (ctxpool[i].job.result_digest[j] !=
115e3f7d4fbSUlrich Weigand to_le32(((uint32_t *) digest_ssl[i])[j])) {
116f36dbb84SChunyang Hui fail++;
117b923697dSMarcel Cornu printf("Test%d, digest%d fail %08X <=> %08X\n", i, j,
118b923697dSMarcel Cornu ctxpool[i].job.result_digest[j],
119e3f7d4fbSUlrich Weigand to_le32(((uint32_t *) digest_ssl[i])[j]));
120f36dbb84SChunyang Hui }
121f36dbb84SChunyang Hui }
122f36dbb84SChunyang Hui }
123f36dbb84SChunyang Hui putchar('.');
124f36dbb84SChunyang Hui
125f36dbb84SChunyang Hui // Run tests with random size and number of jobs
126f36dbb84SChunyang Hui for (t = 0; t < RANDOMS; t++) {
127f36dbb84SChunyang Hui jobs = rand() % (TEST_BUFS);
128f36dbb84SChunyang Hui
129*6801b27bSTomasz Kantecki isal_sm3_ctx_mgr_init(mgr);
130f36dbb84SChunyang Hui
131f36dbb84SChunyang Hui for (i = 0; i < jobs; i++) {
1326a128452SXinze Zhang // Random buffer with random len and contents
133f36dbb84SChunyang Hui lens[i] = rand() % (TEST_LEN);
134f36dbb84SChunyang Hui rand_buffer(bufs[i], lens[i]);
135f36dbb84SChunyang Hui
136f36dbb84SChunyang Hui // Run SSL test
137f36dbb84SChunyang Hui sm3_ossl(bufs[i], lens[i], digest_ssl[i]);
138f36dbb84SChunyang Hui
139f36dbb84SChunyang Hui // Run sb_sm3 test
140*6801b27bSTomasz Kantecki isal_sm3_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], lens[i],
141*6801b27bSTomasz Kantecki ISAL_HASH_ENTIRE);
142f36dbb84SChunyang Hui }
143f36dbb84SChunyang Hui
144*6801b27bSTomasz Kantecki while (isal_sm3_ctx_mgr_flush(mgr, &ctx) == 0)
145*6801b27bSTomasz Kantecki if (ctx == NULL)
146*6801b27bSTomasz Kantecki break;
147f36dbb84SChunyang Hui
148f36dbb84SChunyang Hui for (i = 0; i < jobs; i++) {
149*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
150f36dbb84SChunyang Hui if (ctxpool[i].job.result_digest[j] !=
151e3f7d4fbSUlrich Weigand to_le32(((uint32_t *) digest_ssl[i])[j])) {
152f36dbb84SChunyang Hui fail++;
153b923697dSMarcel Cornu printf("Test%d, digest%d fail %08X <=> %08X\n", i, j,
154b923697dSMarcel Cornu ctxpool[i].job.result_digest[j],
155e3f7d4fbSUlrich Weigand to_le32(((uint32_t *) digest_ssl[i])[j]));
156f36dbb84SChunyang Hui }
157f36dbb84SChunyang Hui }
158f36dbb84SChunyang Hui }
159f36dbb84SChunyang Hui if (fail) {
160f36dbb84SChunyang Hui printf("Test failed function check %d\n", fail);
161f36dbb84SChunyang Hui return fail;
162f36dbb84SChunyang Hui }
163f36dbb84SChunyang Hui
164f36dbb84SChunyang Hui putchar('.');
165f36dbb84SChunyang Hui fflush(0);
166f36dbb84SChunyang Hui } // random test t
167f36dbb84SChunyang Hui
168f36dbb84SChunyang Hui if (fail)
169f36dbb84SChunyang Hui printf("Test failed function check %d\n", fail);
170f36dbb84SChunyang Hui else
171f36dbb84SChunyang Hui printf(" multibinary_sm3_ssl rand: Pass\n");
172f36dbb84SChunyang Hui
173f36dbb84SChunyang Hui return fail;
174*6801b27bSTomasz Kantecki #else
175*6801b27bSTomasz Kantecki printf("Not Executed\n");
176*6801b27bSTomasz Kantecki return 0;
177*6801b27bSTomasz Kantecki #endif /* FIPS_MODE */
178f36dbb84SChunyang Hui }
179