xref: /isa-l_crypto/sha512_mb/sha512_mb_rand_test.c (revision ddd75af8e7df0260c837e3ee2acced54ddd92a0f)
1 /**********************************************************************
2   Copyright(c) 2011-2016 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 <string.h>
33 #include "sha512_mb.h"
34 
35 #define TEST_LEN  (1024*1024)
36 #define TEST_BUFS 100
37 #ifndef RANDOMS
38 # define RANDOMS  10
39 #endif
40 #ifndef TEST_SEED
41 # define TEST_SEED 0x1234
42 #endif
43 
44 static uint64_t digest_ref[TEST_BUFS][SHA512_DIGEST_NWORDS];
45 
46 // Compare against reference function
47 extern void sha512_ref(uint8_t * input_data, uint64_t * digest, uint32_t len);
48 
49 // Generates pseudo-random data
50 void rand_buffer(unsigned char *buf, const long buffer_size)
51 {
52 	long i;
53 	for (i = 0; i < buffer_size; i++)
54 		buf[i] = rand();
55 }
56 
57 int main(void)
58 {
59 	SHA512_HASH_CTX_MGR *mgr = NULL;
60 	SHA512_HASH_CTX ctxpool[TEST_BUFS];
61 	uint32_t i, j, fail = 0;
62 	unsigned char *bufs[TEST_BUFS] = { 0 };
63 	uint32_t lens[TEST_BUFS];
64 	unsigned int jobs, t;
65 	uint8_t *tmp_buf = NULL;
66 	int ret;
67 
68 	printf("multibinary_sha512 test, %d sets of %dx%d max: ", RANDOMS, TEST_BUFS,
69 	       TEST_LEN);
70 
71 	ret = posix_memalign((void *)&mgr, 16, sizeof(SHA512_HASH_CTX_MGR));
72 	if ((ret != 0) || (mgr == NULL)) {
73 		printf("posix_memalign failed test aborted\n");
74 		goto end;
75 	}
76 
77 	sha512_ctx_mgr_init(mgr);
78 
79 	srand(TEST_SEED);
80 
81 	for (i = 0; i < TEST_BUFS; i++) {
82 		// Allocate  and fill buffer
83 		bufs[i] = (unsigned char *)malloc(TEST_LEN);
84 		if (bufs[i] == NULL) {
85 			printf("malloc failed test aborted\n");
86 			goto end;
87 		}
88 		rand_buffer(bufs[i], TEST_LEN);
89 
90 		// Init ctx contexts
91 		hash_ctx_init(&ctxpool[i]);
92 		ctxpool[i].user_data = (void *)((uint64_t) i);
93 
94 		// Run reference test
95 		sha512_ref(bufs[i], digest_ref[i], TEST_LEN);
96 
97 		// Run sb_sha512 test
98 		sha512_ctx_mgr_submit(mgr, &ctxpool[i], bufs[i], TEST_LEN, HASH_ENTIRE);
99 	}
100 
101 	while (sha512_ctx_mgr_flush(mgr)) ;
102 
103 	for (i = 0; i < TEST_BUFS; i++) {
104 		for (j = 0; j < SHA512_DIGEST_NWORDS; j++) {
105 			if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
106 				fail++;
107 				printf("Test%d fixed size, digest%d "
108 				       "fail 0x%016lX <=> 0x%016lX \n",
109 				       i, j, ctxpool[i].job.result_digest[j],
110 				       digest_ref[i][j]);
111 			}
112 		}
113 	}
114 
115 	if (fail) {
116 		printf("Test failed function check %d\n", fail);
117 		goto end;
118 	}
119 	// Run tests with random size and number of jobs
120 	for (t = 0; t < RANDOMS; t++) {
121 		jobs = rand() % (TEST_BUFS);
122 
123 		sha512_ctx_mgr_init(mgr);
124 
125 		for (i = 0; i < jobs; i++) {
126 			// Use buffer with random len and contents
127 			lens[i] = rand() % (TEST_LEN);
128 			rand_buffer(bufs[i], lens[i]);
129 
130 			// Run reference test
131 			sha512_ref(bufs[i], digest_ref[i], lens[i]);
132 
133 			// Run sha512_mb test
134 			sha512_ctx_mgr_submit(mgr, &ctxpool[i], bufs[i], lens[i], HASH_ENTIRE);
135 		}
136 
137 		while (sha512_ctx_mgr_flush(mgr)) ;
138 
139 		for (i = 0; i < jobs; i++) {
140 			for (j = 0; j < SHA512_DIGEST_NWORDS; j++) {
141 				if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
142 					fail++;
143 					printf("Test%d, digest%d fail "
144 					       "0x%016lX <=> 0x%016lX\n",
145 					       i, j, ctxpool[i].job.result_digest[j],
146 					       digest_ref[i][j]);
147 				}
148 			}
149 		}
150 		if (fail) {
151 			printf("Test failed function check %d\n", fail);
152 			goto end;
153 		}
154 
155 		putchar('.');
156 		fflush(0);
157 	}			// random test t
158 
159 	// Test at the end of buffer
160 	jobs = rand() % TEST_BUFS;
161 	tmp_buf = (uint8_t *) malloc(sizeof(uint8_t) * jobs);
162 	if (!tmp_buf) {
163 		printf("malloc failed, end test aborted.\n");
164 		goto end;
165 	}
166 
167 	rand_buffer(tmp_buf, jobs);
168 
169 	sha512_ctx_mgr_init(mgr);
170 
171 	for (i = 0; i < TEST_BUFS; i++)
172 		free(bufs[i]);
173 
174 	// Extend to the end of allocated buffer to construct jobs
175 	for (i = 0; i < jobs; i++) {
176 		bufs[i] = (uint8_t *) & tmp_buf[i];
177 		lens[i] = jobs - i;
178 
179 		// Reference test
180 		sha512_ref(bufs[i], digest_ref[i], lens[i]);
181 
182 		// sb_sha512 test
183 		sha512_ctx_mgr_submit(mgr, &ctxpool[i], bufs[i], lens[i], HASH_ENTIRE);
184 	}
185 	// Clear bufs
186 	memset(bufs, 0, sizeof(bufs));
187 
188 	while (sha512_ctx_mgr_flush(mgr)) ;
189 
190 	for (i = 0; i < jobs; i++) {
191 		for (j = 0; j < SHA512_DIGEST_NWORDS; j++) {
192 			if (ctxpool[i].job.result_digest[j] != digest_ref[i][j]) {
193 				fail++;
194 				printf("End test failed at offset %d - result: 0x%016lX"
195 				       ", ref: 0x%016lX\n", i, ctxpool[i].job.result_digest[j],
196 				       digest_ref[i][j]);
197 			}
198 		}
199 	}
200 
201 	putchar('.');
202 
203       end:
204 	for (i = 0; i < TEST_BUFS; i++)
205 		free(bufs[i]);
206 	free(tmp_buf);
207 	aligned_free(mgr);
208 
209 	if (fail)
210 		printf("Test failed function check %d\n", fail);
211 	else
212 		printf(" multibinary_sha512 rand: Pass\n");
213 
214 	return fail;
215 }
216