// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../../include/fdrm/fx_crypt.h"

#ifdef __cplusplus
extern "C" {
#endif
struct rc4_state {
    int x, y, m[256];
};
void CRYPT_ArcFourSetup(void* context,  const uint8_t* key,  FX_DWORD length )
{
    rc4_state *s = (rc4_state*)context;
    int i, j, k, *m, a;
    s->x = 0;
    s->y = 0;
    m = s->m;
    for( i = 0; i < 256; i++ ) {
        m[i] = i;
    }
    j = k = 0;
    for( i = 0; i < 256; i++ ) {
        a = m[i];
        j = ( j + a + key[k] ) & 0xFF;
        m[i] = m[j];
        m[j] = a;
        if( ++k >= (int)length ) {
            k = 0;
        }
    }
}
void CRYPT_ArcFourCrypt(void* context, unsigned char *data, FX_DWORD length )
{
    struct rc4_state* s = (struct rc4_state*)context;
    int i, x, y, *m, a, b;
    x = s->x;
    y = s->y;
    m = s->m;
    for( i = 0; i < (int)length; i++ ) {
        x = ( x + 1 ) & 0xFF;
        a = m[x];
        y = ( y + a ) & 0xFF;
        m[x] = b = m[y];
        m[y] = a;
        data[i] ^= m[( a + b ) & 0xFF];
    }
    s->x = x;
    s->y = y;
}
void CRYPT_ArcFourCryptBlock(uint8_t* pData, FX_DWORD size, const uint8_t* key, FX_DWORD keylen)
{
    rc4_state s;
    CRYPT_ArcFourSetup(&s, key, keylen);
    CRYPT_ArcFourCrypt(&s, pData, size);
}
struct md5_context {
    FX_DWORD total[2];
    FX_DWORD state[4];
    uint8_t buffer[64];
};
#define GET_FX_DWORD(n,b,i)                                       \
    {                                                               \
        (n) = (FX_DWORD) ((uint8_t *) b)[(i)]                           \
              | (((FX_DWORD) ((uint8_t *) b)[(i)+1]) <<  8)                 \
              | (((FX_DWORD) ((uint8_t *) b)[(i)+2]) << 16)                 \
              | (((FX_DWORD) ((uint8_t *) b)[(i)+3]) << 24);                \
    }
#define PUT_FX_DWORD(n,b,i)                                       \
    {                                                               \
        (((uint8_t *) b)[(i)]  ) = (uint8_t) (((n)      ) & 0xFF);      \
        (((uint8_t *) b)[(i)+1]) = (uint8_t) (((n) >>  8) & 0xFF);      \
        (((uint8_t *) b)[(i)+2]) = (uint8_t) (((n) >> 16) & 0xFF);      \
        (((uint8_t *) b)[(i)+3]) = (uint8_t) (((n) >> 24) & 0xFF);      \
    }
void md5_process( struct md5_context *ctx, const uint8_t data[64] )
{
    FX_DWORD A, B, C, D, X[16];
    GET_FX_DWORD( X[0],  data,  0 );
    GET_FX_DWORD( X[1],  data,  4 );
    GET_FX_DWORD( X[2],  data,  8 );
    GET_FX_DWORD( X[3],  data, 12 );
    GET_FX_DWORD( X[4],  data, 16 );
    GET_FX_DWORD( X[5],  data, 20 );
    GET_FX_DWORD( X[6],  data, 24 );
    GET_FX_DWORD( X[7],  data, 28 );
    GET_FX_DWORD( X[8],  data, 32 );
    GET_FX_DWORD( X[9],  data, 36 );
    GET_FX_DWORD( X[10], data, 40 );
    GET_FX_DWORD( X[11], data, 44 );
    GET_FX_DWORD( X[12], data, 48 );
    GET_FX_DWORD( X[13], data, 52 );
    GET_FX_DWORD( X[14], data, 56 );
    GET_FX_DWORD( X[15], data, 60 );
#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define P(a,b,c,d,k,s,t)                                \
    {                                                       \
        a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           \
    }
    A = ctx->state[0];
    B = ctx->state[1];
    C = ctx->state[2];
    D = ctx->state[3];
#define F(x,y,z) (z ^ (x & (y ^ z)))
    P( A, B, C, D,  0,  7, 0xD76AA478 );
    P( D, A, B, C,  1, 12, 0xE8C7B756 );
    P( C, D, A, B,  2, 17, 0x242070DB );
    P( B, C, D, A,  3, 22, 0xC1BDCEEE );
    P( A, B, C, D,  4,  7, 0xF57C0FAF );
    P( D, A, B, C,  5, 12, 0x4787C62A );
    P( C, D, A, B,  6, 17, 0xA8304613 );
    P( B, C, D, A,  7, 22, 0xFD469501 );
    P( A, B, C, D,  8,  7, 0x698098D8 );
    P( D, A, B, C,  9, 12, 0x8B44F7AF );
    P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
    P( B, C, D, A, 11, 22, 0x895CD7BE );
    P( A, B, C, D, 12,  7, 0x6B901122 );
    P( D, A, B, C, 13, 12, 0xFD987193 );
    P( C, D, A, B, 14, 17, 0xA679438E );
    P( B, C, D, A, 15, 22, 0x49B40821 );
#undef F
#define F(x,y,z) (y ^ (z & (x ^ y)))
    P( A, B, C, D,  1,  5, 0xF61E2562 );
    P( D, A, B, C,  6,  9, 0xC040B340 );
    P( C, D, A, B, 11, 14, 0x265E5A51 );
    P( B, C, D, A,  0, 20, 0xE9B6C7AA );
    P( A, B, C, D,  5,  5, 0xD62F105D );
    P( D, A, B, C, 10,  9, 0x02441453 );
    P( C, D, A, B, 15, 14, 0xD8A1E681 );
    P( B, C, D, A,  4, 20, 0xE7D3FBC8 );
    P( A, B, C, D,  9,  5, 0x21E1CDE6 );
    P( D, A, B, C, 14,  9, 0xC33707D6 );
    P( C, D, A, B,  3, 14, 0xF4D50D87 );
    P( B, C, D, A,  8, 20, 0x455A14ED );
    P( A, B, C, D, 13,  5, 0xA9E3E905 );
    P( D, A, B, C,  2,  9, 0xFCEFA3F8 );
    P( C, D, A, B,  7, 14, 0x676F02D9 );
    P( B, C, D, A, 12, 20, 0x8D2A4C8A );
#undef F
#define F(x,y,z) (x ^ y ^ z)
    P( A, B, C, D,  5,  4, 0xFFFA3942 );
    P( D, A, B, C,  8, 11, 0x8771F681 );
    P( C, D, A, B, 11, 16, 0x6D9D6122 );
    P( B, C, D, A, 14, 23, 0xFDE5380C );
    P( A, B, C, D,  1,  4, 0xA4BEEA44 );
    P( D, A, B, C,  4, 11, 0x4BDECFA9 );
    P( C, D, A, B,  7, 16, 0xF6BB4B60 );
    P( B, C, D, A, 10, 23, 0xBEBFBC70 );
    P( A, B, C, D, 13,  4, 0x289B7EC6 );
    P( D, A, B, C,  0, 11, 0xEAA127FA );
    P( C, D, A, B,  3, 16, 0xD4EF3085 );
    P( B, C, D, A,  6, 23, 0x04881D05 );
    P( A, B, C, D,  9,  4, 0xD9D4D039 );
    P( D, A, B, C, 12, 11, 0xE6DB99E5 );
    P( C, D, A, B, 15, 16, 0x1FA27CF8 );
    P( B, C, D, A,  2, 23, 0xC4AC5665 );
#undef F
#define F(x,y,z) (y ^ (x | ~z))
    P( A, B, C, D,  0,  6, 0xF4292244 );
    P( D, A, B, C,  7, 10, 0x432AFF97 );
    P( C, D, A, B, 14, 15, 0xAB9423A7 );
    P( B, C, D, A,  5, 21, 0xFC93A039 );
    P( A, B, C, D, 12,  6, 0x655B59C3 );
    P( D, A, B, C,  3, 10, 0x8F0CCC92 );
    P( C, D, A, B, 10, 15, 0xFFEFF47D );
    P( B, C, D, A,  1, 21, 0x85845DD1 );
    P( A, B, C, D,  8,  6, 0x6FA87E4F );
    P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
    P( C, D, A, B,  6, 15, 0xA3014314 );
    P( B, C, D, A, 13, 21, 0x4E0811A1 );
    P( A, B, C, D,  4,  6, 0xF7537E82 );
    P( D, A, B, C, 11, 10, 0xBD3AF235 );
    P( C, D, A, B,  2, 15, 0x2AD7D2BB );
    P( B, C, D, A,  9, 21, 0xEB86D391 );
#undef F
    ctx->state[0] += A;
    ctx->state[1] += B;
    ctx->state[2] += C;
    ctx->state[3] += D;
}
void CRYPT_MD5Start(void* context)
{
    struct md5_context *ctx = (struct md5_context*)context;
    ctx->total[0] = 0;
    ctx->total[1] = 0;
    ctx->state[0] = 0x67452301;
    ctx->state[1] = 0xEFCDAB89;
    ctx->state[2] = 0x98BADCFE;
    ctx->state[3] = 0x10325476;
}
void CRYPT_MD5Update(void* pctx, const uint8_t* input, FX_DWORD length )
{
    struct md5_context *ctx = (struct md5_context *)pctx;
    FX_DWORD left, fill;
    if( ! length ) {
        return;
    }
    left = ( ctx->total[0] >> 3 ) & 0x3F;
    fill = 64 - left;
    ctx->total[0] += length <<  3;
    ctx->total[1] += length >> 29;
    ctx->total[0] &= 0xFFFFFFFF;
    ctx->total[1] += ctx->total[0] < length << 3;
    if( left && length >= fill ) {
        FXSYS_memcpy( (void *) (ctx->buffer + left), (void *) input, fill );
        md5_process( ctx, ctx->buffer );
        length -= fill;
        input  += fill;
        left = 0;
    }
    while( length >= 64 ) {
        md5_process( ctx, input );
        length -= 64;
        input  += 64;
    }
    if( length ) {
        FXSYS_memcpy( (void *) (ctx->buffer + left), (void *) input, length );
    }
}
const uint8_t md5_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
};
void CRYPT_MD5Finish(void* pctx, uint8_t digest[16] )
{
    struct md5_context *ctx = (struct md5_context *)pctx;
    FX_DWORD last, padn;
    uint8_t msglen[8];
    PUT_FX_DWORD( ctx->total[0], msglen, 0 );
    PUT_FX_DWORD( ctx->total[1], msglen, 4 );
    last = ( ctx->total[0] >> 3 ) & 0x3F;
    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
    CRYPT_MD5Update( ctx, md5_padding, padn );
    CRYPT_MD5Update( ctx, msglen, 8 );
    PUT_FX_DWORD( ctx->state[0], digest,  0 );
    PUT_FX_DWORD( ctx->state[1], digest,  4 );
    PUT_FX_DWORD( ctx->state[2], digest,  8 );
    PUT_FX_DWORD( ctx->state[3], digest, 12 );
}
void CRYPT_MD5Generate(const uint8_t* input, FX_DWORD length, uint8_t digest[16])
{
    md5_context ctx;
    CRYPT_MD5Start(&ctx);
    CRYPT_MD5Update(&ctx, input, length);
    CRYPT_MD5Finish(&ctx, digest);
}
static bool (*g_PubKeyDecryptor)(const uint8_t* pData, FX_DWORD size, uint8_t* data_buf, FX_DWORD& data_len) = NULL;
void CRYPT_SetPubKeyDecryptor(bool (*func)(const uint8_t* pData, FX_DWORD size, uint8_t* data_buf, FX_DWORD& data_len))
{
    g_PubKeyDecryptor = func;
}
#ifdef __cplusplus
};
#endif
