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