Coverage Report

Created: 2026-10-19 15:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/crypto/sha256_arm_shani.cpp
Line
Count
Source
1
// Copyright (c) 2022-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
//
5
// Based on https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-arm.c,
6
// Written and placed in public domain by Jeffrey Walton.
7
// Based on code from ARM, and by Johannes Schneiders, Skip Hovsmith and
8
// Barry O'Rourke for the mbedTLS project.
9
// Variant specialized for 64-byte inputs added by Pieter Wuille.
10
11
#ifdef ENABLE_ARM_SHANI
12
13
#include <array>
14
#include <cstdint>
15
#include <cstddef>
16
#include <arm_neon.h>
17
18
namespace {
19
alignas(uint32x4_t) static constexpr std::array<uint32_t, 64> K =
20
{
21
    0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
22
    0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
23
    0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
24
    0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
25
    0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
26
    0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
27
    0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
28
    0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
29
    0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
30
    0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
31
    0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
32
    0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
33
    0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
34
    0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
35
    0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
36
    0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
37
};
38
}
39
40
namespace sha256_arm_shani {
41
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
42
180M
{
43
180M
    uint32x4_t STATE0, STATE1, ABCD_SAVE, EFGH_SAVE;
44
180M
    uint32x4_t MSG0, MSG1, MSG2, MSG3;
45
180M
    uint32x4_t TMP0, TMP2;
46
47
    // Load state
48
180M
    STATE0 = vld1q_u32(&s[0]);
49
180M
    STATE1 = vld1q_u32(&s[4]);
50
51
490M
    while (blocks--)
52
310M
    {
53
        // Save state
54
310M
        ABCD_SAVE = STATE0;
55
310M
        EFGH_SAVE = STATE1;
56
57
        // Load and convert input chunk to Big Endian
58
310M
        MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 0)));
59
310M
        MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 16)));
60
310M
        MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 32)));
61
310M
        MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 48)));
62
310M
        chunk += 64;
63
64
        // Original implementation preloaded message and constant addition which was 1-3% slower.
65
        // Now included as first step in quad round code saving one Q Neon register
66
        // "TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0]));"
67
68
        // Rounds 1-4
69
310M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0]));
70
310M
        TMP2 = STATE0;
71
310M
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
72
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
73
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
74
310M
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
75
76
        // Rounds 5-8
77
310M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[4]));
78
310M
        TMP2 = STATE0;
79
310M
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
80
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
81
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
82
310M
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
83
84
        // Rounds 9-12
85
310M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[8]));
86
310M
        TMP2 = STATE0;
87
310M
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
88
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
89
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
90
310M
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
91
92
        // Rounds 13-16
93
310M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[12]));
94
310M
        TMP2 = STATE0;
95
310M
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
96
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
97
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
98
310M
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
99
100
        // Rounds 17-20
101
310M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[16]));
102
310M
        TMP2 = STATE0;
103
310M
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
104
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
105
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
106
310M
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
107
108
        // Rounds 21-24
109
310M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[20]));
110
310M
        TMP2 = STATE0;
111
310M
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
112
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
113
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
114
310M
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
115
116
        // Rounds 25-28
117
310M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[24]));
118
310M
        TMP2 = STATE0;
119
310M
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
120
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
121
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
122
310M
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
123
124
        // Rounds 29-32
125
310M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[28]));
126
310M
        TMP2 = STATE0;
127
310M
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
128
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
129
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
130
310M
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
131
132
        // Rounds 33-36
133
310M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[32]));
134
310M
        TMP2 = STATE0;
135
310M
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
136
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
137
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
138
310M
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
139
140
        // Rounds 37-40
141
310M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[36]));
142
310M
        TMP2 = STATE0;
143
310M
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
144
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
145
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
146
310M
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
147
148
        // Rounds 41-44
149
310M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[40]));
150
310M
        TMP2 = STATE0;
151
310M
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
152
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
153
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
154
310M
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
155
156
        // Rounds 45-48
157
310M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[44]));
158
310M
        TMP2 = STATE0;
