@@ -413,38 +413,38 @@ static void crypto_gcm_exit_tfm(struct crypto_tfm *tfm)
413413 crypto_free_ablkcipher (ctx -> ctr );
414414}
415415
416- static struct crypto_instance * crypto_gcm_alloc (struct rtattr * * tb )
416+ static struct crypto_instance * crypto_gcm_alloc_common (struct rtattr * * tb ,
417+ const char * full_name ,
418+ const char * ctr_name )
417419{
420+ struct crypto_attr_type * algt ;
418421 struct crypto_instance * inst ;
419422 struct crypto_alg * ctr ;
420- struct crypto_alg * cipher ;
421423 struct gcm_instance_ctx * ctx ;
422424 int err ;
423- char ctr_name [CRYPTO_MAX_ALG_NAME ];
424425
425- err = crypto_check_attr_type (tb , CRYPTO_ALG_TYPE_AEAD );
426- if (err )
426+ algt = crypto_get_attr_type (tb );
427+ err = PTR_ERR (algt );
428+ if (IS_ERR (algt ))
427429 return ERR_PTR (err );
428430
429- cipher = crypto_attr_alg (tb [1 ], CRYPTO_ALG_TYPE_CIPHER ,
430- CRYPTO_ALG_TYPE_MASK );
431-
432- inst = ERR_PTR (PTR_ERR (cipher ));
433- if (IS_ERR (cipher ))
434- return inst ;
435-
436- inst = ERR_PTR (ENAMETOOLONG );
437- if (snprintf (ctr_name , CRYPTO_MAX_ALG_NAME , "ctr(%s)" ,
438- cipher -> cra_name ) >= CRYPTO_MAX_ALG_NAME )
439- return inst ;
431+ if ((algt -> type ^ CRYPTO_ALG_TYPE_AEAD ) & algt -> mask )
432+ return ERR_PTR (- EINVAL );
440433
441434 ctr = crypto_alg_mod_lookup (ctr_name , CRYPTO_ALG_TYPE_BLKCIPHER ,
442435 CRYPTO_ALG_TYPE_MASK );
443436
444437 if (IS_ERR (ctr ))
445438 return ERR_PTR (PTR_ERR (ctr ));
446439
447- if (cipher -> cra_blocksize != 16 )
440+ /* We only support 16-byte blocks. */
441+ if ((ctr -> cra_type == & crypto_blkcipher_type ?
442+ ctr -> cra_blkcipher .ivsize : ctr -> cra_ablkcipher .ivsize ) != 16 )
443+ goto out_put_ctr ;
444+
445+ /* Not a stream cipher? */
446+ err = - EINVAL ;
447+ if (ctr -> cra_blocksize != 1 )
448448 goto out_put_ctr ;
449449
450450 inst = kzalloc (sizeof (* inst ) + sizeof (* ctx ), GFP_KERNEL );
@@ -453,21 +453,21 @@ static struct crypto_instance *crypto_gcm_alloc(struct rtattr **tb)
453453 goto out_put_ctr ;
454454
455455 err = - ENAMETOOLONG ;
456- if (snprintf (inst -> alg .cra_name , CRYPTO_MAX_ALG_NAME ,
457- "gcm(%s)" , cipher -> cra_name ) >= CRYPTO_MAX_ALG_NAME ||
458- snprintf (inst -> alg .cra_driver_name , CRYPTO_MAX_ALG_NAME ,
459- "gcm(%s)" , cipher -> cra_driver_name ) >= CRYPTO_MAX_ALG_NAME )
456+ if (snprintf (inst -> alg .cra_driver_name , CRYPTO_MAX_ALG_NAME ,
457+ "gcm_base(%s)" , ctr -> cra_driver_name ) >=
458+ CRYPTO_MAX_ALG_NAME )
460459 goto err_free_inst ;
461460
462-
463461 ctx = crypto_instance_ctx (inst );
464462 err = crypto_init_spawn (& ctx -> ctr , ctr , inst , CRYPTO_ALG_TYPE_MASK );
465463 if (err )
466464 goto err_free_inst ;
467465
466+ memcpy (inst -> alg .cra_name , full_name , CRYPTO_MAX_ALG_NAME );
467+
468468 inst -> alg .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC ;
469469 inst -> alg .cra_priority = ctr -> cra_priority ;
470- inst -> alg .cra_blocksize = 16 ;
470+ inst -> alg .cra_blocksize = 1 ;
471471 inst -> alg .cra_alignmask = ctr -> cra_alignmask | (__alignof__(u64 ) - 1 );
472472 inst -> alg .cra_type = & crypto_aead_type ;
473473 inst -> alg .cra_aead .ivsize = 16 ;
@@ -489,6 +489,29 @@ static struct crypto_instance *crypto_gcm_alloc(struct rtattr **tb)
489489 goto out ;
490490}
491491
492+ static struct crypto_instance * crypto_gcm_alloc (struct rtattr * * tb )
493+ {
494+ int err ;
495+ const char * cipher_name ;
496+ char ctr_name [CRYPTO_MAX_ALG_NAME ];
497+ char full_name [CRYPTO_MAX_ALG_NAME ];
498+
499+ cipher_name = crypto_attr_alg_name (tb [1 ]);
500+ err = PTR_ERR (cipher_name );
501+ if (IS_ERR (cipher_name ))
502+ return ERR_PTR (err );
503+
504+ if (snprintf (ctr_name , CRYPTO_MAX_ALG_NAME , "ctr(%s)" , cipher_name ) >=
505+ CRYPTO_MAX_ALG_NAME )
506+ return ERR_PTR (- ENAMETOOLONG );
507+
508+ if (snprintf (full_name , CRYPTO_MAX_ALG_NAME , "gcm(%s)" , cipher_name ) >=
509+ CRYPTO_MAX_ALG_NAME )
510+ return ERR_PTR (- ENAMETOOLONG );
511+
512+ return crypto_gcm_alloc_common (tb , full_name , ctr_name );
513+ }
514+
492515static void crypto_gcm_free (struct crypto_instance * inst )
493516{
494517 struct gcm_instance_ctx * ctx = crypto_instance_ctx (inst );
@@ -504,14 +527,55 @@ static struct crypto_template crypto_gcm_tmpl = {
504527 .module = THIS_MODULE ,
505528};
506529
530+ static struct crypto_instance * crypto_gcm_base_alloc (struct rtattr * * tb )
531+ {
532+ int err ;
533+ const char * ctr_name ;
534+ char full_name [CRYPTO_MAX_ALG_NAME ];
535+
536+ ctr_name = crypto_attr_alg_name (tb [1 ]);
537+ err = PTR_ERR (ctr_name );
538+ if (IS_ERR (ctr_name ))
539+ return ERR_PTR (err );
540+
541+ if (snprintf (full_name , CRYPTO_MAX_ALG_NAME , "gcm_base(%s)" ,
542+ ctr_name ) >= CRYPTO_MAX_ALG_NAME )
543+ return ERR_PTR (- ENAMETOOLONG );
544+
545+ return crypto_gcm_alloc_common (tb , full_name , ctr_name );
546+ }
547+
548+ static struct crypto_template crypto_gcm_base_tmpl = {
549+ .name = "gcm_base" ,
550+ .alloc = crypto_gcm_base_alloc ,
551+ .free = crypto_gcm_free ,
552+ .module = THIS_MODULE ,
553+ };
554+
507555static int __init crypto_gcm_module_init (void )
508556{
509- return crypto_register_template (& crypto_gcm_tmpl );
557+ int err ;
558+
559+ err = crypto_register_template (& crypto_gcm_base_tmpl );
560+ if (err )
561+ goto out ;
562+
563+ err = crypto_register_template (& crypto_gcm_tmpl );
564+ if (err )
565+ goto out_undo_base ;
566+
567+ out :
568+ return err ;
569+
570+ out_undo_base :
571+ crypto_unregister_template (& crypto_gcm_base_tmpl );
572+ goto out ;
510573}
511574
512575static void __exit crypto_gcm_module_exit (void )
513576{
514577 crypto_unregister_template (& crypto_gcm_tmpl );
578+ crypto_unregister_template (& crypto_gcm_base_tmpl );
515579}
516580
517581module_init (crypto_gcm_module_init );
@@ -520,3 +584,4 @@ module_exit(crypto_gcm_module_exit);
520584MODULE_LICENSE ("GPL" );
521585MODULE_DESCRIPTION ("Galois/Counter Mode" );
522586MODULE_AUTHOR (
"Mikko Herranen <[email protected] >" );
587+ MODULE_ALIAS ("gcm_base" );
0 commit comments