1 1.1 christos /* sha1.c - Functions to compute SHA1 message digest of files or 2 1.1 christos memory blocks according to the NIST specification FIPS-180-1. 3 1.1 christos 4 1.1.1.7 christos Copyright (C) 2000-2024 Free Software Foundation, Inc. 5 1.1 christos 6 1.1 christos This program is free software; you can redistribute it and/or modify it 7 1.1 christos under the terms of the GNU General Public License as published by the 8 1.1 christos Free Software Foundation; either version 2, or (at your option) any 9 1.1 christos later version. 10 1.1 christos 11 1.1 christos This program is distributed in the hope that it will be useful, 12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 christos GNU General Public License for more details. 15 1.1 christos 16 1.1 christos You should have received a copy of the GNU General Public License 17 1.1 christos along with this program; if not, write to the Free Software Foundation, 18 1.1 christos Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19 1.1 christos 20 1.1 christos /* Written by Scott G. Miller 21 1.1 christos Credits: 22 1.1 christos Robert Klep <robert (at) ilse.nl> -- Expansion function fix 23 1.1 christos */ 24 1.1 christos 25 1.1 christos #include <config.h> 26 1.1 christos 27 1.1 christos #include "sha1.h" 28 1.1 christos 29 1.1 christos #include <stddef.h> 30 1.1 christos #include <string.h> 31 1.1 christos 32 1.1.1.7 christos #ifdef HAVE_X86_SHA1_HW_SUPPORT 33 1.1.1.7 christos # include <x86intrin.h> 34 1.1.1.7 christos # include <cpuid.h> 35 1.1.1.7 christos #endif 36 1.1.1.7 christos 37 1.1 christos #if USE_UNLOCKED_IO 38 1.1 christos # include "unlocked-io.h" 39 1.1 christos #endif 40 1.1 christos 41 1.1 christos #ifdef WORDS_BIGENDIAN 42 1.1 christos # define SWAP(n) (n) 43 1.1 christos #else 44 1.1 christos # define SWAP(n) \ 45 1.1 christos (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) 46 1.1 christos #endif 47 1.1 christos 48 1.1 christos #define BLOCKSIZE 4096 49 1.1 christos #if BLOCKSIZE % 64 != 0 50 1.1 christos # error "invalid BLOCKSIZE" 51 1.1 christos #endif 52 1.1 christos 53 1.1 christos /* This array contains the bytes used to pad the buffer to the next 54 1.1 christos 64-byte boundary. (RFC 1321, 3.1: Step 1) */ 55 1.1 christos static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; 56 1.1 christos 57 1.1 christos 58 1.1 christos /* Take a pointer to a 160 bit block of data (five 32 bit ints) and 59 1.1 christos initialize it to the start constants of the SHA1 algorithm. This 60 1.1 christos must be called before using hash in the call to sha1_hash. */ 61 1.1 christos void 62 1.1 christos sha1_init_ctx (struct sha1_ctx *ctx) 63 1.1 christos { 64 1.1 christos ctx->A = 0x67452301; 65 1.1 christos ctx->B = 0xefcdab89; 66 1.1 christos ctx->C = 0x98badcfe; 67 1.1 christos ctx->D = 0x10325476; 68 1.1 christos ctx->E = 0xc3d2e1f0; 69 1.1 christos 70 1.1 christos ctx->total[0] = ctx->total[1] = 0; 71 1.1 christos ctx->buflen = 0; 72 1.1 christos } 73 1.1 christos 74 1.1 christos /* Put result from CTX in first 20 bytes following RESBUF. The result 75 1.1 christos must be in little endian byte order. 76 1.1 christos 77 1.1 christos IMPORTANT: On some systems it is required that RESBUF is correctly 78 1.1 christos aligned for a 32-bit value. */ 79 1.1 christos void * 80 1.1 christos sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf) 81 1.1 christos { 82 1.1 christos ((sha1_uint32 *) resbuf)[0] = SWAP (ctx->A); 83 1.1 christos ((sha1_uint32 *) resbuf)[1] = SWAP (ctx->B); 84 1.1 christos ((sha1_uint32 *) resbuf)[2] = SWAP (ctx->C); 85 1.1 christos ((sha1_uint32 *) resbuf)[3] = SWAP (ctx->D); 86 1.1 christos ((sha1_uint32 *) resbuf)[4] = SWAP (ctx->E); 87 1.1 christos 88 1.1 christos return resbuf; 89 1.1 christos } 90 1.1 christos 91 1.1 christos /* Process the remaining bytes in the internal buffer and the usual 92 1.1 christos prolog according to the standard and write the result to RESBUF. 93 1.1 christos 94 1.1 christos IMPORTANT: On some systems it is required that RESBUF is correctly 95 1.1 christos aligned for a 32-bit value. */ 96 1.1 christos void * 97 1.1 christos sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf) 98 1.1 christos { 99 1.1 christos /* Take yet unprocessed bytes into account. */ 100 1.1 christos sha1_uint32 bytes = ctx->buflen; 101 1.1 christos size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; 102 1.1 christos 103 1.1 christos /* Now count remaining bytes. */ 104 1.1 christos ctx->total[0] += bytes; 105 1.1 christos if (ctx->total[0] < bytes) 106 1.1 christos ++ctx->total[1]; 107 1.1 christos 108 1.1 christos /* Put the 64-bit file length in *bits* at the end of the buffer. */ 109 1.1 christos ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); 110 1.1 christos ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); 111 1.1 christos 112 1.1 christos memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); 113 1.1 christos 114 1.1 christos /* Process last bytes. */ 115 1.1 christos sha1_process_block (ctx->buffer, size * 4, ctx); 116 1.1 christos 117 1.1 christos return sha1_read_ctx (ctx, resbuf); 118 1.1 christos } 119 1.1 christos 120 1.1 christos /* Compute SHA1 message digest for bytes read from STREAM. The 121 1.1 christos resulting message digest number will be written into the 16 bytes 122 1.1 christos beginning at RESBLOCK. */ 123 1.1 christos int 124 1.1 christos sha1_stream (FILE *stream, void *resblock) 125 1.1 christos { 126 1.1 christos struct sha1_ctx ctx; 127 1.1 christos char buffer[BLOCKSIZE + 72]; 128 1.1 christos size_t sum; 129 1.1 christos 130 1.1 christos /* Initialize the computation context. */ 131 1.1 christos sha1_init_ctx (&ctx); 132 1.1 christos 133 1.1 christos /* Iterate over full file contents. */ 134 1.1 christos while (1) 135 1.1 christos { 136 1.1 christos /* We read the file in blocks of BLOCKSIZE bytes. One call of the 137 1.1 christos computation function processes the whole buffer so that with the 138 1.1 christos next round of the loop another block can be read. */ 139 1.1 christos size_t n; 140 1.1 christos sum = 0; 141 1.1 christos 142 1.1 christos /* Read block. Take care for partial reads. */ 143 1.1 christos while (1) 144 1.1 christos { 145 1.1 christos n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); 146 1.1 christos 147 1.1 christos sum += n; 148 1.1 christos 149 1.1 christos if (sum == BLOCKSIZE) 150 1.1 christos break; 151 1.1 christos 152 1.1 christos if (n == 0) 153 1.1 christos { 154 1.1 christos /* Check for the error flag IFF N == 0, so that we don't 155 1.1 christos exit the loop after a partial read due to e.g., EAGAIN 156 1.1 christos or EWOULDBLOCK. */ 157 1.1 christos if (ferror (stream)) 158 1.1 christos return 1; 159 1.1 christos goto process_partial_block; 160 1.1 christos } 161 1.1 christos 162 1.1 christos /* We've read at least one byte, so ignore errors. But always 163 1.1 christos check for EOF, since feof may be true even though N > 0. 164 1.1 christos Otherwise, we could end up calling fread after EOF. */ 165 1.1 christos if (feof (stream)) 166 1.1 christos goto process_partial_block; 167 1.1 christos } 168 1.1 christos 169 1.1 christos /* Process buffer with BLOCKSIZE bytes. Note that 170 1.1 christos BLOCKSIZE % 64 == 0 171 1.1 christos */ 172 1.1 christos sha1_process_block (buffer, BLOCKSIZE, &ctx); 173 1.1 christos } 174 1.1 christos 175 1.1 christos process_partial_block:; 176 1.1 christos 177 1.1 christos /* Process any remaining bytes. */ 178 1.1 christos if (sum > 0) 179 1.1 christos sha1_process_bytes (buffer, sum, &ctx); 180 1.1 christos 181 1.1 christos /* Construct result in desired memory. */ 182 1.1 christos sha1_finish_ctx (&ctx, resblock); 183 1.1 christos return 0; 184 1.1 christos } 185 1.1 christos 186 1.1 christos /* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The 187 1.1 christos result is always in little endian byte order, so that a byte-wise 188 1.1 christos output yields to the wanted ASCII representation of the message 189 1.1 christos digest. */ 190 1.1 christos void * 191 1.1 christos sha1_buffer (const char *buffer, size_t len, void *resblock) 192 1.1 christos { 193 1.1 christos struct sha1_ctx ctx; 194 1.1 christos 195 1.1 christos /* Initialize the computation context. */ 196 1.1 christos sha1_init_ctx (&ctx); 197 1.1 christos 198 1.1 christos /* Process whole buffer but last len % 64 bytes. */ 199 1.1 christos sha1_process_bytes (buffer, len, &ctx); 200 1.1 christos 201 1.1 christos /* Put result in desired memory area. */ 202 1.1 christos return sha1_finish_ctx (&ctx, resblock); 203 1.1 christos } 204 1.1 christos 205 1.1 christos void 206 1.1 christos sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx) 207 1.1 christos { 208 1.1 christos /* When we already have some bits in our internal buffer concatenate 209 1.1 christos both inputs first. */ 210 1.1 christos if (ctx->buflen != 0) 211 1.1 christos { 212 1.1 christos size_t left_over = ctx->buflen; 213 1.1 christos size_t add = 128 - left_over > len ? len : 128 - left_over; 214 1.1 christos 215 1.1 christos memcpy (&((char *) ctx->buffer)[left_over], buffer, add); 216 1.1 christos ctx->buflen += add; 217 1.1 christos 218 1.1 christos if (ctx->buflen > 64) 219 1.1 christos { 220 1.1 christos sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx); 221 1.1 christos 222 1.1 christos ctx->buflen &= 63; 223 1.1 christos /* The regions in the following copy operation cannot overlap. */ 224 1.1 christos memcpy (ctx->buffer, 225 1.1 christos &((char *) ctx->buffer)[(left_over + add) & ~63], 226 1.1 christos ctx->buflen); 227 1.1 christos } 228 1.1 christos 229 1.1 christos buffer = (const char *) buffer + add; 230 1.1 christos len -= add; 231 1.1 christos } 232 1.1 christos 233 1.1 christos /* Process available complete blocks. */ 234 1.1 christos if (len >= 64) 235 1.1 christos { 236 1.1 christos #if !_STRING_ARCH_unaligned 237 1.1 christos # define alignof(type) offsetof (struct { char c; type x; }, x) 238 1.1 christos # define UNALIGNED_P(p) (((size_t) p) % alignof (sha1_uint32) != 0) 239 1.1 christos if (UNALIGNED_P (buffer)) 240 1.1 christos while (len > 64) 241 1.1 christos { 242 1.1 christos sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); 243 1.1 christos buffer = (const char *) buffer + 64; 244 1.1 christos len -= 64; 245 1.1 christos } 246 1.1 christos else 247 1.1 christos #endif 248 1.1 christos { 249 1.1 christos sha1_process_block (buffer, len & ~63, ctx); 250 1.1 christos buffer = (const char *) buffer + (len & ~63); 251 1.1 christos len &= 63; 252 1.1 christos } 253 1.1 christos } 254 1.1 christos 255 1.1 christos /* Move remaining bytes in internal buffer. */ 256 1.1 christos if (len > 0) 257 1.1 christos { 258 1.1 christos size_t left_over = ctx->buflen; 259 1.1 christos 260 1.1 christos memcpy (&((char *) ctx->buffer)[left_over], buffer, len); 261 1.1 christos left_over += len; 262 1.1 christos if (left_over >= 64) 263 1.1 christos { 264 1.1 christos sha1_process_block (ctx->buffer, 64, ctx); 265 1.1 christos left_over -= 64; 266 1.1.1.6 christos memmove (ctx->buffer, &ctx->buffer[16], left_over); 267 1.1 christos } 268 1.1 christos ctx->buflen = left_over; 269 1.1 christos } 270 1.1 christos } 271 1.1 christos 272 1.1 christos /* --- Code below is the primary difference between md5.c and sha1.c --- */ 273 1.1 christos 274 1.1 christos /* SHA1 round constants */ 275 1.1 christos #define K1 0x5a827999 276 1.1 christos #define K2 0x6ed9eba1 277 1.1 christos #define K3 0x8f1bbcdc 278 1.1 christos #define K4 0xca62c1d6 279 1.1 christos 280 1.1 christos /* Round functions. Note that F2 is the same as F4. */ 281 1.1 christos #define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) ) 282 1.1 christos #define F2(B,C,D) (B ^ C ^ D) 283 1.1 christos #define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) ) 284 1.1 christos #define F4(B,C,D) (B ^ C ^ D) 285 1.1 christos 286 1.1 christos /* Process LEN bytes of BUFFER, accumulating context into CTX. 287 1.1 christos It is assumed that LEN % 64 == 0. 288 1.1 christos Most of this code comes from GnuPG's cipher/sha1.c. */ 289 1.1 christos 290 1.1 christos void 291 1.1 christos sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx) 292 1.1 christos { 293 1.1 christos const sha1_uint32 *words = (const sha1_uint32*) buffer; 294 1.1 christos size_t nwords = len / sizeof (sha1_uint32); 295 1.1 christos const sha1_uint32 *endp = words + nwords; 296 1.1 christos sha1_uint32 x[16]; 297 1.1 christos sha1_uint32 a = ctx->A; 298 1.1 christos sha1_uint32 b = ctx->B; 299 1.1 christos sha1_uint32 c = ctx->C; 300 1.1 christos sha1_uint32 d = ctx->D; 301 1.1 christos sha1_uint32 e = ctx->E; 302 1.1 christos 303 1.1 christos /* First increment the byte count. RFC 1321 specifies the possible 304 1.1 christos length of the file up to 2^64 bits. Here we only compute the 305 1.1 christos number of bytes. Do a double word increment. */ 306 1.1 christos ctx->total[0] += len; 307 1.1.1.2 christos ctx->total[1] += ((len >> 31) >> 1) + (ctx->total[0] < len); 308 1.1 christos 309 1.1 christos #define rol(x, n) (((x) << (n)) | ((sha1_uint32) (x) >> (32 - (n)))) 310 1.1 christos 311 1.1 christos #define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \ 312 1.1 christos ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \ 313 1.1 christos , (x[I&0x0f] = rol(tm, 1)) ) 314 1.1 christos 315 1.1 christos #define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \ 316 1.1 christos + F( B, C, D ) \ 317 1.1 christos + K \ 318 1.1 christos + M; \ 319 1.1 christos B = rol( B, 30 ); \ 320 1.1 christos } while(0) 321 1.1 christos 322 1.1 christos while (words < endp) 323 1.1 christos { 324 1.1 christos sha1_uint32 tm; 325 1.1 christos int t; 326 1.1 christos for (t = 0; t < 16; t++) 327 1.1 christos { 328 1.1 christos x[t] = SWAP (*words); 329 1.1 christos words++; 330 1.1 christos } 331 1.1 christos 332 1.1 christos R( a, b, c, d, e, F1, K1, x[ 0] ); 333 1.1 christos R( e, a, b, c, d, F1, K1, x[ 1] ); 334 1.1 christos R( d, e, a, b, c, F1, K1, x[ 2] ); 335 1.1 christos R( c, d, e, a, b, F1, K1, x[ 3] ); 336 1.1 christos R( b, c, d, e, a, F1, K1, x[ 4] ); 337 1.1 christos R( a, b, c, d, e, F1, K1, x[ 5] ); 338 1.1 christos R( e, a, b, c, d, F1, K1, x[ 6] ); 339 1.1 christos R( d, e, a, b, c, F1, K1, x[ 7] ); 340 1.1 christos R( c, d, e, a, b, F1, K1, x[ 8] ); 341 1.1 christos R( b, c, d, e, a, F1, K1, x[ 9] ); 342 1.1 christos R( a, b, c, d, e, F1, K1, x[10] ); 343 1.1 christos R( e, a, b, c, d, F1, K1, x[11] ); 344 1.1 christos R( d, e, a, b, c, F1, K1, x[12] ); 345 1.1 christos R( c, d, e, a, b, F1, K1, x[13] ); 346 1.1 christos R( b, c, d, e, a, F1, K1, x[14] ); 347 1.1 christos R( a, b, c, d, e, F1, K1, x[15] ); 348 1.1 christos R( e, a, b, c, d, F1, K1, M(16) ); 349 1.1 christos R( d, e, a, b, c, F1, K1, M(17) ); 350 1.1 christos R( c, d, e, a, b, F1, K1, M(18) ); 351 1.1 christos R( b, c, d, e, a, F1, K1, M(19) ); 352 1.1 christos R( a, b, c, d, e, F2, K2, M(20) ); 353 1.1 christos R( e, a, b, c, d, F2, K2, M(21) ); 354 1.1 christos R( d, e, a, b, c, F2, K2, M(22) ); 355 1.1 christos R( c, d, e, a, b, F2, K2, M(23) ); 356 1.1 christos R( b, c, d, e, a, F2, K2, M(24) ); 357 1.1 christos R( a, b, c, d, e, F2, K2, M(25) ); 358 1.1 christos R( e, a, b, c, d, F2, K2, M(26) ); 359 1.1 christos R( d, e, a, b, c, F2, K2, M(27) ); 360 1.1 christos R( c, d, e, a, b, F2, K2, M(28) ); 361 1.1 christos R( b, c, d, e, a, F2, K2, M(29) ); 362 1.1 christos R( a, b, c, d, e, F2, K2, M(30) ); 363 1.1 christos R( e, a, b, c, d, F2, K2, M(31) ); 364 1.1 christos R( d, e, a, b, c, F2, K2, M(32) ); 365 1.1 christos R( c, d, e, a, b, F2, K2, M(33) ); 366 1.1 christos R( b, c, d, e, a, F2, K2, M(34) ); 367 1.1 christos R( a, b, c, d, e, F2, K2, M(35) ); 368 1.1 christos R( e, a, b, c, d, F2, K2, M(36) ); 369 1.1 christos R( d, e, a, b, c, F2, K2, M(37) ); 370 1.1 christos R( c, d, e, a, b, F2, K2, M(38) ); 371 1.1 christos R( b, c, d, e, a, F2, K2, M(39) ); 372 1.1 christos R( a, b, c, d, e, F3, K3, M(40) ); 373 1.1 christos R( e, a, b, c, d, F3, K3, M(41) ); 374 1.1 christos R( d, e, a, b, c, F3, K3, M(42) ); 375 1.1 christos R( c, d, e, a, b, F3, K3, M(43) ); 376 1.1 christos R( b, c, d, e, a, F3, K3, M(44) ); 377 1.1 christos R( a, b, c, d, e, F3, K3, M(45) ); 378 1.1 christos R( e, a, b, c, d, F3, K3, M(46) ); 379 1.1 christos R( d, e, a, b, c, F3, K3, M(47) ); 380 1.1 christos R( c, d, e, a, b, F3, K3, M(48) ); 381 1.1 christos R( b, c, d, e, a, F3, K3, M(49) ); 382 1.1 christos R( a, b, c, d, e, F3, K3, M(50) ); 383 1.1 christos R( e, a, b, c, d, F3, K3, M(51) ); 384 1.1 christos R( d, e, a, b, c, F3, K3, M(52) ); 385 1.1 christos R( c, d, e, a, b, F3, K3, M(53) ); 386 1.1 christos R( b, c, d, e, a, F3, K3, M(54) ); 387 1.1 christos R( a, b, c, d, e, F3, K3, M(55) ); 388 1.1 christos R( e, a, b, c, d, F3, K3, M(56) ); 389 1.1 christos R( d, e, a, b, c, F3, K3, M(57) ); 390 1.1 christos R( c, d, e, a, b, F3, K3, M(58) ); 391 1.1 christos R( b, c, d, e, a, F3, K3, M(59) ); 392 1.1 christos R( a, b, c, d, e, F4, K4, M(60) ); 393 1.1 christos R( e, a, b, c, d, F4, K4, M(61) ); 394 1.1 christos R( d, e, a, b, c, F4, K4, M(62) ); 395 1.1 christos R( c, d, e, a, b, F4, K4, M(63) ); 396 1.1 christos R( b, c, d, e, a, F4, K4, M(64) ); 397 1.1 christos R( a, b, c, d, e, F4, K4, M(65) ); 398 1.1 christos R( e, a, b, c, d, F4, K4, M(66) ); 399 1.1 christos R( d, e, a, b, c, F4, K4, M(67) ); 400 1.1 christos R( c, d, e, a, b, F4, K4, M(68) ); 401 1.1 christos R( b, c, d, e, a, F4, K4, M(69) ); 402 1.1 christos R( a, b, c, d, e, F4, K4, M(70) ); 403 1.1 christos R( e, a, b, c, d, F4, K4, M(71) ); 404 1.1 christos R( d, e, a, b, c, F4, K4, M(72) ); 405 1.1 christos R( c, d, e, a, b, F4, K4, M(73) ); 406 1.1 christos R( b, c, d, e, a, F4, K4, M(74) ); 407 1.1 christos R( a, b, c, d, e, F4, K4, M(75) ); 408 1.1 christos R( e, a, b, c, d, F4, K4, M(76) ); 409 1.1 christos R( d, e, a, b, c, F4, K4, M(77) ); 410 1.1 christos R( c, d, e, a, b, F4, K4, M(78) ); 411 1.1 christos R( b, c, d, e, a, F4, K4, M(79) ); 412 1.1 christos 413 1.1 christos a = ctx->A += a; 414 1.1 christos b = ctx->B += b; 415 1.1 christos c = ctx->C += c; 416 1.1 christos d = ctx->D += d; 417 1.1 christos e = ctx->E += e; 418 1.1 christos } 419 1.1 christos } 420 1.1.1.7 christos 421 1.1.1.7 christos #if defined(HAVE_X86_SHA1_HW_SUPPORT) 422 1.1.1.7 christos /* HW specific version of sha1_process_bytes. */ 423 1.1.1.7 christos 424 1.1.1.7 christos static void sha1_hw_process_block (const void *, size_t, struct sha1_ctx *); 425 1.1.1.7 christos 426 1.1.1.7 christos static void 427 1.1.1.7 christos sha1_hw_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx) 428 1.1.1.7 christos { 429 1.1.1.7 christos /* When we already have some bits in our internal buffer concatenate 430 1.1.1.7 christos both inputs first. */ 431 1.1.1.7 christos if (ctx->buflen != 0) 432 1.1.1.7 christos { 433 1.1.1.7 christos size_t left_over = ctx->buflen; 434 1.1.1.7 christos size_t add = 128 - left_over > len ? len : 128 - left_over; 435 1.1.1.7 christos 436 1.1.1.7 christos memcpy (&((char *) ctx->buffer)[left_over], buffer, add); 437 1.1.1.7 christos ctx->buflen += add; 438 1.1.1.7 christos 439 1.1.1.7 christos if (ctx->buflen > 64) 440 1.1.1.7 christos { 441 1.1.1.7 christos sha1_hw_process_block (ctx->buffer, ctx->buflen & ~63, ctx); 442 1.1.1.7 christos 443 1.1.1.7 christos ctx->buflen &= 63; 444 1.1.1.7 christos /* The regions in the following copy operation cannot overlap. */ 445 1.1.1.7 christos memcpy (ctx->buffer, 446 1.1.1.7 christos &((char *) ctx->buffer)[(left_over + add) & ~63], 447 1.1.1.7 christos ctx->buflen); 448 1.1.1.7 christos } 449 1.1.1.7 christos 450 1.1.1.7 christos buffer = (const char *) buffer + add; 451 1.1.1.7 christos len -= add; 452 1.1.1.7 christos } 453 1.1.1.7 christos 454 1.1.1.7 christos /* Process available complete blocks. */ 455 1.1.1.7 christos if (len >= 64) 456 1.1.1.7 christos { 457 1.1.1.7 christos #if !_STRING_ARCH_unaligned 458 1.1.1.7 christos # define alignof(type) offsetof (struct { char c; type x; }, x) 459 1.1.1.7 christos # define UNALIGNED_P(p) (((size_t) p) % alignof (sha1_uint32) != 0) 460 1.1.1.7 christos if (UNALIGNED_P (buffer)) 461 1.1.1.7 christos while (len > 64) 462 1.1.1.7 christos { 463 1.1.1.7 christos sha1_hw_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); 464 1.1.1.7 christos buffer = (const char *) buffer + 64; 465 1.1.1.7 christos len -= 64; 466 1.1.1.7 christos } 467 1.1.1.7 christos else 468 1.1.1.7 christos #endif 469 1.1.1.7 christos { 470 1.1.1.7 christos sha1_hw_process_block (buffer, len & ~63, ctx); 471 1.1.1.7 christos buffer = (const char *) buffer + (len & ~63); 472 1.1.1.7 christos len &= 63; 473 1.1.1.7 christos } 474 1.1.1.7 christos } 475 1.1.1.7 christos 476 1.1.1.7 christos /* Move remaining bytes in internal buffer. */ 477 1.1.1.7 christos if (len > 0) 478 1.1.1.7 christos { 479 1.1.1.7 christos size_t left_over = ctx->buflen; 480 1.1.1.7 christos 481 1.1.1.7 christos memcpy (&((char *) ctx->buffer)[left_over], buffer, len); 482 1.1.1.7 christos left_over += len; 483 1.1.1.7 christos if (left_over >= 64) 484 1.1.1.7 christos { 485 1.1.1.7 christos sha1_hw_process_block (ctx->buffer, 64, ctx); 486 1.1.1.7 christos left_over -= 64; 487 1.1.1.7 christos memmove (ctx->buffer, &ctx->buffer[16], left_over); 488 1.1.1.7 christos } 489 1.1.1.7 christos ctx->buflen = left_over; 490 1.1.1.7 christos } 491 1.1.1.7 christos } 492 1.1.1.7 christos 493 1.1.1.7 christos /* Process LEN bytes of BUFFER, accumulating context into CTX. 494 1.1.1.7 christos Using CPU specific intrinsics. */ 495 1.1.1.7 christos 496 1.1.1.7 christos #ifdef HAVE_X86_SHA1_HW_SUPPORT 497 1.1.1.7 christos __attribute__((__target__ ("sse4.1,sha"))) 498 1.1.1.7 christos #endif 499 1.1.1.7 christos static void 500 1.1.1.7 christos sha1_hw_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx) 501 1.1.1.7 christos { 502 1.1.1.7 christos #ifdef HAVE_X86_SHA1_HW_SUPPORT 503 1.1.1.7 christos /* Implemented from 504 1.1.1.7 christos https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sha-extensions.html */ 505 1.1.1.7 christos const __m128i *words = (const __m128i *) buffer; 506 1.1.1.7 christos const __m128i *endp = (const __m128i *) ((const char *) buffer + len); 507 1.1.1.7 christos __m128i abcd, abcd_save, e0, e0_save, e1, msg0, msg1, msg2, msg3; 508 1.1.1.7 christos const __m128i shuf_mask 509 1.1.1.7 christos = _mm_set_epi64x (0x0001020304050607ULL, 0x08090a0b0c0d0e0fULL); 510 1.1.1.7 christos char check[((offsetof (struct sha1_ctx, B) 511 1.1.1.7 christos == offsetof (struct sha1_ctx, A) + sizeof (ctx->A)) 512 1.1.1.7 christos && (offsetof (struct sha1_ctx, C) 513 1.1.1.7 christos == offsetof (struct sha1_ctx, A) + 2 * sizeof (ctx->A)) 514 1.1.1.7 christos && (offsetof (struct sha1_ctx, D) 515 1.1.1.7 christos == offsetof (struct sha1_ctx, A) + 3 * sizeof (ctx->A))) 516 1.1.1.7 christos ? 1 : -1]; 517 1.1.1.7 christos 518 1.1.1.7 christos /* First increment the byte count. RFC 1321 specifies the possible 519 1.1.1.7 christos length of the file up to 2^64 bits. Here we only compute the 520 1.1.1.7 christos number of bytes. Do a double word increment. */ 521 1.1.1.7 christos ctx->total[0] += len; 522 1.1.1.7 christos ctx->total[1] += ((len >> 31) >> 1) + (ctx->total[0] < len); 523 1.1.1.7 christos 524 1.1.1.7 christos (void) &check[0]; 525 1.1.1.7 christos abcd = _mm_loadu_si128 ((const __m128i *) &ctx->A); 526 1.1.1.7 christos e0 = _mm_set_epi32 (ctx->E, 0, 0, 0); 527 1.1.1.7 christos abcd = _mm_shuffle_epi32 (abcd, 0x1b); /* 0, 1, 2, 3 */ 528 1.1.1.7 christos 529 1.1.1.7 christos while (words < endp) 530 1.1.1.7 christos { 531 1.1.1.7 christos abcd_save = abcd; 532 1.1.1.7 christos e0_save = e0; 533 1.1.1.7 christos 534 1.1.1.7 christos /* 0..3 */ 535 1.1.1.7 christos msg0 = _mm_loadu_si128 (words); 536 1.1.1.7 christos msg0 = _mm_shuffle_epi8 (msg0, shuf_mask); 537 1.1.1.7 christos e0 = _mm_add_epi32 (e0, msg0); 538 1.1.1.7 christos e1 = abcd; 539 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 0); 540 1.1.1.7 christos 541 1.1.1.7 christos /* 4..7 */ 542 1.1.1.7 christos msg1 = _mm_loadu_si128 (words + 1); 543 1.1.1.7 christos msg1 = _mm_shuffle_epi8 (msg1, shuf_mask); 544 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg1); 545 1.1.1.7 christos e0 = abcd; 546 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 0); 547 1.1.1.7 christos msg0 = _mm_sha1msg1_epu32 (msg0, msg1); 548 1.1.1.7 christos 549 1.1.1.7 christos /* 8..11 */ 550 1.1.1.7 christos msg2 = _mm_loadu_si128 (words + 2); 551 1.1.1.7 christos msg2 = _mm_shuffle_epi8 (msg2, shuf_mask); 552 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg2); 553 1.1.1.7 christos e1 = abcd; 554 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 0); 555 1.1.1.7 christos msg1 = _mm_sha1msg1_epu32 (msg1, msg2); 556 1.1.1.7 christos msg0 = _mm_xor_si128 (msg0, msg2); 557 1.1.1.7 christos 558 1.1.1.7 christos /* 12..15 */ 559 1.1.1.7 christos msg3 = _mm_loadu_si128 (words + 3); 560 1.1.1.7 christos msg3 = _mm_shuffle_epi8 (msg3, shuf_mask); 561 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg3); 562 1.1.1.7 christos e0 = abcd; 563 1.1.1.7 christos msg0 = _mm_sha1msg2_epu32 (msg0, msg3); 564 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 0); 565 1.1.1.7 christos msg2 = _mm_sha1msg1_epu32 (msg2, msg3); 566 1.1.1.7 christos msg1 = _mm_xor_si128 (msg1, msg3); 567 1.1.1.7 christos 568 1.1.1.7 christos /* 16..19 */ 569 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg0); 570 1.1.1.7 christos e1 = abcd; 571 1.1.1.7 christos msg1 = _mm_sha1msg2_epu32 (msg1, msg0); 572 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 0); 573 1.1.1.7 christos msg3 = _mm_sha1msg1_epu32 (msg3, msg0); 574 1.1.1.7 christos msg2 = _mm_xor_si128 (msg2, msg0); 575 1.1.1.7 christos 576 1.1.1.7 christos /* 20..23 */ 577 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg1); 578 1.1.1.7 christos e0 = abcd; 579 1.1.1.7 christos msg2 = _mm_sha1msg2_epu32 (msg2, msg1); 580 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 1); 581 1.1.1.7 christos msg0 = _mm_sha1msg1_epu32 (msg0, msg1); 582 1.1.1.7 christos msg3 = _mm_xor_si128 (msg3, msg1); 583 1.1.1.7 christos 584 1.1.1.7 christos /* 24..27 */ 585 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg2); 586 1.1.1.7 christos e1 = abcd; 587 1.1.1.7 christos msg3 = _mm_sha1msg2_epu32 (msg3, msg2); 588 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 1); 589 1.1.1.7 christos msg1 = _mm_sha1msg1_epu32 (msg1, msg2); 590 1.1.1.7 christos msg0 = _mm_xor_si128 (msg0, msg2); 591 1.1.1.7 christos 592 1.1.1.7 christos /* 28..31 */ 593 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg3); 594 1.1.1.7 christos e0 = abcd; 595 1.1.1.7 christos msg0 = _mm_sha1msg2_epu32 (msg0, msg3); 596 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 1); 597 1.1.1.7 christos msg2 = _mm_sha1msg1_epu32 (msg2, msg3); 598 1.1.1.7 christos msg1 = _mm_xor_si128 (msg1, msg3); 599 1.1.1.7 christos 600 1.1.1.7 christos /* 32..35 */ 601 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg0); 602 1.1.1.7 christos e1 = abcd; 603 1.1.1.7 christos msg1 = _mm_sha1msg2_epu32 (msg1, msg0); 604 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 1); 605 1.1.1.7 christos msg3 = _mm_sha1msg1_epu32 (msg3, msg0); 606 1.1.1.7 christos msg2 = _mm_xor_si128 (msg2, msg0); 607 1.1.1.7 christos 608 1.1.1.7 christos /* 36..39 */ 609 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg1); 610 1.1.1.7 christos e0 = abcd; 611 1.1.1.7 christos msg2 = _mm_sha1msg2_epu32 (msg2, msg1); 612 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 1); 613 1.1.1.7 christos msg0 = _mm_sha1msg1_epu32 (msg0, msg1); 614 1.1.1.7 christos msg3 = _mm_xor_si128 (msg3, msg1); 615 1.1.1.7 christos 616 1.1.1.7 christos /* 40..43 */ 617 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg2); 618 1.1.1.7 christos e1 = abcd; 619 1.1.1.7 christos msg3 = _mm_sha1msg2_epu32 (msg3, msg2); 620 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 2); 621 1.1.1.7 christos msg1 = _mm_sha1msg1_epu32 (msg1, msg2); 622 1.1.1.7 christos msg0 = _mm_xor_si128 (msg0, msg2); 623 1.1.1.7 christos 624 1.1.1.7 christos /* 44..47 */ 625 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg3); 626 1.1.1.7 christos e0 = abcd; 627 1.1.1.7 christos msg0 = _mm_sha1msg2_epu32 (msg0, msg3); 628 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 2); 629 1.1.1.7 christos msg2 = _mm_sha1msg1_epu32 (msg2, msg3); 630 1.1.1.7 christos msg1 = _mm_xor_si128 (msg1, msg3); 631 1.1.1.7 christos 632 1.1.1.7 christos /* 48..51 */ 633 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg0); 634 1.1.1.7 christos e1 = abcd; 635 1.1.1.7 christos msg1 = _mm_sha1msg2_epu32 (msg1, msg0); 636 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 2); 637 1.1.1.7 christos msg3 = _mm_sha1msg1_epu32 (msg3, msg0); 638 1.1.1.7 christos msg2 = _mm_xor_si128 (msg2, msg0); 639 1.1.1.7 christos 640 1.1.1.7 christos /* 52..55 */ 641 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg1); 642 1.1.1.7 christos e0 = abcd; 643 1.1.1.7 christos msg2 = _mm_sha1msg2_epu32 (msg2, msg1); 644 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 2); 645 1.1.1.7 christos msg0 = _mm_sha1msg1_epu32 (msg0, msg1); 646 1.1.1.7 christos msg3 = _mm_xor_si128 (msg3, msg1); 647 1.1.1.7 christos 648 1.1.1.7 christos /* 56..59 */ 649 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg2); 650 1.1.1.7 christos e1 = abcd; 651 1.1.1.7 christos msg3 = _mm_sha1msg2_epu32 (msg3, msg2); 652 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 2); 653 1.1.1.7 christos msg1 = _mm_sha1msg1_epu32 (msg1, msg2); 654 1.1.1.7 christos msg0 = _mm_xor_si128 (msg0, msg2); 655 1.1.1.7 christos 656 1.1.1.7 christos /* 60..63 */ 657 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg3); 658 1.1.1.7 christos e0 = abcd; 659 1.1.1.7 christos msg0 = _mm_sha1msg2_epu32 (msg0, msg3); 660 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 3); 661 1.1.1.7 christos msg2 = _mm_sha1msg1_epu32 (msg2, msg3); 662 1.1.1.7 christos msg1 = _mm_xor_si128 (msg1, msg3); 663 1.1.1.7 christos 664 1.1.1.7 christos /* 64..67 */ 665 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg0); 666 1.1.1.7 christos e1 = abcd; 667 1.1.1.7 christos msg1 = _mm_sha1msg2_epu32 (msg1, msg0); 668 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 3); 669 1.1.1.7 christos msg3 = _mm_sha1msg1_epu32 (msg3, msg0); 670 1.1.1.7 christos msg2 = _mm_xor_si128 (msg2, msg0); 671 1.1.1.7 christos 672 1.1.1.7 christos /* 68..71 */ 673 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg1); 674 1.1.1.7 christos e0 = abcd; 675 1.1.1.7 christos msg2 = _mm_sha1msg2_epu32 (msg2, msg1); 676 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 3); 677 1.1.1.7 christos msg3 = _mm_xor_si128 (msg3, msg1); 678 1.1.1.7 christos 679 1.1.1.7 christos /* 72..75 */ 680 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, msg2); 681 1.1.1.7 christos e1 = abcd; 682 1.1.1.7 christos msg3 = _mm_sha1msg2_epu32 (msg3, msg2); 683 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e0, 3); 684 1.1.1.7 christos 685 1.1.1.7 christos /* 76..79 */ 686 1.1.1.7 christos e1 = _mm_sha1nexte_epu32 (e1, msg3); 687 1.1.1.7 christos e0 = abcd; 688 1.1.1.7 christos abcd = _mm_sha1rnds4_epu32 (abcd, e1, 3); 689 1.1.1.7 christos 690 1.1.1.7 christos /* Finalize. */ 691 1.1.1.7 christos e0 = _mm_sha1nexte_epu32 (e0, e0_save); 692 1.1.1.7 christos abcd = _mm_add_epi32 (abcd, abcd_save); 693 1.1.1.7 christos 694 1.1.1.7 christos words = words + 4; 695 1.1.1.7 christos } 696 1.1.1.7 christos 697 1.1.1.7 christos abcd = _mm_shuffle_epi32 (abcd, 0x1b); /* 0, 1, 2, 3 */ 698 1.1.1.7 christos _mm_storeu_si128 ((__m128i *) &ctx->A, abcd); 699 1.1.1.7 christos ctx->E = _mm_extract_epi32 (e0, 3); 700 1.1.1.7 christos #endif 701 1.1.1.7 christos } 702 1.1.1.7 christos #endif 703 1.1.1.7 christos 704 1.1.1.7 christos /* Return sha1_process_bytes or some hardware optimized version thereof 705 1.1.1.7 christos depending on current CPU. */ 706 1.1.1.7 christos 707 1.1.1.7 christos sha1_process_bytes_fn 708 1.1.1.7 christos sha1_choose_process_bytes (void) 709 1.1.1.7 christos { 710 1.1.1.7 christos #ifdef HAVE_X86_SHA1_HW_SUPPORT 711 1.1.1.7 christos unsigned int eax, ebx, ecx, edx; 712 1.1.1.7 christos if (__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx) 713 1.1.1.7 christos && (ebx & bit_SHA) != 0 714 1.1.1.7 christos && __get_cpuid (1, &eax, &ebx, &ecx, &edx) 715 1.1.1.7 christos && (ecx & bit_SSE4_1) != 0) 716 1.1.1.7 christos return sha1_hw_process_bytes; 717 1.1.1.7 christos #endif 718 1.1.1.7 christos return sha1_process_bytes; 719 1.1.1.7 christos } 720