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