159
310M
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
160
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
161
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
162
310M
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
163
164
        // Rounds 49-52
165
310M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[48]));
166
310M
        TMP2 = STATE0;
167
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
168
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
169
170
        // Rounds 53-56
171
310M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[52]));
172
310M
        TMP2 = STATE0;
173
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
174
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
175
176
        // Rounds 57-60
177
310M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[56]));
178
310M
        TMP2 = STATE0;
179
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
180
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
181
182
        // Rounds 61-64
183
310M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[60]));
184
310M
        TMP2 = STATE0;
185
310M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
186
310M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
187
188
        // Update state
189
310M
        STATE0 = vaddq_u32(STATE0, ABCD_SAVE);
190
310M
        STATE1 = vaddq_u32(STATE1, EFGH_SAVE);
191
310M
    }
192
193
    // Save final state
194
180M
    vst1q_u32(&s[0], STATE0);
195
180M
    vst1q_u32(&s[4], STATE1);
196
180M
}
197
}
198
199
namespace sha256d64_arm_shani {
200
void Transform_2way(unsigned char* output, const unsigned char* input)
201
207k
{
202
    /* Initial state. */
203
207k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 8> INIT = {
204
207k
        0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
205
207k
        0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
206
207k
    };
207
208
    /* Precomputed message schedule for the 2nd transform. */
209
207k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 64> MIDS = {
210
207k
        0xc28a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
211
207k
        0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
212
207k
        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
213
207k
        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf374,
214
207k
        0x649b69c1, 0xf0fe4786, 0x0fe1edc6, 0x240cf254,
215
207k
        0x4fe9346f, 0x6cc984be, 0x61b9411e, 0x16f988fa,
216
207k
        0xf2c65152, 0xa88e5a6d, 0xb019fc65, 0xb9d99ec7,
217
207k
        0x9a1231c3, 0xe70eeaa0, 0xfdb1232b, 0xc7353eb0,
218
207k
        0x3069bad5, 0xcb976d5f, 0x5a0f118f, 0xdc1eeefd,
219
207k
        0x0a35b689, 0xde0b7a04, 0x58f4ca9d, 0xe15d5b16,
220
207k
        0x007f3e86, 0x37088980, 0xa507ea32, 0x6fab9537,
221
207k
        0x17406110, 0x0d8cd6f1, 0xcdaa3b6d, 0xc0bbbe37,
222
207k
        0x83613bda, 0xdb48a363, 0x0b02e931, 0x6fd15ca7,
223
207k
        0x521afaca, 0x31338431, 0x6ed41a95, 0x6d437890,
224
207k
        0xc39c91f2, 0x9eccabbd, 0xb5c9a0e6, 0x532fb63c,
225
207k
        0xd2c741c6, 0x07237ea3, 0xa4954b68, 0x4c191d76
226
207k
    };
227
228
    /* A few precomputed message schedule values for the 3rd transform. */
229
207k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 12> FINS = {
230
207k
        0x5807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
231
207k
        0x80000000, 0x00000000, 0x00000000, 0x00000000,
232
207k
        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf274
233
207k
    };
234
235
    /* Padding processed in the 3rd transform (byteswapped). */
236
207k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 8> FINAL = {0x80000000, 0, 0, 0, 0, 0, 0, 0x100};
237
238
207k
    uint32x4_t STATE0A, STATE0B, STATE1A, STATE1B, ABCD_SAVEA, ABCD_SAVEB, EFGH_SAVEA, EFGH_SAVEB;
239
207k
    uint32x4_t MSG0A, MSG0B, MSG1A, MSG1B, MSG2A, MSG2B, MSG3A, MSG3B;
240
207k
    uint32x4_t TMP0A, TMP0B, TMP2A, TMP2B, TMP;
241
242
    // Transform 1: Load state
243
207k
    STATE0A = vld1q_u32(&INIT[0]);
244
207k
    STATE0B = STATE0A;
245
207k
    STATE1A = vld1q_u32(&INIT[4]);
246
207k
    STATE1B = STATE1A;
247
248
    // Transform 1: Load and convert input chunk to Big Endian
249
207k
    MSG0A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 0)));
