diff options
Diffstat (limited to '')
| -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 | } | 
