/*
 *  RIPE MD-160 implementation
 *
 *  Copyright The Mbed TLS Contributors
 *  SPDX-License-Identifier: Apache-2.0
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 *  not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/*
 *  The RIPEMD-160 algorithm was designed by RIPE in 1996
 *  http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html
 *  http://ehash.iaik.tugraz.at/wiki/RIPEMD-160
 */

#include "common.h"

#if defined(MBEDTLS_RIPEMD160_C)

#include "mbedtls/ripemd160.h"
#include "mbedtls/platform_util.h"
#include "mbedtls/error.h"

#include <string.h>

#include "mbedtls/platform.h"

#if !defined(MBEDTLS_RIPEMD160_ALT)

void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx )
{
    memset( ctx, 0, sizeof( mbedtls_ripemd160_context ) );
}

void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx )
{
    if( ctx == NULL )
        return;

    mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ripemd160_context ) );
}

void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst,
                        const mbedtls_ripemd160_context *src )
{
    *dst = *src;
}

/*
 * RIPEMD-160 context setup
 */
int mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx )
{
    ctx->total[0] = 0;
    ctx->total[1] = 0;

    ctx->state[0] = 0x67452301;
    ctx->state[1] = 0xEFCDAB89;
    ctx->state[2] = 0x98BADCFE;
    ctx->state[3] = 0x10325476;
    ctx->state[4] = 0xC3D2E1F0;

    return( 0 );
}

#if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT)
/*
 * Process one block
 */
