Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8774 rgimad 1
/*
2
 *  FIPS-180-2 compliant SHA-384/512 implementation
3
 *
4
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5
 *  SPDX-License-Identifier: GPL-2.0
6
 *
7
 *  This program is free software; you can redistribute it and/or modify
8
 *  it under the terms of the GNU General Public License as published by
9
 *  the Free Software Foundation; either version 2 of the License, or
10
 *  (at your option) any later version.
11
 *
12
 *  This program is distributed in the hope that it will be useful,
13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *  GNU General Public License for more details.
16
 *
17
 *  You should have received a copy of the GNU General Public License along
18
 *  with this program; if not, write to the Free Software Foundation, Inc.,
19
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
 *
21
 *  This file is part of mbed TLS (https://tls.mbed.org)
22
 */
23
/*
24
 *  The SHA-512 Secure Hash Standard was published by NIST in 2002.
25
 *
26
 *  http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
27
 */
28
 
29
#if !defined(MBEDTLS_CONFIG_FILE)
30
#include "mbedtls/config.h"
31
#else
32
#include MBEDTLS_CONFIG_FILE
33
#endif
34
 
35
#if defined(MBEDTLS_SHA512_C)
36
 
37
#include "mbedtls/sha512.h"
38
#include "mbedtls/platform_util.h"
39
 
40
#if defined(_MSC_VER) || defined(__WATCOMC__)
41
  #define UL64(x) x##ui64
42
#else
43
  #define UL64(x) x##ULL
44
#endif
45
 
46
#include 
47
 
48
#if defined(MBEDTLS_SELF_TEST)
49
#if defined(MBEDTLS_PLATFORM_C)
50
#include "mbedtls/platform.h"
51
#else
52
#include 
53
#include 
54
#define mbedtls_printf printf
55
#define mbedtls_calloc    calloc
56
#define mbedtls_free       free
57
#endif /* MBEDTLS_PLATFORM_C */
58
#endif /* MBEDTLS_SELF_TEST */
59
 
60
#define SHA512_VALIDATE_RET(cond)                           \
61
    MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA )
62
#define SHA512_VALIDATE(cond)  MBEDTLS_INTERNAL_VALIDATE( cond )
63
 
64
#if !defined(MBEDTLS_SHA512_ALT)
65
 
66
/*
67
 * 64-bit integer manipulation macros (big endian)
68
 */
69
#ifndef GET_UINT64_BE
70
#define GET_UINT64_BE(n,b,i)                            \
71
{                                                       \
72
    (n) = ( (uint64_t) (b)[(i)    ] << 56 )       \
73
        | ( (uint64_t) (b)[(i) + 1] << 48 )       \
74
        | ( (uint64_t) (b)[(i) + 2] << 40 )       \
75
        | ( (uint64_t) (b)[(i) + 3] << 32 )       \
76
        | ( (uint64_t) (b)[(i) + 4] << 24 )       \
77
        | ( (uint64_t) (b)[(i) + 5] << 16 )       \
78
        | ( (uint64_t) (b)[(i) + 6] <<  8 )       \
79
        | ( (uint64_t) (b)[(i) + 7]       );      \
80
}
81
#endif /* GET_UINT64_BE */
82
 
83
#ifndef PUT_UINT64_BE
84
#define PUT_UINT64_BE(n,b,i)                            \
85
{                                                       \
86
    (b)[(i)    ] = (unsigned char) ( (n) >> 56 );       \
87
    (b)[(i) + 1] = (unsigned char) ( (n) >> 48 );       \
88
    (b)[(i) + 2] = (unsigned char) ( (n) >> 40 );       \
89
    (b)[(i) + 3] = (unsigned char) ( (n) >> 32 );       \
90
    (b)[(i) + 4] = (unsigned char) ( (n) >> 24 );       \
91
    (b)[(i) + 5] = (unsigned char) ( (n) >> 16 );       \
92
    (b)[(i) + 6] = (unsigned char) ( (n) >>  8 );       \
93
    (b)[(i) + 7] = (unsigned char) ( (n)       );       \
94
}
95
#endif /* PUT_UINT64_BE */
96
 
97
void mbedtls_sha512_init( mbedtls_sha512_context *ctx )
98
{
99
    SHA512_VALIDATE( ctx != NULL );
100
 
101
    memset( ctx, 0, sizeof( mbedtls_sha512_context ) );
102
}
103
 
104
void mbedtls_sha512_free( mbedtls_sha512_context *ctx )
105
{
106
    if( ctx == NULL )
107
        return;
108
 
109
    mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha512_context ) );
