/*
 * SHA-1 implementation optimized for ARM
 *
 * Copyright:   (C) 2005 by Nicolas Pitre <nico@cam.org>
 * Created:     September 17, 2005
 */

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

extern void sha_transform(uint32_t *hash, const unsigned char *data, uint32_t *W);

void SHA1_Init(SHA_CTX *c)
{
	c->len = 0;
	c->hash[0] = 0x67452301;
	c->hash[1] = 0xefcdab89;
	c->hash[2] = 0x98badcfe;
	c->hash[3] = 0x10325476;
	c->hash[4] = 0xc3d2e1f0;
}

void SHA1_Update(SHA_CTX *c, const void *p, unsigned long n)
{
	uint32_t workspace[80];
	unsigned int partial;
	unsigned long done;

	partial = c->len & 0x3f;
	c->len += n;
	if ((partial + n) >= 64) {
		if (partial) {
			done = 64 - partial;
			memcpy(c->buffer + partial, p, done);
			sha_transform(c->hash, c->buffer, workspace);
			partial = 0;
		} else
			done = 0;
		while (n >= done + 64) {
			sha_transform(c->hash, p + done, workspace);
			done += 64;
		}
	} else
		done = 0;
	if (n - done)
		memcpy(c->buffer + partial, p + done, n - done);
}

void SHA1_Final(unsigned char *hash, SHA_CTX *c)
{
	uint64_t bitlen;
	uint32_t bitlen_hi, bitlen_lo; 
	unsigned int i, offset, padlen;
	unsigned char bits[8];
	static const unsigned char padding[64] = { 0x80, };

	bitlen = c->len << 3;
	offset = c->len & 0x3f;
	padlen = ((offset < 56) ? 56 : (64 + 56)) - offset;
	SHA1_Update(c, padding, padlen);

	bitlen_hi = bitlen >> 32;
	bitlen_lo = bitlen & 0xffffffff;
	bits[0] = bitlen_hi >> 24;
	bits[1] = bitlen_hi >> 16;
	bits[2] = bitlen_hi >> 8;
	bits[3] = bitlen_hi;
	bits[4] = bitlen_lo >> 24;
	bits[5] = bitlen_lo >> 16;
	bits[6] = bitlen_lo >> 8;
	bits[7] = bitlen_lo;
	SHA1_Update(c, bits, 8); 

	for (i = 0; i < 5; i++) {
		uint32_t v = c->hash[i];
		hash[0] = v >> 24;
		hash[1] = v >> 16;
		hash[2] = v >> 8;
		hash[3] = v;
		hash += 4;
	}
}
