diff options
author | John Baldwin <jhb@FreeBSD.org> | 2021-10-06 21:08:47 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2021-10-06 21:08:47 +0000 |
commit | d718c2d3c805001db0b0ae0cc0c8a811b8a90a95 (patch) | |
tree | eb9442872ac3c03eeaf8e948f4fe1ba88db2338e | |
parent | 8e6af6adfc2cc3d0ea89c20eaa5914e453c48b49 (diff) | |
download | src-d718c2d3c805001db0b0ae0cc0c8a811b8a90a95.tar.gz src-d718c2d3c805001db0b0ae0cc0c8a811b8a90a95.zip |
aesni: Handle requests with an empty payload.
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D32113
-rw-r--r-- | sys/crypto/aesni/aesni.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/sys/crypto/aesni/aesni.c b/sys/crypto/aesni/aesni.c index 67dcef123429..7d4dbd2c1604 100644 --- a/sys/crypto/aesni/aesni.c +++ b/sys/crypto/aesni/aesni.c @@ -700,28 +700,36 @@ aesni_cipher_crypt(struct aesni_session *ses, struct cryptop *crp, int error; bool encflag, allocated, authallocated, outallocated, outcopy; - buf = aesni_cipher_alloc(crp, crp->crp_payload_start, - crp->crp_payload_length, &allocated); - if (buf == NULL) - return (ENOMEM); + if (crp->crp_payload_length == 0) { + buf = NULL; + allocated = false; + } else { + buf = aesni_cipher_alloc(crp, crp->crp_payload_start, + crp->crp_payload_length, &allocated); + if (buf == NULL) + return (ENOMEM); + } outallocated = false; authallocated = false; authbuf = NULL; if (csp->csp_cipher_alg == CRYPTO_AES_NIST_GCM_16 || csp->csp_cipher_alg == CRYPTO_AES_CCM_16) { - if (crp->crp_aad != NULL) + if (crp->crp_aad_length == 0) { + authbuf = NULL; + } else if (crp->crp_aad != NULL) { authbuf = crp->crp_aad; - else + } else { authbuf = aesni_cipher_alloc(crp, crp->crp_aad_start, crp->crp_aad_length, &authallocated); - if (authbuf == NULL) { - error = ENOMEM; - goto out; + if (authbuf == NULL) { + error = ENOMEM; + goto out; + } } } - if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) { + if (CRYPTO_HAS_OUTPUT_BUFFER(crp) && crp->crp_payload_length > 0) { outbuf = crypto_buffer_contiguous_subsegment(&crp->crp_obuf, crp->crp_payload_output_start, crp->crp_payload_length); if (outbuf == NULL) { |