aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2021-10-06 21:08:47 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2021-10-06 21:08:47 +0000
commitd718c2d3c805001db0b0ae0cc0c8a811b8a90a95 (patch)
treeeb9442872ac3c03eeaf8e948f4fe1ba88db2338e
parent8e6af6adfc2cc3d0ea89c20eaa5914e453c48b49 (diff)
downloadsrc-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.c28
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) {