Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbedtls by
sha512.c
00001 /* 00002 * FIPS-180-2 compliant SHA-384/512 implementation 00003 * 00004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 00005 * SPDX-License-Identifier: Apache-2.0 00006 * 00007 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00008 * not use this file except in compliance with the License. 00009 * You may obtain a copy of the License at 00010 * 00011 * http://www.apache.org/licenses/LICENSE-2.0 00012 * 00013 * Unless required by applicable law or agreed to in writing, software 00014 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00015 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00016 * See the License for the specific language governing permissions and 00017 * limitations under the License. 00018 * 00019 * This file is part of mbed TLS (https://tls.mbed.org) 00020 */ 00021 /* 00022 * The SHA-512 Secure Hash Standard was published by NIST in 2002. 00023 * 00024 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf 00025 */ 00026 00027 #if !defined(MBEDTLS_CONFIG_FILE) 00028 #include "mbedtls/config.h" 00029 #else 00030 #include MBEDTLS_CONFIG_FILE 00031 #endif 00032 00033 #if defined(MBEDTLS_SHA512_C) 00034 00035 #include "mbedtls/sha512.h" 00036 00037 #if defined(_MSC_VER) || defined(__WATCOMC__) 00038 #define UL64(x) x##ui64 00039 #else 00040 #define UL64(x) x##ULL 00041 #endif 00042 00043 #include <string.h> 00044 00045 #if defined(MBEDTLS_SELF_TEST) 00046 #if defined(MBEDTLS_PLATFORM_C) 00047 #include "mbedtls/platform.h" 00048 #else 00049 #include <stdio.h> 00050 #define mbedtls_printf printf 00051 #endif /* MBEDTLS_PLATFORM_C */ 00052 #endif /* MBEDTLS_SELF_TEST */ 00053 00054 #if !defined(MBEDTLS_SHA512_ALT) 00055 00056 /* Implementation that should never be optimized out by the compiler */ 00057 static void mbedtls_zeroize( void *v, size_t n ) { 00058 volatile unsigned char *p = v; while( n-- ) *p++ = 0; 00059 } 00060 00061 /* 00062 * 64-bit integer manipulation macros (big endian) 00063 */ 00064 #ifndef GET_UINT64_BE 00065 #define GET_UINT64_BE(n,b,i) \ 00066 { \ 00067 (n) = ( (uint64_t) (b)[(i) ] << 56 ) \ 00068 | ( (uint64_t) (b)[(i) + 1] << 48 ) \ 00069 | ( (uint64_t) (b)[(i) + 2] << 40 ) \ 00070 | ( (uint64_t) (b)[(i) + 3] << 32 ) \ 00071 | ( (uint64_t) (b)[(i) + 4] << 24 ) \ 00072 | ( (uint64_t) (b)[(i) + 5] << 16 ) \ 00073 | ( (uint64_t) (b)[(i) + 6] << 8 ) \ 00074 | ( (uint64_t) (b)[(i) + 7] ); \ 00075 } 00076 #endif /* GET_UINT64_BE */ 00077 00078 #ifndef PUT_UINT64_BE 00079 #define PUT_UINT64_BE(n,b,i) \ 00080 { \ 00081 (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \ 00082 (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \ 00083 (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \ 00084 (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \ 00085 (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \ 00086 (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \ 00087 (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \ 00088 (b)[(i) + 7] = (unsigned char) ( (n) ); \ 00089 } 00090 #endif /* PUT_UINT64_BE */ 00091 00092 /* 00093 * Round constants 00094 */ 00095 static const uint64_t K[80] = 00096 { 00097 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD), 00098 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC), 00099 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019), 00100 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118), 00101 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE), 00102 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2), 00103 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1), 00104 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694), 00105 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3), 00106 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65), 00107 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483), 00108 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5), 00109 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210), 00110 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4), 00111 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725), 00112 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70), 00113 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926), 00114 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF), 00115 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8), 00116 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B), 00117 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001), 00118 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30), 00119 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910), 00120 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8), 00121 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53), 00122 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8), 00123 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB), 00124 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3), 00125 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60), 00126 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC), 00127 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9), 00128 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B), 00129 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207), 00130 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178), 00131 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6), 00132 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B), 00133 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493), 00134 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C), 00135 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A), 00136 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817) 00137 }; 00138 00139 void mbedtls_sha512_init( mbedtls_sha512_context *ctx ) 00140 { 00141 memset( ctx, 0, sizeof( mbedtls_sha512_context ) ); 00142 } 00143 00144 void mbedtls_sha512_free( mbedtls_sha512_context *ctx ) 00145 { 00146 if( ctx == NULL ) 00147 return; 00148 00149 mbedtls_zeroize( ctx, sizeof( mbedtls_sha512_context ) ); 00150 } 00151 00152 void mbedtls_sha512_clone( mbedtls_sha512_context *dst, 00153 const mbedtls_sha512_context *src ) 00154 { 00155 *dst = *src; 00156 } 00157 00158 /* 00159 * SHA-512 context setup 00160 */ 00161 void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 ) 00162 { 00163 ctx->total [0] = 0; 00164 ctx->total [1] = 0; 00165 00166 if( is384 == 0 ) 00167 { 00168 /* SHA-512 */ 00169 ctx->state [0] = UL64(0x6A09E667F3BCC908); 00170 ctx->state [1] = UL64(0xBB67AE8584CAA73B); 00171 ctx->state [2] = UL64(0x3C6EF372FE94F82B); 00172 ctx->state [3] = UL64(0xA54FF53A5F1D36F1); 00173 ctx->state [4] = UL64(0x510E527FADE682D1); 00174 ctx->state [5] = UL64(0x9B05688C2B3E6C1F); 00175 ctx->state [6] = UL64(0x1F83D9ABFB41BD6B); 00176 ctx->state [7] = UL64(0x5BE0CD19137E2179); 00177 } 00178 else 00179 { 00180 /* SHA-384 */ 00181 ctx->state [0] = UL64(0xCBBB9D5DC1059ED8); 00182 ctx->state [1] = UL64(0x629A292A367CD507); 00183 ctx->state [2] = UL64(0x9159015A3070DD17); 00184 ctx->state [3] = UL64(0x152FECD8F70E5939); 00185 ctx->state [4] = UL64(0x67332667FFC00B31); 00186 ctx->state [5] = UL64(0x8EB44A8768581511); 00187 ctx->state [6] = UL64(0xDB0C2E0D64F98FA7); 00188 ctx->state [7] = UL64(0x47B5481DBEFA4FA4); 00189 } 00190 00191 ctx->is384 = is384; 00192 } 00193 00194 #if !defined(MBEDTLS_SHA512_PROCESS_ALT) 00195 void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ) 00196 { 00197 int i; 00198 uint64_t temp1, temp2, W[80]; 00199 uint64_t A, B, C, D, E, F, G, H; 00200 00201 #define SHR(x,n) (x >> n) 00202 #define ROTR(x,n) (SHR(x,n) | (x << (64 - n))) 00203 00204 #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) 00205 #define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6)) 00206 00207 #define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) 00208 #define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) 00209 00210 #define F0(x,y,z) ((x & y) | (z & (x | y))) 00211 #define F1(x,y,z) (z ^ (x & (y ^ z))) 00212 00213 #define P(a,b,c,d,e,f,g,h,x,K) \ 00214 { \ 00215 temp1 = h + S3(e) + F1(e,f,g) + K + x; \ 00216 temp2 = S2(a) + F0(a,b,c); \ 00217 d += temp1; h = temp1 + temp2; \ 00218 } 00219 00220 for( i = 0; i < 16; i++ ) 00221 { 00222 GET_UINT64_BE( W[i], data, i << 3 ); 00223 } 00224 00225 for( ; i < 80; i++ ) 00226 { 00227 W[i] = S1(W[i - 2]) + W[i - 7] + 00228 S0(W[i - 15]) + W[i - 16]; 00229 } 00230 00231 A = ctx->state [0]; 00232 B = ctx->state [1]; 00233 C = ctx->state [2]; 00234 D = ctx->state [3]; 00235 E = ctx->state [4]; 00236 F = ctx->state [5]; 00237 G = ctx->state [6]; 00238 H = ctx->state [7]; 00239 i = 0; 00240 00241 do 00242 { 00243 P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++; 00244 P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++; 00245 P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++; 00246 P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++; 00247 P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++; 00248 P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++; 00249 P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++; 00250 P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++; 00251 } 00252 while( i < 80 ); 00253 00254 ctx->state [0] += A; 00255 ctx->state [1] += B; 00256 ctx->state [2] += C; 00257 ctx->state [3] += D; 00258 ctx->state [4] += E; 00259 ctx->state [5] += F; 00260 ctx->state [6] += G; 00261 ctx->state [7] += H; 00262 } 00263 #endif /* !MBEDTLS_SHA512_PROCESS_ALT */ 00264 00265 /* 00266 * SHA-512 process buffer 00267 */ 00268 void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input, 00269 size_t ilen ) 00270 { 00271 size_t fill; 00272 unsigned int left; 00273 00274 if( ilen == 0 ) 00275 return; 00276 00277 left = (unsigned int) (ctx->total [0] & 0x7F); 00278 fill = 128 - left; 00279 00280 ctx->total [0] += (uint64_t) ilen; 00281 00282 if( ctx->total [0] < (uint64_t) ilen ) 00283 ctx->total [1]++; 00284 00285 if( left && ilen >= fill ) 00286 { 00287 memcpy( (void *) (ctx->buffer + left), input, fill ); 00288 mbedtls_sha512_process( ctx, ctx->buffer ); 00289 input += fill; 00290 ilen -= fill; 00291 left = 0; 00292 } 00293 00294 while( ilen >= 128 ) 00295 { 00296 mbedtls_sha512_process( ctx, input ); 00297 input += 128; 00298 ilen -= 128; 00299 } 00300 00301 if( ilen > 0 ) 00302 memcpy( (void *) (ctx->buffer + left), input, ilen ); 00303 } 00304 00305 static const unsigned char sha512_padding[128] = 00306 { 00307 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00308 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00309 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00310 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00311 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00312 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 00315 }; 00316 00317 /* 00318 * SHA-512 final digest 00319 */ 00320 void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] ) 00321 { 00322 size_t last, padn; 00323 uint64_t high, low; 00324 unsigned char msglen[16]; 00325 00326 high = ( ctx->total [0] >> 61 ) 00327 | ( ctx->total [1] << 3 ); 00328 low = ( ctx->total [0] << 3 ); 00329 00330 PUT_UINT64_BE( high, msglen, 0 ); 00331 PUT_UINT64_BE( low, msglen, 8 ); 00332 00333 last = (size_t)( ctx->total [0] & 0x7F ); 00334 padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last ); 00335 00336 mbedtls_sha512_update( ctx, sha512_padding, padn ); 00337 mbedtls_sha512_update( ctx, msglen, 16 ); 00338 00339 PUT_UINT64_BE( ctx->state [0], output, 0 ); 00340 PUT_UINT64_BE( ctx->state [1], output, 8 ); 00341 PUT_UINT64_BE( ctx->state [2], output, 16 ); 00342 PUT_UINT64_BE( ctx->state [3], output, 24 ); 00343 PUT_UINT64_BE( ctx->state [4], output, 32 ); 00344 PUT_UINT64_BE( ctx->state [5], output, 40 ); 00345 00346 if( ctx->is384 == 0 ) 00347 { 00348 PUT_UINT64_BE( ctx->state [6], output, 48 ); 00349 PUT_UINT64_BE( ctx->state [7], output, 56 ); 00350 } 00351 } 00352 00353 #endif /* !MBEDTLS_SHA512_ALT */ 00354 00355 /* 00356 * output = SHA-512( input buffer ) 00357 */ 00358 void mbedtls_sha512( const unsigned char *input, size_t ilen, 00359 unsigned char output[64], int is384 ) 00360 { 00361 mbedtls_sha512_context ctx; 00362 00363 mbedtls_sha512_init( &ctx ); 00364 mbedtls_sha512_starts( &ctx, is384 ); 00365 mbedtls_sha512_update( &ctx, input, ilen ); 00366 mbedtls_sha512_finish( &ctx, output ); 00367 mbedtls_sha512_free( &ctx ); 00368 } 00369 00370 #if defined(MBEDTLS_SELF_TEST) 00371 00372 /* 00373 * FIPS-180-2 test vectors 00374 */ 00375 static const unsigned char sha512_test_buf[3][113] = 00376 { 00377 { "abc" }, 00378 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" 00379 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" }, 00380 { "" } 00381 }; 00382 00383 static const int sha512_test_buflen[3] = 00384 { 00385 3, 112, 1000 00386 }; 00387 00388 static const unsigned char sha512_test_sum[6][64] = 00389 { 00390 /* 00391 * SHA-384 test vectors 00392 */ 00393 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B, 00394 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07, 00395 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63, 00396 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED, 00397 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23, 00398 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 }, 00399 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8, 00400 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47, 00401 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2, 00402 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12, 00403 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9, 00404 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 }, 00405 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB, 00406 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C, 00407 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52, 00408 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B, 00409 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB, 00410 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 }, 00411 00412 /* 00413 * SHA-512 test vectors 00414 */ 00415 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA, 00416 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31, 00417 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2, 00418 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A, 00419 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8, 00420 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD, 00421 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E, 00422 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F }, 00423 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA, 00424 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F, 00425 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1, 00426 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18, 00427 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4, 00428 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A, 00429 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54, 00430 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 }, 00431 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64, 00432 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63, 00433 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28, 00434 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB, 00435 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A, 00436 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B, 00437 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E, 00438 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B } 00439 }; 00440 00441 /* 00442 * Checkup routine 00443 */ 00444 int mbedtls_sha512_self_test( int verbose ) 00445 { 00446 int i, j, k, buflen, ret = 0; 00447 unsigned char buf[1024]; 00448 unsigned char sha512sum[64]; 00449 mbedtls_sha512_context ctx; 00450 00451 mbedtls_sha512_init( &ctx ); 00452 00453 for( i = 0; i < 6; i++ ) 00454 { 00455 j = i % 3; 00456 k = i < 3; 00457 00458 if( verbose != 0 ) 00459 mbedtls_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 ); 00460 00461 mbedtls_sha512_starts( &ctx, k ); 00462 00463 if( j == 2 ) 00464 { 00465 memset( buf, 'a', buflen = 1000 ); 00466 00467 for( j = 0; j < 1000; j++ ) 00468 mbedtls_sha512_update( &ctx, buf, buflen ); 00469 } 00470 else 00471 mbedtls_sha512_update( &ctx, sha512_test_buf[j], 00472 sha512_test_buflen[j] ); 00473 00474 mbedtls_sha512_finish( &ctx, sha512sum ); 00475 00476 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 ) 00477 { 00478 if( verbose != 0 ) 00479 mbedtls_printf( "failed\n" ); 00480 00481 ret = 1; 00482 goto exit; 00483 } 00484 00485 if( verbose != 0 ) 00486 mbedtls_printf( "passed\n" ); 00487 } 00488 00489 if( verbose != 0 ) 00490 mbedtls_printf( "\n" ); 00491 00492 exit: 00493 mbedtls_sha512_free( &ctx ); 00494 00495 return( ret ); 00496 } 00497 00498 #endif /* MBEDTLS_SELF_TEST */ 00499 00500 #endif /* MBEDTLS_SHA512_C */
Generated on Tue Jul 12 2022 12:52:46 by