110
}
111
 
112
void mbedtls_sha512_clone( mbedtls_sha512_context *dst,
113
                           const mbedtls_sha512_context *src )
114
{
115
    SHA512_VALIDATE( dst != NULL );
116
    SHA512_VALIDATE( src != NULL );
117
 
118
    *dst = *src;
119
}
120
 
121
/*
122
 * SHA-512 context setup
123
 */
124
int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 )
125
{
126
    SHA512_VALIDATE_RET( ctx != NULL );
127
    SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 );
128
 
129
    ctx->total[0] = 0;
130
    ctx->total[1] = 0;
131
 
132
    if( is384 == 0 )
133
    {
134
        /* SHA-512 */
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);
143
    }
144
    else
145
    {
146
        /* SHA-384 */
147
        ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
148
        ctx->state[1] = UL64(0x629A292A367CD507);
149
        ctx->state[2] = UL64(0x9159015A3070DD17);
150
        ctx->state[3] = UL64(0x152FECD8F70E5939);
151
        ctx->state[4] = UL64(0x67332667FFC00B31);
152
        ctx->state[5] = UL64(0x8EB44A8768581511);
153
        ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
154
        ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
155
    }
156
 
157
    ctx->is384 = is384;
158
 
159
    return( 0 );
160
}
161
 
162
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
163
void mbedtls_sha512_starts( mbedtls_sha512_context *ctx,
164
                            int is384 )
165
{
166
    mbedtls_sha512_starts_ret( ctx, is384 );
167
}
168
#endif
169
 
170
#if !defined(MBEDTLS_SHA512_PROCESS_ALT)
171
 
172
/*
173
 * Round constants
174
 */
175
static const uint64_t K[80] =
176
{
177
    UL64(0x428A2F98D728AE22),  UL64(0x7137449123EF65CD),
178
    UL64(0xB5C0FBCFEC4D3B2F),  UL64(0xE9B5DBA58189DBBC),
179
    UL64(0x3956C25BF348B538),  UL64(0x59F111F1B605D019),
180
    UL64(0x923F82A4AF194F9B),  UL64(0xAB1C5ED5DA6D8118),
181
    UL64(0xD807AA98A3030242),  UL64(0x12835B0145706FBE),
182
    UL64(0x243185BE4EE4B28C),  UL64(0x550C7DC3D5FFB4E2),
183
    UL64(0x72BE5D74F27B896F),  UL64(0x80DEB1FE3B1696B1),
184
    UL64(0x9BDC06A725C71235),  UL64(0xC19BF174CF692694),
185
    UL64(0xE49B69C19EF14AD2),  UL64(0xEFBE4786384F25E3),
186
    UL64(0x0FC19DC68B8CD5B5),  UL64(0x240CA1CC77AC9C65),
187
    UL64(0x2DE92C6F592B0275),  UL64(0x4A7484AA6EA6E483),
188
    UL64(0x5CB0A9DCBD41FBD4),  UL64(0x76F988DA831153B5),
189
    UL64(0x983E5152EE66DFAB),  UL64(0xA831C66D2DB43210),
190
    UL64(0xB00327C898FB213F),  UL64(0xBF597FC7BEEF0EE4),
191
    UL64(0xC6E00BF33DA88FC2),  UL64(0xD5A79147930AA725),
192
    UL64(0x06CA6351E003826F),  UL64(0x142929670A0E6E70),
193
    UL64(0x27B70A8546D22FFC),  UL64(0x2E1B21385C26C926),
194
    UL64(0x4D2C6DFC5AC42AED),  UL64(0x53380D139D95B3DF),
195
    UL64(0x650A73548BAF63DE),  UL64(0x766A0ABB3C77B2A8),
196
    UL64(0x81C2C92E47EDAEE6),  UL64(0x92722C851482353B),
197
    UL64(0xA2BFE8A14CF10364),  UL64(0xA81A664BBC423001),
198
    UL64(0xC24B8B70D0F89791),  UL64(0xC76C51A30654BE30),
199
    UL64(0xD192E819D6EF5218),  UL64(0xD69906245565A910),
200
    UL64(0xF40E35855771202A),  UL64(0x106AA07032BBD1B8),
201
    UL64(0x19A4C116B8D2D0C8),  UL64(0x1E376C085141AB53),
202
    UL64(0x2748774CDF8EEB99),  UL64(0x34B0BCB5E19B48A8),
203
    UL64(0x391C0CB3C5C95A63),  UL64(0x4ED8AA4AE3418ACB),
204
    UL64(0x5B9CCA4F7763E373),  UL64(0x682E6FF3D6B2B8A3),
205
    UL64(0x748F82EE5DEFB2FC),  UL64(0x78A5636F43172F60),
206
    UL64(0x84C87814A1F0AB72),  UL64(0x8CC702081A6439EC),
207
    UL64(0x90BEFFFA23631E28),  UL64(0xA4506CEBDE82BDE9),
208
    UL64(0xBEF9A3F7B2C67915),  UL64(0xC67178F2E372532B),
209
    UL64(0xCA273ECEEA26619C),  UL64(0xD186B8C721C0C207),
210
    UL64(0xEADA7DD6CDE0EB1E),  UL64(0xF57D4F7FEE6ED178),
211
    UL64(0x06F067AA72176FBA),  UL64(0x0A637DC5A2C898A6),
212
    UL64(0x113F9804BEF90DAE),  UL64(0x1B710B35131C471B),
213
    UL64(0x28DB77F523047D84),  UL64(0x32CAAB7B40C72493),
214
    UL64(0x3C9EBE0A15C9BEBC),  UL64(0x431D67C49C100D4C),
215
    UL64(0x4CC5D4BECB3E42B6),  UL64(0x597F299CFC657E2A),
216
    UL64(0x5FCB6FAB3AD6FAEC),  UL64(0x6C44198C4A475817)
217
};
218
 