250
207k
    MSG1A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 16)));
251
207k
    MSG2A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 32)));
252
207k
    MSG3A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 48)));
253
207k
    MSG0B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 64)));
254
207k
    MSG1B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 80)));
255
207k
    MSG2B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 96)));
256
207k
    MSG3B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 112)));
257
258
    // Transform 1: Rounds 1-4
259
207k
    TMP = vld1q_u32(&K[0]);
260
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
261
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
262
207k
    TMP2A = STATE0A;
263
207k
    TMP2B = STATE0B;
264
207k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
265
207k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
266
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
267
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
268
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
269
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
270
207k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
271
207k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
272
273
    // Transform 1: Rounds 5-8
274
207k
    TMP = vld1q_u32(&K[4]);
275
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
276
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
277
207k
    TMP2A = STATE0A;
278
207k
    TMP2B = STATE0B;
279
207k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
280
207k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
281
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
282
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
283
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
284
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
285
207k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
286
207k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
287
288
    // Transform 1: Rounds 9-12
289
207k
    TMP = vld1q_u32(&K[8]);
290
207k
    TMP0A = vaddq_u32(MSG2A, TMP);
291
207k
    TMP0B = vaddq_u32(MSG2B, TMP);
292
207k
    TMP2A = STATE0A;
293
207k
    TMP2B = STATE0B;
294
207k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
295
207k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
296
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
297
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
298
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
299
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
300
207k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
301
207k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
302
303
    // Transform 1: Rounds 13-16
304
207k
    TMP = vld1q_u32(&K[12]);
305
207k
    TMP0A = vaddq_u32(MSG3A, TMP);
306
207k
    TMP0B = vaddq_u32(MSG3B, TMP);
307
207k
    TMP2A = STATE0A;
308
207k
    TMP2B = STATE0B;
309
207k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
310
207k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
311
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
312
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
313
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
314
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
315
207k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
316
207k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
317
318
    // Transform 1: Rounds 17-20
319
207k
    TMP = vld1q_u32(&K[16]);
320
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
321
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
322
207k
    TMP2A = STATE0A;
323
207k
    TMP2B = STATE0B;
324
207k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
325
207k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
326
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
327
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
328
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
329
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
330
207k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
331
207k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
332
333
    // Transform 1: Rounds 21-24
334
207k
    TMP = vld1q_u32(&K[20]);
335
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
336
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
337
207k
    TMP2A = STATE0A;
338
207k
    TMP2B = STATE0B;
339
207k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
340
207k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
341
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
342
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
343
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
344
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
345
207k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
346
207k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
347
348
    // Transform 1: Rounds 25-28
349
207k
    TMP = vld1q_u32(&K[24]);
350
207k
    TMP0A = vaddq_u32(MSG2A, TMP);
351
207k
    TMP0B = vaddq_u32(MSG2B, TMP);
352
207k
    TMP2A = STATE0A;
353
207k
    TMP2B = STATE0B;
354
207k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
355
207k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
356
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
357
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
358
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
359
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
360
207k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
361
207k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
362
363
    // Transform 1: Rounds 29-32
364
207k
    TMP = vld1q_u32(&K[28]);
365
207k
    TMP0A = vaddq_u32(MSG3A, TMP);
366
207k
    TMP0B = vaddq_u32(MSG3B, TMP);
367
207k
    TMP2A = STATE0A;
368
207k
    TMP2B = STATE0B;
369
207k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
370
207k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
371
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
372
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
373
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
374
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
375
207k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
376
207k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
377
378
    // Transform 1: Rounds 33-36
379
207k
    TMP = vld1q_u32(&K[32]);
380
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
381
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
382
207k
    TMP2A = STATE0A;
383
207k
    TMP2B = STATE0B;
384
207k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
385
207k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
386
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
387
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
388
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
389
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
390
207k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
391
207k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
392
393
    // Transform 1: Rounds 37-40
