178acc472SPeter Tyser /*
278acc472SPeter Tyser * FIPS-180-2 compliant SHA-256 implementation
378acc472SPeter Tyser *
478acc472SPeter Tyser * Copyright (C) 2001-2003 Christophe Devine
578acc472SPeter Tyser *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
778acc472SPeter Tyser */
878acc472SPeter Tyser
978acc472SPeter Tyser #ifndef USE_HOSTCC
1078acc472SPeter Tyser #include <common.h>
11822ef00eSAndreas Bießmann #include <linux/string.h>
12*257c8a70SJoseph Chen #include <crypto.h>
13822ef00eSAndreas Bießmann #else
14822ef00eSAndreas Bießmann #include <string.h>
1578acc472SPeter Tyser #endif /* USE_HOSTCC */
1678acc472SPeter Tyser #include <watchdog.h>
172b9912e6SJeroen Hofstee #include <u-boot/sha256.h>
1878acc472SPeter Tyser
19c87e576eSLoic Poulain #include <linux/compiler.h>
20c87e576eSLoic Poulain
21c87e576eSLoic Poulain #ifdef USE_HOSTCC
22c87e576eSLoic Poulain #undef __weak
23c87e576eSLoic Poulain #define __weak
24c87e576eSLoic Poulain #endif
25c87e576eSLoic Poulain
26da29f299SAndrew Duda const uint8_t sha256_der_prefix[SHA256_DER_LEN] = {
27da29f299SAndrew Duda 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
28da29f299SAndrew Duda 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
29da29f299SAndrew Duda 0x00, 0x04, 0x20
30da29f299SAndrew Duda };
31da29f299SAndrew Duda
3278acc472SPeter Tyser /*
3378acc472SPeter Tyser * 32-bit integer manipulation macros (big endian)
3478acc472SPeter Tyser */
3578acc472SPeter Tyser #ifndef GET_UINT32_BE
3678acc472SPeter Tyser #define GET_UINT32_BE(n,b,i) { \
3778acc472SPeter Tyser (n) = ( (unsigned long) (b)[(i) ] << 24 ) \
3878acc472SPeter Tyser | ( (unsigned long) (b)[(i) + 1] << 16 ) \
3978acc472SPeter Tyser | ( (unsigned long) (b)[(i) + 2] << 8 ) \
4078acc472SPeter Tyser | ( (unsigned long) (b)[(i) + 3] ); \
4178acc472SPeter Tyser }
4278acc472SPeter Tyser #endif
4378acc472SPeter Tyser #ifndef PUT_UINT32_BE
4478acc472SPeter Tyser #define PUT_UINT32_BE(n,b,i) { \
4578acc472SPeter Tyser (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
4678acc472SPeter Tyser (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
4778acc472SPeter Tyser (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
4878acc472SPeter Tyser (b)[(i) + 3] = (unsigned char) ( (n) ); \
4978acc472SPeter Tyser }
5078acc472SPeter Tyser #endif
5178acc472SPeter Tyser
sha256_starts(sha256_context * ctx)5278acc472SPeter Tyser void sha256_starts(sha256_context * ctx)
5378acc472SPeter Tyser {
54*257c8a70SJoseph Chen #if !defined(USE_HOSTCC)
55*257c8a70SJoseph Chen #if !CONFIG_IS_ENABLED(ARMV8_CE_SHA256) && CONFIG_IS_ENABLED(DM_CRYPTO)
56*257c8a70SJoseph Chen sha_context cctx;
57*257c8a70SJoseph Chen u32 algo = CRYPTO_SHA256;
58*257c8a70SJoseph Chen
59*257c8a70SJoseph Chen ctx->cdev = NULL;
60*257c8a70SJoseph Chen if (ctx->length) {
61*257c8a70SJoseph Chen ctx->cdev = crypto_get_device(algo);
62*257c8a70SJoseph Chen if (ctx->cdev) {
63*257c8a70SJoseph Chen cctx.algo = algo;
64*257c8a70SJoseph Chen cctx.length = ctx->length;
65*257c8a70SJoseph Chen crypto_sha_init(ctx->cdev, &cctx);
66*257c8a70SJoseph Chen return;
67*257c8a70SJoseph Chen }
68*257c8a70SJoseph Chen }
69*257c8a70SJoseph Chen #endif
70*257c8a70SJoseph Chen #endif
7178acc472SPeter Tyser ctx->total[0] = 0;
7278acc472SPeter Tyser ctx->total[1] = 0;
7378acc472SPeter Tyser
7478acc472SPeter Tyser ctx->state[0] = 0x6A09E667;
7578acc472SPeter Tyser ctx->state[1] = 0xBB67AE85;
7678acc472SPeter Tyser ctx->state[2] = 0x3C6EF372;
7778acc472SPeter Tyser ctx->state[3] = 0xA54FF53A;
7878acc472SPeter Tyser ctx->state[4] = 0x510E527F;
7978acc472SPeter Tyser ctx->state[5] = 0x9B05688C;
8078acc472SPeter Tyser ctx->state[6] = 0x1F83D9AB;
8178acc472SPeter Tyser ctx->state[7] = 0x5BE0CD19;
8278acc472SPeter Tyser }
8378acc472SPeter Tyser
sha256_process_one(sha256_context * ctx,const uint8_t data[64])84c87e576eSLoic Poulain static void sha256_process_one(sha256_context *ctx, const uint8_t data[64])
8578acc472SPeter Tyser {
8678acc472SPeter Tyser uint32_t temp1, temp2;
8778acc472SPeter Tyser uint32_t W[64];
8878acc472SPeter Tyser uint32_t A, B, C, D, E, F, G, H;
8978acc472SPeter Tyser
9078acc472SPeter Tyser GET_UINT32_BE(W[0], data, 0);
9178acc472SPeter Tyser GET_UINT32_BE(W[1], data, 4);
9278acc472SPeter Tyser GET_UINT32_BE(W[2], data, 8);
9378acc472SPeter Tyser GET_UINT32_BE(W[3], data, 12);
9478acc472SPeter Tyser GET_UINT32_BE(W[4], data, 16);
9578acc472SPeter Tyser GET_UINT32_BE(W[5], data, 20);
9678acc472SPeter Tyser GET_UINT32_BE(W[6], data, 24);
9778acc472SPeter Tyser GET_UINT32_BE(W[7], data, 28);
9878acc472SPeter Tyser GET_UINT32_BE(W[8], data, 32);
9978acc472SPeter Tyser GET_UINT32_BE(W[9], data, 36);
10078acc472SPeter Tyser GET_UINT32_BE(W[10], data, 40);
10178acc472SPeter Tyser GET_UINT32_BE(W[11], data, 44);
10278acc472SPeter Tyser GET_UINT32_BE(W[12], data, 48);
10378acc472SPeter Tyser GET_UINT32_BE(W[13], data, 52);
10478acc472SPeter Tyser GET_UINT32_BE(W[14], data, 56);
10578acc472SPeter Tyser GET_UINT32_BE(W[15], data, 60);
10678acc472SPeter Tyser
10778acc472SPeter Tyser #define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
10878acc472SPeter Tyser #define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
10978acc472SPeter Tyser
11078acc472SPeter Tyser #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
11178acc472SPeter Tyser #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
11278acc472SPeter Tyser
11378acc472SPeter Tyser #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
11478acc472SPeter Tyser #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
11578acc472SPeter Tyser
11678acc472SPeter Tyser #define F0(x,y,z) ((x & y) | (z & (x | y)))
11778acc472SPeter Tyser #define F1(x,y,z) (z ^ (x & (y ^ z)))
11878acc472SPeter Tyser
11978acc472SPeter Tyser #define R(t) \
12078acc472SPeter Tyser ( \
12178acc472SPeter Tyser W[t] = S1(W[t - 2]) + W[t - 7] + \
12278acc472SPeter Tyser S0(W[t - 15]) + W[t - 16] \
12378acc472SPeter Tyser )
12478acc472SPeter Tyser
12578acc472SPeter Tyser #define P(a,b,c,d,e,f,g,h,x,K) { \
12678acc472SPeter Tyser temp1 = h + S3(e) + F1(e,f,g) + K + x; \
12778acc472SPeter Tyser temp2 = S2(a) + F0(a,b,c); \
12878acc472SPeter Tyser d += temp1; h = temp1 + temp2; \
12978acc472SPeter Tyser }
13078acc472SPeter Tyser
13178acc472SPeter Tyser A = ctx->state[0];
13278acc472SPeter Tyser B = ctx->state[1];
13378acc472SPeter Tyser C = ctx->state[2];
13478acc472SPeter Tyser D = ctx->state[3];
13578acc472SPeter Tyser E = ctx->state[4];
13678acc472SPeter Tyser F = ctx->state[5];
13778acc472SPeter Tyser G = ctx->state[6];
13878acc472SPeter Tyser H = ctx->state[7];
13978acc472SPeter Tyser
14078acc472SPeter Tyser P(A, B, C, D, E, F, G, H, W[0], 0x428A2F98);
14178acc472SPeter Tyser P(H, A, B, C, D, E, F, G, W[1], 0x71374491);
14278acc472SPeter Tyser P(G, H, A, B, C, D, E, F, W[2], 0xB5C0FBCF);
14378acc472SPeter Tyser P(F, G, H, A, B, C, D, E, W[3], 0xE9B5DBA5);
14478acc472SPeter Tyser P(E, F, G, H, A, B, C, D, W[4], 0x3956C25B);
14578acc472SPeter Tyser P(D, E, F, G, H, A, B, C, W[5], 0x59F111F1);
14678acc472SPeter Tyser P(C, D, E, F, G, H, A, B, W[6], 0x923F82A4);
14778acc472SPeter Tyser P(B, C, D, E, F, G, H, A, W[7], 0xAB1C5ED5);
14878acc472SPeter Tyser P(A, B, C, D, E, F, G, H, W[8], 0xD807AA98);
14978acc472SPeter Tyser P(H, A, B, C, D, E, F, G, W[9], 0x12835B01);
15078acc472SPeter Tyser P(G, H, A, B, C, D, E, F, W[10], 0x243185BE);
15178acc472SPeter Tyser P(F, G, H, A, B, C, D, E, W[11], 0x550C7DC3);
15278acc472SPeter Tyser P(E, F, G, H, A, B, C, D, W[12], 0x72BE5D74);
15378acc472SPeter Tyser P(D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE);
15478acc472SPeter Tyser P(C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7);
15578acc472SPeter Tyser P(B, C, D, E, F, G, H, A, W[15], 0xC19BF174);
15678acc472SPeter Tyser P(A, B, C, D, E, F, G, H, R(16), 0xE49B69C1);
15778acc472SPeter Tyser P(H, A, B, C, D, E, F, G, R(17), 0xEFBE4786);
15878acc472SPeter Tyser P(G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6);
15978acc472SPeter Tyser P(F, G, H, A, B, C, D, E, R(19), 0x240CA1CC);
16078acc472SPeter Tyser P(E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F);
16178acc472SPeter Tyser P(D, E, F, G, H, A, B, C, R(21), 0x4A7484AA);
16278acc472SPeter Tyser P(C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC);
16378acc472SPeter Tyser P(B, C, D, E, F, G, H, A, R(23), 0x76F988DA);
16478acc472SPeter Tyser P(A, B, C, D, E, F, G, H, R(24), 0x983E5152);
16578acc472SPeter Tyser P(H, A, B, C, D, E, F, G, R(25), 0xA831C66D);
16678acc472SPeter Tyser P(G, H, A, B, C, D, E, F, R(26), 0xB00327C8);
16778acc472SPeter Tyser P(F, G, H, A, B, C, D, E, R(27), 0xBF597FC7);
16878acc472SPeter Tyser P(E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3);
16978acc472SPeter Tyser P(D, E, F, G, H, A, B, C, R(29), 0xD5A79147);
17078acc472SPeter Tyser P(C, D, E, F, G, H, A, B, R(30), 0x06CA6351);
17178acc472SPeter Tyser P(B, C, D, E, F, G, H, A, R(31), 0x14292967);
17278acc472SPeter Tyser P(A, B, C, D, E, F, G, H, R(32), 0x27B70A85);
17378acc472SPeter Tyser P(H, A, B, C, D, E, F, G, R(33), 0x2E1B2138);
17478acc472SPeter Tyser P(G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC);
17578acc472SPeter Tyser P(F, G, H, A, B, C, D, E, R(35), 0x53380D13);
17678acc472SPeter Tyser P(E, F, G, H, A, B, C, D, R(36), 0x650A7354);
17778acc472SPeter Tyser P(D, E, F, G, H, A, B, C, R(37), 0x766A0ABB);
17878acc472SPeter Tyser P(C, D, E, F, G, H, A, B, R(38), 0x81C2C92E);
17978acc472SPeter Tyser P(B, C, D, E, F, G, H, A, R(39), 0x92722C85);
18078acc472SPeter Tyser P(A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1);
18178acc472SPeter Tyser P(H, A, B, C, D, E, F, G, R(41), 0xA81A664B);
18278acc472SPeter Tyser P(G, H, A, B, C, D, E, F, R(42), 0xC24B8B70);
18378acc472SPeter Tyser P(F, G, H, A, B, C, D, E, R(43), 0xC76C51A3);
18478acc472SPeter Tyser P(E, F, G, H, A, B, C, D, R(44), 0xD192E819);
18578acc472SPeter Tyser P(D, E, F, G, H, A, B, C, R(45), 0xD6990624);
18678acc472SPeter Tyser P(C, D, E, F, G, H, A, B, R(46), 0xF40E3585);
18778acc472SPeter Tyser P(B, C, D, E, F, G, H, A, R(47), 0x106AA070);
18878acc472SPeter Tyser P(A, B, C, D, E, F, G, H, R(48), 0x19A4C116);
18978acc472SPeter Tyser P(H, A, B, C, D, E, F, G, R(49), 0x1E376C08);
19078acc472SPeter Tyser P(G, H, A, B, C, D, E, F, R(50), 0x2748774C);
19178acc472SPeter Tyser P(F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5);
19278acc472SPeter Tyser P(E, F, G, H, A, B, C, D, R(52), 0x391C0CB3);
19378acc472SPeter Tyser P(D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A);
19478acc472SPeter Tyser P(C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F);
19578acc472SPeter Tyser P(B, C, D, E, F, G, H, A, R(55), 0x682E6FF3);
19678acc472SPeter Tyser P(A, B, C, D, E, F, G, H, R(56), 0x748F82EE);
19778acc472SPeter Tyser P(H, A, B, C, D, E, F, G, R(57), 0x78A5636F);
19878acc472SPeter Tyser P(G, H, A, B, C, D, E, F, R(58), 0x84C87814);
19978acc472SPeter Tyser P(F, G, H, A, B, C, D, E, R(59), 0x8CC70208);
20078acc472SPeter Tyser P(E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA);
20178acc472SPeter Tyser P(D, E, F, G, H, A, B, C, R(61), 0xA4506CEB);
20278acc472SPeter Tyser P(C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7);
20378acc472SPeter Tyser P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2);
20478acc472SPeter Tyser
20578acc472SPeter Tyser ctx->state[0] += A;
20678acc472SPeter Tyser ctx->state[1] += B;
20778acc472SPeter Tyser ctx->state[2] += C;
20878acc472SPeter Tyser ctx->state[3] += D;
20978acc472SPeter Tyser ctx->state[4] += E;
21078acc472SPeter Tyser ctx->state[5] += F;
21178acc472SPeter Tyser ctx->state[6] += G;
21278acc472SPeter Tyser ctx->state[7] += H;
21378acc472SPeter Tyser }
21478acc472SPeter Tyser
sha256_process(sha256_context * ctx,const unsigned char * data,unsigned int blocks)215c87e576eSLoic Poulain __weak void sha256_process(sha256_context *ctx, const unsigned char *data,
216c87e576eSLoic Poulain unsigned int blocks)
217c87e576eSLoic Poulain {
218c87e576eSLoic Poulain if (!blocks)
219c87e576eSLoic Poulain return;
220c87e576eSLoic Poulain
221c87e576eSLoic Poulain while (blocks--) {
222c87e576eSLoic Poulain sha256_process_one(ctx, data);
223c87e576eSLoic Poulain data += 64;
224c87e576eSLoic Poulain }
225c87e576eSLoic Poulain }
226c87e576eSLoic Poulain
sha256_update(sha256_context * ctx,const uint8_t * input,uint32_t length)227ec7381fbSSimon Glass void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t length)
22878acc472SPeter Tyser {
22978acc472SPeter Tyser uint32_t left, fill;
23078acc472SPeter Tyser
23178acc472SPeter Tyser if (!length)
23278acc472SPeter Tyser return;
23378acc472SPeter Tyser
234*257c8a70SJoseph Chen #if !defined(USE_HOSTCC)
235*257c8a70SJoseph Chen #if !CONFIG_IS_ENABLED(ARMV8_CE_SHA256) && CONFIG_IS_ENABLED(DM_CRYPTO)
236*257c8a70SJoseph Chen if (ctx->cdev) {
237*257c8a70SJoseph Chen crypto_sha_update(ctx->cdev, (void *)input, length);
238*257c8a70SJoseph Chen return;
239*257c8a70SJoseph Chen }
240*257c8a70SJoseph Chen #endif
241*257c8a70SJoseph Chen #endif
24278acc472SPeter Tyser left = ctx->total[0] & 0x3F;
24378acc472SPeter Tyser fill = 64 - left;
24478acc472SPeter Tyser
24578acc472SPeter Tyser ctx->total[0] += length;
24678acc472SPeter Tyser ctx->total[0] &= 0xFFFFFFFF;
24778acc472SPeter Tyser
24878acc472SPeter Tyser if (ctx->total[0] < length)
24978acc472SPeter Tyser ctx->total[1]++;
25078acc472SPeter Tyser
25178acc472SPeter Tyser if (left && length >= fill) {
25278acc472SPeter Tyser memcpy((void *) (ctx->buffer + left), (void *) input, fill);
253c87e576eSLoic Poulain sha256_process(ctx, ctx->buffer, 1);
25478acc472SPeter Tyser length -= fill;
25578acc472SPeter Tyser input += fill;
25678acc472SPeter Tyser left = 0;
25778acc472SPeter Tyser }
25878acc472SPeter Tyser
259c87e576eSLoic Poulain sha256_process(ctx, input, length / 64);
260c87e576eSLoic Poulain input += length / 64 * 64;
261c87e576eSLoic Poulain length = length % 64;
26278acc472SPeter Tyser
26378acc472SPeter Tyser if (length)
26478acc472SPeter Tyser memcpy((void *) (ctx->buffer + left), (void *) input, length);
26578acc472SPeter Tyser }
26678acc472SPeter Tyser
26778acc472SPeter Tyser static uint8_t sha256_padding[64] = {
26878acc472SPeter Tyser 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26978acc472SPeter Tyser 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27078acc472SPeter Tyser 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27178acc472SPeter Tyser 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
27278acc472SPeter Tyser };
27378acc472SPeter Tyser
sha256_finish(sha256_context * ctx,uint8_t digest[32])27478acc472SPeter Tyser void sha256_finish(sha256_context * ctx, uint8_t digest[32])
27578acc472SPeter Tyser {
27678acc472SPeter Tyser uint32_t last, padn;
27778acc472SPeter Tyser uint32_t high, low;
27878acc472SPeter Tyser uint8_t msglen[8];
27978acc472SPeter Tyser
280*257c8a70SJoseph Chen #if !defined(USE_HOSTCC)
281*257c8a70SJoseph Chen #if !CONFIG_IS_ENABLED(ARMV8_CE_SHA256) && CONFIG_IS_ENABLED(DM_CRYPTO)
282*257c8a70SJoseph Chen sha_context cctx;
283*257c8a70SJoseph Chen
284*257c8a70SJoseph Chen if (ctx->cdev) {
285*257c8a70SJoseph Chen cctx.algo = CRYPTO_SHA256;
286*257c8a70SJoseph Chen cctx.length = ctx->length;
287*257c8a70SJoseph Chen crypto_sha_final(ctx->cdev, &cctx, digest);
288*257c8a70SJoseph Chen return;
289*257c8a70SJoseph Chen }
290*257c8a70SJoseph Chen #endif
291*257c8a70SJoseph Chen #endif
29278acc472SPeter Tyser high = ((ctx->total[0] >> 29)
29378acc472SPeter Tyser | (ctx->total[1] << 3));
29478acc472SPeter Tyser low = (ctx->total[0] << 3);
29578acc472SPeter Tyser
29678acc472SPeter Tyser PUT_UINT32_BE(high, msglen, 0);
29778acc472SPeter Tyser PUT_UINT32_BE(low, msglen, 4);
29878acc472SPeter Tyser
29978acc472SPeter Tyser last = ctx->total[0] & 0x3F;
30078acc472SPeter Tyser padn = (last < 56) ? (56 - last) : (120 - last);
30178acc472SPeter Tyser
30278acc472SPeter Tyser sha256_update(ctx, sha256_padding, padn);
30378acc472SPeter Tyser sha256_update(ctx, msglen, 8);
30478acc472SPeter Tyser
30578acc472SPeter Tyser PUT_UINT32_BE(ctx->state[0], digest, 0);
30678acc472SPeter Tyser PUT_UINT32_BE(ctx->state[1], digest, 4);
30778acc472SPeter Tyser PUT_UINT32_BE(ctx->state[2], digest, 8);
30878acc472SPeter Tyser PUT_UINT32_BE(ctx->state[3], digest, 12);
30978acc472SPeter Tyser PUT_UINT32_BE(ctx->state[4], digest, 16);
31078acc472SPeter Tyser PUT_UINT32_BE(ctx->state[5], digest, 20);
31178acc472SPeter Tyser PUT_UINT32_BE(ctx->state[6], digest, 24);
31278acc472SPeter Tyser PUT_UINT32_BE(ctx->state[7], digest, 28);
31378acc472SPeter Tyser }
314ec7381fbSSimon Glass
315ec7381fbSSimon Glass /*
316fc474da5SJoseph Chen * Output = SHA-256( input buffer ).
317fc474da5SJoseph Chen */
sha256_csum(const unsigned char * input,unsigned int ilen,unsigned char * output)318fc474da5SJoseph Chen void sha256_csum(const unsigned char *input, unsigned int ilen,
319fc474da5SJoseph Chen unsigned char *output)
320fc474da5SJoseph Chen {
321fc474da5SJoseph Chen sha256_context ctx;
322fc474da5SJoseph Chen
323*257c8a70SJoseph Chen #if !defined(USE_HOSTCC)
324*257c8a70SJoseph Chen #if !CONFIG_IS_ENABLED(ARMV8_CE_SHA256) && CONFIG_IS_ENABLED(DM_CRYPTO)
325*257c8a70SJoseph Chen ctx.length = ilen;
326*257c8a70SJoseph Chen #endif
327*257c8a70SJoseph Chen #endif
328fc474da5SJoseph Chen sha256_starts(&ctx);
329fc474da5SJoseph Chen sha256_update(&ctx, input, ilen);
330fc474da5SJoseph Chen sha256_finish(&ctx, output);
331fc474da5SJoseph Chen }
332fc474da5SJoseph Chen
333fc474da5SJoseph Chen /*
334ec7381fbSSimon Glass * Output = SHA-256( input buffer ). Trigger the watchdog every 'chunk_sz'
335ec7381fbSSimon Glass * bytes of input processed.
336ec7381fbSSimon Glass */
sha256_csum_wd(const unsigned char * input,unsigned int ilen,unsigned char * output,unsigned int chunk_sz)337ec7381fbSSimon Glass void sha256_csum_wd(const unsigned char *input, unsigned int ilen,
338ec7381fbSSimon Glass unsigned char *output, unsigned int chunk_sz)
339ec7381fbSSimon Glass {
340ec7381fbSSimon Glass sha256_context ctx;
341ec7381fbSSimon Glass #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
3422842c1c2SHeiko Schocher const unsigned char *end;
3432842c1c2SHeiko Schocher unsigned char *curr;
344ec7381fbSSimon Glass int chunk;
345ec7381fbSSimon Glass #endif
346ec7381fbSSimon Glass
347*257c8a70SJoseph Chen #if !defined(USE_HOSTCC)
348*257c8a70SJoseph Chen #if !CONFIG_IS_ENABLED(ARMV8_CE_SHA256) && CONFIG_IS_ENABLED(DM_CRYPTO)
349*257c8a70SJoseph Chen ctx.length = ilen;
350*257c8a70SJoseph Chen #endif
351*257c8a70SJoseph Chen #endif
352ec7381fbSSimon Glass sha256_starts(&ctx);
353ec7381fbSSimon Glass
354ec7381fbSSimon Glass #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
3552842c1c2SHeiko Schocher curr = (unsigned char *)input;
356ec7381fbSSimon Glass end = input + ilen;
357ec7381fbSSimon Glass while (curr < end) {
358ec7381fbSSimon Glass chunk = end - curr;
359ec7381fbSSimon Glass if (chunk > chunk_sz)
360ec7381fbSSimon Glass chunk = chunk_sz;
361ec7381fbSSimon Glass sha256_update(&ctx, curr, chunk);
362ec7381fbSSimon Glass curr += chunk;
363ec7381fbSSimon Glass WATCHDOG_RESET();
364ec7381fbSSimon Glass }
365ec7381fbSSimon Glass #else
366ec7381fbSSimon Glass sha256_update(&ctx, input, ilen);
367ec7381fbSSimon Glass #endif
368ec7381fbSSimon Glass
369ec7381fbSSimon Glass sha256_finish(&ctx, output);
370ec7381fbSSimon Glass }
371