@@ -1395,17 +1395,32 @@ static int wp_aesgcm_encdec(wp_AeadCtx *ctx, unsigned char *out, size_t* outLen,
13951395 }
13961396 }
13971397 else {
1398- /* Only the most recent auth err matters */
1399- ctx -> authErr = 0 ;
1400- rc = wc_AesGcmDecrypt (& ctx -> aes , tmp , ctx -> in , (word32 )ctx -> inLen ,
1401- iv , (word32 )ctx -> ivLen , ctx -> buf , (word32 )ctx -> tagLen ,
1402- ctx -> aad , (word32 )ctx -> aadLen );
1403- if (rc == AES_GCM_AUTH_E ) {
1404- ctx -> authErr = 1 ;
1405- rc = 0 ;
1398+ if (done ) {
1399+ /* Only the most recent auth err matters */
1400+ ctx -> authErr = 0 ;
1401+ rc = wc_AesGcmDecrypt (& ctx -> aes , tmp , ctx -> in , (word32 )ctx -> inLen ,
1402+ iv , (word32 )ctx -> ivLen , ctx -> buf , (word32 )ctx -> tagLen ,
1403+ ctx -> aad , (word32 )ctx -> aadLen );
1404+ if (rc == AES_GCM_AUTH_E ) {
1405+ ctx -> authErr = 1 ;
1406+ rc = 0 ;
1407+ }
1408+ if (rc != 0 ) {
1409+ ok = 0 ;
1410+ }
14061411 }
1407- if (rc != 0 ) {
1408- ok = 0 ;
1412+ else {
1413+ byte tmpTag [16 ];
1414+
1415+ /* wc_AesGcmDecrypt does not yield plaintext on auth tag error.
1416+ * For all calls except final we use encrypt instead to yield
1417+ * the proper plaintext */
1418+ rc = wc_AesGcmEncrypt_ex (& ctx -> aes , tmp , ctx -> in ,
1419+ (word32 )ctx -> inLen , iv , (word32 )ctx -> ivLen , (byte * )tmpTag ,
1420+ (word32 )ctx -> tagLen , ctx -> aad , (word32 )ctx -> aadLen );
1421+ if (rc != 0 ) {
1422+ ok = 0 ;
1423+ }
14091424 }
14101425 }
14111426 /* Copy out relevant portion of output */
@@ -1424,6 +1439,7 @@ static int wp_aesgcm_encdec(wp_AeadCtx *ctx, unsigned char *out, size_t* outLen,
14241439 ctx -> aadLen = 0 ;
14251440 ctx -> aadSet = 0 ;
14261441 OPENSSL_free (ctx -> in );
1442+ ctx -> bufSize = 0 ;
14271443 ctx -> in = NULL ;
14281444 ctx -> inLen = 0 ;
14291445 }
0 commit comments