| /* | 
 |  * SHA-1 implementation. | 
 |  * | 
 |  * Copyright (C) 2005 Paul Mackerras <paulus@samba.org> | 
 |  * | 
 |  * This version assumes we are running on a big-endian machine. | 
 |  * It calls an external sha1_core() to process blocks of 64 bytes. | 
 |  */ | 
 | #include <stdio.h> | 
 | #include <string.h> | 
 | #include "sha1.h" | 
 |  | 
 | void ppc_sha1_core(uint32_t *hash, const unsigned char *p, | 
 | 		   unsigned int nblocks); | 
 |  | 
 | int ppc_SHA1_Init(ppc_SHA_CTX *c) | 
 | { | 
 | 	c->hash[0] = 0x67452301; | 
 | 	c->hash[1] = 0xEFCDAB89; | 
 | 	c->hash[2] = 0x98BADCFE; | 
 | 	c->hash[3] = 0x10325476; | 
 | 	c->hash[4] = 0xC3D2E1F0; | 
 | 	c->len = 0; | 
 | 	c->cnt = 0; | 
 | 	return 0; | 
 | } | 
 |  | 
 | int ppc_SHA1_Update(ppc_SHA_CTX *c, const void *ptr, unsigned long n) | 
 | { | 
 | 	unsigned long nb; | 
 | 	const unsigned char *p = ptr; | 
 |  | 
 | 	c->len += (uint64_t) n << 3; | 
 | 	while (n != 0) { | 
 | 		if (c->cnt || n < 64) { | 
 | 			nb = 64 - c->cnt; | 
 | 			if (nb > n) | 
 | 				nb = n; | 
 | 			memcpy(&c->buf.b[c->cnt], p, nb); | 
 | 			if ((c->cnt += nb) == 64) { | 
 | 				ppc_sha1_core(c->hash, c->buf.b, 1); | 
 | 				c->cnt = 0; | 
 | 			} | 
 | 		} else { | 
 | 			nb = n >> 6; | 
 | 			ppc_sha1_core(c->hash, p, nb); | 
 | 			nb <<= 6; | 
 | 		} | 
 | 		n -= nb; | 
 | 		p += nb; | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | int ppc_SHA1_Final(unsigned char *hash, ppc_SHA_CTX *c) | 
 | { | 
 | 	unsigned int cnt = c->cnt; | 
 |  | 
 | 	c->buf.b[cnt++] = 0x80; | 
 | 	if (cnt > 56) { | 
 | 		if (cnt < 64) | 
 | 			memset(&c->buf.b[cnt], 0, 64 - cnt); | 
 | 		ppc_sha1_core(c->hash, c->buf.b, 1); | 
 | 		cnt = 0; | 
 | 	} | 
 | 	if (cnt < 56) | 
 | 		memset(&c->buf.b[cnt], 0, 56 - cnt); | 
 | 	c->buf.l[7] = c->len; | 
 | 	ppc_sha1_core(c->hash, c->buf.b, 1); | 
 | 	memcpy(hash, c->hash, 20); | 
 | 	return 0; | 
 | } |