219
int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,
220
                                     const unsigned char data[128] )
221
{
222
    int i;
223
    uint64_t temp1, temp2, W[80];
224
    uint64_t A, B, C, D, E, F, G, H;
225
 
226
    SHA512_VALIDATE_RET( ctx != NULL );
227
    SHA512_VALIDATE_RET( (const unsigned char *)data != NULL );
228
 
229
#define  SHR(x,n) ((x) >> (n))
230
#define ROTR(x,n) (SHR((x),(n)) | ((x) << (64 - (n))))
231
 
232
#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^  SHR(x, 7))
233
#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^  SHR(x, 6))
234
 
235
#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
236
#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
237
 
238
#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
239
#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
240
 
241
#define P(a,b,c,d,e,f,g,h,x,K)                                  \
242
    do                                                          \
243
    {                                                           \
244
        temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x);      \
245
        temp2 = S2(a) + F0((a),(b),(c));                        \
246
        (d) += temp1; (h) = temp1 + temp2;                      \
247
    } while( 0 )
248
 
249
    for( i = 0; i < 16; i++ )
250
    {
251
        GET_UINT64_BE( W[i], data, i << 3 );
252
    }
253
 
254
    for( ; i < 80; i++ )
255
    {
256
        W[i] = S1(W[i -  2]) + W[i -  7] +
257
               S0(W[i - 15]) + W[i - 16];
258
    }
259
 
260
    A = ctx->state[0];
261
    B = ctx->state[1];
262
    C = ctx->state[2];
263
    D = ctx->state[3];
264
    E = ctx->state[4];
265
    F = ctx->state[5];
266
    G = ctx->state[6];
267
    H = ctx->state[7];
268
    i = 0;
269
 
270
    do
271
    {
272
        P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;
273
        P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;
274
        P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;
275
        P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;
276
        P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;
277
        P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;
278
        P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;
279
        P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;
280
    }
281
    while( i < 80 );
282
 
283
    ctx->state[0] += A;
284
    ctx->state[1] += B;
285
    ctx->state[2] += C;
286
    ctx->state[3] += D;
287
    ctx->state[4] += E;
288
    ctx->state[5] += F;
289
    ctx->state[6] += G;
290
    ctx->state[7] += H;
291
 
292
    return( 0 );
293
}
294
 
295
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
296
void mbedtls_sha512_process( mbedtls_sha512_context *ctx,
297
                             const unsigned char data[128] )
298
{
299
    mbedtls_internal_sha512_process( ctx, data );
300
}
301
#endif
302
#endif /* !MBEDTLS_SHA512_PROCESS_ALT */
303
 
304
/*
305
 * SHA-512 process buffer
306
 */
307
int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx,
308
                               const unsigned char *input,
309
                               size_t ilen )
