diff options
Diffstat (limited to 'umac.c')
-rw-r--r-- | umac.c | 23 |
1 files changed, 14 insertions, 9 deletions
@@ -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__) | ||
138 | static void STORE_UINT32_REVERSED(void *ptr, UINT32 x) | 140 | static 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 | */ |
184 | static void kdf(void *buffer_ptr, aes_int_key key, UINT8 ndx, int nbytes) | 187 | static 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__) | ||
546 | static void endian_convert(void *buf, UWORD bpw, UINT32 num_bytes) | 550 | static 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) | |||
1094 | static int uhash_final(uhash_ctx_t ctx, u_char *res) | 1098 | static 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 - |