394
207k
    TMP = vld1q_u32(&K[36]);
395
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
396
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
397
207k
    TMP2A = STATE0A;
398
207k
    TMP2B = STATE0B;
399
207k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
400
207k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
401
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
402
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
403
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
404
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
405
207k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
406
207k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
407
408
    // Transform 1: Rounds 41-44
409
207k
    TMP = vld1q_u32(&K[40]);
410
207k
    TMP0A = vaddq_u32(MSG2A, TMP);
411
207k
    TMP0B = vaddq_u32(MSG2B, TMP);
412
207k
    TMP2A = STATE0A;
413
207k
    TMP2B = STATE0B;
414
207k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
415
207k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
416
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
417
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
418
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
419
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
420
207k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
421
207k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
422
423
    // Transform 1: Rounds 45-48
424
207k
    TMP = vld1q_u32(&K[44]);
425
207k
    TMP0A = vaddq_u32(MSG3A, TMP);
426
207k
    TMP0B = vaddq_u32(MSG3B, TMP);
427
207k
    TMP2A = STATE0A;
428
207k
    TMP2B = STATE0B;
429
207k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
430
207k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
431
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
432
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
433
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
434
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
435
207k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
436
207k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
437
438
    // Transform 1: Rounds 49-52
439
207k
    TMP = vld1q_u32(&K[48]);
440
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
441
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
442
207k
    TMP2A = STATE0A;
443
207k
    TMP2B = STATE0B;
444
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
445
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
446
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
447
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
448
449
    // Transform 1: Rounds 53-56
450
207k
    TMP = vld1q_u32(&K[52]);
451
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
452
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
453
207k
    TMP2A = STATE0A;
454
207k
    TMP2B = STATE0B;
455
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
456
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
457
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
458
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
459
460
    // Transform 1: Rounds 57-60
461
207k
    TMP = vld1q_u32(&K[56]);
462
207k
    TMP0A = vaddq_u32(MSG2A, TMP);
463
207k
    TMP0B = vaddq_u32(MSG2B, TMP);
464
207k
    TMP2A = STATE0A;
465
207k
    TMP2B = STATE0B;
466
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
467
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
468
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
469
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
470
471
    // Transform 1: Rounds 61-64
472
207k
    TMP = vld1q_u32(&K[60]);
473
207k
    TMP0A = vaddq_u32(MSG3A, TMP);
474
207k
    TMP0B = vaddq_u32(MSG3B, TMP);
475
207k
    TMP2A = STATE0A;
476
207k
    TMP2B = STATE0B;
477
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
478
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
479
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
480
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
481
482
    // Transform 1: Update state
483
207k
    TMP = vld1q_u32(&INIT[0]);
484
207k
    STATE0A = vaddq_u32(STATE0A, TMP);
485
207k
    STATE0B = vaddq_u32(STATE0B, TMP);
486
207k
    TMP = vld1q_u32(&INIT[4]);
487
207k
    STATE1A = vaddq_u32(STATE1A, TMP);
488
207k
    STATE1B = vaddq_u32(STATE1B, TMP);
489
490
    // Transform 2: Save state
491
207k
    ABCD_SAVEA = STATE0A;
492
207k
    ABCD_SAVEB = STATE0B;
493
207k
    EFGH_SAVEA = STATE1A;
494
207k
    EFGH_SAVEB = STATE1B;
495
496
    // Transform 2: Rounds 1-4
497
207k
    TMP = vld1q_u32(&MIDS[0]);
498
207k
    TMP2A = STATE0A;
499
207k
    TMP2B = STATE0B;
500
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
501
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
502
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
503
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
504
505
    // Transform 2: Rounds 5-8
506
207k
    TMP = vld1q_u32(&MIDS[4]);
507
207k
    TMP2A = STATE0A;
508
207k
    TMP2B = STATE0B;
509
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
510
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
511
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
512
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
513
514
    // Transform 2: Rounds 9-12
515
207k
    TMP = vld1q_u32(&MIDS[8]);
