#include "t_defines.h"
#include "t_sha.h"

#ifdef CRYPTOLIB_SHA

/* A wrapper around CryptoLib's shsFinal that delivers output in octets */
void
shsFinalBytes(unsigned char digest[20], SHS_CTX* context)
{
  int i;
  unsigned long r;
  unsigned char *p = digest;

  shsFinal(context);
  for(i = 0; i < 5; ++i) {
    r = context->h[i];
    *p++ = (unsigned char)((r >> 24) & 0xff);
    *p++ = (unsigned char)((r >> 16) & 0xff);
    *p++ = (unsigned char)((r >> 8) & 0xff);
    *p++ = (unsigned char)(r & 0xff);
  }
}

#elif defined(GCRYPT_SHA)
/* Wrappers for gcrypt's md interface */

void
SHA1Init_gcry(SHA1_CTX * ctx)
{
  gcry_md_open(ctx, GCRY_MD_SHA1, 0);
}

void
SHA1Update_gcry(SHA1_CTX * ctx, const void *data, unsigned int len)
{
  gcry_md_write(*ctx, data, len);
}

void
SHA1Final_gcry(unsigned char digest[20], SHA1_CTX * ctx)
{
  memcpy(digest, gcry_md_read(*ctx, GCRY_MD_SHA1), 20);
  gcry_md_close(*ctx);
}

void
SHA512Init_gcry(SHA512_CTX * ctx)
{
  gcry_md_open(ctx, GCRY_MD_SHA512, 0);
}

void
SHA512Update_gcry(SHA512_CTX * ctx, const void *data, unsigned int len)
{
  gcry_md_write(*ctx, data, len);
}

void
SHA512Final_gcry(unsigned char digest[64], SHA512_CTX * ctx)
{
  memcpy(digest, gcry_md_read(*ctx, GCRY_MD_SHA512), 64);
  gcry_md_close(*ctx);
}

#elif defined(MBEDTLS_SHA)
/* Wrappers for mbedtls's md interface */

void
SHA1Init_mbed(SHA1_CTX * ctx)
{
  mbedtls_md_init(ctx);
  mbedtls_md_setup(ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 0);
  mbedtls_md_starts(ctx);
}

void
SHA1Update_mbed(SHA1_CTX * ctx, const void *data, unsigned int len)
{
  mbedtls_md_update(ctx, data, len);
}

void
SHA1Final_mbed(unsigned char digest[20], SHA1_CTX * ctx)
{
  mbedtls_md_finish(ctx, digest);
  mbedtls_md_free(ctx);
}

void
SHA512Init_mbed(SHA512_CTX * ctx)
{
  mbedtls_md_init(ctx);
  mbedtls_md_setup(ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA512), 0);
  mbedtls_md_starts(ctx);
}

void
SHA512Update_mbed(SHA512_CTX * ctx, const void *data, unsigned int len)
{
  mbedtls_md_update(ctx, data, len);
}

void
SHA512Final_mbed(unsigned char digest[64], SHA512_CTX * ctx)
{
  mbedtls_md_finish(ctx, digest);
  mbedtls_md_free(ctx);
}

#elif defined(OPENSSL_SHA)
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
void
SHA1Init_openssl(SHA1_CTX *ctx)
{
  *ctx = EVP_MD_CTX_new();
  EVP_DigestInit(*ctx, EVP_sha1());
}

void SHA1Update_openssl(SHA1_CTX *ctx, const void *data, unsigned int len)
{
  EVP_DigestUpdate(*ctx, data, (size_t)len);
}

void SHA1Final_openssl(unsigned char digest[20], SHA1_CTX *ctx)
{
  EVP_DigestFinal(*ctx, digest, NULL);
  EVP_MD_CTX_destroy(*ctx);
}

void
SHA512Init_openssl(SHA512_CTX *ctx)
{
  *ctx = EVP_MD_CTX_new();
  EVP_DigestInit(*ctx, EVP_sha512());
}

void SHA512Update_openssl(SHA512_CTX *ctx, const void *data, unsigned int len)
{
  EVP_DigestUpdate(*ctx, data, (size_t)len);
}

void SHA512Final_openssl(unsigned char digest[64], SHA512_CTX *ctx)
{
  EVP_DigestFinal(*ctx, digest, NULL);
  EVP_MD_CTX_destroy(*ctx);
}
#endif
#elif !defined(OPENSSL_SHA) && !defined(TOMCRYPT_SHA)
/* Use the free SHA1 if the library doesn't have it */

/*
SHA-1 in C
By Steve Reid <steve@edmweb.com>
100% Public Domain

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
*/

/* #define LITTLE_ENDIAN * This should be #define'd if true. */
/* #define SHA1HANDSOFF * Copies data before messing with it. */

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

static void SHA1Transform(uint32 state[5], const unsigned char buffer[64]);

#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 */
#ifndef WORDS_BIGENDIAN
#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
    |(rol(block->l[i],8)&0x00FF00FF))
#else
#define blk0(i) block->l[i]
#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);

/* Hash a single 512-bit block. This is the core of the algorithm. */

static void SHA1Transform(uint32 state[5], const unsigned char buffer[64])
{
uint32 a, b, c, d, e;
typedef union {
    unsigned char c[64];
    uint32 l[16];
} CHAR64LONG16;
CHAR64LONG16* block;
#ifdef SHA1HANDSOFF
static unsigned char workspace[64];
    block = (CHAR64LONG16*)workspace;
    memcpy(block, buffer, 64);
#else
    block = (CHAR64LONG16*)buffer;
#endif
    /* Copy context->state[] to working vars */
    a = state[0];
    b = state[1];
    c = state[2];
    d = state[3];
    e = state[4];
    /* 4 rounds of 20 operations each. Loop unrolled. */
    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;
    /* Wipe variables */
    a = b = c = d = e = 0;
}


/* 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 unsigned char* data, unsigned int len)
{
unsigned int i, j;

    j = (context->count[0] >> 3) & 63;
    if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
    context->count[1] += (len >> 29);
    if ((j + len) > 63) {
        memcpy(&context->buffer[j], data, (i = 64-j));
        SHA1Transform(context->state, context->buffer);
        for ( ; i + 63 < len; i += 64) {
            SHA1Transform(context->state, &data[i]);
        }
        j = 0;
    }
    else i = 0;
    memcpy(&context->buffer[j], &data[i], len - i);
}


/* Add padding and return the message digest. */

void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
{
uint32 i, j;
unsigned char finalcount[8];

    for (i = 0; i < 8; i++) {
        finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
         >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
    }
    SHA1Update(context, (unsigned char *)"\200", 1);
    while ((context->count[0] & 504) != 448) {
        SHA1Update(context, (unsigned char *)"\0", 1);
    }
    SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform() */
    for (i = 0; i < 20; i++) {
        digest[i] = (unsigned char)
         ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
    }
    /* Wipe variables */
    i = j = 0;
    memset(context->buffer, 0, 64);
    memset(context->state, 0, 20);
    memset(context->count, 0, 8);
    memset(&finalcount, 0, 8);
#ifdef SHA1HANDSOFF  /* make SHA1Transform overwrite it's own static vars */
    SHA1Transform(context->state, context->buffer);
#endif
}
#endif
