1449703d9SChunyang Hui /**********************************************************************
2449703d9SChunyang Hui Copyright(c) 2011-2019 Intel Corporation All rights reserved.
3449703d9SChunyang Hui
4449703d9SChunyang Hui Redistribution and use in source and binary forms, with or without
5449703d9SChunyang Hui modification, are permitted provided that the following conditions
6449703d9SChunyang Hui are met:
7449703d9SChunyang Hui * Redistributions of source code must retain the above copyright
8449703d9SChunyang Hui notice, this list of conditions and the following disclaimer.
9449703d9SChunyang Hui * Redistributions in binary form must reproduce the above copyright
10449703d9SChunyang Hui notice, this list of conditions and the following disclaimer in
11449703d9SChunyang Hui the documentation and/or other materials provided with the
12449703d9SChunyang Hui distribution.
13449703d9SChunyang Hui * Neither the name of Intel Corporation nor the names of its
14449703d9SChunyang Hui contributors may be used to endorse or promote products derived
15449703d9SChunyang Hui from this software without specific prior written permission.
16449703d9SChunyang Hui
17449703d9SChunyang Hui THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18449703d9SChunyang Hui "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19449703d9SChunyang Hui LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20449703d9SChunyang Hui A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21449703d9SChunyang Hui OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22449703d9SChunyang Hui SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23449703d9SChunyang Hui LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24449703d9SChunyang Hui DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25449703d9SChunyang Hui THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26449703d9SChunyang Hui (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27449703d9SChunyang Hui OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28449703d9SChunyang Hui **********************************************************************/
29a8b637dbSGreg Tucker #define ISAL_UNIT_TEST
30449703d9SChunyang Hui #include <stdio.h>
31449703d9SChunyang Hui #include <stdlib.h>
32449703d9SChunyang Hui #include <string.h>
33*6801b27bSTomasz Kantecki
34*6801b27bSTomasz Kantecki #ifndef FIPS_MODE
35449703d9SChunyang Hui #include "sm3_mb.h"
3692aa5aa4SGreg Tucker #include "endian_helper.h"
37449703d9SChunyang Hui
38*6801b27bSTomasz Kantecki typedef uint32_t digest_sm3[ISAL_SM3_DIGEST_NWORDS];
39449703d9SChunyang Hui
40449703d9SChunyang Hui #define MSGS 2
41449703d9SChunyang Hui #define NUM_JOBS 1000
42449703d9SChunyang Hui
43449703d9SChunyang Hui #define PSEUDO_RANDOM_NUM(seed) ((seed) * 5 + ((seed) * (seed)) / 64) % MSGS
44449703d9SChunyang Hui
45449703d9SChunyang Hui static uint8_t msg1[] = "abc";
46449703d9SChunyang Hui static uint8_t msg2[] = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd";
47449703d9SChunyang Hui
48449703d9SChunyang Hui /* small endian */
49449703d9SChunyang Hui static digest_sm3 exp_result_digest1 = { 0x66c7f0f4, 0x62eeedd9, 0xd1f2d46b, 0xdc10e4e2,
50b923697dSMarcel Cornu 0x4167c487, 0x5cf2f7a2, 0x297da02b, 0x8f4ba8e0 };
51449703d9SChunyang Hui
52449703d9SChunyang Hui /* small endian */
53449703d9SChunyang Hui static digest_sm3 exp_result_digest2 = { 0xdebe9ff9, 0x2275b8a1, 0x38604889, 0xc18e5a4d,
54b923697dSMarcel Cornu 0x6fdb70e5, 0x387e5765, 0x293dcba3, 0x9c0c5732 };
55449703d9SChunyang Hui
56449703d9SChunyang Hui static uint8_t *msgs[MSGS] = { msg1, msg2 };
57449703d9SChunyang Hui
58b923697dSMarcel Cornu static uint32_t *exp_result_digest[MSGS] = { exp_result_digest1, exp_result_digest2 };
59*6801b27bSTomasz Kantecki #endif /* !FIPS_MODE */
60449703d9SChunyang Hui
61b923697dSMarcel Cornu int
main(void)62b923697dSMarcel Cornu main(void)
63449703d9SChunyang Hui {
64*6801b27bSTomasz Kantecki #ifndef FIPS_MODE
65*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX_MGR *mgr = NULL;
66*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX ctxpool[NUM_JOBS], *ctx = NULL;
67449703d9SChunyang Hui uint32_t i, j, k, t, checked = 0;
68449703d9SChunyang Hui uint32_t *good;
69f5954796SMarcel Cornu int rc, ret = -1;
70449703d9SChunyang Hui
71*6801b27bSTomasz Kantecki rc = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SM3_HASH_CTX_MGR));
72f5954796SMarcel Cornu if ((rc != 0) || (mgr == NULL)) {
73c91caf97STom Cosgrove printf("posix_memalign failed test aborted\n");
74c91caf97STom Cosgrove return 1;
75c91caf97STom Cosgrove }
76c91caf97STom Cosgrove
77*6801b27bSTomasz Kantecki isal_sm3_ctx_mgr_init(mgr);
78449703d9SChunyang Hui
79449703d9SChunyang Hui // Init contexts before first use
80449703d9SChunyang Hui for (i = 0; i < MSGS; i++) {
818cb7fe78SPablo de Lara isal_hash_ctx_init(&ctxpool[i]);
82449703d9SChunyang Hui ctxpool[i].user_data = (void *) ((uint64_t) i);
83449703d9SChunyang Hui }
84449703d9SChunyang Hui
85449703d9SChunyang Hui for (i = 0; i < MSGS; i++) {
86*6801b27bSTomasz Kantecki const int res = isal_sm3_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, msgs[i],
87*6801b27bSTomasz Kantecki (uint32_t) strlen((char *) msgs[i]),
88*6801b27bSTomasz Kantecki ISAL_HASH_ENTIRE);
89449703d9SChunyang Hui
90*6801b27bSTomasz Kantecki if (res == 0 && ctx != NULL) {
9187dde3adSTomasz Kantecki t = (uint32_t) ((uintptr_t) ctx->user_data);
92449703d9SChunyang Hui good = exp_result_digest[t];
93449703d9SChunyang Hui checked++;
94*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
95449703d9SChunyang Hui if (byteswap32(good[j]) != ctxpool[t].job.result_digest[j]) {
96b923697dSMarcel Cornu printf("Test %d, digest %d is %08X, should be %08X\n", t, j,
97b923697dSMarcel Cornu ctxpool[t].job.result_digest[j],
98449703d9SChunyang Hui byteswap32(good[j]));
99f5954796SMarcel Cornu goto end;
100449703d9SChunyang Hui }
101449703d9SChunyang Hui }
102449703d9SChunyang Hui
103449703d9SChunyang Hui if (ctx->error) {
104449703d9SChunyang Hui printf("Something bad happened during the submit."
105b923697dSMarcel Cornu " Error code: %d",
106b923697dSMarcel Cornu ctx->error);
107f5954796SMarcel Cornu goto end;
108449703d9SChunyang Hui }
109449703d9SChunyang Hui }
110449703d9SChunyang Hui }
111449703d9SChunyang Hui
112449703d9SChunyang Hui while (1) {
113*6801b27bSTomasz Kantecki const int res = isal_sm3_ctx_mgr_flush(mgr, &ctx);
114449703d9SChunyang Hui
115*6801b27bSTomasz Kantecki if (res == 0 && ctx != NULL) {
11687dde3adSTomasz Kantecki t = (unsigned long) (uintptr_t) (ctx->user_data);
117449703d9SChunyang Hui good = exp_result_digest[t];
118449703d9SChunyang Hui checked++;
119*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
120449703d9SChunyang Hui if (byteswap32(good[j]) != ctxpool[t].job.result_digest[j]) {
121b923697dSMarcel Cornu printf("Test %d, digest %d is %08X, should be %08X\n", t, j,
122b923697dSMarcel Cornu ctxpool[t].job.result_digest[j],
123449703d9SChunyang Hui byteswap32(good[j]));
124f5954796SMarcel Cornu goto end;
125449703d9SChunyang Hui }
126449703d9SChunyang Hui }
127449703d9SChunyang Hui
128449703d9SChunyang Hui if (ctx->error) {
129449703d9SChunyang Hui printf("Something bad happened during the submit."
130b923697dSMarcel Cornu " Error code: %d",
131b923697dSMarcel Cornu ctx->error);
132f5954796SMarcel Cornu goto end;
133449703d9SChunyang Hui }
134449703d9SChunyang Hui } else {
135449703d9SChunyang Hui break;
136449703d9SChunyang Hui }
137449703d9SChunyang Hui }
138449703d9SChunyang Hui
139449703d9SChunyang Hui // do larger test in pseudo-random order
140449703d9SChunyang Hui
141449703d9SChunyang Hui // Init contexts before first use
142449703d9SChunyang Hui for (i = 0; i < NUM_JOBS; i++) {
1438cb7fe78SPablo de Lara isal_hash_ctx_init(&ctxpool[i]);
144449703d9SChunyang Hui ctxpool[i].user_data = (void *) ((uint64_t) i);
145449703d9SChunyang Hui }
146449703d9SChunyang Hui
147449703d9SChunyang Hui checked = 0;
148449703d9SChunyang Hui for (i = 0; i < NUM_JOBS; i++) {
149449703d9SChunyang Hui j = PSEUDO_RANDOM_NUM(i);
150*6801b27bSTomasz Kantecki const int res = isal_sm3_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, msgs[j],
151*6801b27bSTomasz Kantecki (uint32_t) strlen((char *) msgs[j]),
152*6801b27bSTomasz Kantecki ISAL_HASH_ENTIRE);
153*6801b27bSTomasz Kantecki if (res == 0 && ctx != NULL) {
15487dde3adSTomasz Kantecki t = (unsigned long) (uintptr_t) (ctx->user_data);
155449703d9SChunyang Hui k = PSEUDO_RANDOM_NUM(t);
156449703d9SChunyang Hui good = exp_result_digest[k];
157449703d9SChunyang Hui checked++;
158*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
159449703d9SChunyang Hui if (byteswap32(good[j]) != ctxpool[t].job.result_digest[j]) {
160b923697dSMarcel Cornu printf("Test %d, digest %d is %08X, should be %08X\n", t, j,
161b923697dSMarcel Cornu ctxpool[t].job.result_digest[j],
162449703d9SChunyang Hui byteswap32(good[j]));
163f5954796SMarcel Cornu goto end;
164449703d9SChunyang Hui }
165449703d9SChunyang Hui }
166449703d9SChunyang Hui
167449703d9SChunyang Hui if (ctx->error) {
168449703d9SChunyang Hui printf("Something bad happened during the"
169b923697dSMarcel Cornu " submit. Error code: %d",
170b923697dSMarcel Cornu ctx->error);
171f5954796SMarcel Cornu goto end;
172449703d9SChunyang Hui }
173449703d9SChunyang Hui }
174449703d9SChunyang Hui }
175449703d9SChunyang Hui while (1) {
176*6801b27bSTomasz Kantecki const int res = isal_sm3_ctx_mgr_flush(mgr, &ctx);
177449703d9SChunyang Hui
178*6801b27bSTomasz Kantecki if (res == 0 && ctx != NULL) {
17987dde3adSTomasz Kantecki t = (unsigned long) (uintptr_t) (ctx->user_data);
180449703d9SChunyang Hui k = PSEUDO_RANDOM_NUM(t);
181449703d9SChunyang Hui good = exp_result_digest[k];
182449703d9SChunyang Hui checked++;
183*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
184449703d9SChunyang Hui if (byteswap32(good[j]) != ctxpool[t].job.result_digest[j]) {
185b923697dSMarcel Cornu printf("Test %d, digest %d is %08X, should be %08X\n", t, j,
186b923697dSMarcel Cornu ctxpool[t].job.result_digest[j],
187449703d9SChunyang Hui byteswap32(good[j]));
188f5954796SMarcel Cornu goto end;
189449703d9SChunyang Hui }
190449703d9SChunyang Hui }
191449703d9SChunyang Hui
192449703d9SChunyang Hui if (ctx->error) {
193449703d9SChunyang Hui printf("Something bad happened during the submit."
194b923697dSMarcel Cornu " Error code: %d",
195b923697dSMarcel Cornu ctx->error);
196f5954796SMarcel Cornu goto end;
197449703d9SChunyang Hui }
198449703d9SChunyang Hui } else {
199449703d9SChunyang Hui break;
200449703d9SChunyang Hui }
201449703d9SChunyang Hui }
202449703d9SChunyang Hui
203449703d9SChunyang Hui if (checked != NUM_JOBS) {
204449703d9SChunyang Hui printf("only tested %d rather than %d\n", checked, NUM_JOBS);
205f5954796SMarcel Cornu goto end;
206449703d9SChunyang Hui }
207f5954796SMarcel Cornu ret = 0;
208449703d9SChunyang Hui
209449703d9SChunyang Hui printf(" multibinary_sm3 test: Pass\n");
210f5954796SMarcel Cornu end:
211f5954796SMarcel Cornu aligned_free(mgr);
212f5954796SMarcel Cornu return ret;
213*6801b27bSTomasz Kantecki #else
214*6801b27bSTomasz Kantecki printf("Not Executed\n");
215*6801b27bSTomasz Kantecki return 0;
216*6801b27bSTomasz Kantecki #endif /* FIPS_MODE */
217449703d9SChunyang Hui }
218