516
207k
    TMP2A = STATE0A;
517
207k
    TMP2B = STATE0B;
518
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
519
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
520
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
521
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
522
523
    // Transform 2: Rounds 13-16
524
207k
    TMP = vld1q_u32(&MIDS[12]);
525
207k
    TMP2A = STATE0A;
526
207k
    TMP2B = STATE0B;
527
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
528
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
529
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
530
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
531
532
    // Transform 2: Rounds 17-20
533
207k
    TMP = vld1q_u32(&MIDS[16]);
534
207k
    TMP2A = STATE0A;
535
207k
    TMP2B = STATE0B;
536
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
537
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
538
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
539
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
540
541
    // Transform 2: Rounds 21-24
542
207k
    TMP = vld1q_u32(&MIDS[20]);
543
207k
    TMP2A = STATE0A;
544
207k
    TMP2B = STATE0B;
545
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
546
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
547
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
548
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
549
550
    // Transform 2: Rounds 25-28
551
207k
    TMP = vld1q_u32(&MIDS[24]);
552
207k
    TMP2A = STATE0A;
553
207k
    TMP2B = STATE0B;
554
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
555
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
556
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
557
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
558
559
    // Transform 2: Rounds 29-32
560
207k
    TMP = vld1q_u32(&MIDS[28]);
561
207k
    TMP2A = STATE0A;
562
207k
    TMP2B = STATE0B;
563
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
564
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
565
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
566
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
567
568
    // Transform 2: Rounds 33-36
569
207k
    TMP = vld1q_u32(&MIDS[32]);
570
207k
    TMP2A = STATE0A;
571
207k
    TMP2B = STATE0B;
572
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
573
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
574
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
575
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
576
577
    // Transform 2: Rounds 37-40
578
207k
    TMP = vld1q_u32(&MIDS[36]);
579
207k
    TMP2A = STATE0A;
580
207k
    TMP2B = STATE0B;
581
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
582
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
583
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
584
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
585
586
    // Transform 2: Rounds 41-44
587
207k
    TMP = vld1q_u32(&MIDS[40]);
588
207k
    TMP2A = STATE0A;
589
207k
    TMP2B = STATE0B;
590
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
591
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
592
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
593
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
594
595
    // Transform 2: Rounds 45-48
596
207k
    TMP = vld1q_u32(&MIDS[44]);
597
207k
    TMP2A = STATE0A;
598
207k
    TMP2B = STATE0B;
599
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
600
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
601
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
602
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
603
604
    // Transform 2: Rounds 49-52
605
207k
    TMP = vld1q_u32(&MIDS[48]);
606
207k
    TMP2A = STATE0A;
607
207k
    TMP2B = STATE0B;
608
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
609
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
610
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
611
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
612
613
    // Transform 2: Rounds 53-56
614
207k
    TMP = vld1q_u32(&MIDS[52]);
615
207k
    TMP2A = STATE0A;
616
207k
    TMP2B = STATE0B;
617
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
618
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
619
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
620
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
621
622
    // Transform 2: Rounds 57-60
623
207k
    TMP = vld1q_u32(&MIDS[56]);
624
207k
    TMP2A = STATE0A;
625
207k
    TMP2B = STATE0B;
626
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
627
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
628
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
629
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
630
631
    // Transform 2: Rounds 61-64
632
207k
    TMP = vld1q_u32(&MIDS[60]);
633
207k
    TMP2A = STATE0A;
634
207k
    TMP2B = STATE0B;
635
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
636
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
637
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
638
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
639
640
    // Transform 2: Update state
641
207k
    STATE0A = vaddq_u32(STATE0A, ABCD_SAVEA);
642
207k
    STATE0B = vaddq_u32(STATE0B, ABCD_SAVEB);
643
207k
    STATE1A = vaddq_u32(STATE1A, EFGH_SAVEA);
644
207k
    STATE1B = vaddq_u32(STATE1B, EFGH_SAVEB);
645
646
    // Transform 3: Pad previous output
