/*
 *  Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license 
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may 
 *  be found in the AUTHORS file in the root of the source tree.
 */


/*
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.

License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.

License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.

RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.

These notices must be retained in any copies of any part of this
documentation and/or software.
*/

#include "md5_utils.h"
#include <string.h>

/* Constants for md5_transform routine.
 */
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21

static void md5_transform(uint32_t state[4], const uint8_t block[64]);
static void Encode(uint8_t *output, const uint32_t *input, unsigned int len);
static void Decode(uint32_t *output, const uint8_t *input, unsigned int len);
#define md5_memset memset
#define md5_memcpy memcpy

static unsigned char PADDING[64] =
{
    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/* F, G, H and I are basic MD5 functions.
 */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

/* ROTATE_LEFT rotates x left n bits.
 */
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
 */
#define FF(a, b, c, d, x, s, ac) { \
        (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \
        (a) = ROTATE_LEFT ((a), (s)); \
        (a) += (b); \
    }
#define GG(a, b, c, d, x, s, ac) { \
        (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \
        (a) = ROTATE_LEFT ((a), (s)); \
        (a) += (b); \
    }
#define HH(a, b, c, d, x, s, ac) { \
        (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \
        (a) = ROTATE_LEFT ((a), (s)); \
        (a) += (b); \
    }
#define II(a, b, c, d, x, s, ac) { \
        (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \
        (a) = ROTATE_LEFT ((a), (s)); \
        (a) += (b); \
    }

/* MD5 initialization. Begins an MD5 operation, writing a new context.
 */
void md5_init(md5_ctx_t *context)
{
    context->count[0] = context->count[1] = 0;
    /* Load magic initialization constants.
    */
    context->state[0] = 0x67452301;
    context->state[1] = 0xefcdab89;
    context->state[2] = 0x98badcfe;
    context->state[3] = 0x10325476;
}

/* MD5 block update operation. Continues an MD5 message-digest
  operation, processing another message block, and updating the
  context.
 */
void md5_update(md5_ctx_t *context, const uint8_t *input, unsigned int input_len)
{
    unsigned int i, index, part_len;

    /* Compute number of bytes mod 64 */
    index = (unsigned int)((context->count[0] >> 3) & 0x3F);

    /* Update number of bits */
    if ((context->count[0] += ((uint32_t)input_len << 3))
        < ((uint32_t)input_len << 3))
        context->count[1]++;

    context->count[1] += ((uint32_t)input_len >> 29);

    part_len = 64 - index;

    /* Transform as many times as possible. */
    if (input_len >= part_len)
    {
        memcpy(&context->buffer[index], input, part_len);
        md5_transform(context->state, context->buffer);

        for (i = part_len; i + 63 < input_len; i += 64)
            md5_transform(context->state, &input[i]);

        index = 0;
    }
    else
        i = 0;

    /* Buffer remaining input */
    memcpy(&context->buffer[index], &input[i], input_len - i);
}

/* MD5 finalization. Ends an MD5 message-digest operation, writing the
  the message digest and zeroizing the context.
 */
void md5_finalize(md5_ctx_t *context, uint8_t digest[16])
{
    unsigned char bits[8];
    unsigned int index, pad_len;

    /* Save number of bits */
    Encode(bits, context->count, 8);

    /* Pad out to 56 mod 64.
    */
    index = (unsigned int)((context->count[0] >> 3) & 0x3f);
    pad_len = (index < 56) ? (56 - index) : (120 - index);
    md5_update(context, PADDING, pad_len);

    /* Append length (before padding) */
    md5_update(context, bits, 8);
    /* Store state in digest */
    Encode(digest, context->state, 16);

    /* Zeroize sensitive information.
    */
    memset(context, 0, sizeof(*context));
}

/* MD5 basic transformation. Transforms state based on block.
 */
static void md5_transform(uint32_t state[4], const uint8_t block[64])
{
    uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];

    Decode(x, block, 64);

    /* Round 1 */
    FF(a, b, c, d, x[ 0], S11, 0xd76aa478);  /* 1 */
    FF(d, a, b, c, x[ 1], S12, 0xe8c7b756);  /* 2 */
    FF(c, d, a, b, x[ 2], S13, 0x242070db);  /* 3 */
    FF(b, c, d, a, x[ 3], S14, 0xc1bdceee);  /* 4 */
    FF(a, b, c, d, x[ 4], S11, 0xf57c0faf);  /* 5 */
    FF(d, a, b, c, x[ 5], S12, 0x4787c62a);  /* 6 */
    FF(c, d, a, b, x[ 6], S13, 0xa8304613);  /* 7 */
    FF(b, c, d, a, x[ 7], S14, 0xfd469501);  /* 8 */
    FF(a, b, c, d, x[ 8], S11, 0x698098d8);  /* 9 */
    FF(d, a, b, c, x[ 9], S12, 0x8b44f7af);  /* 10 */
    FF(c, d, a, b, x[10], S13, 0xffff5bb1);  /* 11 */
    FF(b, c, d, a, x[11], S14, 0x895cd7be);  /* 12 */
    FF(a, b, c, d, x[12], S11, 0x6b901122);  /* 13 */
    FF(d, a, b, c, x[13], S12, 0xfd987193);  /* 14 */
    FF(c, d, a, b, x[14], S13, 0xa679438e);  /* 15 */
    FF(b, c, d, a, x[15], S14, 0x49b40821);  /* 16 */

    /* Round 2 */
    GG(a, b, c, d, x[ 1], S21, 0xf61e2562);  /* 17 */
    GG(d, a, b, c, x[ 6], S22, 0xc040b340);  /* 18 */
    GG(c, d, a, b, x[11], S23, 0x265e5a51);  /* 19 */
    GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa);  /* 20 */
    GG(a, b, c, d, x[ 5], S21, 0xd62f105d);  /* 21 */
    GG(d, a, b, c, x[10], S22,  0x2441453);  /* 22 */
    GG(c, d, a, b, x[15], S23, 0xd8a1e681);  /* 23 */
    GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8);  /* 24 */
    GG(a, b, c, d, x[ 9], S21, 0x21e1cde6);  /* 25 */
    GG(d, a, b, c, x[14], S22, 0xc33707d6);  /* 26 */
    GG(c, d, a, b, x[ 3], S23, 0xf4d50d87);  /* 27 */
    GG(b, c, d, a, x[ 8], S24, 0x455a14ed);  /* 28 */
    GG(a, b, c, d, x[13], S21, 0xa9e3e905);  /* 29 */
    GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8);  /* 30 */
    GG(c, d, a, b, x[ 7], S23, 0x676f02d9);  /* 31 */
    GG(b, c, d, a, x[12], S24, 0x8d2a4c8a);  /* 32 */

    /* Round 3 */
    HH(a, b, c, d, x[ 5], S31, 0xfffa3942);  /* 33 */
    HH(d, a, b, c, x[ 8], S32, 0x8771f681);  /* 34 */
    HH(c, d, a, b, x[11], S33, 0x6d9d6122);  /* 35 */
    HH(b, c, d, a, x[14], S34, 0xfde5380c);  /* 36 */
    HH(a, b, c, d, x[ 1], S31, 0xa4beea44);  /* 37 */
    HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9);  /* 38 */
    HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60);  /* 39 */
    HH(b, c, d, a, x[10], S34, 0xbebfbc70);  /* 40 */
    HH(a, b, c, d, x[13], S31, 0x289b7ec6);  /* 41 */
    HH(d, a, b, c, x[ 0], S32, 0xeaa127fa);  /* 42 */
    HH(c, d, a, b, x[ 3], S33, 0xd4ef3085);  /* 43 */
    HH(b, c, d, a, x[ 6], S34,  0x4881d05);  /* 44 */
    HH(a, b, c, d, x[ 9], S31, 0xd9d4d039);  /* 45 */
    HH(d, a, b, c, x[12], S32, 0xe6db99e5);  /* 46 */
    HH(c, d, a, b, x[15], S33, 0x1fa27cf8);  /* 47 */
    HH(b, c, d, a, x[ 2], S34, 0xc4ac5665);  /* 48 */

    /* Round 4 */
    II(a, b, c, d, x[ 0], S41, 0xf4292244);  /* 49 */
    II(d, a, b, c, x[ 7], S42, 0x432aff97);  /* 50 */
    II(c, d, a, b, x[14], S43, 0xab9423a7);  /* 51 */
    II(b, c, d, a, x[ 5], S44, 0xfc93a039);  /* 52 */
    II(a, b, c, d, x[12], S41, 0x655b59c3);  /* 53 */
    II(d, a, b, c, x[ 3], S42, 0x8f0ccc92);  /* 54 */
    II(c, d, a, b, x[10], S43, 0xffeff47d);  /* 55 */
    II(b, c, d, a, x[ 1], S44, 0x85845dd1);  /* 56 */
    II(a, b, c, d, x[ 8], S41, 0x6fa87e4f);  /* 57 */
    II(d, a, b, c, x[15], S42, 0xfe2ce6e0);  /* 58 */
    II(c, d, a, b, x[ 6], S43, 0xa3014314);  /* 59 */
    II(b, c, d, a, x[13], S44, 0x4e0811a1);  /* 60 */
    II(a, b, c, d, x[ 4], S41, 0xf7537e82);  /* 61 */
    II(d, a, b, c, x[11], S42, 0xbd3af235);  /* 62 */
    II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb);  /* 63 */
    II(b, c, d, a, x[ 9], S44, 0xeb86d391);  /* 64 */

    state[0] += a;
    state[1] += b;
    state[2] += c;
    state[3] += d;

    /* Zeroize sensitive information.
    */
    memset(x, 0, sizeof(x));
}

/* Encodes input (uint32_t) into output (unsigned char). Assumes len is
  a multiple of 4.
 */
static void Encode(uint8_t *output, const uint32_t *input, unsigned int len)
{
    unsigned int i, j;

    for (i = 0, j = 0; j < len; i++, j += 4)
    {
        output[j] = (unsigned char)(input[i] & 0xff);
        output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
        output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
        output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
    }
}

/* Decodes input (unsigned char) into output (uint32_t). Assumes len is
  a multiple of 4.
 */
static void Decode(uint32_t *output, const uint8_t *input, unsigned int len)
{
    unsigned int i, j;

    for (i = 0, j = 0; j < len; i++, j += 4)
        output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) |
                    (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24);
}
