@@ -134,13 +134,29 @@ static int CMAC_ACPKM_Init(CMAC_ACPKM_CTX *ctx, const void *key, size_t keylen,
134134 }
135135 /* Initialise context */
136136 if (cipher ) {
137- const EVP_CIPHER * acpkm ;
137+ const EVP_CIPHER * acpkm = NULL ;
138138
139139 if (!EVP_EncryptInit_ex (ctx -> cctx , cipher , impl , NULL , NULL ))
140140 return 0 ;
141- if (!EVP_CIPHER_is_a (cipher , SN_grasshopper_cbc ))
141+ /* Unfortunately, EVP_CIPHER_is_a is bugged for an engine, EVP_CIPHER_nid is bugged for a provider. */
142+ if (EVP_CIPHER_nid (cipher ) == NID_undef ) {
143+ /* Looks like a provider */
144+ if (EVP_CIPHER_is_a (cipher , SN_magma_cbc ))
145+ acpkm = cipher_gost_magma_ctracpkm ();
146+ else if (EVP_CIPHER_is_a (cipher , SN_grasshopper_cbc ))
147+ acpkm = cipher_gost_grasshopper_ctracpkm ();
148+ }
149+ else {
150+ /* Looks like an engine */
151+ if (EVP_CIPHER_nid (cipher ) == NID_magma_cbc )
152+ acpkm = cipher_gost_magma_ctracpkm ();
153+ else if (EVP_CIPHER_nid (cipher ) == NID_grasshopper_cbc )
154+ acpkm = cipher_gost_grasshopper_ctracpkm ();
155+ }
156+
157+ if (acpkm == NULL )
142158 return 0 ;
143- acpkm = cipher_gost_grasshopper_ctracpkm ();
159+
144160 if (!EVP_EncryptInit_ex (ctx -> actx , acpkm , impl , NULL , NULL ))
145161 return 0 ;
146162 }
@@ -319,6 +335,9 @@ static int omac_acpkm_init(EVP_MD_CTX *ctx, const char *cipher_name)
319335 case NID_grasshopper_cbc :
320336 c -> dgst_size = 16 ;
321337 break ;
338+ case NID_magma_cbc :
339+ c -> dgst_size = 8 ;
340+ break ;
322341 }
323342
324343 return 1 ;
@@ -329,6 +348,11 @@ static int grasshopper_omac_acpkm_init(EVP_MD_CTX *ctx)
329348 return omac_acpkm_init (ctx , SN_grasshopper_cbc );
330349}
331350
351+ static int magma_omac_acpkm_init (EVP_MD_CTX * ctx )
352+ {
353+ return omac_acpkm_init (ctx , SN_magma_cbc );
354+ }
355+
332356static int omac_acpkm_imit_update (EVP_MD_CTX * ctx , const void * data ,
333357 size_t count )
334358{
@@ -432,6 +456,9 @@ int omac_acpkm_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
432456 if (EVP_MD_is_a (md , SN_grasshopper_mac )
433457 || EVP_MD_is_a (md , SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac ))
434458 c -> cipher_name = SN_grasshopper_cbc ;
459+ else if (EVP_MD_is_a (md , SN_magma_mac )
460+ || EVP_MD_is_a (md , SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac ))
461+ c -> cipher_name = SN_magma_cbc ;
435462 }
436463 if ((cipher =
437464 (EVP_CIPHER * )EVP_get_cipherbyname (c -> cipher_name )) == NULL
@@ -468,9 +495,13 @@ int omac_acpkm_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
468495 return -1 ;
469496 c -> cmac_ctx -> section_size = arg ;
470497 if (ptr && * (int * )ptr ) {
498+ const EVP_CIPHER * cipher ;
499+ if ((cipher = EVP_CIPHER_CTX_cipher (c -> cmac_ctx -> actx )) == NULL ) {
500+ return 0 ;
501+ }
502+
471503 /* Set parameter T */
472- if (EVP_CIPHER_get0_provider (EVP_CIPHER_CTX_cipher (c -> cmac_ctx -> actx ))
473- == NULL ) {
504+ if (EVP_CIPHER_get0_provider (cipher ) == NULL ) {
474505 if (!EVP_CIPHER_CTX_ctrl (c -> cmac_ctx -> actx , EVP_CTRL_KEY_MESH ,
475506 * (int * )ptr , NULL ))
476507 return 0 ;
@@ -527,3 +558,17 @@ GOST_digest kuznyechik_ctracpkm_omac_digest = {
527558 .cleanup = omac_acpkm_imit_cleanup ,
528559 .ctrl = omac_acpkm_imit_ctrl ,
529560};
561+
562+ GOST_digest magma_ctracpkm_omac_digest = {
563+ .nid = NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac ,
564+ .result_size = 8 ,
565+ .input_blocksize = 8 ,
566+ .app_datasize = sizeof (OMAC_ACPKM_CTX ),
567+ .flags = EVP_MD_FLAG_XOF ,
568+ .init = magma_omac_acpkm_init ,
569+ .update = omac_acpkm_imit_update ,
570+ .final = omac_acpkm_imit_final ,
571+ .copy = omac_acpkm_imit_copy ,
572+ .cleanup = omac_acpkm_imit_cleanup ,
573+ .ctrl = omac_acpkm_imit_ctrl ,
574+ };
0 commit comments