@@ -431,45 +431,65 @@ static int wp_aes_block_dinit(wp_AesBlockCtx *ctx, const unsigned char *key,
431431static int wp_aes_block_doit (wp_AesBlockCtx * ctx , unsigned char * out ,
432432 const unsigned char * in , size_t inLen )
433433{
434- int rc ;
435-
436- #ifdef WP_HAVE_AESCBC
437- if (ctx -> mode == EVP_CIPH_CBC_MODE ) {
438- if (ctx -> enc ) {
439- rc = wc_AesCbcEncrypt (& ctx -> aes , out , in , (word32 )inLen );
440- if (rc != 0 ) {
441- WOLFPROV_MSG_DEBUG_RETCODE (WP_LOG_LEVEL_DEBUG , "wc_AesCbcEncrypt" , rc );
434+ int rc = 0 ;
435+
436+ while ((rc == 0 ) && (inLen > 0 )) {
437+ /* Chunk must be block-aligned (AES block size = 16). */
438+ word32 chunk = (inLen > 0xFFFFFFF0U ) ? 0xFFFFFFF0U : (word32 )inLen ;
439+
440+ #ifdef WP_HAVE_AESCBC
441+ if (ctx -> mode == EVP_CIPH_CBC_MODE ) {
442+ if (ctx -> enc ) {
443+ rc = wc_AesCbcEncrypt (& ctx -> aes , out , in , chunk );
444+ if (rc != 0 ) {
445+ WOLFPROV_MSG_DEBUG_RETCODE (WP_LOG_LEVEL_DEBUG ,
446+ "wc_AesCbcEncrypt" , rc );
447+ }
442448 }
443- }
444- else {
445- rc = wc_AesCbcDecrypt (& ctx -> aes , out , in , (word32 )inLen );
446- if (rc != 0 ) {
447- WOLFPROV_MSG_DEBUG_RETCODE (WP_LOG_LEVEL_DEBUG , "wc_AesCbcDecrypt" , rc );
449+ else {
450+ rc = wc_AesCbcDecrypt (& ctx -> aes , out , in , chunk );
451+ if (rc != 0 ) {
452+ WOLFPROV_MSG_DEBUG_RETCODE (WP_LOG_LEVEL_DEBUG ,
453+ "wc_AesCbcDecrypt" , rc );
454+ }
448455 }
449456 }
450- XMEMCPY ( ctx -> iv , ctx -> aes . reg , ctx -> ivLen );
451- }
452- else
453- #endif
454- #ifdef WP_HAVE_AESECB
455- if ( ctx -> mode == EVP_CIPH_ECB_MODE ) {
456- if (ctx -> enc ) {
457- rc = wc_AesEcbEncrypt ( & ctx -> aes , out , in , ( word32 ) inLen );
458- if ( rc != 0 ) {
459- WOLFPROV_MSG_DEBUG_RETCODE ( WP_LOG_LEVEL_DEBUG , "wc_AesEcbEncrypt" , rc );
457+ else
458+ #endif
459+ #ifdef WP_HAVE_AESECB
460+ if ( ctx -> mode == EVP_CIPH_ECB_MODE ) {
461+ if ( ctx -> enc ) {
462+ rc = wc_AesEcbEncrypt ( & ctx -> aes , out , in , chunk );
463+ if (rc != 0 ) {
464+ WOLFPROV_MSG_DEBUG_RETCODE ( WP_LOG_LEVEL_DEBUG ,
465+ "wc_AesEcbEncrypt" , rc );
466+ }
460467 }
461- }
462- else {
463- rc = wc_AesEcbDecrypt (& ctx -> aes , out , in , (word32 )inLen );
464- if (rc != 0 ) {
465- WOLFPROV_MSG_DEBUG_RETCODE (WP_LOG_LEVEL_DEBUG , "wc_AesEcbDecrypt" , rc );
468+ else {
469+ rc = wc_AesEcbDecrypt (& ctx -> aes , out , in , chunk );
470+ if (rc != 0 ) {
471+ WOLFPROV_MSG_DEBUG_RETCODE (WP_LOG_LEVEL_DEBUG ,
472+ "wc_AesEcbDecrypt" , rc );
473+ }
466474 }
467475 }
476+ else
477+ #endif
478+ {
479+ rc = -1 ;
480+ }
481+
482+ in += chunk ;
483+ out += chunk ;
484+ inLen -= chunk ;
468485 }
469- else
470- #endif
471- {
472- rc = -1 ;
486+
487+ if (rc == 0 ) {
488+ #ifdef WP_HAVE_AESCBC
489+ if (ctx -> mode == EVP_CIPH_CBC_MODE ) {
490+ XMEMCPY (ctx -> iv , ctx -> aes .reg , ctx -> ivLen );
491+ }
492+ #endif
473493 }
474494
475495 return rc == 0 ;
0 commit comments