1 /* 2 * Copyright (C) 2021 - This file is part of libecc project 3 * 4 * Authors: 5 * Ryad BENADJILA <ryadbenadjila@gmail.com> 6 * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7 * 8 * This software is licensed under a dual BSD and GPL v2 license. 9 * See LICENSE file at the root folder of the project. 10 */ 11 #include <libecc/lib_ecc_config.h> 12 #ifdef WITH_HASH_SHAKE256 13 14 #include <libecc/hash/shake256.h> 15 16 int shake256_init(shake256_context *ctx) 17 { 18 int ret; 19 20 ret = _shake_init(ctx, SHAKE256_DIGEST_SIZE, SHAKE256_BLOCK_SIZE); EG(ret, err); 21 22 /* Tell that we are initialized */ 23 ctx->magic = SHAKE256_HASH_MAGIC; 24 25 err: 26 return ret; 27 } 28 29 int shake256_update(shake256_context *ctx, const u8 *input, u32 ilen) 30 { 31 int ret; 32 33 SHAKE256_HASH_CHECK_INITIALIZED(ctx, ret, err); 34 35 ret = _shake_update((shake_context *)ctx, input, ilen); 36 37 err: 38 return ret; 39 } 40 41 int shake256_final(shake256_context *ctx, u8 output[SHAKE256_DIGEST_SIZE]) 42 { 43 int ret; 44 45 SHAKE256_HASH_CHECK_INITIALIZED(ctx, ret, err); 46 47 ret = _shake_finalize((shake_context *)ctx, output); 48 49 /* Tell that we are uninitialized */ 50 ctx->magic = WORD(0); 51 52 err: 53 return ret; 54 } 55 56 int shake256_scattered(const u8 **inputs, const u32 *ilens, 57 u8 output[SHAKE256_DIGEST_SIZE]) 58 { 59 shake256_context ctx; 60 int pos = 0, ret; 61 62 MUST_HAVE((inputs != NULL) && (ilens != NULL) && (output != NULL), ret, err); 63 64 ret = shake256_init(&ctx); EG(ret, err); 65 66 while (inputs[pos] != NULL) { 67 ret = shake256_update(&ctx, inputs[pos], ilens[pos]); EG(ret, err); 68 pos += 1; 69 } 70 71 ret = shake256_final(&ctx, output); 72 73 err: 74 return ret; 75 } 76 77 int shake256(const u8 *input, u32 ilen, u8 output[SHAKE256_DIGEST_SIZE]) 78 { 79 int ret; 80 shake256_context ctx; 81 82 ret = shake256_init(&ctx); EG(ret, err); 83 ret = shake256_update(&ctx, input, ilen); EG(ret, err); 84 ret = shake256_final(&ctx, output); 85 86 err: 87 return ret; 88 } 89 90 #else /* WITH_HASH_SHAKE256 */ 91 92 /* 93 * Dummy definition to avoid the empty translation unit ISO C warning 94 */ 95 typedef int dummy; 96 #endif /* WITH_HASH_SHAKE256 */ 97