647
207k
    MSG0A = STATE0A;
648
207k
    MSG0B = STATE0B;
649
207k
    MSG1A = STATE1A;
650
207k
    MSG1B = STATE1B;
651
207k
    MSG2A = vld1q_u32(&FINAL[0]);
652
207k
    MSG2B = MSG2A;
653
207k
    MSG3A = vld1q_u32(&FINAL[4]);
654
207k
    MSG3B = MSG3A;
655
656
    // Transform 3: Load state
657
207k
    STATE0A = vld1q_u32(&INIT[0]);
658
207k
    STATE0B = STATE0A;
659
207k
    STATE1A = vld1q_u32(&INIT[4]);
660
207k
    STATE1B = STATE1A;
661
662
    // Transform 3: Rounds 1-4
663
207k
    TMP = vld1q_u32(&K[0]);
664
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
665
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
666
207k
    TMP2A = STATE0A;
667
207k
    TMP2B = STATE0B;
668
207k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
669
207k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
670
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
671
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
672
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
673
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
674
207k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
675
207k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
676
677
    // Transform 3: Rounds 5-8
678
207k
    TMP = vld1q_u32(&K[4]);
679
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
680
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
681
207k
    TMP2A = STATE0A;
682
207k
    TMP2B = STATE0B;
683
207k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
684
207k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
685
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
686
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
687
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
688
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
689
207k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
690
207k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
691
692
    // Transform 3: Rounds 9-12
693
207k
    TMP = vld1q_u32(&FINS[0]);
694
207k
    TMP2A = STATE0A;
695
207k
    TMP2B = STATE0B;
696
207k
    MSG2A = vld1q_u32(&FINS[4]);
697
207k
    MSG2B = MSG2A;
698
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
699
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
700
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
701
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
702
207k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
703
207k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
704
705
    // Transform 3: Rounds 13-16
706
207k
    TMP = vld1q_u32(&FINS[8]);
707
207k
    TMP2A = STATE0A;
708
207k
    TMP2B = STATE0B;
709
207k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
710
207k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
711
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
712
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
713
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
714
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
715
207k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
716
207k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
717
718
    // Transform 3: Rounds 17-20
719
207k
    TMP = vld1q_u32(&K[16]);
720
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
721
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
722
207k
    TMP2A = STATE0A;
723
207k
    TMP2B = STATE0B;
724
207k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
725
207k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
726
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
727
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
728
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
729
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
730
207k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
731
207k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
732
733
    // Transform 3: Rounds 21-24
734
207k
    TMP = vld1q_u32(&K[20]);
735
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
736
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
737
207k
    TMP2A = STATE0A;
738
207k
    TMP2B = STATE0B;
739
207k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
740
207k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
741
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
742
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
743
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
744
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
745
207k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
746
207k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
747
748
    // Transform 3: Rounds 25-28
749
207k
    TMP = vld1q_u32(&K[24]);
750
207k
    TMP0A = vaddq_u32(MSG2A, TMP);
751
207k
    TMP0B = vaddq_u32(MSG2B, TMP);
752
207k
    TMP2A = STATE0A;
753
207k
    TMP2B = STATE0B;
754
207k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
755
207k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
756
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
757
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
758
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
759
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
760
207k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
761
207k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
762
763
    // Transform 3: Rounds 29-32
764
207k
    TMP = vld1q_u32(&K[28]);
765
207k
    TMP0A = vaddq_u32(MSG3A, TMP);
766
207k
    TMP0B = vaddq_u32(MSG3B, TMP);
767
207k
    TMP2A = STATE0A;
768
207k
    TMP2B = STATE0B;
769
207k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
770
207k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
771
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
772
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
773
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
774
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
775
207k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
776
207k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
777
778
    // Transform 3: Rounds 33-36
779
207k
    TMP = vld1q_u32(&K[32]);
780
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
781
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
782
207k
    TMP2A = STATE0A;
783
207k
    TMP2B = STATE0B;
