* [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp.
[not found] <20250926160209.56496-1-kai.ji@intel.com>
@ 2025-09-29 14:50 ` Kai Ji
2025-09-29 14:50 ` [dpdk-dev v4 2/2] crypto/ipsec-mb: use constant-time memory comparison Kai Ji
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Kai Ji @ 2025-09-29 14:50 UTC (permalink / raw)
To: dev
Cc: gakhil, konstantin.ananyev, bruce.richardson, thomas, stephen,
mb, Kai Ji, stable
Bugzilla ID: 1773
Cc: stable@dpdk.org
[0] https://bugs.dpdk.org/show_bug.cgi?id=1773
Signed-off-by: Kai Ji <kai.ji@intel.com>
---
lib/eal/include/rte_memory.h | 68 ++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/lib/eal/include/rte_memory.h b/lib/eal/include/rte_memory.h
index dcc0e69cfe..bbdef8e939 100644
--- a/lib/eal/include/rte_memory.h
+++ b/lib/eal/include/rte_memory.h
@@ -746,6 +746,74 @@ __rte_experimental
void
rte_memzero_explicit(void *dst, size_t sz);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Constant-time memory inequality comparison.
+ *
+ * This function compares two memory regions in constant time, making it
+ * resistant to timing side-channel attacks. The execution time depends only
+ * on the length parameter, not on the actual data values being compared.
+ *
+ * This is particularly important for cryptographic operations where timing
+ * differences could leak information about secret keys, passwords, or other
+ * sensitive data.
+ *
+ * @param a
+ * Pointer to the first memory region to compare
+ * @param b
+ * Pointer to the second memory region to compare
+ * @param n
+ * Number of bytes to compare
+ * @return
+ * false if the memory regions are identical, true if they differ
+ */
+__rte_experimental
+static inline bool
+rte_memneq_consttime(const void *a, const void *b, size_t n)
+{
+ const volatile uint8_t *pa = (const volatile uint8_t *)a;
+ const volatile uint8_t *pb = (const volatile uint8_t *)b;
+ uint8_t result = 0;
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ result |= pa[i] ^ pb[i];
+
+ return result != 0;
+}
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Constant-time memory equality comparison.
+ *
+ * This function compares two memory regions in constant time, making it
+ * resistant to timing side-channel attacks. The execution time depends only
+ * on the length parameter, not on the actual data values being compared.
+ *
+ * This is particularly important for cryptographic operations where timing
+ * differences could leak information about secret keys, passwords, or other
+ * sensitive data.
+ *
+ * @param a
+ * Pointer to the first memory region to compare
+ * @param b
+ * Pointer to the second memory region to compare
+ * @param n
+ * Number of bytes to compare
+ * @return
+ * true if the memory regions are identical, false if they differ
+ */
+__rte_experimental
+static inline bool
+rte_memeq_consttime(const void *a, const void *b, size_t n)
+{
+ return !rte_memneq_consttime(a, b, n);
+}
+
#ifdef __cplusplus
}
#endif
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev v4 2/2] crypto/ipsec-mb: use constant-time memory comparison
2025-09-29 14:50 ` [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp Kai Ji
@ 2025-09-29 14:50 ` Kai Ji
2025-09-29 23:54 ` Stephen Hemminger
2025-09-29 16:32 ` [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp Stephen Hemminger
2025-09-29 17:48 ` Morten Brørup
2 siblings, 1 reply; 7+ messages in thread
From: Kai Ji @ 2025-09-29 14:50 UTC (permalink / raw)
To: dev
Cc: gakhil, konstantin.ananyev, bruce.richardson, thomas, stephen,
mb, Kai Ji, stable
Replace memcmp() with rte_memneq_consttime() in cryptographic
authentication verification operations across iipsec-mb drivers.
Note: OpenSSL crypto driver already uses CRYPTO_memcmp() which
provides equivalent timing attack resistance and is left unchanged.
Note: scheduler driver memcmp stays unchanged as its not secret data
comparison and actually faster with no timing attack risk.
Bugzilla ID: 1773
Cc: stable@dpdk.org
[0] https://bugs.dpdk.org/show_bug.cgi?id=1773
Signed-off-by: Kai Ji <kai.ji@intel.com>
---
drivers/crypto/ipsec_mb/pmd_aesni_gcm.c | 5 ++---
drivers/crypto/ipsec_mb/pmd_aesni_mb.c | 6 +++---
drivers/crypto/ipsec_mb/pmd_snow3g.c | 4 ++--
drivers/crypto/ipsec_mb/pmd_zuc.c | 4 ++--
4 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_gcm.c b/drivers/crypto/ipsec_mb/pmd_aesni_gcm.c
index 8d40bd9169..a3d1d19025 100644
--- a/drivers/crypto/ipsec_mb/pmd_aesni_gcm.c
+++ b/drivers/crypto/ipsec_mb/pmd_aesni_gcm.c
@@ -206,7 +206,7 @@ post_process_gcm_crypto_op(struct ipsec_mb_qp *qp,
tag, session->req_digest_length);
#endif
- if (memcmp(tag, digest, session->req_digest_length) != 0)
+ if (rte_memneq_consttime(tag, digest, session->req_digest_length))
op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
} else {
if (session->req_digest_length != session->gen_digest_length) {
@@ -558,8 +558,7 @@ aesni_gcm_sgl_op_finalize_decryption(const struct aesni_gcm_session *s,
ops.finalize_dec(&s->gdata_key, gdata_ctx, tmpdigest,
s->gen_digest_length);
- return memcmp(digest, tmpdigest, s->req_digest_length) == 0 ? 0
- : EBADMSG;
+ return rte_memneq_consttime(digest, tmpdigest, s->req_digest_length) ? EBADMSG : 0;
}
static inline void
diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
index a6c3f09b6f..f0f67faa46 100644
--- a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
+++ b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
@@ -1902,7 +1902,7 @@ verify_docsis_sec_crc(IMB_JOB *job, uint8_t *status)
crc = job->dst + crc_offset;
/* Verify CRC (at the end of the message) */
- if (memcmp(job->auth_tag_output, crc, RTE_ETHER_CRC_LEN) != 0)
+ if (rte_memneq_consttime(job->auth_tag_output, crc, RTE_ETHER_CRC_LEN))
*status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
}
@@ -1910,7 +1910,7 @@ static inline void
verify_digest(IMB_JOB *job, void *digest, uint16_t len, uint8_t *status)
{
/* Verify digest if required */
- if (memcmp(job->auth_tag_output, digest, len) != 0)
+ if (rte_memneq_consttime(job->auth_tag_output, digest, len))
*status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
}
@@ -2305,7 +2305,7 @@ verify_sync_dgst(struct rte_crypto_sym_vec *vec,
for (i = 0, k = 0; i != vec->num; i++) {
if (vec->status[i] == 0) {
- if (memcmp(vec->digest[i].va, dgst[i], len) != 0)
+ if (rte_memneq_consttime(vec->digest[i].va, dgst[i], len))
vec->status[i] = EBADMSG;
else
k++;
diff --git a/drivers/crypto/ipsec_mb/pmd_snow3g.c b/drivers/crypto/ipsec_mb/pmd_snow3g.c
index 65f0e5c568..5d99ea568f 100644
--- a/drivers/crypto/ipsec_mb/pmd_snow3g.c
+++ b/drivers/crypto/ipsec_mb/pmd_snow3g.c
@@ -269,8 +269,8 @@ process_snow3g_hash_op(struct ipsec_mb_qp *qp, struct rte_crypto_op **ops,
&session->pKeySched_hash,
iv, src, length_in_bits, dst);
/* Verify digest. */
- if (memcmp(dst, ops[i]->sym->auth.digest.data,
- SNOW3G_DIGEST_LENGTH) != 0)
+ if (rte_memneq_consttime(dst, ops[i]->sym->auth.digest.data,
+ SNOW3G_DIGEST_LENGTH))
ops[i]->status =
RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
} else {
diff --git a/drivers/crypto/ipsec_mb/pmd_zuc.c b/drivers/crypto/ipsec_mb/pmd_zuc.c
index 44781be1d1..466f6594e5 100644
--- a/drivers/crypto/ipsec_mb/pmd_zuc.c
+++ b/drivers/crypto/ipsec_mb/pmd_zuc.c
@@ -185,8 +185,8 @@ process_zuc_hash_op(struct ipsec_mb_qp *qp, struct rte_crypto_op **ops,
*/
for (i = 0; i < processed_ops; i++)
if (sessions[i]->auth_op == RTE_CRYPTO_AUTH_OP_VERIFY)
- if (memcmp(dst[i], ops[i]->sym->auth.digest.data,
- ZUC_DIGEST_LENGTH) != 0)
+ if (rte_memneq_consttime(dst[i], ops[i]->sym->auth.digest.data,
+ ZUC_DIGEST_LENGTH))
ops[i]->status =
RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp.
2025-09-29 14:50 ` [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp Kai Ji
2025-09-29 14:50 ` [dpdk-dev v4 2/2] crypto/ipsec-mb: use constant-time memory comparison Kai Ji
@ 2025-09-29 16:32 ` Stephen Hemminger
2025-09-29 17:48 ` Morten Brørup
2 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2025-09-29 16:32 UTC (permalink / raw)
To: Kai Ji
Cc: dev, gakhil, konstantin.ananyev, bruce.richardson, thomas, mb, stable
On Mon, 29 Sep 2025 14:50:48 +0000
Kai Ji <kai.ji@intel.com> wrote:
> diff --git a/lib/eal/include/rte_memory.h b/lib/eal/include/rte_memory.h
> index dcc0e69cfe..bbdef8e939 100644
> --- a/lib/eal/include/rte_memory.h
> +++ b/lib/eal/include/rte_memory.h
> @@ -746,6 +746,74 @@ __rte_experimental
> void
> rte_memzero_explicit(void *dst, size_t sz);
>
> +/**
> + * @warning
> + * @b EXPERIMENTAL: this API may change without prior notice.
> + *
> + * Constant-time memory inequality comparison.
> + *
> + * This function compares two memory regions in constant time, making it
> + * resistant to timing side-channel attacks. The execution time depends only
> + * on the length parameter, not on the actual data values being compared.
> + *
> + * This is particularly important for cryptographic operations where timing
> + * differences could leak information about secret keys, passwords, or other
> + * sensitive data.
> + *
> + * @param a
> + * Pointer to the first memory region to compare
> + * @param b
> + * Pointer to the second memory region to compare
> + * @param n
> + * Number of bytes to compare
> + * @return
> + * false if the memory regions are identical, true if they differ
> + */
> +__rte_experimental
> +static inline bool
> +rte_memneq_consttime(const void *a, const void *b, size_t n)
NAK
Please change to match BSD equivalent function (ie not not equal)
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp.
2025-09-29 14:50 ` [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp Kai Ji
2025-09-29 14:50 ` [dpdk-dev v4 2/2] crypto/ipsec-mb: use constant-time memory comparison Kai Ji
2025-09-29 16:32 ` [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp Stephen Hemminger
@ 2025-09-29 17:48 ` Morten Brørup
2025-09-29 22:48 ` Stephen Hemminger
2 siblings, 1 reply; 7+ messages in thread
From: Morten Brørup @ 2025-09-29 17:48 UTC (permalink / raw)
To: Kai Ji, dev, stephen
Cc: gakhil, konstantin.ananyev, bruce.richardson, thomas, stable
> From: Kai Ji [mailto:kai.ji@intel.com]
> Sent: Monday, 29 September 2025 16.51
>
> Bugzilla ID: 1773
> Cc: stable@dpdk.org
>
> [0] https://bugs.dpdk.org/show_bug.cgi?id=1773
>
> Signed-off-by: Kai Ji <kai.ji@intel.com>
> ---
Acked-by: Morten Brørup <mb@smartsharesystems.com>
@Stephen: V4 also includes equal, which you was asking for.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp.
2025-09-29 17:48 ` Morten Brørup
@ 2025-09-29 22:48 ` Stephen Hemminger
2025-09-30 6:16 ` Morten Brørup
0 siblings, 1 reply; 7+ messages in thread
From: Stephen Hemminger @ 2025-09-29 22:48 UTC (permalink / raw)
To: Morten Brørup
Cc: Kai Ji, dev, gakhil, konstantin.ananyev, bruce.richardson,
thomas, stable
On Mon, 29 Sep 2025 19:48:19 +0200
Morten Brørup <mb@smartsharesystems.com> wrote:
> > From: Kai Ji [mailto:kai.ji@intel.com]
> > Sent: Monday, 29 September 2025 16.51
> >
> > Bugzilla ID: 1773
> > Cc: stable@dpdk.org
> >
> > [0] https://bugs.dpdk.org/show_bug.cgi?id=1773
> >
> > Signed-off-by: Kai Ji <kai.ji@intel.com>
> > ---
>
> Acked-by: Morten Brørup <mb@smartsharesystems.com>
>
> @Stephen: V4 also includes equal, which you was asking for.
>
The point is that we should only have the eq variant.
Having the not equal is unnecessary addition.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev v4 2/2] crypto/ipsec-mb: use constant-time memory comparison
2025-09-29 14:50 ` [dpdk-dev v4 2/2] crypto/ipsec-mb: use constant-time memory comparison Kai Ji
@ 2025-09-29 23:54 ` Stephen Hemminger
0 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2025-09-29 23:54 UTC (permalink / raw)
To: Kai Ji
Cc: dev, gakhil, konstantin.ananyev, bruce.richardson, thomas, mb, stable
On Mon, 29 Sep 2025 14:50:49 +0000
Kai Ji <kai.ji@intel.com> wrote:
> Replace memcmp() with rte_memneq_consttime() in cryptographic
> authentication verification operations across iipsec-mb drivers.
>
> Note: OpenSSL crypto driver already uses CRYPTO_memcmp() which
> provides equivalent timing attack resistance and is left unchanged.
>
> Note: scheduler driver memcmp stays unchanged as its not secret data
> comparison and actually faster with no timing attack risk.
>
> Bugzilla ID: 1773
> Cc: stable@dpdk.org
>
> [0] https://bugs.dpdk.org/show_bug.cgi?id=1773
>
> Signed-off-by: Kai Ji <kai.ji@intel.com>
> ---
Thanks for doing this.
A couple other notes from my searching around.
The function memeq_consttime is in NetBSD (not FreeBSD) sorry if I got confused.
OpenBSD has timingsafe_memcmp() and timingsafe_bcmp().
Also this on LWN:
> You would use a constant-time version of memcmp. OpenBSD added timingsafe_bcmp in 2009, and then timingsafe_memcmp a few years later. (https://man.openbsd.org/timingsafe_memcmp.3) NetBSD has consttime_memequal. (https://man.netbsd.org/consttime_memequal.3) Apple and FreeBSD adopted the OpenBSD routines.
> I don't think either glibc or musl libc have adopted a similar interface. So on Linux or for portable software you'd probably want to use CRYPTO_memcmp from OpenSSL.
>
> You should of course be hashing the passwords with salts, and only comparing those hashes. In which case using a constant-time compare isn't that important as the attacker can't work backward from the short-circuiting compare to decipher the plaintext input. The hashing itself should be constant-time, assuming modern digests like SHA-256 or SHA-3, though it's possible the *length* of the input password would leak. But there are a gazillion ways for the length to leak, and when it comes to password-based authentication schemes that's the least of your worries.
>
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp.
2025-09-29 22:48 ` Stephen Hemminger
@ 2025-09-30 6:16 ` Morten Brørup
0 siblings, 0 replies; 7+ messages in thread
From: Morten Brørup @ 2025-09-30 6:16 UTC (permalink / raw)
To: Stephen Hemminger, Kai Ji
Cc: dev, gakhil, konstantin.ananyev, bruce.richardson, thomas, stable
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Tuesday, 30 September 2025 00.49
>
> On Mon, 29 Sep 2025 19:48:19 +0200
> Morten Brørup <mb@smartsharesystems.com> wrote:
>
> > > From: Kai Ji [mailto:kai.ji@intel.com]
> > > Sent: Monday, 29 September 2025 16.51
> > >
> > > Bugzilla ID: 1773
> > > Cc: stable@dpdk.org
> > >
> > > [0] https://bugs.dpdk.org/show_bug.cgi?id=1773
> > >
> > > Signed-off-by: Kai Ji <kai.ji@intel.com>
> > > ---
> >
> > Acked-by: Morten Brørup <mb@smartsharesystems.com>
> >
> > @Stephen: V4 also includes equal, which you was asking for.
> >
>
> The point is that we should only have the eq variant.
> Having the not equal is unnecessary addition.
Yes, I would tend to agree with Stephen on this.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-09-30 6:16 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20250926160209.56496-1-kai.ji@intel.com>
2025-09-29 14:50 ` [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp Kai Ji
2025-09-29 14:50 ` [dpdk-dev v4 2/2] crypto/ipsec-mb: use constant-time memory comparison Kai Ji
2025-09-29 23:54 ` Stephen Hemminger
2025-09-29 16:32 ` [dpdk-dev v4 1/2] eal: Add mem equal and non-equal to prevent timing attacks memcmp Stephen Hemminger
2025-09-29 17:48 ` Morten Brørup
2025-09-29 22:48 ` Stephen Hemminger
2025-09-30 6:16 ` Morten Brørup
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).