hostap/src/crypto/sha384-internal.c
Pali Rohár 6bb6a9ce29 Add SHA384 and SHA512 implementations from LibTomCrypt library
These will be used with the internal TLS implementation to extend hash
algorithm support for new certificates and TLS v1.2.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
2015-11-29 18:19:32 +02:00

92 lines
2.2 KiB
C

/*
* SHA-384 hash implementation and interface functions
* Copyright (c) 2015, Pali Rohár <pali.rohar@gmail.com>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#include "includes.h"
#include "common.h"
#include "sha384_i.h"
#include "crypto.h"
/**
* sha384_vector - SHA384 hash for data vector
* @num_elem: Number of elements in the data vector
* @addr: Pointers to the data areas
* @len: Lengths of the data blocks
* @mac: Buffer for the hash
* Returns: 0 on success, -1 of failure
*/
int sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len,
u8 *mac)
{
struct sha384_state ctx;
size_t i;
sha384_init(&ctx);
for (i = 0; i < num_elem; i++)
if (sha384_process(&ctx, addr[i], len[i]))
return -1;
if (sha384_done(&ctx, mac))
return -1;
return 0;
}
/* ===== start - public domain SHA384 implementation ===== */
/* This is based on SHA384 implementation in LibTomCrypt that was released into
* public domain by Tom St Denis. */
#define CONST64(n) n ## ULL
/**
Initialize the hash state
@param md The hash state you wish to initialize
@return CRYPT_OK if successful
*/
void sha384_init(struct sha384_state *md)
{
md->curlen = 0;
md->length = 0;
md->state[0] = CONST64(0xcbbb9d5dc1059ed8);
md->state[1] = CONST64(0x629a292a367cd507);
md->state[2] = CONST64(0x9159015a3070dd17);
md->state[3] = CONST64(0x152fecd8f70e5939);
md->state[4] = CONST64(0x67332667ffc00b31);
md->state[5] = CONST64(0x8eb44a8768581511);
md->state[6] = CONST64(0xdb0c2e0d64f98fa7);
md->state[7] = CONST64(0x47b5481dbefa4fa4);
}
int sha384_process(struct sha384_state *md, const unsigned char *in,
unsigned long inlen)
{
return sha512_process(md, in, inlen);
}
/**
Terminate the hash to get the digest
@param md The hash state
@param out [out] The destination of the hash (48 bytes)
@return CRYPT_OK if successful
*/
int sha384_done(struct sha384_state *md, unsigned char *out)
{
unsigned char buf[64];
if (md->curlen >= sizeof(md->buf))
return -1;
if (sha512_done(md, buf) != 0)
return -1;
os_memcpy(out, buf, 48);
return 0;
}
/* ===== end - public domain SHA384 implementation ===== */