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