blob: b4c4b3624feaee60d8af80fea115db919811d099 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
21 *
22 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
23 */
24
Gilles Peskinedb09ef62020-06-03 01:43:33 +020025#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000026
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000028
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/sha256.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050030#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000031#include "mbedtls/error.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Rich Evans00ab4702015-02-06 13:43:58 +000033#include <string.h>
34
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020035#if defined(MBEDTLS_SELF_TEST)
36#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010038#else
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050040#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050042#define mbedtls_calloc calloc
43#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#endif /* MBEDTLS_PLATFORM_C */
45#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010046
Hanno Becker2f6de422018-12-20 10:22:32 +000047#define SHA256_VALIDATE_RET(cond) \
48 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
49#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
50
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020051#if !defined(MBEDTLS_SHA256_ALT)
52
Paul Bakker5121ce52009-01-03 21:22:43 +000053/*
54 * 32-bit integer manipulation macros (big endian)
55 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000056#ifndef GET_UINT32_BE
57#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020058do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000059 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
60 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
61 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
62 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020063} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000064#endif
65
Paul Bakker5c2364c2012-10-01 14:41:15 +000066#ifndef PUT_UINT32_BE
67#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020068do { \
Paul Bakker5121ce52009-01-03 21:22:43 +000069 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
70 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
71 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
72 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020073} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000074#endif
75
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020077{
Hanno Becker8d215e72018-12-18 17:53:21 +000078 SHA256_VALIDATE( ctx != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000079
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020080 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020081}
82
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020084{
85 if( ctx == NULL )
86 return;
87
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050088 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020089}
90
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020091void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
92 const mbedtls_sha256_context *src )
93{
Hanno Becker8d215e72018-12-18 17:53:21 +000094 SHA256_VALIDATE( dst != NULL );
95 SHA256_VALIDATE( src != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000096
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020097 *dst = *src;
98}
99
Paul Bakker5121ce52009-01-03 21:22:43 +0000100/*
101 * SHA-256 context setup
102 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100103int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000104{
Hanno Becker8d215e72018-12-18 17:53:21 +0000105 SHA256_VALIDATE_RET( ctx != NULL );
106 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000107
Paul Bakker5121ce52009-01-03 21:22:43 +0000108 ctx->total[0] = 0;
109 ctx->total[1] = 0;
110
111 if( is224 == 0 )
112 {
113 /* SHA-256 */
114 ctx->state[0] = 0x6A09E667;
115 ctx->state[1] = 0xBB67AE85;
116 ctx->state[2] = 0x3C6EF372;
117 ctx->state[3] = 0xA54FF53A;
118 ctx->state[4] = 0x510E527F;
119 ctx->state[5] = 0x9B05688C;
120 ctx->state[6] = 0x1F83D9AB;
121 ctx->state[7] = 0x5BE0CD19;
122 }
123 else
124 {
125 /* SHA-224 */
126 ctx->state[0] = 0xC1059ED8;
127 ctx->state[1] = 0x367CD507;
128 ctx->state[2] = 0x3070DD17;
129 ctx->state[3] = 0xF70E5939;
130 ctx->state[4] = 0xFFC00B31;
131 ctx->state[5] = 0x68581511;
132 ctx->state[6] = 0x64F98FA7;
133 ctx->state[7] = 0xBEFA4FA4;
134 }
135
136 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100137
138 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000139}
140
Jaeden Amero041039f2018-02-19 15:28:08 +0000141#if !defined(MBEDTLS_DEPRECATED_REMOVED)
142void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
143 int is224 )
144{
145 mbedtls_sha256_starts_ret( ctx, is224 );
146}
147#endif
148
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200150static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000151{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200152 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
153 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
154 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
155 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
156 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
157 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
158 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
159 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
160 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
161 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
162 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
163 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
164 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
165 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
166 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
167 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
168};
Paul Bakker5121ce52009-01-03 21:22:43 +0000169
Hanno Becker1eeca412018-10-15 12:01:35 +0100170#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
171#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000172
173#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
174#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
175
176#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
177#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
178
Hanno Becker1eeca412018-10-15 12:01:35 +0100179#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
180#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000181
182#define R(t) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100183 ( \
184 W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \
185 S0(W[(t) - 15]) + W[(t) - 16] \
186 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000187
Hanno Becker1eeca412018-10-15 12:01:35 +0100188#define P(a,b,c,d,e,f,g,h,x,K) \
189 do \
190 { \
Hanno Becker818bac52018-10-26 09:13:26 +0100191 temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
192 temp2 = S2(a) + F0((a),(b),(c)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100193 (d) += temp1; (h) = temp1 + temp2; \
194 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000195
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100196int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100197 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200198{
199 uint32_t temp1, temp2, W[64];
200 uint32_t A[8];
201 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000202
Hanno Becker8d215e72018-12-18 17:53:21 +0000203 SHA256_VALIDATE_RET( ctx != NULL );
204 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000205
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200206 for( i = 0; i < 8; i++ )
207 A[i] = ctx->state[i];
208
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200209#if defined(MBEDTLS_SHA256_SMALLER)
210 for( i = 0; i < 64; i++ )
211 {
212 if( i < 16 )
213 GET_UINT32_BE( W[i], data, 4 * i );
214 else
215 R( i );
216
217 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
218
219 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
220 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
221 }
222#else /* MBEDTLS_SHA256_SMALLER */
223 for( i = 0; i < 16; i++ )
224 GET_UINT32_BE( W[i], data, 4 * i );
225
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200226 for( i = 0; i < 16; i += 8 )
227 {
228 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
229 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
230 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
231 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
232 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
233 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
234 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
235 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
236 }
237
238 for( i = 16; i < 64; i += 8 )
239 {
240 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
241 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
242 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
243 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
244 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
245 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
246 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
247 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
248 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200249#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200250
251 for( i = 0; i < 8; i++ )
252 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100253
254 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000255}
Jaeden Amero041039f2018-02-19 15:28:08 +0000256
257#if !defined(MBEDTLS_DEPRECATED_REMOVED)
258void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
259 const unsigned char data[64] )
260{
261 mbedtls_internal_sha256_process( ctx, data );
262}
263#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000265
266/*
267 * SHA-256 process buffer
268 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100269int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100270 const unsigned char *input,
271 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000272{
Janos Follath24eed8d2019-11-22 13:21:35 +0000273 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000274 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000275 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000276
Hanno Becker8d215e72018-12-18 17:53:21 +0000277 SHA256_VALIDATE_RET( ctx != NULL );
278 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000279
Brian White12895d12014-04-11 11:29:42 -0400280 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100281 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000282
283 left = ctx->total[0] & 0x3F;
284 fill = 64 - left;
285
Paul Bakker5c2364c2012-10-01 14:41:15 +0000286 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000287 ctx->total[0] &= 0xFFFFFFFF;
288
Paul Bakker5c2364c2012-10-01 14:41:15 +0000289 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000290 ctx->total[1]++;
291
292 if( left && ilen >= fill )
293 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200294 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100295
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100296 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100297 return( ret );
298
Paul Bakker5121ce52009-01-03 21:22:43 +0000299 input += fill;
300 ilen -= fill;
301 left = 0;
302 }
303
304 while( ilen >= 64 )
305 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100306 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100307 return( ret );
308
Paul Bakker5121ce52009-01-03 21:22:43 +0000309 input += 64;
310 ilen -= 64;
311 }
312
313 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200314 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100315
316 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000317}
318
Jaeden Amero041039f2018-02-19 15:28:08 +0000319#if !defined(MBEDTLS_DEPRECATED_REMOVED)
320void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
321 const unsigned char *input,
322 size_t ilen )
323{
324 mbedtls_sha256_update_ret( ctx, input, ilen );
325}
326#endif
327
Paul Bakker5121ce52009-01-03 21:22:43 +0000328/*
329 * SHA-256 final digest
330 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100331int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100332 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000333{
Janos Follath24eed8d2019-11-22 13:21:35 +0000334 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200335 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000336 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000337
Hanno Becker8d215e72018-12-18 17:53:21 +0000338 SHA256_VALIDATE_RET( ctx != NULL );
339 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000340
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200341 /*
342 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
343 */
344 used = ctx->total[0] & 0x3F;
345
346 ctx->buffer[used++] = 0x80;
347
348 if( used <= 56 )
349 {
350 /* Enough room for padding + length in current block */
351 memset( ctx->buffer + used, 0, 56 - used );
352 }
353 else
354 {
355 /* We'll need an extra block */
356 memset( ctx->buffer + used, 0, 64 - used );
357
358 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
359 return( ret );
360
361 memset( ctx->buffer, 0, 56 );
362 }
363
364 /*
365 * Add message length
366 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000367 high = ( ctx->total[0] >> 29 )
368 | ( ctx->total[1] << 3 );
369 low = ( ctx->total[0] << 3 );
370
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200371 PUT_UINT32_BE( high, ctx->buffer, 56 );
372 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000373
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200374 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100375 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100376
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200377 /*
378 * Output final state
379 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000380 PUT_UINT32_BE( ctx->state[0], output, 0 );
381 PUT_UINT32_BE( ctx->state[1], output, 4 );
382 PUT_UINT32_BE( ctx->state[2], output, 8 );
383 PUT_UINT32_BE( ctx->state[3], output, 12 );
384 PUT_UINT32_BE( ctx->state[4], output, 16 );
385 PUT_UINT32_BE( ctx->state[5], output, 20 );
386 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000387
388 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000389 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100390
391 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000392}
393
Jaeden Amero041039f2018-02-19 15:28:08 +0000394#if !defined(MBEDTLS_DEPRECATED_REMOVED)
395void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
396 unsigned char output[32] )
397{
398 mbedtls_sha256_finish_ret( ctx, output );
399}
400#endif
401
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200402#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200403
Paul Bakker5121ce52009-01-03 21:22:43 +0000404/*
405 * output = SHA-256( input buffer )
406 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100407int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100408 size_t ilen,
409 unsigned char output[32],
410 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000411{
Janos Follath24eed8d2019-11-22 13:21:35 +0000412 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000414
Hanno Becker8d215e72018-12-18 17:53:21 +0000415 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
416 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
417 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000418
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100420
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100421 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100422 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100423
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100424 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100425 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100426
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100427 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100428 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100429
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100430exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100432
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100433 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000434}
435
Jaeden Amero041039f2018-02-19 15:28:08 +0000436#if !defined(MBEDTLS_DEPRECATED_REMOVED)
437void mbedtls_sha256( const unsigned char *input,
438 size_t ilen,
439 unsigned char output[32],
440 int is224 )
441{
442 mbedtls_sha256_ret( input, ilen, output, is224 );
443}
444#endif
445
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000447/*
448 * FIPS-180-2 test vectors
449 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000450static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000451{
452 { "abc" },
453 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
454 { "" }
455};
456
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100457static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000458{
459 3, 56, 1000
460};
461
Paul Bakker9e36f042013-06-30 14:34:05 +0200462static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000463{
464 /*
465 * SHA-224 test vectors
466 */
467 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
468 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
469 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
470 0xE3, 0x6C, 0x9D, 0xA7 },
471 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
472 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
473 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
474 0x52, 0x52, 0x25, 0x25 },
475 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
476 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
477 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
478 0x4E, 0xE7, 0xAD, 0x67 },
479
480 /*
481 * SHA-256 test vectors
482 */
483 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
484 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
485 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
486 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
487 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
488 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
489 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
490 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
491 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
492 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
493 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
494 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
495};
496
497/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000498 * Checkup routine
499 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200500int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000501{
Paul Bakker5b4af392014-06-26 12:09:34 +0200502 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500503 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200504 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000506
Russ Butlerbb83b422016-10-12 17:36:50 -0500507 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
508 if( NULL == buf )
509 {
510 if( verbose != 0 )
511 mbedtls_printf( "Buffer allocation failed\n" );
512
513 return( 1 );
514 }
515
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200517
Paul Bakker5121ce52009-01-03 21:22:43 +0000518 for( i = 0; i < 6; i++ )
519 {
520 j = i % 3;
521 k = i < 3;
522
523 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000525
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100526 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100527 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000528
529 if( j == 2 )
530 {
531 memset( buf, 'a', buflen = 1000 );
532
533 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100534 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100535 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100536 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100537 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100538 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100539
Paul Bakker5121ce52009-01-03 21:22:43 +0000540 }
541 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100542 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100543 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100544 sha256_test_buflen[j] );
545 if( ret != 0 )
546 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100547 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000548
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100549 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100550 goto fail;
551
Paul Bakker5121ce52009-01-03 21:22:43 +0000552
Paul Bakker9e36f042013-06-30 14:34:05 +0200553 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100554 {
555 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100556 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100557 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000558
559 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200560 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000561 }
562
563 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200564 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000565
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100566 goto exit;
567
568fail:
569 if( verbose != 0 )
570 mbedtls_printf( "failed\n" );
571
Paul Bakker5b4af392014-06-26 12:09:34 +0200572exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500574 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200575
576 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000577}
578
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581#endif /* MBEDTLS_SHA256_C */