1e5b75505Sopenharmony_ci/*
2e5b75505Sopenharmony_ci * SHA-384 hash implementation and interface functions
3e5b75505Sopenharmony_ci * Copyright (c) 2015, Pali Rohár <pali.rohar@gmail.com>
4e5b75505Sopenharmony_ci *
5e5b75505Sopenharmony_ci * This software may be distributed under the terms of the BSD license.
6e5b75505Sopenharmony_ci * See README for more details.
7e5b75505Sopenharmony_ci */
8e5b75505Sopenharmony_ci
9e5b75505Sopenharmony_ci#include "includes.h"
10e5b75505Sopenharmony_ci
11e5b75505Sopenharmony_ci#include "common.h"
12e5b75505Sopenharmony_ci#include "sha384_i.h"
13e5b75505Sopenharmony_ci#include "crypto.h"
14e5b75505Sopenharmony_ci
15e5b75505Sopenharmony_ci
16e5b75505Sopenharmony_ci/**
17e5b75505Sopenharmony_ci * sha384_vector - SHA384 hash for data vector
18e5b75505Sopenharmony_ci * @num_elem: Number of elements in the data vector
19e5b75505Sopenharmony_ci * @addr: Pointers to the data areas
20e5b75505Sopenharmony_ci * @len: Lengths of the data blocks
21e5b75505Sopenharmony_ci * @mac: Buffer for the hash
22e5b75505Sopenharmony_ci * Returns: 0 on success, -1 of failure
23e5b75505Sopenharmony_ci */
24e5b75505Sopenharmony_ciint sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len,
25e5b75505Sopenharmony_ci		  u8 *mac)
26e5b75505Sopenharmony_ci{
27e5b75505Sopenharmony_ci	struct sha384_state ctx;
28e5b75505Sopenharmony_ci	size_t i;
29e5b75505Sopenharmony_ci
30e5b75505Sopenharmony_ci	sha384_init(&ctx);
31e5b75505Sopenharmony_ci	for (i = 0; i < num_elem; i++)
32e5b75505Sopenharmony_ci		if (sha384_process(&ctx, addr[i], len[i]))
33e5b75505Sopenharmony_ci			return -1;
34e5b75505Sopenharmony_ci	if (sha384_done(&ctx, mac))
35e5b75505Sopenharmony_ci		return -1;
36e5b75505Sopenharmony_ci	return 0;
37e5b75505Sopenharmony_ci}
38e5b75505Sopenharmony_ci
39e5b75505Sopenharmony_ci
40e5b75505Sopenharmony_ci/* ===== start - public domain SHA384 implementation ===== */
41e5b75505Sopenharmony_ci
42e5b75505Sopenharmony_ci/* This is based on SHA384 implementation in LibTomCrypt that was released into
43e5b75505Sopenharmony_ci * public domain by Tom St Denis. */
44e5b75505Sopenharmony_ci
45e5b75505Sopenharmony_ci#define CONST64(n) n ## ULL
46e5b75505Sopenharmony_ci
47e5b75505Sopenharmony_ci/**
48e5b75505Sopenharmony_ci   Initialize the hash state
49e5b75505Sopenharmony_ci   @param md   The hash state you wish to initialize
50e5b75505Sopenharmony_ci   @return CRYPT_OK if successful
51e5b75505Sopenharmony_ci*/
52e5b75505Sopenharmony_civoid sha384_init(struct sha384_state *md)
53e5b75505Sopenharmony_ci{
54e5b75505Sopenharmony_ci	md->curlen = 0;
55e5b75505Sopenharmony_ci	md->length = 0;
56e5b75505Sopenharmony_ci	md->state[0] = CONST64(0xcbbb9d5dc1059ed8);
57e5b75505Sopenharmony_ci	md->state[1] = CONST64(0x629a292a367cd507);
58e5b75505Sopenharmony_ci	md->state[2] = CONST64(0x9159015a3070dd17);
59e5b75505Sopenharmony_ci	md->state[3] = CONST64(0x152fecd8f70e5939);
60e5b75505Sopenharmony_ci	md->state[4] = CONST64(0x67332667ffc00b31);
61e5b75505Sopenharmony_ci	md->state[5] = CONST64(0x8eb44a8768581511);
62e5b75505Sopenharmony_ci	md->state[6] = CONST64(0xdb0c2e0d64f98fa7);
63e5b75505Sopenharmony_ci	md->state[7] = CONST64(0x47b5481dbefa4fa4);
64e5b75505Sopenharmony_ci}
65e5b75505Sopenharmony_ci
66e5b75505Sopenharmony_ciint sha384_process(struct sha384_state *md, const unsigned char *in,
67e5b75505Sopenharmony_ci		   unsigned long inlen)
68e5b75505Sopenharmony_ci{
69e5b75505Sopenharmony_ci	return sha512_process(md, in, inlen);
70e5b75505Sopenharmony_ci}
71e5b75505Sopenharmony_ci
72e5b75505Sopenharmony_ci/**
73e5b75505Sopenharmony_ci   Terminate the hash to get the digest
74e5b75505Sopenharmony_ci   @param md  The hash state
75e5b75505Sopenharmony_ci   @param out [out] The destination of the hash (48 bytes)
76e5b75505Sopenharmony_ci   @return CRYPT_OK if successful
77e5b75505Sopenharmony_ci*/
78e5b75505Sopenharmony_ciint sha384_done(struct sha384_state *md, unsigned char *out)
79e5b75505Sopenharmony_ci{
80e5b75505Sopenharmony_ci	unsigned char buf[64];
81e5b75505Sopenharmony_ci
82e5b75505Sopenharmony_ci	if (md->curlen >= sizeof(md->buf))
83e5b75505Sopenharmony_ci		return -1;
84e5b75505Sopenharmony_ci
85e5b75505Sopenharmony_ci	if (sha512_done(md, buf) != 0)
86e5b75505Sopenharmony_ci		return -1;
87e5b75505Sopenharmony_ci
88e5b75505Sopenharmony_ci	os_memcpy(out, buf, 48);
89e5b75505Sopenharmony_ci	return 0;
90e5b75505Sopenharmony_ci}
91e5b75505Sopenharmony_ci
92e5b75505Sopenharmony_ci/* ===== end - public domain SHA384 implementation ===== */
93