* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha2.h,v 1.5 2006/01/31 23:01:23 marka Exp $ */
+/* $Id: sha2.h,v 1.6 2006/02/24 00:03:15 marka Exp $ */
/* $FreeBSD: src/sys/crypto/sha2/sha2.h,v 1.1.2.1 2001/07/03 11:01:36 ume Exp $ */
/* $KAME: sha2.h,v 1.3 2001/03/12 08:27:48 itojun Exp $ */
/*** SHA-256/384/512 Context Structures *******************************/
+/*
+ * Keep buffer immediately after bitcount to preserve alignment.
+ */
typedef struct {
isc_uint32_t state[8];
isc_uint64_t bitcount;
isc_uint8_t buffer[ISC_SHA256_BLOCK_LENGTH];
} isc_sha256_t;
+/*
+ * Keep buffer immediately after bitcount to preserve alignment.
+ */
typedef struct {
isc_uint64_t state[8];
isc_uint64_t bitcount[2];
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha2.c,v 1.7 2006/01/31 23:01:23 marka Exp $ */
+/* $Id: sha2.c,v 1.8 2006/02/24 00:03:15 marka Exp $ */
/* $FreeBSD: src/sys/crypto/sha2/sha2.c,v 1.2.2.2 2002/03/05 08:36:47 ume Exp $ */
/* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */
context->bitcount += freespace << 3;
len -= freespace;
data += freespace;
- isc_sha256_transform(context, (isc_uint32_t*)context->buffer);
+ isc_sha256_transform(context,
+ (isc_uint32_t*)context->buffer);
} else {
/* The buffer is not yet full */
memcpy(&context->buffer[usedspace], data, len);
}
while (len >= ISC_SHA256_BLOCK_LENGTH) {
/* Process as many complete blocks as we can */
- isc_sha256_transform(context, (const isc_uint32_t*)data);
+ memcpy(context->buffer, data, ISC_SHA256_BLOCK_LENGTH);
+ isc_sha256_transform(context, (isc_uint32_t*)context->buffer);
context->bitcount += ISC_SHA256_BLOCK_LENGTH << 3;
len -= ISC_SHA256_BLOCK_LENGTH;
data += ISC_SHA256_BLOCK_LENGTH;
usedspace);
}
/* Do second-to-last transform: */
- isc_sha256_transform(context, (isc_uint32_t*)context->buffer);
+ isc_sha256_transform(context,
+ (isc_uint32_t*)context->buffer);
/* And set-up for the last transform: */
memset(context->buffer, 0,
ADDINC128(context->bitcount, freespace << 3);
len -= freespace;
data += freespace;
- isc_sha512_transform(context, (isc_uint64_t*)context->buffer);
+ isc_sha512_transform(context,
+ (isc_uint64_t*)context->buffer);
} else {
/* The buffer is not yet full */
memcpy(&context->buffer[usedspace], data, len);
}
while (len >= ISC_SHA512_BLOCK_LENGTH) {
/* Process as many complete blocks as we can */
- isc_sha512_transform(context, (const isc_uint64_t*)data);
+ memcpy(context->buffer, data, ISC_SHA512_BLOCK_LENGTH);
+ isc_sha512_transform(context, (isc_uint64_t*)context->buffer);
ADDINC128(context->bitcount, ISC_SHA512_BLOCK_LENGTH << 3);
len -= ISC_SHA512_BLOCK_LENGTH;
data += ISC_SHA512_BLOCK_LENGTH;
ISC_SHA512_BLOCK_LENGTH - usedspace);
}
/* Do second-to-last transform: */
- isc_sha512_transform(context, (isc_uint64_t*)context->buffer);
+ isc_sha512_transform(context,
+ (isc_uint64_t*)context->buffer);
/* And set-up for the last transform: */
memset(context->buffer, 0, ISC_SHA512_BLOCK_LENGTH - 2);