xref: /isa-l_crypto/sha256_mb/sha256_ctx_base.c (revision 0a437795c8360736f38dfa5934aa03a1861d784c)
1a907b4f0SChunyang Hui /**********************************************************************
2a907b4f0SChunyang Hui   Copyright(c) 2011-2016 Intel Corporation All rights reserved.
3a907b4f0SChunyang Hui 
4a907b4f0SChunyang Hui   Redistribution and use in source and binary forms, with or without
5a907b4f0SChunyang Hui   modification, are permitted provided that the following conditions
6a907b4f0SChunyang Hui   are met:
7a907b4f0SChunyang Hui     * Redistributions of source code must retain the above copyright
8a907b4f0SChunyang Hui       notice, this list of conditions and the following disclaimer.
9a907b4f0SChunyang Hui     * Redistributions in binary form must reproduce the above copyright
10a907b4f0SChunyang Hui       notice, this list of conditions and the following disclaimer in
11a907b4f0SChunyang Hui       the documentation and/or other materials provided with the
12a907b4f0SChunyang Hui       distribution.
13a907b4f0SChunyang Hui     * Neither the name of Intel Corporation nor the names of its
14a907b4f0SChunyang Hui       contributors may be used to endorse or promote products derived
15a907b4f0SChunyang Hui       from this software without specific prior written permission.
16a907b4f0SChunyang Hui 
17a907b4f0SChunyang Hui   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18a907b4f0SChunyang Hui   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19a907b4f0SChunyang Hui   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20a907b4f0SChunyang Hui   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21a907b4f0SChunyang Hui   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22a907b4f0SChunyang Hui   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23a907b4f0SChunyang Hui   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24a907b4f0SChunyang Hui   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25a907b4f0SChunyang Hui   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26a907b4f0SChunyang Hui   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27a907b4f0SChunyang Hui   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28a907b4f0SChunyang Hui **********************************************************************/
29a907b4f0SChunyang Hui 
30a907b4f0SChunyang Hui #include <string.h>
31ae9fc3e1SPablo de Lara #include "sha256_mb_internal.h"
32a907b4f0SChunyang Hui #include "memcpy_inline.h"
3392aa5aa4SGreg Tucker #include "endian_helper.h"
34a907b4f0SChunyang Hui 
35a907b4f0SChunyang Hui #ifdef _MSC_VER
36a907b4f0SChunyang Hui #include <intrin.h>
37a907b4f0SChunyang Hui #define inline __inline
38a907b4f0SChunyang Hui #endif
39a907b4f0SChunyang Hui 
4095100776SGreg Tucker #if (__GNUC__ >= 11)
4195100776SGreg Tucker #define OPT_FIX __attribute__((noipa))
4295100776SGreg Tucker #else
4395100776SGreg Tucker #define OPT_FIX
4495100776SGreg Tucker #endif
4595100776SGreg Tucker 
46a907b4f0SChunyang Hui #define ror32(x, r) (((x) >> (r)) ^ ((x) << (32 - (r))))
47a907b4f0SChunyang Hui 
48a907b4f0SChunyang Hui #define W(x) w[(x) & 15]
49a907b4f0SChunyang Hui 
50a907b4f0SChunyang Hui #define S0(w) (ror32(w, 7) ^ ror32(w, 18) ^ (w >> 3))
51a907b4f0SChunyang Hui #define S1(w) (ror32(w, 17) ^ ror32(w, 19) ^ (w >> 10))
52a907b4f0SChunyang Hui 
53a907b4f0SChunyang Hui #define s0(a)        (ror32(a, 2) ^ ror32(a, 13) ^ ror32(a, 22))
54a907b4f0SChunyang Hui #define s1(e)        (ror32(e, 6) ^ ror32(e, 11) ^ ror32(e, 25))
55a907b4f0SChunyang Hui #define maj(a, b, c) ((a & b) ^ (a & c) ^ (b & c))
56a907b4f0SChunyang Hui #define ch(e, f, g)  ((e & f) ^ (g & ~e))
57a907b4f0SChunyang Hui 
58a907b4f0SChunyang Hui #define step(i, a, b, c, d, e, f, g, h, k)                                                         \
599ba6f238SMarcel Cornu         if (i < 16)                                                                                \
609ba6f238SMarcel Cornu                 W(i) = to_be32(ww[i]);                                                             \
61a907b4f0SChunyang Hui         else                                                                                       \
62a907b4f0SChunyang Hui                 W(i) = W(i - 16) + S0(W(i - 15)) + W(i - 7) + S1(W(i - 2));                        \
63a907b4f0SChunyang Hui         t2 = s0(a) + maj(a, b, c);                                                                 \
64a907b4f0SChunyang Hui         t1 = h + s1(e) + ch(e, f, g) + k + W(i);                                                   \
65a907b4f0SChunyang Hui         d += t1;                                                                                   \
66a907b4f0SChunyang Hui         h = t1 + t2;
67a907b4f0SChunyang Hui 
689ba6f238SMarcel Cornu static void
69*0a437795SPablo de Lara sha256_init(ISAL_SHA256_HASH_CTX *ctx, const void *buffer, uint32_t len);
709ba6f238SMarcel Cornu static void
71*0a437795SPablo de Lara sha256_update(ISAL_SHA256_HASH_CTX *ctx, const void *buffer, uint32_t len);
729ba6f238SMarcel Cornu static void
73*0a437795SPablo de Lara sha256_final(ISAL_SHA256_HASH_CTX *ctx);
749ba6f238SMarcel Cornu static void OPT_FIX
759ba6f238SMarcel Cornu sha256_single(const void *data, uint32_t digest[]);
769ba6f238SMarcel Cornu static inline void
77*0a437795SPablo de Lara hash_init_digest(ISAL_SHA256_WORD_T *digest);
78a907b4f0SChunyang Hui 
799ba6f238SMarcel Cornu void
_sha256_ctx_mgr_init_base(ISAL_SHA256_HASH_CTX_MGR * mgr)80*0a437795SPablo de Lara _sha256_ctx_mgr_init_base(ISAL_SHA256_HASH_CTX_MGR *mgr)
81a907b4f0SChunyang Hui {
82a907b4f0SChunyang Hui }
83a907b4f0SChunyang Hui 
84*0a437795SPablo de Lara ISAL_SHA256_HASH_CTX *
_sha256_ctx_mgr_submit_base(ISAL_SHA256_HASH_CTX_MGR * mgr,ISAL_SHA256_HASH_CTX * ctx,const void * buffer,uint32_t len,ISAL_HASH_CTX_FLAG flags)85*0a437795SPablo de Lara _sha256_ctx_mgr_submit_base(ISAL_SHA256_HASH_CTX_MGR *mgr, ISAL_SHA256_HASH_CTX *ctx,
86*0a437795SPablo de Lara                             const void *buffer, uint32_t len, ISAL_HASH_CTX_FLAG flags)
87a907b4f0SChunyang Hui {
88a907b4f0SChunyang Hui 
898cb7fe78SPablo de Lara         if (flags & (~ISAL_HASH_ENTIRE)) {
90a907b4f0SChunyang Hui                 // User should not pass anything other than FIRST, UPDATE, or LAST
918cb7fe78SPablo de Lara                 ctx->error = ISAL_HASH_CTX_ERROR_INVALID_FLAGS;
92093c179eSJerry Yu                 return ctx;
93a907b4f0SChunyang Hui         }
94a907b4f0SChunyang Hui 
958cb7fe78SPablo de Lara         if ((ctx->status & ISAL_HASH_CTX_STS_PROCESSING) && (flags == ISAL_HASH_ENTIRE)) {
96a907b4f0SChunyang Hui                 // Cannot submit a new entire job to a currently processing job.
978cb7fe78SPablo de Lara                 ctx->error = ISAL_HASH_CTX_ERROR_ALREADY_PROCESSING;
98093c179eSJerry Yu                 return ctx;
99a907b4f0SChunyang Hui         }
100a907b4f0SChunyang Hui 
1018cb7fe78SPablo de Lara         if ((ctx->status & ISAL_HASH_CTX_STS_COMPLETE) && !(flags & ISAL_HASH_FIRST)) {
102a907b4f0SChunyang Hui                 // Cannot update a finished job.
1038cb7fe78SPablo de Lara                 ctx->error = ISAL_HASH_CTX_ERROR_ALREADY_COMPLETED;
104093c179eSJerry Yu                 return ctx;
105a907b4f0SChunyang Hui         }
106a907b4f0SChunyang Hui 
1078cb7fe78SPablo de Lara         if (flags == ISAL_HASH_FIRST) {
108a907b4f0SChunyang Hui 
109a907b4f0SChunyang Hui                 sha256_init(ctx, buffer, len);
110a907b4f0SChunyang Hui                 sha256_update(ctx, buffer, len);
111a907b4f0SChunyang Hui         }
112a907b4f0SChunyang Hui 
1138cb7fe78SPablo de Lara         if (flags == ISAL_HASH_UPDATE) {
114a907b4f0SChunyang Hui                 sha256_update(ctx, buffer, len);
115a907b4f0SChunyang Hui         }
116a907b4f0SChunyang Hui 
1178cb7fe78SPablo de Lara         if (flags == ISAL_HASH_LAST) {
11814f994c3SJerry Yu                 sha256_update(ctx, buffer, len);
11914f994c3SJerry Yu                 sha256_final(ctx);
120a907b4f0SChunyang Hui         }
121a907b4f0SChunyang Hui 
1228cb7fe78SPablo de Lara         if (flags == ISAL_HASH_ENTIRE) {
123a907b4f0SChunyang Hui                 sha256_init(ctx, buffer, len);
12414f994c3SJerry Yu                 sha256_update(ctx, buffer, len);
12514f994c3SJerry Yu                 sha256_final(ctx);
126a907b4f0SChunyang Hui         }
127a907b4f0SChunyang Hui 
128a907b4f0SChunyang Hui         return ctx;
129a907b4f0SChunyang Hui }
130a907b4f0SChunyang Hui 
131*0a437795SPablo de Lara ISAL_SHA256_HASH_CTX *
_sha256_ctx_mgr_flush_base(ISAL_SHA256_HASH_CTX_MGR * mgr)132*0a437795SPablo de Lara _sha256_ctx_mgr_flush_base(ISAL_SHA256_HASH_CTX_MGR *mgr)
133a907b4f0SChunyang Hui {
134a907b4f0SChunyang Hui         return NULL;
135a907b4f0SChunyang Hui }
136a907b4f0SChunyang Hui 
1379ba6f238SMarcel Cornu static void
sha256_init(ISAL_SHA256_HASH_CTX * ctx,const void * buffer,uint32_t len)138*0a437795SPablo de Lara sha256_init(ISAL_SHA256_HASH_CTX *ctx, const void *buffer, uint32_t len)
139a907b4f0SChunyang Hui {
140a907b4f0SChunyang Hui         // Init digest
141a907b4f0SChunyang Hui         hash_init_digest(ctx->job.result_digest);
142a907b4f0SChunyang Hui 
143a907b4f0SChunyang Hui         // Reset byte counter
144a907b4f0SChunyang Hui         ctx->total_length = 0;
145a907b4f0SChunyang Hui 
146a907b4f0SChunyang Hui         // Clear extra blocks
147a907b4f0SChunyang Hui         ctx->partial_block_buffer_length = 0;
148a907b4f0SChunyang Hui 
149a907b4f0SChunyang Hui         // If we made it here, there were no errors during this call to submit
1508cb7fe78SPablo de Lara         ctx->error = ISAL_HASH_CTX_ERROR_NONE;
151a907b4f0SChunyang Hui 
152a907b4f0SChunyang Hui         // Mark it as processing
1538cb7fe78SPablo de Lara         ctx->status = ISAL_HASH_CTX_STS_PROCESSING;
154a907b4f0SChunyang Hui }
155a907b4f0SChunyang Hui 
1569ba6f238SMarcel Cornu static void
sha256_update(ISAL_SHA256_HASH_CTX * ctx,const void * buffer,uint32_t len)157*0a437795SPablo de Lara sha256_update(ISAL_SHA256_HASH_CTX *ctx, const void *buffer, uint32_t len)
158a907b4f0SChunyang Hui {
159a907b4f0SChunyang Hui         uint32_t remain_len = len;
160a907b4f0SChunyang Hui         uint32_t *digest = ctx->job.result_digest;
161a907b4f0SChunyang Hui 
16214f994c3SJerry Yu         // Advance byte counter
16314f994c3SJerry Yu         ctx->total_length += len;
16414f994c3SJerry Yu 
1659ba6f238SMarcel Cornu         // If there is anything currently buffered in the extra blocks, append to it until it
1669ba6f238SMarcel Cornu         // contains a whole block. Or if the user's buffer contains less than a whole block, append
1679ba6f238SMarcel Cornu         // as much as possible to the extra block.
168*0a437795SPablo de Lara         if ((ctx->partial_block_buffer_length) | (remain_len < ISAL_SHA256_BLOCK_SIZE)) {
16914f994c3SJerry Yu                 // Compute how many bytes to copy from user buffer into extra block
170*0a437795SPablo de Lara                 uint32_t copy_len = ISAL_SHA256_BLOCK_SIZE - ctx->partial_block_buffer_length;
17114f994c3SJerry Yu                 if (remain_len < copy_len) {
17214f994c3SJerry Yu                         copy_len = remain_len;
17314f994c3SJerry Yu                 }
17414f994c3SJerry Yu 
17514f994c3SJerry Yu                 if (copy_len) {
17614f994c3SJerry Yu                         // Copy and update relevant pointers and counters
1779ba6f238SMarcel Cornu                         memcpy_fixedlen(
1789ba6f238SMarcel Cornu                                 &ctx->partial_block_buffer[ctx->partial_block_buffer_length],
1799ba6f238SMarcel Cornu                                 buffer, copy_len);
18014f994c3SJerry Yu 
18114f994c3SJerry Yu                         ctx->partial_block_buffer_length += copy_len;
18214f994c3SJerry Yu                         remain_len -= copy_len;
18314f994c3SJerry Yu                         buffer = (void *) ((uint8_t *) buffer + copy_len);
18414f994c3SJerry Yu                 }
18514f994c3SJerry Yu                 // The extra block should never contain more than 1 block here
186*0a437795SPablo de Lara                 assert(ctx->partial_block_buffer_length <= ISAL_SHA256_BLOCK_SIZE);
18714f994c3SJerry Yu 
18814f994c3SJerry Yu                 // If the extra block buffer contains exactly 1 block, it can be hashed.
189*0a437795SPablo de Lara                 if (ctx->partial_block_buffer_length >= ISAL_SHA256_BLOCK_SIZE) {
19014f994c3SJerry Yu                         ctx->partial_block_buffer_length = 0;
19114f994c3SJerry Yu                         sha256_single(ctx->partial_block_buffer, digest);
19214f994c3SJerry Yu                 }
19314f994c3SJerry Yu         }
19414f994c3SJerry Yu         // If the extra blocks are empty, begin hashing what remains in the user's buffer.
19514f994c3SJerry Yu         if (ctx->partial_block_buffer_length == 0) {
196*0a437795SPablo de Lara                 while (remain_len >= ISAL_SHA256_BLOCK_SIZE) {
197a907b4f0SChunyang Hui                         sha256_single(buffer, digest);
198*0a437795SPablo de Lara                         buffer = (void *) ((uint8_t *) buffer + ISAL_SHA256_BLOCK_SIZE);
199*0a437795SPablo de Lara                         remain_len -= ISAL_SHA256_BLOCK_SIZE;
200a907b4f0SChunyang Hui                 }
20114f994c3SJerry Yu         }
20214f994c3SJerry Yu 
20314f994c3SJerry Yu         if (remain_len > 0) {
20414f994c3SJerry Yu                 memcpy_fixedlen(&ctx->partial_block_buffer, buffer, remain_len);
20514f994c3SJerry Yu                 ctx->partial_block_buffer_length = remain_len;
20614f994c3SJerry Yu         }
20714f994c3SJerry Yu 
2088cb7fe78SPablo de Lara         ctx->status = ISAL_HASH_CTX_STS_IDLE;
20914f994c3SJerry Yu         return;
21014f994c3SJerry Yu }
21114f994c3SJerry Yu 
2129ba6f238SMarcel Cornu static void
sha256_final(ISAL_SHA256_HASH_CTX * ctx)213*0a437795SPablo de Lara sha256_final(ISAL_SHA256_HASH_CTX *ctx)
214a907b4f0SChunyang Hui {
21514f994c3SJerry Yu 
21614f994c3SJerry Yu         const void *buffer = ctx->partial_block_buffer;
21714f994c3SJerry Yu         uint32_t i = ctx->partial_block_buffer_length;
218*0a437795SPablo de Lara         uint8_t buf[2 * ISAL_SHA256_BLOCK_SIZE];
219a907b4f0SChunyang Hui         uint32_t *digest = ctx->job.result_digest;
220a907b4f0SChunyang Hui 
221a907b4f0SChunyang Hui         memcpy(buf, buffer, i);
222a907b4f0SChunyang Hui         buf[i++] = 0x80;
223*0a437795SPablo de Lara         for (uint32_t j = i; j < (2 * ISAL_SHA256_BLOCK_SIZE); j++) {
224a907b4f0SChunyang Hui                 buf[j] = 0;
22514f994c3SJerry Yu         }
226a907b4f0SChunyang Hui 
227*0a437795SPablo de Lara         if (i > ISAL_SHA256_BLOCK_SIZE - ISAL_SHA256_PADLENGTHFIELD_SIZE) {
228*0a437795SPablo de Lara                 i = 2 * ISAL_SHA256_BLOCK_SIZE;
22914f994c3SJerry Yu         } else {
230*0a437795SPablo de Lara                 i = ISAL_SHA256_BLOCK_SIZE;
23114f994c3SJerry Yu         }
232a907b4f0SChunyang Hui 
233e3f7d4fbSUlrich Weigand         *(uint64_t *) (buf + i - 8) = to_be64((uint64_t) ctx->total_length * 8);
234a907b4f0SChunyang Hui 
235a907b4f0SChunyang Hui         sha256_single(buf, digest);
236*0a437795SPablo de Lara         if (i == 2 * ISAL_SHA256_BLOCK_SIZE) {
237*0a437795SPablo de Lara                 sha256_single(buf + ISAL_SHA256_BLOCK_SIZE, digest);
238a907b4f0SChunyang Hui         }
239a907b4f0SChunyang Hui 
2408cb7fe78SPablo de Lara         ctx->status = ISAL_HASH_CTX_STS_COMPLETE;
241a907b4f0SChunyang Hui }
242a907b4f0SChunyang Hui 
2439ba6f238SMarcel Cornu void
sha256_single(const void * data,uint32_t digest[])2449ba6f238SMarcel Cornu sha256_single(const void *data, uint32_t digest[])
245a907b4f0SChunyang Hui {
246a907b4f0SChunyang Hui         uint32_t a, b, c, d, e, f, g, h, t1, t2;
247a907b4f0SChunyang Hui         uint32_t w[16];
248a907b4f0SChunyang Hui         uint32_t *ww = (uint32_t *) data;
249a907b4f0SChunyang Hui 
250a907b4f0SChunyang Hui         a = digest[0];
251a907b4f0SChunyang Hui         b = digest[1];
252a907b4f0SChunyang Hui         c = digest[2];
253a907b4f0SChunyang Hui         d = digest[3];
254a907b4f0SChunyang Hui         e = digest[4];
255a907b4f0SChunyang Hui         f = digest[5];
256a907b4f0SChunyang Hui         g = digest[6];
257a907b4f0SChunyang Hui         h = digest[7];
258a907b4f0SChunyang Hui 
259a907b4f0SChunyang Hui         step(0, a, b, c, d, e, f, g, h, 0x428a2f98);
260a907b4f0SChunyang Hui         step(1, h, a, b, c, d, e, f, g, 0x71374491);
261a907b4f0SChunyang Hui         step(2, g, h, a, b, c, d, e, f, 0xb5c0fbcf);
262a907b4f0SChunyang Hui         step(3, f, g, h, a, b, c, d, e, 0xe9b5dba5);
263a907b4f0SChunyang Hui         step(4, e, f, g, h, a, b, c, d, 0x3956c25b);
264a907b4f0SChunyang Hui         step(5, d, e, f, g, h, a, b, c, 0x59f111f1);
265a907b4f0SChunyang Hui         step(6, c, d, e, f, g, h, a, b, 0x923f82a4);
266a907b4f0SChunyang Hui         step(7, b, c, d, e, f, g, h, a, 0xab1c5ed5);
267a907b4f0SChunyang Hui         step(8, a, b, c, d, e, f, g, h, 0xd807aa98);
268a907b4f0SChunyang Hui         step(9, h, a, b, c, d, e, f, g, 0x12835b01);
269a907b4f0SChunyang Hui         step(10, g, h, a, b, c, d, e, f, 0x243185be);
270a907b4f0SChunyang Hui         step(11, f, g, h, a, b, c, d, e, 0x550c7dc3);
271a907b4f0SChunyang Hui         step(12, e, f, g, h, a, b, c, d, 0x72be5d74);
272a907b4f0SChunyang Hui         step(13, d, e, f, g, h, a, b, c, 0x80deb1fe);
273a907b4f0SChunyang Hui         step(14, c, d, e, f, g, h, a, b, 0x9bdc06a7);
274a907b4f0SChunyang Hui         step(15, b, c, d, e, f, g, h, a, 0xc19bf174);
275a907b4f0SChunyang Hui         step(16, a, b, c, d, e, f, g, h, 0xe49b69c1);
276a907b4f0SChunyang Hui         step(17, h, a, b, c, d, e, f, g, 0xefbe4786);
277a907b4f0SChunyang Hui         step(18, g, h, a, b, c, d, e, f, 0x0fc19dc6);
278a907b4f0SChunyang Hui         step(19, f, g, h, a, b, c, d, e, 0x240ca1cc);
279a907b4f0SChunyang Hui         step(20, e, f, g, h, a, b, c, d, 0x2de92c6f);
280a907b4f0SChunyang Hui         step(21, d, e, f, g, h, a, b, c, 0x4a7484aa);
281a907b4f0SChunyang Hui         step(22, c, d, e, f, g, h, a, b, 0x5cb0a9dc);
282a907b4f0SChunyang Hui         step(23, b, c, d, e, f, g, h, a, 0x76f988da);
283a907b4f0SChunyang Hui         step(24, a, b, c, d, e, f, g, h, 0x983e5152);
284a907b4f0SChunyang Hui         step(25, h, a, b, c, d, e, f, g, 0xa831c66d);
285a907b4f0SChunyang Hui         step(26, g, h, a, b, c, d, e, f, 0xb00327c8);
286a907b4f0SChunyang Hui         step(27, f, g, h, a, b, c, d, e, 0xbf597fc7);
287a907b4f0SChunyang Hui         step(28, e, f, g, h, a, b, c, d, 0xc6e00bf3);
288a907b4f0SChunyang Hui         step(29, d, e, f, g, h, a, b, c, 0xd5a79147);
289a907b4f0SChunyang Hui         step(30, c, d, e, f, g, h, a, b, 0x06ca6351);
290a907b4f0SChunyang Hui         step(31, b, c, d, e, f, g, h, a, 0x14292967);
291a907b4f0SChunyang Hui         step(32, a, b, c, d, e, f, g, h, 0x27b70a85);
292a907b4f0SChunyang Hui         step(33, h, a, b, c, d, e, f, g, 0x2e1b2138);
293a907b4f0SChunyang Hui         step(34, g, h, a, b, c, d, e, f, 0x4d2c6dfc);
294a907b4f0SChunyang Hui         step(35, f, g, h, a, b, c, d, e, 0x53380d13);
295a907b4f0SChunyang Hui         step(36, e, f, g, h, a, b, c, d, 0x650a7354);
296a907b4f0SChunyang Hui         step(37, d, e, f, g, h, a, b, c, 0x766a0abb);
297a907b4f0SChunyang Hui         step(38, c, d, e, f, g, h, a, b, 0x81c2c92e);
298a907b4f0SChunyang Hui         step(39, b, c, d, e, f, g, h, a, 0x92722c85);
299a907b4f0SChunyang Hui         step(40, a, b, c, d, e, f, g, h, 0xa2bfe8a1);
300a907b4f0SChunyang Hui         step(41, h, a, b, c, d, e, f, g, 0xa81a664b);
301a907b4f0SChunyang Hui         step(42, g, h, a, b, c, d, e, f, 0xc24b8b70);
302a907b4f0SChunyang Hui         step(43, f, g, h, a, b, c, d, e, 0xc76c51a3);
303a907b4f0SChunyang Hui         step(44, e, f, g, h, a, b, c, d, 0xd192e819);
304a907b4f0SChunyang Hui         step(45, d, e, f, g, h, a, b, c, 0xd6990624);
305a907b4f0SChunyang Hui         step(46, c, d, e, f, g, h, a, b, 0xf40e3585);
306a907b4f0SChunyang Hui         step(47, b, c, d, e, f, g, h, a, 0x106aa070);
307a907b4f0SChunyang Hui         step(48, a, b, c, d, e, f, g, h, 0x19a4c116);
308a907b4f0SChunyang Hui         step(49, h, a, b, c, d, e, f, g, 0x1e376c08);
309a907b4f0SChunyang Hui         step(50, g, h, a, b, c, d, e, f, 0x2748774c);
310a907b4f0SChunyang Hui         step(51, f, g, h, a, b, c, d, e, 0x34b0bcb5);
311a907b4f0SChunyang Hui         step(52, e, f, g, h, a, b, c, d, 0x391c0cb3);
312a907b4f0SChunyang Hui         step(53, d, e, f, g, h, a, b, c, 0x4ed8aa4a);
313a907b4f0SChunyang Hui         step(54, c, d, e, f, g, h, a, b, 0x5b9cca4f);
314a907b4f0SChunyang Hui         step(55, b, c, d, e, f, g, h, a, 0x682e6ff3);
315a907b4f0SChunyang Hui         step(56, a, b, c, d, e, f, g, h, 0x748f82ee);
316a907b4f0SChunyang Hui         step(57, h, a, b, c, d, e, f, g, 0x78a5636f);
317a907b4f0SChunyang Hui         step(58, g, h, a, b, c, d, e, f, 0x84c87814);
318a907b4f0SChunyang Hui         step(59, f, g, h, a, b, c, d, e, 0x8cc70208);
319a907b4f0SChunyang Hui         step(60, e, f, g, h, a, b, c, d, 0x90befffa);
320a907b4f0SChunyang Hui         step(61, d, e, f, g, h, a, b, c, 0xa4506ceb);
321a907b4f0SChunyang Hui         step(62, c, d, e, f, g, h, a, b, 0xbef9a3f7);
322a907b4f0SChunyang Hui         step(63, b, c, d, e, f, g, h, a, 0xc67178f2);
323a907b4f0SChunyang Hui 
324a907b4f0SChunyang Hui         digest[0] += a;
325a907b4f0SChunyang Hui         digest[1] += b;
326a907b4f0SChunyang Hui         digest[2] += c;
327a907b4f0SChunyang Hui         digest[3] += d;
328a907b4f0SChunyang Hui         digest[4] += e;
329a907b4f0SChunyang Hui         digest[5] += f;
330a907b4f0SChunyang Hui         digest[6] += g;
331a907b4f0SChunyang Hui         digest[7] += h;
332a907b4f0SChunyang Hui }
333a907b4f0SChunyang Hui 
3349ba6f238SMarcel Cornu static inline void
hash_init_digest(ISAL_SHA256_WORD_T * digest)335*0a437795SPablo de Lara hash_init_digest(ISAL_SHA256_WORD_T *digest)
336a907b4f0SChunyang Hui {
337*0a437795SPablo de Lara         static const ISAL_SHA256_WORD_T hash_initial_digest[ISAL_SHA256_DIGEST_NWORDS] = {
338*0a437795SPablo de Lara                 ISAL_SHA256_INITIAL_DIGEST
3399ba6f238SMarcel Cornu         };
340a907b4f0SChunyang Hui         memcpy_fixedlen(digest, hash_initial_digest, sizeof(hash_initial_digest));
341a907b4f0SChunyang Hui }
342a907b4f0SChunyang Hui 
343a907b4f0SChunyang Hui struct slver {
344a907b4f0SChunyang Hui         uint16_t snum;
345a907b4f0SChunyang Hui         uint8_t ver;
346a907b4f0SChunyang Hui         uint8_t core;
347a907b4f0SChunyang Hui };
3482fb85107SPablo de Lara struct slver _sha256_ctx_mgr_init_base_slver_000002f0;
3492fb85107SPablo de Lara struct slver _sha256_ctx_mgr_init_base_slver = { 0x02f0, 0x00, 0x00 };
350a907b4f0SChunyang Hui 
3512fb85107SPablo de Lara struct slver _sha256_ctx_mgr_submit_base_slver_000002f1;
3522fb85107SPablo de Lara struct slver _sha256_ctx_mgr_submit_base_slver = { 0x02f1, 0x00, 0x00 };
353a907b4f0SChunyang Hui 
3542fb85107SPablo de Lara struct slver _sha256_ctx_mgr_flush_base_slver_000002f2;
3552fb85107SPablo de Lara struct slver _sha256_ctx_mgr_flush_base_slver = { 0x02f2, 0x00, 0x00 };
356