xref: /isa-l_crypto/mh_sha256/mh_sha256_update_test.c (revision 15f45959d342594afa975e58d4e7e8bbe34e2f0b)
1 /**********************************************************************
2   Copyright(c) 2011-2017 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 
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include "mh_sha256.h"
33 
34 #define TEST_LEN  16 * 1024
35 #define TEST_SIZE 8 * 1024
36 #define TEST_MEM  TEST_LEN
37 #ifndef TEST_SEED
38 #define TEST_SEED 0x1234
39 #endif
40 
41 #define str(s)  #s
42 #define xstr(s) str(s)
43 
44 #define _FUNC_TOKEN(func, type) func##type
45 #define FUNC_TOKEN(func, type)  _FUNC_TOKEN(func, type)
46 
47 #ifndef MH_SHA256_FUNC_TYPE
48 #define MH_SHA256_FUNC_TYPE
49 #endif
50 
51 #define TEST_UPDATE_FUNCTION FUNC_TOKEN(mh_sha256_update, MH_SHA256_FUNC_TYPE)
52 #define TEST_FINAL_FUNCTION  FUNC_TOKEN(mh_sha256_finalize, MH_SHA256_FUNC_TYPE)
53 
54 #define CHECK_RETURN(state)                                                                        \
55         do {                                                                                       \
56                 if ((state) != ISAL_MH_SHA256_CTX_ERROR_NONE) {                                    \
57                         printf("The mh_sha256 function is failed.\n");                             \
58                         return 1;                                                                  \
59                 }                                                                                  \
60         } while (0)
61 
62 extern void
63 mh_sha256_ref(const void *buffer, uint32_t len, uint32_t *mh_sha256_digest);
64 
65 // Generates pseudo-random data
66 void
67 rand_buffer(uint8_t *buf, long buffer_size)
68 {
69         long i;
70         for (i = 0; i < buffer_size; i++)
71                 buf[i] = rand();
72 }
73 
74 void
75 dump(char *buf, int len)
76 {
77         int i;
78         for (i = 0; i < len;) {
79                 printf(" %2x", 0xff & buf[i++]);
80                 if (i % 20 == 0)
81                         printf("\n");
82         }
83         if (i % 20 != 0)
84                 printf("\n");
85 }
86 
87 int
88 compare_digests(uint32_t hash_ref[ISAL_SHA256_DIGEST_WORDS],
89                 uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS])
90 {
91         int i;
92         int mh_sha256_fail = 0;
93 
94         for (i = 0; i < ISAL_SHA256_DIGEST_WORDS; i++) {
95                 if (hash_test[i] != hash_ref[i])
96                         mh_sha256_fail++;
97         }
98 
99         if (mh_sha256_fail) {
100                 printf("mh_sha256 fail test\n");
101                 printf("ref: ");
102                 dump((char *) hash_ref, 20);
103                 printf("test: ");
104                 dump((char *) hash_test, 20);
105         }
106 
107         return mh_sha256_fail;
108 }
109 
110 int
111 main(int argc, char *argv[])
112 {
113         int fail = 0, i;
114         uint32_t hash_test[ISAL_SHA256_DIGEST_WORDS], hash_ref[ISAL_SHA256_DIGEST_WORDS];
115         uint8_t *buff = NULL;
116         int update_count;
117         int size1, size2, offset, addr_offset;
118         struct mh_sha256_ctx *update_ctx = NULL;
119         uint8_t *mem_addr = NULL;
120 
121         printf(xstr(TEST_UPDATE_FUNCTION) "_test:");
122 
123         srand(TEST_SEED);
124 
125         buff = malloc(TEST_LEN);
126         update_ctx = malloc(sizeof(*update_ctx));
127 
128         if (buff == NULL || update_ctx == NULL) {
129                 printf("malloc failed test aborted\n");
130                 goto end_ctx;
131         }
132         // Rand test1
133         rand_buffer(buff, TEST_LEN);
134 
135         mh_sha256_ref(buff, TEST_LEN, hash_ref);
136 
137         CHECK_RETURN(mh_sha256_init(update_ctx));
138         CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, TEST_LEN));
139         CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
140 
141         fail = compare_digests(hash_ref, hash_test);
142 
143         if (fail) {
144                 printf("fail rand1 test\n");
145                 goto end_ctx;
146         } else
147                 putchar('.');
148 
149         // Test various size messages by update twice.
150         printf("\n various size messages by update twice tests");
151         for (size1 = TEST_LEN; size1 >= 0; size1--) {
152 
153                 // Fill with rand data
154                 rand_buffer(buff, TEST_LEN);
155 
156                 mh_sha256_ref(buff, TEST_LEN, hash_ref);
157 
158                 // subsequent update
159                 size2 = TEST_LEN - size1; // size2 is different with the former
160                 CHECK_RETURN(mh_sha256_init(update_ctx));
161                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, size1));
162                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + size1, size2));
163                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
164 
165                 fail = compare_digests(hash_ref, hash_test);
166 
167                 if (fail) {
168                         printf("Fail size1=%d\n", size1);
169                         goto end_ctx;
170                 }
171 
172                 if ((size2 & 0xff) == 0) {
173                         putchar('.');
174                         fflush(0);
175                 }
176         }
177 
178         // Test various update count
179         printf("\n various update count tests");
180         for (update_count = 1; update_count <= TEST_LEN; update_count++) {
181 
182                 // Fill with rand data
183                 rand_buffer(buff, TEST_LEN);
184 
185                 mh_sha256_ref(buff, TEST_LEN, hash_ref);
186 
187                 // subsequent update
188                 size1 = TEST_LEN / update_count;
189                 size2 = TEST_LEN - size1 * (update_count - 1); // size2 is different with the former
190 
191                 CHECK_RETURN(mh_sha256_init(update_ctx));
192                 for (i = 1, offset = 0; i < update_count; i++) {
193                         CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + offset, size1));
194                         offset += size1;
195                 }
196                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff + offset, size2));
197                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
198 
199                 fail = compare_digests(hash_ref, hash_test);
200 
201                 if (fail) {
202                         printf("Fail size1=%d\n", size1);
203                         goto end_ctx;
204                 }
205 
206                 if ((size2 & 0xff) == 0) {
207                         putchar('.');
208                         fflush(0);
209                 }
210         }
211 
212         // test various start address of ctx.
213         printf("\n various start address of ctx test");
214 
215         free(update_ctx);
216 
217         // test various start address of ctx.
218         printf("\n various start address of ctx test");
219         mem_addr = (uint8_t *) malloc(sizeof(*update_ctx) + ISAL_AVX512_ALIGNED * 10);
220         if (mem_addr == NULL) {
221                 fail++;
222                 goto end;
223         }
224 
225         for (addr_offset = ISAL_AVX512_ALIGNED * 10; addr_offset >= 0; addr_offset--) {
226 
227                 // Fill with rand data
228                 rand_buffer(buff, TEST_LEN);
229 
230                 mh_sha256_ref(buff, TEST_LEN, hash_ref);
231 
232                 // a unaligned offset
233                 update_ctx = (struct mh_sha256_ctx *) (mem_addr + addr_offset);
234                 CHECK_RETURN(mh_sha256_init(update_ctx));
235                 CHECK_RETURN(TEST_UPDATE_FUNCTION(update_ctx, buff, TEST_LEN));
236                 CHECK_RETURN(TEST_FINAL_FUNCTION(update_ctx, hash_test));
237 
238                 fail = compare_digests(hash_ref, hash_test);
239 
240                 if (fail) {
241                         printf("Fail addr_offset=%d\n", addr_offset);
242                         goto end;
243                 }
244 
245                 if ((addr_offset & 0xf) == 0) {
246                         putchar('.');
247                         fflush(0);
248                 }
249         }
250 end:
251         if (mem_addr != NULL)
252                 free(mem_addr);
253         if (buff != NULL)
254                 free(buff);
255 
256         printf("\n" xstr(TEST_UPDATE_FUNCTION) "_test: %s\n", fail == 0 ? "Pass" : "Fail");
257 
258         return fail;
259 
260 end_ctx:
261         if (update_ctx != NULL)
262                 free(update_ctx);
263         goto end;
264 }
265