Author: jhb
Date: Mon Jun 22 23:22:13 2020
New Revision: 362518
URL: https://svnweb.freebsd.org/changeset/base/362518

Log:
  Add support for requests with separate AAD to aesni(4).
  
  Sponsored by: Chelsio Communications
  Differential Revision:        https://reviews.freebsd.org/D25289

Modified:
  head/sys/crypto/aesni/aesni.c

Modified: head/sys/crypto/aesni/aesni.c
==============================================================================
--- head/sys/crypto/aesni/aesni.c       Mon Jun 22 23:20:43 2020        
(r362517)
+++ head/sys/crypto/aesni/aesni.c       Mon Jun 22 23:22:13 2020        
(r362518)
@@ -254,7 +254,8 @@ aesni_probesession(device_t dev, const struct crypto_s
        struct aesni_softc *sc;
 
        sc = device_get_softc(dev);
-       if ((csp->csp_flags & ~(CSP_F_SEPARATE_OUTPUT)) != 0)
+       if ((csp->csp_flags & ~(CSP_F_SEPARATE_OUTPUT | CSP_F_SEPARATE_AAD)) !=
+           0)
                return (EINVAL);
        switch (csp->csp_mode) {
        case CSP_MODE_DIGEST:
@@ -697,8 +698,11 @@ aesni_cipher_crypt(struct aesni_session *ses, struct c
        authbuf = NULL;
        if (csp->csp_cipher_alg == CRYPTO_AES_NIST_GCM_16 ||
            csp->csp_cipher_alg == CRYPTO_AES_CCM_16) {
-               authbuf = aesni_cipher_alloc(crp, crp->crp_aad_start,
-                   crp->crp_aad_length, &authallocated);
+               if (crp->crp_aad != NULL)
+                       authbuf = crp->crp_aad;
+               else
+                       authbuf = aesni_cipher_alloc(crp, crp->crp_aad_start,
+                           crp->crp_aad_length, &authallocated);
                if (authbuf == NULL) {
                        error = ENOMEM;
                        goto out;
@@ -850,8 +854,12 @@ aesni_cipher_mac(struct aesni_session *ses, struct cry
                        hmac_key[i] = 0 ^ HMAC_IPAD_VAL;
                ses->hash_update(&sctx, hmac_key, sizeof(hmac_key));
 
-               crypto_apply(crp, crp->crp_aad_start, crp->crp_aad_length,
-                   ses->hash_update, &sctx);
+               if (crp->crp_aad != NULL)
+                       ses->hash_update(&sctx, crp->crp_aad,
+                           crp->crp_aad_length);
+               else
+                       crypto_apply(crp, crp->crp_aad_start,
+                           crp->crp_aad_length, ses->hash_update, &sctx);
                if (CRYPTO_HAS_OUTPUT_BUFFER(crp) &&
                    CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
                        crypto_apply_buf(&crp->crp_obuf,
@@ -876,8 +884,12 @@ aesni_cipher_mac(struct aesni_session *ses, struct cry
        } else {
                ses->hash_init(&sctx);
 
-               crypto_apply(crp, crp->crp_aad_start, crp->crp_aad_length,
-                   ses->hash_update, &sctx);
+               if (crp->crp_aad != NULL)
+                       ses->hash_update(&sctx, crp->crp_aad,
+                           crp->crp_aad_length);
+               else
+                       crypto_apply(crp, crp->crp_aad_start,
+                           crp->crp_aad_length, ses->hash_update, &sctx);
                if (CRYPTO_HAS_OUTPUT_BUFFER(crp) &&
                    CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
                        crypto_apply_buf(&crp->crp_obuf,
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to