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