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