784
207k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
785
207k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
786
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
787
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
788
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
789
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
790
207k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
791
207k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
792
793
    // Transform 3: Rounds 37-40
794
207k
    TMP = vld1q_u32(&K[36]);
795
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
796
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
797
207k
    TMP2A = STATE0A;
798
207k
    TMP2B = STATE0B;
799
207k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
800
207k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
801
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
802
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
803
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
804
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
805
207k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
806
207k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
807
808
    // Transform 3: Rounds 41-44
809
207k
    TMP = vld1q_u32(&K[40]);
810
207k
    TMP0A = vaddq_u32(MSG2A, TMP);
811
207k
    TMP0B = vaddq_u32(MSG2B, TMP);
812
207k
    TMP2A = STATE0A;
813
207k
    TMP2B = STATE0B;
814
207k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
815
207k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
816
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
817
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
818
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
819
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
820
207k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
821
207k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
822
823
    // Transform 3: Rounds 45-48
824
207k
    TMP = vld1q_u32(&K[44]);
825
207k
    TMP0A = vaddq_u32(MSG3A, TMP);
826
207k
    TMP0B = vaddq_u32(MSG3B, TMP);
827
207k
    TMP2A = STATE0A;
828
207k
    TMP2B = STATE0B;
829
207k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
830
207k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
831
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
832
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
833
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
834
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
835
207k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
836
207k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
837
838
    // Transform 3: Rounds 49-52
839
207k
    TMP = vld1q_u32(&K[48]);
840
207k
    TMP0A = vaddq_u32(MSG0A, TMP);
841
207k
    TMP0B = vaddq_u32(MSG0B, TMP);
842
207k
    TMP2A = STATE0A;
843
207k
    TMP2B = STATE0B;
844
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
845
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
846
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
847
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
848
849
    // Transform 3: Rounds 53-56
850
207k
    TMP = vld1q_u32(&K[52]);
851
207k
    TMP0A = vaddq_u32(MSG1A, TMP);
852
207k
    TMP0B = vaddq_u32(MSG1B, TMP);
853
207k
    TMP2A = STATE0A;
854
207k
    TMP2B = STATE0B;
855
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
856
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
857
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
858
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
859
860
    // Transform 3: Rounds 57-60
861
207k
    TMP = vld1q_u32(&K[56]);
862
207k
    TMP0A = vaddq_u32(MSG2A, TMP);
863
207k
    TMP0B = vaddq_u32(MSG2B, TMP);
864
207k
    TMP2A = STATE0A;
865
207k
    TMP2B = STATE0B;
866
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
867
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
868
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
869
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
870
871
    // Transform 3: Rounds 61-64
872
207k
    TMP = vld1q_u32(&K[60]);
873
207k
    TMP0A = vaddq_u32(MSG3A, TMP);
874
207k
    TMP0B = vaddq_u32(MSG3B, TMP);
875
207k
    TMP2A = STATE0A;
876
207k
    TMP2B = STATE0B;
877
207k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
878
207k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
879
207k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
880
207k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
881
882
    // Transform 3: Update state
883
207k
    TMP = vld1q_u32(&INIT[0]);
884
207k
    STATE0A = vaddq_u32(STATE0A, TMP);
885
207k
    STATE0B = vaddq_u32(STATE0B, TMP);
886
207k
    TMP = vld1q_u32(&INIT[4]);
887
207k
    STATE1A = vaddq_u32(STATE1A, TMP);
888
207k
    STATE1B = vaddq_u32(STATE1B, TMP);
889
890
    // Store result
891
207k
    vst1q_u8(output, vrev32q_u8(vreinterpretq_u8_u32(STATE0A)));
892
207k
    vst1q_u8(output + 16, vrev32q_u8(vreinterpretq_u8_u32(STATE1A)));
893
207k
    vst1q_u8(output + 32, vrev32q_u8(vreinterpretq_u8_u32(STATE0B)));
894
    vst1q_u8(output + 48, vrev32q_u8(vreinterpretq_u8_u32(STATE1B)));
895
207k
}
896
}
897
898
#endif