xref: /isa-l_crypto/sm3_mb/sm3_mb_flush_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)
38*6801b27bSTomasz Kantecki #define TEST_BUFS (ISAL_SM3_MAX_LANES - 1)
39f36dbb84SChunyang Hui #ifndef TEST_SEED
40f36dbb84SChunyang Hui #define TEST_SEED 0x1234
41f36dbb84SChunyang Hui #endif
42f36dbb84SChunyang Hui 
43*6801b27bSTomasz Kantecki static uint8_t digest_ref[TEST_BUFS][4 * ISAL_SM3_DIGEST_NWORDS];
44f36dbb84SChunyang Hui 
45f36dbb84SChunyang Hui // Compare against reference function
46b923697dSMarcel Cornu extern void
47b923697dSMarcel Cornu sm3_ossl(const unsigned char *buf, size_t length, unsigned char *digest);
48f36dbb84SChunyang Hui 
49f36dbb84SChunyang Hui // Generates pseudo-random data
50b923697dSMarcel Cornu void
rand_buffer(unsigned char * buf,const long buffer_size)51b923697dSMarcel Cornu rand_buffer(unsigned char *buf, const long buffer_size)
52f36dbb84SChunyang Hui {
53f36dbb84SChunyang Hui         long i;
54f36dbb84SChunyang Hui         for (i = 0; i < buffer_size; i++)
55f36dbb84SChunyang Hui                 buf[i] = rand();
56f36dbb84SChunyang Hui }
57f36dbb84SChunyang Hui 
58b923697dSMarcel Cornu uint8_t
lens_print_and_check(ISAL_SM3_HASH_CTX_MGR * mgr)59*6801b27bSTomasz Kantecki lens_print_and_check(ISAL_SM3_HASH_CTX_MGR *mgr)
60f36dbb84SChunyang Hui {
61*6801b27bSTomasz Kantecki         static int32_t last_lens[ISAL_SM3_MAX_LANES] = { 0 };
62f36dbb84SChunyang Hui         int32_t len;
63f36dbb84SChunyang Hui         uint8_t num_unchanged = 0;
64f36dbb84SChunyang Hui         int i;
65*6801b27bSTomasz Kantecki         for (i = 0; i < ISAL_SM3_MAX_LANES; i++) {
66f36dbb84SChunyang Hui                 len = (int32_t) mgr->mgr.lens[i];
67f36dbb84SChunyang Hui                 // len[i] in mgr consists of byte_length<<4 | lane_index
68f36dbb84SChunyang Hui                 len = (len >= 16) ? (len >> 4 << 6) : 0;
69f36dbb84SChunyang Hui                 printf("\t%d", len);
70f36dbb84SChunyang Hui                 if (last_lens[i] > 0 && last_lens[i] == len)
71f36dbb84SChunyang Hui                         num_unchanged += 1;
72f36dbb84SChunyang Hui                 last_lens[i] = len;
73f36dbb84SChunyang Hui         }
74f36dbb84SChunyang Hui         printf("\n");
75f36dbb84SChunyang Hui         return num_unchanged;
76f36dbb84SChunyang Hui }
77*6801b27bSTomasz Kantecki #endif /* !FIPS_MODE */
78f36dbb84SChunyang Hui 
79b923697dSMarcel Cornu int
main(void)80b923697dSMarcel Cornu main(void)
81f36dbb84SChunyang Hui {
82*6801b27bSTomasz Kantecki #ifndef FIPS_MODE
83*6801b27bSTomasz Kantecki         ISAL_SM3_HASH_CTX_MGR *mgr = NULL;
84*6801b27bSTomasz Kantecki         ISAL_SM3_HASH_CTX ctxpool[TEST_BUFS];
85*6801b27bSTomasz Kantecki         ISAL_SM3_HASH_CTX *ctx = NULL;
86f36dbb84SChunyang Hui         uint32_t i, j, fail = 0;
87f36dbb84SChunyang Hui         unsigned char *bufs[TEST_BUFS];
88f36dbb84SChunyang Hui         uint32_t lens[TEST_BUFS];
89f36dbb84SChunyang Hui         uint8_t num_ret, num_unchanged = 0;
90c91caf97STom Cosgrove         int ret;
91f36dbb84SChunyang Hui 
92f36dbb84SChunyang Hui         printf("sm3_mb flush test, %d buffers with %d length: \n", TEST_BUFS, TEST_LEN);
93f36dbb84SChunyang Hui 
94*6801b27bSTomasz Kantecki         ret = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SM3_HASH_CTX_MGR));
95c91caf97STom Cosgrove         if ((ret != 0) || (mgr == NULL)) {
96c91caf97STom Cosgrove                 printf("posix_memalign failed test aborted\n");
97c91caf97STom Cosgrove                 return 1;
98c91caf97STom Cosgrove         }
99c91caf97STom Cosgrove 
100*6801b27bSTomasz Kantecki         if (isal_sm3_ctx_mgr_init(mgr) != 0) {
101*6801b27bSTomasz Kantecki                 printf("init failed test aborted\n");
102*6801b27bSTomasz Kantecki                 fail++;
103*6801b27bSTomasz Kantecki                 goto end;
104*6801b27bSTomasz Kantecki         }
105f36dbb84SChunyang Hui 
106f36dbb84SChunyang Hui         srand(TEST_SEED);
107f36dbb84SChunyang Hui 
108f36dbb84SChunyang Hui         for (i = 0; i < TEST_BUFS; i++) {
109f36dbb84SChunyang Hui                 // Allocate  and fill buffer
110*6801b27bSTomasz Kantecki                 lens[i] = TEST_LEN / ISAL_SM3_MAX_LANES * (i + 1);
111f36dbb84SChunyang Hui                 bufs[i] = (unsigned char *) malloc(lens[i]);
112f36dbb84SChunyang Hui                 if (bufs[i] == NULL) {
113f36dbb84SChunyang Hui                         printf("malloc failed test aborted\n");
114f5954796SMarcel Cornu                         fail++;
115f5954796SMarcel Cornu                         goto end;
116f36dbb84SChunyang Hui                 }
117f36dbb84SChunyang Hui                 rand_buffer(bufs[i], lens[i]);
118f36dbb84SChunyang Hui         }
119f36dbb84SChunyang Hui 
120f36dbb84SChunyang Hui         for (i = 0; i < TEST_BUFS; i++) {
121f36dbb84SChunyang Hui                 // Init ctx contexts
1228cb7fe78SPablo de Lara                 isal_hash_ctx_init(&ctxpool[i]);
123f36dbb84SChunyang Hui                 ctxpool[i].user_data = (void *) ((uint64_t) i);
124f36dbb84SChunyang Hui 
125f36dbb84SChunyang Hui                 // Run reference test
126f36dbb84SChunyang Hui                 sm3_ossl(bufs[i], lens[i], digest_ref[i]);
127f36dbb84SChunyang Hui 
128f36dbb84SChunyang Hui                 // Run sb_sm3 test
129*6801b27bSTomasz Kantecki                 if (isal_sm3_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], lens[i],
130*6801b27bSTomasz Kantecki                                             ISAL_HASH_ENTIRE) != 0) {
131*6801b27bSTomasz Kantecki                         printf("submit failed test aborted\n");
132*6801b27bSTomasz Kantecki                         fail++;
133*6801b27bSTomasz Kantecki                         goto end;
134*6801b27bSTomasz Kantecki                 }
135f36dbb84SChunyang Hui         }
136f36dbb84SChunyang Hui 
137f36dbb84SChunyang Hui         printf("Changes of lens inside mgr:\n");
138f36dbb84SChunyang Hui         lens_print_and_check(mgr);
139*6801b27bSTomasz Kantecki         while (isal_sm3_ctx_mgr_flush(mgr, &ctx) == 0) {
140*6801b27bSTomasz Kantecki                 if (ctx == NULL)
141*6801b27bSTomasz Kantecki                         break;
142f36dbb84SChunyang Hui                 num_ret = lens_print_and_check(mgr);
143f36dbb84SChunyang Hui                 num_unchanged = num_unchanged > num_ret ? num_unchanged : num_ret;
144f36dbb84SChunyang Hui         }
145f36dbb84SChunyang Hui         printf("Info of sm3_mb lens prints over\n");
146f36dbb84SChunyang Hui 
147f36dbb84SChunyang Hui         for (i = 0; i < TEST_BUFS; i++) {
148*6801b27bSTomasz Kantecki                 for (j = 0; j < ISAL_SM3_DIGEST_NWORDS; j++) {
149e3f7d4fbSUlrich Weigand                         if (ctxpool[i].job.result_digest[j] !=
150e3f7d4fbSUlrich Weigand                             to_le32(((uint32_t *) digest_ref[i])[j])) {
151f36dbb84SChunyang Hui                                 fail++;
152f36dbb84SChunyang Hui                                 printf("Test%d fixed size, digest%d "
153f36dbb84SChunyang Hui                                        "fail 0x%08X <=> 0x%08X \n",
154f36dbb84SChunyang Hui                                        i, j, ctxpool[i].job.result_digest[j],
155e3f7d4fbSUlrich Weigand                                        to_le32(((uint32_t *) digest_ref[i])[j]));
156f36dbb84SChunyang Hui                         }
157f36dbb84SChunyang Hui                 }
158f36dbb84SChunyang Hui         }
159f36dbb84SChunyang Hui 
160*6801b27bSTomasz Kantecki end:
161f36dbb84SChunyang Hui         if (fail)
162f36dbb84SChunyang Hui                 printf("Test failed function check %d\n", fail);
163f36dbb84SChunyang Hui         else
164f36dbb84SChunyang Hui                 printf("Pass\n");
165f36dbb84SChunyang Hui 
166f5954796SMarcel Cornu         for (i = 0; i < TEST_BUFS; i++)
167f5954796SMarcel Cornu                 free(bufs[i]);
168f5954796SMarcel Cornu         aligned_free(mgr);
169f5954796SMarcel Cornu 
170f36dbb84SChunyang Hui         return fail;
171*6801b27bSTomasz Kantecki #else
172*6801b27bSTomasz Kantecki         printf("Not Executed\n");
173*6801b27bSTomasz Kantecki         return 0;
174*6801b27bSTomasz Kantecki #endif /* FIPS_MODE */
175f36dbb84SChunyang Hui }
176