1*f0865ec9SKyle Evans /* 2*f0865ec9SKyle Evans * Copyright (C) 2017 - This file is part of libecc project 3*f0865ec9SKyle Evans * 4*f0865ec9SKyle Evans * Authors: 5*f0865ec9SKyle Evans * Ryad BENADJILA <ryadbenadjila@gmail.com> 6*f0865ec9SKyle Evans * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7*f0865ec9SKyle Evans * Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr> 8*f0865ec9SKyle Evans * 9*f0865ec9SKyle Evans * Contributors: 10*f0865ec9SKyle Evans * Nicolas VIVET <nicolas.vivet@ssi.gouv.fr> 11*f0865ec9SKyle Evans * Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr> 12*f0865ec9SKyle Evans * 13*f0865ec9SKyle Evans * This software is licensed under a dual BSD and GPL v2 license. 14*f0865ec9SKyle Evans * See LICENSE file at the root folder of the project. 15*f0865ec9SKyle Evans */ 16*f0865ec9SKyle Evans #include <libecc/lib_ecc_config.h> 17*f0865ec9SKyle Evans #ifdef WITH_HASH_SHA3_256 18*f0865ec9SKyle Evans 19*f0865ec9SKyle Evans #ifndef __SHA3_256_H__ 20*f0865ec9SKyle Evans #define __SHA3_256_H__ 21*f0865ec9SKyle Evans 22*f0865ec9SKyle Evans #include <libecc/words/words.h> 23*f0865ec9SKyle Evans #include <libecc/utils/utils.h> 24*f0865ec9SKyle Evans #include <libecc/hash/sha3.h> 25*f0865ec9SKyle Evans 26*f0865ec9SKyle Evans #define SHA3_256_BLOCK_SIZE 136 27*f0865ec9SKyle Evans #define SHA3_256_DIGEST_SIZE 32 28*f0865ec9SKyle Evans #define SHA3_256_DIGEST_SIZE_BITS 256 29*f0865ec9SKyle Evans 30*f0865ec9SKyle Evans /* Compute max hash digest and block sizes */ 31*f0865ec9SKyle Evans #ifndef MAX_DIGEST_SIZE 32*f0865ec9SKyle Evans #define MAX_DIGEST_SIZE 0 33*f0865ec9SKyle Evans #endif 34*f0865ec9SKyle Evans #if (MAX_DIGEST_SIZE < SHA3_256_DIGEST_SIZE) 35*f0865ec9SKyle Evans #undef MAX_DIGEST_SIZE 36*f0865ec9SKyle Evans #define MAX_DIGEST_SIZE SHA3_256_DIGEST_SIZE 37*f0865ec9SKyle Evans #endif 38*f0865ec9SKyle Evans 39*f0865ec9SKyle Evans #ifndef MAX_DIGEST_SIZE_BITS 40*f0865ec9SKyle Evans #define MAX_DIGEST_SIZE_BITS 0 41*f0865ec9SKyle Evans #endif 42*f0865ec9SKyle Evans #if (MAX_DIGEST_SIZE_BITS < SHA3_256_DIGEST_SIZE_BITS) 43*f0865ec9SKyle Evans #undef MAX_DIGEST_SIZE_BITS 44*f0865ec9SKyle Evans #define MAX_DIGEST_SIZE_BITS SHA3_256_DIGEST_SIZE_BITS 45*f0865ec9SKyle Evans #endif 46*f0865ec9SKyle Evans 47*f0865ec9SKyle Evans #ifndef MAX_BLOCK_SIZE 48*f0865ec9SKyle Evans #define MAX_BLOCK_SIZE 0 49*f0865ec9SKyle Evans #endif 50*f0865ec9SKyle Evans #if (MAX_BLOCK_SIZE < SHA3_256_BLOCK_SIZE) 51*f0865ec9SKyle Evans #undef MAX_BLOCK_SIZE 52*f0865ec9SKyle Evans #define MAX_BLOCK_SIZE SHA3_256_BLOCK_SIZE 53*f0865ec9SKyle Evans #endif 54*f0865ec9SKyle Evans 55*f0865ec9SKyle Evans #define SHA3_256_HASH_MAGIC ((word_t)(0x3452987573933416ULL)) 56*f0865ec9SKyle Evans #define SHA3_256_HASH_CHECK_INITIALIZED(A, ret, err) \ 57*f0865ec9SKyle Evans MUST_HAVE((((void *)(A)) != NULL) && ((A)->magic == SHA3_256_HASH_MAGIC), ret, err) 58*f0865ec9SKyle Evans 59*f0865ec9SKyle Evans typedef sha3_context sha3_256_context; 60*f0865ec9SKyle Evans 61*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int sha3_256_init(sha3_256_context *ctx); 62*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int sha3_256_update(sha3_256_context *ctx, const u8 *input, u32 ilen); 63*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int sha3_256_final(sha3_256_context *ctx, u8 output[SHA3_256_DIGEST_SIZE]); 64*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int sha3_256_scattered(const u8 **inputs, const u32 *ilens, 65*f0865ec9SKyle Evans u8 output[SHA3_256_DIGEST_SIZE]); 66*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int sha3_256(const u8 *input, u32 ilen, u8 output[SHA3_256_DIGEST_SIZE]); 67*f0865ec9SKyle Evans 68*f0865ec9SKyle Evans #endif /* __SHA3_256_H__ */ 69*f0865ec9SKyle Evans #endif /* WITH_HASH_SHA3_256 */ 70