blob: 9bbf690722acce4abc3a14aef29a9092ab1c0696 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Bence Szépkúti44bfbe32020-08-19 16:54:51 +02004 * Copyright The Mbed TLS Contributors
Bence Szépkúti4e9f7122020-06-05 13:02:18 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020012 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000024 *
Bence Szépkúti4e9f7122020-06-05 13:02:18 +020025 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
Paul Bakker5121ce52009-01-03 21:22:43 +000045 */
46/*
47 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
48 *
49 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
50 */
51
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000053#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020054#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020056#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000057
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020058#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000059
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000060#include "mbedtls/sha256.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000061
Rich Evans00ab4702015-02-06 13:43:58 +000062#include <string.h>
63
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020064#if defined(MBEDTLS_SELF_TEST)
65#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000066#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010067#else
Rich Evans00ab4702015-02-06 13:43:58 +000068#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050069#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020070#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050071#define mbedtls_calloc calloc
72#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073#endif /* MBEDTLS_PLATFORM_C */
74#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010075
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020076#if !defined(MBEDTLS_SHA256_ALT)
77
Paul Bakker34617722014-06-13 17:20:13 +020078/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020080 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
81}
82
Paul Bakker5121ce52009-01-03 21:22:43 +000083/*
84 * 32-bit integer manipulation macros (big endian)
85 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000086#ifndef GET_UINT32_BE
87#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020088do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000089 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
90 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
91 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
92 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020093} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000094#endif
95
Paul Bakker5c2364c2012-10-01 14:41:15 +000096#ifndef PUT_UINT32_BE
97#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020098do { \
Paul Bakker5121ce52009-01-03 21:22:43 +000099 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
100 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
101 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
102 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200103} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000104#endif
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200107{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200109}
110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200112{
113 if( ctx == NULL )
114 return;
115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116 mbedtls_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200117}
118
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200119void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
120 const mbedtls_sha256_context *src )
121{
122 *dst = *src;
123}
124
Paul Bakker5121ce52009-01-03 21:22:43 +0000125/*
126 * SHA-256 context setup
127 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100128int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000129{
130 ctx->total[0] = 0;
131 ctx->total[1] = 0;
132
133 if( is224 == 0 )
134 {
135 /* SHA-256 */
136 ctx->state[0] = 0x6A09E667;
137 ctx->state[1] = 0xBB67AE85;
138 ctx->state[2] = 0x3C6EF372;
139 ctx->state[3] = 0xA54FF53A;
140 ctx->state[4] = 0x510E527F;
141 ctx->state[5] = 0x9B05688C;
142 ctx->state[6] = 0x1F83D9AB;
143 ctx->state[7] = 0x5BE0CD19;
144 }
145 else
146 {
147 /* SHA-224 */
148 ctx->state[0] = 0xC1059ED8;
149 ctx->state[1] = 0x367CD507;
150 ctx->state[2] = 0x3070DD17;
151 ctx->state[3] = 0xF70E5939;
152 ctx->state[4] = 0xFFC00B31;
153 ctx->state[5] = 0x68581511;
154 ctx->state[6] = 0x64F98FA7;
155 ctx->state[7] = 0xBEFA4FA4;
156 }
157
158 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100159
160 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000161}
162
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000163#if !defined(MBEDTLS_DEPRECATED_REMOVED)
164void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
165 int is224 )
166{
167 mbedtls_sha256_starts_ret( ctx, is224 );
168}
169#endif
170
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200171#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200172static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000173{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200174 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
175 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
176 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
177 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
178 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
179 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
180 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
181 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
182 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
183 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
184 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
185 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
186 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
187 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
188 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
189 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
190};
Paul Bakker5121ce52009-01-03 21:22:43 +0000191
192#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
193#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
194
195#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
196#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
197
198#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
199#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
200
201#define F0(x,y,z) ((x & y) | (z & (x | y)))
202#define F1(x,y,z) (z ^ (x & (y ^ z)))
203
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200204#define R(t) \
205( \
206 local.W[t] = S1(local.W[t - 2]) + local.W[t - 7] + \
207 S0(local.W[t - 15]) + local.W[t - 16] \
Paul Bakker5121ce52009-01-03 21:22:43 +0000208)
209
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200210#define P(a,b,c,d,e,f,g,h,x,K) \
211{ \
212 local.temp1 = h + S3(e) + F1(e,f,g) + K + x; \
213 local.temp2 = S2(a) + F0(a,b,c); \
214 d += local.temp1; h = local.temp1 + local.temp2; \
Paul Bakker5121ce52009-01-03 21:22:43 +0000215}
216
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100217int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100218 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200219{
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200220 struct
221 {
222 uint32_t temp1, temp2, W[64];
223 uint32_t A[8];
224 } local;
225
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200226 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000227
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200228 for( i = 0; i < 8; i++ )
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200229 local.A[i] = ctx->state[i];
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200230
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200231#if defined(MBEDTLS_SHA256_SMALLER)
232 for( i = 0; i < 64; i++ )
233 {
234 if( i < 16 )
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200235 GET_UINT32_BE( local.W[i], data, 4 * i );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200236 else
237 R( i );
238
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200239 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
240 local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200241
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200242 local.temp1 = local.A[7]; local.A[7] = local.A[6];
243 local.A[6] = local.A[5]; local.A[5] = local.A[4];
244 local.A[4] = local.A[3]; local.A[3] = local.A[2];
245 local.A[2] = local.A[1]; local.A[1] = local.A[0];
246 local.A[0] = local.temp1;
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200247 }
248#else /* MBEDTLS_SHA256_SMALLER */
249 for( i = 0; i < 16; i++ )
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200250 GET_UINT32_BE( local.W[i], data, 4 * i );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200251
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200252 for( i = 0; i < 16; i += 8 )
253 {
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200254 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
255 local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0] );
256 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
257 local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1] );
258 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
259 local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2] );
260 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
261 local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3] );
262 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
263 local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4] );
264 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
265 local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5] );
266 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
267 local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6] );
268 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
269 local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7] );
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200270 }
271
272 for( i = 16; i < 64; i += 8 )
273 {
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200274 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
275 local.A[5], local.A[6], local.A[7], R(i+0), K[i+0] );
276 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
277 local.A[4], local.A[5], local.A[6], R(i+1), K[i+1] );
278 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
279 local.A[3], local.A[4], local.A[5], R(i+2), K[i+2] );
280 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
281 local.A[2], local.A[3], local.A[4], R(i+3), K[i+3] );
282 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
283 local.A[1], local.A[2], local.A[3], R(i+4), K[i+4] );
284 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
285 local.A[0], local.A[1], local.A[2], R(i+5), K[i+5] );
286 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
287 local.A[7], local.A[0], local.A[1], R(i+6), K[i+6] );
288 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
289 local.A[6], local.A[7], local.A[0], R(i+7), K[i+7] );
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200290 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200291#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200292
293 for( i = 0; i < 8; i++ )
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200294 ctx->state[i] += local.A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100295
gabor-mezei-arm461c5a82020-07-30 16:41:25 +0200296 /* Zeroise buffers and variables to clear sensitive data from memory. */
gabor-mezei-armbfdbd432020-08-25 19:12:01 +0200297 mbedtls_zeroize( &local, sizeof( local ) );
gabor-mezei-arm461c5a82020-07-30 16:41:25 +0200298
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100299 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000300}
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000301
302#if !defined(MBEDTLS_DEPRECATED_REMOVED)
303void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
304 const unsigned char data[64] )
305{
306 mbedtls_internal_sha256_process( ctx, data );
307}
308#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000310
311/*
312 * SHA-256 process buffer
313 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100314int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100315 const unsigned char *input,
316 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000317{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100318 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000319 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000320 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000321
Brian White12895d12014-04-11 11:29:42 -0400322 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100323 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000324
325 left = ctx->total[0] & 0x3F;
326 fill = 64 - left;
327
Paul Bakker5c2364c2012-10-01 14:41:15 +0000328 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000329 ctx->total[0] &= 0xFFFFFFFF;
330
Paul Bakker5c2364c2012-10-01 14:41:15 +0000331 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000332 ctx->total[1]++;
333
334 if( left && ilen >= fill )
335 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200336 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100337
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100338 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100339 return( ret );
340
Paul Bakker5121ce52009-01-03 21:22:43 +0000341 input += fill;
342 ilen -= fill;
343 left = 0;
344 }
345
346 while( ilen >= 64 )
347 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100348 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100349 return( ret );
350
Paul Bakker5121ce52009-01-03 21:22:43 +0000351 input += 64;
352 ilen -= 64;
353 }
354
355 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200356 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100357
358 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000359}
360
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000361#if !defined(MBEDTLS_DEPRECATED_REMOVED)
362void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
363 const unsigned char *input,
364 size_t ilen )
365{
366 mbedtls_sha256_update_ret( ctx, input, ilen );
367}
368#endif
369
Paul Bakker5121ce52009-01-03 21:22:43 +0000370/*
371 * SHA-256 final digest
372 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100373int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100374 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000375{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100376 int ret;
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200377 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000378 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000379
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200380 /*
381 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
382 */
383 used = ctx->total[0] & 0x3F;
384
385 ctx->buffer[used++] = 0x80;
386
387 if( used <= 56 )
388 {
389 /* Enough room for padding + length in current block */
390 memset( ctx->buffer + used, 0, 56 - used );
391 }
392 else
393 {
394 /* We'll need an extra block */
395 memset( ctx->buffer + used, 0, 64 - used );
396
397 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
398 return( ret );
399
400 memset( ctx->buffer, 0, 56 );
401 }
402
403 /*
404 * Add message length
405 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000406 high = ( ctx->total[0] >> 29 )
407 | ( ctx->total[1] << 3 );
408 low = ( ctx->total[0] << 3 );
409
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200410 PUT_UINT32_BE( high, ctx->buffer, 56 );
411 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000412
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200413 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100414 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100415
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200416 /*
417 * Output final state
418 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000419 PUT_UINT32_BE( ctx->state[0], output, 0 );
420 PUT_UINT32_BE( ctx->state[1], output, 4 );
421 PUT_UINT32_BE( ctx->state[2], output, 8 );
422 PUT_UINT32_BE( ctx->state[3], output, 12 );
423 PUT_UINT32_BE( ctx->state[4], output, 16 );
424 PUT_UINT32_BE( ctx->state[5], output, 20 );
425 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000426
427 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000428 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100429
430 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000431}
432
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000433#if !defined(MBEDTLS_DEPRECATED_REMOVED)
434void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
435 unsigned char output[32] )
436{
437 mbedtls_sha256_finish_ret( ctx, output );
438}
439#endif
440
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200442
Paul Bakker5121ce52009-01-03 21:22:43 +0000443/*
444 * output = SHA-256( input buffer )
445 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100446int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100447 size_t ilen,
448 unsigned char output[32],
449 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000450{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100451 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200452 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200454 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100455
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100456 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100457 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100458
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100459 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100460 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100461
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100462 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100463 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100464
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100465exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100467
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100468 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000469}
470
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000471#if !defined(MBEDTLS_DEPRECATED_REMOVED)
472void mbedtls_sha256( const unsigned char *input,
473 size_t ilen,
474 unsigned char output[32],
475 int is224 )
476{
477 mbedtls_sha256_ret( input, ilen, output, is224 );
478}
479#endif
480
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200481#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000482/*
483 * FIPS-180-2 test vectors
484 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000485static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000486{
487 { "abc" },
488 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
489 { "" }
490};
491
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100492static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000493{
494 3, 56, 1000
495};
496
Paul Bakker9e36f042013-06-30 14:34:05 +0200497static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000498{
499 /*
500 * SHA-224 test vectors
501 */
502 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
503 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
504 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
505 0xE3, 0x6C, 0x9D, 0xA7 },
506 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
507 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
508 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
509 0x52, 0x52, 0x25, 0x25 },
510 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
511 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
512 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
513 0x4E, 0xE7, 0xAD, 0x67 },
514
515 /*
516 * SHA-256 test vectors
517 */
518 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
519 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
520 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
521 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
522 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
523 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
524 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
525 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
526 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
527 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
528 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
529 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
530};
531
532/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000533 * Checkup routine
534 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000536{
Paul Bakker5b4af392014-06-26 12:09:34 +0200537 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500538 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200539 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200540 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000541
Russ Butlerbb83b422016-10-12 17:36:50 -0500542 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
543 if( NULL == buf )
544 {
545 if( verbose != 0 )
546 mbedtls_printf( "Buffer allocation failed\n" );
547
548 return( 1 );
549 }
550
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200551 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200552
Paul Bakker5121ce52009-01-03 21:22:43 +0000553 for( i = 0; i < 6; i++ )
554 {
555 j = i % 3;
556 k = i < 3;
557
558 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200559 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000560
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100561 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100562 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000563
564 if( j == 2 )
565 {
566 memset( buf, 'a', buflen = 1000 );
567
568 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100569 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100570 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100571 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100572 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100573 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100574
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 }
576 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100577 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100578 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100579 sha256_test_buflen[j] );
580 if( ret != 0 )
581 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100582 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000583
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100584 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100585 goto fail;
586
Paul Bakker5121ce52009-01-03 21:22:43 +0000587
Paul Bakker9e36f042013-06-30 14:34:05 +0200588 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100589 {
590 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100591 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100592 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000593
594 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200595 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000596 }
597
598 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200599 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000600
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100601 goto exit;
602
603fail:
604 if( verbose != 0 )
605 mbedtls_printf( "failed\n" );
606
Paul Bakker5b4af392014-06-26 12:09:34 +0200607exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200608 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500609 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200610
611 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000612}
613
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200616#endif /* MBEDTLS_SHA256_C */