int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
                                        const unsigned char data[64] )
{
    struct
    {
        uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
    } local;

    local.X[ 0] = MBEDTLS_GET_UINT32_LE( data,  0 );
    local.X[ 1] = MBEDTLS_GET_UINT32_LE( data,  4 );
    local.X[ 2] = MBEDTLS_GET_UINT32_LE( data,  8 );
    local.X[ 3] = MBEDTLS_GET_UINT32_LE( data, 12 );
    local.X[ 4] = MBEDTLS_GET_UINT32_LE( data, 16 );
    local.X[ 5] = MBEDTLS_GET_UINT32_LE( data, 20 );
    local.X[ 6] = MBEDTLS_GET_UINT32_LE( data, 24 );
    local.X[ 7] = MBEDTLS_GET_UINT32_LE( data, 28 );
    local.X[ 8] = MBEDTLS_GET_UINT32_LE( data, 32 );
    local.X[ 9] = MBEDTLS_GET_UINT32_LE( data, 36 );
    local.X[10] = MBEDTLS_GET_UINT32_LE( data, 40 );
    local.X[11] = MBEDTLS_GET_UINT32_LE( data, 44 );
    local.X[12] = MBEDTLS_GET_UINT32_LE( data, 48 );
    local.X[13] = MBEDTLS_GET_UINT32_LE( data, 52 );
    local.X[14] = MBEDTLS_GET_UINT32_LE( data, 56 );
    local.X[15] = MBEDTLS_GET_UINT32_LE( data, 60 );

    local.A = local.Ap = ctx->state[0];
    local.B = local.Bp = ctx->state[1];
    local.C = local.Cp = ctx->state[2];
    local.D = local.Dp = ctx->state[3];
    local.E = local.Ep = ctx->state[4];

#define F1( x, y, z )   ( (x) ^ (y) ^ (z) )
#define F2( x, y, z )   ( ( (x) & (y) ) | ( ~(x) & (z) ) )
#define F3( x, y, z )   ( ( (x) | ~(y) ) ^ (z) )
#define F4( x, y, z )   ( ( (x) & (z) ) | ( (y) & ~(z) ) )
#define F5( x, y, z )   ( (x) ^ ( (y) | ~(z) ) )

#define S( x, n ) ( ( (x) << (n) ) | ( (x) >> (32 - (n)) ) )

#define P( a, b, c, d, e, r, s, f, k )                      \
    do                                                      \
    {                                                       \
        (a) += f( (b), (c), (d) ) + local.X[r] + (k);       \
        (a) = S( (a), (s) ) + (e);                          \
        (c) = S( (c), 10 );                                 \
    } while( 0 )

#define P2( a, b, c, d, e, r, s, rp, sp )                               \
    do                                                                  \
    {                                                                   \
        P( (a), (b), (c), (d), (e), (r), (s), F, K );                   \
        P( a ## p, b ## p, c ## p, d ## p, e ## p,                      \
           (rp), (sp), Fp, Kp );                                        \
    } while( 0 )

#define F   F1
#define K   0x00000000
#define Fp  F5
#define Kp  0x50A28BE6
    P2( local.A, local.B, local.C, local.D, local.E,  0, 11,  5,  8 );
    P2( local.E, local.A, local.B, local.C, local.D,  1, 14, 14,  9 );
    P2( local.D, local.E, local.A, local.B, local.C,  2, 15,  7,  9 );
    P2( local.C, local.D, local.E, local.A, local.B,  3, 12,  0, 11 );
    P2( local.B, local.C, local.D, local.E, local.A,  4,  5,  9, 13 );
    P2( local.A, local.B, local.C, local.D, local.E,  5,  8,  2, 15 );
    P2( local.E, local.A, local.B, local.C, local.D,  6,  7, 11, 15 );
    P2( local.D, local.E, local.A, local.B, local.C,  7,  9,  4,  5 );
    P2( local.C, local.D, local.E, local.A, local.B,  8, 11, 13,  7 );
    P2( local.B, local.C, local.D, local.E, local.A,  9, 13,  6,  7 );
    P2( local.A, local.B, local.C, local.D, local.E, 10, 14, 15,  8 );
    P2( local.E, local.A, local.B, local.C, local.D, 11, 15,  8, 11 );
    P2( local.D, local.E, local.A, local.B, local.C, 12,  6,  1, 14 );
    P2( local.C, local.D, local.E, local.A, local.B, 13,  7, 10, 14 );
    P2( local.B, local.C, local.D, local.E, local.A, 14,  9,  3, 12 );
    P2( local.A, local.B, local.C, local.D, local.E, 15,  8, 12,  6 );
#undef F
#undef K
#undef Fp
#undef Kp

#define F   F2
#define K   0x5A827999
#define Fp  F4
#define Kp  0x5C4DD124
    P2( local.E, local.A, local.B, local.C, local.D,  7,  7,  6,  9 );
    P2( local.D, local.E, local.A, local.B, local.C,  4,  6, 11, 13 );
    P2( local.C, local.D, local.E, local.A, local.B, 13,  8,  3, 15 );
    P2( local.B, local.C, local.D, local.E, local.A,  1, 13,  7,  7 );
    P2( local.A, local.B, local.C, local.D, local.E, 10, 11,  0, 12 );
    P2( local.E, local.A, local.B, local.C, local.D,  6,  9, 13,  8 );
    P2( local.D, local.E, local.A, local.B, local.C, 15,  7,  5,  9 );
    P2( local.C, local.D, local.E, local.A, local.B,  3, 15, 10, 11 );
    P2( local.B, local.C, local.D, local.E, local.A, 12,  7, 14,  7 );
    P2( local.A, local.B, local.C, local.D, local.E,  0, 12, 15,  7 );
    P2( local.E, local.A, local.B, local.C, local.D,  9, 15,  8, 12 );
    P2( local.D, local.E, local.A, local.B, local.C,  5,  9, 12,  7 );
    P2( local.C, local.D, local.E, local.A, local.B,  2, 11,  4,  6 );
    P2( local.B, local.C, local.D, local.E, local.A, 14,  7,  9, 15 );
    P2( local.A, local.B, local.C, local.D, local.E, 11, 13,  1, 13 );
    P2( local.E, local.A, local.B, local.C, local.D,  8, 12,  2, 11 );
#undef F
#undef K
#undef Fp
#undef Kp

#define F   F3
#define K   0x6ED9EBA1
#define Fp  F3
#define Kp  0x6D703EF3
    P2( local.D, local.E, local.A, local.B, local.C,  3, 11, 15,  9 );
    P2( local.C, local.D, local.E, local.A, local.B, 10, 13,  5,  7 );
    P2( local.B, local.C, local.D, local.E, local.A, 14,  6,  1, 15 );
    P2( local.A, local.B, local.C, local.D, local.E,  4,  7,  3, 11 );
    P2( local.E, local.A, local.B, local.C, local.D,  9, 14,  7,  8 );
    P2( local.D, local.E, local.A, local.B, local.C, 15,  9, 14,  6 );
    P2( local.C, local.D, local.E, local.A, local.B,  8, 13,  6,  6 );
    P2( local.B, local.C, local.D, local.E, local.A,  1, 15,  9, 14 );
    P2( local.A, local.B, local.C, local.D, local.E,  2, 14, 11, 12 );
    P2( local.E, local.A, local.B, local.C, local.D,  7,  8,  8, 13 );
    P2( local.D, local.E, local.A, local.B, local.C,  0, 13, 12,  5 );
    P2( local.C, local.D, local.E, local.A, local.B,  6,  6,  2, 14 );
    P2( local.B, local.C, local.D, local.E, local.A, 13,  5, 10, 13 );
    P2( local.A, local.B, local.C, local.D, local.E, 11, 12,  0, 13 );
    P2( local.E, local.A, local.B, local.C, local.D,  5,  7,  4,  7 );
    P2( local.D, local.E, local.A, local.B, local.C, 12,  5, 13,  5 );
#undef F
#undef K
#undef Fp
#undef Kp

#define F   F4
#define K   0x8F1BBCDC
#define Fp  F2
#define Kp  0x7A6D76E9
    P2( local.C, local.D, local.E, local.A, local.B,  1, 11,  8, 15 );
    P2( local.B, local.C, local.D, local.E, local.A,  9, 12,  6,  5 );
    P2( local.A, local.B, local.C, local.D, local.E, 11, 14,  4,  8 );
    P2( local.E, local.A, local.B, local.C, local.D, 10, 15,  1, 11 );
    P2( local.D, local.E, local.A, local.B, local.C,  0, 14,  3, 14 );
    P2( local.C, local.D, local.E, local.A, local.B,  8, 15, 11, 14 );
    P2( local.B, local.C, local.D, local.E, local.A, 12,  9, 15,  6 );
    P2( local.A, local.B, local.C, local.D, local.E,  4,  8,  0, 14 );
    P2( local.E, local.A, local.B, local.C, local.D, 13,  9,  5,  6 );
    P2( local.D, local.E, local.A, local.B, local.C,  3, 14, 12,  9 );
    P2( local.C, local.D, local.E, local.A, local.B,  7,  5,  2, 12 );
    P2( local.B, local.C, local.D, local.E, local.A, 15,  6, 13,  9 );
    P2( local.A, local.B, local.C, local.D, local.E, 14,  8,  9, 12 );
    P2( local.E, local.A, local.B, local.C, local.D,  5,  6,  7,  5 );
    P2( local.D, local.E, local.A, local.B, local.C,  6,  5, 10, 15 );
    P2( local.C, local.D, local.E, local.A, local.B,  2, 12, 14,  8 );
#undef F
#undef K
#undef Fp
#undef Kp

#define F   F5
#define K   0xA953FD4E
#define Fp  F1
#define Kp  0x00000000
    P2( local.B, local.C, local.D, local.E, local.A,  4,  9, 12,  8 );
    P2( local.A, local.B, local.C, local.D, local.E,  0, 15, 15,  5 );
    P2( local.E, local.A, local.B, local.C, local.D,  5,  5, 10, 12 );
    P2( local.D, local.E, local.A, local.B, local.C,  9, 11,  4,  9 );
    P2( local.C, local.D, local.E, local.A, local.B,  7,  6,  1, 12 );
    P2( local.B, local.C, local.D, local.E, local.A, 12,  8,  5,  5 );
    P2( local.A, local.B, local.C, local.D, local.E,  2, 13,  8, 14 );
    P2( local.E, local.A, local.B, local.C, local.D, 10, 12,  7,  6 );
    P2( local.D, local.E, local.A, local.B, local.C, 14,  5,  6,  8 );
    P2( local.C, local.D, local.E, local.A, local.B,  1, 12,  2, 13 );
    P2( local.B, local.C, local.D, local.E, local.A,  3, 13, 13,  6 );
    P2( local.A, local.B, local.C, local.D, local.E,  8, 14, 14,  5 );
    P2( local.E, local.A, local.B, local.C, local.D, 11, 11,  0, 15 );
    P2( local.D, local.E, local.A, local.B, local.C,  6,  8,  3, 13 );
    P2( local.C, local.D, local.E, local.A, local.B, 15,  5,  9, 11 );
    P2( local.B, local.C, local.D, local.E, local.A, 13,  6, 11, 11 );
#undef F
#undef K
#undef Fp
#undef Kp

    local.C       = ctx->state[1] + local.C + local.Dp;
    ctx->state[1] = ctx->state[2] + local.D + local.Ep;
    ctx->state[2] = ctx->state[3] + local.E + local.Ap;
    ctx->state[3] = ctx->state[4] + local.A + local.Bp;
    ctx->state[4] = ctx->state[0] + local.B + local.Cp;
    ctx->state[0] = local.C;

    /* Zeroise variables to clear sensitive data from memory. */
    mbedtls_platform_zeroize( &local, sizeof( local ) );

    return( 0 );
}

#endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */

/*
 * RIPEMD-160 process buffer
 */
int mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,
                                  const unsigned char *input,
                                  size_t ilen )
{
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    size_t fill;
    uint32_t left;

    if( ilen == 0 )
        return( 0 );

    left = ctx->total[0] & 0x3F;
    fill = 64 - left;

    ctx->total[0] += (uint32_t) ilen;
    ctx->total[0] &= 0xFFFFFFFF;

    if( ctx->total[0] < (uint32_t) ilen )
        ctx->total[1]++;

    if( left && ilen >= fill )
    {
        memcpy( (void *) (ctx->buffer + left), input, fill );

        if( ( ret = mbedtls_internal_ripemd160_process( ctx, ctx->buffer ) ) != 0 )
            return( ret );

        input += fill;
        ilen  -= fill;
        left = 0;
    }

    while( ilen >= 64 )
    {
        if( ( ret = mbedtls_internal_ripemd160_process( ctx, input ) ) != 0 )
            return( ret );

        input += 64;
        ilen  -= 64;
    }

    if( ilen > 0 )
    {
        memcpy( (void *) (ctx->buffer + left), input, ilen );
    }

    return( 0 );
}

static const unsigned char ripemd160_padding[64] =
{
 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/*
 * RIPEMD-160 final digest
 */
int mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx,
                                  unsigned char output[20] )
{
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    uint32_t last, padn;
    uint32_t high, low;
    unsigned char msglen[8];

    high = ( ctx->total[0] >> 29 )
         | ( ctx->total[1] <<  3 );
    low  = ( ctx->total[0] <<  3 );

    MBEDTLS_PUT_UINT32_LE( low,  msglen, 0 );
    MBEDTLS_PUT_UINT32_LE( high, msglen, 4 );

    last = ctx->total[0] & 0x3F;
    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );

    ret = mbedtls_ripemd160_update( ctx, ripemd160_padding, padn );
    if( ret != 0 )
        return( ret );

    ret = mbedtls_ripemd160_update( ctx, msglen, 8 );
    if( ret != 0 )
        return( ret );

    MBEDTLS_PUT_UINT32_LE( ctx->state[0], output,  0 );
    MBEDTLS_PUT_UINT32_LE( ctx->state[1], output,  4 );
    MBEDTLS_PUT_UINT32_LE( ctx->state[2], output,  8 );
    MBEDTLS_PUT_UINT32_LE( ctx->state[3], output, 12 );
    MBEDTLS_PUT_UINT32_LE( ctx->state[4], output, 16 );

    return( 0 );
}

