You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
1.7 KiB
82 lines
1.7 KiB
/* |
|
* 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; |
|
} |
|
}
|
|
|