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