* [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings
@ 2022-03-22 15:14 Pablo de Lara
2022-03-22 15:14 ` [PATCH 21.11 v2 2/2] crypto/ipsec_mb: fix GMAC parameters setting Pablo de Lara
2022-03-23 16:14 ` [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings Kevin Traynor
0 siblings, 2 replies; 4+ messages in thread
From: Pablo de Lara @ 2022-03-22 15:14 UTC (permalink / raw)
To: ktraynor; +Cc: stable, Pablo de Lara
[ upstream commit a501609ea6466ed8526c0dfadedee332a4d4a451 ]
KASUMI, SNOW3G and ZUC require lengths and offsets to
be set in bits or bytes depending on the algorithm.
There were some algorithms that were mixing these two,
so this commit is fixing this issue.
Fixes: ae8e085c608d ("crypto/aesni_mb: support KASUMI F8/F9")
Fixes: 6c42e0cf4d12 ("crypto/aesni_mb: support SNOW3G-UEA2/UIA2")
Fixes: fd8df85487c4 ("crypto/aesni_mb: support ZUC-EEA3/EIA3")
Fixes: 8c835018de84 ("crypto/ipsec_mb: support ZUC-256 for aesni_mb")
Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
drivers/crypto/ipsec_mb/pmd_aesni_mb.c | 120 +++++++++++++++++--------
1 file changed, 85 insertions(+), 35 deletions(-)
diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
index a308d42ffa..519ff023ff 100644
--- a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
+++ b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
@@ -918,7 +918,9 @@ aesni_mb_set_docsis_sec_session_parameters(
static inline uint64_t
auth_start_offset(struct rte_crypto_op *op, struct aesni_mb_session *session,
- uint32_t oop)
+ uint32_t oop, const uint32_t auth_offset,
+ const uint32_t cipher_offset, const uint32_t auth_length,
+ const uint32_t cipher_length)
{
struct rte_mbuf *m_src, *m_dst;
uint8_t *p_src, *p_dst;
@@ -927,7 +929,7 @@ auth_start_offset(struct rte_crypto_op *op, struct aesni_mb_session *session,
/* Only cipher then hash needs special calculation. */
if (!oop || session->chain_order != IMB_ORDER_CIPHER_HASH)
- return op->sym->auth.data.offset;
+ return auth_offset;
m_src = op->sym->m_src;
m_dst = op->sym->m_dst;
@@ -935,24 +937,24 @@ auth_start_offset(struct rte_crypto_op *op, struct aesni_mb_session *session,
p_src = rte_pktmbuf_mtod(m_src, uint8_t *);
p_dst = rte_pktmbuf_mtod(m_dst, uint8_t *);
u_src = (uintptr_t)p_src;
- u_dst = (uintptr_t)p_dst + op->sym->auth.data.offset;
+ u_dst = (uintptr_t)p_dst + auth_offset;
/**
* Copy the content between cipher offset and auth offset for generating
* correct digest.
*/
- if (op->sym->cipher.data.offset > op->sym->auth.data.offset)
- memcpy(p_dst + op->sym->auth.data.offset,
- p_src + op->sym->auth.data.offset,
- op->sym->cipher.data.offset -
- op->sym->auth.data.offset);
+ if (cipher_offset > auth_offset)
+ memcpy(p_dst + auth_offset,
+ p_src + auth_offset,
+ cipher_offset -
+ auth_offset);
/**
* Copy the content between (cipher offset + length) and (auth offset +
* length) for generating correct digest
*/
- cipher_end = op->sym->cipher.data.offset + op->sym->cipher.data.length;
- auth_end = op->sym->auth.data.offset + op->sym->auth.data.length;
+ cipher_end = cipher_offset + cipher_length;
+ auth_end = auth_offset + auth_length;
if (cipher_end < auth_end)
memcpy(p_dst + cipher_end, p_src + cipher_end,
auth_end - cipher_end);
@@ -1099,6 +1101,10 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
struct aesni_mb_qp_data *qp_data = ipsec_mb_get_qp_private_data(qp);
struct aesni_mb_session *session;
uint32_t m_offset, oop;
+ uint32_t auth_off_in_bytes;
+ uint32_t ciph_off_in_bytes;
+ uint32_t auth_len_in_bytes;
+ uint32_t ciph_len_in_bytes;
session = ipsec_mb_get_session_private(qp, op);
if (session == NULL) {
@@ -1207,6 +1213,7 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
if (job->cipher_mode == IMB_CIPHER_ZUC_EEA3) {
job->enc_keys = session->cipher.zuc_cipher_key;
job->dec_keys = session->cipher.zuc_cipher_key;
+ m_offset >>= 3;
} else if (job->cipher_mode == IMB_CIPHER_SNOW3G_UEA2_BITLEN) {
job->enc_keys = &session->cipher.pKeySched_snow3g_cipher;
m_offset = 0;
@@ -1264,9 +1271,6 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
switch (job->hash_alg) {
case IMB_AUTH_AES_CCM:
- job->cipher_start_src_offset_in_bytes =
- op->sym->aead.data.offset;
- job->msg_len_to_cipher_in_bytes = op->sym->aead.data.length;
job->hash_start_src_offset_in_bytes = op->sym->aead.data.offset;
job->msg_len_to_hash_in_bytes = op->sym->aead.data.length;
@@ -1276,19 +1280,11 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
case IMB_AUTH_AES_GMAC:
if (session->cipher.mode == IMB_CIPHER_GCM) {
- job->cipher_start_src_offset_in_bytes =
- op->sym->aead.data.offset;
job->hash_start_src_offset_in_bytes =
op->sym->aead.data.offset;
- job->msg_len_to_cipher_in_bytes =
- op->sym->aead.data.length;
job->msg_len_to_hash_in_bytes =
op->sym->aead.data.length;
} else {
- job->cipher_start_src_offset_in_bytes =
- op->sym->auth.data.offset;
- job->hash_start_src_offset_in_bytes =
- op->sym->auth.data.offset;
job->msg_len_to_cipher_in_bytes = 0;
job->msg_len_to_hash_in_bytes = 0;
}
@@ -1298,36 +1294,90 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
break;
case IMB_AUTH_CHACHA20_POLY1305:
- job->cipher_start_src_offset_in_bytes =
- op->sym->aead.data.offset;
job->hash_start_src_offset_in_bytes =
op->sym->aead.data.offset;
- job->msg_len_to_cipher_in_bytes =
- op->sym->aead.data.length;
job->msg_len_to_hash_in_bytes =
op->sym->aead.data.length;
job->iv = rte_crypto_op_ctod_offset(op, uint8_t *,
session->iv.offset);
break;
- default:
- /* For SNOW3G, length and offsets are already in bits */
- job->cipher_start_src_offset_in_bytes =
- op->sym->cipher.data.offset;
- job->msg_len_to_cipher_in_bytes = op->sym->cipher.data.length;
+ /* ZUC and SNOW3G require length in bits and offset in bytes */
+ case IMB_AUTH_ZUC_EIA3_BITLEN:
+ case IMB_AUTH_ZUC256_EIA3_BITLEN:
+ case IMB_AUTH_SNOW3G_UIA2_BITLEN:
+ auth_off_in_bytes = op->sym->auth.data.offset >> 3;
+ ciph_off_in_bytes = op->sym->cipher.data.offset >> 3;
+ auth_len_in_bytes = op->sym->auth.data.length >> 3;
+ ciph_len_in_bytes = op->sym->cipher.data.length >> 3;
+
+ job->hash_start_src_offset_in_bytes = auth_start_offset(op,
+ session, oop, auth_off_in_bytes,
+ ciph_off_in_bytes, auth_len_in_bytes,
+ ciph_len_in_bytes);
+ job->msg_len_to_hash_in_bits = op->sym->auth.data.length;
+
+ job->iv = rte_crypto_op_ctod_offset(op, uint8_t *,
+ session->iv.offset);
+ break;
+
+ /* KASUMI requires lengths and offset in bytes */
+ case IMB_AUTH_KASUMI_UIA1:
+ auth_off_in_bytes = op->sym->auth.data.offset >> 3;
+ ciph_off_in_bytes = op->sym->cipher.data.offset >> 3;
+ auth_len_in_bytes = op->sym->auth.data.length >> 3;
+ ciph_len_in_bytes = op->sym->cipher.data.length >> 3;
job->hash_start_src_offset_in_bytes = auth_start_offset(op,
- session, oop);
+ session, oop, auth_off_in_bytes,
+ ciph_off_in_bytes, auth_len_in_bytes,
+ ciph_len_in_bytes);
+ job->msg_len_to_hash_in_bytes = auth_len_in_bytes;
+
+ job->iv = rte_crypto_op_ctod_offset(op, uint8_t *,
+ session->iv.offset);
+ break;
+
+ default:
+ job->hash_start_src_offset_in_bytes = auth_start_offset(op,
+ session, oop, op->sym->auth.data.offset,
+ op->sym->cipher.data.offset,
+ op->sym->auth.data.length,
+ op->sym->cipher.data.length);
job->msg_len_to_hash_in_bytes = op->sym->auth.data.length;
job->iv = rte_crypto_op_ctod_offset(op, uint8_t *,
session->iv.offset);
}
- if (job->cipher_mode == IMB_CIPHER_ZUC_EEA3)
- job->msg_len_to_cipher_in_bytes >>= 3;
- else if (job->hash_alg == IMB_AUTH_KASUMI_UIA1)
- job->msg_len_to_hash_in_bytes >>= 3;
+ switch (job->cipher_mode) {
+ /* ZUC requires length and offset in bytes */
+ case IMB_CIPHER_ZUC_EEA3:
+ job->cipher_start_src_offset_in_bytes =
+ op->sym->cipher.data.offset >> 3;
+ job->msg_len_to_cipher_in_bytes =
+ op->sym->cipher.data.length >> 3;
+ break;
+ /* ZUC and SNOW3G require length and offset in bits */
+ case IMB_CIPHER_SNOW3G_UEA2_BITLEN:
+ case IMB_CIPHER_KASUMI_UEA1_BITLEN:
+ job->cipher_start_src_offset_in_bits =
+ op->sym->cipher.data.offset;
+ job->msg_len_to_cipher_in_bits =
+ op->sym->cipher.data.length;
+ break;
+ case IMB_CIPHER_CCM:
+ case IMB_CIPHER_GCM:
+ case IMB_CIPHER_CHACHA20_POLY1305:
+ job->cipher_start_src_offset_in_bytes =
+ op->sym->aead.data.offset;
+ job->msg_len_to_cipher_in_bytes = op->sym->aead.data.length;
+ break;
+ default:
+ job->cipher_start_src_offset_in_bytes =
+ op->sym->cipher.data.offset;
+ job->msg_len_to_cipher_in_bytes = op->sym->cipher.data.length;
+ }
/* Set user data to be crypto operation data struct */
job->user_data = op;
--
2.25.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 21.11 v2 2/2] crypto/ipsec_mb: fix GMAC parameters setting
2022-03-22 15:14 [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings Pablo de Lara
@ 2022-03-22 15:14 ` Pablo de Lara
2022-03-23 16:14 ` [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings Kevin Traynor
1 sibling, 0 replies; 4+ messages in thread
From: Pablo de Lara @ 2022-03-22 15:14 UTC (permalink / raw)
To: ktraynor; +Cc: stable, Pablo de Lara, Fan Zhang, Radu Nicolau
[ upstream commit 837269c2e5c5a8813adfcf59f23b80569048ddeb ]
AES-GMAC requires plaintext length to be 0 when using AES-GCM,
so only AAD data is used.
Fixes: a501609ea646 ("crypto/ipsec_mb: fix length and offset settings")
Cc: pablo.de.lara.guarch@intel.com
Cc: stable@dpdk.org
Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
Acked-by: Fan Zhang <roy.fan.zhang@intel.com>
Acked-by: Radu Nicolau <radu.nicolau@intel.com>
Tested-by: Radu Nicolau <radu.nicolau@intel.com>
---
drivers/crypto/ipsec_mb/pmd_aesni_mb.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
index 519ff023ff..536a586e98 100644
--- a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
+++ b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
@@ -1284,9 +1284,9 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
op->sym->aead.data.offset;
job->msg_len_to_hash_in_bytes =
op->sym->aead.data.length;
- } else {
- job->msg_len_to_cipher_in_bytes = 0;
+ } else { /* AES-GMAC only, only AAD used */
job->msg_len_to_hash_in_bytes = 0;
+ job->hash_start_src_offset_in_bytes = 0;
}
job->iv = rte_crypto_op_ctod_offset(op, uint8_t *,
@@ -1366,8 +1366,18 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
job->msg_len_to_cipher_in_bits =
op->sym->cipher.data.length;
break;
- case IMB_CIPHER_CCM:
case IMB_CIPHER_GCM:
+ if (session->cipher.mode == IMB_CIPHER_NULL) {
+ /* AES-GMAC only (only AAD used) */
+ job->msg_len_to_cipher_in_bytes = 0;
+ job->cipher_start_src_offset_in_bytes = 0;
+ } else {
+ job->cipher_start_src_offset_in_bytes =
+ op->sym->aead.data.offset;
+ job->msg_len_to_cipher_in_bytes = op->sym->aead.data.length;
+ }
+ break;
+ case IMB_CIPHER_CCM:
case IMB_CIPHER_CHACHA20_POLY1305:
job->cipher_start_src_offset_in_bytes =
op->sym->aead.data.offset;
--
2.25.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings
2022-03-22 15:14 [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings Pablo de Lara
2022-03-22 15:14 ` [PATCH 21.11 v2 2/2] crypto/ipsec_mb: fix GMAC parameters setting Pablo de Lara
@ 2022-03-23 16:14 ` Kevin Traynor
2022-03-25 15:07 ` Kevin Traynor
1 sibling, 1 reply; 4+ messages in thread
From: Kevin Traynor @ 2022-03-23 16:14 UTC (permalink / raw)
To: Pablo de Lara; +Cc: stable
On 22/03/2022 15:14, Pablo de Lara wrote:
> [ upstream commit a501609ea6466ed8526c0dfadedee332a4d4a451 ]
>
> KASUMI, SNOW3G and ZUC require lengths and offsets to
> be set in bits or bytes depending on the algorithm.
> There were some algorithms that were mixing these two,
> so this commit is fixing this issue.
>
> Fixes: ae8e085c608d ("crypto/aesni_mb: support KASUMI F8/F9")
> Fixes: 6c42e0cf4d12 ("crypto/aesni_mb: support SNOW3G-UEA2/UIA2")
> Fixes: fd8df85487c4 ("crypto/aesni_mb: support ZUC-EEA3/EIA3")
> Fixes: 8c835018de84 ("crypto/ipsec_mb: support ZUC-256 for aesni_mb")
>
> Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
> ---
Thanks Pablo. Just to confirm, for 21.11 branch I will:
- revert previous backport of this 1/2 patch
- apply this series
Let me know if that is correct.
Kevin.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings
2022-03-23 16:14 ` [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings Kevin Traynor
@ 2022-03-25 15:07 ` Kevin Traynor
0 siblings, 0 replies; 4+ messages in thread
From: Kevin Traynor @ 2022-03-25 15:07 UTC (permalink / raw)
To: Pablo de Lara; +Cc: stable
On 23/03/2022 16:14, Kevin Traynor wrote:
> On 22/03/2022 15:14, Pablo de Lara wrote:
>> [ upstream commit a501609ea6466ed8526c0dfadedee332a4d4a451 ]
>>
>> KASUMI, SNOW3G and ZUC require lengths and offsets to
>> be set in bits or bytes depending on the algorithm.
>> There were some algorithms that were mixing these two,
>> so this commit is fixing this issue.
>>
>> Fixes: ae8e085c608d ("crypto/aesni_mb: support KASUMI F8/F9")
>> Fixes: 6c42e0cf4d12 ("crypto/aesni_mb: support SNOW3G-UEA2/UIA2")
>> Fixes: fd8df85487c4 ("crypto/aesni_mb: support ZUC-EEA3/EIA3")
>> Fixes: 8c835018de84 ("crypto/ipsec_mb: support ZUC-256 for aesni_mb")
>>
>> Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
>> ---
>
> Thanks Pablo. Just to confirm, for 21.11 branch I will:
>
> - revert previous backport of this 1/2 patch
> - apply this series
>
This is now done and pushed to dpdk.org, thanks.
> Let me know if that is correct.
>
> Kevin.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-03-25 15:07 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-22 15:14 [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings Pablo de Lara
2022-03-22 15:14 ` [PATCH 21.11 v2 2/2] crypto/ipsec_mb: fix GMAC parameters setting Pablo de Lara
2022-03-23 16:14 ` [PATCH 21.11 v2 1/2] crypto/ipsec_mb: fix length and offset settings Kevin Traynor
2022-03-25 15:07 ` Kevin Traynor
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).