Branch data Line data Source code
1 : : /* SHA512
2 : : * Daniel Beer <dlbeer@gmail.com>, 22 Apr 2014
3 : : *
4 : : * This file is in the public domain.
5 : : */
6 : :
7 : : #ifndef SHA512_H_
8 : : #define SHA512_H_
9 : :
10 : : #if !defined(COMPACT_DISABLE_ED25519) || !defined(COMPACT_DISABLE_X25519_DERIVE)
11 : : #include <stdint.h>
12 : : #include <stddef.h>
13 : : #include <string.h>
14 : :
15 : : /* SHA512 state. State is updated as data is fed in, and then the final
16 : : * hash can be read out in slices.
17 : : *
18 : : * Data is fed in as a sequence of full blocks terminated by a single
19 : : * partial block.
20 : : */
21 : : struct sha512_state {
22 : : uint64_t h[8];
23 : : };
24 : :
25 : : /* Initial state */
26 : : extern const struct sha512_state sha512_initial_state;
27 : :
28 : : /* Set up a new context */
29 : 8 : static inline void sha512_init(struct sha512_state *s)
30 : : {
31 : 8 : memcpy(s, &sha512_initial_state, sizeof(*s));
32 : 8 : }
33 : :
34 : : /* Feed a full block in */
35 : : #define SHA512_BLOCK_SIZE 128
36 : :
37 : : void sha512_block(struct sha512_state *s, const uint8_t *blk);
38 : :
39 : : /* Feed the last partial block in. The total stream size must be
40 : : * specified. The size of the block given is assumed to be (total_size %
41 : : * SHA512_BLOCK_SIZE). This might be zero, but you still need to call
42 : : * this function to terminate the stream.
43 : : */
44 : : void sha512_final(struct sha512_state *s, const uint8_t *blk,
45 : : size_t total_size);
46 : :
47 : : /* Fetch a slice of the hash result. */
48 : : #define SHA512_HASH_SIZE 64
49 : :
50 : : void sha512_get(const struct sha512_state *s, uint8_t *hash,
51 : : unsigned int offset, unsigned int len);
52 : :
53 : : #endif
54 : : #endif
|