@@ -358,5 +358,114 @@ int test_cmac_multi_update(void *data)
358358 return err ;
359359}
360360
361+ int test_cmac_dup (void * data )
362+ {
363+ int ret = 0 ;
364+ EVP_MAC * emac = NULL ;
365+ EVP_MAC_CTX * src = NULL ;
366+ EVP_MAC_CTX * dup = NULL ;
367+ OSSL_PARAM params [3 ];
368+ char cipher [] = "AES-256-CBC" ;
369+ unsigned char key [] = {
370+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
371+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
372+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
373+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07
374+ };
375+ unsigned char prefix [] = "dup-prefix" ;
376+ unsigned char tailA [] = "-tail-a" ;
377+ unsigned char tailB [] = "-tail-b" ;
378+ unsigned char msgA [sizeof (prefix ) + sizeof (tailA )];
379+ unsigned char msgB [sizeof (prefix ) + sizeof (tailB )];
380+ unsigned char macA [16 ];
381+ unsigned char macB [16 ];
382+ unsigned char expA [16 ];
383+ unsigned char expB [16 ];
384+ size_t macASz = sizeof (macA );
385+ size_t macBSz = sizeof (macB );
386+ int expASz = sizeof (expA );
387+ int expBSz = sizeof (expB );
388+
389+ (void )data ;
390+
391+ PRINT_MSG ("Testing CMAC context dup" );
392+
393+ /* Build full messages for one-shot expected MAC calculations. */
394+ memcpy (msgA , prefix , sizeof (prefix ));
395+ memcpy (msgA + sizeof (prefix ), tailA , sizeof (tailA ));
396+ memcpy (msgB , prefix , sizeof (prefix ));
397+ memcpy (msgB + sizeof (prefix ), tailB , sizeof (tailB ));
398+
399+ /* Compute expected MACs. */
400+ ret = test_cmac_gen_mac (wpLibCtx , cipher , key , (int )sizeof (key ),
401+ msgA , (int )sizeof (msgA ), expA , & expASz );
402+ if (ret != 0 ) {
403+ PRINT_MSG ("Generate expected MAC A failed" );
404+ }
405+ if (ret == 0 ) {
406+ ret = test_cmac_gen_mac (wpLibCtx , cipher , key , (int )sizeof (key ),
407+ msgB , (int )sizeof (msgB ), expB , & expBSz );
408+ if (ret != 0 ) {
409+ PRINT_MSG ("Generate expected MAC B failed" );
410+ }
411+ }
412+
413+ params [0 ] = OSSL_PARAM_construct_utf8_string (OSSL_MAC_PARAM_CIPHER ,
414+ cipher , 0 );
415+ params [1 ] = OSSL_PARAM_construct_octet_string (OSSL_MAC_PARAM_KEY ,
416+ (void * )key , sizeof (key ));
417+ params [2 ] = OSSL_PARAM_construct_end ();
418+
419+ if (ret == 0 ) {
420+ ret = (emac = EVP_MAC_fetch (wpLibCtx , "CMAC" , NULL )) == NULL ;
421+ }
422+ if (ret == 0 ) {
423+ ret = (src = EVP_MAC_CTX_new (emac )) == NULL ;
424+ }
425+ if (ret == 0 ) {
426+ ret = EVP_MAC_CTX_set_params (src , params ) != 1 ;
427+ }
428+ if (ret == 0 ) {
429+ ret = EVP_MAC_init (src , NULL , 0 , NULL ) != 1 ;
430+ }
431+ if (ret == 0 ) {
432+ ret = EVP_MAC_update (src , prefix , sizeof (prefix )) != 1 ;
433+ }
434+ /* Duplicate after partial update. */
435+ if (ret == 0 ) {
436+ ret = (dup = EVP_MAC_CTX_dup (src )) == NULL ;
437+ }
438+ if (ret == 0 ) {
439+ ret = EVP_MAC_update (src , tailA , sizeof (tailA )) != 1 ;
440+ }
441+ if (ret == 0 ) {
442+ ret = EVP_MAC_update (dup , tailB , sizeof (tailB )) != 1 ;
443+ }
444+ if (ret == 0 ) {
445+ ret = EVP_MAC_final (src , macA , & macASz , sizeof (macA )) != 1 ;
446+ }
447+ if (ret == 0 ) {
448+ ret = EVP_MAC_final (dup , macB , & macBSz , sizeof (macB )) != 1 ;
449+ }
450+ if (ret == 0 ) {
451+ if ((macASz != (size_t )expASz ) || (memcmp (macA , expA , macASz ) != 0 )) {
452+ PRINT_MSG ("Duplicated source context MAC mismatch" );
453+ ret = -1 ;
454+ }
455+ }
456+ if (ret == 0 ) {
457+ if ((macBSz != (size_t )expBSz ) || (memcmp (macB , expB , macBSz ) != 0 )) {
458+ PRINT_MSG ("Duplicated destination context MAC mismatch" );
459+ ret = -1 ;
460+ }
461+ }
462+
463+ EVP_MAC_CTX_free (dup );
464+ EVP_MAC_CTX_free (src );
465+ EVP_MAC_free (emac );
466+
467+ return ret ;
468+ }
469+
361470#endif /* WP_HAVE_CMAC */
362471
0 commit comments