/*
 * SHA-1 in C
 * By Steve Reid <sreid@sea-to-sky.net>
 * 100% Public Domain
 *
 * -----------------
 * Modified 7/98
 * By James H. Brown <jbrown@burgoyne.com>
 * Still 100% Public Domain
 *
 * Corrected a problem which generated improper hash values on 16 bit machines
 * Routine SHA1Update changed from
 *   void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int
 * len)
 * to
 *   void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned
 * long len)
 *
 * The 'len' parameter was declared an int which works fine on 32 bit machines.
 * However, on 16 bit machines an int is too small for the shifts being done
 * against
 * it.  This caused the hash function to generate incorrect values if len was
 * greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update().
 *
 * Since the file IO in main() reads 16K at a time, any file 8K or larger would
 * be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million
 * "a"s).
 *
 * I also changed the declaration of variables i & j in SHA1Update to
 * unsigned long from unsigned int for the same reason.
 *
 * These changes should make no difference to any 32 bit implementations since
 * an
 * int and a long are the same size in those environments.
 *
 * --
 * I also corrected a few compiler warnings generated by Borland C.
 * 1. Added #include <process.h> for exit() prototype
 * 2. Removed unused variable 'j' in SHA1Final
 * 3. Changed exit(0) to return(0) at end of main.
 *
 * ALL changes I made can be located by searching for comments containing 'JHB'
 * -----------------
 * Modified 8/98
 * By Steve Reid <sreid@sea-to-sky.net>
 * Still 100% public domain
 *
 * 1- Removed #include <process.h> and used return() instead of exit()
 * 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall)
 * 3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net
 *
 * -----------------
 * Modified 4/01
 * By Saul Kravitz <Saul.Kravitz@celera.com>
 * Still 100% PD
 * Modified to run on Compaq Alpha hardware.
 *
 * -----------------
 * Modified 07/2002
 * By Ralph Giles <giles@ghostscript.com>
 * Still 100% public domain
 * modified for use with stdint types, autoconf
 * code cleanup, removed attribution comments
 * switched SHA1Final() argument order for consistency
 * use SHA1_ prefix for public api
 * move public api to sha1.h
 *
 * -----------------
 * Modified 02/2012
 * By Justin Uberti <juberti@google.com>
 * Remove underscore from SHA1 prefix to avoid conflict with OpenSSL
 * Remove test code
 * Untabify
 *
 * -----------------
 * Modified 03/2012
 * By Ronghua Wu <ronghuawu@google.com>
 * Change the typedef of uint32(8)_t to uint32(8). We need this because in the
 * chromium android build, the stdio.h will include stdint.h which already
 * defined uint32(8)_t.
 *
 * -----------------
 * Modified 04/2012
 * By Frank Barchard <fbarchard@google.com>
 * Ported to C++, Google style, change len to size_t, enable SHA1HANDSOFF
 *
 * Test Vectors (from FIPS PUB 180-1)
 * "abc"
 *   A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
 * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
 *   84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
 * A million repetitions of "a"
 *   34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
 *
 * -----------------
 * Modified 05/2015
 * By Sergey Ulanov <sergeyu@chromium.org>
 * Removed static buffer to make computation thread-safe.
 */

// Enabling SHA1HANDSOFF preserves the caller's data buffer.
// Disabling SHA1HANDSOFF the buffer will be modified (end swapped).
#define SHA1HANDSOFF

#include "webrtc/base/sha1.h"

#include <stdio.h>
#include <string.h>

namespace rtc {

namespace {

#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))

// blk0() and blk() perform the initial expand.
// I got the idea of expanding during the round function from SSLeay
// FIXME: can we do this in an endian-proof way?
#ifdef ARCH_CPU_BIG_ENDIAN
#define blk0(i) block->l[i]
#else
#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
    (rol(block->l[i], 8) & 0x00FF00FF))
#endif
#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
    block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))

// (R0+R1), R2, R3, R4 are the different operations used in SHA1.
#define R0(v, w, x, y, z, i) \
    z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
    w = rol(w, 30);
#define R1(v, w, x, y, z, i) \
    z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
    w = rol(w, 30);
#define R2(v, w, x, y, z, i) \
    z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5);\
    w = rol(w, 30);
#define R3(v, w, x, y, z, i) \
    z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
    w = rol(w, 30);
#define R4(v, w, x, y, z, i) \
    z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
    w = rol(w, 30);

#ifdef VERBOSE  // SAK
void SHAPrintContext(SHA1_CTX *context, char *msg) {
  printf("%s (%d,%d) %x %x %x %x %x\n",
         msg,
         context->count[0], context->count[1],
         context->state[0],
         context->state[1],
         context->state[2],
         context->state[3],
         context->state[4]);
}
#endif /* VERBOSE */

