xref: /isa-l_crypto/sm3_mb/sm3_ref_test.c (revision 6801b27bd9295090e36d2864110576f428efdf61)
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