310
{
311
    int ret;
312
    size_t fill;
313
    unsigned int left;
314
 
315
    SHA512_VALIDATE_RET( ctx != NULL );
316
    SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
317
 
318
    if( ilen == 0 )
319
        return( 0 );
320
 
321
    left = (unsigned int) (ctx->total[0] & 0x7F);
322
    fill = 128 - left;
323
 
324
    ctx->total[0] += (uint64_t) ilen;
325
 
326
    if( ctx->total[0] < (uint64_t) ilen )
327
        ctx->total[1]++;
328
 
329
    if( left && ilen >= fill )
330
    {
331
        memcpy( (void *) (ctx->buffer + left), input, fill );
332
 
333
        if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
334
            return( ret );
335
 
336
        input += fill;
337
        ilen  -= fill;
338
        left = 0;
339
    }
340
 
341
    while( ilen >= 128 )
342
    {
343
        if( ( ret = mbedtls_internal_sha512_process( ctx, input ) ) != 0 )
344
            return( ret );
345
 
346
        input += 128;
347
        ilen  -= 128;
348
    }
349
 
350
    if( ilen > 0 )
351
        memcpy( (void *) (ctx->buffer + left), input, ilen );
352
 
353
    return( 0 );
354
}
355
 
356
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
357
void mbedtls_sha512_update( mbedtls_sha512_context *ctx,
358
                            const unsigned char *input,
359
                            size_t ilen )
360
{
361
    mbedtls_sha512_update_ret( ctx, input, ilen );
362
}
363
#endif
364
 
365
/*
366
 * SHA-512 final digest
367
 */
368
int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx,
369
                               unsigned char output[64] )
370
{
371
    int ret;
372
    unsigned used;
373
    uint64_t high, low;
374
 
375
    SHA512_VALIDATE_RET( ctx != NULL );
376
    SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
377
 
378
    /*
379
     * Add padding: 0x80 then 0x00 until 16 bytes remain for the length
380
     */
381
    used = ctx->total[0] & 0x7F;
382
 
383
    ctx->buffer[used++] = 0x80;
384
 
385
    if( used <= 112 )
386
    {
387
        /* Enough room for padding + length in current block */
388
        memset( ctx->buffer + used, 0, 112 - used );
389
    }
390
    else
391
    {
392
        /* We'll need an extra block */
393
        memset( ctx->buffer + used, 0, 128 - used );
394
 
395
        if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
396
            return( ret );
397
 
398
        memset( ctx->buffer, 0, 112 );
399
    }
400
 
401
    /*
402
     * Add message length
403
     */
404
    high = ( ctx->total[0] >> 61 )
405
         | ( ctx->total[1] <<  3 );
406
    low  = ( ctx->total[0] <<  3 );
407
 
408
    PUT_UINT64_BE( high, ctx->buffer, 112 );
409
    PUT_UINT64_BE( low,  ctx->buffer, 120 );
410
 
411
    if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 )
412
        return( ret );
413
 
414
    /*
415
     * Output final state
416
     */
417
    PUT_UINT64_BE( ctx->state[0], output,  0 );
418
    PUT_UINT64_BE( ctx->state[1], output,  8 );
419
    PUT_UINT64_BE( ctx->state[2], output, 16 );
420
    PUT_UINT64_BE( ctx->state[3], output, 24 );
421
    PUT_UINT64_BE( ctx->state[4], output, 32 );
422
    PUT_UINT64_BE( ctx->state[5], output, 40 );
423
 
424
    if( ctx->is384 == 0 )
425
    {
426
        PUT_UINT64_BE( ctx->state[6], output, 48 );
427
        PUT_UINT64_BE( ctx->state[7], output, 56 );
428
    }
429
 
430
    return( 0 );
431
}
432
 
433
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
434
void mbedtls_sha512_finish( mbedtls_sha512_context *ctx,
435
                            unsigned char output[64] )
436
{
437
    mbedtls_sha512_finish_ret( ctx, output );
438
}
439
#endif
440
 
441
#endif /* !MBEDTLS_SHA512_ALT */
442
 
443
/*
444
 * output = SHA-512( input buffer )
445
 */
446
int mbedtls_sha512_ret( const unsigned char *input,
447
                    size_t ilen,
448
                    unsigned char output[64],
449
                    int is384 )
450
{
451
    int ret;
452
    mbedtls_sha512_context ctx;
453
 
454
    SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 );
455
    SHA512_VALIDATE_RET( ilen == 0 || input != NULL );
456
    SHA512_VALIDATE_RET( (unsigned char *)output != NULL );
457
 
458
    mbedtls_sha512_init( &ctx );
459
 
460
    if( ( ret = mbedtls_sha512_starts_ret( &ctx, is384 ) ) != 0 )
