72 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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;
 | |
| }
 |