// Hash a single 512-bit block. This is the core of the algorithm.
void SHA1Transform(uint32 state[5], const uint8 buffer[64]) {
  union CHAR64LONG16 {
    uint8 c[64];
    uint32 l[16];
  };
#ifdef SHA1HANDSOFF
  uint8 workspace[64];
  memcpy(workspace, buffer, 64);
  CHAR64LONG16* block = reinterpret_cast<CHAR64LONG16*>(workspace);
#else
  // Note(fbarchard): This option does modify the user's data buffer.
  CHAR64LONG16* block = const_cast<CHAR64LONG16*>(
      reinterpret_cast<const CHAR64LONG16*>(buffer));
#endif

  // Copy context->state[] to working vars.
  uint32 a = state[0];
  uint32 b = state[1];
  uint32 c = state[2];
  uint32 d = state[3];
  uint32 e = state[4];

  // 4 rounds of 20 operations each. Loop unrolled.
  // Note(fbarchard): The following has lint warnings for multiple ; on
  // a line and no space after , but is left as-is to be similar to the
  // original code.
  R0(a,b,c,d,e,0); R0(e,a,b,c,d,1); R0(d,e,a,b,c,2); R0(c,d,e,a,b,3);
  R0(b,c,d,e,a,4); R0(a,b,c,d,e,5); R0(e,a,b,c,d,6); R0(d,e,a,b,c,7);
  R0(c,d,e,a,b,8); R0(b,c,d,e,a,9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
  R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
  R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
  R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
  R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
  R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
  R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
  R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
  R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
  R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
  R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
  R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
  R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
  R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
  R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
  R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
  R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
  R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);

  // Add the working vars back into context.state[].
  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;
  state[4] += e;
}

}  // namespace

// SHA1Init - Initialize new context.
void SHA1Init(SHA1_CTX* context) {
  // SHA1 initialization constants.
  context->state[0] = 0x67452301;
  context->state[1] = 0xEFCDAB89;
  context->state[2] = 0x98BADCFE;
  context->state[3] = 0x10325476;
  context->state[4] = 0xC3D2E1F0;
  context->count[0] = context->count[1] = 0;
}

// Run your data through this.
void SHA1Update(SHA1_CTX* context, const uint8* data, size_t input_len) {
  size_t i = 0;

#ifdef VERBOSE
  SHAPrintContext(context, "before");
#endif

  // Compute number of bytes mod 64.
  size_t index = (context->count[0] >> 3) & 63;

  // Update number of bits.
  // TODO: Use uint64 instead of 2 uint32 for count.
  // count[0] has low 29 bits for byte count + 3 pad 0's making 32 bits for
  // bit count.
  // Add bit count to low uint32
  context->count[0] += static_cast<uint32>(input_len << 3);
  if (context->count[0] < static_cast<uint32>(input_len << 3)) {
    ++context->count[1];  // if overlow (carry), add one to high word
  }
  context->count[1] += static_cast<uint32>(input_len >> 29);
  if ((index + input_len) > 63) {
    i = 64 - index;
    memcpy(&context->buffer[index], data, i);
    SHA1Transform(context->state, context->buffer);
    for (; i + 63 < input_len; i += 64) {
      SHA1Transform(context->state, data + i);
    }
    index = 0;
  }
  memcpy(&context->buffer[index], &data[i], input_len - i);

#ifdef VERBOSE
  SHAPrintContext(context, "after ");
#endif
}

// Add padding and return the message digest.
void SHA1Final(SHA1_CTX* context, uint8 digest[SHA1_DIGEST_SIZE]) {
  uint8 finalcount[8];
  for (int i = 0; i < 8; ++i) {
    // Endian independent
    finalcount[i] = static_cast<uint8>(
        (context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8) ) & 255);
  }
  SHA1Update(context, reinterpret_cast<const uint8*>("\200"), 1);
  while ((context->count[0] & 504) != 448) {
    SHA1Update(context, reinterpret_cast<const uint8*>("\0"), 1);
  }
  SHA1Update(context, finalcount, 8);  // Should cause a SHA1Transform().
  for (int i = 0; i < SHA1_DIGEST_SIZE; ++i) {
    digest[i] = static_cast<uint8>(
        (context->state[i >> 2] >> ((3 - (i & 3)) * 8) ) & 255);
  }

  // Wipe variables.
  memset(context->buffer, 0, 64);
  memset(context->state, 0, 20);
  memset(context->count, 0, 8);
  memset(finalcount, 0, 8);   // SWR

#ifdef SHA1HANDSOFF  // Make SHA1Transform overwrite its own static vars.
  SHA1Transform(context->state, context->buffer);
#endif
}

}  // namespace rtc
