125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Functions to compute SHA1 message digest of files or memory blocks.
225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   according to the definition of SHA1 in FIPS 180-1 from April 1997.
325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Copyright (C) 2008-2011 Red Hat, Inc.
425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   This file is part of Red Hat elfutils.
525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Written by Ulrich Drepper <drepper@redhat.com>, 2008.
625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   it under the terms of the GNU General Public License as published by the
925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Free Software Foundation; version 2 of the License.
1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
1225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
1325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   General Public License for more details.
1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   You should have received a copy of the GNU General Public License along
1725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
1925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Red Hat elfutils is an included package of the Open Invention Network.
2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   An included package of the Open Invention Network is a package for which
2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Open Invention Network licensees cross-license their patents.  No patent
2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   license is granted, either expressly or impliedly, by designation as an
2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   included package.  Should you wish to participate in the Open Invention
2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Network licensing program, please visit www.openinventionnetwork.com
2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   <http://www.openinventionnetwork.com>.  */
2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef HAVE_CONFIG_H
2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# include <config.h>
3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdlib.h>
3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <string.h>
3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <sys/types.h>
3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "sha1.h"
3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "system.h"
3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SWAP(n) BE32 (n)
4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* This array contains the bytes used to pad the buffer to the next
4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   64-byte boundary.  */
4325b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ };
4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Initialize structure containing state of computation.  */
4725b3c049e70834cf33790a28643ab058b507b35cBen Chengvoid
4825b3c049e70834cf33790a28643ab058b507b35cBen Chengsha1_init_ctx (ctx)
4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng     struct sha1_ctx *ctx;
5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->A = 0x67452301;
5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->B = 0xefcdab89;
5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->C = 0x98badcfe;
5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->D = 0x10325476;
5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->E = 0xc3d2e1f0;
5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->total[0] = ctx->total[1] = 0;
5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->buflen = 0;
5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Put result from CTX in first 20 bytes following RESBUF.  The result
6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   must be in little endian byte order.
6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   IMPORTANT: On some systems it is required that RESBUF is correctly
6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   aligned for a 32 bits value.  */
6625b3c049e70834cf33790a28643ab058b507b35cBen Chengvoid *
6725b3c049e70834cf33790a28643ab058b507b35cBen Chengsha1_read_ctx (ctx, resbuf)
6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng     const struct sha1_ctx *ctx;
6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng     void *resbuf;
7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((sha1_uint32 *) resbuf)[0] = SWAP (ctx->A);
7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((sha1_uint32 *) resbuf)[1] = SWAP (ctx->B);
7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((sha1_uint32 *) resbuf)[2] = SWAP (ctx->C);
7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((sha1_uint32 *) resbuf)[3] = SWAP (ctx->D);
7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((sha1_uint32 *) resbuf)[4] = SWAP (ctx->E);
7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return resbuf;
7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8025b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic void
8125b3c049e70834cf33790a28643ab058b507b35cBen Chengbe64_copy (char *dest, uint64_t x)
8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  for (size_t i = 8; i-- > 0; x >>= 8)
8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    dest[i] = (uint8_t) x;
8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Process the remaining bytes in the internal buffer and the usual
8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   prolog according to the standard and write the result to RESBUF.
8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   IMPORTANT: On some systems it is required that RESBUF is correctly
9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   aligned for a 32 bits value.  */
9225b3c049e70834cf33790a28643ab058b507b35cBen Chengvoid *
9325b3c049e70834cf33790a28643ab058b507b35cBen Chengsha1_finish_ctx (ctx, resbuf)
9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng     struct sha1_ctx *ctx;
9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng     void *resbuf;
9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Take yet unprocessed bytes into account.  */
9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_uint32 bytes = ctx->buflen;
9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  size_t pad;
10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Now count remaining bytes.  */
10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->total[0] += bytes;
10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (ctx->total[0] < bytes)
10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    ++ctx->total[1];
10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  memcpy (&ctx->buffer[bytes], fillbuf, pad);
10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Put the 64-bit file length in *bits* at the end of the buffer.  */
11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  const uint64_t bit_length = ((ctx->total[0] << 3)
11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng			       + ((uint64_t) ((ctx->total[1] << 3) |
11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng					      (ctx->total[0] >> 29)) << 32));
11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  be64_copy (&ctx->buffer[bytes + pad], bit_length);
11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Process last bytes.  */
11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_process_block (ctx->buffer, bytes + pad + 8, ctx);
11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return sha1_read_ctx (ctx, resbuf);
11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12225b3c049e70834cf33790a28643ab058b507b35cBen Chengvoid
12325b3c049e70834cf33790a28643ab058b507b35cBen Chengsha1_process_bytes (buffer, len, ctx)
12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng     const void *buffer;
12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng     size_t len;
12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng     struct sha1_ctx *ctx;
12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* When we already have some bits in our internal buffer concatenate
12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng     both inputs first.  */
13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (ctx->buflen != 0)
13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      size_t left_over = ctx->buflen;
13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      size_t add = 128 - left_over > len ? len : 128 - left_over;
13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      memcpy (&ctx->buffer[left_over], buffer, add);
13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      ctx->buflen += add;
13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (ctx->buflen > 64)
13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	{
14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  ctx->buflen &= 63;
14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  /* The regions in the following copy operation cannot overlap.  */
14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng		  ctx->buflen);
14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	}
14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      buffer = (const char *) buffer + add;
14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      len -= add;
15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Process available complete blocks.  */
15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (len >= 64)
15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#if !_STRING_ARCH_unaligned
15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* To check alignment gcc has an appropriate operator.  Other
15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   compilers don't.  */
15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# if __GNUC__ >= 2
15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#  define UNALIGNED_P(p) (((sha1_uintptr) p) % __alignof__ (sha1_uint32) != 0)
16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# else
16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#  define UNALIGNED_P(p) (((sha1_uintptr) p) % sizeof (sha1_uint32) != 0)
16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# endif
16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (UNALIGNED_P (buffer))
16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	while (len > 64)
16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  {
16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    buffer = (const char *) buffer + 64;
16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    len -= 64;
16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  }
17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      else
17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	{
17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  sha1_process_block (buffer, len & ~63, ctx);
17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  buffer = (const char *) buffer + (len & ~63);
17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  len &= 63;
17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	}
17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Move remaining bytes in internal buffer.  */
18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (len > 0)
18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      size_t left_over = ctx->buflen;
18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      memcpy (&ctx->buffer[left_over], buffer, len);
18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      left_over += len;
18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (left_over >= 64)
18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	{
18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  sha1_process_block (ctx->buffer, 64, ctx);
18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  left_over -= 64;
19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  memcpy (ctx->buffer, &ctx->buffer[64], left_over);
19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng	}
19225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      ctx->buflen = left_over;
19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
19525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* These are the four functions used in the four steps of the SHA1 algorithm
19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   and defined in the FIPS 180-1.  */
19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* #define FF(b, c, d) ((b & c) | (~b & d)) */
20025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FF(b, c, d) (d ^ (b & (c ^ d)))
20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FG(b, c, d) (b ^ c ^ d)
20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* define FH(b, c, d) ((b & c) | (b & d) | (c & d)) */
20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FH(b, c, d) (((b | c) & d) | (b & c))
20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* It is unfortunate that C does not provide an operator for cyclic
20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   rotation.  Hope the C compiler is smart enough.  */
20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define CYCLIC(w, s) (((w) << s) | ((w) >> (32 - s)))
20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Magic constants.  */
21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define K0 0x5a827999
21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define K1 0x6ed9eba1
21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define K2 0x8f1bbcdc
21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define K3 0xca62c1d6
21425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Process LEN bytes of BUFFER, accumulating context into CTX.
21725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   It is assumed that LEN % 64 == 0.  */
21825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21925b3c049e70834cf33790a28643ab058b507b35cBen Chengvoid
22025b3c049e70834cf33790a28643ab058b507b35cBen Chengsha1_process_block (buffer, len, ctx)
22125b3c049e70834cf33790a28643ab058b507b35cBen Cheng     const void *buffer;
22225b3c049e70834cf33790a28643ab058b507b35cBen Cheng     size_t len;
22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng     struct sha1_ctx *ctx;
22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
22525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_uint32 computed_words[16];
22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define W(i) computed_words[(i) % 16]
22725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  const sha1_uint32 *words = buffer;
22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  size_t nwords = len / sizeof (sha1_uint32);
22925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  const sha1_uint32 *endp = words + nwords;
23025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_uint32 A = ctx->A;
23125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_uint32 B = ctx->B;
23225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_uint32 C = ctx->C;
23325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_uint32 D = ctx->D;
23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  sha1_uint32 E = ctx->E;
23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
23625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* First increment the byte count.  FIPS 180-1 specifies the possible
23725b3c049e70834cf33790a28643ab058b507b35cBen Cheng     length of the file up to 2^64 bits.  Here we only compute the
23825b3c049e70834cf33790a28643ab058b507b35cBen Cheng     number of bytes.  Do a double word increment.  */
23925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->total[0] += len;
24025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (ctx->total[0] < len)
24125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    ++ctx->total[1];
24225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
24325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Process all bytes in the buffer with 64 bytes in each round of
24425b3c049e70834cf33790a28643ab058b507b35cBen Cheng     the loop.  */
24525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  while (words < endp)
24625b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
24725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      sha1_uint32 A_save = A;
24825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      sha1_uint32 B_save = B;
24925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      sha1_uint32 C_save = C;
25025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      sha1_uint32 D_save = D;
25125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      sha1_uint32 E_save = E;
25225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
25325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* First round: using the given function, the context and a constant
25425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 the next context is computed.  Because the algorithms processing
25525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 unit is a 32-bit word and it is determined to work on words in
25625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 little endian byte order we perhaps have to change the byte order
25725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 before the computation.  */
25825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
25925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define OP(i, a, b, c, d, e)						\
26025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      do								\
26125b3c049e70834cf33790a28643ab058b507b35cBen Cheng        {								\
26225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  W (i) = SWAP (*words);					\
26325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  e = CYCLIC (a, 5) + FF (b, c, d) + e + W (i) + K0;		\
26425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  ++words;							\
26525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  b = CYCLIC (b, 30);						\
26625b3c049e70834cf33790a28643ab058b507b35cBen Cheng        }								\
26725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      while (0)
26825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
26925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Steps 0 to 15.  */
27025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (0, A, B, C, D, E);
27125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (1, E, A, B, C, D);
27225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (2, D, E, A, B, C);
27325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (3, C, D, E, A, B);
27425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (4, B, C, D, E, A);
27525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (5, A, B, C, D, E);
27625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (6, E, A, B, C, D);
27725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (7, D, E, A, B, C);
27825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (8, C, D, E, A, B);
27925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (9, B, C, D, E, A);
28025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (10, A, B, C, D, E);
28125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (11, E, A, B, C, D);
28225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (12, D, E, A, B, C);
28325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (13, C, D, E, A, B);
28425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (14, B, C, D, E, A);
28525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (15, A, B, C, D, E);
28625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
28725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* For the remaining 64 steps we have a more complicated
28825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 computation of the input data-derived values.  Redefine the
28925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 macro to take an additional second argument specifying the
29025b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 function to use and a new last parameter for the magic
29125b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 constant.  */
29225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef OP
29325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define OP(i, f, a, b, c, d, e, K) \
29425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      do								\
29525b3c049e70834cf33790a28643ab058b507b35cBen Cheng        {								\
29625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  W (i) = CYCLIC (W (i - 3) ^ W (i - 8) ^ W (i - 14) ^ W (i - 16), 1);\
29725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  e = CYCLIC (a, 5) + f (b, c, d) + e + W (i) + K;		\
29825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  b = CYCLIC (b, 30);						\
29925b3c049e70834cf33790a28643ab058b507b35cBen Cheng        }								\
30025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      while (0)
30125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
30225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Steps 16 to 19.  */
30325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (16, FF, E, A, B, C, D, K0);
30425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (17, FF, D, E, A, B, C, K0);
30525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (18, FF, C, D, E, A, B, K0);
30625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (19, FF, B, C, D, E, A, K0);
30725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
30825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Steps 20 to 39.  */
30925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (20, FG, A, B, C, D, E, K1);
31025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (21, FG, E, A, B, C, D, K1);
31125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (22, FG, D, E, A, B, C, K1);
31225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (23, FG, C, D, E, A, B, K1);
31325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (24, FG, B, C, D, E, A, K1);
31425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (25, FG, A, B, C, D, E, K1);
31525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (26, FG, E, A, B, C, D, K1);
31625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (27, FG, D, E, A, B, C, K1);
31725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (28, FG, C, D, E, A, B, K1);
31825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (29, FG, B, C, D, E, A, K1);
31925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (30, FG, A, B, C, D, E, K1);
32025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (31, FG, E, A, B, C, D, K1);
32125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (32, FG, D, E, A, B, C, K1);
32225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (33, FG, C, D, E, A, B, K1);
32325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (34, FG, B, C, D, E, A, K1);
32425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (35, FG, A, B, C, D, E, K1);
32525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (36, FG, E, A, B, C, D, K1);
32625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (37, FG, D, E, A, B, C, K1);
32725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (38, FG, C, D, E, A, B, K1);
32825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (39, FG, B, C, D, E, A, K1);
32925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
33025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Steps 40 to 59.  */
33125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (40, FH, A, B, C, D, E, K2);
33225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (41, FH, E, A, B, C, D, K2);
33325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (42, FH, D, E, A, B, C, K2);
33425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (43, FH, C, D, E, A, B, K2);
33525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (44, FH, B, C, D, E, A, K2);
33625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (45, FH, A, B, C, D, E, K2);
33725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (46, FH, E, A, B, C, D, K2);
33825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (47, FH, D, E, A, B, C, K2);
33925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (48, FH, C, D, E, A, B, K2);
34025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (49, FH, B, C, D, E, A, K2);
34125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (50, FH, A, B, C, D, E, K2);
34225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (51, FH, E, A, B, C, D, K2);
34325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (52, FH, D, E, A, B, C, K2);
34425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (53, FH, C, D, E, A, B, K2);
34525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (54, FH, B, C, D, E, A, K2);
34625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (55, FH, A, B, C, D, E, K2);
34725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (56, FH, E, A, B, C, D, K2);
34825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (57, FH, D, E, A, B, C, K2);
34925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (58, FH, C, D, E, A, B, K2);
35025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (59, FH, B, C, D, E, A, K2);
35125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
35225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Steps 60 to 79.  */
35325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (60, FG, A, B, C, D, E, K3);
35425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (61, FG, E, A, B, C, D, K3);
35525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (62, FG, D, E, A, B, C, K3);
35625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (63, FG, C, D, E, A, B, K3);
35725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (64, FG, B, C, D, E, A, K3);
35825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (65, FG, A, B, C, D, E, K3);
35925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (66, FG, E, A, B, C, D, K3);
36025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (67, FG, D, E, A, B, C, K3);
36125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (68, FG, C, D, E, A, B, K3);
36225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (69, FG, B, C, D, E, A, K3);
36325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (70, FG, A, B, C, D, E, K3);
36425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (71, FG, E, A, B, C, D, K3);
36525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (72, FG, D, E, A, B, C, K3);
36625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (73, FG, C, D, E, A, B, K3);
36725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (74, FG, B, C, D, E, A, K3);
36825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (75, FG, A, B, C, D, E, K3);
36925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (76, FG, E, A, B, C, D, K3);
37025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (77, FG, D, E, A, B, C, K3);
37125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (78, FG, C, D, E, A, B, K3);
37225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      OP (79, FG, B, C, D, E, A, K3);
37325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
37425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Add the starting values of the context.  */
37525b3c049e70834cf33790a28643ab058b507b35cBen Cheng      A += A_save;
37625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      B += B_save;
37725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      C += C_save;
37825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      D += D_save;
37925b3c049e70834cf33790a28643ab058b507b35cBen Cheng      E += E_save;
38025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
38125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
38225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Put checksum in context given as argument.  */
38325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->A = A;
38425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->B = B;
38525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->C = C;
38625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->D = D;
38725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ctx->E = E;
38825b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
389