Print this page
4896 Performance improvements for KCF AES modes
        
*** 20,29 ****
--- 20,32 ----
   */
  /*
   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
+ /*
+  * Copyright 2015 by Saso Kiselkov. All rights reserved.
+  */
  
  #ifndef _KERNEL
  #include <stdlib.h>
  #endif
  
*** 76,173 ****
  
          }
          } /* end switch */
  }
  
- /*
-  * Get pointers for where in the output to copy a block of encrypted or
-  * decrypted data.  The iov_or_mp argument stores a pointer to the current
-  * iovec or mp, and offset stores an offset into the current iovec or mp.
-  */
  void
- crypto_get_ptrs(crypto_data_t *out, void **iov_or_mp, offset_t *current_offset,
-     uint8_t **out_data_1, size_t *out_data_1_len, uint8_t **out_data_2,
-     size_t amt)
- {
-         offset_t offset;
- 
-         switch (out->cd_format) {
-         case CRYPTO_DATA_RAW: {
-                 iovec_t *iov;
- 
-                 offset = *current_offset;
-                 iov = &out->cd_raw;
-                 if ((offset + amt) <= iov->iov_len) {
-                         /* one block fits */
-                         *out_data_1 = (uint8_t *)iov->iov_base + offset;
-                         *out_data_1_len = amt;
-                         *out_data_2 = NULL;
-                         *current_offset = offset + amt;
-                 }
-                 break;
-         }
- 
-         case CRYPTO_DATA_UIO: {
-                 uio_t *uio = out->cd_uio;
-                 iovec_t *iov;
-                 offset_t offset;
-                 uintptr_t vec_idx;
-                 uint8_t *p;
- 
-                 offset = *current_offset;
-                 vec_idx = (uintptr_t)(*iov_or_mp);
-                 iov = &uio->uio_iov[vec_idx];
-                 p = (uint8_t *)iov->iov_base + offset;
-                 *out_data_1 = p;
- 
-                 if (offset + amt <= iov->iov_len) {
-                         /* can fit one block into this iov */
-                         *out_data_1_len = amt;
-                         *out_data_2 = NULL;
-                         *current_offset = offset + amt;
-                 } else {
-                         /* one block spans two iovecs */
-                         *out_data_1_len = iov->iov_len - offset;
-                         if (vec_idx == uio->uio_iovcnt)
-                                 return;
-                         vec_idx++;
-                         iov = &uio->uio_iov[vec_idx];
-                         *out_data_2 = (uint8_t *)iov->iov_base;
-                         *current_offset = amt - *out_data_1_len;
-                 }
-                 *iov_or_mp = (void *)vec_idx;
-                 break;
-         }
- 
-         case CRYPTO_DATA_MBLK: {
-                 mblk_t *mp;
-                 uint8_t *p;
- 
-                 offset = *current_offset;
-                 mp = (mblk_t *)*iov_or_mp;
-                 p = mp->b_rptr + offset;
-                 *out_data_1 = p;
-                 if ((p + amt) <= mp->b_wptr) {
-                         /* can fit one block into this mblk */
-                         *out_data_1_len = amt;
-                         *out_data_2 = NULL;
-                         *current_offset = offset + amt;
-                 } else {
-                         /* one block spans two mblks */
-                         *out_data_1_len = _PTRDIFF(mp->b_wptr, p);
-                         if ((mp = mp->b_cont) == NULL)
-                                 return;
-                         *out_data_2 = mp->b_rptr;
-                         *current_offset = (amt - *out_data_1_len);
-                 }
-                 *iov_or_mp = mp;
-                 break;
-         }
-         } /* end switch */
- }
- 
- void
  crypto_free_mode_ctx(void *ctx)
  {
          common_ctx_t *common_ctx = (common_ctx_t *)ctx;
  
          switch (common_ctx->cc_flags &
--- 79,89 ----
*** 211,227 ****
                  break;
  
          case GCM_MODE:
          case GMAC_MODE:
  #ifdef _KERNEL
-                 if (((gcm_ctx_t *)ctx)->gcm_pt_buf != NULL)
-                         kmem_free(((gcm_ctx_t *)ctx)->gcm_pt_buf,
-                             ((gcm_ctx_t *)ctx)->gcm_pt_buf_len);
- 
                  kmem_free(ctx, sizeof (gcm_ctx_t));
  #else
-                 if (((gcm_ctx_t *)ctx)->gcm_pt_buf != NULL)
-                         free(((gcm_ctx_t *)ctx)->gcm_pt_buf);
                  free(ctx);
  #endif
          }
  }
--- 127,137 ----