#include "xmpmeta/md5.h"

#include <string.h>  // for memcpy().

#include <vector>

#include "base/integral_types.h"
#include "strings/escaping.h"

namespace dynamic_depth {
namespace xmpmeta {
namespace {

const int kMd5DigestSize = 16;

typedef struct MD5Context MD5_CTX;

struct MD5Context {
  uint32 buf[4];
  uint32 bits[2];
  uint32 in[16];
};

void MD5Init(struct MD5Context* context);
void MD5Update(struct MD5Context* context, const uint8* data, size_t len);
void MD5Final(unsigned char digest[16], struct MD5Context* ctx);
void MD5Transform(uint32 buf[4], const uint32 in[16]);

// Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
// initialization constants.
void MD5Init(MD5Context* context) {
  context->buf[0] = 0x67452301;
  context->buf[1] = 0xefcdab89;
  context->buf[2] = 0x98badcfe;
  context->buf[3] = 0x10325476;
  context->bits[0] = 0;
  context->bits[1] = 0;
}

// Update context to reflect the concatenation of another buffer full of bytes.
void MD5Update(MD5Context* context, const uint8* data, size_t len) {
  // Update bitcount.
  uint32 t = context->bits[0];
  if ((context->bits[0] = t + (static_cast<uint32>(len) << 3)) < t) {
    context->bits[1]++;  // Carry from low to high.
  }
  context->bits[1] += len >> 29;
  t = (t >> 3) & 0x3f;  // Bytes already in shsInfo->data.

  // Handle any leading odd-sized chunks.
  if (t) {
    uint8* p = reinterpret_cast<uint8*>(context->in) + t;

    t = 64 - t;
    if (len < t) {
      memcpy(p, data, len);
      return;
    }
    memcpy(p, data, t);
    MD5Transform(context->buf, context->in);
    data += t;
    len -= t;
  }

  // Process data in 64-byte chunks.
  while (len >= 64) {
    memcpy(context->in, data, 64);
    MD5Transform(context->buf, context->in);
    data += 64;
    len -= 64;
  }

  // Handle any remaining bytes of data.
  memcpy(context->in, data, len);
}

// Final wrapup - pad to 64-byte boundary with the bit pattern.
// 1 0* (64-bit count of bits processed, MSB-first)
void MD5Final(uint8 digest[16], MD5Context* ctx) {
  // Compute number of bytes mod 64.
  uint32 count = (ctx->bits[0] >> 3) & 0x3F;

  // Set the first char of padding to 0x80.  This is safe since there is
  // always at least one byte free.
  uint8* p = reinterpret_cast<uint8*>(ctx->in) + count;
  *p++ = 0x80;

  // Bytes of padding needed to make 64 bytes.
  count = 64 - 1 - count;

  // Pad out to 56 mod 64.
  if (count < 8) {
    // Two lots of padding:  Pad the first block to 64 bytes.
    memset(p, 0, count);
    MD5Transform(ctx->buf, ctx->in);

    // Now fill the next block with 56 bytes.
    memset(ctx->in, 0, 56);
  } else {
    // Pad block to 56 bytes.
    memset(p, 0, count - 8);
  }

  // Append length in bits and transform.
  ctx->in[14] = ctx->bits[0];
  ctx->in[15] = ctx->bits[1];

  MD5Transform(ctx->buf, ctx->in);
  memcpy(digest, ctx->buf, 16);
  memset(ctx, 0, sizeof(*ctx));  // In case it's sensitive.
}

// The four core functions - F1 is optimized somewhat.
// #define F1(x, y, z) (x & y | ~x & z)
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

// This is the central step in the MD5 algorithm.
#define MD5STEP(f, w, x, y, z, data, s) \
  (w += f(x, y, z) + data, w = w << s | w >> (32 - s), w += x)

#if defined(__clang__) && defined(__has_attribute)
#if __has_attribute(no_sanitize)
#define DDEPTH_NO_UNSIGNED_OVERFLOW_CHECK \
  __attribute__((no_sanitize("unsigned-integer-overflow")))
#endif
#endif

#ifndef DDEPTH_NO_UNSIGNED_OVERFLOW_CHECK
#define DDEPTH_NO_UNSIGNED_OVERFLOW_CHECK
#endif

// The core of the MD5 algorithm, this alters an existing MD5 hash to
// reflect the addition of 16 longwords of new data.  MD5Update blocks
// the data and converts bytes into longwords for this routine.
DDEPTH_NO_UNSIGNED_OVERFLOW_CHECK void MD5Transform(uint32 buf[4],
                                                    const uint32 in[16]) {
  uint32 a = buf[0];
  uint32 b = buf[1];
  uint32 c = buf[2];
  uint32 d = buf[3];

  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
  buf[0] += a;
  buf[1] += b;
  buf[2] += c;
  buf[3] += d;
}

void MD5(const uint8_t* to_hash, size_t to_hash_length, uint8_t* output) {
  MD5Context md5_context;
  MD5Init(&md5_context);
  MD5Update(&md5_context, to_hash, to_hash_length);
  MD5Final(output, &md5_context);
}

}  // namespace

string MD5Hash(const string& to_hash) {
  std::vector<uint8_t> buffer;
  buffer.resize(kMd5DigestSize);
  MD5(reinterpret_cast<const uint8_t*>(to_hash.data()), to_hash.length(),
      &buffer[0]);
  return dynamic_depth::b2a_hex(reinterpret_cast<const char*>(&buffer[0]),
                                kMd5DigestSize);
}

}  // namespace xmpmeta
}  // namespace dynamic_depth
