diff options
Diffstat (limited to 'thirdparty/mbedtls/library/sha512.c')
| -rw-r--r-- | thirdparty/mbedtls/library/sha512.c | 115 | 
1 files changed, 77 insertions, 38 deletions
| diff --git a/thirdparty/mbedtls/library/sha512.c b/thirdparty/mbedtls/library/sha512.c index bdd20b284a..986037ab7c 100644 --- a/thirdparty/mbedtls/library/sha512.c +++ b/thirdparty/mbedtls/library/sha512.c @@ -1,8 +1,14 @@  /*   *  FIPS-180-2 compliant SHA-384/512 implementation   * - *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - *  SPDX-License-Identifier: Apache-2.0 + *  Copyright The Mbed TLS Contributors + *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + *  This file is provided under the Apache License 2.0, or the + *  GNU General Public License v2.0 or later. + * + *  ********** + *  Apache License 2.0:   *   *  Licensed under the Apache License, Version 2.0 (the "License"); you may   *  not use this file except in compliance with the License. @@ -16,7 +22,26 @@   *  See the License for the specific language governing permissions and   *  limitations under the License.   * - *  This file is part of mbed TLS (https://tls.mbed.org) + *  ********** + * + *  ********** + *  GNU General Public License v2.0 or later: + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License along + *  with this program; if not, write to the Free Software Foundation, Inc., + *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + *  **********   */  /*   *  The SHA-512 Secure Hash Standard was published by NIST in 2002. @@ -218,8 +243,11 @@ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,                                       const unsigned char data[128] )  {      int i; -    uint64_t temp1, temp2, W[80]; -    uint64_t A, B, C, D, E, F, G, H; +    struct +    { +        uint64_t temp1, temp2, W[80]; +        uint64_t A, B, C, D, E, F, G, H; +    } local;      SHA512_VALIDATE_RET( ctx != NULL );      SHA512_VALIDATE_RET( (const unsigned char *)data != NULL ); @@ -236,56 +264,67 @@ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,  #define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))  #define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) -#define P(a,b,c,d,e,f,g,h,x,K)                                  \ -    do                                                          \ -    {                                                           \ -        temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x);      \ -        temp2 = S2(a) + F0((a),(b),(c));                        \ -        (d) += temp1; (h) = temp1 + temp2;                      \ +#define P(a,b,c,d,e,f,g,h,x,K)                                      \ +    do                                                              \ +    {                                                               \ +        local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x);    \ +        local.temp2 = S2(a) + F0((a),(b),(c));                      \ +        (d) += local.temp1; (h) = local.temp1 + local.temp2;        \      } while( 0 )      for( i = 0; i < 16; i++ )      { -        GET_UINT64_BE( W[i], data, i << 3 ); +        GET_UINT64_BE( local.W[i], data, i << 3 );      }      for( ; i < 80; i++ )      { -        W[i] = S1(W[i -  2]) + W[i -  7] + -               S0(W[i - 15]) + W[i - 16]; +        local.W[i] = S1(local.W[i -  2]) + local.W[i -  7] + +                     S0(local.W[i - 15]) + local.W[i - 16];      } -    A = ctx->state[0]; -    B = ctx->state[1]; -    C = ctx->state[2]; -    D = ctx->state[3]; -    E = ctx->state[4]; -    F = ctx->state[5]; -    G = ctx->state[6]; -    H = ctx->state[7]; +    local.A = ctx->state[0]; +    local.B = ctx->state[1]; +    local.C = ctx->state[2]; +    local.D = ctx->state[3]; +    local.E = ctx->state[4]; +    local.F = ctx->state[5]; +    local.G = ctx->state[6]; +    local.H = ctx->state[7];      i = 0;      do      { -        P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++; -        P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++; -        P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++; -        P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++; -        P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++; -        P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++; -        P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++; -        P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++; +        P( local.A, local.B, local.C, local.D, local.E, +           local.F, local.G, local.H, local.W[i], K[i] ); i++; +        P( local.H, local.A, local.B, local.C, local.D, +           local.E, local.F, local.G, local.W[i], K[i] ); i++; +        P( local.G, local.H, local.A, local.B, local.C, +           local.D, local.E, local.F, local.W[i], K[i] ); i++; +        P( local.F, local.G, local.H, local.A, local.B, +           local.C, local.D, local.E, local.W[i], K[i] ); i++; +        P( local.E, local.F, local.G, local.H, local.A, +           local.B, local.C, local.D, local.W[i], K[i] ); i++; +        P( local.D, local.E, local.F, local.G, local.H, +           local.A, local.B, local.C, local.W[i], K[i] ); i++; +        P( local.C, local.D, local.E, local.F, local.G, +           local.H, local.A, local.B, local.W[i], K[i] ); i++; +        P( local.B, local.C, local.D, local.E, local.F, +           local.G, local.H, local.A, local.W[i], K[i] ); i++;      }      while( i < 80 ); -    ctx->state[0] += A; -    ctx->state[1] += B; -    ctx->state[2] += C; -    ctx->state[3] += D; -    ctx->state[4] += E; -    ctx->state[5] += F; -    ctx->state[6] += G; -    ctx->state[7] += H; +    ctx->state[0] += local.A; +    ctx->state[1] += local.B; +    ctx->state[2] += local.C; +    ctx->state[3] += local.D; +    ctx->state[4] += local.E; +    ctx->state[5] += local.F; +    ctx->state[6] += local.G; +    ctx->state[7] += local.H; + +    /* Zeroise buffers and variables to clear sensitive data from memory. */ +    mbedtls_platform_zeroize( &local, sizeof( local ) );      return( 0 );  } |