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