git: 83b3e8e05ad9 - stable/13 - ccp, ccr: Simplify drivers to assume an AES-GCM IV length of 12.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 21 Oct 2021 17:07:06 UTC
The branch stable/13 has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=83b3e8e05ad9bab3f6cd79cc7842c37fa5f84951
commit 83b3e8e05ad9bab3f6cd79cc7842c37fa5f84951
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2021-10-06 21:08:46 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2021-10-21 15:51:25 +0000
ccp, ccr: Simplify drivers to assume an AES-GCM IV length of 12.
While here, use crypto_read_iv() in a few more places in ccr(4) that I
missed previously.
Sponsored by: Chelsio Communications
Differential Revision: https://reviews.freebsd.org/D32104
(cherry picked from commit cb128893b92994456107d6ca722fdf6e5028eacc)
---
sys/crypto/ccp/ccp_hardware.c | 5 ++---
sys/dev/cxgbe/crypto/t4_crypto.c | 36 ++++++------------------------------
2 files changed, 8 insertions(+), 33 deletions(-)
diff --git a/sys/crypto/ccp/ccp_hardware.c b/sys/crypto/ccp/ccp_hardware.c
index a2ca8e1cb71a..68f46a553f3c 100644
--- a/sys/crypto/ccp/ccp_hardware.c
+++ b/sys/crypto/ccp/ccp_hardware.c
@@ -1356,10 +1356,9 @@ ccp_collect_iv(struct cryptop *crp, const struct crypto_session_params *csp,
crypto_read_iv(crp, iv);
/*
- * If the input IV is 12 bytes, append an explicit counter of 1.
+ * Append an explicit counter of 1 for GCM.
*/
- if (csp->csp_cipher_alg == CRYPTO_AES_NIST_GCM_16 &&
- csp->csp_ivlen == 12)
+ if (csp->csp_cipher_alg == CRYPTO_AES_NIST_GCM_16)
*(uint32_t *)&iv[12] = htobe32(1);
if (csp->csp_cipher_alg == CRYPTO_AES_XTS &&
diff --git a/sys/dev/cxgbe/crypto/t4_crypto.c b/sys/dev/cxgbe/crypto/t4_crypto.c
index cdd14fcee2f9..a3c25eb7df47 100644
--- a/sys/dev/cxgbe/crypto/t4_crypto.c
+++ b/sys/dev/cxgbe/crypto/t4_crypto.c
@@ -1133,26 +1133,7 @@ ccr_gcm(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
else
op_type = CHCR_DECRYPT_OP;
- /*
- * The IV handling for GCM in OCF is a bit more complicated in
- * that IPSec provides a full 16-byte IV (including the
- * counter), whereas the /dev/crypto interface sometimes
- * provides a full 16-byte IV (if no IV is provided in the
- * ioctl) and sometimes a 12-byte IV (if the IV was explicit).
- *
- * When provided a 12-byte IV, assume the IV is really 16 bytes
- * with a counter in the last 4 bytes initialized to 1.
- *
- * While iv_len is checked below, the value is currently
- * always set to 12 when creating a GCM session in this driver
- * due to limitations in OCF (there is no way to know what the
- * IV length of a given request will be). This means that the
- * driver always assumes as 12-byte IV for now.
- */
- if (s->blkcipher.iv_len == 12)
- iv_len = AES_BLOCK_LEN;
- else
- iv_len = s->blkcipher.iv_len;
+ iv_len = AES_BLOCK_LEN;
/*
* GCM requests should always provide an explicit IV.
@@ -1290,9 +1271,8 @@ ccr_gcm(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
crwr = wrtod(wr);
memset(crwr, 0, wr_len);
- memcpy(iv, crp->crp_iv, s->blkcipher.iv_len);
- if (s->blkcipher.iv_len == 12)
- *(uint32_t *)&iv[12] = htobe32(1);
+ crypto_read_iv(crp, iv);
+ *(uint32_t *)&iv[12] = htobe32(1);
ccr_populate_wreq(sc, s, crwr, kctx_len, wr_len, imm_len, sgl_len, 0,
crp);
@@ -1445,15 +1425,11 @@ ccr_gcm_soft(struct ccr_session *s, struct cryptop *crp)
if (error)
goto out;
- /*
- * This assumes a 12-byte IV from the crp. See longer comment
- * above in ccr_gcm() for more details.
- */
if ((crp->crp_flags & CRYPTO_F_IV_SEPARATE) == 0) {
error = EINVAL;
goto out;
}
- memcpy(iv, crp->crp_iv, 12);
+ crypto_read_iv(crp, iv);
*(uint32_t *)&iv[12] = htobe32(1);
axf->Reinit(auth_ctx, iv, sizeof(iv));
@@ -1767,7 +1743,7 @@ ccr_ccm(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
*/
memset(iv, 0, iv_len);
iv[0] = (15 - AES_CCM_IV_LEN) - 1;
- memcpy(iv + 1, crp->crp_iv, AES_CCM_IV_LEN);
+ crypto_read_iv(crp, iv + 1);
ccr_populate_wreq(sc, s, crwr, kctx_len, wr_len, imm_len, sgl_len, 0,
crp);
@@ -1940,7 +1916,7 @@ ccr_ccm_soft(struct ccr_session *s, struct cryptop *crp)
error = EINVAL;
goto out;
}
- memcpy(iv, crp->crp_iv, AES_CCM_IV_LEN);
+ crypto_read_iv(crp, iv);
auth_ctx->aes_cbc_mac_ctx.authDataLength = crp->crp_aad_length;
auth_ctx->aes_cbc_mac_ctx.cryptDataLength = crp->crp_payload_length;