@@ -42,11 +42,19 @@ struct crypto_hash_walk {
42
42
};
43
43
44
44
struct ahash_save_req_state {
45
- struct ahash_request * req ;
45
+ struct list_head head ;
46
+ struct ahash_request * req0 ;
47
+ struct ahash_request * cur ;
48
+ int (* op )(struct ahash_request * req );
46
49
crypto_completion_t compl ;
47
50
void * data ;
48
51
};
49
52
53
+ static void ahash_reqchain_done (void * data , int err );
54
+ static int ahash_save_req (struct ahash_request * req , crypto_completion_t cplt );
55
+ static void ahash_restore_req (struct ahash_request * req );
56
+ static int ahash_def_finup (struct ahash_request * req );
57
+
50
58
static int hash_walk_next (struct crypto_hash_walk * walk )
51
59
{
52
60
unsigned int offset = walk -> offset ;
@@ -273,24 +281,145 @@ int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
273
281
}
274
282
EXPORT_SYMBOL_GPL (crypto_ahash_setkey );
275
283
284
+ static int ahash_reqchain_finish (struct ahash_save_req_state * state ,
285
+ int err , u32 mask )
286
+ {
287
+ struct ahash_request * req0 = state -> req0 ;
288
+ struct ahash_request * req = state -> cur ;
289
+ struct ahash_request * n ;
290
+
291
+ req -> base .err = err ;
292
+
293
+ if (req != req0 )
294
+ list_add_tail (& req -> base .list , & req0 -> base .list );
295
+
296
+ list_for_each_entry_safe (req , n , & state -> head , base .list ) {
297
+ list_del_init (& req -> base .list );
298
+
299
+ req -> base .flags &= mask ;
300
+ req -> base .complete = ahash_reqchain_done ;
301
+ req -> base .data = state ;
302
+ state -> cur = req ;
303
+ err = state -> op (req );
304
+
305
+ if (err == - EINPROGRESS ) {
306
+ if (!list_empty (& state -> head ))
307
+ err = - EBUSY ;
308
+ goto out ;
309
+ }
310
+
311
+ if (err == - EBUSY )
312
+ goto out ;
313
+
314
+ req -> base .err = err ;
315
+ list_add_tail (& req -> base .list , & req0 -> base .list );
316
+ }
317
+
318
+ ahash_restore_req (req0 );
319
+
320
+ out :
321
+ return err ;
322
+ }
323
+
324
+ static void ahash_reqchain_done (void * data , int err )
325
+ {
326
+ struct ahash_save_req_state * state = data ;
327
+ crypto_completion_t compl = state -> compl ;
328
+
329
+ data = state -> data ;
330
+
331
+ if (err == - EINPROGRESS ) {
332
+ if (!list_empty (& state -> head ))
333
+ return ;
334
+ goto notify ;
335
+ }
336
+
337
+ err = ahash_reqchain_finish (state , err , CRYPTO_TFM_REQ_MAY_BACKLOG );
338
+ if (err == - EBUSY )
339
+ return ;
340
+
341
+ notify :
342
+ compl (data , err );
343
+ }
344
+
345
+ static int ahash_do_req_chain (struct ahash_request * req ,
346
+ int (* op )(struct ahash_request * req ))
347
+ {
348
+ struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
349
+ struct ahash_save_req_state * state ;
350
+ struct ahash_save_req_state state0 ;
351
+ int err ;
352
+
353
+ if (!ahash_request_chained (req ) || crypto_ahash_req_chain (tfm ))
354
+ return op (req );
355
+
356
+ state = & state0 ;
357
+
358
+ if (ahash_is_async (tfm )) {
359
+ err = ahash_save_req (req , ahash_reqchain_done );
360
+ if (err ) {
361
+ struct ahash_request * r2 ;
362
+
363
+ req -> base .err = err ;
364
+ list_for_each_entry (r2 , & req -> base .list , base .list )
365
+ r2 -> base .err = err ;
366
+
367
+ return err ;
368
+ }
369
+
370
+ state = req -> base .data ;
371
+ }
372
+
373
+ state -> op = op ;
374
+ state -> cur = req ;
375
+ INIT_LIST_HEAD (& state -> head );
376
+ list_splice_init (& req -> base .list , & state -> head );
377
+
378
+ err = op (req );
379
+ if (err == - EBUSY || err == - EINPROGRESS )
380
+ return - EBUSY ;
381
+
382
+ return ahash_reqchain_finish (state , err , ~0 );
383
+ }
384
+
276
385
int crypto_ahash_init (struct ahash_request * req )
277
386
{
278
387
struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
279
388
280
- if (likely (tfm -> using_shash ))
281
- return crypto_shash_init (prepare_shash_desc (req , tfm ));
389
+ if (likely (tfm -> using_shash )) {
390
+ struct ahash_request * r2 ;
391
+ int err ;
392
+
393
+ err = crypto_shash_init (prepare_shash_desc (req , tfm ));
394
+ req -> base .err = err ;
395
+
396
+ list_for_each_entry (r2 , & req -> base .list , base .list ) {
397
+ struct shash_desc * desc ;
398
+
399
+ desc = prepare_shash_desc (r2 , tfm );
400
+ r2 -> base .err = crypto_shash_init (desc );
401
+ }
402
+
403
+ return err ;
404
+ }
405
+
282
406
if (crypto_ahash_get_flags (tfm ) & CRYPTO_TFM_NEED_KEY )
283
407
return - ENOKEY ;
284
- return crypto_ahash_alg (tfm )-> init (req );
408
+
409
+ return ahash_do_req_chain (req , crypto_ahash_alg (tfm )-> init );
285
410
}
286
411
EXPORT_SYMBOL_GPL (crypto_ahash_init );
287
412
288
413
static int ahash_save_req (struct ahash_request * req , crypto_completion_t cplt )
289
414
{
415
+ struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
290
416
struct ahash_save_req_state * state ;
291
417
gfp_t gfp ;
292
418
u32 flags ;
293
419
420
+ if (!ahash_is_async (tfm ))
421
+ return 0 ;
422
+
294
423
flags = ahash_request_flags (req );
295
424
gfp = (flags & CRYPTO_TFM_REQ_MAY_SLEEP ) ? GFP_KERNEL : GFP_ATOMIC ;
296
425
state = kmalloc (sizeof (* state ), gfp );
@@ -301,14 +430,20 @@ static int ahash_save_req(struct ahash_request *req, crypto_completion_t cplt)
301
430
state -> data = req -> base .data ;
302
431
req -> base .complete = cplt ;
303
432
req -> base .data = state ;
304
- state -> req = req ;
433
+ state -> req0 = req ;
305
434
306
435
return 0 ;
307
436
}
308
437
309
438
static void ahash_restore_req (struct ahash_request * req )
310
439
{
311
- struct ahash_save_req_state * state = req -> base .data ;
440
+ struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
441
+ struct ahash_save_req_state * state ;
442
+
443
+ if (!ahash_is_async (tfm ))
444
+ return ;
445
+
446
+ state = req -> base .data ;
312
447
313
448
req -> base .complete = state -> compl ;
314
449
req -> base .data = state -> data ;
@@ -319,53 +454,112 @@ int crypto_ahash_update(struct ahash_request *req)
319
454
{
320
455
struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
321
456
322
- if (likely (tfm -> using_shash ))
323
- return shash_ahash_update (req , ahash_request_ctx (req ));
457
+ if (likely (tfm -> using_shash )) {
458
+ struct ahash_request * r2 ;
459
+ int err ;
460
+
461
+ err = shash_ahash_update (req , ahash_request_ctx (req ));
462
+ req -> base .err = err ;
463
+
464
+ list_for_each_entry (r2 , & req -> base .list , base .list ) {
465
+ struct shash_desc * desc ;
324
466
325
- return crypto_ahash_alg (tfm )-> update (req );
467
+ desc = ahash_request_ctx (r2 );
468
+ r2 -> base .err = shash_ahash_update (r2 , desc );
469
+ }
470
+
471
+ return err ;
472
+ }
473
+
474
+ return ahash_do_req_chain (req , crypto_ahash_alg (tfm )-> update );
326
475
}
327
476
EXPORT_SYMBOL_GPL (crypto_ahash_update );
328
477
329
478
int crypto_ahash_final (struct ahash_request * req )
330
479
{
331
480
struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
332
481
333
- if (likely (tfm -> using_shash ))
334
- return crypto_shash_final (ahash_request_ctx (req ), req -> result );
482
+ if (likely (tfm -> using_shash )) {
483
+ struct ahash_request * r2 ;
484
+ int err ;
485
+
486
+ err = crypto_shash_final (ahash_request_ctx (req ), req -> result );
487
+ req -> base .err = err ;
488
+
489
+ list_for_each_entry (r2 , & req -> base .list , base .list ) {
490
+ struct shash_desc * desc ;
335
491
336
- return crypto_ahash_alg (tfm )-> final (req );
492
+ desc = ahash_request_ctx (r2 );
493
+ r2 -> base .err = crypto_shash_final (desc , r2 -> result );
494
+ }
495
+
496
+ return err ;
497
+ }
498
+
499
+ return ahash_do_req_chain (req , crypto_ahash_alg (tfm )-> final );
337
500
}
338
501
EXPORT_SYMBOL_GPL (crypto_ahash_final );
339
502
340
503
int crypto_ahash_finup (struct ahash_request * req )
341
504
{
342
505
struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
343
506
344
- if (likely (tfm -> using_shash ))
345
- return shash_ahash_finup (req , ahash_request_ctx (req ));
507
+ if (likely (tfm -> using_shash )) {
508
+ struct ahash_request * r2 ;
509
+ int err ;
510
+
511
+ err = shash_ahash_finup (req , ahash_request_ctx (req ));
512
+ req -> base .err = err ;
513
+
514
+ list_for_each_entry (r2 , & req -> base .list , base .list ) {
515
+ struct shash_desc * desc ;
516
+
517
+ desc = ahash_request_ctx (r2 );
518
+ r2 -> base .err = shash_ahash_finup (r2 , desc );
519
+ }
520
+
521
+ return err ;
522
+ }
346
523
347
- return crypto_ahash_alg (tfm )-> finup (req );
524
+ if (!crypto_ahash_alg (tfm )-> finup )
525
+ return ahash_def_finup (req );
526
+
527
+ return ahash_do_req_chain (req , crypto_ahash_alg (tfm )-> finup );
348
528
}
349
529
EXPORT_SYMBOL_GPL (crypto_ahash_finup );
350
530
351
531
int crypto_ahash_digest (struct ahash_request * req )
352
532
{
353
533
struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
354
534
355
- if (likely (tfm -> using_shash ))
356
- return shash_ahash_digest (req , prepare_shash_desc (req , tfm ));
535
+ if (likely (tfm -> using_shash )) {
536
+ struct ahash_request * r2 ;
537
+ int err ;
538
+
539
+ err = shash_ahash_digest (req , prepare_shash_desc (req , tfm ));
540
+ req -> base .err = err ;
541
+
542
+ list_for_each_entry (r2 , & req -> base .list , base .list ) {
543
+ struct shash_desc * desc ;
544
+
545
+ desc = prepare_shash_desc (r2 , tfm );
546
+ r2 -> base .err = shash_ahash_digest (r2 , desc );
547
+ }
548
+
549
+ return err ;
550
+ }
357
551
358
552
if (crypto_ahash_get_flags (tfm ) & CRYPTO_TFM_NEED_KEY )
359
553
return - ENOKEY ;
360
554
361
- return crypto_ahash_alg (tfm )-> digest ( req );
555
+ return ahash_do_req_chain ( req , crypto_ahash_alg (tfm )-> digest );
362
556
}
363
557
EXPORT_SYMBOL_GPL (crypto_ahash_digest );
364
558
365
559
static void ahash_def_finup_done2 (void * data , int err )
366
560
{
367
561
struct ahash_save_req_state * state = data ;
368
- struct ahash_request * areq = state -> req ;
562
+ struct ahash_request * areq = state -> req0 ;
369
563
370
564
if (err == - EINPROGRESS )
371
565
return ;
@@ -376,12 +570,15 @@ static void ahash_def_finup_done2(void *data, int err)
376
570
377
571
static int ahash_def_finup_finish1 (struct ahash_request * req , int err )
378
572
{
573
+ struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
574
+
379
575
if (err )
380
576
goto out ;
381
577
382
- req -> base .complete = ahash_def_finup_done2 ;
578
+ if (ahash_is_async (tfm ))
579
+ req -> base .complete = ahash_def_finup_done2 ;
383
580
384
- err = crypto_ahash_alg ( crypto_ahash_reqtfm ( req )) -> final (req );
581
+ err = crypto_ahash_final (req );
385
582
if (err == - EINPROGRESS || err == - EBUSY )
386
583
return err ;
387
584
@@ -397,7 +594,7 @@ static void ahash_def_finup_done1(void *data, int err)
397
594
struct ahash_request * areq ;
398
595
399
596
state = * state0 ;
400
- areq = state .req ;
597
+ areq = state .req0 ;
401
598
if (err == - EINPROGRESS )
402
599
goto out ;
403
600
@@ -413,14 +610,13 @@ static void ahash_def_finup_done1(void *data, int err)
413
610
414
611
static int ahash_def_finup (struct ahash_request * req )
415
612
{
416
- struct crypto_ahash * tfm = crypto_ahash_reqtfm (req );
417
613
int err ;
418
614
419
615
err = ahash_save_req (req , ahash_def_finup_done1 );
420
616
if (err )
421
617
return err ;
422
618
423
- err = crypto_ahash_alg ( tfm ) -> update (req );
619
+ err = crypto_ahash_update (req );
424
620
if (err == - EINPROGRESS || err == - EBUSY )
425
621
return err ;
426
622
@@ -635,8 +831,6 @@ static int ahash_prepare_alg(struct ahash_alg *alg)
635
831
base -> cra_type = & crypto_ahash_type ;
636
832
base -> cra_flags |= CRYPTO_ALG_TYPE_AHASH ;
637
833
638
- if (!alg -> finup )
639
- alg -> finup = ahash_def_finup ;
640
834
if (!alg -> setkey )
641
835
alg -> setkey = ahash_nosetkey ;
642
836
@@ -707,5 +901,20 @@ int ahash_register_instance(struct crypto_template *tmpl,
707
901
}
708
902
EXPORT_SYMBOL_GPL (ahash_register_instance );
709
903
904
+ void ahash_request_free (struct ahash_request * req )
905
+ {
906
+ struct ahash_request * tmp ;
907
+ struct ahash_request * r2 ;
908
+
909
+ if (unlikely (!req ))
910
+ return ;
911
+
912
+ list_for_each_entry_safe (r2 , tmp , & req -> base .list , base .list )
913
+ kfree_sensitive (r2 );
914
+
915
+ kfree_sensitive (req );
916
+ }
917
+ EXPORT_SYMBOL_GPL (ahash_request_free );
918
+
710
919
MODULE_LICENSE ("GPL" );
711
920
MODULE_DESCRIPTION ("Asynchronous cryptographic hash type" );
0 commit comments