2 * FIPS-180-2 compliant SHA-384/512 implementation
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 * The SHA-512 Secure Hash Standard was published by NIST in 2002.
22 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
27 #if defined(MBEDTLS_SHA512_C)
29 #include "mbedtls/sha512.h"
30 #include "mbedtls/platform_util.h"
31 #include "mbedtls/error.h"
33 #if defined(_MSC_VER) || defined(__WATCOMC__)
34 #define UL64(x) x##ui64
36 #define UL64(x) x##ULL
41 #if defined(MBEDTLS_SELF_TEST)
42 #if defined(MBEDTLS_PLATFORM_C)
43 #include "mbedtls/platform.h"
47 #define mbedtls_printf printf
48 #define mbedtls_calloc calloc
49 #define mbedtls_free free
50 #endif /* MBEDTLS_PLATFORM_C */
51 #endif /* MBEDTLS_SELF_TEST */
53 #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 )
57 #if !defined(MBEDTLS_SHA512_ALT)
60 * 64-bit integer manipulation macros (big endian)
63 #define GET_UINT64_BE(n,b,i) \
65 (n) = ( (uint64_t) (b)[(i) ] << 56 ) \
66 | ( (uint64_t) (b)[(i) + 1] << 48 ) \
67 | ( (uint64_t) (b)[(i) + 2] << 40 ) \
68 | ( (uint64_t) (b)[(i) + 3] << 32 ) \
69 | ( (uint64_t) (b)[(i) + 4] << 24 ) \
70 | ( (uint64_t) (b)[(i) + 5] << 16 ) \
71 | ( (uint64_t) (b)[(i) + 6] << 8 ) \
72 | ( (uint64_t) (b)[(i) + 7] ); \
74 #endif /* GET_UINT64_BE */
77 #define PUT_UINT64_BE(n,b,i) \
79 (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \
80 (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \
81 (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \
82 (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \
83 (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \
84 (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \
85 (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \
86 (b)[(i) + 7] = (unsigned char) ( (n) ); \
88 #endif /* PUT_UINT64_BE */
90 #if defined(MBEDTLS_SHA512_SMALLER)
91 static void sha512_put_uint64_be(uint64_t n
, unsigned char *b
, uint8_t i
) {
92 PUT_UINT64_BE(n
, b
, i
);
95 #define sha512_put_uint64_be PUT_UINT64_BE
96 #endif /* MBEDTLS_SHA512_SMALLER */
98 void mbedtls_sha512_init(mbedtls_sha512_context
*ctx
) {
99 SHA512_VALIDATE(ctx
!= NULL
);
101 memset(ctx
, 0, sizeof(mbedtls_sha512_context
));
104 void mbedtls_sha512_free(mbedtls_sha512_context
*ctx
) {
108 mbedtls_platform_zeroize(ctx
, sizeof(mbedtls_sha512_context
));
111 void mbedtls_sha512_clone(mbedtls_sha512_context
*dst
,
112 const mbedtls_sha512_context
*src
) {
113 SHA512_VALIDATE(dst
!= NULL
);
114 SHA512_VALIDATE(src
!= NULL
);
120 * SHA-512 context setup
122 int mbedtls_sha512_starts_ret(mbedtls_sha512_context
*ctx
, int is384
) {
123 SHA512_VALIDATE_RET(ctx
!= NULL
);
124 #if !defined(MBEDTLS_SHA512_NO_SHA384)
125 SHA512_VALIDATE_RET(is384
== 0 || is384
== 1);
127 SHA512_VALIDATE_RET(is384
== 0);
135 ctx
->state
[0] = UL64(0x6A09E667F3BCC908);
136 ctx
->state
[1] = UL64(0xBB67AE8584CAA73B);
137 ctx
->state
[2] = UL64(0x3C6EF372FE94F82B);
138 ctx
->state
[3] = UL64(0xA54FF53A5F1D36F1);
139 ctx
->state
[4] = UL64(0x510E527FADE682D1);
140 ctx
->state
[5] = UL64(0x9B05688C2B3E6C1F);
141 ctx
->state
[6] = UL64(0x1F83D9ABFB41BD6B);
142 ctx
->state
[7] = UL64(0x5BE0CD19137E2179);
144 #if defined(MBEDTLS_SHA512_NO_SHA384)
145 return (MBEDTLS_ERR_SHA512_BAD_INPUT_DATA
);
148 ctx
->state
[0] = UL64(0xCBBB9D5DC1059ED8);
149 ctx
->state
[1] = UL64(0x629A292A367CD507);
150 ctx
->state
[2] = UL64(0x9159015A3070DD17);
151 ctx
->state
[3] = UL64(0x152FECD8F70E5939);
152 ctx
->state
[4] = UL64(0x67332667FFC00B31);
153 ctx
->state
[5] = UL64(0x8EB44A8768581511);
154 ctx
->state
[6] = UL64(0xDB0C2E0D64F98FA7);
155 ctx
->state
[7] = UL64(0x47B5481DBEFA4FA4);
156 #endif /* MBEDTLS_SHA512_NO_SHA384 */
159 #if !defined(MBEDTLS_SHA512_NO_SHA384)
166 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
167 void mbedtls_sha512_starts(mbedtls_sha512_context
*ctx
,
169 mbedtls_sha512_starts_ret(ctx
, is384
);
173 #if !defined(MBEDTLS_SHA512_PROCESS_ALT)
178 static const uint64_t K
[80] = {
179 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
180 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
181 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
182 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
183 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
184 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
185 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
186 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
187 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
188 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
189 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
190 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
191 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
192 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
193 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
194 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
195 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
196 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
197 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
198 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
199 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
200 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
201 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
202 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
203 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
204 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
205 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
206 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
207 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
208 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
209 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
210 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
211 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
212 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
213 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
214 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
215 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
216 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
217 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
218 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
221 int mbedtls_internal_sha512_process(mbedtls_sha512_context
*ctx
,
222 const unsigned char data
[128]) {
225 uint64_t temp1
, temp2
, W
[80];
229 SHA512_VALIDATE_RET(ctx
!= NULL
);
230 SHA512_VALIDATE_RET((const unsigned char *)data
!= NULL
);
232 #define SHR(x,n) ((x) >> (n))
233 #define ROTR(x,n) (SHR((x),(n)) | ((x) << (64 - (n))))
235 #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
236 #define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
238 #define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
239 #define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
241 #define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
242 #define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
244 #define P(a,b,c,d,e,f,g,h,x,K) \
247 local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
248 local.temp2 = S2(a) + F0((a),(b),(c)); \
249 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
252 for (i
= 0; i
< 8; i
++)
253 local
.A
[i
] = ctx
->state
[i
];
255 #if defined(MBEDTLS_SHA512_SMALLER)
256 for (i
= 0; i
< 80; i
++) {
258 GET_UINT64_BE(local
.W
[i
], data
, i
<< 3);
260 local
.W
[i
] = S1(local
.W
[i
- 2]) + local
.W
[i
- 7] +
261 S0(local
.W
[i
- 15]) + local
.W
[i
- 16];
264 P(local
.A
[0], local
.A
[1], local
.A
[2], local
.A
[3], local
.A
[4],
265 local
.A
[5], local
.A
[6], local
.A
[7], local
.W
[i
], K
[i
]);
267 local
.temp1
= local
.A
[7];
268 local
.A
[7] = local
.A
[6];
269 local
.A
[6] = local
.A
[5];
270 local
.A
[5] = local
.A
[4];
271 local
.A
[4] = local
.A
[3];
272 local
.A
[3] = local
.A
[2];
273 local
.A
[2] = local
.A
[1];
274 local
.A
[1] = local
.A
[0];
275 local
.A
[0] = local
.temp1
;
277 #else /* MBEDTLS_SHA512_SMALLER */
278 for (i
= 0; i
< 16; i
++) {
279 GET_UINT64_BE(local
.W
[i
], data
, i
<< 3);
282 for (; i
< 80; i
++) {
283 local
.W
[i
] = S1(local
.W
[i
- 2]) + local
.W
[i
- 7] +
284 S0(local
.W
[i
- 15]) + local
.W
[i
- 16];
289 P(local
.A
[0], local
.A
[1], local
.A
[2], local
.A
[3], local
.A
[4],
290 local
.A
[5], local
.A
[6], local
.A
[7], local
.W
[i
], K
[i
]);
292 P(local
.A
[7], local
.A
[0], local
.A
[1], local
.A
[2], local
.A
[3],
293 local
.A
[4], local
.A
[5], local
.A
[6], local
.W
[i
], K
[i
]);
295 P(local
.A
[6], local
.A
[7], local
.A
[0], local
.A
[1], local
.A
[2],
296 local
.A
[3], local
.A
[4], local
.A
[5], local
.W
[i
], K
[i
]);
298 P(local
.A
[5], local
.A
[6], local
.A
[7], local
.A
[0], local
.A
[1],
299 local
.A
[2], local
.A
[3], local
.A
[4], local
.W
[i
], K
[i
]);
301 P(local
.A
[4], local
.A
[5], local
.A
[6], local
.A
[7], local
.A
[0],
302 local
.A
[1], local
.A
[2], local
.A
[3], local
.W
[i
], K
[i
]);
304 P(local
.A
[3], local
.A
[4], local
.A
[5], local
.A
[6], local
.A
[7],
305 local
.A
[0], local
.A
[1], local
.A
[2], local
.W
[i
], K
[i
]);
307 P(local
.A
[2], local
.A
[3], local
.A
[4], local
.A
[5], local
.A
[6],
308 local
.A
[7], local
.A
[0], local
.A
[1], local
.W
[i
], K
[i
]);
310 P(local
.A
[1], local
.A
[2], local
.A
[3], local
.A
[4], local
.A
[5],
311 local
.A
[6], local
.A
[7], local
.A
[0], local
.W
[i
], K
[i
]);
314 #endif /* MBEDTLS_SHA512_SMALLER */
316 for (i
= 0; i
< 8; i
++)
317 ctx
->state
[i
] += local
.A
[i
];
319 /* Zeroise buffers and variables to clear sensitive data from memory. */
320 mbedtls_platform_zeroize(&local
, sizeof(local
));
325 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
326 void mbedtls_sha512_process(mbedtls_sha512_context
*ctx
,
327 const unsigned char data
[128]) {
328 mbedtls_internal_sha512_process(ctx
, data
);
331 #endif /* !MBEDTLS_SHA512_PROCESS_ALT */
334 * SHA-512 process buffer
336 int mbedtls_sha512_update_ret(mbedtls_sha512_context
*ctx
,
337 const unsigned char *input
,
339 int ret
= MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED
;
343 SHA512_VALIDATE_RET(ctx
!= NULL
);
344 SHA512_VALIDATE_RET(ilen
== 0 || input
!= NULL
);
349 left
= (unsigned int)(ctx
->total
[0] & 0x7F);
352 ctx
->total
[0] += (uint64_t) ilen
;
354 if (ctx
->total
[0] < (uint64_t) ilen
)
357 if (left
&& ilen
>= fill
) {
358 memcpy((void *)(ctx
->buffer
+ left
), input
, fill
);
360 if ((ret
= mbedtls_internal_sha512_process(ctx
, ctx
->buffer
)) != 0)
368 while (ilen
>= 128) {
369 if ((ret
= mbedtls_internal_sha512_process(ctx
, input
)) != 0)
377 memcpy((void *)(ctx
->buffer
+ left
), input
, ilen
);
382 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
383 void mbedtls_sha512_update(mbedtls_sha512_context
*ctx
,
384 const unsigned char *input
,
386 mbedtls_sha512_update_ret(ctx
, input
, ilen
);
391 * SHA-512 final digest
393 int mbedtls_sha512_finish_ret(mbedtls_sha512_context
*ctx
,
394 unsigned char output
[64]) {
395 int ret
= MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED
;
399 SHA512_VALIDATE_RET(ctx
!= NULL
);
400 SHA512_VALIDATE_RET((unsigned char *)output
!= NULL
);
403 * Add padding: 0x80 then 0x00 until 16 bytes remain for the length
405 used
= ctx
->total
[0] & 0x7F;
407 ctx
->buffer
[used
++] = 0x80;
410 /* Enough room for padding + length in current block */
411 memset(ctx
->buffer
+ used
, 0, 112 - used
);
413 /* We'll need an extra block */
414 memset(ctx
->buffer
+ used
, 0, 128 - used
);
416 if ((ret
= mbedtls_internal_sha512_process(ctx
, ctx
->buffer
)) != 0)
419 memset(ctx
->buffer
, 0, 112);
425 high
= (ctx
->total
[0] >> 61)
426 | (ctx
->total
[1] << 3);
427 low
= (ctx
->total
[0] << 3);
429 sha512_put_uint64_be(high
, ctx
->buffer
, 112);
430 sha512_put_uint64_be(low
, ctx
->buffer
, 120);
432 if ((ret
= mbedtls_internal_sha512_process(ctx
, ctx
->buffer
)) != 0)
438 sha512_put_uint64_be(ctx
->state
[0], output
, 0);
439 sha512_put_uint64_be(ctx
->state
[1], output
, 8);
440 sha512_put_uint64_be(ctx
->state
[2], output
, 16);
441 sha512_put_uint64_be(ctx
->state
[3], output
, 24);
442 sha512_put_uint64_be(ctx
->state
[4], output
, 32);
443 sha512_put_uint64_be(ctx
->state
[5], output
, 40);
445 #if !defined(MBEDTLS_SHA512_NO_SHA384)
449 sha512_put_uint64_be(ctx
->state
[6], output
, 48);
450 sha512_put_uint64_be(ctx
->state
[7], output
, 56);
456 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
457 void mbedtls_sha512_finish(mbedtls_sha512_context
*ctx
,
458 unsigned char output
[64]) {
459 mbedtls_sha512_finish_ret(ctx
, output
);
463 #endif /* !MBEDTLS_SHA512_ALT */
466 * output = SHA-512( input buffer )
468 int mbedtls_sha512_ret(const unsigned char *input
,
470 unsigned char output
[64],
472 int ret
= MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED
;
473 mbedtls_sha512_context ctx
;
475 #if !defined(MBEDTLS_SHA512_NO_SHA384)
476 SHA512_VALIDATE_RET(is384
== 0 || is384
== 1);
478 SHA512_VALIDATE_RET(is384
== 0);
480 SHA512_VALIDATE_RET(ilen
== 0 || input
!= NULL
);
481 SHA512_VALIDATE_RET((unsigned char *)output
!= NULL
);
483 mbedtls_sha512_init(&ctx
);
485 if ((ret
= mbedtls_sha512_starts_ret(&ctx
, is384
)) != 0)
488 if ((ret
= mbedtls_sha512_update_ret(&ctx
, input
, ilen
)) != 0)
491 if ((ret
= mbedtls_sha512_finish_ret(&ctx
, output
)) != 0)
495 mbedtls_sha512_free(&ctx
);
500 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
501 void mbedtls_sha512(const unsigned char *input
,
503 unsigned char output
[64],
505 mbedtls_sha512_ret(input
, ilen
, output
, is384
);
509 #if defined(MBEDTLS_SELF_TEST)
512 * FIPS-180-2 test vectors
514 static const unsigned char sha512_test_buf
[3][113] = {
516 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
520 static const size_t sha512_test_buflen
[3] = {
524 static const unsigned char sha512_test_sum
[][64] = {
525 #if !defined(MBEDTLS_SHA512_NO_SHA384)
527 * SHA-384 test vectors
530 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
531 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
532 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
533 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
534 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
535 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7
538 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
539 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
540 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
541 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
542 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
543 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39
546 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
547 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
548 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
549 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
550 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
551 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85
553 #endif /* !MBEDTLS_SHA512_NO_SHA384 */
556 * SHA-512 test vectors
559 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
560 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
561 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
562 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
563 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
564 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
565 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
566 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F
569 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
570 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
571 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
572 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
573 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
574 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
575 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
576 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09
579 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
580 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
581 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
582 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
583 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
584 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
585 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
586 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B
590 #define ARRAY_LENGTH( a ) ( sizeof( a ) / sizeof( ( a )[0] ) )
595 int mbedtls_sha512_self_test(int verbose
) {
596 int i
, j
, k
, buflen
, ret
= 0;
598 unsigned char sha512sum
[64];
599 mbedtls_sha512_context ctx
;
601 buf
= mbedtls_calloc(1024, sizeof(unsigned char));
604 mbedtls_printf("Buffer allocation failed\n");
609 mbedtls_sha512_init(&ctx
);
611 for (i
= 0; i
< (int) ARRAY_LENGTH(sha512_test_sum
); i
++) {
613 #if !defined(MBEDTLS_SHA512_NO_SHA384)
620 mbedtls_printf(" SHA-%d test #%d: ", 512 - k
* 128, j
+ 1);
622 if ((ret
= mbedtls_sha512_starts_ret(&ctx
, k
)) != 0)
626 memset(buf
, 'a', buflen
= 1000);
628 for (j
= 0; j
< 1000; j
++) {
629 ret
= mbedtls_sha512_update_ret(&ctx
, buf
, buflen
);
634 ret
= mbedtls_sha512_update_ret(&ctx
, sha512_test_buf
[j
],
635 sha512_test_buflen
[j
]);
640 if ((ret
= mbedtls_sha512_finish_ret(&ctx
, sha512sum
)) != 0)
643 if (memcmp(sha512sum
, sha512_test_sum
[i
], 64 - k
* 16) != 0) {
649 mbedtls_printf("passed\n");
653 mbedtls_printf("\n");
659 mbedtls_printf("failed\n");
662 mbedtls_sha512_free(&ctx
);
670 #endif /* MBEDTLS_SELF_TEST */
672 #endif /* MBEDTLS_SHA512_C */