root/ppc/sha1.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ppc_SHA1_Init
  2. ppc_SHA1_Update
  3. ppc_SHA1_Final

/*
 * 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;
}

/* [<][>][^][v][top][bottom][index][help] */