diff options
author | jsing <> | 2024-03-26 12:18:23 +0000 |
---|---|---|
committer | jsing <> | 2024-03-26 12:18:23 +0000 |
commit | 07988e5d0622efc08b0158af17d020a393c0d0b1 (patch) | |
tree | 1fdf8b828e95f28cbc69a371999dc7576951c06e /src/lib | |
parent | 8ec42d5ee5a4f2ad8f1041e98230cca595c03ba9 (diff) | |
download | openbsd-07988e5d0622efc08b0158af17d020a393c0d0b1.tar.gz openbsd-07988e5d0622efc08b0158af17d020a393c0d0b1.tar.bz2 openbsd-07988e5d0622efc08b0158af17d020a393c0d0b1.zip |
Rework input and output handling for md4.
Use le32toh(), htole32() and crypto_{load,store}_htole32() as appropriate.
ok joshua@ tb@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/md4/md4.c | 116 |
1 files changed, 61 insertions, 55 deletions
diff --git a/src/lib/libcrypto/md4/md4.c b/src/lib/libcrypto/md4/md4.c index 47ea62aed7..2d5a4e6268 100644 --- a/src/lib/libcrypto/md4/md4.c +++ b/src/lib/libcrypto/md4/md4.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: md4.c,v 1.13 2024/03/26 07:12:52 jsing Exp $ */ | 1 | /* $OpenBSD: md4.c,v 1.14 2024/03/26 12:18:23 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -61,8 +61,14 @@ | |||
61 | #include <string.h> | 61 | #include <string.h> |
62 | 62 | ||
63 | #include <openssl/opensslconf.h> | 63 | #include <openssl/opensslconf.h> |
64 | |||
64 | #include <openssl/md4.h> | 65 | #include <openssl/md4.h> |
65 | 66 | ||
67 | #include "crypto_internal.h" | ||
68 | |||
69 | /* Ensure that MD4_LONG and uint32_t are equivalent size. */ | ||
70 | CTASSERT(sizeof(MD4_LONG) == sizeof(uint32_t)); | ||
71 | |||
66 | __BEGIN_HIDDEN_DECLS | 72 | __BEGIN_HIDDEN_DECLS |
67 | 73 | ||
68 | void md4_block_data_order (MD4_CTX *c, const void *p, size_t num); | 74 | void md4_block_data_order (MD4_CTX *c, const void *p, size_t num); |
@@ -123,10 +129,11 @@ __END_HIDDEN_DECLS | |||
123 | #undef X | 129 | #undef X |
124 | #endif | 130 | #endif |
125 | void | 131 | void |
126 | md4_block_data_order(MD4_CTX *c, const void *data_, size_t num) | 132 | md4_block_data_order(MD4_CTX *c, const void *_in, size_t num) |
127 | { | 133 | { |
128 | const unsigned char *data = data_; | 134 | const uint8_t *in = _in; |
129 | unsigned int A, B, C, D, l; | 135 | const MD4_LONG *in32; |
136 | unsigned int A, B, C, D; | ||
130 | unsigned int X0, X1, X2, X3, X4, X5, X6, X7, | 137 | unsigned int X0, X1, X2, X3, X4, X5, X6, X7, |
131 | X8, X9, X10, X11, X12, X13, X14, X15; | 138 | X8, X9, X10, X11, X12, X13, X14, X15; |
132 | 139 | ||
@@ -135,56 +142,65 @@ md4_block_data_order(MD4_CTX *c, const void *data_, size_t num) | |||
135 | C = c->C; | 142 | C = c->C; |
136 | D = c->D; | 143 | D = c->D; |
137 | 144 | ||
138 | for (; num--; ) { | 145 | while (num-- > 0) { |
139 | HOST_c2l(data, l); | 146 | if ((uintptr_t)in % 4 == 0) { |
140 | X0 = l; | 147 | /* Input is 32 bit aligned. */ |
141 | HOST_c2l(data, l); | 148 | in32 = (const MD4_LONG *)in; |
142 | X1 = l; | 149 | X0 = le32toh(in32[0]); |
150 | X1 = le32toh(in32[1]); | ||
151 | X2 = le32toh(in32[2]); | ||
152 | X3 = le32toh(in32[3]); | ||
153 | X4 = le32toh(in32[4]); | ||
154 | X5 = le32toh(in32[5]); | ||
155 | X6 = le32toh(in32[6]); | ||
156 | X7 = le32toh(in32[7]); | ||
157 | X8 = le32toh(in32[8]); | ||
158 | X9 = le32toh(in32[9]); | ||
159 | X10 = le32toh(in32[10]); | ||
160 | X11 = le32toh(in32[11]); | ||
161 | X12 = le32toh(in32[12]); | ||
162 | X13 = le32toh(in32[13]); | ||
163 | X14 = le32toh(in32[14]); | ||
164 | X15 = le32toh(in32[15]); | ||
165 | } else { | ||
166 | /* Input is not 32 bit aligned. */ | ||
167 | X0 = crypto_load_le32toh(&in[0 * 4]); | ||
168 | X1 = crypto_load_le32toh(&in[1 * 4]); | ||
169 | X2 = crypto_load_le32toh(&in[2 * 4]); | ||
170 | X3 = crypto_load_le32toh(&in[3 * 4]); | ||
171 | X4 = crypto_load_le32toh(&in[4 * 4]); | ||
172 | X5 = crypto_load_le32toh(&in[5 * 4]); | ||
173 | X6 = crypto_load_le32toh(&in[6 * 4]); | ||
174 | X7 = crypto_load_le32toh(&in[7 * 4]); | ||
175 | X8 = crypto_load_le32toh(&in[8 * 4]); | ||
176 | X9 = crypto_load_le32toh(&in[9 * 4]); | ||
177 | X10 = crypto_load_le32toh(&in[10 * 4]); | ||
178 | X11 = crypto_load_le32toh(&in[11 * 4]); | ||
179 | X12 = crypto_load_le32toh(&in[12 * 4]); | ||
180 | X13 = crypto_load_le32toh(&in[13 * 4]); | ||
181 | X14 = crypto_load_le32toh(&in[14 * 4]); | ||
182 | X15 = crypto_load_le32toh(&in[15 * 4]); | ||
183 | } | ||
184 | in += MD4_CBLOCK; | ||
185 | |||
143 | /* Round 0 */ | 186 | /* Round 0 */ |
144 | R0(A, B, C, D, X0, 3, 0); | 187 | R0(A, B, C, D, X0, 3, 0); |
145 | HOST_c2l(data, l); | ||
146 | X2 = l; | ||
147 | R0(D, A, B, C, X1, 7, 0); | 188 | R0(D, A, B, C, X1, 7, 0); |
148 | HOST_c2l(data, l); | ||
149 | X3 = l; | ||
150 | R0(C, D, A, B, X2, 11, 0); | 189 | R0(C, D, A, B, X2, 11, 0); |
151 | HOST_c2l(data, l); | ||
152 | X4 = l; | ||
153 | R0(B, C, D, A, X3, 19, 0); | 190 | R0(B, C, D, A, X3, 19, 0); |
154 | HOST_c2l(data, l); | ||
155 | X5 = l; | ||
156 | R0(A, B, C, D, X4, 3, 0); | 191 | R0(A, B, C, D, X4, 3, 0); |
157 | HOST_c2l(data, l); | ||
158 | X6 = l; | ||
159 | R0(D, A, B, C, X5, 7, 0); | 192 | R0(D, A, B, C, X5, 7, 0); |
160 | HOST_c2l(data, l); | ||
161 | X7 = l; | ||
162 | R0(C, D, A, B, X6, 11, 0); | 193 | R0(C, D, A, B, X6, 11, 0); |
163 | HOST_c2l(data, l); | ||
164 | X8 = l; | ||
165 | R0(B, C, D, A, X7, 19, 0); | 194 | R0(B, C, D, A, X7, 19, 0); |
166 | HOST_c2l(data, l); | ||
167 | X9 = l; | ||
168 | R0(A, B, C, D, X8, 3, 0); | 195 | R0(A, B, C, D, X8, 3, 0); |
169 | HOST_c2l(data, l); | ||
170 | X10 = l; | ||
171 | R0(D, A,B, C,X9, 7, 0); | 196 | R0(D, A,B, C,X9, 7, 0); |
172 | HOST_c2l(data, l); | ||
173 | X11 = l; | ||
174 | R0(C, D,A, B,X10, 11, 0); | 197 | R0(C, D,A, B,X10, 11, 0); |
175 | HOST_c2l(data, l); | ||
176 | X12 = l; | ||
177 | R0(B, C,D, A,X11, 19, 0); | 198 | R0(B, C,D, A,X11, 19, 0); |
178 | HOST_c2l(data, l); | ||
179 | X13 = l; | ||
180 | R0(A, B,C, D,X12, 3, 0); | 199 | R0(A, B,C, D,X12, 3, 0); |
181 | HOST_c2l(data, l); | ||
182 | X14 = l; | ||
183 | R0(D, A,B, C,X13, 7, 0); | 200 | R0(D, A,B, C,X13, 7, 0); |
184 | HOST_c2l(data, l); | ||
185 | X15 = l; | ||
186 | R0(C, D,A, B,X14, 11, 0); | 201 | R0(C, D,A, B,X14, 11, 0); |
187 | R0(B, C,D, A,X15, 19, 0); | 202 | R0(B, C,D, A,X15, 19, 0); |
203 | |||
188 | /* Round 1 */ | 204 | /* Round 1 */ |
189 | R1(A, B, C, D, X0, 3, 0x5A827999L); | 205 | R1(A, B, C, D, X0, 3, 0x5A827999L); |
190 | R1(D, A, B, C, X4, 5, 0x5A827999L); | 206 | R1(D, A, B, C, X4, 5, 0x5A827999L); |
@@ -202,6 +218,7 @@ md4_block_data_order(MD4_CTX *c, const void *data_, size_t num) | |||
202 | R1(D, A, B, C, X7, 5, 0x5A827999L); | 218 | R1(D, A, B, C, X7, 5, 0x5A827999L); |
203 | R1(C, D, A, B, X11, 9, 0x5A827999L); | 219 | R1(C, D, A, B, X11, 9, 0x5A827999L); |
204 | R1(B, C, D, A, X15, 13, 0x5A827999L); | 220 | R1(B, C, D, A, X15, 13, 0x5A827999L); |
221 | |||
205 | /* Round 2 */ | 222 | /* Round 2 */ |
206 | R2(A, B, C, D, X0, 3, 0x6ED9EBA1L); | 223 | R2(A, B, C, D, X0, 3, 0x6ED9EBA1L); |
207 | R2(D, A, B, C, X8, 9, 0x6ED9EBA1L); | 224 | R2(D, A, B, C, X8, 9, 0x6ED9EBA1L); |
@@ -307,7 +324,6 @@ MD4_Final(unsigned char *md, MD4_CTX *c) | |||
307 | { | 324 | { |
308 | unsigned char *p = (unsigned char *)c->data; | 325 | unsigned char *p = (unsigned char *)c->data; |
309 | size_t n = c->num; | 326 | size_t n = c->num; |
310 | unsigned long ll; | ||
311 | 327 | ||
312 | p[n] = 0x80; /* there is always room for one */ | 328 | p[n] = 0x80; /* there is always room for one */ |
313 | n++; | 329 | n++; |
@@ -317,29 +333,19 @@ MD4_Final(unsigned char *md, MD4_CTX *c) | |||
317 | n = 0; | 333 | n = 0; |
318 | md4_block_data_order(c, p, 1); | 334 | md4_block_data_order(c, p, 1); |
319 | } | 335 | } |
336 | |||
320 | memset(p + n, 0, MD4_CBLOCK - 8 - n); | 337 | memset(p + n, 0, MD4_CBLOCK - 8 - n); |
338 | c->data[MD4_LBLOCK - 2] = htole32(c->Nl); | ||
339 | c->data[MD4_LBLOCK - 1] = htole32(c->Nh); | ||
321 | 340 | ||
322 | p += MD4_CBLOCK - 8; | ||
323 | #if defined(DATA_ORDER_IS_BIG_ENDIAN) | ||
324 | HOST_l2c(c->Nh, p); | ||
325 | HOST_l2c(c->Nl, p); | ||
326 | #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) | ||
327 | HOST_l2c(c->Nl, p); | ||
328 | HOST_l2c(c->Nh, p); | ||
329 | #endif | ||
330 | p -= MD4_CBLOCK; | ||
331 | md4_block_data_order(c, p, 1); | 341 | md4_block_data_order(c, p, 1); |
332 | c->num = 0; | 342 | c->num = 0; |
333 | memset(p, 0, MD4_CBLOCK); | 343 | memset(p, 0, MD4_CBLOCK); |
334 | 344 | ||
335 | ll = c->A; | 345 | crypto_store_htole32(&md[0 * 4], c->A); |
336 | HOST_l2c(ll, md); | 346 | crypto_store_htole32(&md[1 * 4], c->B); |
337 | ll = c->B; | 347 | crypto_store_htole32(&md[2 * 4], c->C); |
338 | HOST_l2c(ll, md); | 348 | crypto_store_htole32(&md[3 * 4], c->D); |
339 | ll = c->C; | ||
340 | HOST_l2c(ll, md); | ||
341 | ll = c->D; | ||
342 | HOST_l2c(ll, md); | ||
343 | 349 | ||
344 | return 1; | 350 | return 1; |
345 | } | 351 | } |