1aab03b45SJerry Yu /**********************************************************************
2aab03b45SJerry Yu Copyright(c) 2020 Arm Corporation All rights reserved.
3aab03b45SJerry Yu
4aab03b45SJerry Yu Redistribution and use in source and binary forms, with or without
5aab03b45SJerry Yu modification, are permitted provided that the following conditions
6aab03b45SJerry Yu are met:
7aab03b45SJerry Yu * Redistributions of source code must retain the above copyright
8aab03b45SJerry Yu notice, this list of conditions and the following disclaimer.
9aab03b45SJerry Yu * Redistributions in binary form must reproduce the above copyright
10aab03b45SJerry Yu notice, this list of conditions and the following disclaimer in
11aab03b45SJerry Yu the documentation and/or other materials provided with the
12aab03b45SJerry Yu distribution.
13aab03b45SJerry Yu * Neither the name of Arm Corporation nor the names of its
14aab03b45SJerry Yu contributors may be used to endorse or promote products derived
15aab03b45SJerry Yu from this software without specific prior written permission.
16aab03b45SJerry Yu
17aab03b45SJerry Yu THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18aab03b45SJerry Yu "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19aab03b45SJerry Yu LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20aab03b45SJerry Yu A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21aab03b45SJerry Yu OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22aab03b45SJerry Yu SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23aab03b45SJerry Yu LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24aab03b45SJerry Yu DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25aab03b45SJerry Yu THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26aab03b45SJerry Yu (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27aab03b45SJerry Yu OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28aab03b45SJerry Yu **********************************************************************/
29aab03b45SJerry Yu
30aab03b45SJerry Yu #include <stdio.h>
31aab03b45SJerry Yu #include <stdlib.h>
32aab03b45SJerry Yu #include <string.h>
33*6801b27bSTomasz Kantecki
34*6801b27bSTomasz Kantecki #ifndef FIPS_MODE
35aab03b45SJerry Yu #include "sm3_mb.h"
36aab03b45SJerry Yu
37aab03b45SJerry Yu typedef struct {
38aab03b45SJerry Yu const char *msg;
39*6801b27bSTomasz Kantecki uint32_t resultDigest[ISAL_SM3_DIGEST_NWORDS];
40aab03b45SJerry Yu } TestData;
41aab03b45SJerry Yu
42aab03b45SJerry Yu static TestData test_data[] = {
43b923697dSMarcel Cornu { .msg = "abc",
44b923697dSMarcel Cornu .resultDigest = { 0xf4f0c766, 0xd9edee62, 0x6bd4f2d1, 0xe2e410dc, 0x87c46741, 0xa2f7f25c,
45b923697dSMarcel Cornu 0x2ba07d29, 0xe0a84b8f } },
46b923697dSMarcel Cornu { .msg = "abcdabcdabcdabcdabcdabcdabcdabcd"
47b923697dSMarcel Cornu "abcdabcdabcdabcdabcdabcdabcdabcd",
48b923697dSMarcel Cornu .resultDigest = { 0xf99fbede, 0xa1b87522, 0x89486038, 0x4d5a8ec1, 0xe570db6f, 0x65577e38,
49b923697dSMarcel Cornu 0xa3cb3d29, 0x32570c9c }
50aab03b45SJerry Yu
51aab03b45SJerry Yu },
52b923697dSMarcel Cornu { .msg = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
53b923697dSMarcel Cornu .resultDigest = { 0xc56c9b63, 0x379e4de6, 0x92b190a3, 0xeaa14fdf, 0x74ab2007, 0xb992f67f,
54b923697dSMarcel Cornu 0x664e8cf3, 0x058c7bad } },
55aab03b45SJerry Yu
56aab03b45SJerry Yu { .msg = "0123456789:;<=>?@ABCDEFGHIJKLMNO",
57b923697dSMarcel Cornu .resultDigest = { 0x076833d0, 0xd089ec39, 0xad857685, 0x8089797a, 0x9df9e8fd, 0x4126eb9a,
58b923697dSMarcel Cornu 0xf38c22e8, 0x054bb846 } },
59b923697dSMarcel Cornu { .msg = "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
60aab03b45SJerry Yu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
61b923697dSMarcel Cornu "0123456789:;<",
62b923697dSMarcel Cornu .resultDigest = { 0x6cb9d38e, 0x846ac99e, 0x6d05634b, 0x3fe1bb26, 0x90368c4b, 0xee8c4299,
63b923697dSMarcel Cornu 0x08c0e96a, 0x2233cdc7 } },
64b923697dSMarcel Cornu { .msg = "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
65b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
66b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
67b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQR",
68b923697dSMarcel Cornu .resultDigest = { 0x83758189, 0x050f14d1, 0x91d8a730, 0x4a2825e4, 0x11723273, 0x2114ee3f,
69b923697dSMarcel Cornu 0x18cac172, 0xa9c5b07a } },
70b923697dSMarcel Cornu {
71b923697dSMarcel Cornu .msg = "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
72b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
73b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
74b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
75b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
76b923697dSMarcel Cornu "0123456789:;<=>?",
77b923697dSMarcel Cornu .resultDigest = { 0xb80f8aba, 0x55e96119, 0x851ac77b, 0xae31b3a5, 0x1333e764,
78b923697dSMarcel Cornu 0xc86ac40d, 0x34878db1, 0x7da873f6 },
79aab03b45SJerry Yu },
80b923697dSMarcel Cornu { .msg = "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
81aab03b45SJerry Yu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
82aab03b45SJerry Yu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
83aab03b45SJerry Yu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
84aab03b45SJerry Yu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
85aab03b45SJerry Yu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX"
86b923697dSMarcel Cornu "0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU",
87b923697dSMarcel Cornu .resultDigest = { 0xbd5736a7, 0x55977d13, 0xa950c78a, 0x71eeb7cb, 0xe9ef0ba5, 0x95a9302e,
88b923697dSMarcel Cornu 0x155e5c33, 0xad96ce3c } },
89b923697dSMarcel Cornu { .msg = "",
90b923697dSMarcel Cornu .resultDigest = { 0x831db21a, 0x7fa1cf55, 0x4819618e, 0x8f1ae831, 0xc7c8be22, 0x74fbfe28,
91b923697dSMarcel Cornu 0xeb35d07e, 0x2baa8250 }
92aab03b45SJerry Yu
93aab03b45SJerry Yu },
94aab03b45SJerry Yu
95aab03b45SJerry Yu };
96aab03b45SJerry Yu
97aab03b45SJerry Yu #define MSGS sizeof(test_data) / sizeof(TestData)
98aab03b45SJerry Yu #define NUM_JOBS 1000
99aab03b45SJerry Yu
100aab03b45SJerry Yu #define PSEUDO_RANDOM_NUM(seed) ((seed) * 5 + ((seed) * (seed)) / 64) % MSGS
101aab03b45SJerry Yu
102ba178e5cSJerry Yu #define NUM_CHUNKS 4
103ba178e5cSJerry Yu #define DATA_BUF_LEN 4096
104b923697dSMarcel Cornu int
non_blocksize_updates_test(ISAL_SM3_HASH_CTX_MGR * mgr)105*6801b27bSTomasz Kantecki non_blocksize_updates_test(ISAL_SM3_HASH_CTX_MGR *mgr)
106ba178e5cSJerry Yu {
107*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX ctx_refer;
108*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX ctx_pool[NUM_CHUNKS];
109*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX *ctx = NULL;
110ba178e5cSJerry Yu
111ba178e5cSJerry Yu const int update_chunks[NUM_CHUNKS] = { 32, 64, 128, 256 };
112ba178e5cSJerry Yu unsigned char data_buf[DATA_BUF_LEN];
113ba178e5cSJerry Yu
114ba178e5cSJerry Yu memset(data_buf, 0xA, DATA_BUF_LEN);
115ba178e5cSJerry Yu
116ba178e5cSJerry Yu // Init contexts before first use
1178cb7fe78SPablo de Lara isal_hash_ctx_init(&ctx_refer);
118ba178e5cSJerry Yu
119*6801b27bSTomasz Kantecki if (isal_sm3_ctx_mgr_submit(mgr, &ctx_refer, &ctx, data_buf, DATA_BUF_LEN,
120*6801b27bSTomasz Kantecki ISAL_HASH_ENTIRE) != 0)
121ba178e5cSJerry Yu return -1;
122*6801b27bSTomasz Kantecki
123*6801b27bSTomasz Kantecki if (isal_sm3_ctx_mgr_flush(mgr, &ctx) != 0)
124ba178e5cSJerry Yu return -1;
125ba178e5cSJerry Yu
126ba178e5cSJerry Yu for (int c = 0; c < NUM_CHUNKS; c++) {
127*6801b27bSTomasz Kantecki const int chunk = update_chunks[c];
128*6801b27bSTomasz Kantecki
1298cb7fe78SPablo de Lara isal_hash_ctx_init(&ctx_pool[c]);
130ba178e5cSJerry Yu for (int i = 0; i * chunk < DATA_BUF_LEN; i++) {
131*6801b27bSTomasz Kantecki const ISAL_HASH_CTX_FLAG flags =
132*6801b27bSTomasz Kantecki (i == 0) ? ISAL_HASH_FIRST : ISAL_HASH_UPDATE;
133*6801b27bSTomasz Kantecki
134*6801b27bSTomasz Kantecki if (isal_sm3_ctx_mgr_submit(mgr, &ctx_pool[c], &ctx, data_buf + i * chunk,
135*6801b27bSTomasz Kantecki chunk, flags) != 0)
136ba178e5cSJerry Yu return -1;
137*6801b27bSTomasz Kantecki if (isal_sm3_ctx_mgr_flush(mgr, &ctx) != 0)
138ba178e5cSJerry Yu return -1;
139ba178e5cSJerry Yu }
140ba178e5cSJerry Yu }
141ba178e5cSJerry Yu
142ba178e5cSJerry Yu for (int c = 0; c < NUM_CHUNKS; c++) {
143*6801b27bSTomasz Kantecki if (isal_sm3_ctx_mgr_submit(mgr, &ctx_pool[c], &ctx, NULL, 0, ISAL_HASH_LAST) != 0)
144ba178e5cSJerry Yu return -1;
145*6801b27bSTomasz Kantecki if (isal_sm3_ctx_mgr_flush(mgr, &ctx) != 0)
146ba178e5cSJerry Yu return -1;
147*6801b27bSTomasz Kantecki if (ctx_pool[c].status != ISAL_HASH_CTX_STS_COMPLETE)
148ba178e5cSJerry Yu return -1;
149*6801b27bSTomasz Kantecki for (int i = 0; i < ISAL_SM3_DIGEST_NWORDS; i++) {
150ba178e5cSJerry Yu if (ctx_refer.job.result_digest[i] != ctx_pool[c].job.result_digest[i]) {
151b923697dSMarcel Cornu printf("sm3 calc error! chunk %d, digest[%d], (%d) != (%d)\n",
152ba178e5cSJerry Yu update_chunks[c], i, ctx_refer.job.result_digest[i],
153ba178e5cSJerry Yu ctx_pool[c].job.result_digest[i]);
154ba178e5cSJerry Yu return -2;
155ba178e5cSJerry Yu }
156ba178e5cSJerry Yu }
157ba178e5cSJerry Yu }
158ba178e5cSJerry Yu return 0;
159ba178e5cSJerry Yu }
160*6801b27bSTomasz Kantecki #endif /* !FIPS_MODE */
161ba178e5cSJerry Yu
162b923697dSMarcel Cornu int
main(void)163b923697dSMarcel Cornu main(void)
164aab03b45SJerry Yu {
165*6801b27bSTomasz Kantecki #ifndef FIPS_MODE
166*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX_MGR *mgr = NULL;
167*6801b27bSTomasz Kantecki ISAL_SM3_HASH_CTX ctxpool[NUM_JOBS], *ctx = NULL;
168aab03b45SJerry Yu uint32_t i, j, k, t, checked = 0;
169aab03b45SJerry Yu uint32_t *good;
170f5954796SMarcel Cornu int rc, ret = -1;
171*6801b27bSTomasz Kantecki rc = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SM3_HASH_CTX_MGR));
172f5954796SMarcel Cornu if (rc) {
173aab03b45SJerry Yu printf("alloc error: Fail");
174aab03b45SJerry Yu return -1;
175aab03b45SJerry Yu }
176*6801b27bSTomasz Kantecki isal_sm3_ctx_mgr_init(mgr);
177aab03b45SJerry Yu // Init contexts before first use
178aab03b45SJerry Yu for (i = 0; i < MSGS; i++) {
1798cb7fe78SPablo de Lara isal_hash_ctx_init(&ctxpool[i]);
180aab03b45SJerry Yu ctxpool[i].user_data = (void *) ((uint64_t) i);
181aab03b45SJerry Yu }
182aab03b45SJerry Yu
183aab03b45SJerry Yu for (i = 0; i < MSGS; i++) {
184*6801b27bSTomasz Kantecki const int errc = isal_sm3_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, test_data[i].msg,
185*6801b27bSTomasz Kantecki strlen((char *) test_data[i].msg),
186*6801b27bSTomasz Kantecki ISAL_HASH_ENTIRE);
187*6801b27bSTomasz Kantecki
188*6801b27bSTomasz Kantecki if (errc == 0) {
189*6801b27bSTomasz Kantecki if (ctx != NULL) {
19087dde3adSTomasz Kantecki t = (unsigned long) (uintptr_t) (ctx->user_data);
191aab03b45SJerry Yu good = test_data[t].resultDigest;
192aab03b45SJerry Yu checked++;
193*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
194aab03b45SJerry Yu if (good[j] != ctxpool[t].job.result_digest[j]) {
195*6801b27bSTomasz Kantecki printf("Test %d, digest %d is %08X, should be "
196*6801b27bSTomasz Kantecki "%08X\n",
197*6801b27bSTomasz Kantecki t, j, ctxpool[t].job.result_digest[j],
198*6801b27bSTomasz Kantecki good[j]);
199f5954796SMarcel Cornu goto end;
200aab03b45SJerry Yu }
201aab03b45SJerry Yu }
202aab03b45SJerry Yu }
203*6801b27bSTomasz Kantecki } else {
204*6801b27bSTomasz Kantecki printf("Something bad happened during the submit. Error code: %d", errc);
205*6801b27bSTomasz Kantecki goto end;
206aab03b45SJerry Yu }
207aab03b45SJerry Yu }
208aab03b45SJerry Yu
209aab03b45SJerry Yu while (1) {
210*6801b27bSTomasz Kantecki const int errc = isal_sm3_ctx_mgr_flush(mgr, &ctx);
211*6801b27bSTomasz Kantecki
212*6801b27bSTomasz Kantecki if (errc == 0) {
213*6801b27bSTomasz Kantecki if (ctx == NULL)
214*6801b27bSTomasz Kantecki break;
215*6801b27bSTomasz Kantecki
21687dde3adSTomasz Kantecki t = (unsigned long) (uintptr_t) (ctx->user_data);
217aab03b45SJerry Yu good = test_data[t].resultDigest;
218aab03b45SJerry Yu checked++;
219*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
220aab03b45SJerry Yu if (good[j] != ctxpool[t].job.result_digest[j]) {
221b923697dSMarcel Cornu printf("Test %d, digest %d is %08X, should be %08X\n", t, j,
222b923697dSMarcel Cornu ctxpool[t].job.result_digest[j], good[j]);
223f5954796SMarcel Cornu goto end;
224aab03b45SJerry Yu }
225aab03b45SJerry Yu }
226aab03b45SJerry Yu } else {
227*6801b27bSTomasz Kantecki printf("Something bad happened during the flush. Error code: %d", errc);
228*6801b27bSTomasz Kantecki goto end;
229aab03b45SJerry Yu }
230aab03b45SJerry Yu }
231aab03b45SJerry Yu
232aab03b45SJerry Yu // do larger test in pseudo-random order
233aab03b45SJerry Yu
234aab03b45SJerry Yu // Init contexts before first use
235aab03b45SJerry Yu for (i = 0; i < NUM_JOBS; i++) {
2368cb7fe78SPablo de Lara isal_hash_ctx_init(&ctxpool[i]);
237aab03b45SJerry Yu ctxpool[i].user_data = (void *) ((uint64_t) i);
238aab03b45SJerry Yu }
239aab03b45SJerry Yu
240aab03b45SJerry Yu checked = 0;
241aab03b45SJerry Yu for (i = 0; i < NUM_JOBS; i++) {
242aab03b45SJerry Yu j = PSEUDO_RANDOM_NUM(i);
243*6801b27bSTomasz Kantecki
244*6801b27bSTomasz Kantecki const int errc = isal_sm3_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, test_data[j].msg,
245*6801b27bSTomasz Kantecki strlen((char *) test_data[j].msg),
246*6801b27bSTomasz Kantecki ISAL_HASH_ENTIRE);
247*6801b27bSTomasz Kantecki if (errc == 0) {
248*6801b27bSTomasz Kantecki if (ctx != NULL) {
24987dde3adSTomasz Kantecki t = (unsigned long) (uintptr_t) (ctx->user_data);
250aab03b45SJerry Yu k = PSEUDO_RANDOM_NUM(t);
251aab03b45SJerry Yu good = test_data[k].resultDigest;
252aab03b45SJerry Yu checked++;
253*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
254aab03b45SJerry Yu if (good[j] != ctxpool[t].job.result_digest[j]) {
255*6801b27bSTomasz Kantecki printf("Test %d, digest %d is %08X, should be "
256*6801b27bSTomasz Kantecki "%08X\n",
257*6801b27bSTomasz Kantecki t, j, ctxpool[t].job.result_digest[j],
258*6801b27bSTomasz Kantecki good[j]);
259f5954796SMarcel Cornu goto end;
260aab03b45SJerry Yu }
261aab03b45SJerry Yu }
262aab03b45SJerry Yu }
263*6801b27bSTomasz Kantecki } else {
264*6801b27bSTomasz Kantecki printf("Something bad happened during the submit. Error code: %d", errc);
265*6801b27bSTomasz Kantecki goto end;
266aab03b45SJerry Yu }
267aab03b45SJerry Yu }
268aab03b45SJerry Yu while (1) {
269*6801b27bSTomasz Kantecki const int errc = isal_sm3_ctx_mgr_flush(mgr, &ctx);
270*6801b27bSTomasz Kantecki
271*6801b27bSTomasz Kantecki if (errc == 0) {
272*6801b27bSTomasz Kantecki if (ctx == NULL)
273*6801b27bSTomasz Kantecki break;
274*6801b27bSTomasz Kantecki
27587dde3adSTomasz Kantecki t = (unsigned long) (uintptr_t) (ctx->user_data);
276aab03b45SJerry Yu k = PSEUDO_RANDOM_NUM(t);
277aab03b45SJerry Yu good = test_data[k].resultDigest;
278aab03b45SJerry Yu checked++;
279*6801b27bSTomasz Kantecki for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
280aab03b45SJerry Yu if (good[j] != ctxpool[t].job.result_digest[j]) {
281b923697dSMarcel Cornu printf("Test %d, digest %d is %08X, should be %08X\n", t, j,
282b923697dSMarcel Cornu ctxpool[t].job.result_digest[j], good[j]);
283f5954796SMarcel Cornu goto end;
284aab03b45SJerry Yu }
285aab03b45SJerry Yu }
286aab03b45SJerry Yu } else {
287*6801b27bSTomasz Kantecki printf("Something bad happened during the flush. Error code: %d", errc);
288*6801b27bSTomasz Kantecki goto end;
289aab03b45SJerry Yu }
290aab03b45SJerry Yu }
291aab03b45SJerry Yu
292aab03b45SJerry Yu if (checked != NUM_JOBS) {
293aab03b45SJerry Yu printf("only tested %d rather than %d\n", checked, NUM_JOBS);
294f5954796SMarcel Cornu goto end;
295aab03b45SJerry Yu }
296aab03b45SJerry Yu
297f5954796SMarcel Cornu rc = non_blocksize_updates_test(mgr);
298ba178e5cSJerry Yu if (rc) {
299ba178e5cSJerry Yu printf("multi updates test fail %d\n", rc);
300f5954796SMarcel Cornu goto end;
301ba178e5cSJerry Yu }
302f5954796SMarcel Cornu ret = 0;
303ba178e5cSJerry Yu
304aab03b45SJerry Yu printf(" multibinary_sm3 test: Pass\n");
305f5954796SMarcel Cornu end:
306f5954796SMarcel Cornu aligned_free(mgr);
307f5954796SMarcel Cornu
308f5954796SMarcel Cornu return ret;
309*6801b27bSTomasz Kantecki #else
310*6801b27bSTomasz Kantecki printf("Not Executed\n");
311*6801b27bSTomasz Kantecki return 0;
312*6801b27bSTomasz Kantecki #endif /* FIPS_MODE */
313aab03b45SJerry Yu }
314