aboutsummaryrefslogtreecommitdiffstats
path: root/c/sha3.h
blob: a66d937894aea565395a02998924175d89c54bc7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
 * sha3sum – SHA-3 (Keccak) checksum calculator
 * 
 * Copyright © 2013, 2014  Mattias Andrée (maandree@member.fsf.org)
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef __SHA3_H__
#define __SHA3_H__

#include <stdlib.h>


#ifdef WITH_C99
  #include <inttypes.h>
  #define restrict_ restrict
  #define byte int_fast8_t
  #define boolean int_fast8_t
  #define llong int_fast64_t
  #define ullong uint_fast64_t
#else
  #define restrict_ /* introduced in C99 */
  #define byte char
  #define boolean char
  #if __x86_64__ || __ppc64__
    #define llong long int
  #else
    #define llong long long int
  #endif
  #define ullong unsigned llong
#endif


/**
 * Suffix the message when calculating the Keccak hash sum
 */
#define KECCAK_SUFFIX  ""

/**
 * Suffix the message when calculating the SHA-3 hash sum
 */
#define SHA3_SUFFIX  "01"
  
/**
 * Suffix the message when calculating the RawSHAKE hash sum
 */
#define RawSHAKE_SUFFIX  "11"
  
/**
 * Suffix the message when calculating the SHAKE hash sum
 */
#define SHAKE_SUFFIX  "1111"


/**
 * Initialise Keccak sponge
 * 
 * @param  bitrate   The bitrate
 * @param  capacity  The capacity
 * @param  output    The output size
 */
void sha3_initialise(long bitrate, long capacity, long output);


/**
 * Dispose of the Keccak sponge
 */
void sha3_dispose(void);


/**
 * Absorb the more of the message to the Keccak sponge
 * 
 * @param  msg     The partial message
 * @param  msglen  The length of the partial message
 */
void sha3_update(byte* restrict_ msg, long msglen);


/**
 * Absorb the last part of the message and squeeze the Keccak sponge
 * 
 * @param   msg         The rest of the message, may be {@code null}
 * @param   msglen      The length of the partial message
 * @param   bits        The number of bits at the end of the message not covered by `msglen`
 * @param   suffix      The suffix concatenate to the message
 * @param   withReturn  Whether to return the hash instead of just do a quick squeeze phrase and return {@code null}
 * @return              The hash sum, or {@code null} if <tt>withReturn</tt> is {@code false}
 */
byte* sha3_digest(byte* restrict_ msg, long msglen, long bits, char* restrict_ suffix, boolean withReturn);


/**
 * Force some rounds of Keccak-f
 * 
 * @param  times  The number of rounds
 */
void sha3_simpleSqueeze(long times);


/**
 * Squeeze as much as is needed to get a digest a number of times
 * 
 * @param  times  The number of digests
 */
void sha3_fastSqueeze(long times);


/**
 * Squeeze out another digest
 * 
 * @return  The hash sum
 */
byte* sha3_squeeze(void);


/**
 * Retrieve the state of the Keccak sponge
 * 
 * @return  A 25-element array with the state, changes will be applied to the sponge
 */
llong* sha3_state(void);


#endif