/ external / libecc / src / hash / shake256.c
shake256.c
 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 */