summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2024-03-26 12:18:23 +0000
committerjsing <>2024-03-26 12:18:23 +0000
commit07988e5d0622efc08b0158af17d020a393c0d0b1 (patch)
tree1fdf8b828e95f28cbc69a371999dc7576951c06e /src/lib
parent8ec42d5ee5a4f2ad8f1041e98230cca595c03ba9 (diff)
downloadopenbsd-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.c116
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. */
70CTASSERT(sizeof(MD4_LONG) == sizeof(uint32_t));
71
66__BEGIN_HIDDEN_DECLS 72__BEGIN_HIDDEN_DECLS
67 73
68void md4_block_data_order (MD4_CTX *c, const void *p, size_t num); 74void 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
125void 131void
126md4_block_data_order(MD4_CTX *c, const void *data_, size_t num) 132md4_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}