<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: "IntelOne Text"; font-size: 10pt; color: rgb(0, 0, 0);" class="elementToProof">
Acked-by: Kai Ji <kai.ji@intel.com></div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Finn, Emma <emma.finn@intel.com><br>
<b>Sent:</b> 10 November 2025 17:01<br>
<b>To:</b> Akhil Goyal <gakhil@marvell.com>; Fan Zhang <fanzhang.oss@gmail.com>; Ji, Kai <kai.ji@intel.com>; Trahe, Fiona <fiona.trahe@intel.com>; Arkadiusz Kusztal <arkadiuszx.kusztal@intel.com><br>
<b>Cc:</b> dev@dpdk.org <dev@dpdk.org>; Finn, Emma <emma.finn@intel.com><br>
<b>Subject:</b> [v2] crypto/qat: fix CCM request descriptor hash_state_sz field</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">The hash_state_sz field in the QAT request descriptor for AES-CCM<br>
operations was incorrectly set to the digest length. According to<br>
the QAT firmware specification, this field should contain the<br>
length of AAD in quadwords for CCM operations.<br>
<br>
This incorrect field value caused QAT firmware to return<br>
INVALID_PARAMS errors for certain AAD buffer sizes. A new unit<br>
test is also added to cover this case.<br>
<br>
Fixes: ab56c4d9ed9a ("crypto/qat: support AES-CCM")<br>
<br>
Signed-off-by: Emma Finn <emma.finn@intel.com><br>
---<br>
v2:<br>
* Updated to use 16-byte alignment.<br>
---<br>
 app/test/test_cryptodev.c                   | 16 +++++++<br>
 app/test/test_cryptodev_aead_test_vectors.h | 53 +++++++++++++++++++++<br>
 drivers/crypto/qat/qat_sym_session.c        |  3 +-<br>
 3 files changed, 71 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c<br>
index 6e5f308e55..9bdd357727 100644<br>
--- a/app/test/test_cryptodev.c<br>
+++ b/app/test/test_cryptodev.c<br>
@@ -14271,6 +14271,12 @@ test_AES_CCM_authenticated_encryption_test_case_128_3(void)<br>
         return test_authenticated_encryption(&ccm_test_case_128_3);<br>
 }<br>
 <br>
+static int<br>
+test_AES_CCM_authenticated_encryption_test_case_128_4(void)<br>
+{<br>
+       return test_authenticated_encryption(&ccm_test_case_128_4);<br>
+}<br>
+<br>
 static int<br>
 test_AES_CCM_authenticated_decryption_test_case_128_1(void)<br>
 {<br>
@@ -14289,6 +14295,12 @@ test_AES_CCM_authenticated_decryption_test_case_128_3(void)<br>
         return test_authenticated_decryption(&ccm_test_case_128_3);<br>
 }<br>
 <br>
