xref: /isa-l_crypto/sha1_mb/sha1_ctx_base.c (revision 8cb7fe780eac8ee5f1e0aa3ca37466e89c673ccd)
187491720SChunyang Hui /**********************************************************************
287491720SChunyang Hui   Copyright(c) 2011-2016 Intel Corporation All rights reserved.
387491720SChunyang Hui 
487491720SChunyang Hui   Redistribution and use in source and binary forms, with or without
587491720SChunyang Hui   modification, are permitted provided that the following conditions
687491720SChunyang Hui   are met:
787491720SChunyang Hui     * Redistributions of source code must retain the above copyright
887491720SChunyang Hui       notice, this list of conditions and the following disclaimer.
987491720SChunyang Hui     * Redistributions in binary form must reproduce the above copyright
1087491720SChunyang Hui       notice, this list of conditions and the following disclaimer in
1187491720SChunyang Hui       the documentation and/or other materials provided with the
1287491720SChunyang Hui       distribution.
1387491720SChunyang Hui     * Neither the name of Intel Corporation nor the names of its
1487491720SChunyang Hui       contributors may be used to endorse or promote products derived
1587491720SChunyang Hui       from this software without specific prior written permission.
1687491720SChunyang Hui 
1787491720SChunyang Hui   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1887491720SChunyang Hui   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1987491720SChunyang Hui   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2087491720SChunyang Hui   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2187491720SChunyang Hui   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2287491720SChunyang Hui   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2387491720SChunyang Hui   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2487491720SChunyang Hui   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2587491720SChunyang Hui   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2687491720SChunyang Hui   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2787491720SChunyang Hui   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2887491720SChunyang Hui **********************************************************************/
2987491720SChunyang Hui 
3087491720SChunyang Hui #include <stdint.h>
3187491720SChunyang Hui #include <string.h>
324d41f26cSPablo de Lara #include "sha1_mb_internal.h"
3387491720SChunyang Hui #include "memcpy_inline.h"
3492aa5aa4SGreg Tucker #include "endian_helper.h"
3587491720SChunyang Hui 
3687491720SChunyang Hui #ifdef _MSC_VER
3787491720SChunyang Hui #include <intrin.h>
3887491720SChunyang Hui #define inline __inline
3987491720SChunyang Hui #endif
4087491720SChunyang Hui 
4195100776SGreg Tucker #if (__GNUC__ >= 11)
4295100776SGreg Tucker #define OPT_FIX __attribute__((noipa))
4395100776SGreg Tucker #else
4495100776SGreg Tucker #define OPT_FIX
4595100776SGreg Tucker #endif
4695100776SGreg Tucker 
4787491720SChunyang Hui #define F1(b, c, d) (d ^ (b & (c ^ d)))
4887491720SChunyang Hui #define F2(b, c, d) (b ^ c ^ d)
4987491720SChunyang Hui #define F3(b, c, d) ((b & c) | (d & (b | c)))
5087491720SChunyang Hui #define F4(b, c, d) (b ^ c ^ d)
5187491720SChunyang Hui 
5287491720SChunyang Hui #define rol32(x, r) (((x) << (r)) ^ ((x) >> (32 - (r))))
5387491720SChunyang Hui 
5487491720SChunyang Hui #define W(x) w[(x) & 15]
5587491720SChunyang Hui 
5687491720SChunyang Hui #define step00_19(i, a, b, c, d, e)                                                                \
57868f05eaSMarcel Cornu         if (i > 15)                                                                                \
58868f05eaSMarcel Cornu                 W(i) = rol32(W(i - 3) ^ W(i - 8) ^ W(i - 14) ^ W(i - 16), 1);                      \
59868f05eaSMarcel Cornu         else                                                                                       \
60868f05eaSMarcel Cornu                 W(i) = to_be32(ww[i]);                                                             \
6187491720SChunyang Hui         e += rol32(a, 5) + F1(b, c, d) + 0x5A827999 + W(i);                                        \
6287491720SChunyang Hui         b = rol32(b, 30)
6387491720SChunyang Hui 
6487491720SChunyang Hui #define step20_39(i, a, b, c, d, e)                                                                \
6587491720SChunyang Hui         W(i) = rol32(W(i - 3) ^ W(i - 8) ^ W(i - 14) ^ W(i - 16), 1);                              \
6687491720SChunyang Hui         e += rol32(a, 5) + F2(b, c, d) + 0x6ED9EBA1 + W(i);                                        \
6787491720SChunyang Hui         b = rol32(b, 30)
6887491720SChunyang Hui 
6987491720SChunyang Hui #define step40_59(i, a, b, c, d, e)                                                                \
7087491720SChunyang Hui         W(i) = rol32(W(i - 3) ^ W(i - 8) ^ W(i - 14) ^ W(i - 16), 1);                              \
7187491720SChunyang Hui         e += rol32(a, 5) + F3(b, c, d) + 0x8F1BBCDC + W(i);                                        \
7287491720SChunyang Hui         b = rol32(b, 30)
7387491720SChunyang Hui 
7487491720SChunyang Hui #define step60_79(i, a, b, c, d, e)                                                                \
7587491720SChunyang Hui         W(i) = rol32(W(i - 3) ^ W(i - 8) ^ W(i - 14) ^ W(i - 16), 1);                              \
7687491720SChunyang Hui         e += rol32(a, 5) + F4(b, c, d) + 0xCA62C1D6 + W(i);                                        \
7787491720SChunyang Hui         b = rol32(b, 30)
7887491720SChunyang Hui 
79868f05eaSMarcel Cornu static void
800106da91SPablo de Lara sha1_init(ISAL_SHA1_HASH_CTX *ctx, const void *buffer, uint32_t len);
81868f05eaSMarcel Cornu static void
820106da91SPablo de Lara sha1_update(ISAL_SHA1_HASH_CTX *ctx, const void *buffer, uint32_t len);
83868f05eaSMarcel Cornu static void
840106da91SPablo de Lara sha1_final(ISAL_SHA1_HASH_CTX *ctx);
85868f05eaSMarcel Cornu static void OPT_FIX
86868f05eaSMarcel Cornu sha1_single(const void *data, uint32_t digest[]);
87868f05eaSMarcel Cornu static inline void
880106da91SPablo de Lara hash_init_digest(ISAL_SHA1_WORD_T *digest);
8987491720SChunyang Hui 
90868f05eaSMarcel Cornu void
_sha1_ctx_mgr_init_base(ISAL_SHA1_HASH_CTX_MGR * mgr)910106da91SPablo de Lara _sha1_ctx_mgr_init_base(ISAL_SHA1_HASH_CTX_MGR *mgr)
9287491720SChunyang Hui {
9387491720SChunyang Hui }
9487491720SChunyang Hui 
950106da91SPablo de Lara ISAL_SHA1_HASH_CTX *
_sha1_ctx_mgr_submit_base(ISAL_SHA1_HASH_CTX_MGR * mgr,ISAL_SHA1_HASH_CTX * ctx,const void * buffer,uint32_t len,ISAL_HASH_CTX_FLAG flags)960106da91SPablo de Lara _sha1_ctx_mgr_submit_base(ISAL_SHA1_HASH_CTX_MGR *mgr, ISAL_SHA1_HASH_CTX *ctx, const void *buffer,
97*8cb7fe78SPablo de Lara                           uint32_t len, ISAL_HASH_CTX_FLAG flags)
9887491720SChunyang Hui {
9987491720SChunyang Hui 
100*8cb7fe78SPablo de Lara         if (flags & (~ISAL_HASH_ENTIRE)) {
10187491720SChunyang Hui                 // User should not pass anything other than FIRST, UPDATE, or LAST
102*8cb7fe78SPablo de Lara                 ctx->error = ISAL_HASH_CTX_ERROR_INVALID_FLAGS;
103093c179eSJerry Yu                 return ctx;
10487491720SChunyang Hui         }
10587491720SChunyang Hui 
106*8cb7fe78SPablo de Lara         if ((ctx->status & ISAL_HASH_CTX_STS_PROCESSING) && (flags == ISAL_HASH_ENTIRE)) {
10787491720SChunyang Hui                 // Cannot submit a new entire job to a currently processing job.
108*8cb7fe78SPablo de Lara                 ctx->error = ISAL_HASH_CTX_ERROR_ALREADY_PROCESSING;
109093c179eSJerry Yu                 return ctx;
11087491720SChunyang Hui         }
11187491720SChunyang Hui 
112*8cb7fe78SPablo de Lara         if ((ctx->status & ISAL_HASH_CTX_STS_COMPLETE) && !(flags & ISAL_HASH_FIRST)) {
11387491720SChunyang Hui                 // Cannot update a finished job.
114*8cb7fe78SPablo de Lara                 ctx->error = ISAL_HASH_CTX_ERROR_ALREADY_COMPLETED;
115093c179eSJerry Yu                 return ctx;
11687491720SChunyang Hui         }
11787491720SChunyang Hui 
118*8cb7fe78SPablo de Lara         if (flags == ISAL_HASH_FIRST) {
11987491720SChunyang Hui 
12087491720SChunyang Hui                 sha1_init(ctx, buffer, len);
12187491720SChunyang Hui                 sha1_update(ctx, buffer, len);
12287491720SChunyang Hui         }
12387491720SChunyang Hui 
124*8cb7fe78SPablo de Lara         if (flags == ISAL_HASH_UPDATE) {
12587491720SChunyang Hui                 sha1_update(ctx, buffer, len);
12687491720SChunyang Hui         }
12787491720SChunyang Hui 
128*8cb7fe78SPablo de Lara         if (flags == ISAL_HASH_LAST) {
12914f994c3SJerry Yu                 sha1_update(ctx, buffer, len);
13014f994c3SJerry Yu                 sha1_final(ctx);
13187491720SChunyang Hui         }
13287491720SChunyang Hui 
133*8cb7fe78SPablo de Lara         if (flags == ISAL_HASH_ENTIRE) {
13487491720SChunyang Hui                 sha1_init(ctx, buffer, len);
13514f994c3SJerry Yu                 sha1_update(ctx, buffer, len);
13614f994c3SJerry Yu                 sha1_final(ctx);
13787491720SChunyang Hui         }
13887491720SChunyang Hui 
13987491720SChunyang Hui         return ctx;
14087491720SChunyang Hui }
14187491720SChunyang Hui 
1420106da91SPablo de Lara ISAL_SHA1_HASH_CTX *
_sha1_ctx_mgr_flush_base(ISAL_SHA1_HASH_CTX_MGR * mgr)1430106da91SPablo de Lara _sha1_ctx_mgr_flush_base(ISAL_SHA1_HASH_CTX_MGR *mgr)
14487491720SChunyang Hui {
14587491720SChunyang Hui         return NULL;
14687491720SChunyang Hui }
14787491720SChunyang Hui 
148868f05eaSMarcel Cornu static void
sha1_init(ISAL_SHA1_HASH_CTX * ctx,const void * buffer,uint32_t len)1490106da91SPablo de Lara sha1_init(ISAL_SHA1_HASH_CTX *ctx, const void *buffer, uint32_t len)
15087491720SChunyang Hui {
15187491720SChunyang Hui         // Init digest
15287491720SChunyang Hui         hash_init_digest(ctx->job.result_digest);
15387491720SChunyang Hui 
15487491720SChunyang Hui         // Reset byte counter
15587491720SChunyang Hui         ctx->total_length = 0;
15687491720SChunyang Hui 
15787491720SChunyang Hui         // Clear extra blocks
15887491720SChunyang Hui         ctx->partial_block_buffer_length = 0;
15987491720SChunyang Hui 
16087491720SChunyang Hui         // If we made it here, there were no errors during this call to submit
161*8cb7fe78SPablo de Lara         ctx->error = ISAL_HASH_CTX_ERROR_NONE;
16287491720SChunyang Hui 
16387491720SChunyang Hui         // Mark it as processing
164*8cb7fe78SPablo de Lara         ctx->status = ISAL_HASH_CTX_STS_PROCESSING;
16587491720SChunyang Hui }
16687491720SChunyang Hui 
167868f05eaSMarcel Cornu static void
sha1_update(ISAL_SHA1_HASH_CTX * ctx,const void * buffer,uint32_t len)1680106da91SPablo de Lara sha1_update(ISAL_SHA1_HASH_CTX *ctx, const void *buffer, uint32_t len)
16987491720SChunyang Hui {
17087491720SChunyang Hui         uint32_t remain_len = len;
17187491720SChunyang Hui         uint32_t *digest = ctx->job.result_digest;
17287491720SChunyang Hui 
17314f994c3SJerry Yu         // Advance byte counter
17414f994c3SJerry Yu         ctx->total_length += len;
17514f994c3SJerry Yu 
176868f05eaSMarcel Cornu         // If there is anything currently buffered in the extra blocks, append to it until it
177868f05eaSMarcel Cornu         // contains a whole block. Or if the user's buffer contains less than a whole block, append
178868f05eaSMarcel Cornu         // as much as possible to the extra block.
1790106da91SPablo de Lara         if ((ctx->partial_block_buffer_length) | (remain_len < ISAL_SHA1_BLOCK_SIZE)) {
18014f994c3SJerry Yu                 // Compute how many bytes to copy from user buffer into extra block
1810106da91SPablo de Lara                 uint32_t copy_len = ISAL_SHA1_BLOCK_SIZE - ctx->partial_block_buffer_length;
18214f994c3SJerry Yu                 if (remain_len < copy_len) {
18314f994c3SJerry Yu                         copy_len = remain_len;
18414f994c3SJerry Yu                 }
18514f994c3SJerry Yu 
18614f994c3SJerry Yu                 if (copy_len) {
18714f994c3SJerry Yu                         // Copy and update relevant pointers and counters
188868f05eaSMarcel Cornu                         memcpy_fixedlen(
189868f05eaSMarcel Cornu                                 &ctx->partial_block_buffer[ctx->partial_block_buffer_length],
190868f05eaSMarcel Cornu                                 buffer, copy_len);
19114f994c3SJerry Yu 
19214f994c3SJerry Yu                         ctx->partial_block_buffer_length += copy_len;
19314f994c3SJerry Yu                         remain_len -= copy_len;
19414f994c3SJerry Yu                         buffer = (void *) ((uint8_t *) buffer + copy_len);
19514f994c3SJerry Yu                 }
19614f994c3SJerry Yu                 // The extra block should never contain more than 1 block here
1970106da91SPablo de Lara                 assert(ctx->partial_block_buffer_length <= ISAL_SHA1_BLOCK_SIZE);
19814f994c3SJerry Yu 
19914f994c3SJerry Yu                 // If the extra block buffer contains exactly 1 block, it can be hashed.
2000106da91SPablo de Lara                 if (ctx->partial_block_buffer_length >= ISAL_SHA1_BLOCK_SIZE) {
20114f994c3SJerry Yu                         ctx->partial_block_buffer_length = 0;
20214f994c3SJerry Yu                         sha1_single(ctx->partial_block_buffer, digest);
20314f994c3SJerry Yu                 }
20414f994c3SJerry Yu         }
20514f994c3SJerry Yu         // If the extra blocks are empty, begin hashing what remains in the user's buffer.
20614f994c3SJerry Yu         if (ctx->partial_block_buffer_length == 0) {
2070106da91SPablo de Lara                 while (remain_len >= ISAL_SHA1_BLOCK_SIZE) {
20887491720SChunyang Hui                         sha1_single(buffer, digest);
2090106da91SPablo de Lara                         buffer = (void *) ((uint8_t *) buffer + ISAL_SHA1_BLOCK_SIZE);
2100106da91SPablo de Lara                         remain_len -= ISAL_SHA1_BLOCK_SIZE;
21114f994c3SJerry Yu                 }
21214f994c3SJerry Yu         }
21314f994c3SJerry Yu 
21414f994c3SJerry Yu         if (remain_len > 0) {
21514f994c3SJerry Yu                 memcpy_fixedlen(&ctx->partial_block_buffer, buffer, remain_len);
21614f994c3SJerry Yu                 ctx->partial_block_buffer_length = remain_len;
21787491720SChunyang Hui         }
21887491720SChunyang Hui 
219*8cb7fe78SPablo de Lara         ctx->status = ISAL_HASH_CTX_STS_IDLE;
22014f994c3SJerry Yu         return;
22187491720SChunyang Hui }
22287491720SChunyang Hui 
223868f05eaSMarcel Cornu static void
sha1_final(ISAL_SHA1_HASH_CTX * ctx)2240106da91SPablo de Lara sha1_final(ISAL_SHA1_HASH_CTX *ctx)
22587491720SChunyang Hui {
22614f994c3SJerry Yu         const void *buffer = ctx->partial_block_buffer;
22714f994c3SJerry Yu         uint32_t i = ctx->partial_block_buffer_length;
2280106da91SPablo de Lara         uint8_t buf[2 * ISAL_SHA1_BLOCK_SIZE];
22987491720SChunyang Hui         uint32_t *digest = ctx->job.result_digest;
23087491720SChunyang Hui 
23187491720SChunyang Hui         memcpy(buf, buffer, i);
23287491720SChunyang Hui         buf[i++] = 0x80;
2330106da91SPablo de Lara         for (uint32_t j = i; j < (2 * ISAL_SHA1_BLOCK_SIZE); j++) {
23487491720SChunyang Hui                 buf[j] = 0;
23514f994c3SJerry Yu         }
23687491720SChunyang Hui 
2370106da91SPablo de Lara         if (i > ISAL_SHA1_BLOCK_SIZE - ISAL_SHA1_PADLENGTHFIELD_SIZE) {
2380106da91SPablo de Lara                 i = 2 * ISAL_SHA1_BLOCK_SIZE;
23914f994c3SJerry Yu         } else {
2400106da91SPablo de Lara                 i = ISAL_SHA1_BLOCK_SIZE;
24114f994c3SJerry Yu         }
24287491720SChunyang Hui 
243e3f7d4fbSUlrich Weigand         *(uint64_t *) (buf + i - 8) = to_be64((uint64_t) ctx->total_length * 8);
24487491720SChunyang Hui 
24587491720SChunyang Hui         sha1_single(buf, digest);
2460106da91SPablo de Lara         if (i == 2 * ISAL_SHA1_BLOCK_SIZE) {
2470106da91SPablo de Lara                 sha1_single(buf + ISAL_SHA1_BLOCK_SIZE, digest);
24887491720SChunyang Hui         }
24987491720SChunyang Hui 
250*8cb7fe78SPablo de Lara         ctx->status = ISAL_HASH_CTX_STS_COMPLETE;
25187491720SChunyang Hui }
25287491720SChunyang Hui 
253868f05eaSMarcel Cornu void
sha1_single(const void * data,uint32_t digest[])254868f05eaSMarcel Cornu sha1_single(const void *data, uint32_t digest[])
25587491720SChunyang Hui {
25687491720SChunyang Hui         uint32_t a, b, c, d, e;
25787491720SChunyang Hui         uint32_t w[16] = { 0 };
25887491720SChunyang Hui         uint32_t *ww = (uint32_t *) data;
25987491720SChunyang Hui 
26087491720SChunyang Hui         a = digest[0];
26187491720SChunyang Hui         b = digest[1];
26287491720SChunyang Hui         c = digest[2];
26387491720SChunyang Hui         d = digest[3];
26487491720SChunyang Hui         e = digest[4];
26587491720SChunyang Hui 
26687491720SChunyang Hui         step00_19(0, a, b, c, d, e);
26787491720SChunyang Hui         step00_19(1, e, a, b, c, d);
26887491720SChunyang Hui         step00_19(2, d, e, a, b, c);
26987491720SChunyang Hui         step00_19(3, c, d, e, a, b);
27087491720SChunyang Hui         step00_19(4, b, c, d, e, a);
27187491720SChunyang Hui         step00_19(5, a, b, c, d, e);
27287491720SChunyang Hui         step00_19(6, e, a, b, c, d);
27387491720SChunyang Hui         step00_19(7, d, e, a, b, c);
27487491720SChunyang Hui         step00_19(8, c, d, e, a, b);
27587491720SChunyang Hui         step00_19(9, b, c, d, e, a);
27687491720SChunyang Hui         step00_19(10, a, b, c, d, e);
27787491720SChunyang Hui         step00_19(11, e, a, b, c, d);
27887491720SChunyang Hui         step00_19(12, d, e, a, b, c);
27987491720SChunyang Hui         step00_19(13, c, d, e, a, b);
28087491720SChunyang Hui         step00_19(14, b, c, d, e, a);
28187491720SChunyang Hui         step00_19(15, a, b, c, d, e);
28287491720SChunyang Hui         step00_19(16, e, a, b, c, d);
28387491720SChunyang Hui         step00_19(17, d, e, a, b, c);
28487491720SChunyang Hui         step00_19(18, c, d, e, a, b);
28587491720SChunyang Hui         step00_19(19, b, c, d, e, a);
28687491720SChunyang Hui 
28787491720SChunyang Hui         step20_39(20, a, b, c, d, e);
28887491720SChunyang Hui         step20_39(21, e, a, b, c, d);
28987491720SChunyang Hui         step20_39(22, d, e, a, b, c);
29087491720SChunyang Hui         step20_39(23, c, d, e, a, b);
29187491720SChunyang Hui         step20_39(24, b, c, d, e, a);
29287491720SChunyang Hui         step20_39(25, a, b, c, d, e);
29387491720SChunyang Hui         step20_39(26, e, a, b, c, d);
29487491720SChunyang Hui         step20_39(27, d, e, a, b, c);
29587491720SChunyang Hui         step20_39(28, c, d, e, a, b);
29687491720SChunyang Hui         step20_39(29, b, c, d, e, a);
29787491720SChunyang Hui         step20_39(30, a, b, c, d, e);
29887491720SChunyang Hui         step20_39(31, e, a, b, c, d);
29987491720SChunyang Hui         step20_39(32, d, e, a, b, c);
30087491720SChunyang Hui         step20_39(33, c, d, e, a, b);
30187491720SChunyang Hui         step20_39(34, b, c, d, e, a);
30287491720SChunyang Hui         step20_39(35, a, b, c, d, e);
30387491720SChunyang Hui         step20_39(36, e, a, b, c, d);
30487491720SChunyang Hui         step20_39(37, d, e, a, b, c);
30587491720SChunyang Hui         step20_39(38, c, d, e, a, b);
30687491720SChunyang Hui         step20_39(39, b, c, d, e, a);
30787491720SChunyang Hui 
30887491720SChunyang Hui         step40_59(40, a, b, c, d, e);
30987491720SChunyang Hui         step40_59(41, e, a, b, c, d);
31087491720SChunyang Hui         step40_59(42, d, e, a, b, c);
31187491720SChunyang Hui         step40_59(43, c, d, e, a, b);
31287491720SChunyang Hui         step40_59(44, b, c, d, e, a);
31387491720SChunyang Hui         step40_59(45, a, b, c, d, e);
31487491720SChunyang Hui         step40_59(46, e, a, b, c, d);
31587491720SChunyang Hui         step40_59(47, d, e, a, b, c);
31687491720SChunyang Hui         step40_59(48, c, d, e, a, b);
31787491720SChunyang Hui         step40_59(49, b, c, d, e, a);
31887491720SChunyang Hui         step40_59(50, a, b, c, d, e);
31987491720SChunyang Hui         step40_59(51, e, a, b, c, d);
32087491720SChunyang Hui         step40_59(52, d, e, a, b, c);
32187491720SChunyang Hui         step40_59(53, c, d, e, a, b);
32287491720SChunyang Hui         step40_59(54, b, c, d, e, a);
32387491720SChunyang Hui         step40_59(55, a, b, c, d, e);
32487491720SChunyang Hui         step40_59(56, e, a, b, c, d);
32587491720SChunyang Hui         step40_59(57, d, e, a, b, c);
32687491720SChunyang Hui         step40_59(58, c, d, e, a, b);
32787491720SChunyang Hui         step40_59(59, b, c, d, e, a);
32887491720SChunyang Hui 
32987491720SChunyang Hui         step60_79(60, a, b, c, d, e);
33087491720SChunyang Hui         step60_79(61, e, a, b, c, d);
33187491720SChunyang Hui         step60_79(62, d, e, a, b, c);
33287491720SChunyang Hui         step60_79(63, c, d, e, a, b);
33387491720SChunyang Hui         step60_79(64, b, c, d, e, a);
33487491720SChunyang Hui         step60_79(65, a, b, c, d, e);
33587491720SChunyang Hui         step60_79(66, e, a, b, c, d);
33687491720SChunyang Hui         step60_79(67, d, e, a, b, c);
33787491720SChunyang Hui         step60_79(68, c, d, e, a, b);
33887491720SChunyang Hui         step60_79(69, b, c, d, e, a);
33987491720SChunyang Hui         step60_79(70, a, b, c, d, e);
34087491720SChunyang Hui         step60_79(71, e, a, b, c, d);
34187491720SChunyang Hui         step60_79(72, d, e, a, b, c);
34287491720SChunyang Hui         step60_79(73, c, d, e, a, b);
34387491720SChunyang Hui         step60_79(74, b, c, d, e, a);
34487491720SChunyang Hui         step60_79(75, a, b, c, d, e);
34587491720SChunyang Hui         step60_79(76, e, a, b, c, d);
34687491720SChunyang Hui         step60_79(77, d, e, a, b, c);
34787491720SChunyang Hui         step60_79(78, c, d, e, a, b);
34887491720SChunyang Hui         step60_79(79, b, c, d, e, a);
34987491720SChunyang Hui 
35087491720SChunyang Hui         digest[0] += a;
35187491720SChunyang Hui         digest[1] += b;
35287491720SChunyang Hui         digest[2] += c;
35387491720SChunyang Hui         digest[3] += d;
35487491720SChunyang Hui         digest[4] += e;
35587491720SChunyang Hui }
35687491720SChunyang Hui 
357868f05eaSMarcel Cornu static inline void
hash_init_digest(ISAL_SHA1_WORD_T * digest)3580106da91SPablo de Lara hash_init_digest(ISAL_SHA1_WORD_T *digest)
35987491720SChunyang Hui {
3600106da91SPablo de Lara         static const ISAL_SHA1_WORD_T hash_initial_digest[ISAL_SHA1_DIGEST_NWORDS] = {
3610106da91SPablo de Lara                 ISAL_SHA1_INITIAL_DIGEST
3620106da91SPablo de Lara         };
36387491720SChunyang Hui         memcpy_fixedlen(digest, hash_initial_digest, sizeof(hash_initial_digest));
36487491720SChunyang Hui }
36587491720SChunyang Hui 
36687491720SChunyang Hui struct slver {
36787491720SChunyang Hui         uint16_t snum;
36887491720SChunyang Hui         uint8_t ver;
36987491720SChunyang Hui         uint8_t core;
37087491720SChunyang Hui };
37187491720SChunyang Hui 
3723113c339SPablo de Lara struct slver _sha1_ctx_mgr_init_base_slver_00000192;
3733113c339SPablo de Lara struct slver _sha1_ctx_mgr_init_base_slver = { 0x0192, 0x00, 0x00 };
37487491720SChunyang Hui 
3753113c339SPablo de Lara struct slver _sha1_ctx_mgr_submit_base_slver_00000193;
3763113c339SPablo de Lara struct slver _sha1_ctx_mgr_submit_base_slver = { 0x0193, 0x00, 0x00 };
37787491720SChunyang Hui 
3783113c339SPablo de Lara struct slver _sha1_ctx_mgr_flush_base_slver_00000194;
3793113c339SPablo de Lara struct slver _sha1_ctx_mgr_flush_base_slver = { 0x0194, 0x00, 0x00 };
380