blob: 08f4dd550d71a3db1ebbb90058f758a6472c5951 [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;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000237 uint64_t temp1, temp2, W[80];
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200238 uint64_t A[8];
Paul Bakker5121ce52009-01-03 21:22:43 +0000239
Hanno Becker38e15d42018-12-18 17:54:00 +0000240 SHA512_VALIDATE_RET( ctx != NULL );
241 SHA512_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000242
Hanno Becker1eeca412018-10-15 12:01:35 +0100243#define SHR(x,n) ((x) >> (n))
Hanno Becker26d02e12018-10-30 09:29:25 +0000244#define ROTR(x,n) (SHR((x),(n)) | ((x) << (64 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000245
246#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
247#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
248
249#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
250#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
251
Hanno Becker1eeca412018-10-15 12:01:35 +0100252#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
253#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000254
Hanno Becker26d02e12018-10-30 09:29:25 +0000255#define P(a,b,c,d,e,f,g,h,x,K) \
256 do \
257 { \
Hanno Becker818bac52018-10-26 09:13:26 +0100258 temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
259 temp2 = S2(a) + F0((a),(b),(c)); \
Hanno Becker26d02e12018-10-30 09:29:25 +0000260 (d) += temp1; (h) = temp1 + temp2; \
Hanno Becker1eeca412018-10-15 12:01:35 +0100261 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000262
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200263 for( i = 0; i < 8; i++ )
264 A[i] = ctx->state[i];
265
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200266#if defined(MBEDTLS_SHA512_SMALLER)
267 for( i = 0; i < 80; i++ )
268 {
269 if( i < 16 )
270 {
271 GET_UINT64_BE( W[i], data, i << 3 );
272 }
273 else
274 {
275 W[i] = S1(W[i - 2]) + W[i - 7] +
276 S0(W[i - 15]) + W[i - 16];
277 }
278
279 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
280
281 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
282 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
283 }
284#else /* MBEDTLS_SHA512_SMALLER */
Paul Bakker5121ce52009-01-03 21:22:43 +0000285 for( i = 0; i < 16; i++ )
286 {
287 GET_UINT64_BE( W[i], data, i << 3 );
288 }
289
290 for( ; i < 80; i++ )
291 {
292 W[i] = S1(W[i - 2]) + W[i - 7] +
293 S0(W[i - 15]) + W[i - 16];
294 }
295
Paul Bakker5121ce52009-01-03 21:22:43 +0000296 i = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000297 do
298 {
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200299 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] ); i++;
300 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i], K[i] ); i++;
301 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i], K[i] ); i++;
302 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i], K[i] ); i++;
303 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i], K[i] ); i++;
304 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i], K[i] ); i++;
305 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i], K[i] ); i++;
306 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i], K[i] ); i++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000307 }
308 while( i < 80 );
Manuel Pégourié-Gonnard49d65ba2019-07-17 13:16:54 +0200309#endif /* MBEDTLS_SHA512_SMALLER */
Paul Bakker5121ce52009-01-03 21:22:43 +0000310
Manuel Pégourié-Gonnard0270ed92019-07-17 13:01:56 +0200311 for( i = 0; i < 8; i++ )
312 ctx->state[i] += A[i];
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100313
gabor-mezei-arm76749ae2020-07-30 16:41:25 +0200314 /* Zeroise buffers and variables to clear sensitive data from memory. */
315 mbedtls_platform_zeroize( &A, sizeof( A ) );
316 mbedtls_platform_zeroize( &W, sizeof( W ) );
317 mbedtls_platform_zeroize( &temp1, sizeof( temp1 ) );
318 mbedtls_platform_zeroize( &temp2, sizeof( temp2 ) );
319
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100320 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000321}
Jaeden Amero041039f2018-02-19 15:28:08 +0000322
323#if !defined(MBEDTLS_DEPRECATED_REMOVED)
324void mbedtls_sha512_process( mbedtls_sha512_context *ctx,
325 const unsigned char data[128] )
326{
327 mbedtls_internal_sha512_process( ctx, data );
328}
329#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330#endif /* !MBEDTLS_SHA512_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000331
332/*
333 * SHA-512 process buffer
334 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100335int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100336 const unsigned char *input,
337 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000338{
Janos Follath24eed8d2019-11-22 13:21:35 +0000339 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000340 size_t fill;
Paul Bakkerb8213a12011-07-11 08:16:18 +0000341 unsigned int left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000342
Hanno Becker38e15d42018-12-18 17:54:00 +0000343 SHA512_VALIDATE_RET( ctx != NULL );
344 SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Beckerca6f4582018-12-18 15:37:22 +0000345
Brian White12895d12014-04-11 11:29:42 -0400346 if( ilen == 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100347 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000348
Paul Bakkerb8213a12011-07-11 08:16:18 +0000349 left = (unsigned int) (ctx->total[0] & 0x7F);
Paul Bakker27fdf462011-06-09 13:55:13 +0000350 fill = 128 - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000351
Paul Bakker5c2364c2012-10-01 14:41:15 +0000352 ctx->total[0] += (uint64_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000353
Paul Bakker5c2364c2012-10-01 14:41:15 +0000354 if( ctx->total[0] < (uint64_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000355 ctx->total[1]++;
356
357 if( left && ilen >= fill )
358 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200359 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100360
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100361 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100362 return( ret );
363
Paul Bakker5121ce52009-01-03 21:22:43 +0000364 input += fill;
365 ilen -= fill;
366 left = 0;
367 }
368
369 while( ilen >= 128 )
370 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100371 if( ( ret = mbedtls_internal_sha512_process( ctx, input ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100372 return( ret );
373
Paul Bakker5121ce52009-01-03 21:22:43 +0000374 input += 128;
375 ilen -= 128;
376 }
377
378 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200379 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100380
381 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000382}
383
Jaeden Amero041039f2018-02-19 15:28:08 +0000384#if !defined(MBEDTLS_DEPRECATED_REMOVED)
385void mbedtls_sha512_update( mbedtls_sha512_context *ctx,
386 const unsigned char *input,
387 size_t ilen )
388{
389 mbedtls_sha512_update_ret( ctx, input, ilen );
390}
391#endif
392
Paul Bakker5121ce52009-01-03 21:22:43 +0000393/*
394 * SHA-512 final digest
395 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100396int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100397 unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000398{
Janos Follath24eed8d2019-11-22 13:21:35 +0000399 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200400 unsigned used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000401 uint64_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000402
Hanno Becker38e15d42018-12-18 17:54:00 +0000403 SHA512_VALIDATE_RET( ctx != NULL );
404 SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000405
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200406 /*
407 * Add padding: 0x80 then 0x00 until 16 bytes remain for the length
408 */
409 used = ctx->total[0] & 0x7F;
410
411 ctx->buffer[used++] = 0x80;
412
413 if( used <= 112 )
414 {
415 /* Enough room for padding + length in current block */
416 memset( ctx->buffer + used, 0, 112 - used );
417 }
418 else
419 {
420 /* We'll need an extra block */
421 memset( ctx->buffer + used, 0, 128 - used );
422
423 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
424 return( ret );
425
426 memset( ctx->buffer, 0, 112 );
427 }
428
429 /*
430 * Add message length
431 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000432 high = ( ctx->total[0] >> 61 )
433 | ( ctx->total[1] << 3 );
434 low = ( ctx->total[0] << 3 );
435
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200436 sha512_put_uint64_be( high, ctx->buffer, 112 );
437 sha512_put_uint64_be( low, ctx->buffer, 120 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000438
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200439 if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
440 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000441
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200442 /*
443 * Output final state
444 */
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200445 sha512_put_uint64_be( ctx->state[0], output, 0 );
446 sha512_put_uint64_be( ctx->state[1], output, 8 );
447 sha512_put_uint64_be( ctx->state[2], output, 16 );
448 sha512_put_uint64_be( ctx->state[3], output, 24 );
449 sha512_put_uint64_be( ctx->state[4], output, 32 );
450 sha512_put_uint64_be( ctx->state[5], output, 40 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000451
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200452#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000453 if( ctx->is384 == 0 )
Manuel Pégourié-Gonnard3df4e602019-07-17 15:16:14 +0200454#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000455 {
Manuel Pégourié-Gonnard7f071952019-07-17 12:46:56 +0200456 sha512_put_uint64_be( ctx->state[6], output, 48 );
457 sha512_put_uint64_be( ctx->state[7], output, 56 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000458 }
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100459
460 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000461}
462
Jaeden Amero041039f2018-02-19 15:28:08 +0000463#if !defined(MBEDTLS_DEPRECATED_REMOVED)
464void mbedtls_sha512_finish( mbedtls_sha512_context *ctx,
465 unsigned char output[64] )
466{
467 mbedtls_sha512_finish_ret( ctx, output );
468}
469#endif
470
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200471#endif /* !MBEDTLS_SHA512_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200472
Paul Bakker5121ce52009-01-03 21:22:43 +0000473/*
474 * output = SHA-512( input buffer )
475 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100476int mbedtls_sha512_ret( const unsigned char *input,
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100477 size_t ilen,
478 unsigned char output[64],
479 int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000480{
Janos Follath24eed8d2019-11-22 13:21:35 +0000481 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482 mbedtls_sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000483
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100484#if !defined(MBEDTLS_SHA512_NO_SHA384)
Hanno Becker38e15d42018-12-18 17:54:00 +0000485 SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 );
Manuel Pégourié-Gonnard0b9db442020-01-07 10:14:54 +0100486#else
487 SHA512_VALIDATE_RET( is384 == 0 );
488#endif
Hanno Becker38e15d42018-12-18 17:54:00 +0000489 SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
490 SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garciaba519b92018-12-09 20:58:36 +0000491
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200492 mbedtls_sha512_init( &ctx );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100493
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100494 if( ( ret = mbedtls_sha512_starts_ret( &ctx, is384 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100495 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100496
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100497 if( ( ret = mbedtls_sha512_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100498 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100499
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100500 if( ( ret = mbedtls_sha512_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100501 goto exit;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100502
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100503exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200504 mbedtls_sha512_free( &ctx );
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100505
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100506 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000507}
508
Jaeden Amero041039f2018-02-19 15:28:08 +0000509#if !defined(MBEDTLS_DEPRECATED_REMOVED)
510void mbedtls_sha512( const unsigned char *input,
511 size_t ilen,
512 unsigned char output[64],
513 int is384 )
514{
515 mbedtls_sha512_ret( input, ilen, output, is384 );
516}
517#endif
518
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000520
521/*
522 * FIPS-180-2 test vectors
523 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000524static const unsigned char sha512_test_buf[3][113] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000525{
526 { "abc" },
527 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
528 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
529 { "" }
530};
531
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100532static const size_t sha512_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000533{
534 3, 112, 1000
535};
536
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200537static const unsigned char sha512_test_sum[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000538{
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200539#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000540 /*
541 * SHA-384 test vectors
542 */
543 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
544 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
545 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
546 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
547 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
548 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
549 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
550 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
551 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
552 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
553 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
554 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
555 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
556 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
557 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
558 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
559 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
560 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200561#endif /* !MBEDTLS_SHA512_NO_SHA384 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000562
563 /*
564 * SHA-512 test vectors
565 */
566 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
567 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
568 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
569 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
570 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
571 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
572 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
573 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
574 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
575 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
576 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
577 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
578 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
579 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
580 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
581 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
582 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
583 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
584 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
585 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
586 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
587 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
588 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
589 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
590};
591
Manuel Pégourié-Gonnard74ca84a2020-01-29 09:46:49 +0100592#define ARRAY_LENGTH( a ) ( sizeof( a ) / sizeof( ( a )[0] ) )
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200593
Paul Bakker5121ce52009-01-03 21:22:43 +0000594/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000595 * Checkup routine
596 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200597int mbedtls_sha512_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000598{
Paul Bakker5b4af392014-06-26 12:09:34 +0200599 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500600 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200601 unsigned char sha512sum[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200602 mbedtls_sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000603
Russ Butlerbb83b422016-10-12 17:36:50 -0500604 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
605 if( NULL == buf )
606 {
607 if( verbose != 0 )
608 mbedtls_printf( "Buffer allocation failed\n" );
609
610 return( 1 );
611 }
612
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200613 mbedtls_sha512_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200614
Manuel Pégourié-Gonnard2b9b7802020-01-24 11:01:02 +0100615 for( i = 0; i < (int) ARRAY_LENGTH(sha512_test_sum); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000616 {
617 j = i % 3;
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200618#if !defined(MBEDTLS_SHA512_NO_SHA384)
Paul Bakker5121ce52009-01-03 21:22:43 +0000619 k = i < 3;
Manuel Pégourié-Gonnard39ea19a2019-07-17 15:36:23 +0200620#else
621 k = 0;
622#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000623
624 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625 mbedtls_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000626
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100627 if( ( ret = mbedtls_sha512_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100628 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000629
630 if( j == 2 )
631 {
632 memset( buf, 'a', buflen = 1000 );
633
634 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100635 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100636 ret = mbedtls_sha512_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100637 if( ret != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100638 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100639 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000640 }
641 else
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100642 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100643 ret = mbedtls_sha512_update_ret( &ctx, sha512_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100644 sha512_test_buflen[j] );
645 if( ret != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100646 goto fail;
647 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000648
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100649 if( ( ret = mbedtls_sha512_finish_ret( &ctx, sha512sum ) ) != 0 )
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100650 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
Paul Bakker9e36f042013-06-30 14:34:05 +0200652 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100653 {
654 ret = 1;
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100655 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100656 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000657
658 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200659 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000660 }
661
662 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200663 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000664
Andres Amaya Garcia614c6892017-05-02 12:07:26 +0100665 goto exit;
666
667fail:
668 if( verbose != 0 )
669 mbedtls_printf( "failed\n" );
670
Paul Bakker5b4af392014-06-26 12:09:34 +0200671exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 mbedtls_sha512_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500673 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200674
675 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000676}
677
Manuel Pégourié-Gonnard2b9b7802020-01-24 11:01:02 +0100678#undef ARRAY_LENGTH
Manuel Pégourié-Gonnard2d885492020-01-07 10:17:35 +0100679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682#endif /* MBEDTLS_SHA512_C */