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