Print this page
5007142 Add ntohll and htonll to sys/byteorder.h
6717509 Need to use bswap/bswapq for byte swap of 64-bit integer on x32/x64
PSARC 2008/474
*** 21,32 ****
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
- #pragma ident "%Z%%M% %I% %E% SMI"
-
#ifndef _KERNEL
#include <strings.h>
#include <limits.h>
#include <assert.h>
#include <security/cryptoki.h>
--- 21,30 ----
*** 35,44 ****
--- 33,46 ----
#include <sys/types.h>
#include <modes/modes.h>
#include <sys/crypto/common.h>
#include <sys/crypto/impl.h>
+ #ifdef _LITTLE_ENDIAN
+ #include <sys/byteorder.h>
+ #endif
+
/*
* Encrypt and decrypt multiple blocks of data in counter mode.
*/
int
ctr_mode_contiguous_blocks(ctr_ctx_t *ctx, char *data, size_t length,
*** 99,131 ****
/*
* Increment counter. Counter bits are confined
* to the bottom 64 bits of the counter block.
*/
- counter = ctx->ctr_cb[1] & ctx->ctr_counter_mask;
#ifdef _LITTLE_ENDIAN
! p = (uint8_t *)&counter;
! counter = (((uint64_t)p[0] << 56) |
! ((uint64_t)p[1] << 48) |
! ((uint64_t)p[2] << 40) |
! ((uint64_t)p[3] << 32) |
! ((uint64_t)p[4] << 24) |
! ((uint64_t)p[5] << 16) |
! ((uint64_t)p[6] << 8) |
! (uint64_t)p[7]);
! #endif
counter++;
! #ifdef _LITTLE_ENDIAN
! counter = (((uint64_t)p[0] << 56) |
! ((uint64_t)p[1] << 48) |
! ((uint64_t)p[2] << 40) |
! ((uint64_t)p[3] << 32) |
! ((uint64_t)p[4] << 24) |
! ((uint64_t)p[5] << 16) |
! ((uint64_t)p[6] << 8) |
! (uint64_t)p[7]);
! #endif
counter &= ctx->ctr_counter_mask;
ctx->ctr_cb[1] =
(ctx->ctr_cb[1] & ~(ctx->ctr_counter_mask)) | counter;
/*
--- 101,117 ----
/*
* Increment counter. Counter bits are confined
* to the bottom 64 bits of the counter block.
*/
#ifdef _LITTLE_ENDIAN
! counter = ntohll(ctx->ctr_cb[1] & ctx->ctr_counter_mask);
! counter = htonll(counter + 1);
! #else
! counter = ctx->ctr_cb[1] & ctx->ctr_counter_mask;
counter++;
! #endif /* _LITTLE_ENDIAN */
counter &= ctx->ctr_counter_mask;
ctx->ctr_cb[1] =
(ctx->ctr_cb[1] & ~(ctx->ctr_counter_mask)) | counter;
/*
*** 222,250 ****
int
ctr_init_ctx(ctr_ctx_t *ctr_ctx, ulong_t count, uint8_t *cb,
void (*copy_block)(uint8_t *, uint8_t *))
{
uint64_t mask = 0;
- #ifdef _LITTLE_ENDIAN
- uint8_t *p8;
- #endif
if (count == 0 || count > 64) {
return (CRYPTO_MECHANISM_PARAM_INVALID);
}
while (count-- > 0)
mask |= (1ULL << count);
#ifdef _LITTLE_ENDIAN
! p8 = (uint8_t *)&mask;
! mask = (((uint64_t)p8[0] << 56) |
! ((uint64_t)p8[1] << 48) |
! ((uint64_t)p8[2] << 40) |
! ((uint64_t)p8[3] << 32) |
! ((uint64_t)p8[4] << 24) |
! ((uint64_t)p8[5] << 16) |
! ((uint64_t)p8[6] << 8) |
! (uint64_t)p8[7]);
#endif
ctr_ctx->ctr_counter_mask = mask;
copy_block(cb, (uchar_t *)ctr_ctx->ctr_cb);
ctr_ctx->ctr_lastp = (uint8_t *)&ctr_ctx->ctr_cb[0];
ctr_ctx->ctr_flags |= CTR_MODE;
--- 208,226 ----
int
ctr_init_ctx(ctr_ctx_t *ctr_ctx, ulong_t count, uint8_t *cb,
void (*copy_block)(uint8_t *, uint8_t *))
{
uint64_t mask = 0;
if (count == 0 || count > 64) {
return (CRYPTO_MECHANISM_PARAM_INVALID);
}
while (count-- > 0)
mask |= (1ULL << count);
+
#ifdef _LITTLE_ENDIAN
! mask = htonll(mask);
#endif
ctr_ctx->ctr_counter_mask = mask;
copy_block(cb, (uchar_t *)ctr_ctx->ctr_cb);
ctr_ctx->ctr_lastp = (uint8_t *)&ctr_ctx->ctr_cb[0];
ctr_ctx->ctr_flags |= CTR_MODE;