summaryrefslogtreecommitdiff
path: root/umac.c
diff options
context:
space:
mode:
Diffstat (limited to 'umac.c')
-rw-r--r--umac.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/umac.c b/umac.c
index c2fdcf448..92902bc09 100644
--- a/umac.c
+++ b/umac.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: umac.c,v 1.1 2007/06/07 19:37:34 pvalchev Exp $ */ 1/* $OpenBSD: umac.c,v 1.3 2008/05/12 20:52:20 pvalchev Exp $ */
2/* ----------------------------------------------------------------------- 2/* -----------------------------------------------------------------------
3 * 3 *
4 * umac.c -- C Implementation UMAC Message Authentication 4 * umac.c -- C Implementation UMAC Message Authentication
@@ -66,6 +66,7 @@
66#include "includes.h" 66#include "includes.h"
67#include <sys/types.h> 67#include <sys/types.h>
68 68
69#include "xmalloc.h"
69#include "umac.h" 70#include "umac.h"
70#include <string.h> 71#include <string.h>
71#include <stdlib.h> 72#include <stdlib.h>
@@ -135,12 +136,14 @@ static UINT32 LOAD_UINT32_REVERSED(void *ptr)
135 return (UINT32)temp; 136 return (UINT32)temp;
136} 137}
137 138
139# if (__LITTLE_ENDIAN__)
138static void STORE_UINT32_REVERSED(void *ptr, UINT32 x) 140static void STORE_UINT32_REVERSED(void *ptr, UINT32 x)
139{ 141{
140 UINT32 i = (UINT32)x; 142 UINT32 i = (UINT32)x;
141 *(UINT32 *)ptr = (i >> 24) | ((i & 0x00FF0000) >> 8 ) 143 *(UINT32 *)ptr = (i >> 24) | ((i & 0x00FF0000) >> 8 )
142 | ((i & 0x0000FF00) << 8 ) | (i << 24); 144 | ((i & 0x0000FF00) << 8 ) | (i << 24);
143} 145}
146# endif /* __LITTLE_ENDIAN */
144#endif /* HAVE_SWAP32 */ 147#endif /* HAVE_SWAP32 */
145 148
146/* The following definitions use the above reversal-primitives to do the right 149/* The following definitions use the above reversal-primitives to do the right
@@ -178,14 +181,14 @@ typedef AES_KEY aes_int_key[1];
178/* The user-supplied UMAC key is stretched using AES in a counter 181/* The user-supplied UMAC key is stretched using AES in a counter
179 * mode to supply all random bits needed by UMAC. The kdf function takes 182 * mode to supply all random bits needed by UMAC. The kdf function takes
180 * an AES internal key representation 'key' and writes a stream of 183 * an AES internal key representation 'key' and writes a stream of
181 * 'nbytes' bytes to the memory pointed at by 'buffer_ptr'. Each distinct 184 * 'nbytes' bytes to the memory pointed at by 'bufp'. Each distinct
182 * 'ndx' causes a distinct byte stream. 185 * 'ndx' causes a distinct byte stream.
183 */ 186 */
184static void kdf(void *buffer_ptr, aes_int_key key, UINT8 ndx, int nbytes) 187static void kdf(void *bufp, aes_int_key key, UINT8 ndx, int nbytes)
185{ 188{
186 UINT8 in_buf[AES_BLOCK_LEN] = {0}; 189 UINT8 in_buf[AES_BLOCK_LEN] = {0};
187 UINT8 out_buf[AES_BLOCK_LEN]; 190 UINT8 out_buf[AES_BLOCK_LEN];
188 UINT8 *dst_buf = (UINT8 *)buffer_ptr; 191 UINT8 *dst_buf = (UINT8 *)bufp;
189 int i; 192 int i;
190 193
191 /* Setup the initial value */ 194 /* Setup the initial value */
@@ -543,6 +546,7 @@ static void nh_transform(nh_ctx *hc, UINT8 *buf, UINT32 nbytes)
543 546
544/* ---------------------------------------------------------------------- */ 547/* ---------------------------------------------------------------------- */
545 548
549#if (__LITTLE_ENDIAN__)
546static void endian_convert(void *buf, UWORD bpw, UINT32 num_bytes) 550static void endian_convert(void *buf, UWORD bpw, UINT32 num_bytes)
547/* We endian convert the keys on little-endian computers to */ 551/* We endian convert the keys on little-endian computers to */
548/* compensate for the lack of big-endian memory reads during hashing. */ 552/* compensate for the lack of big-endian memory reads during hashing. */
@@ -565,7 +569,6 @@ static void endian_convert(void *buf, UWORD bpw, UINT32 num_bytes)
565 } while (--iters); 569 } while (--iters);
566 } 570 }
567} 571}
568#if (__LITTLE_ENDIAN__)
569#define endian_convert_if_le(x,y,z) endian_convert((x),(y),(z)) 572#define endian_convert_if_le(x,y,z) endian_convert((x),(y),(z))
570#else 573#else
571#define endian_convert_if_le(x,y,z) do{}while(0) /* Do nothing */ 574#define endian_convert_if_le(x,y,z) do{}while(0) /* Do nothing */
@@ -1042,7 +1045,8 @@ static int uhash_update(uhash_ctx_t ctx, u_char *input, long len)
1042 */ 1045 */
1043{ 1046{
1044 UWORD bytes_hashed, bytes_remaining; 1047 UWORD bytes_hashed, bytes_remaining;
1045 UINT8 nh_result[STREAMS*sizeof(UINT64)]; 1048 UINT64 result_buf[STREAMS];
1049 UINT8 *nh_result = (UINT8 *)&result_buf;
1046 1050
1047 if (ctx->msg_len + len <= L1_KEY_LEN) { 1051 if (ctx->msg_len + len <= L1_KEY_LEN) {
1048 nh_update(&ctx->hash, (UINT8 *)input, len); 1052 nh_update(&ctx->hash, (UINT8 *)input, len);
@@ -1094,7 +1098,8 @@ static int uhash_update(uhash_ctx_t ctx, u_char *input, long len)
1094static int uhash_final(uhash_ctx_t ctx, u_char *res) 1098static int uhash_final(uhash_ctx_t ctx, u_char *res)
1095/* Incorporate any pending data, pad, and generate tag */ 1099/* Incorporate any pending data, pad, and generate tag */
1096{ 1100{
1097 UINT8 nh_result[STREAMS*sizeof(UINT64)]; 1101 UINT64 result_buf[STREAMS];
1102 UINT8 *nh_result = (UINT8 *)&result_buf;
1098 1103
1099 if (ctx->msg_len > L1_KEY_LEN) { 1104 if (ctx->msg_len > L1_KEY_LEN) {
1100 if (ctx->msg_len % L1_KEY_LEN) { 1105 if (ctx->msg_len % L1_KEY_LEN) {
@@ -1196,7 +1201,7 @@ int umac_delete(struct umac_ctx *ctx)
1196 if (ctx) { 1201 if (ctx) {
1197 if (ALLOC_BOUNDARY) 1202 if (ALLOC_BOUNDARY)
1198 ctx = (struct umac_ctx *)ctx->free_ptr; 1203 ctx = (struct umac_ctx *)ctx->free_ptr;
1199 free(ctx); 1204 xfree(ctx);
1200 } 1205 }
1201 return (1); 1206 return (1);
1202} 1207}
@@ -1212,7 +1217,7 @@ struct umac_ctx *umac_new(u_char key[])
1212 size_t bytes_to_add; 1217 size_t bytes_to_add;
1213 aes_int_key prf_key; 1218 aes_int_key prf_key;
1214 1219
1215 octx = ctx = malloc(sizeof(*ctx) + ALLOC_BOUNDARY); 1220 octx = ctx = xmalloc(sizeof(*ctx) + ALLOC_BOUNDARY);
1216 if (ctx) { 1221 if (ctx) {
1217 if (ALLOC_BOUNDARY) { 1222 if (ALLOC_BOUNDARY) {
1218 bytes_to_add = ALLOC_BOUNDARY - 1223 bytes_to_add = ALLOC_BOUNDARY -