#endif /* ! MBEDTLS_RIPEMD160_ALT */

/*
 * output = RIPEMD-160( input buffer )
 */
int mbedtls_ripemd160( const unsigned char *input,
                           size_t ilen,
                           unsigned char output[20] )
{
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    mbedtls_ripemd160_context ctx;

    mbedtls_ripemd160_init( &ctx );

    if( ( ret = mbedtls_ripemd160_starts( &ctx ) ) != 0 )
        goto exit;

    if( ( ret = mbedtls_ripemd160_update( &ctx, input, ilen ) ) != 0 )
        goto exit;

    if( ( ret = mbedtls_ripemd160_finish( &ctx, output ) ) != 0 )
        goto exit;

exit:
    mbedtls_ripemd160_free( &ctx );

    return( ret );
}

#if defined(MBEDTLS_SELF_TEST)
/*
 * Test vectors from the RIPEMD-160 paper and
 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC
 */
#define TESTS   8
static const unsigned char ripemd160_test_str[TESTS][81] =
{
    { "" },
    { "a" },
    { "abc" },
    { "message digest" },
    { "abcdefghijklmnopqrstuvwxyz" },
    { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
    { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
    { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" },
};

static const size_t ripemd160_test_strlen[TESTS] =
{
    0, 1, 3, 14, 26, 56, 62, 80
};

static const unsigned char ripemd160_test_md[TESTS][20] =
{
    { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
      0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },
    { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
      0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },
    { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
      0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },
    { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
      0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },
    { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
      0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },
    { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
      0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },
    { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,
      0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },
    { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,
      0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },
};

/*
 * Checkup routine
 */
int mbedtls_ripemd160_self_test( int verbose )
{
    int i, ret = 0;
    unsigned char output[20];

    memset( output, 0, sizeof output );

    for( i = 0; i < TESTS; i++ )
    {
        if( verbose != 0 )
            mbedtls_printf( "  RIPEMD-160 test #%d: ", i + 1 );

        ret = mbedtls_ripemd160( ripemd160_test_str[i],
                                     ripemd160_test_strlen[i], output );
        if( ret != 0 )
            goto fail;

        if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 )
        {
            ret = 1;
            goto fail;
        }

        if( verbose != 0 )
            mbedtls_printf( "passed\n" );
    }

    if( verbose != 0 )
        mbedtls_printf( "\n" );

    return( 0 );

fail:
    if( verbose != 0 )
        mbedtls_printf( "failed\n" );

    return( ret );
}

#endif /* MBEDTLS_SELF_TEST */

#endif /* MBEDTLS_RIPEMD160_C */
