blob: 02a135ca926569bcf7eb6f5b700056046f2e7f64 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-384/512 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-512 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_SHA512_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000028
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/sha512.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
Manuel Pégourié-Gonnard1dd16742015-03-05 16:13:04 +000033#if defined(_MSC_VER) || defined(__WATCOMC__)
34 #define UL64(x) x##ui64
35#else
36 #define UL64(x) x##ULL
37#endif
38
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <string.h>
40
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_SELF_TEST)
42#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000043#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010044#else
Rich Evans00ab4702015-02-06 13:43:58 +000045#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050046#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050048#define mbedtls_calloc calloc
49#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#endif /* MBEDTLS_PLATFORM_C */
51#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010052
Hanno Beckerc7560492018-12-20 10:23:39 +000053#define SHA512_VALIDATE_RET(cond) \
54 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA )
55#define SHA512_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
56
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020057#if !defined(MBEDTLS_SHA512_ALT)
58
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +020059#if defined(MBEDTLS_SHA512_SMALLER)
60static void sha512_put_uint64_be( uint64_t n, unsigned char *b, uint8_t i )
61{
Joe Subbiani1bd5d7d2021-07-16 12:29:49 +010062 MBEDTLS_PUT_UINT64_BE(n, b, i);
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +020063}
64#else
Joe Subbiani1bd5d7d2021-07-16 12:29:49 +010065#define sha512_put_uint64_be MBEDTLS_PUT_UINT64_BE
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +020066#endif /* MBEDTLS_SHA512_SMALLER */
67
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068void mbedtls_sha512_init( mbedtls_sha512_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020069{
Hanno Becker38e15d42018-12-18 17:54:00 +000070 SHA512_VALIDATE( ctx != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +000071
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020072 memset( ctx, 0, sizeof( mbedtls_sha512_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020073}
74
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020075void mbedtls_sha512_free( mbedtls_sha512_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020076{
77 if( ctx == NULL )
78 return;
79
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050080 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha512_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020081}
82
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020083void mbedtls_sha512_clone( mbedtls_sha512_context *dst,
84 const mbedtls_sha512_context *src )
85{
Hanno Becker38e15d42018-12-18 17:54:00 +000086 SHA512_VALIDATE( dst != NULL );
87 SHA512_VALIDATE( src != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +000088
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020089 *dst = *src;
90}
91
Paul Bakker5121ce52009-01-03 21:22:43 +000092/*
93 * SHA-512 context setup
94 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +010095int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +000096{
Hanno Becker38e15d42018-12-18 17:54:00 +000097 SHA512_VALIDATE_RET( ctx != NULL );
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +010098#if !defined(MBEDTLS_SHA512_NO_SHA384)
Hanno Becker38e15d42018-12-18 17:54:00 +000099 SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 );
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100100#else
101 SHA512_VALIDATE_RET( is384 == 0 );
102#endif
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000103
Paul Bakker5121ce52009-01-03 21:22:43 +0000104 ctx->total[0] = 0;
105 ctx->total[1] = 0;
106
107 if( is384 == 0 )
108 {
109 /* SHA-512 */
110 ctx->state[0] = UL64(0x6A09E667F3BCC908);
111 ctx->state[1] = UL64(0xBB67AE8584CAA73B);
112 ctx->state[2] = UL64(0x3C6EF372FE94F82B);
113 ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
114 ctx->state[4] = UL64(0x510E527FADE682D1);
115 ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
116 ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
117 ctx->state[7] = UL64(0x5BE0CD19137E2179);
118 }
119 else
120 {
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200121#if defined(MBEDTLS_SHA512_NO_SHA384)
122 return( MBEDTLS_ERR_SHA512_BAD_INPUT_DATA );
123#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000124 /* SHA-384 */
125 ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
126 ctx->state[1] = UL64(0x629A292A367CD507);
127 ctx->state[2] = UL64(0x9159015A3070DD17);
128 ctx->state[3] = UL64(0x152FECD8F70E5939);
129 ctx->state[4] = UL64(0x67332667FFC00B31);
130 ctx->state[5] = UL64(0x8EB44A8768581511);
131 ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
132 ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200133#endif /* MBEDTLS_SHA512_NO_SHA384 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000134 }
135
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200136#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000137 ctx->is384 = is384;
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200138#endif
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100139
140 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000141}
142
Manuel Pégourié-Gonnard93c08472021-04-15 12:23:55 +0200143#if !defined(MBEDTLS_DEPRECATED_REMOVED)
144void mbedtls_sha512_starts( mbedtls_sha512_context *ctx,
145 int is384 )
146{
147 mbedtls_sha512_starts_ret( ctx, is384 );
148}
149#endif
150
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151#if !defined(MBEDTLS_SHA512_PROCESS_ALT)
Alexey Skalozub00b78a92016-01-13 17:39:58 +0200152
153/*
154 * Round constants
155 */
156static const uint64_t K[80] =
157{
158 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
159 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
160 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
161 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
162 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
163 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
164 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
165 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
166 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
167 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
168 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
169 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
170 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
171 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
172 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
173 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
174 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
175 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
176 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
177 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
178 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
179 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
180 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
181 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
182 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
183 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
184 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
185 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
186 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
187 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
188 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
189 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
190 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
191 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
192 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
193 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
194 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
195 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
196 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
197 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
198};
199
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100200int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,
201 const unsigned char data[128] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000202{
203 int i;
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200204 struct
205 {
206 uint64_t temp1, temp2, W[80];
207 uint64_t A[8];
208 } local;
Paul Bakker5121ce52009-01-03 21:22:43 +0000209
Hanno Becker38e15d42018-12-18 17:54:00 +0000210 SHA512_VALIDATE_RET( ctx != NULL );
211 SHA512_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000212
Hanno Becker1eeca412018-10-15 12:01:35 +0100213#define SHR(x,n) ((x) >> (n))
Hanno Becker26d02e12018-10-30 09:29:25 +0000214#define ROTR(x,n) (SHR((x),(n)) | ((x) << (64 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000215
216#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
217#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
218
219#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
220#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
221
Hanno Becker1eeca412018-10-15 12:01:35 +0100222#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
223#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000224
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200225#define P(a,b,c,d,e,f,g,h,x,K) \
226 do \
227 { \
228 local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
229 local.temp2 = S2(a) + F0((a),(b),(c)); \
230 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
Hanno Becker1eeca412018-10-15 12:01:35 +0100231 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000232
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200233 for( i = 0; i < 8; i++ )
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200234 local.A[i] = ctx->state[i];
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200235
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200236#if defined(MBEDTLS_SHA512_SMALLER)
237 for( i = 0; i < 80; i++ )
238 {
239 if( i < 16 )
240 {
Joe Subbiani1bd5d7d2021-07-16 12:29:49 +0100241 local.W[i] = MBEDTLS_GET_UINT64_BE( data, i << 3 );
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200242 }
243 else
244 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200245 local.W[i] = S1(local.W[i - 2]) + local.W[i - 7] +
246 S0(local.W[i - 15]) + local.W[i - 16];
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200247 }
248
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200249 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
250 local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200251
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200252 local.temp1 = local.A[7]; local.A[7] = local.A[6];
253 local.A[6] = local.A[5]; local.A[5] = local.A[4];
254 local.A[4] = local.A[3]; local.A[3] = local.A[2];
255 local.A[2] = local.A[1]; local.A[1] = local.A[0];
256 local.A[0] = local.temp1;
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200257 }
258#else /* MBEDTLS_SHA512_SMALLER */
Paul Bakker5121ce52009-01-03 21:22:43 +0000259 for( i = 0; i < 16; i++ )
260 {
Joe Subbiani1bd5d7d2021-07-16 12:29:49 +0100261 local.W[i] = MBEDTLS_GET_UINT64_BE( data, i << 3 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000262 }
263
264 for( ; i < 80; i++ )
265 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200266 local.W[i] = S1(local.W[i - 2]) + local.W[i - 7] +
267 S0(local.W[i - 15]) + local.W[i - 16];
Paul Bakker5121ce52009-01-03 21:22:43 +0000268 }
269
Paul Bakker5121ce52009-01-03 21:22:43 +0000270 i = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000271 do
272 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200273 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
274 local.A[5], local.A[6], local.A[7], local.W[i], K[i] ); i++;
275 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
276 local.A[4], local.A[5], local.A[6], local.W[i], K[i] ); i++;
277 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
278 local.A[3], local.A[4], local.A[5], local.W[i], K[i] ); i++;
279 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
280 local.A[2], local.A[3], local.A[4], local.W[i], K[i] ); i++;
281 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
282 local.A[1], local.A[2], local.A[3], local.W[i], K[i] ); i++;
283 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
284 local.A[0], local.A[1], local.A[2], local.W[i], K[i] ); i++;
285 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
286 local.A[7], local.A[0], local.A[1], local.W[i], K[i] ); i++;
287 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
288 local.A[6], local.A[7], local.A[0], local.W[i], K[i] ); i++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000289 }
290 while( i < 80 );
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200291#endif /* MBEDTLS_SHA512_SMALLER */
Paul Bakker5121ce52009-01-03 21:22:43 +0000292
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200293 for( i = 0; i < 8; i++ )
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200294 ctx->state[i] += local.A[i];
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100295
gabor-mezei-arm76749ae2020-07-30 16:41:25 +0200296 /* Zeroise buffers and variables to clear sensitive data from memory. */
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200297 mbedtls_platform_zeroize( &local, sizeof( local ) );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100298
299 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000300}
Jaeden Amero041039f2018-02-19 15:28:08 +0000301
Manuel Pégourié-Gonnard93c08472021-04-15 12:23:55 +0200302#if !defined(MBEDTLS_DEPRECATED_REMOVED)
303void mbedtls_sha512_process( mbedtls_sha512_context *ctx,
304 const unsigned char data[128] )
305{
306 mbedtls_internal_sha512_process( ctx, data );
307}
308#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309#endif /* !MBEDTLS_SHA512_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000310
311/*
312 * SHA-512 process buffer
313 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100314int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100315 const unsigned char *input,
316 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000317{
Janos Follath24eed8d2019-11-22 13:21:35 +0000318 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000319 size_t fill;
Paul Bakkerb8213a12011-07-11 08:16:18 +0000320 unsigned int left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000321
Hanno Becker38e15d42018-12-18 17:54:00 +0000322 SHA512_VALIDATE_RET( ctx != NULL );
323 SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Beckerca6f4582018-12-18 15:37:22 +0000324
Brian White12895d12014-04-11 11:29:42 -0400325 if( ilen == 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100326 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000327
Paul Bakkerb8213a12011-07-11 08:16:18 +0000328 left = (unsigned int) (ctx->total[0] & 0x7F);
Paul Bakker27fdf462011-06-09 13:55:13 +0000329 fill = 128 - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000330
Paul Bakker5c2364c2012-10-01 14:41:15 +0000331 ctx->total[0] += (uint64_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000332
Paul Bakker5c2364c2012-10-01 14:41:15 +0000333 if( ctx->total[0] < (uint64_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000334 ctx->total[1]++;
335
336 if( left && ilen >= fill )
337 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200338 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100339
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100340 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100341 return( ret );
342
Paul Bakker5121ce52009-01-03 21:22:43 +0000343 input += fill;
344 ilen -= fill;
345 left = 0;
346 }
347
348 while( ilen >= 128 )
349 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100350 if( ( ret = mbedtls_internal_sha512_process( ctx, input ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100351 return( ret );
352
Paul Bakker5121ce52009-01-03 21:22:43 +0000353 input += 128;
354 ilen -= 128;
355 }
356
357 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200358 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100359
360 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000361}
362
Manuel Pégourié-Gonnard93c08472021-04-15 12:23:55 +0200363#if !defined(MBEDTLS_DEPRECATED_REMOVED)
364void mbedtls_sha512_update( mbedtls_sha512_context *ctx,
365 const unsigned char *input,
366 size_t ilen )
367{
368 mbedtls_sha512_update_ret( ctx, input, ilen );
369}
370#endif
371
Paul Bakker5121ce52009-01-03 21:22:43 +0000372/*
373 * SHA-512 final digest
374 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100375int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100376 unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000377{
Janos Follath24eed8d2019-11-22 13:21:35 +0000378 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200379 unsigned used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000380 uint64_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000381
Hanno Becker38e15d42018-12-18 17:54:00 +0000382 SHA512_VALIDATE_RET( ctx != NULL );
383 SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000384
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200385 /*
386 * Add padding: 0x80 then 0x00 until 16 bytes remain for the length
387 */
388 used = ctx->total[0] & 0x7F;
389
390 ctx->buffer[used++] = 0x80;
391
392 if( used <= 112 )
393 {
394 /* Enough room for padding + length in current block */
395 memset( ctx->buffer + used, 0, 112 - used );
396 }
397 else
398 {
399 /* We'll need an extra block */
400 memset( ctx->buffer + used, 0, 128 - used );
401
402 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
403 return( ret );
404
405 memset( ctx->buffer, 0, 112 );
406 }
407
408 /*
409 * Add message length
410 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000411 high = ( ctx->total[0] >> 61 )
412 | ( ctx->total[1] << 3 );
413 low = ( ctx->total[0] << 3 );
414
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200415 sha512_put_uint64_be( high, ctx->buffer, 112 );
416 sha512_put_uint64_be( low, ctx->buffer, 120 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200418 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
419 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200421 /*
422 * Output final state
423 */
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200424 sha512_put_uint64_be( ctx->state[0], output, 0 );
425 sha512_put_uint64_be( ctx->state[1], output, 8 );
426 sha512_put_uint64_be( ctx->state[2], output, 16 );
427 sha512_put_uint64_be( ctx->state[3], output, 24 );
428 sha512_put_uint64_be( ctx->state[4], output, 32 );
429 sha512_put_uint64_be( ctx->state[5], output, 40 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000430
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200431#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000432 if( ctx->is384 == 0 )
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200433#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000434 {
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200435 sha512_put_uint64_be( ctx->state[6], output, 48 );
436 sha512_put_uint64_be( ctx->state[7], output, 56 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000437 }
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100438
439 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000440}
441
Manuel Pégourié-Gonnard93c08472021-04-15 12:23:55 +0200442#if !defined(MBEDTLS_DEPRECATED_REMOVED)
443void mbedtls_sha512_finish( mbedtls_sha512_context *ctx,
444 unsigned char output[64] )
445{
446 mbedtls_sha512_finish_ret( ctx, output );
447}
448#endif
449
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450#endif /* !MBEDTLS_SHA512_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200451
Paul Bakker5121ce52009-01-03 21:22:43 +0000452/*
453 * output = SHA-512( input buffer )
454 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100455int mbedtls_sha512_ret( const unsigned char *input,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100456 size_t ilen,
457 unsigned char output[64],
458 int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000459{
Janos Follath24eed8d2019-11-22 13:21:35 +0000460 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 mbedtls_sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000462
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100463#if !defined(MBEDTLS_SHA512_NO_SHA384)
Hanno Becker38e15d42018-12-18 17:54:00 +0000464 SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 );
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100465#else
466 SHA512_VALIDATE_RET( is384 == 0 );
467#endif
Hanno Becker38e15d42018-12-18 17:54:00 +0000468 SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
469 SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000470
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200471 mbedtls_sha512_init( &ctx );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100472
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100473 if( ( ret = mbedtls_sha512_starts_ret( &ctx, is384 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100474 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100475
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100476 if( ( ret = mbedtls_sha512_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100477 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100478
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100479 if( ( ret = mbedtls_sha512_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100480 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100481
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100482exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483 mbedtls_sha512_free( &ctx );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100484
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100485 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000486}
487
Manuel Pégourié-Gonnard93c08472021-04-15 12:23:55 +0200488#if !defined(MBEDTLS_DEPRECATED_REMOVED)
489void mbedtls_sha512( const unsigned char *input,
490 size_t ilen,
491 unsigned char output[64],
492 int is384 )
493{
494 mbedtls_sha512_ret( input, ilen, output, is384 );
495}
496#endif
497
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000499
500/*
501 * FIPS-180-2 test vectors
502 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000503static const unsigned char sha512_test_buf[3][113] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000504{
505 { "abc" },
Guido Vranken962e4ee2020-08-21 21:08:56 +0200506 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
Paul Bakker5121ce52009-01-03 21:22:43 +0000507 { "" }
508};
509
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100510static const size_t sha512_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000511{
512 3, 112, 1000
513};
514
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200515static const unsigned char sha512_test_sum[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000516{
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200517#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000518 /*
519 * SHA-384 test vectors
520 */
521 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
522 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
523 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
524 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
525 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
526 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
527 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
528 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
529 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
530 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
531 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
532 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
533 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
534 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
535 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
536 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
537 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
538 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200539#endif /* !MBEDTLS_SHA512_NO_SHA384 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000540
541 /*
542 * SHA-512 test vectors
543 */
544 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
545 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
546 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
547 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
548 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
549 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
550 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
551 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
552 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
553 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
554 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
555 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
556 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
557 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
558 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
559 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
560 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
561 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
562 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
563 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
564 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
565 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
566 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
567 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
568};
569
Manuel Pégourié-Gonnard74ca84a2020-01-29 09:46:49 +0100570#define ARRAY_LENGTH( a ) ( sizeof( a ) / sizeof( ( a )[0] ) )
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200571
Paul Bakker5121ce52009-01-03 21:22:43 +0000572/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000573 * Checkup routine
574 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200575int mbedtls_sha512_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000576{
Paul Bakker5b4af392014-06-26 12:09:34 +0200577 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500578 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200579 unsigned char sha512sum[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 mbedtls_sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000581
Russ Butlerbb83b422016-10-12 17:36:50 -0500582 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
583 if( NULL == buf )
584 {
585 if( verbose != 0 )
586 mbedtls_printf( "Buffer allocation failed\n" );
587
588 return( 1 );
589 }
590
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591 mbedtls_sha512_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200592
Manuel Pégourié-Gonnard2b9b7802020-01-24 11:01:02 +0100593 for( i = 0; i < (int) ARRAY_LENGTH(sha512_test_sum); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000594 {
595 j = i % 3;
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200596#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000597 k = i < 3;
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200598#else
599 k = 0;
600#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000601
602 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 mbedtls_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000604
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100605 if( ( ret = mbedtls_sha512_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100606 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000607
608 if( j == 2 )
609 {
610 memset( buf, 'a', buflen = 1000 );
611
612 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100613 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100614 ret = mbedtls_sha512_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100615 if( ret != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100616 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100617 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000618 }
619 else
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100620 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100621 ret = mbedtls_sha512_update_ret( &ctx, sha512_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100622 sha512_test_buflen[j] );
623 if( ret != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100624 goto fail;
625 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000626
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100627 if( ( ret = mbedtls_sha512_finish_ret( &ctx, sha512sum ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100628 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000629
Paul Bakker9e36f042013-06-30 14:34:05 +0200630 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100631 {
632 ret = 1;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100633 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100634 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000635
636 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200637 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000638 }
639
640 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200641 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000642
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100643 goto exit;
644
645fail:
646 if( verbose != 0 )
647 mbedtls_printf( "failed\n" );
648
Paul Bakker5b4af392014-06-26 12:09:34 +0200649exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 mbedtls_sha512_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500651 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200652
653 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000654}
655
Manuel Pégourié-Gonnard2b9b7802020-01-24 11:01:02 +0100656#undef ARRAY_LENGTH
Manuel Pégourié-Gonnard2d885492020-01-07 10:17:35 +0100657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000659
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660#endif /* MBEDTLS_SHA512_C */