<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">
Release note and PMD documentation need update to support SHAKE algo </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> 08 January 2026 15:33<br>
<b>To:</b> Akhil Goyal <gakhil@marvell.com>; Fan Zhang <fanzhang.oss@gmail.com>; Ji, Kai <kai.ji@intel.com><br>
<b>Cc:</b> dev@dpdk.org <dev@dpdk.org>; Finn, Emma <emma.finn@intel.com><br>
<b>Subject:</b> [v2] crypto/openssl: Add support for SHAKE algorithms</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">OpenSSL 3.X has support for SHAKE, Hence adding<br>
SHAKE-128 and SHAKE-256 support to the OpenSSL PMD.<br>
<br>
Signed-off-by: Emma Finn <emma.finn@intel.com><br>
---<br>
v2:<br>
* Fixed unused digest_length variable<br>
---<br>
 app/test/test_cryptodev_blockcipher.c        |  4 +-<br>
 drivers/crypto/openssl/rte_openssl_pmd.c     | 30 ++++++++++++--<br>
 drivers/crypto/openssl/rte_openssl_pmd_ops.c | 42 ++++++++++++++++++++<br>
 3 files changed, 72 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/app/test/test_cryptodev_blockcipher.c b/app/test/test_cryptodev_blockcipher.c<br>
index 6b37347789..1438f24993 100644<br>
--- a/app/test/test_cryptodev_blockcipher.c<br>
+++ b/app/test/test_cryptodev_blockcipher.c<br>
@@ -1174,7 +1174,9 @@ authonly_setup(void)<br>
                 RTE_CRYPTO_AUTH_SHA512_HMAC,<br>
                 RTE_CRYPTO_AUTH_AES_CMAC,<br>
                 RTE_CRYPTO_AUTH_NULL,<br>
-               RTE_CRYPTO_AUTH_AES_XCBC_MAC<br>
+               RTE_CRYPTO_AUTH_AES_XCBC_MAC,<br>
+               RTE_CRYPTO_AUTH_SHAKE_128,<br>
+               RTE_CRYPTO_AUTH_SHAKE_256<br>
         };<br>
 <br>
         rte_cryptodev_info_get(dev_id, &dev_info);<br>
diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c b/drivers/crypto/openssl/rte_openssl_pmd.c<br>
index 4f171f48cc..755674f71a 100644<br>
--- a/drivers/crypto/openssl/rte_openssl_pmd.c<br>
+++ b/drivers/crypto/openssl/rte_openssl_pmd.c<br>
@@ -270,6 +270,12 @@ get_auth_algo(enum rte_crypto_auth_algorithm sessalgo,<br>
                 case RTE_CRYPTO_AUTH_SHA512_HMAC:<br>
                         *algo = EVP_sha512();<br>
                         break;<br>
+               case RTE_CRYPTO_AUTH_SHAKE_128:<br>
+                       *algo = EVP_shake128();<br>
+                       break;<br>
+               case RTE_CRYPTO_AUTH_SHAKE_256:<br>
+                       *algo = EVP_shake256();<br>
+                       break;<br>
                 default:<br>
                         res = -EINVAL;<br>
                         break;<br>
@@ -659,6 +665,8 @@ openssl_set_session_auth_parameters(struct openssl_session *sess,<br>
         case RTE_CRYPTO_AUTH_SHA256:<br>
         case RTE_CRYPTO_AUTH_SHA384:<br>
         case RTE_CRYPTO_AUTH_SHA512:<br>
+       case RTE_CRYPTO_AUTH_SHAKE_128:<br>
+       case RTE_CRYPTO_AUTH_SHAKE_256:<br>
                 sess->auth.mode = OPENSSL_AUTH_AS_AUTH;<br>
                 if (get_auth_algo(xform->auth.algo,<br>
                                 &sess->auth.auth.evp_algo) != 0)<br>
@@ -1397,7 +1405,7 @@ process_openssl_auth_decryption_ccm(struct rte_mbuf *mbuf_src, int offset,<br>
 static int<br>
 process_openssl_auth(struct rte_mbuf *mbuf_src, uint8_t *dst, int offset,<br>
                 __rte_unused uint8_t *iv, __rte_unused EVP_PKEY * pkey,<br>
-               int srclen, EVP_MD_CTX *ctx, const EVP_MD *algo)<br>
+               int srclen, EVP_MD_CTX *ctx, const EVP_MD *algo, int digest_length)<br>
 {<br>
         size_t dstlen;<br>
         struct rte_mbuf *m;<br>
@@ -1437,8 +1445,24 @@ process_openssl_auth(struct rte_mbuf *mbuf_src, uint8_t *dst, int offset,<br>
         }<br>
 <br>
 process_auth_final:<br>
-       if (EVP_DigestFinal_ex(ctx, dst, (unsigned int *)&dstlen) <= 0)<br>
+       /* SHAKE algorithms are XOFs and require EVP_DigestFinalXOF */<br>
+       if (algo == EVP_shake128() || algo == EVP_shake256()) {<br>
+#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)<br>
+               /* Set XOF output length before calling EVP_DigestFinalXOF */<br>
+               if (EVP_MD_CTX_ctrl(ctx, EVP_MD_CTRL_XOF_LEN, digest_length, NULL) <= 0)<br>
+                       goto process_auth_err;<br>
+               if (EVP_DigestFinalXOF(ctx, dst, digest_length) <= 0)<br>
+                       goto process_auth_err;<br>
+#else<br>
+               RTE_SET_USED(digest_length);<br>
+               OPENSSL_LOG(ERR, "SHAKE algorithms require OpenSSL 3.0+");<br>
                 goto process_auth_err;<br>
+#endif<br>
+       } else {<br>
+               if (EVP_DigestFinal_ex(ctx, dst, (unsigned int *)&dstlen) <= 0)<br>
+                       goto process_auth_err;<br>
+       }<br>
+<br>
         return 0;<br>
 <br>
 process_auth_err:<br>
@@ -1995,7 +2019,7 @@ process_openssl_auth_op(struct openssl_qp *qp, struct rte_crypto_op *op,<br>
                 ctx_a = get_local_auth_ctx(sess, qp);<br>
                 status = process_openssl_auth(mbuf_src, dst,<br>
                                 op->sym->auth.data.offset, NULL, NULL, srclen,<br>
-                               ctx_a, sess->auth.auth.evp_algo);<br>
+                               ctx_a, sess->auth.auth.evp_algo, sess->auth.digest_length);<br>
                 break;<br>
         case OPENSSL_AUTH_AS_HMAC:<br>
                 ctx_h = get_local_hmac_ctx(sess, qp);<br>
diff --git a/drivers/crypto/openssl/rte_openssl_pmd_ops.c b/drivers/crypto/openssl/rte_openssl_pmd_ops.c<br>
index 5095e6cbea..f6c32fdcb6 100644<br>
--- a/drivers/crypto/openssl/rte_openssl_pmd_ops.c<br>
+++ b/drivers/crypto/openssl/rte_openssl_pmd_ops.c<br>
@@ -269,6 +269,48 @@ static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {<br>
                         }, }<br>
                 }, }<br>
         },<br>
+       {   /* SHAKE_128 */<br>
+               .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,<br>
+               {.sym = {<br>
+                       .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,<br>
+                       {.auth = {<br>
+                               .algo = RTE_CRYPTO_AUTH_SHAKE_128,<br>
+                               .block_size = 168,<br>
+                               .key_size = {<br>
+                                       .min = 0,<br>
+                                       .max = 0,<br>
+                                       .increment = 0<br>
+                               },<br>
+                               .digest_size = {<br>
+                                       .min = 1,<br>
+                                       .max = 256,<br>
+                                       .increment = 1<br>
+                               },<br>
+                               .iv_size = { 0 }<br>
+                       }, }<br>
+               }, }<br>
+       },<br>
+       {   /* SHAKE_256 */<br>
+               .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,<br>
+               {.sym = {<br>
+                       .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,<br>
+                       {.auth = {<br>
+                               .algo = RTE_CRYPTO_AUTH_SHAKE_256,<br>
+                               .block_size = 136,<br>
+                               .key_size = {<br>
+                                       .min = 0,<br>
+                                       .max = 0,<br>
+                                       .increment = 0<br>
+                               },<br>
+                               .digest_size = {<br>
+                                       .min = 1,<br>
+                                       .max = 256,<br>
+                                       .increment = 1<br>
+                               },<br>
+                               .iv_size = { 0 }<br>
+                       }, }<br>
+               }, }<br>
+       },<br>
         {       /* AES CBC */<br>
                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,<br>
                 {.sym = {<br>
-- <br>
2.43.0<br>
<br>
</div>
</span></font></div>
</body>
</html>