83 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
| /*
 | |
|  * 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;
 | |
| 	}
 | |
| }
 |