+static int<br>
+test_AES_CCM_authenticated_decryption_test_case_128_4(void)<br>
+{<br>
+       return test_authenticated_decryption(&ccm_test_case_128_4);<br>
+}<br>
+<br>
 static int<br>
 test_AES_CCM_authenticated_encryption_test_case_192_1(void)<br>
 {<br>
@@ -18975,6 +18987,8 @@ static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {<br>
                         test_AES_CCM_authenticated_encryption_test_case_128_2),<br>
                 TEST_CASE_ST(ut_setup, ut_teardown,<br>
                         test_AES_CCM_authenticated_encryption_test_case_128_3),<br>
+               TEST_CASE_ST(ut_setup, ut_teardown,<br>
+                       test_AES_CCM_authenticated_encryption_test_case_128_4),<br>
 <br>
                 /** AES CCM Authenticated Decryption 128 bits key*/<br>
                 TEST_CASE_ST(ut_setup, ut_teardown,<br>
@@ -18983,6 +18997,8 @@ static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {<br>
                         test_AES_CCM_authenticated_decryption_test_case_128_2),<br>
                 TEST_CASE_ST(ut_setup, ut_teardown,<br>
                         test_AES_CCM_authenticated_decryption_test_case_128_3),<br>
+               TEST_CASE_ST(ut_setup, ut_teardown,<br>
+                       test_AES_CCM_authenticated_decryption_test_case_128_4),<br>
 <br>
                 /** AES CCM Authenticated Encryption 192 bits key */<br>
                 TEST_CASE_ST(ut_setup, ut_teardown,<br>
diff --git a/app/test/test_cryptodev_aead_test_vectors.h b/app/test/test_cryptodev_aead_test_vectors.h<br>
index 73bedaf557..6b9642e339 100644<br>
--- a/app/test/test_cryptodev_aead_test_vectors.h<br>
+++ b/app/test/test_cryptodev_aead_test_vectors.h<br>
@@ -50,6 +50,13 @@ static uint8_t ccm_aad_test_2[22] = {<br>
                 0xA5, 0xB8, 0xFC, 0xBA, 0x00, 0x00<br>
 };<br>
 <br>
+static uint8_t ccm_aad_test_4[32] = {<br>
+               0xD2, 0x3D, 0xBD, 0xF2, 0x13, 0xAA, 0xD5, 0x03,<br>
+               0xDB, 0xA5, 0x3E, 0x44, 0xBB, 0x1E, 0xD7, 0x19,<br>
+               0x65, 0x2F, 0x37, 0xA0, 0x97, 0xD6, 0x5F, 0x59,<br>
+               0x0B, 0xD1, 0xE6, 0xA4, 0xCC, 0x50, 0xEB, 0x62<br>
+};<br>
+<br>
 static uint8_t sm4_gcm_aad_test_2[] = {<br>
                 0x3f, 0x89, 0x42, 0x20<br>
 };<br>
@@ -3714,6 +3721,52 @@ static const struct aead_test_data ccm_test_case_128_3 = {<br>
         }<br>
 };<br>
 <br>
+static const struct aead_test_data ccm_test_case_128_4 = {<br>
+       .algo = RTE_CRYPTO_AEAD_AES_CCM,<br>
+       .key = {<br>
+               .data = {<br>
+                       0x2F, 0x55, 0xF2, 0xF8, 0x4E, 0x66, 0x5E, 0x4B,<br>
+                       0x1D, 0x56, 0x91, 0x62, 0x6C, 0xE7, 0xD4, 0xB8<br>
+               },<br>
+               .len = 16<br>
+       },<br>
+       .iv = {<br>
+               .data = {<br>
+                       0x2C, 0x39, 0xBE, 0x24, 0xAF, 0xF4, 0xC1, 0x0E,<br>
+                       0x20, 0x26, 0x11, 0x49, 0x49<br>
+               },<br>
+               .len = 13<br>
+       },<br>
+       .aad = {<br>
+               .data = ccm_aad_test_4,<br>
+               .len = 32<br>
+       },<br>
+       .plaintext = {<br>
+               .data = {<br>
+                       0xF5, 0x2A, 0xEC, 0xEF, 0x88, 0x73, 0x10, 0x11,<br>
+                       0xD0, 0x68, 0xCB, 0x8E, 0x82, 0xBE, 0xED, 0x68,<br>
+                       0xC1, 0xC6, 0xF2, 0xA5, 0x9E, 0x99, 0xF6, 0x3D,<br>
+                       0xDA, 0xEA, 0xA0, 0x49, 0xD0, 0xF4, 0x18, 0xC0<br>
+               },<br>
+               .len = 32<br>
+       },<br>
+       .ciphertext = {<br>
+               .data = {<br>
+                       0x0F, 0x7B, 0x8A, 0x0D, 0x79, 0xB6, 0x1C, 0x93,<br>
+                       0x00, 0x26, 0x57, 0x52, 0xC8, 0x68, 0x30, 0xF6,<br>
+                       0x92, 0xA4, 0x9C, 0x86, 0x5E, 0x77, 0x51, 0x9C,<br>
+                       0x79, 0x15, 0x7C, 0xF3, 0x87, 0x27, 0x2A, 0x77<br>
+               },<br>
+               .len = 32<br>
+       },<br>
+       .auth_tag = {<br>
+               .data = {<br>
+                       0x64, 0x2F, 0x58, 0x61<br>
+               },<br>
+               .len = 4<br>
+       }<br>
+};<br>
+<br>
 /** AES-CCM-192 Test Vectors */<br>
 static const struct aead_test_data ccm_test_case_192_1 = {<br>
         .algo = RTE_CRYPTO_AEAD_AES_CCM,<br>
diff --git a/drivers/crypto/qat/qat_sym_session.c b/drivers/crypto/qat/qat_sym_session.c<br>
index 98ab82ffb3..2ba4fc0a3a 100644<br>
--- a/drivers/crypto/qat/qat_sym_session.c<br>
+++ b/drivers/crypto/qat/qat_sym_session.c<br>
@@ -2774,7 +2774,8 @@ static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,<br>
                 hash->auth_counter.counter = 0;<br>
 <br>
                 hash_cd_ctrl->outer_prefix_sz = digestsize;<br>
-               auth_param->hash_state_sz = digestsize;<br>
+               auth_param->hash_state_sz = (RTE_ALIGN_CEIL(auth_param->u2.aad_sz,<br>
+                                               ICP_QAT_HW_CCM_AAD_ALIGNMENT) >> 3);<br>
 <br>
                 memcpy(cdesc->cd_cur_ptr + state1_size, authkey, authkeylen);<br>
                 break;<br>
-- <br>
2.34.1<br>
<br>
</div>
</span></font></div>
</body>
</html>