summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2024-03-26 12:54:22 +0000
committerjsing <>2024-03-26 12:54:22 +0000
commita93ce75e8965507e3c7c97ce13c3fa9a40592548 (patch)
tree3f849d397620f5610028aaf94a0a4e8cbf38387a
parent42ff0af3f210b114fd4f86002c1463044bef5035 (diff)
downloadopenbsd-a93ce75e8965507e3c7c97ce13c3fa9a40592548.tar.gz
openbsd-a93ce75e8965507e3c7c97ce13c3fa9a40592548.tar.bz2
openbsd-a93ce75e8965507e3c7c97ce13c3fa9a40592548.zip
Rework input and output handling for sha1.
Use be32toh(), htobe32() and crypto_{load,store}_htobe32() as appropriate. Also use the same while() loop that is used for other hash functions. ok joshua@ tb@
-rw-r--r--src/lib/libcrypto/sha/sha1.c207
1 files changed, 79 insertions, 128 deletions
diff --git a/src/lib/libcrypto/sha/sha1.c b/src/lib/libcrypto/sha/sha1.c
index 4b48653bdb..8bcc5e0431 100644
--- a/src/lib/libcrypto/sha/sha1.c
+++ b/src/lib/libcrypto/sha/sha1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: sha1.c,v 1.12 2023/08/10 07:15:23 jsing Exp $ */ 1/* $OpenBSD: sha1.c,v 1.13 2024/03/26 12:54:22 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 *
@@ -64,8 +64,13 @@
64#include <openssl/crypto.h> 64#include <openssl/crypto.h>
65#include <openssl/sha.h> 65#include <openssl/sha.h>
66 66
67#include "crypto_internal.h"
68
67#if !defined(OPENSSL_NO_SHA1) && !defined(OPENSSL_NO_SHA) 69#if !defined(OPENSSL_NO_SHA1) && !defined(OPENSSL_NO_SHA)
68 70
71/* Ensure that SHA_LONG and uint32_t are equivalent sizes. */
72CTASSERT(sizeof(SHA_LONG) == sizeof(uint32_t));
73
69#define DATA_ORDER_IS_BIG_ENDIAN 74#define DATA_ORDER_IS_BIG_ENDIAN
70 75
71#define HASH_LONG SHA_LONG 76#define HASH_LONG SHA_LONG
@@ -138,109 +143,77 @@ void sha1_block_data_order(SHA_CTX *c, const void *p, size_t num);
138#if !defined(SHA1_ASM) 143#if !defined(SHA1_ASM)
139#include <endian.h> 144#include <endian.h>
140static void 145static void
141sha1_block_data_order(SHA_CTX *c, const void *p, size_t num) 146sha1_block_data_order(SHA_CTX *c, const void *_in, size_t num)
142{ 147{
143 const unsigned char *data = p; 148 const uint8_t *in = _in;
144 unsigned int A, B, C, D, E, T, l; 149 const SHA_LONG *in32;
150 unsigned int A, B, C, D, E, T;
145 unsigned int X0, X1, X2, X3, X4, X5, X6, X7, 151 unsigned int X0, X1, X2, X3, X4, X5, X6, X7,
146 X8, X9, X10, X11, X12, X13, X14, X15; 152 X8, X9, X10, X11, X12, X13, X14, X15;
147 153
148 A = c->h0; 154 while (num--) {
149 B = c->h1; 155 A = c->h0;
150 C = c->h2; 156 B = c->h1;
151 D = c->h3; 157 C = c->h2;
152 E = c->h4; 158 D = c->h3;
153 159 E = c->h4;
154 for (;;) { 160
155 161 if ((size_t)in % 4 == 0) {
156 if (BYTE_ORDER != LITTLE_ENDIAN && 162 /* Input is 32 bit aligned. */
157 sizeof(SHA_LONG) == 4 && ((size_t)p % 4) == 0) { 163 in32 = (const SHA_LONG *)in;
158 const SHA_LONG *W = (const SHA_LONG *)data; 164 X0 = be32toh(in32[0]);
159 165 X1 = be32toh(in32[1]);
160 X0 = W[0]; 166 X2 = be32toh(in32[2]);
161 X1 = W[1]; 167 X3 = be32toh(in32[3]);
162 BODY_00_15( 0, A, B, C, D, E, T, X0); 168 X4 = be32toh(in32[4]);
163 X2 = W[2]; 169 X5 = be32toh(in32[5]);
164 BODY_00_15( 1, T, A, B, C, D, E, X1); 170 X6 = be32toh(in32[6]);
165 X3 = W[3]; 171 X7 = be32toh(in32[7]);
166 BODY_00_15( 2, E, T, A, B, C, D, X2); 172 X8 = be32toh(in32[8]);
167 X4 = W[4]; 173 X9 = be32toh(in32[9]);
168 BODY_00_15( 3, D, E, T, A, B, C, X3); 174 X10 = be32toh(in32[10]);
169 X5 = W[5]; 175 X11 = be32toh(in32[11]);
170 BODY_00_15( 4, C, D, E, T, A, B, X4); 176 X12 = be32toh(in32[12]);
171 X6 = W[6]; 177 X13 = be32toh(in32[13]);
172 BODY_00_15( 5, B, C, D, E, T, A, X5); 178 X14 = be32toh(in32[14]);
173 X7 = W[7]; 179 X15 = be32toh(in32[15]);
174 BODY_00_15( 6, A, B, C, D, E, T, X6);
175 X8 = W[8];
176 BODY_00_15( 7, T, A, B, C, D, E, X7);
177 X9 = W[9];
178 BODY_00_15( 8, E, T, A, B, C, D, X8);
179 X10 = W[10];
180 BODY_00_15( 9, D, E, T, A, B, C, X9);
181 X11 = W[11];
182 BODY_00_15(10, C, D, E, T, A, B, X10);
183 X12 = W[12];
184 BODY_00_15(11, B, C, D, E, T, A, X11);
185 X13 = W[13];
186 BODY_00_15(12, A, B, C, D, E, T, X12);
187 X14 = W[14];
188 BODY_00_15(13, T, A, B, C, D, E, X13);
189 X15 = W[15];
190 BODY_00_15(14, E, T, A, B, C, D, X14);
191 BODY_00_15(15, D, E, T, A, B, C, X15);
192
193 data += SHA_CBLOCK;
194 } else { 180 } else {
195 HOST_c2l(data, l); 181 /* Input is not 32 bit aligned. */
196 X0 = l; 182 X0 = crypto_load_be32toh(&in[0 * 4]);
197 HOST_c2l(data, l); 183 X1 = crypto_load_be32toh(&in[1 * 4]);
198 X1 = l; 184 X2 = crypto_load_be32toh(&in[2 * 4]);
199 BODY_00_15( 0, A, B, C, D, E, T, X0); 185 X3 = crypto_load_be32toh(&in[3 * 4]);
200 HOST_c2l(data, l); 186 X4 = crypto_load_be32toh(&in[4 * 4]);
201 X2 = l; 187 X5 = crypto_load_be32toh(&in[5 * 4]);
202 BODY_00_15( 1, T, A, B, C, D, E, X1); 188 X6 = crypto_load_be32toh(&in[6 * 4]);
203 HOST_c2l(data, l); 189 X7 = crypto_load_be32toh(&in[7 * 4]);
204 X3 = l; 190 X8 = crypto_load_be32toh(&in[8 * 4]);
205 BODY_00_15( 2, E, T, A, B, C, D, X2); 191 X9 = crypto_load_be32toh(&in[9 * 4]);
206 HOST_c2l(data, l); 192 X10 = crypto_load_be32toh(&in[10 * 4]);
207 X4 = l; 193 X11 = crypto_load_be32toh(&in[11 * 4]);
208 BODY_00_15( 3, D, E, T, A, B, C, X3); 194 X12 = crypto_load_be32toh(&in[12 * 4]);
209 HOST_c2l(data, l); 195 X13 = crypto_load_be32toh(&in[13 * 4]);
210 X5 = l; 196 X14 = crypto_load_be32toh(&in[14 * 4]);
211 BODY_00_15( 4, C, D, E, T, A, B, X4); 197 X15 = crypto_load_be32toh(&in[15 * 4]);
212 HOST_c2l(data, l);
213 X6 = l;
214 BODY_00_15( 5, B, C, D, E, T, A, X5);
215 HOST_c2l(data, l);
216 X7 = l;
217 BODY_00_15( 6, A, B, C, D, E, T, X6);
218 HOST_c2l(data, l);
219 X8 = l;
220 BODY_00_15( 7, T, A, B, C, D, E, X7);
221 HOST_c2l(data, l);
222 X9 = l;
223 BODY_00_15( 8, E, T, A, B, C, D, X8);
224 HOST_c2l(data, l);
225 X10 = l;
226 BODY_00_15( 9, D, E, T, A, B, C, X9);
227 HOST_c2l(data, l);
228 X11 = l;
229 BODY_00_15(10, C, D, E, T, A, B, X10);
230 HOST_c2l(data, l);
231 X12 = l;
232 BODY_00_15(11, B, C, D, E, T, A, X11);
233 HOST_c2l(data, l);
234 X13 = l;
235 BODY_00_15(12, A, B, C, D, E, T, X12);
236 HOST_c2l(data, l);
237 X14 = l;
238 BODY_00_15(13, T, A, B, C, D, E, X13);
239 HOST_c2l(data, l);
240 X15 = l;
241 BODY_00_15(14, E, T, A, B, C, D, X14);
242 BODY_00_15(15, D, E, T, A, B, C, X15);
243 } 198 }
199 in += SHA_CBLOCK;
200
201 BODY_00_15( 0, A, B, C, D, E, T, X0);
202 BODY_00_15( 1, T, A, B, C, D, E, X1);
203 BODY_00_15( 2, E, T, A, B, C, D, X2);
204 BODY_00_15( 3, D, E, T, A, B, C, X3);
205 BODY_00_15( 4, C, D, E, T, A, B, X4);
206 BODY_00_15( 5, B, C, D, E, T, A, X5);
207 BODY_00_15( 6, A, B, C, D, E, T, X6);
208 BODY_00_15( 7, T, A, B, C, D, E, X7);
209 BODY_00_15( 8, E, T, A, B, C, D, X8);
210 BODY_00_15( 9, D, E, T, A, B, C, X9);
211 BODY_00_15(10, C, D, E, T, A, B, X10);
212 BODY_00_15(11, B, C, D, E, T, A, X11);
213 BODY_00_15(12, A, B, C, D, E, T, X12);
214 BODY_00_15(13, T, A, B, C, D, E, X13);
215 BODY_00_15(14, E, T, A, B, C, D, X14);
216 BODY_00_15(15, D, E, T, A, B, C, X15);
244 217
245 BODY_16_19(16, C, D, E, T, A, B, X0, X0, X2, X8, X13); 218 BODY_16_19(16, C, D, E, T, A, B, X0, X0, X2, X8, X13);
246 BODY_16_19(17, B, C, D, E, T, A, X1, X1, X3, X9, X14); 219 BODY_16_19(17, B, C, D, E, T, A, X1, X1, X3, X9, X14);
@@ -316,16 +289,6 @@ sha1_block_data_order(SHA_CTX *c, const void *p, size_t num)
316 c->h2 = (c->h2 + A)&0xffffffffL; 289 c->h2 = (c->h2 + A)&0xffffffffL;
317 c->h3 = (c->h3 + B)&0xffffffffL; 290 c->h3 = (c->h3 + B)&0xffffffffL;
318 c->h4 = (c->h4 + C)&0xffffffffL; 291 c->h4 = (c->h4 + C)&0xffffffffL;
319
320 if (--num == 0)
321 break;
322
323 A = c->h0;
324 B = c->h1;
325 C = c->h2;
326 D = c->h3;
327 E = c->h4;
328
329 } 292 }
330} 293}
331#endif 294#endif
@@ -412,7 +375,6 @@ int
412SHA1_Final(unsigned char *md, SHA_CTX *c) 375SHA1_Final(unsigned char *md, SHA_CTX *c)
413{ 376{
414 unsigned char *p = (unsigned char *)c->data; 377 unsigned char *p = (unsigned char *)c->data;
415 unsigned long ll;
416 size_t n = c->num; 378 size_t n = c->num;
417 379
418 p[n] = 0x80; /* there is always room for one */ 380 p[n] = 0x80; /* there is always room for one */
@@ -423,31 +385,20 @@ SHA1_Final(unsigned char *md, SHA_CTX *c)
423 n = 0; 385 n = 0;
424 sha1_block_data_order(c, p, 1); 386 sha1_block_data_order(c, p, 1);
425 } 387 }
388
426 memset(p + n, 0, SHA_CBLOCK - 8 - n); 389 memset(p + n, 0, SHA_CBLOCK - 8 - n);
390 c->data[SHA_LBLOCK - 2] = htobe32(c->Nh);
391 c->data[SHA_LBLOCK - 1] = htobe32(c->Nl);
427 392
428 p += SHA_CBLOCK - 8;
429#if defined(DATA_ORDER_IS_BIG_ENDIAN)
430 HOST_l2c(c->Nh, p);
431 HOST_l2c(c->Nl, p);
432#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
433 HOST_l2c(c->Nl, p);
434 HOST_l2c(c->Nh, p);
435#endif
436 p -= SHA_CBLOCK;
437 sha1_block_data_order(c, p, 1); 393 sha1_block_data_order(c, p, 1);
438 c->num = 0; 394 c->num = 0;
439 memset(p, 0, SHA_CBLOCK); 395 memset(p, 0, SHA_CBLOCK);
440 396
441 ll = c->h0; 397 crypto_store_htobe32(&md[0 * 4], c->h0);
442 HOST_l2c(ll, md); 398 crypto_store_htobe32(&md[1 * 4], c->h1);
443 ll = c->h1; 399 crypto_store_htobe32(&md[2 * 4], c->h2);
444 HOST_l2c(ll, md); 400 crypto_store_htobe32(&md[3 * 4], c->h3);
445 ll = c->h2; 401 crypto_store_htobe32(&md[4 * 4], c->h4);
446 HOST_l2c(ll, md);
447 ll = c->h3;
448 HOST_l2c(ll, md);
449 ll = c->h4;
450 HOST_l2c(ll, md);
451 402
452 return 1; 403 return 1;
453} 404}