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 ----