461
        goto exit;
462
 
463
    if( ( ret = mbedtls_sha512_update_ret( &ctx, input, ilen ) ) != 0 )
464
        goto exit;
465
 
466
    if( ( ret = mbedtls_sha512_finish_ret( &ctx, output ) ) != 0 )
467
        goto exit;
468
 
469
exit:
470
    mbedtls_sha512_free( &ctx );
471
 
472
    return( ret );
473
}
474
 
475
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
476
void mbedtls_sha512( const unsigned char *input,
477
                     size_t ilen,
478
                     unsigned char output[64],
479
                     int is384 )
480
{
481
    mbedtls_sha512_ret( input, ilen, output, is384 );
482
}
483
#endif
484
 
485
#if defined(MBEDTLS_SELF_TEST)
486
 
487
/*
488
 * FIPS-180-2 test vectors
489
 */
490
static const unsigned char sha512_test_buf[3][113] =
491
{
492
    { "abc" },
493
    { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
494
      "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
495
    { "" }
496
};
497
 
498
static const size_t sha512_test_buflen[3] =
499
{
500
    3, 112, 1000
501
};
502
 
503
static const unsigned char sha512_test_sum[6][64] =
504
{
505
    /*
506
     * SHA-384 test vectors
507
     */
508
    { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
509
      0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
510
      0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
511
      0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
512
      0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
513
      0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
514
    { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
515
      0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
516
      0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
517
      0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
518
      0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
519
      0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
520
    { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
521
      0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
522
      0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
523
      0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
524
      0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
525
      0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
526
 
527
    /*
528
     * SHA-512 test vectors
529
     */
530
    { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
531
      0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
532
      0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
533
      0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
534
      0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
535
      0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
536
      0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
537
      0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
538
    { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
539
      0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
540
      0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
541
      0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
542
      0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
543
      0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
544
      0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
545
      0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
546
    { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
547
      0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
548
      0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
549
      0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
550
      0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
551
      0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
552
      0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
553
      0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
554
};
555
 
556
/*
557
 * Checkup routine
558
 */
559
int mbedtls_sha512_self_test( int verbose )
560
{
561
    int i, j, k, buflen, ret = 0;
562
    unsigned char *buf;
563
    unsigned char sha512sum[64];
564
    mbedtls_sha512_context ctx;
565
 
566
    buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
567
    if( NULL == buf )
568
    {
569
        if( verbose != 0 )
570
            mbedtls_printf( "Buffer allocation failed\n" );
571
 
572
        return( 1 );
573
    }
574
 
575
    mbedtls_sha512_init( &ctx );
576
 
577
    for( i = 0; i < 6; i++ )
578
    {
579
        j = i % 3;
580
        k = i < 3;
581
 
582
        if( verbose != 0 )
583
            mbedtls_printf( "  SHA-%d test #%d: ", 512 - k * 128, j + 1 );
584
 
585
        if( ( ret = mbedtls_sha512_starts_ret( &ctx, k ) ) != 0 )
586
            goto fail;
587
 
588
        if( j == 2 )
589
        {
590
            memset( buf, 'a', buflen = 1000 );
591
 
592
            for( j = 0; j < 1000; j++ )
593
            {
594
                ret = mbedtls_sha512_update_ret( &ctx, buf, buflen );
595
                if( ret != 0 )
596
                    goto fail;
597
            }
598
        }
599
        else
600
        {
601
            ret = mbedtls_sha512_update_ret( &ctx, sha512_test_buf[j],
602
                                             sha512_test_buflen[j] );
603
            if( ret != 0 )
604
                goto fail;
605
        }
606
 
607
        if( ( ret = mbedtls_sha512_finish_ret( &ctx, sha512sum ) ) != 0 )
608
            goto fail;
609
 
610
        if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
611
        {
612
            ret = 1;
613
            goto fail;
614
        }
615
 
616
        if( verbose != 0 )
617
            mbedtls_printf( "passed\n" );
618
    }
619
 
620
    if( verbose != 0 )
621
        mbedtls_printf( "\n" );
622
 
623
    goto exit;
624
 
625
fail:
626
    if( verbose != 0 )
627
        mbedtls_printf( "failed\n" );
628
 
629
exit:
630
    mbedtls_sha512_free( &ctx );
631
    mbedtls_free( buf );
632
 
633
    return( ret );
634
}
635
 
636
#endif /* MBEDTLS_SELF_TEST */
637
 
638
#endif /* MBEDTLS_SHA512_C */