Nuitka-winsvc 2.3.3__cp311-cp311-win_amd64.whl → 2.3.11__cp311-cp311-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Nuitka-winsvc might be problematic. Click here for more details.
- {Nuitka_winsvc-2.3.3.dist-info → Nuitka_winsvc-2.3.11.dist-info}/METADATA +1 -1
- {Nuitka_winsvc-2.3.3.dist-info → Nuitka_winsvc-2.3.11.dist-info}/RECORD +63 -42
- {Nuitka_winsvc-2.3.3.dist-info → Nuitka_winsvc-2.3.11.dist-info}/WHEEL +1 -1
- nuitka/Options.py +1 -1
- nuitka/PythonFlavors.py +15 -0
- nuitka/Tracing.py +26 -23
- nuitka/Version.py +1 -1
- nuitka/build/SconsUtils.py +1 -1
- nuitka/build/include/nuitka/compiled_function.h +2 -0
- nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
- nuitka/build/static_src/CompiledCodeHelpers.c +2 -0
- nuitka/build/static_src/CompiledFrameType.c +2 -5
- nuitka/build/static_src/CompiledFunctionType.c +43 -4
- nuitka/build/static_src/HelpersAllocator.c +0 -2
- nuitka/build/static_src/HelpersBuiltin.c +2 -2
- nuitka/build/static_src/HelpersHeapStorage.c +4 -0
- nuitka/build/static_src/MainProgram.c +17 -0
- nuitka/build/static_src/MetaPathBasedLoader.c +77 -48
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +29 -0
- nuitka/code_generation/templates/CodeTemplatesModules.py +1 -10
- nuitka/freezer/DllDependenciesCommon.py +28 -3
- nuitka/freezer/DllDependenciesMacOS.py +23 -2
- nuitka/freezer/DllDependenciesWin32.py +6 -1
- nuitka/importing/Importing.py +5 -1
- nuitka/nodes/FunctionNodes.py +4 -1
- nuitka/nodes/ModuleNodes.py +3 -4
- nuitka/nodes/NodeBases.py +10 -9
- nuitka/nodes/shapes/BuiltinTypeShapes.py +21 -1
- nuitka/plugins/PluginBase.py +11 -3
- nuitka/plugins/standard/KivyPlugin.py +10 -0
- nuitka/plugins/standard/standard.nuitka-package.config.yml +240 -25
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +38 -2
- nuitka/tools/testing/Common.py +22 -2
- nuitka/tree/InternalModule.py +1 -1
- nuitka/tree/ReformulationFunctionStatements.py +1 -0
- nuitka/utils/Execution.py +8 -7
- nuitka/utils/FileOperations.py +38 -1
- nuitka/utils/SharedLibraries.py +38 -34
- {Nuitka_winsvc-2.3.3.data → Nuitka_winsvc-2.3.11.data}/scripts/nuitka-run.bat +0 -0
- {Nuitka_winsvc-2.3.3.data → Nuitka_winsvc-2.3.11.data}/scripts/nuitka.bat +0 -0
- {Nuitka_winsvc-2.3.3.dist-info → Nuitka_winsvc-2.3.11.dist-info}/LICENSE.txt +0 -0
- {Nuitka_winsvc-2.3.3.dist-info → Nuitka_winsvc-2.3.11.dist-info}/entry_points.txt +0 -0
- {Nuitka_winsvc-2.3.3.dist-info → Nuitka_winsvc-2.3.11.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,1273 @@
|
|
|
1
|
+
/* MIT License
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) 2016-2022 INRIA, CMU and Microsoft Corporation
|
|
4
|
+
* Copyright (c) 2022-2023 HACL* Contributors
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
* copies or substantial portions of the Software.
|
|
15
|
+
*
|
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
* SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
#include "internal/Hacl_Hash_SHA2.h"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
void Hacl_Hash_SHA2_sha256_init(uint32_t *hash)
|
|
31
|
+
{
|
|
32
|
+
KRML_MAYBE_FOR8(i,
|
|
33
|
+
0U,
|
|
34
|
+
8U,
|
|
35
|
+
1U,
|
|
36
|
+
uint32_t *os = hash;
|
|
37
|
+
uint32_t x = Hacl_Hash_SHA2_h256[i];
|
|
38
|
+
os[i] = x;);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static inline void sha256_update(uint8_t *b, uint32_t *hash)
|
|
42
|
+
{
|
|
43
|
+
uint32_t hash_old[8U] = { 0U };
|
|
44
|
+
uint32_t ws[16U] = { 0U };
|
|
45
|
+
memcpy(hash_old, hash, 8U * sizeof (uint32_t));
|
|
46
|
+
uint8_t *b10 = b;
|
|
47
|
+
uint32_t u = load32_be(b10);
|
|
48
|
+
ws[0U] = u;
|
|
49
|
+
uint32_t u0 = load32_be(b10 + 4U);
|
|
50
|
+
ws[1U] = u0;
|
|
51
|
+
uint32_t u1 = load32_be(b10 + 8U);
|
|
52
|
+
ws[2U] = u1;
|
|
53
|
+
uint32_t u2 = load32_be(b10 + 12U);
|
|
54
|
+
ws[3U] = u2;
|
|
55
|
+
uint32_t u3 = load32_be(b10 + 16U);
|
|
56
|
+
ws[4U] = u3;
|
|
57
|
+
uint32_t u4 = load32_be(b10 + 20U);
|
|
58
|
+
ws[5U] = u4;
|
|
59
|
+
uint32_t u5 = load32_be(b10 + 24U);
|
|
60
|
+
ws[6U] = u5;
|
|
61
|
+
uint32_t u6 = load32_be(b10 + 28U);
|
|
62
|
+
ws[7U] = u6;
|
|
63
|
+
uint32_t u7 = load32_be(b10 + 32U);
|
|
64
|
+
ws[8U] = u7;
|
|
65
|
+
uint32_t u8 = load32_be(b10 + 36U);
|
|
66
|
+
ws[9U] = u8;
|
|
67
|
+
uint32_t u9 = load32_be(b10 + 40U);
|
|
68
|
+
ws[10U] = u9;
|
|
69
|
+
uint32_t u10 = load32_be(b10 + 44U);
|
|
70
|
+
ws[11U] = u10;
|
|
71
|
+
uint32_t u11 = load32_be(b10 + 48U);
|
|
72
|
+
ws[12U] = u11;
|
|
73
|
+
uint32_t u12 = load32_be(b10 + 52U);
|
|
74
|
+
ws[13U] = u12;
|
|
75
|
+
uint32_t u13 = load32_be(b10 + 56U);
|
|
76
|
+
ws[14U] = u13;
|
|
77
|
+
uint32_t u14 = load32_be(b10 + 60U);
|
|
78
|
+
ws[15U] = u14;
|
|
79
|
+
KRML_MAYBE_FOR4(i0,
|
|
80
|
+
0U,
|
|
81
|
+
4U,
|
|
82
|
+
1U,
|
|
83
|
+
KRML_MAYBE_FOR16(i,
|
|
84
|
+
0U,
|
|
85
|
+
16U,
|
|
86
|
+
1U,
|
|
87
|
+
uint32_t k_t = Hacl_Hash_SHA2_k224_256[16U * i0 + i];
|
|
88
|
+
uint32_t ws_t = ws[i];
|
|
89
|
+
uint32_t a0 = hash[0U];
|
|
90
|
+
uint32_t b0 = hash[1U];
|
|
91
|
+
uint32_t c0 = hash[2U];
|
|
92
|
+
uint32_t d0 = hash[3U];
|
|
93
|
+
uint32_t e0 = hash[4U];
|
|
94
|
+
uint32_t f0 = hash[5U];
|
|
95
|
+
uint32_t g0 = hash[6U];
|
|
96
|
+
uint32_t h02 = hash[7U];
|
|
97
|
+
uint32_t k_e_t = k_t;
|
|
98
|
+
uint32_t
|
|
99
|
+
t1 =
|
|
100
|
+
h02
|
|
101
|
+
+ ((e0 << 26U | e0 >> 6U) ^ ((e0 << 21U | e0 >> 11U) ^ (e0 << 7U | e0 >> 25U)))
|
|
102
|
+
+ ((e0 & f0) ^ (~e0 & g0))
|
|
103
|
+
+ k_e_t
|
|
104
|
+
+ ws_t;
|
|
105
|
+
uint32_t
|
|
106
|
+
t2 =
|
|
107
|
+
((a0 << 30U | a0 >> 2U) ^ ((a0 << 19U | a0 >> 13U) ^ (a0 << 10U | a0 >> 22U)))
|
|
108
|
+
+ ((a0 & b0) ^ ((a0 & c0) ^ (b0 & c0)));
|
|
109
|
+
uint32_t a1 = t1 + t2;
|
|
110
|
+
uint32_t b1 = a0;
|
|
111
|
+
uint32_t c1 = b0;
|
|
112
|
+
uint32_t d1 = c0;
|
|
113
|
+
uint32_t e1 = d0 + t1;
|
|
114
|
+
uint32_t f1 = e0;
|
|
115
|
+
uint32_t g1 = f0;
|
|
116
|
+
uint32_t h12 = g0;
|
|
117
|
+
hash[0U] = a1;
|
|
118
|
+
hash[1U] = b1;
|
|
119
|
+
hash[2U] = c1;
|
|
120
|
+
hash[3U] = d1;
|
|
121
|
+
hash[4U] = e1;
|
|
122
|
+
hash[5U] = f1;
|
|
123
|
+
hash[6U] = g1;
|
|
124
|
+
hash[7U] = h12;);
|
|
125
|
+
if (i0 < 3U)
|
|
126
|
+
{
|
|
127
|
+
KRML_MAYBE_FOR16(i,
|
|
128
|
+
0U,
|
|
129
|
+
16U,
|
|
130
|
+
1U,
|
|
131
|
+
uint32_t t16 = ws[i];
|
|
132
|
+
uint32_t t15 = ws[(i + 1U) % 16U];
|
|
133
|
+
uint32_t t7 = ws[(i + 9U) % 16U];
|
|
134
|
+
uint32_t t2 = ws[(i + 14U) % 16U];
|
|
135
|
+
uint32_t s1 = (t2 << 15U | t2 >> 17U) ^ ((t2 << 13U | t2 >> 19U) ^ t2 >> 10U);
|
|
136
|
+
uint32_t s0 = (t15 << 25U | t15 >> 7U) ^ ((t15 << 14U | t15 >> 18U) ^ t15 >> 3U);
|
|
137
|
+
ws[i] = s1 + t7 + s0 + t16;);
|
|
138
|
+
});
|
|
139
|
+
KRML_MAYBE_FOR8(i,
|
|
140
|
+
0U,
|
|
141
|
+
8U,
|
|
142
|
+
1U,
|
|
143
|
+
uint32_t *os = hash;
|
|
144
|
+
uint32_t x = hash[i] + hash_old[i];
|
|
145
|
+
os[i] = x;);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
void Hacl_Hash_SHA2_sha256_update_nblocks(uint32_t len, uint8_t *b, uint32_t *st)
|
|
149
|
+
{
|
|
150
|
+
uint32_t blocks = len / 64U;
|
|
151
|
+
for (uint32_t i = 0U; i < blocks; i++)
|
|
152
|
+
{
|
|
153
|
+
uint8_t *b0 = b;
|
|
154
|
+
uint8_t *mb = b0 + i * 64U;
|
|
155
|
+
sha256_update(mb, st);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
void
|
|
160
|
+
Hacl_Hash_SHA2_sha256_update_last(uint64_t totlen, uint32_t len, uint8_t *b, uint32_t *hash)
|
|
161
|
+
{
|
|
162
|
+
uint32_t blocks;
|
|
163
|
+
if (len + 8U + 1U <= 64U)
|
|
164
|
+
{
|
|
165
|
+
blocks = 1U;
|
|
166
|
+
}
|
|
167
|
+
else
|
|
168
|
+
{
|
|
169
|
+
blocks = 2U;
|
|
170
|
+
}
|
|
171
|
+
uint32_t fin = blocks * 64U;
|
|
172
|
+
uint8_t last[128U] = { 0U };
|
|
173
|
+
uint8_t totlen_buf[8U] = { 0U };
|
|
174
|
+
uint64_t total_len_bits = totlen << 3U;
|
|
175
|
+
store64_be(totlen_buf, total_len_bits);
|
|
176
|
+
uint8_t *b0 = b;
|
|
177
|
+
memcpy(last, b0, len * sizeof (uint8_t));
|
|
178
|
+
last[len] = 0x80U;
|
|
179
|
+
memcpy(last + fin - 8U, totlen_buf, 8U * sizeof (uint8_t));
|
|
180
|
+
uint8_t *last00 = last;
|
|
181
|
+
uint8_t *last10 = last + 64U;
|
|
182
|
+
uint8_t *l0 = last00;
|
|
183
|
+
uint8_t *l1 = last10;
|
|
184
|
+
uint8_t *lb0 = l0;
|
|
185
|
+
uint8_t *lb1 = l1;
|
|
186
|
+
uint8_t *last0 = lb0;
|
|
187
|
+
uint8_t *last1 = lb1;
|
|
188
|
+
sha256_update(last0, hash);
|
|
189
|
+
if (blocks > 1U)
|
|
190
|
+
{
|
|
191
|
+
sha256_update(last1, hash);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
void Hacl_Hash_SHA2_sha256_finish(uint32_t *st, uint8_t *h)
|
|
197
|
+
{
|
|
198
|
+
uint8_t hbuf[32U] = { 0U };
|
|
199
|
+
KRML_MAYBE_FOR8(i, 0U, 8U, 1U, store32_be(hbuf + i * 4U, st[i]););
|
|
200
|
+
memcpy(h, hbuf, 32U * sizeof (uint8_t));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
void Hacl_Hash_SHA2_sha224_init(uint32_t *hash)
|
|
204
|
+
{
|
|
205
|
+
KRML_MAYBE_FOR8(i,
|
|
206
|
+
0U,
|
|
207
|
+
8U,
|
|
208
|
+
1U,
|
|
209
|
+
uint32_t *os = hash;
|
|
210
|
+
uint32_t x = Hacl_Hash_SHA2_h224[i];
|
|
211
|
+
os[i] = x;);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
static inline void sha224_update_nblocks(uint32_t len, uint8_t *b, uint32_t *st)
|
|
215
|
+
{
|
|
216
|
+
Hacl_Hash_SHA2_sha256_update_nblocks(len, b, st);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
void Hacl_Hash_SHA2_sha224_update_last(uint64_t totlen, uint32_t len, uint8_t *b, uint32_t *st)
|
|
220
|
+
{
|
|
221
|
+
Hacl_Hash_SHA2_sha256_update_last(totlen, len, b, st);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
void Hacl_Hash_SHA2_sha224_finish(uint32_t *st, uint8_t *h)
|
|
225
|
+
{
|
|
226
|
+
uint8_t hbuf[32U] = { 0U };
|
|
227
|
+
KRML_MAYBE_FOR8(i, 0U, 8U, 1U, store32_be(hbuf + i * 4U, st[i]););
|
|
228
|
+
memcpy(h, hbuf, 28U * sizeof (uint8_t));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
void Hacl_Hash_SHA2_sha512_init(uint64_t *hash)
|
|
232
|
+
{
|
|
233
|
+
KRML_MAYBE_FOR8(i,
|
|
234
|
+
0U,
|
|
235
|
+
8U,
|
|
236
|
+
1U,
|
|
237
|
+
uint64_t *os = hash;
|
|
238
|
+
uint64_t x = Hacl_Hash_SHA2_h512[i];
|
|
239
|
+
os[i] = x;);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
static inline void sha512_update(uint8_t *b, uint64_t *hash)
|
|
243
|
+
{
|
|
244
|
+
uint64_t hash_old[8U] = { 0U };
|
|
245
|
+
uint64_t ws[16U] = { 0U };
|
|
246
|
+
memcpy(hash_old, hash, 8U * sizeof (uint64_t));
|
|
247
|
+
uint8_t *b10 = b;
|
|
248
|
+
uint64_t u = load64_be(b10);
|
|
249
|
+
ws[0U] = u;
|
|
250
|
+
uint64_t u0 = load64_be(b10 + 8U);
|
|
251
|
+
ws[1U] = u0;
|
|
252
|
+
uint64_t u1 = load64_be(b10 + 16U);
|
|
253
|
+
ws[2U] = u1;
|
|
254
|
+
uint64_t u2 = load64_be(b10 + 24U);
|
|
255
|
+
ws[3U] = u2;
|
|
256
|
+
uint64_t u3 = load64_be(b10 + 32U);
|
|
257
|
+
ws[4U] = u3;
|
|
258
|
+
uint64_t u4 = load64_be(b10 + 40U);
|
|
259
|
+
ws[5U] = u4;
|
|
260
|
+
uint64_t u5 = load64_be(b10 + 48U);
|
|
261
|
+
ws[6U] = u5;
|
|
262
|
+
uint64_t u6 = load64_be(b10 + 56U);
|
|
263
|
+
ws[7U] = u6;
|
|
264
|
+
uint64_t u7 = load64_be(b10 + 64U);
|
|
265
|
+
ws[8U] = u7;
|
|
266
|
+
uint64_t u8 = load64_be(b10 + 72U);
|
|
267
|
+
ws[9U] = u8;
|
|
268
|
+
uint64_t u9 = load64_be(b10 + 80U);
|
|
269
|
+
ws[10U] = u9;
|
|
270
|
+
uint64_t u10 = load64_be(b10 + 88U);
|
|
271
|
+
ws[11U] = u10;
|
|
272
|
+
uint64_t u11 = load64_be(b10 + 96U);
|
|
273
|
+
ws[12U] = u11;
|
|
274
|
+
uint64_t u12 = load64_be(b10 + 104U);
|
|
275
|
+
ws[13U] = u12;
|
|
276
|
+
uint64_t u13 = load64_be(b10 + 112U);
|
|
277
|
+
ws[14U] = u13;
|
|
278
|
+
uint64_t u14 = load64_be(b10 + 120U);
|
|
279
|
+
ws[15U] = u14;
|
|
280
|
+
KRML_MAYBE_FOR5(i0,
|
|
281
|
+
0U,
|
|
282
|
+
5U,
|
|
283
|
+
1U,
|
|
284
|
+
KRML_MAYBE_FOR16(i,
|
|
285
|
+
0U,
|
|
286
|
+
16U,
|
|
287
|
+
1U,
|
|
288
|
+
uint64_t k_t = Hacl_Hash_SHA2_k384_512[16U * i0 + i];
|
|
289
|
+
uint64_t ws_t = ws[i];
|
|
290
|
+
uint64_t a0 = hash[0U];
|
|
291
|
+
uint64_t b0 = hash[1U];
|
|
292
|
+
uint64_t c0 = hash[2U];
|
|
293
|
+
uint64_t d0 = hash[3U];
|
|
294
|
+
uint64_t e0 = hash[4U];
|
|
295
|
+
uint64_t f0 = hash[5U];
|
|
296
|
+
uint64_t g0 = hash[6U];
|
|
297
|
+
uint64_t h02 = hash[7U];
|
|
298
|
+
uint64_t k_e_t = k_t;
|
|
299
|
+
uint64_t
|
|
300
|
+
t1 =
|
|
301
|
+
h02
|
|
302
|
+
+ ((e0 << 50U | e0 >> 14U) ^ ((e0 << 46U | e0 >> 18U) ^ (e0 << 23U | e0 >> 41U)))
|
|
303
|
+
+ ((e0 & f0) ^ (~e0 & g0))
|
|
304
|
+
+ k_e_t
|
|
305
|
+
+ ws_t;
|
|
306
|
+
uint64_t
|
|
307
|
+
t2 =
|
|
308
|
+
((a0 << 36U | a0 >> 28U) ^ ((a0 << 30U | a0 >> 34U) ^ (a0 << 25U | a0 >> 39U)))
|
|
309
|
+
+ ((a0 & b0) ^ ((a0 & c0) ^ (b0 & c0)));
|
|
310
|
+
uint64_t a1 = t1 + t2;
|
|
311
|
+
uint64_t b1 = a0;
|
|
312
|
+
uint64_t c1 = b0;
|
|
313
|
+
uint64_t d1 = c0;
|
|
314
|
+
uint64_t e1 = d0 + t1;
|
|
315
|
+
uint64_t f1 = e0;
|
|
316
|
+
uint64_t g1 = f0;
|
|
317
|
+
uint64_t h12 = g0;
|
|
318
|
+
hash[0U] = a1;
|
|
319
|
+
hash[1U] = b1;
|
|
320
|
+
hash[2U] = c1;
|
|
321
|
+
hash[3U] = d1;
|
|
322
|
+
hash[4U] = e1;
|
|
323
|
+
hash[5U] = f1;
|
|
324
|
+
hash[6U] = g1;
|
|
325
|
+
hash[7U] = h12;);
|
|
326
|
+
if (i0 < 4U)
|
|
327
|
+
{
|
|
328
|
+
KRML_MAYBE_FOR16(i,
|
|
329
|
+
0U,
|
|
330
|
+
16U,
|
|
331
|
+
1U,
|
|
332
|
+
uint64_t t16 = ws[i];
|
|
333
|
+
uint64_t t15 = ws[(i + 1U) % 16U];
|
|
334
|
+
uint64_t t7 = ws[(i + 9U) % 16U];
|
|
335
|
+
uint64_t t2 = ws[(i + 14U) % 16U];
|
|
336
|
+
uint64_t s1 = (t2 << 45U | t2 >> 19U) ^ ((t2 << 3U | t2 >> 61U) ^ t2 >> 6U);
|
|
337
|
+
uint64_t s0 = (t15 << 63U | t15 >> 1U) ^ ((t15 << 56U | t15 >> 8U) ^ t15 >> 7U);
|
|
338
|
+
ws[i] = s1 + t7 + s0 + t16;);
|
|
339
|
+
});
|
|
340
|
+
KRML_MAYBE_FOR8(i,
|
|
341
|
+
0U,
|
|
342
|
+
8U,
|
|
343
|
+
1U,
|
|
344
|
+
uint64_t *os = hash;
|
|
345
|
+
uint64_t x = hash[i] + hash_old[i];
|
|
346
|
+
os[i] = x;);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
void Hacl_Hash_SHA2_sha512_update_nblocks(uint32_t len, uint8_t *b, uint64_t *st)
|
|
350
|
+
{
|
|
351
|
+
uint32_t blocks = len / 128U;
|
|
352
|
+
for (uint32_t i = 0U; i < blocks; i++)
|
|
353
|
+
{
|
|
354
|
+
uint8_t *b0 = b;
|
|
355
|
+
uint8_t *mb = b0 + i * 128U;
|
|
356
|
+
sha512_update(mb, st);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
void
|
|
361
|
+
Hacl_Hash_SHA2_sha512_update_last(
|
|
362
|
+
FStar_UInt128_uint128 totlen,
|
|
363
|
+
uint32_t len,
|
|
364
|
+
uint8_t *b,
|
|
365
|
+
uint64_t *hash
|
|
366
|
+
)
|
|
367
|
+
{
|
|
368
|
+
uint32_t blocks;
|
|
369
|
+
if (len + 16U + 1U <= 128U)
|
|
370
|
+
{
|
|
371
|
+
blocks = 1U;
|
|
372
|
+
}
|
|
373
|
+
else
|
|
374
|
+
{
|
|
375
|
+
blocks = 2U;
|
|
376
|
+
}
|
|
377
|
+
uint32_t fin = blocks * 128U;
|
|
378
|
+
uint8_t last[256U] = { 0U };
|
|
379
|
+
uint8_t totlen_buf[16U] = { 0U };
|
|
380
|
+
FStar_UInt128_uint128 total_len_bits = FStar_UInt128_shift_left(totlen, 3U);
|
|
381
|
+
store128_be(totlen_buf, total_len_bits);
|
|
382
|
+
uint8_t *b0 = b;
|
|
383
|
+
memcpy(last, b0, len * sizeof (uint8_t));
|
|
384
|
+
last[len] = 0x80U;
|
|
385
|
+
memcpy(last + fin - 16U, totlen_buf, 16U * sizeof (uint8_t));
|
|
386
|
+
uint8_t *last00 = last;
|
|
387
|
+
uint8_t *last10 = last + 128U;
|
|
388
|
+
uint8_t *l0 = last00;
|
|
389
|
+
uint8_t *l1 = last10;
|
|
390
|
+
uint8_t *lb0 = l0;
|
|
391
|
+
uint8_t *lb1 = l1;
|
|
392
|
+
uint8_t *last0 = lb0;
|
|
393
|
+
uint8_t *last1 = lb1;
|
|
394
|
+
sha512_update(last0, hash);
|
|
395
|
+
if (blocks > 1U)
|
|
396
|
+
{
|
|
397
|
+
sha512_update(last1, hash);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
void Hacl_Hash_SHA2_sha512_finish(uint64_t *st, uint8_t *h)
|
|
403
|
+
{
|
|
404
|
+
uint8_t hbuf[64U] = { 0U };
|
|
405
|
+
KRML_MAYBE_FOR8(i, 0U, 8U, 1U, store64_be(hbuf + i * 8U, st[i]););
|
|
406
|
+
memcpy(h, hbuf, 64U * sizeof (uint8_t));
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
void Hacl_Hash_SHA2_sha384_init(uint64_t *hash)
|
|
410
|
+
{
|
|
411
|
+
KRML_MAYBE_FOR8(i,
|
|
412
|
+
0U,
|
|
413
|
+
8U,
|
|
414
|
+
1U,
|
|
415
|
+
uint64_t *os = hash;
|
|
416
|
+
uint64_t x = Hacl_Hash_SHA2_h384[i];
|
|
417
|
+
os[i] = x;);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
void Hacl_Hash_SHA2_sha384_update_nblocks(uint32_t len, uint8_t *b, uint64_t *st)
|
|
421
|
+
{
|
|
422
|
+
Hacl_Hash_SHA2_sha512_update_nblocks(len, b, st);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
void
|
|
426
|
+
Hacl_Hash_SHA2_sha384_update_last(
|
|
427
|
+
FStar_UInt128_uint128 totlen,
|
|
428
|
+
uint32_t len,
|
|
429
|
+
uint8_t *b,
|
|
430
|
+
uint64_t *st
|
|
431
|
+
)
|
|
432
|
+
{
|
|
433
|
+
Hacl_Hash_SHA2_sha512_update_last(totlen, len, b, st);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
void Hacl_Hash_SHA2_sha384_finish(uint64_t *st, uint8_t *h)
|
|
437
|
+
{
|
|
438
|
+
uint8_t hbuf[64U] = { 0U };
|
|
439
|
+
KRML_MAYBE_FOR8(i, 0U, 8U, 1U, store64_be(hbuf + i * 8U, st[i]););
|
|
440
|
+
memcpy(h, hbuf, 48U * sizeof (uint8_t));
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
Allocate initial state for the SHA2_256 hash. The state is to be freed by
|
|
445
|
+
calling `free_256`.
|
|
446
|
+
*/
|
|
447
|
+
Hacl_Streaming_MD_state_32 *Hacl_Hash_SHA2_malloc_256(void)
|
|
448
|
+
{
|
|
449
|
+
uint8_t *buf = (uint8_t *)KRML_HOST_CALLOC(64U, sizeof (uint8_t));
|
|
450
|
+
uint32_t *block_state = (uint32_t *)KRML_HOST_CALLOC(8U, sizeof (uint32_t));
|
|
451
|
+
Hacl_Streaming_MD_state_32
|
|
452
|
+
s = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
453
|
+
Hacl_Streaming_MD_state_32
|
|
454
|
+
*p = (Hacl_Streaming_MD_state_32 *)KRML_HOST_MALLOC(sizeof (Hacl_Streaming_MD_state_32));
|
|
455
|
+
p[0U] = s;
|
|
456
|
+
Hacl_Hash_SHA2_sha256_init(block_state);
|
|
457
|
+
return p;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
Copies the state passed as argument into a newly allocated state (deep copy).
|
|
462
|
+
The state is to be freed by calling `free_256`. Cloning the state this way is
|
|
463
|
+
useful, for instance, if your control-flow diverges and you need to feed
|
|
464
|
+
more (different) data into the hash in each branch.
|
|
465
|
+
*/
|
|
466
|
+
Hacl_Streaming_MD_state_32 *Hacl_Hash_SHA2_copy_256(Hacl_Streaming_MD_state_32 *state)
|
|
467
|
+
{
|
|
468
|
+
Hacl_Streaming_MD_state_32 scrut = *state;
|
|
469
|
+
uint32_t *block_state0 = scrut.block_state;
|
|
470
|
+
uint8_t *buf0 = scrut.buf;
|
|
471
|
+
uint64_t total_len0 = scrut.total_len;
|
|
472
|
+
uint8_t *buf = (uint8_t *)KRML_HOST_CALLOC(64U, sizeof (uint8_t));
|
|
473
|
+
memcpy(buf, buf0, 64U * sizeof (uint8_t));
|
|
474
|
+
uint32_t *block_state = (uint32_t *)KRML_HOST_CALLOC(8U, sizeof (uint32_t));
|
|
475
|
+
memcpy(block_state, block_state0, 8U * sizeof (uint32_t));
|
|
476
|
+
Hacl_Streaming_MD_state_32
|
|
477
|
+
s = { .block_state = block_state, .buf = buf, .total_len = total_len0 };
|
|
478
|
+
Hacl_Streaming_MD_state_32
|
|
479
|
+
*p = (Hacl_Streaming_MD_state_32 *)KRML_HOST_MALLOC(sizeof (Hacl_Streaming_MD_state_32));
|
|
480
|
+
p[0U] = s;
|
|
481
|
+
return p;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
Reset an existing state to the initial hash state with empty data.
|
|
486
|
+
*/
|
|
487
|
+
void Hacl_Hash_SHA2_reset_256(Hacl_Streaming_MD_state_32 *state)
|
|
488
|
+
{
|
|
489
|
+
Hacl_Streaming_MD_state_32 scrut = *state;
|
|
490
|
+
uint8_t *buf = scrut.buf;
|
|
491
|
+
uint32_t *block_state = scrut.block_state;
|
|
492
|
+
Hacl_Hash_SHA2_sha256_init(block_state);
|
|
493
|
+
Hacl_Streaming_MD_state_32
|
|
494
|
+
tmp = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
495
|
+
state[0U] = tmp;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
static inline Hacl_Streaming_Types_error_code
|
|
499
|
+
update_224_256(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t chunk_len)
|
|
500
|
+
{
|
|
501
|
+
Hacl_Streaming_MD_state_32 s = *state;
|
|
502
|
+
uint64_t total_len = s.total_len;
|
|
503
|
+
if ((uint64_t)chunk_len > 2305843009213693951ULL - total_len)
|
|
504
|
+
{
|
|
505
|
+
return Hacl_Streaming_Types_MaximumLengthExceeded;
|
|
506
|
+
}
|
|
507
|
+
uint32_t sz;
|
|
508
|
+
if (total_len % (uint64_t)64U == 0ULL && total_len > 0ULL)
|
|
509
|
+
{
|
|
510
|
+
sz = 64U;
|
|
511
|
+
}
|
|
512
|
+
else
|
|
513
|
+
{
|
|
514
|
+
sz = (uint32_t)(total_len % (uint64_t)64U);
|
|
515
|
+
}
|
|
516
|
+
if (chunk_len <= 64U - sz)
|
|
517
|
+
{
|
|
518
|
+
Hacl_Streaming_MD_state_32 s1 = *state;
|
|
519
|
+
uint32_t *block_state1 = s1.block_state;
|
|
520
|
+
uint8_t *buf = s1.buf;
|
|
521
|
+
uint64_t total_len1 = s1.total_len;
|
|
522
|
+
uint32_t sz1;
|
|
523
|
+
if (total_len1 % (uint64_t)64U == 0ULL && total_len1 > 0ULL)
|
|
524
|
+
{
|
|
525
|
+
sz1 = 64U;
|
|
526
|
+
}
|
|
527
|
+
else
|
|
528
|
+
{
|
|
529
|
+
sz1 = (uint32_t)(total_len1 % (uint64_t)64U);
|
|
530
|
+
}
|
|
531
|
+
uint8_t *buf2 = buf + sz1;
|
|
532
|
+
memcpy(buf2, chunk, chunk_len * sizeof (uint8_t));
|
|
533
|
+
uint64_t total_len2 = total_len1 + (uint64_t)chunk_len;
|
|
534
|
+
*state
|
|
535
|
+
=
|
|
536
|
+
(
|
|
537
|
+
(Hacl_Streaming_MD_state_32){
|
|
538
|
+
.block_state = block_state1,
|
|
539
|
+
.buf = buf,
|
|
540
|
+
.total_len = total_len2
|
|
541
|
+
}
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
else if (sz == 0U)
|
|
545
|
+
{
|
|
546
|
+
Hacl_Streaming_MD_state_32 s1 = *state;
|
|
547
|
+
uint32_t *block_state1 = s1.block_state;
|
|
548
|
+
uint8_t *buf = s1.buf;
|
|
549
|
+
uint64_t total_len1 = s1.total_len;
|
|
550
|
+
uint32_t sz1;
|
|
551
|
+
if (total_len1 % (uint64_t)64U == 0ULL && total_len1 > 0ULL)
|
|
552
|
+
{
|
|
553
|
+
sz1 = 64U;
|
|
554
|
+
}
|
|
555
|
+
else
|
|
556
|
+
{
|
|
557
|
+
sz1 = (uint32_t)(total_len1 % (uint64_t)64U);
|
|
558
|
+
}
|
|
559
|
+
if (!(sz1 == 0U))
|
|
560
|
+
{
|
|
561
|
+
Hacl_Hash_SHA2_sha256_update_nblocks(64U, buf, block_state1);
|
|
562
|
+
}
|
|
563
|
+
uint32_t ite;
|
|
564
|
+
if ((uint64_t)chunk_len % (uint64_t)64U == 0ULL && (uint64_t)chunk_len > 0ULL)
|
|
565
|
+
{
|
|
566
|
+
ite = 64U;
|
|
567
|
+
}
|
|
568
|
+
else
|
|
569
|
+
{
|
|
570
|
+
ite = (uint32_t)((uint64_t)chunk_len % (uint64_t)64U);
|
|
571
|
+
}
|
|
572
|
+
uint32_t n_blocks = (chunk_len - ite) / 64U;
|
|
573
|
+
uint32_t data1_len = n_blocks * 64U;
|
|
574
|
+
uint32_t data2_len = chunk_len - data1_len;
|
|
575
|
+
uint8_t *data1 = chunk;
|
|
576
|
+
uint8_t *data2 = chunk + data1_len;
|
|
577
|
+
Hacl_Hash_SHA2_sha256_update_nblocks(data1_len / 64U * 64U, data1, block_state1);
|
|
578
|
+
uint8_t *dst = buf;
|
|
579
|
+
memcpy(dst, data2, data2_len * sizeof (uint8_t));
|
|
580
|
+
*state
|
|
581
|
+
=
|
|
582
|
+
(
|
|
583
|
+
(Hacl_Streaming_MD_state_32){
|
|
584
|
+
.block_state = block_state1,
|
|
585
|
+
.buf = buf,
|
|
586
|
+
.total_len = total_len1 + (uint64_t)chunk_len
|
|
587
|
+
}
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
else
|
|
591
|
+
{
|
|
592
|
+
uint32_t diff = 64U - sz;
|
|
593
|
+
uint8_t *chunk1 = chunk;
|
|
594
|
+
uint8_t *chunk2 = chunk + diff;
|
|
595
|
+
Hacl_Streaming_MD_state_32 s1 = *state;
|
|
596
|
+
uint32_t *block_state10 = s1.block_state;
|
|
597
|
+
uint8_t *buf0 = s1.buf;
|
|
598
|
+
uint64_t total_len10 = s1.total_len;
|
|
599
|
+
uint32_t sz10;
|
|
600
|
+
if (total_len10 % (uint64_t)64U == 0ULL && total_len10 > 0ULL)
|
|
601
|
+
{
|
|
602
|
+
sz10 = 64U;
|
|
603
|
+
}
|
|
604
|
+
else
|
|
605
|
+
{
|
|
606
|
+
sz10 = (uint32_t)(total_len10 % (uint64_t)64U);
|
|
607
|
+
}
|
|
608
|
+
uint8_t *buf2 = buf0 + sz10;
|
|
609
|
+
memcpy(buf2, chunk1, diff * sizeof (uint8_t));
|
|
610
|
+
uint64_t total_len2 = total_len10 + (uint64_t)diff;
|
|
611
|
+
*state
|
|
612
|
+
=
|
|
613
|
+
(
|
|
614
|
+
(Hacl_Streaming_MD_state_32){
|
|
615
|
+
.block_state = block_state10,
|
|
616
|
+
.buf = buf0,
|
|
617
|
+
.total_len = total_len2
|
|
618
|
+
}
|
|
619
|
+
);
|
|
620
|
+
Hacl_Streaming_MD_state_32 s10 = *state;
|
|
621
|
+
uint32_t *block_state1 = s10.block_state;
|
|
622
|
+
uint8_t *buf = s10.buf;
|
|
623
|
+
uint64_t total_len1 = s10.total_len;
|
|
624
|
+
uint32_t sz1;
|
|
625
|
+
if (total_len1 % (uint64_t)64U == 0ULL && total_len1 > 0ULL)
|
|
626
|
+
{
|
|
627
|
+
sz1 = 64U;
|
|
628
|
+
}
|
|
629
|
+
else
|
|
630
|
+
{
|
|
631
|
+
sz1 = (uint32_t)(total_len1 % (uint64_t)64U);
|
|
632
|
+
}
|
|
633
|
+
if (!(sz1 == 0U))
|
|
634
|
+
{
|
|
635
|
+
Hacl_Hash_SHA2_sha256_update_nblocks(64U, buf, block_state1);
|
|
636
|
+
}
|
|
637
|
+
uint32_t ite;
|
|
638
|
+
if
|
|
639
|
+
((uint64_t)(chunk_len - diff) % (uint64_t)64U == 0ULL && (uint64_t)(chunk_len - diff) > 0ULL)
|
|
640
|
+
{
|
|
641
|
+
ite = 64U;
|
|
642
|
+
}
|
|
643
|
+
else
|
|
644
|
+
{
|
|
645
|
+
ite = (uint32_t)((uint64_t)(chunk_len - diff) % (uint64_t)64U);
|
|
646
|
+
}
|
|
647
|
+
uint32_t n_blocks = (chunk_len - diff - ite) / 64U;
|
|
648
|
+
uint32_t data1_len = n_blocks * 64U;
|
|
649
|
+
uint32_t data2_len = chunk_len - diff - data1_len;
|
|
650
|
+
uint8_t *data1 = chunk2;
|
|
651
|
+
uint8_t *data2 = chunk2 + data1_len;
|
|
652
|
+
Hacl_Hash_SHA2_sha256_update_nblocks(data1_len / 64U * 64U, data1, block_state1);
|
|
653
|
+
uint8_t *dst = buf;
|
|
654
|
+
memcpy(dst, data2, data2_len * sizeof (uint8_t));
|
|
655
|
+
*state
|
|
656
|
+
=
|
|
657
|
+
(
|
|
658
|
+
(Hacl_Streaming_MD_state_32){
|
|
659
|
+
.block_state = block_state1,
|
|
660
|
+
.buf = buf,
|
|
661
|
+
.total_len = total_len1 + (uint64_t)(chunk_len - diff)
|
|
662
|
+
}
|
|
663
|
+
);
|
|
664
|
+
}
|
|
665
|
+
return Hacl_Streaming_Types_Success;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
Feed an arbitrary amount of data into the hash. This function returns 0 for
|
|
670
|
+
success, or 1 if the combined length of all of the data passed to `update_256`
|
|
671
|
+
(since the last call to `reset_256`) exceeds 2^61-1 bytes.
|
|
672
|
+
|
|
673
|
+
This function is identical to the update function for SHA2_224.
|
|
674
|
+
*/
|
|
675
|
+
Hacl_Streaming_Types_error_code
|
|
676
|
+
Hacl_Hash_SHA2_update_256(
|
|
677
|
+
Hacl_Streaming_MD_state_32 *state,
|
|
678
|
+
uint8_t *input,
|
|
679
|
+
uint32_t input_len
|
|
680
|
+
)
|
|
681
|
+
{
|
|
682
|
+
return update_224_256(state, input, input_len);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
Write the resulting hash into `output`, an array of 32 bytes. The state remains
|
|
687
|
+
valid after a call to `digest_256`, meaning the user may feed more data into
|
|
688
|
+
the hash via `update_256`. (The digest_256 function operates on an internal copy of
|
|
689
|
+
the state and therefore does not invalidate the client-held state `p`.)
|
|
690
|
+
*/
|
|
691
|
+
void Hacl_Hash_SHA2_digest_256(Hacl_Streaming_MD_state_32 *state, uint8_t *output)
|
|
692
|
+
{
|
|
693
|
+
Hacl_Streaming_MD_state_32 scrut = *state;
|
|
694
|
+
uint32_t *block_state = scrut.block_state;
|
|
695
|
+
uint8_t *buf_ = scrut.buf;
|
|
696
|
+
uint64_t total_len = scrut.total_len;
|
|
697
|
+
uint32_t r;
|
|
698
|
+
if (total_len % (uint64_t)64U == 0ULL && total_len > 0ULL)
|
|
699
|
+
{
|
|
700
|
+
r = 64U;
|
|
701
|
+
}
|
|
702
|
+
else
|
|
703
|
+
{
|
|
704
|
+
r = (uint32_t)(total_len % (uint64_t)64U);
|
|
705
|
+
}
|
|
706
|
+
uint8_t *buf_1 = buf_;
|
|
707
|
+
uint32_t tmp_block_state[8U] = { 0U };
|
|
708
|
+
memcpy(tmp_block_state, block_state, 8U * sizeof (uint32_t));
|
|
709
|
+
uint32_t ite;
|
|
710
|
+
if (r % 64U == 0U && r > 0U)
|
|
711
|
+
{
|
|
712
|
+
ite = 64U;
|
|
713
|
+
}
|
|
714
|
+
else
|
|
715
|
+
{
|
|
716
|
+
ite = r % 64U;
|
|
717
|
+
}
|
|
718
|
+
uint8_t *buf_last = buf_1 + r - ite;
|
|
719
|
+
uint8_t *buf_multi = buf_1;
|
|
720
|
+
Hacl_Hash_SHA2_sha256_update_nblocks(0U, buf_multi, tmp_block_state);
|
|
721
|
+
uint64_t prev_len_last = total_len - (uint64_t)r;
|
|
722
|
+
Hacl_Hash_SHA2_sha256_update_last(prev_len_last + (uint64_t)r, r, buf_last, tmp_block_state);
|
|
723
|
+
Hacl_Hash_SHA2_sha256_finish(tmp_block_state, output);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
Free a state allocated with `malloc_256`.
|
|
728
|
+
|
|
729
|
+
This function is identical to the free function for SHA2_224.
|
|
730
|
+
*/
|
|
731
|
+
void Hacl_Hash_SHA2_free_256(Hacl_Streaming_MD_state_32 *state)
|
|
732
|
+
{
|
|
733
|
+
Hacl_Streaming_MD_state_32 scrut = *state;
|
|
734
|
+
uint8_t *buf = scrut.buf;
|
|
735
|
+
uint32_t *block_state = scrut.block_state;
|
|
736
|
+
KRML_HOST_FREE(block_state);
|
|
737
|
+
KRML_HOST_FREE(buf);
|
|
738
|
+
KRML_HOST_FREE(state);
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
Hash `input`, of len `input_len`, into `output`, an array of 32 bytes.
|
|
743
|
+
*/
|
|
744
|
+
void Hacl_Hash_SHA2_hash_256(uint8_t *output, uint8_t *input, uint32_t input_len)
|
|
745
|
+
{
|
|
746
|
+
uint8_t *ib = input;
|
|
747
|
+
uint8_t *rb = output;
|
|
748
|
+
uint32_t st[8U] = { 0U };
|
|
749
|
+
Hacl_Hash_SHA2_sha256_init(st);
|
|
750
|
+
uint32_t rem = input_len % 64U;
|
|
751
|
+
uint64_t len_ = (uint64_t)input_len;
|
|
752
|
+
Hacl_Hash_SHA2_sha256_update_nblocks(input_len, ib, st);
|
|
753
|
+
uint32_t rem1 = input_len % 64U;
|
|
754
|
+
uint8_t *b0 = ib;
|
|
755
|
+
uint8_t *lb = b0 + input_len - rem1;
|
|
756
|
+
Hacl_Hash_SHA2_sha256_update_last(len_, rem, lb, st);
|
|
757
|
+
Hacl_Hash_SHA2_sha256_finish(st, rb);
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
Hacl_Streaming_MD_state_32 *Hacl_Hash_SHA2_malloc_224(void)
|
|
761
|
+
{
|
|
762
|
+
uint8_t *buf = (uint8_t *)KRML_HOST_CALLOC(64U, sizeof (uint8_t));
|
|
763
|
+
uint32_t *block_state = (uint32_t *)KRML_HOST_CALLOC(8U, sizeof (uint32_t));
|
|
764
|
+
Hacl_Streaming_MD_state_32
|
|
765
|
+
s = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
766
|
+
Hacl_Streaming_MD_state_32
|
|
767
|
+
*p = (Hacl_Streaming_MD_state_32 *)KRML_HOST_MALLOC(sizeof (Hacl_Streaming_MD_state_32));
|
|
768
|
+
p[0U] = s;
|
|
769
|
+
Hacl_Hash_SHA2_sha224_init(block_state);
|
|
770
|
+
return p;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
void Hacl_Hash_SHA2_reset_224(Hacl_Streaming_MD_state_32 *state)
|
|
774
|
+
{
|
|
775
|
+
Hacl_Streaming_MD_state_32 scrut = *state;
|
|
776
|
+
uint8_t *buf = scrut.buf;
|
|
777
|
+
uint32_t *block_state = scrut.block_state;
|
|
778
|
+
Hacl_Hash_SHA2_sha224_init(block_state);
|
|
779
|
+
Hacl_Streaming_MD_state_32
|
|
780
|
+
tmp = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
781
|
+
state[0U] = tmp;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
Hacl_Streaming_Types_error_code
|
|
785
|
+
Hacl_Hash_SHA2_update_224(
|
|
786
|
+
Hacl_Streaming_MD_state_32 *state,
|
|
787
|
+
uint8_t *input,
|
|
788
|
+
uint32_t input_len
|
|
789
|
+
)
|
|
790
|
+
{
|
|
791
|
+
return update_224_256(state, input, input_len);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/**
|
|
795
|
+
Write the resulting hash into `output`, an array of 28 bytes. The state remains
|
|
796
|
+
valid after a call to `digest_224`, meaning the user may feed more data into
|
|
797
|
+
the hash via `update_224`.
|
|
798
|
+
*/
|
|
799
|
+
void Hacl_Hash_SHA2_digest_224(Hacl_Streaming_MD_state_32 *state, uint8_t *output)
|
|
800
|
+
{
|
|
801
|
+
Hacl_Streaming_MD_state_32 scrut = *state;
|
|
802
|
+
uint32_t *block_state = scrut.block_state;
|
|
803
|
+
uint8_t *buf_ = scrut.buf;
|
|
804
|
+
uint64_t total_len = scrut.total_len;
|
|
805
|
+
uint32_t r;
|
|
806
|
+
if (total_len % (uint64_t)64U == 0ULL && total_len > 0ULL)
|
|
807
|
+
{
|
|
808
|
+
r = 64U;
|
|
809
|
+
}
|
|
810
|
+
else
|
|
811
|
+
{
|
|
812
|
+
r = (uint32_t)(total_len % (uint64_t)64U);
|
|
813
|
+
}
|
|
814
|
+
uint8_t *buf_1 = buf_;
|
|
815
|
+
uint32_t tmp_block_state[8U] = { 0U };
|
|
816
|
+
memcpy(tmp_block_state, block_state, 8U * sizeof (uint32_t));
|
|
817
|
+
uint32_t ite;
|
|
818
|
+
if (r % 64U == 0U && r > 0U)
|
|
819
|
+
{
|
|
820
|
+
ite = 64U;
|
|
821
|
+
}
|
|
822
|
+
else
|
|
823
|
+
{
|
|
824
|
+
ite = r % 64U;
|
|
825
|
+
}
|
|
826
|
+
uint8_t *buf_last = buf_1 + r - ite;
|
|
827
|
+
uint8_t *buf_multi = buf_1;
|
|
828
|
+
sha224_update_nblocks(0U, buf_multi, tmp_block_state);
|
|
829
|
+
uint64_t prev_len_last = total_len - (uint64_t)r;
|
|
830
|
+
Hacl_Hash_SHA2_sha224_update_last(prev_len_last + (uint64_t)r, r, buf_last, tmp_block_state);
|
|
831
|
+
Hacl_Hash_SHA2_sha224_finish(tmp_block_state, output);
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
void Hacl_Hash_SHA2_free_224(Hacl_Streaming_MD_state_32 *state)
|
|
835
|
+
{
|
|
836
|
+
Hacl_Hash_SHA2_free_256(state);
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
Hash `input`, of len `input_len`, into `output`, an array of 28 bytes.
|
|
841
|
+
*/
|
|
842
|
+
void Hacl_Hash_SHA2_hash_224(uint8_t *output, uint8_t *input, uint32_t input_len)
|
|
843
|
+
{
|
|
844
|
+
uint8_t *ib = input;
|
|
845
|
+
uint8_t *rb = output;
|
|
846
|
+
uint32_t st[8U] = { 0U };
|
|
847
|
+
Hacl_Hash_SHA2_sha224_init(st);
|
|
848
|
+
uint32_t rem = input_len % 64U;
|
|
849
|
+
uint64_t len_ = (uint64_t)input_len;
|
|
850
|
+
sha224_update_nblocks(input_len, ib, st);
|
|
851
|
+
uint32_t rem1 = input_len % 64U;
|
|
852
|
+
uint8_t *b0 = ib;
|
|
853
|
+
uint8_t *lb = b0 + input_len - rem1;
|
|
854
|
+
Hacl_Hash_SHA2_sha224_update_last(len_, rem, lb, st);
|
|
855
|
+
Hacl_Hash_SHA2_sha224_finish(st, rb);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
Hacl_Streaming_MD_state_64 *Hacl_Hash_SHA2_malloc_512(void)
|
|
859
|
+
{
|
|
860
|
+
uint8_t *buf = (uint8_t *)KRML_HOST_CALLOC(128U, sizeof (uint8_t));
|
|
861
|
+
uint64_t *block_state = (uint64_t *)KRML_HOST_CALLOC(8U, sizeof (uint64_t));
|
|
862
|
+
Hacl_Streaming_MD_state_64
|
|
863
|
+
s = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
864
|
+
Hacl_Streaming_MD_state_64
|
|
865
|
+
*p = (Hacl_Streaming_MD_state_64 *)KRML_HOST_MALLOC(sizeof (Hacl_Streaming_MD_state_64));
|
|
866
|
+
p[0U] = s;
|
|
867
|
+
Hacl_Hash_SHA2_sha512_init(block_state);
|
|
868
|
+
return p;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
Copies the state passed as argument into a newly allocated state (deep copy).
|
|
873
|
+
The state is to be freed by calling `free_512`. Cloning the state this way is
|
|
874
|
+
useful, for instance, if your control-flow diverges and you need to feed
|
|
875
|
+
more (different) data into the hash in each branch.
|
|
876
|
+
*/
|
|
877
|
+
Hacl_Streaming_MD_state_64 *Hacl_Hash_SHA2_copy_512(Hacl_Streaming_MD_state_64 *state)
|
|
878
|
+
{
|
|
879
|
+
Hacl_Streaming_MD_state_64 scrut = *state;
|
|
880
|
+
uint64_t *block_state0 = scrut.block_state;
|
|
881
|
+
uint8_t *buf0 = scrut.buf;
|
|
882
|
+
uint64_t total_len0 = scrut.total_len;
|
|
883
|
+
uint8_t *buf = (uint8_t *)KRML_HOST_CALLOC(128U, sizeof (uint8_t));
|
|
884
|
+
memcpy(buf, buf0, 128U * sizeof (uint8_t));
|
|
885
|
+
uint64_t *block_state = (uint64_t *)KRML_HOST_CALLOC(8U, sizeof (uint64_t));
|
|
886
|
+
memcpy(block_state, block_state0, 8U * sizeof (uint64_t));
|
|
887
|
+
Hacl_Streaming_MD_state_64
|
|
888
|
+
s = { .block_state = block_state, .buf = buf, .total_len = total_len0 };
|
|
889
|
+
Hacl_Streaming_MD_state_64
|
|
890
|
+
*p = (Hacl_Streaming_MD_state_64 *)KRML_HOST_MALLOC(sizeof (Hacl_Streaming_MD_state_64));
|
|
891
|
+
p[0U] = s;
|
|
892
|
+
return p;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
void Hacl_Hash_SHA2_reset_512(Hacl_Streaming_MD_state_64 *state)
|
|
896
|
+
{
|
|
897
|
+
Hacl_Streaming_MD_state_64 scrut = *state;
|
|
898
|
+
uint8_t *buf = scrut.buf;
|
|
899
|
+
uint64_t *block_state = scrut.block_state;
|
|
900
|
+
Hacl_Hash_SHA2_sha512_init(block_state);
|
|
901
|
+
Hacl_Streaming_MD_state_64
|
|
902
|
+
tmp = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
903
|
+
state[0U] = tmp;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
static inline Hacl_Streaming_Types_error_code
|
|
907
|
+
update_384_512(Hacl_Streaming_MD_state_64 *state, uint8_t *chunk, uint32_t chunk_len)
|
|
908
|
+
{
|
|
909
|
+
Hacl_Streaming_MD_state_64 s = *state;
|
|
910
|
+
uint64_t total_len = s.total_len;
|
|
911
|
+
if ((uint64_t)chunk_len > 18446744073709551615ULL - total_len)
|
|
912
|
+
{
|
|
913
|
+
return Hacl_Streaming_Types_MaximumLengthExceeded;
|
|
914
|
+
}
|
|
915
|
+
uint32_t sz;
|
|
916
|
+
if (total_len % (uint64_t)128U == 0ULL && total_len > 0ULL)
|
|
917
|
+
{
|
|
918
|
+
sz = 128U;
|
|
919
|
+
}
|
|
920
|
+
else
|
|
921
|
+
{
|
|
922
|
+
sz = (uint32_t)(total_len % (uint64_t)128U);
|
|
923
|
+
}
|
|
924
|
+
if (chunk_len <= 128U - sz)
|
|
925
|
+
{
|
|
926
|
+
Hacl_Streaming_MD_state_64 s1 = *state;
|
|
927
|
+
uint64_t *block_state1 = s1.block_state;
|
|
928
|
+
uint8_t *buf = s1.buf;
|
|
929
|
+
uint64_t total_len1 = s1.total_len;
|
|
930
|
+
uint32_t sz1;
|
|
931
|
+
if (total_len1 % (uint64_t)128U == 0ULL && total_len1 > 0ULL)
|
|
932
|
+
{
|
|
933
|
+
sz1 = 128U;
|
|
934
|
+
}
|
|
935
|
+
else
|
|
936
|
+
{
|
|
937
|
+
sz1 = (uint32_t)(total_len1 % (uint64_t)128U);
|
|
938
|
+
}
|
|
939
|
+
uint8_t *buf2 = buf + sz1;
|
|
940
|
+
memcpy(buf2, chunk, chunk_len * sizeof (uint8_t));
|
|
941
|
+
uint64_t total_len2 = total_len1 + (uint64_t)chunk_len;
|
|
942
|
+
*state
|
|
943
|
+
=
|
|
944
|
+
(
|
|
945
|
+
(Hacl_Streaming_MD_state_64){
|
|
946
|
+
.block_state = block_state1,
|
|
947
|
+
.buf = buf,
|
|
948
|
+
.total_len = total_len2
|
|
949
|
+
}
|
|
950
|
+
);
|
|
951
|
+
}
|
|
952
|
+
else if (sz == 0U)
|
|
953
|
+
{
|
|
954
|
+
Hacl_Streaming_MD_state_64 s1 = *state;
|
|
955
|
+
uint64_t *block_state1 = s1.block_state;
|
|
956
|
+
uint8_t *buf = s1.buf;
|
|
957
|
+
uint64_t total_len1 = s1.total_len;
|
|
958
|
+
uint32_t sz1;
|
|
959
|
+
if (total_len1 % (uint64_t)128U == 0ULL && total_len1 > 0ULL)
|
|
960
|
+
{
|
|
961
|
+
sz1 = 128U;
|
|
962
|
+
}
|
|
963
|
+
else
|
|
964
|
+
{
|
|
965
|
+
sz1 = (uint32_t)(total_len1 % (uint64_t)128U);
|
|
966
|
+
}
|
|
967
|
+
if (!(sz1 == 0U))
|
|
968
|
+
{
|
|
969
|
+
Hacl_Hash_SHA2_sha512_update_nblocks(128U, buf, block_state1);
|
|
970
|
+
}
|
|
971
|
+
uint32_t ite;
|
|
972
|
+
if ((uint64_t)chunk_len % (uint64_t)128U == 0ULL && (uint64_t)chunk_len > 0ULL)
|
|
973
|
+
{
|
|
974
|
+
ite = 128U;
|
|
975
|
+
}
|
|
976
|
+
else
|
|
977
|
+
{
|
|
978
|
+
ite = (uint32_t)((uint64_t)chunk_len % (uint64_t)128U);
|
|
979
|
+
}
|
|
980
|
+
uint32_t n_blocks = (chunk_len - ite) / 128U;
|
|
981
|
+
uint32_t data1_len = n_blocks * 128U;
|
|
982
|
+
uint32_t data2_len = chunk_len - data1_len;
|
|
983
|
+
uint8_t *data1 = chunk;
|
|
984
|
+
uint8_t *data2 = chunk + data1_len;
|
|
985
|
+
Hacl_Hash_SHA2_sha512_update_nblocks(data1_len / 128U * 128U, data1, block_state1);
|
|
986
|
+
uint8_t *dst = buf;
|
|
987
|
+
memcpy(dst, data2, data2_len * sizeof (uint8_t));
|
|
988
|
+
*state
|
|
989
|
+
=
|
|
990
|
+
(
|
|
991
|
+
(Hacl_Streaming_MD_state_64){
|
|
992
|
+
.block_state = block_state1,
|
|
993
|
+
.buf = buf,
|
|
994
|
+
.total_len = total_len1 + (uint64_t)chunk_len
|
|
995
|
+
}
|
|
996
|
+
);
|
|
997
|
+
}
|
|
998
|
+
else
|
|
999
|
+
{
|
|
1000
|
+
uint32_t diff = 128U - sz;
|
|
1001
|
+
uint8_t *chunk1 = chunk;
|
|
1002
|
+
uint8_t *chunk2 = chunk + diff;
|
|
1003
|
+
Hacl_Streaming_MD_state_64 s1 = *state;
|
|
1004
|
+
uint64_t *block_state10 = s1.block_state;
|
|
1005
|
+
uint8_t *buf0 = s1.buf;
|
|
1006
|
+
uint64_t total_len10 = s1.total_len;
|
|
1007
|
+
uint32_t sz10;
|
|
1008
|
+
if (total_len10 % (uint64_t)128U == 0ULL && total_len10 > 0ULL)
|
|
1009
|
+
{
|
|
1010
|
+
sz10 = 128U;
|
|
1011
|
+
}
|
|
1012
|
+
else
|
|
1013
|
+
{
|
|
1014
|
+
sz10 = (uint32_t)(total_len10 % (uint64_t)128U);
|
|
1015
|
+
}
|
|
1016
|
+
uint8_t *buf2 = buf0 + sz10;
|
|
1017
|
+
memcpy(buf2, chunk1, diff * sizeof (uint8_t));
|
|
1018
|
+
uint64_t total_len2 = total_len10 + (uint64_t)diff;
|
|
1019
|
+
*state
|
|
1020
|
+
=
|
|
1021
|
+
(
|
|
1022
|
+
(Hacl_Streaming_MD_state_64){
|
|
1023
|
+
.block_state = block_state10,
|
|
1024
|
+
.buf = buf0,
|
|
1025
|
+
.total_len = total_len2
|
|
1026
|
+
}
|
|
1027
|
+
);
|
|
1028
|
+
Hacl_Streaming_MD_state_64 s10 = *state;
|
|
1029
|
+
uint64_t *block_state1 = s10.block_state;
|
|
1030
|
+
uint8_t *buf = s10.buf;
|
|
1031
|
+
uint64_t total_len1 = s10.total_len;
|
|
1032
|
+
uint32_t sz1;
|
|
1033
|
+
if (total_len1 % (uint64_t)128U == 0ULL && total_len1 > 0ULL)
|
|
1034
|
+
{
|
|
1035
|
+
sz1 = 128U;
|
|
1036
|
+
}
|
|
1037
|
+
else
|
|
1038
|
+
{
|
|
1039
|
+
sz1 = (uint32_t)(total_len1 % (uint64_t)128U);
|
|
1040
|
+
}
|
|
1041
|
+
if (!(sz1 == 0U))
|
|
1042
|
+
{
|
|
1043
|
+
Hacl_Hash_SHA2_sha512_update_nblocks(128U, buf, block_state1);
|
|
1044
|
+
}
|
|
1045
|
+
uint32_t ite;
|
|
1046
|
+
if
|
|
1047
|
+
((uint64_t)(chunk_len - diff) % (uint64_t)128U == 0ULL && (uint64_t)(chunk_len - diff) > 0ULL)
|
|
1048
|
+
{
|
|
1049
|
+
ite = 128U;
|
|
1050
|
+
}
|
|
1051
|
+
else
|
|
1052
|
+
{
|
|
1053
|
+
ite = (uint32_t)((uint64_t)(chunk_len - diff) % (uint64_t)128U);
|
|
1054
|
+
}
|
|
1055
|
+
uint32_t n_blocks = (chunk_len - diff - ite) / 128U;
|
|
1056
|
+
uint32_t data1_len = n_blocks * 128U;
|
|
1057
|
+
uint32_t data2_len = chunk_len - diff - data1_len;
|
|
1058
|
+
uint8_t *data1 = chunk2;
|
|
1059
|
+
uint8_t *data2 = chunk2 + data1_len;
|
|
1060
|
+
Hacl_Hash_SHA2_sha512_update_nblocks(data1_len / 128U * 128U, data1, block_state1);
|
|
1061
|
+
uint8_t *dst = buf;
|
|
1062
|
+
memcpy(dst, data2, data2_len * sizeof (uint8_t));
|
|
1063
|
+
*state
|
|
1064
|
+
=
|
|
1065
|
+
(
|
|
1066
|
+
(Hacl_Streaming_MD_state_64){
|
|
1067
|
+
.block_state = block_state1,
|
|
1068
|
+
.buf = buf,
|
|
1069
|
+
.total_len = total_len1 + (uint64_t)(chunk_len - diff)
|
|
1070
|
+
}
|
|
1071
|
+
);
|
|
1072
|
+
}
|
|
1073
|
+
return Hacl_Streaming_Types_Success;
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
/**
|
|
1077
|
+
Feed an arbitrary amount of data into the hash. This function returns 0 for
|
|
1078
|
+
success, or 1 if the combined length of all of the data passed to `update_512`
|
|
1079
|
+
(since the last call to `reset_512`) exceeds 2^125-1 bytes.
|
|
1080
|
+
|
|
1081
|
+
This function is identical to the update function for SHA2_384.
|
|
1082
|
+
*/
|
|
1083
|
+
Hacl_Streaming_Types_error_code
|
|
1084
|
+
Hacl_Hash_SHA2_update_512(
|
|
1085
|
+
Hacl_Streaming_MD_state_64 *state,
|
|
1086
|
+
uint8_t *input,
|
|
1087
|
+
uint32_t input_len
|
|
1088
|
+
)
|
|
1089
|
+
{
|
|
1090
|
+
return update_384_512(state, input, input_len);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
/**
|
|
1094
|
+
Write the resulting hash into `output`, an array of 64 bytes. The state remains
|
|
1095
|
+
valid after a call to `digest_512`, meaning the user may feed more data into
|
|
1096
|
+
the hash via `update_512`. (The digest_512 function operates on an internal copy of
|
|
1097
|
+
the state and therefore does not invalidate the client-held state `p`.)
|
|
1098
|
+
*/
|
|
1099
|
+
void Hacl_Hash_SHA2_digest_512(Hacl_Streaming_MD_state_64 *state, uint8_t *output)
|
|
1100
|
+
{
|
|
1101
|
+
Hacl_Streaming_MD_state_64 scrut = *state;
|
|
1102
|
+
uint64_t *block_state = scrut.block_state;
|
|
1103
|
+
uint8_t *buf_ = scrut.buf;
|
|
1104
|
+
uint64_t total_len = scrut.total_len;
|
|
1105
|
+
uint32_t r;
|
|
1106
|
+
if (total_len % (uint64_t)128U == 0ULL && total_len > 0ULL)
|
|
1107
|
+
{
|
|
1108
|
+
r = 128U;
|
|
1109
|
+
}
|
|
1110
|
+
else
|
|
1111
|
+
{
|
|
1112
|
+
r = (uint32_t)(total_len % (uint64_t)128U);
|
|
1113
|
+
}
|
|
1114
|
+
uint8_t *buf_1 = buf_;
|
|
1115
|
+
uint64_t tmp_block_state[8U] = { 0U };
|
|
1116
|
+
memcpy(tmp_block_state, block_state, 8U * sizeof (uint64_t));
|
|
1117
|
+
uint32_t ite;
|
|
1118
|
+
if (r % 128U == 0U && r > 0U)
|
|
1119
|
+
{
|
|
1120
|
+
ite = 128U;
|
|
1121
|
+
}
|
|
1122
|
+
else
|
|
1123
|
+
{
|
|
1124
|
+
ite = r % 128U;
|
|
1125
|
+
}
|
|
1126
|
+
uint8_t *buf_last = buf_1 + r - ite;
|
|
1127
|
+
uint8_t *buf_multi = buf_1;
|
|
1128
|
+
Hacl_Hash_SHA2_sha512_update_nblocks(0U, buf_multi, tmp_block_state);
|
|
1129
|
+
uint64_t prev_len_last = total_len - (uint64_t)r;
|
|
1130
|
+
Hacl_Hash_SHA2_sha512_update_last(FStar_UInt128_add(FStar_UInt128_uint64_to_uint128(prev_len_last),
|
|
1131
|
+
FStar_UInt128_uint64_to_uint128((uint64_t)r)),
|
|
1132
|
+
r,
|
|
1133
|
+
buf_last,
|
|
1134
|
+
tmp_block_state);
|
|
1135
|
+
Hacl_Hash_SHA2_sha512_finish(tmp_block_state, output);
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
/**
|
|
1139
|
+
Free a state allocated with `malloc_512`.
|
|
1140
|
+
|
|
1141
|
+
This function is identical to the free function for SHA2_384.
|
|
1142
|
+
*/
|
|
1143
|
+
void Hacl_Hash_SHA2_free_512(Hacl_Streaming_MD_state_64 *state)
|
|
1144
|
+
{
|
|
1145
|
+
Hacl_Streaming_MD_state_64 scrut = *state;
|
|
1146
|
+
uint8_t *buf = scrut.buf;
|
|
1147
|
+
uint64_t *block_state = scrut.block_state;
|
|
1148
|
+
KRML_HOST_FREE(block_state);
|
|
1149
|
+
KRML_HOST_FREE(buf);
|
|
1150
|
+
KRML_HOST_FREE(state);
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/**
|
|
1154
|
+
Hash `input`, of len `input_len`, into `output`, an array of 64 bytes.
|
|
1155
|
+
*/
|
|
1156
|
+
void Hacl_Hash_SHA2_hash_512(uint8_t *output, uint8_t *input, uint32_t input_len)
|
|
1157
|
+
{
|
|
1158
|
+
uint8_t *ib = input;
|
|
1159
|
+
uint8_t *rb = output;
|
|
1160
|
+
uint64_t st[8U] = { 0U };
|
|
1161
|
+
Hacl_Hash_SHA2_sha512_init(st);
|
|
1162
|
+
uint32_t rem = input_len % 128U;
|
|
1163
|
+
FStar_UInt128_uint128 len_ = FStar_UInt128_uint64_to_uint128((uint64_t)input_len);
|
|
1164
|
+
Hacl_Hash_SHA2_sha512_update_nblocks(input_len, ib, st);
|
|
1165
|
+
uint32_t rem1 = input_len % 128U;
|
|
1166
|
+
uint8_t *b0 = ib;
|
|
1167
|
+
uint8_t *lb = b0 + input_len - rem1;
|
|
1168
|
+
Hacl_Hash_SHA2_sha512_update_last(len_, rem, lb, st);
|
|
1169
|
+
Hacl_Hash_SHA2_sha512_finish(st, rb);
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
Hacl_Streaming_MD_state_64 *Hacl_Hash_SHA2_malloc_384(void)
|
|
1173
|
+
{
|
|
1174
|
+
uint8_t *buf = (uint8_t *)KRML_HOST_CALLOC(128U, sizeof (uint8_t));
|
|
1175
|
+
uint64_t *block_state = (uint64_t *)KRML_HOST_CALLOC(8U, sizeof (uint64_t));
|
|
1176
|
+
Hacl_Streaming_MD_state_64
|
|
1177
|
+
s = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
1178
|
+
Hacl_Streaming_MD_state_64
|
|
1179
|
+
*p = (Hacl_Streaming_MD_state_64 *)KRML_HOST_MALLOC(sizeof (Hacl_Streaming_MD_state_64));
|
|
1180
|
+
p[0U] = s;
|
|
1181
|
+
Hacl_Hash_SHA2_sha384_init(block_state);
|
|
1182
|
+
return p;
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
void Hacl_Hash_SHA2_reset_384(Hacl_Streaming_MD_state_64 *state)
|
|
1186
|
+
{
|
|
1187
|
+
Hacl_Streaming_MD_state_64 scrut = *state;
|
|
1188
|
+
uint8_t *buf = scrut.buf;
|
|
1189
|
+
uint64_t *block_state = scrut.block_state;
|
|
1190
|
+
Hacl_Hash_SHA2_sha384_init(block_state);
|
|
1191
|
+
Hacl_Streaming_MD_state_64
|
|
1192
|
+
tmp = { .block_state = block_state, .buf = buf, .total_len = (uint64_t)0U };
|
|
1193
|
+
state[0U] = tmp;
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
Hacl_Streaming_Types_error_code
|
|
1197
|
+
Hacl_Hash_SHA2_update_384(
|
|
1198
|
+
Hacl_Streaming_MD_state_64 *state,
|
|
1199
|
+
uint8_t *input,
|
|
1200
|
+
uint32_t input_len
|
|
1201
|
+
)
|
|
1202
|
+
{
|
|
1203
|
+
return update_384_512(state, input, input_len);
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
/**
|
|
1207
|
+
Write the resulting hash into `output`, an array of 48 bytes. The state remains
|
|
1208
|
+
valid after a call to `digest_384`, meaning the user may feed more data into
|
|
1209
|
+
the hash via `update_384`.
|
|
1210
|
+
*/
|
|
1211
|
+
void Hacl_Hash_SHA2_digest_384(Hacl_Streaming_MD_state_64 *state, uint8_t *output)
|
|
1212
|
+
{
|
|
1213
|
+
Hacl_Streaming_MD_state_64 scrut = *state;
|
|
1214
|
+
uint64_t *block_state = scrut.block_state;
|
|
1215
|
+
uint8_t *buf_ = scrut.buf;
|
|
1216
|
+
uint64_t total_len = scrut.total_len;
|
|
1217
|
+
uint32_t r;
|
|
1218
|
+
if (total_len % (uint64_t)128U == 0ULL && total_len > 0ULL)
|
|
1219
|
+
{
|
|
1220
|
+
r = 128U;
|
|
1221
|
+
}
|
|
1222
|
+
else
|
|
1223
|
+
{
|
|
1224
|
+
r = (uint32_t)(total_len % (uint64_t)128U);
|
|
1225
|
+
}
|
|
1226
|
+
uint8_t *buf_1 = buf_;
|
|
1227
|
+
uint64_t tmp_block_state[8U] = { 0U };
|
|
1228
|
+
memcpy(tmp_block_state, block_state, 8U * sizeof (uint64_t));
|
|
1229
|
+
uint32_t ite;
|
|
1230
|
+
if (r % 128U == 0U && r > 0U)
|
|
1231
|
+
{
|
|
1232
|
+
ite = 128U;
|
|
1233
|
+
}
|
|
1234
|
+
else
|
|
1235
|
+
{
|
|
1236
|
+
ite = r % 128U;
|
|
1237
|
+
}
|
|
1238
|
+
uint8_t *buf_last = buf_1 + r - ite;
|
|
1239
|
+
uint8_t *buf_multi = buf_1;
|
|
1240
|
+
Hacl_Hash_SHA2_sha384_update_nblocks(0U, buf_multi, tmp_block_state);
|
|
1241
|
+
uint64_t prev_len_last = total_len - (uint64_t)r;
|
|
1242
|
+
Hacl_Hash_SHA2_sha384_update_last(FStar_UInt128_add(FStar_UInt128_uint64_to_uint128(prev_len_last),
|
|
1243
|
+
FStar_UInt128_uint64_to_uint128((uint64_t)r)),
|
|
1244
|
+
r,
|
|
1245
|
+
buf_last,
|
|
1246
|
+
tmp_block_state);
|
|
1247
|
+
Hacl_Hash_SHA2_sha384_finish(tmp_block_state, output);
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
void Hacl_Hash_SHA2_free_384(Hacl_Streaming_MD_state_64 *state)
|
|
1251
|
+
{
|
|
1252
|
+
Hacl_Hash_SHA2_free_512(state);
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
/**
|
|
1256
|
+
Hash `input`, of len `input_len`, into `output`, an array of 48 bytes.
|
|
1257
|
+
*/
|
|
1258
|
+
void Hacl_Hash_SHA2_hash_384(uint8_t *output, uint8_t *input, uint32_t input_len)
|
|
1259
|
+
{
|
|
1260
|
+
uint8_t *ib = input;
|
|
1261
|
+
uint8_t *rb = output;
|
|
1262
|
+
uint64_t st[8U] = { 0U };
|
|
1263
|
+
Hacl_Hash_SHA2_sha384_init(st);
|
|
1264
|
+
uint32_t rem = input_len % 128U;
|
|
1265
|
+
FStar_UInt128_uint128 len_ = FStar_UInt128_uint64_to_uint128((uint64_t)input_len);
|
|
1266
|
+
Hacl_Hash_SHA2_sha384_update_nblocks(input_len, ib, st);
|
|
1267
|
+
uint32_t rem1 = input_len % 128U;
|
|
1268
|
+
uint8_t *b0 = ib;
|
|
1269
|
+
uint8_t *lb = b0 + input_len - rem1;
|
|
1270
|
+
Hacl_Hash_SHA2_sha384_update_last(len_, rem, lb, st);
|
|
1271
|
+
Hacl_Hash_SHA2_sha384_finish(st, rb);
|
|
1272
|
+
}
|
|
1273
|
+
|