@@ -257,5 +257,114 @@ int test_cmac_create(void *data)
257257 return ret ;
258258}
259259
260+ int test_cmac_dup (void * data )
261+ {
262+ int ret = 0 ;
263+ EVP_MAC * emac = NULL ;
264+ EVP_MAC_CTX * src = NULL ;
265+ EVP_MAC_CTX * dup = NULL ;
266+ OSSL_PARAM params [3 ];
267+ char cipher [] = "AES-256-CBC" ;
268+ unsigned char key [] = {
269+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
270+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
271+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
272+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07
273+ };
274+ unsigned char prefix [] = "dup-prefix" ;
275+ unsigned char tailA [] = "-tail-a" ;
276+ unsigned char tailB [] = "-tail-b" ;
277+ unsigned char msgA [sizeof (prefix ) + sizeof (tailA )];
278+ unsigned char msgB [sizeof (prefix ) + sizeof (tailB )];
279+ unsigned char macA [16 ];
280+ unsigned char macB [16 ];
281+ unsigned char expA [16 ];
282+ unsigned char expB [16 ];
283+ size_t macASz = sizeof (macA );
284+ size_t macBSz = sizeof (macB );
285+ int expASz = sizeof (expA );
286+ int expBSz = sizeof (expB );
287+
288+ (void )data ;
289+
290+ PRINT_MSG ("Testing CMAC context dup" );
291+
292+ /* Build full messages for one-shot expected MAC calculations. */
293+ memcpy (msgA , prefix , sizeof (prefix ));
294+ memcpy (msgA + sizeof (prefix ), tailA , sizeof (tailA ));
295+ memcpy (msgB , prefix , sizeof (prefix ));
296+ memcpy (msgB + sizeof (prefix ), tailB , sizeof (tailB ));
297+
298+ /* Compute expected MACs. */
299+ ret = test_cmac_gen_mac (wpLibCtx , cipher , key , (int )sizeof (key ),
300+ msgA , (int )sizeof (msgA ), expA , & expASz );
301+ if (ret != 0 ) {
302+ PRINT_MSG ("Generate expected MAC A failed" );
303+ }
304+ if (ret == 0 ) {
305+ ret = test_cmac_gen_mac (wpLibCtx , cipher , key , (int )sizeof (key ),
306+ msgB , (int )sizeof (msgB ), expB , & expBSz );
307+ if (ret != 0 ) {
308+ PRINT_MSG ("Generate expected MAC B failed" );
309+ }
310+ }
311+
312+ params [0 ] = OSSL_PARAM_construct_utf8_string (OSSL_MAC_PARAM_CIPHER ,
313+ cipher , 0 );
314+ params [1 ] = OSSL_PARAM_construct_octet_string (OSSL_MAC_PARAM_KEY ,
315+ (void * )key , sizeof (key ));
316+ params [2 ] = OSSL_PARAM_construct_end ();
317+
318+ if (ret == 0 ) {
319+ ret = (emac = EVP_MAC_fetch (wpLibCtx , "CMAC" , NULL )) == NULL ;
320+ }
321+ if (ret == 0 ) {
322+ ret = (src = EVP_MAC_CTX_new (emac )) == NULL ;
323+ }
324+ if (ret == 0 ) {
325+ ret = EVP_MAC_CTX_set_params (src , params ) != 1 ;
326+ }
327+ if (ret == 0 ) {
328+ ret = EVP_MAC_init (src , NULL , 0 , NULL ) != 1 ;
329+ }
330+ if (ret == 0 ) {
331+ ret = EVP_MAC_update (src , prefix , sizeof (prefix )) != 1 ;
332+ }
333+ /* Duplicate after partial update. */
334+ if (ret == 0 ) {
335+ ret = (dup = EVP_MAC_CTX_dup (src )) == NULL ;
336+ }
337+ if (ret == 0 ) {
338+ ret = EVP_MAC_update (src , tailA , sizeof (tailA )) != 1 ;
339+ }
340+ if (ret == 0 ) {
341+ ret = EVP_MAC_update (dup , tailB , sizeof (tailB )) != 1 ;
342+ }
343+ if (ret == 0 ) {
344+ ret = EVP_MAC_final (src , macA , & macASz , sizeof (macA )) != 1 ;
345+ }
346+ if (ret == 0 ) {
347+ ret = EVP_MAC_final (dup , macB , & macBSz , sizeof (macB )) != 1 ;
348+ }
349+ if (ret == 0 ) {
350+ if ((macASz != (size_t )expASz ) || (memcmp (macA , expA , macASz ) != 0 )) {
351+ PRINT_MSG ("Duplicated source context MAC mismatch" );
352+ ret = -1 ;
353+ }
354+ }
355+ if (ret == 0 ) {
356+ if ((macBSz != (size_t )expBSz ) || (memcmp (macB , expB , macBSz ) != 0 )) {
357+ PRINT_MSG ("Duplicated destination context MAC mismatch" );
358+ ret = -1 ;
359+ }
360+ }
361+
362+ EVP_MAC_CTX_free (dup );
363+ EVP_MAC_CTX_free (src );
364+ EVP_MAC_free (emac );
365+
366+ return ret ;
367+ }
368+
260369#endif /* WP_HAVE_CMAC */
261370
0 commit comments