blob: e08a2e3fab016352afd21ac3dfe5af1ac1b4469d [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-384/512 implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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 Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The SHA-512 Secure Hash Standard was published by NIST in 2002.
23 *
24 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
25 */
26
Gilles Peskinedb09ef62020-06-03 01:43:33 +020027#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000028
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#if defined(MBEDTLS_SHA512_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000030
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000031#include "mbedtls/sha512.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050032#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000033#include "mbedtls/error.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000034
Manuel Pégourié-Gonnard1dd16742015-03-05 16:13:04 +000035#if defined(_MSC_VER) || defined(__WATCOMC__)
36 #define UL64(x) x##ui64
37#else
38 #define UL64(x) x##ULL
39#endif
40
Rich Evans00ab4702015-02-06 13:43:58 +000041#include <string.h>
42
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#if defined(MBEDTLS_SELF_TEST)
44#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010046#else
Rich Evans00ab4702015-02-06 13:43:58 +000047#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050048#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050050#define mbedtls_calloc calloc
51#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#endif /* MBEDTLS_PLATFORM_C */
53#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010054
Hanno Beckerc7560492018-12-20 10:23:39 +000055#define SHA512_VALIDATE_RET(cond) \
56 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA )
57#define SHA512_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
58
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020059#if !defined(MBEDTLS_SHA512_ALT)
60
Paul Bakker5121ce52009-01-03 21:22:43 +000061/*
62 * 64-bit integer manipulation macros (big endian)
63 */
64#ifndef GET_UINT64_BE
65#define GET_UINT64_BE(n,b,i) \
66{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000067 (n) = ( (uint64_t) (b)[(i) ] << 56 ) \
68 | ( (uint64_t) (b)[(i) + 1] << 48 ) \
69 | ( (uint64_t) (b)[(i) + 2] << 40 ) \
70 | ( (uint64_t) (b)[(i) + 3] << 32 ) \
71 | ( (uint64_t) (b)[(i) + 4] << 24 ) \
72 | ( (uint64_t) (b)[(i) + 5] << 16 ) \
73 | ( (uint64_t) (b)[(i) + 6] << 8 ) \
74 | ( (uint64_t) (b)[(i) + 7] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000075}
Paul Bakker9af723c2014-05-01 13:03:14 +020076#endif /* GET_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000077
78#ifndef PUT_UINT64_BE
79#define PUT_UINT64_BE(n,b,i) \
80{ \
81 (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \
82 (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \
83 (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \
84 (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \
85 (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \
86 (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \
87 (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \
88 (b)[(i) + 7] = (unsigned char) ( (n) ); \
89}
Paul Bakker9af723c2014-05-01 13:03:14 +020090#endif /* PUT_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000091
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +020092#if defined(MBEDTLS_SHA512_SMALLER)
93static void sha512_put_uint64_be( uint64_t n, unsigned char *b, uint8_t i )
94{
95 PUT_UINT64_BE(n, b, i);
96}
97#else
98#define sha512_put_uint64_be PUT_UINT64_BE
99#endif /* MBEDTLS_SHA512_SMALLER */
100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101void mbedtls_sha512_init( mbedtls_sha512_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200102{
Hanno Becker38e15d42018-12-18 17:54:00 +0000103 SHA512_VALIDATE( ctx != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000104
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105 memset( ctx, 0, sizeof( mbedtls_sha512_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200106}
107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108void mbedtls_sha512_free( mbedtls_sha512_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200109{
110 if( ctx == NULL )
111 return;
112
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500113 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha512_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200114}
115
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200116void mbedtls_sha512_clone( mbedtls_sha512_context *dst,
117 const mbedtls_sha512_context *src )
118{
Hanno Becker38e15d42018-12-18 17:54:00 +0000119 SHA512_VALIDATE( dst != NULL );
120 SHA512_VALIDATE( src != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000121
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200122 *dst = *src;
123}
124
Paul Bakker5121ce52009-01-03 21:22:43 +0000125/*
126 * SHA-512 context setup
127 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100128int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000129{
Hanno Becker38e15d42018-12-18 17:54:00 +0000130 SHA512_VALIDATE_RET( ctx != NULL );
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100131#if !defined(MBEDTLS_SHA512_NO_SHA384)
Hanno Becker38e15d42018-12-18 17:54:00 +0000132 SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 );
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100133#else
134 SHA512_VALIDATE_RET( is384 == 0 );
135#endif
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000136
Paul Bakker5121ce52009-01-03 21:22:43 +0000137 ctx->total[0] = 0;
138 ctx->total[1] = 0;
139
140 if( is384 == 0 )
141 {
142 /* SHA-512 */
143 ctx->state[0] = UL64(0x6A09E667F3BCC908);
144 ctx->state[1] = UL64(0xBB67AE8584CAA73B);
145 ctx->state[2] = UL64(0x3C6EF372FE94F82B);
146 ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
147 ctx->state[4] = UL64(0x510E527FADE682D1);
148 ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
149 ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
150 ctx->state[7] = UL64(0x5BE0CD19137E2179);
151 }
152 else
153 {
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200154#if defined(MBEDTLS_SHA512_NO_SHA384)
155 return( MBEDTLS_ERR_SHA512_BAD_INPUT_DATA );
156#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000157 /* SHA-384 */
158 ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
159 ctx->state[1] = UL64(0x629A292A367CD507);
160 ctx->state[2] = UL64(0x9159015A3070DD17);
161 ctx->state[3] = UL64(0x152FECD8F70E5939);
162 ctx->state[4] = UL64(0x67332667FFC00B31);
163 ctx->state[5] = UL64(0x8EB44A8768581511);
164 ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
165 ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200166#endif /* MBEDTLS_SHA512_NO_SHA384 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000167 }
168
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200169#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000170 ctx->is384 = is384;
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200171#endif
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100172
173 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000174}
175
Jaeden Amero041039f2018-02-19 15:28:08 +0000176#if !defined(MBEDTLS_DEPRECATED_REMOVED)
177void mbedtls_sha512_starts( mbedtls_sha512_context *ctx,
178 int is384 )
179{
180 mbedtls_sha512_starts_ret( ctx, is384 );
181}
182#endif
183
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200184#if !defined(MBEDTLS_SHA512_PROCESS_ALT)
Alexey Skalozub00b78a92016-01-13 17:39:58 +0200185
186/*
187 * Round constants
188 */
189static const uint64_t K[80] =
190{
191 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
192 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
193 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
194 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
195 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
196 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
197 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
198 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
199 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
200 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
201 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
202 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
203 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
204 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
205 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
206 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
207 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
208 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
209 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
210 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
211 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
212 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
213 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
214 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
215 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
216 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
217 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
218 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
219 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
220 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
221 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
222 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
223 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
224 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
225 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
226 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
227 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
228 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
229 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
230 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
231};
232
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100233int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,
234 const unsigned char data[128] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000235{
236 int i;
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200237 struct
238 {
239 uint64_t temp1, temp2, W[80];
240 uint64_t A[8];
241 } local;
Paul Bakker5121ce52009-01-03 21:22:43 +0000242
Hanno Becker38e15d42018-12-18 17:54:00 +0000243 SHA512_VALIDATE_RET( ctx != NULL );
244 SHA512_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000245
Hanno Becker1eeca412018-10-15 12:01:35 +0100246#define SHR(x,n) ((x) >> (n))
Hanno Becker26d02e12018-10-30 09:29:25 +0000247#define ROTR(x,n) (SHR((x),(n)) | ((x) << (64 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000248
249#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
250#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
251
252#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
253#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
254
Hanno Becker1eeca412018-10-15 12:01:35 +0100255#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
256#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000257
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200258#define P(a,b,c,d,e,f,g,h,x,K) \
259 do \
260 { \
261 local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
262 local.temp2 = S2(a) + F0((a),(b),(c)); \
263 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
Hanno Becker1eeca412018-10-15 12:01:35 +0100264 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000265
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200266 for( i = 0; i < 8; i++ )
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200267 local.A[i] = ctx->state[i];
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200268
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200269#if defined(MBEDTLS_SHA512_SMALLER)
270 for( i = 0; i < 80; i++ )
271 {
272 if( i < 16 )
273 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200274 GET_UINT64_BE( local.W[i], data, i << 3 );
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200275 }
276 else
277 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200278 local.W[i] = S1(local.W[i - 2]) + local.W[i - 7] +
279 S0(local.W[i - 15]) + local.W[i - 16];
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200280 }
281
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200282 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
283 local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200284
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200285 local.temp1 = local.A[7]; local.A[7] = local.A[6];
286 local.A[6] = local.A[5]; local.A[5] = local.A[4];
287 local.A[4] = local.A[3]; local.A[3] = local.A[2];
288 local.A[2] = local.A[1]; local.A[1] = local.A[0];
289 local.A[0] = local.temp1;
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200290 }
291#else /* MBEDTLS_SHA512_SMALLER */
Paul Bakker5121ce52009-01-03 21:22:43 +0000292 for( i = 0; i < 16; i++ )
293 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200294 GET_UINT64_BE( local.W[i], data, i << 3 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000295 }
296
297 for( ; i < 80; i++ )
298 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200299 local.W[i] = S1(local.W[i - 2]) + local.W[i - 7] +
300 S0(local.W[i - 15]) + local.W[i - 16];
Paul Bakker5121ce52009-01-03 21:22:43 +0000301 }
302
Paul Bakker5121ce52009-01-03 21:22:43 +0000303 i = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000304 do
305 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200306 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
307 local.A[5], local.A[6], local.A[7], local.W[i], K[i] ); i++;
308 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
309 local.A[4], local.A[5], local.A[6], local.W[i], K[i] ); i++;
310 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
311 local.A[3], local.A[4], local.A[5], local.W[i], K[i] ); i++;
312 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
313 local.A[2], local.A[3], local.A[4], local.W[i], K[i] ); i++;
314 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
315 local.A[1], local.A[2], local.A[3], local.W[i], K[i] ); i++;
316 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
317 local.A[0], local.A[1], local.A[2], local.W[i], K[i] ); i++;
318 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
319 local.A[7], local.A[0], local.A[1], local.W[i], K[i] ); i++;
320 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
321 local.A[6], local.A[7], local.A[0], local.W[i], K[i] ); i++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000322 }
323 while( i < 80 );
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200324#endif /* MBEDTLS_SHA512_SMALLER */
Paul Bakker5121ce52009-01-03 21:22:43 +0000325
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200326 for( i = 0; i < 8; i++ )
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200327 ctx->state[i] += local.A[i];
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100328
gabor-mezei-arm76749ae2020-07-30 16:41:25 +0200329 /* Zeroise buffers and variables to clear sensitive data from memory. */
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200330 mbedtls_platform_zeroize( &local, sizeof( local ) );
gabor-mezei-arm76749ae2020-07-30 16:41:25 +0200331
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100332 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000333}
Jaeden Amero041039f2018-02-19 15:28:08 +0000334
335#if !defined(MBEDTLS_DEPRECATED_REMOVED)
336void mbedtls_sha512_process( mbedtls_sha512_context *ctx,
337 const unsigned char data[128] )
338{
339 mbedtls_internal_sha512_process( ctx, data );
340}
341#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200342#endif /* !MBEDTLS_SHA512_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000343
344/*
345 * SHA-512 process buffer
346 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100347int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100348 const unsigned char *input,
349 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000350{
Janos Follath24eed8d2019-11-22 13:21:35 +0000351 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000352 size_t fill;
Paul Bakkerb8213a12011-07-11 08:16:18 +0000353 unsigned int left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000354
Hanno Becker38e15d42018-12-18 17:54:00 +0000355 SHA512_VALIDATE_RET( ctx != NULL );
356 SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Beckerca6f4582018-12-18 15:37:22 +0000357
Brian White12895d12014-04-11 11:29:42 -0400358 if( ilen == 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100359 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000360
Paul Bakkerb8213a12011-07-11 08:16:18 +0000361 left = (unsigned int) (ctx->total[0] & 0x7F);
Paul Bakker27fdf462011-06-09 13:55:13 +0000362 fill = 128 - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000363
Paul Bakker5c2364c2012-10-01 14:41:15 +0000364 ctx->total[0] += (uint64_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000365
Paul Bakker5c2364c2012-10-01 14:41:15 +0000366 if( ctx->total[0] < (uint64_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000367 ctx->total[1]++;
368
369 if( left && ilen >= fill )
370 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200371 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100372
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100373 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100374 return( ret );
375
Paul Bakker5121ce52009-01-03 21:22:43 +0000376 input += fill;
377 ilen -= fill;
378 left = 0;
379 }
380
381 while( ilen >= 128 )
382 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100383 if( ( ret = mbedtls_internal_sha512_process( ctx, input ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100384 return( ret );
385
Paul Bakker5121ce52009-01-03 21:22:43 +0000386 input += 128;
387 ilen -= 128;
388 }
389
390 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200391 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100392
393 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000394}
395
Jaeden Amero041039f2018-02-19 15:28:08 +0000396#if !defined(MBEDTLS_DEPRECATED_REMOVED)
397void mbedtls_sha512_update( mbedtls_sha512_context *ctx,
398 const unsigned char *input,
399 size_t ilen )
400{
401 mbedtls_sha512_update_ret( ctx, input, ilen );
402}
403#endif
404
Paul Bakker5121ce52009-01-03 21:22:43 +0000405/*
406 * SHA-512 final digest
407 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100408int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100409 unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000410{
Janos Follath24eed8d2019-11-22 13:21:35 +0000411 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200412 unsigned used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000413 uint64_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000414
Hanno Becker38e15d42018-12-18 17:54:00 +0000415 SHA512_VALIDATE_RET( ctx != NULL );
416 SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000417
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200418 /*
419 * Add padding: 0x80 then 0x00 until 16 bytes remain for the length
420 */
421 used = ctx->total[0] & 0x7F;
422
423 ctx->buffer[used++] = 0x80;
424
425 if( used <= 112 )
426 {
427 /* Enough room for padding + length in current block */
428 memset( ctx->buffer + used, 0, 112 - used );
429 }
430 else
431 {
432 /* We'll need an extra block */
433 memset( ctx->buffer + used, 0, 128 - used );
434
435 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
436 return( ret );
437
438 memset( ctx->buffer, 0, 112 );
439 }
440
441 /*
442 * Add message length
443 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000444 high = ( ctx->total[0] >> 61 )
445 | ( ctx->total[1] << 3 );
446 low = ( ctx->total[0] << 3 );
447
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200448 sha512_put_uint64_be( high, ctx->buffer, 112 );
449 sha512_put_uint64_be( low, ctx->buffer, 120 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000450
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200451 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
452 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000453
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200454 /*
455 * Output final state
456 */
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200457 sha512_put_uint64_be( ctx->state[0], output, 0 );
458 sha512_put_uint64_be( ctx->state[1], output, 8 );
459 sha512_put_uint64_be( ctx->state[2], output, 16 );
460 sha512_put_uint64_be( ctx->state[3], output, 24 );
461 sha512_put_uint64_be( ctx->state[4], output, 32 );
462 sha512_put_uint64_be( ctx->state[5], output, 40 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000463
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200464#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000465 if( ctx->is384 == 0 )
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200466#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000467 {
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200468 sha512_put_uint64_be( ctx->state[6], output, 48 );
469 sha512_put_uint64_be( ctx->state[7], output, 56 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 }
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100471
472 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000473}
474
Jaeden Amero041039f2018-02-19 15:28:08 +0000475#if !defined(MBEDTLS_DEPRECATED_REMOVED)
476void mbedtls_sha512_finish( mbedtls_sha512_context *ctx,
477 unsigned char output[64] )
478{
479 mbedtls_sha512_finish_ret( ctx, output );
480}
481#endif
482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483#endif /* !MBEDTLS_SHA512_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200484
Paul Bakker5121ce52009-01-03 21:22:43 +0000485/*
486 * output = SHA-512( input buffer )
487 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100488int mbedtls_sha512_ret( const unsigned char *input,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100489 size_t ilen,
490 unsigned char output[64],
491 int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000492{
Janos Follath24eed8d2019-11-22 13:21:35 +0000493 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200494 mbedtls_sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000495
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100496#if !defined(MBEDTLS_SHA512_NO_SHA384)
Hanno Becker38e15d42018-12-18 17:54:00 +0000497 SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 );
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100498#else
499 SHA512_VALIDATE_RET( is384 == 0 );
500#endif
Hanno Becker38e15d42018-12-18 17:54:00 +0000501 SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
502 SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000503
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200504 mbedtls_sha512_init( &ctx );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100505
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100506 if( ( ret = mbedtls_sha512_starts_ret( &ctx, is384 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100507 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100508
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100509 if( ( ret = mbedtls_sha512_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100510 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100511
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100512 if( ( ret = mbedtls_sha512_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100513 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100514
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100515exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516 mbedtls_sha512_free( &ctx );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100517
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100518 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000519}
520
Jaeden Amero041039f2018-02-19 15:28:08 +0000521#if !defined(MBEDTLS_DEPRECATED_REMOVED)
522void mbedtls_sha512( const unsigned char *input,
523 size_t ilen,
524 unsigned char output[64],
525 int is384 )
526{
527 mbedtls_sha512_ret( input, ilen, output, is384 );
528}
529#endif
530
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200531#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000532
533/*
534 * FIPS-180-2 test vectors
535 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000536static const unsigned char sha512_test_buf[3][113] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000537{
538 { "abc" },
539 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
540 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
541 { "" }
542};
543
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100544static const size_t sha512_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000545{
546 3, 112, 1000
547};
548
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200549static const unsigned char sha512_test_sum[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000550{
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200551#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000552 /*
553 * SHA-384 test vectors
554 */
555 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
556 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
557 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
558 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
559 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
560 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
561 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
562 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
563 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
564 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
565 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
566 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
567 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
568 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
569 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
570 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
571 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
572 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200573#endif /* !MBEDTLS_SHA512_NO_SHA384 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000574
575 /*
576 * SHA-512 test vectors
577 */
578 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
579 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
580 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
581 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
582 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
583 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
584 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
585 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
586 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
587 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
588 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
589 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
590 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
591 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
592 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
593 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
594 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
595 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
596 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
597 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
598 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
599 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
600 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
601 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
602};
603
Manuel Pégourié-Gonnard74ca84a2020-01-29 09:46:49 +0100604#define ARRAY_LENGTH( a ) ( sizeof( a ) / sizeof( ( a )[0] ) )
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200605
Paul Bakker5121ce52009-01-03 21:22:43 +0000606/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000607 * Checkup routine
608 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200609int mbedtls_sha512_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000610{
Paul Bakker5b4af392014-06-26 12:09:34 +0200611 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500612 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200613 unsigned char sha512sum[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614 mbedtls_sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000615
Russ Butlerbb83b422016-10-12 17:36:50 -0500616 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
617 if( NULL == buf )
618 {
619 if( verbose != 0 )
620 mbedtls_printf( "Buffer allocation failed\n" );
621
622 return( 1 );
623 }
624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625 mbedtls_sha512_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200626
Manuel Pégourié-Gonnard2b9b7802020-01-24 11:01:02 +0100627 for( i = 0; i < (int) ARRAY_LENGTH(sha512_test_sum); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000628 {
629 j = i % 3;
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200630#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000631 k = i < 3;
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200632#else
633 k = 0;
634#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000635
636 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200637 mbedtls_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000638
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100639 if( ( ret = mbedtls_sha512_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100640 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 if( j == 2 )
643 {
644 memset( buf, 'a', buflen = 1000 );
645
646 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100647 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100648 ret = mbedtls_sha512_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100649 if( ret != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100650 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100651 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000652 }
653 else
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100654 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100655 ret = mbedtls_sha512_update_ret( &ctx, sha512_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100656 sha512_test_buflen[j] );
657 if( ret != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100658 goto fail;
659 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000660
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100661 if( ( ret = mbedtls_sha512_finish_ret( &ctx, sha512sum ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100662 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000663
Paul Bakker9e36f042013-06-30 14:34:05 +0200664 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100665 {
666 ret = 1;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100667 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100668 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000669
670 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000672 }
673
674 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000676
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100677 goto exit;
678
679fail:
680 if( verbose != 0 )
681 mbedtls_printf( "failed\n" );
682
Paul Bakker5b4af392014-06-26 12:09:34 +0200683exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200684 mbedtls_sha512_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500685 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200686
687 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000688}
689
Manuel Pégourié-Gonnard2b9b7802020-01-24 11:01:02 +0100690#undef ARRAY_LENGTH
Manuel Pégourié-Gonnard2d885492020-01-07 10:17:35 +0100691
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000693
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694#endif /* MBEDTLS_SHA512_C */