@@ -177,6 +177,18 @@ static void testmgr_free_buf(char *buf[XBUFSIZE])
177
177
free_page ((unsigned long )buf [i ]);
178
178
}
179
179
180
+ static int ahash_guard_result (char * result , char c , int size )
181
+ {
182
+ int i ;
183
+
184
+ for (i = 0 ; i < size ; i ++ ) {
185
+ if (result [i ] != c )
186
+ return - EINVAL ;
187
+ }
188
+
189
+ return 0 ;
190
+ }
191
+
180
192
static int ahash_partial_update (struct ahash_request * * preq ,
181
193
struct crypto_ahash * tfm , const struct hash_testvec * template ,
182
194
void * hash_buff , int k , int temp , struct scatterlist * sg ,
@@ -186,6 +198,7 @@ static int ahash_partial_update(struct ahash_request **preq,
186
198
struct ahash_request * req ;
187
199
int statesize , ret = - EINVAL ;
188
200
static const unsigned char guard [] = { 0x00 , 0xba , 0xad , 0x00 };
201
+ int digestsize = crypto_ahash_digestsize (tfm );
189
202
190
203
req = * preq ;
191
204
statesize = crypto_ahash_statesize (
@@ -196,12 +209,19 @@ static int ahash_partial_update(struct ahash_request **preq,
196
209
goto out_nostate ;
197
210
}
198
211
memcpy (state + statesize , guard , sizeof (guard ));
212
+ memset (result , 1 , digestsize );
199
213
ret = crypto_ahash_export (req , state );
200
214
WARN_ON (memcmp (state + statesize , guard , sizeof (guard )));
201
215
if (ret ) {
202
216
pr_err ("alg: hash: Failed to export() for %s\n" , algo );
203
217
goto out ;
204
218
}
219
+ ret = ahash_guard_result (result , 1 , digestsize );
220
+ if (ret ) {
221
+ pr_err ("alg: hash: Failed, export used req->result for %s\n" ,
222
+ algo );
223
+ goto out ;
224
+ }
205
225
ahash_request_free (req );
206
226
req = ahash_request_alloc (tfm , GFP_KERNEL );
207
227
if (!req ) {
@@ -221,6 +241,12 @@ static int ahash_partial_update(struct ahash_request **preq,
221
241
pr_err ("alg: hash: Failed to import() for %s\n" , algo );
222
242
goto out ;
223
243
}
244
+ ret = ahash_guard_result (result , 1 , digestsize );
245
+ if (ret ) {
246
+ pr_err ("alg: hash: Failed, import used req->result for %s\n" ,
247
+ algo );
248
+ goto out ;
249
+ }
224
250
ret = crypto_wait_req (crypto_ahash_update (req ), wait );
225
251
if (ret )
226
252
goto out ;
@@ -316,18 +342,31 @@ static int __test_hash(struct crypto_ahash *tfm,
316
342
goto out ;
317
343
}
318
344
} else {
345
+ memset (result , 1 , digest_size );
319
346
ret = crypto_wait_req (crypto_ahash_init (req ), & wait );
320
347
if (ret ) {
321
348
pr_err ("alg: hash: init failed on test %d "
322
349
"for %s: ret=%d\n" , j , algo , - ret );
323
350
goto out ;
324
351
}
352
+ ret = ahash_guard_result (result , 1 , digest_size );
353
+ if (ret ) {
354
+ pr_err ("alg: hash: init failed on test %d "
355
+ "for %s: used req->result\n" , j , algo );
356
+ goto out ;
357
+ }
325
358
ret = crypto_wait_req (crypto_ahash_update (req ), & wait );
326
359
if (ret ) {
327
360
pr_err ("alg: hash: update failed on test %d "
328
361
"for %s: ret=%d\n" , j , algo , - ret );
329
362
goto out ;
330
363
}
364
+ ret = ahash_guard_result (result , 1 , digest_size );
365
+ if (ret ) {
366
+ pr_err ("alg: hash: update failed on test %d "
367
+ "for %s: used req->result\n" , j , algo );
368
+ goto out ;
369
+ }
331
370
ret = crypto_wait_req (crypto_ahash_final (req ), & wait );
332
371
if (ret ) {
333
372
pr_err ("alg: hash: final failed on test %d "
0 commit comments