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