androidcandroid-ndkpolarssl

PolarSSl bignum.c will cause crash in Android 5.0 and above while using JNI


I use PolorSSL in my ndk project. However, when I run mpi_self_test(), it causes crash in Android 5.0 and above.

int mpi_self_test( int verbose )
{
int ret, i;
mpi A, E, N, X, Y, U, V;

mpi_init( &A ); mpi_init( &E ); mpi_init( &N ); mpi_init( &X );
mpi_init( &Y ); mpi_init( &U ); mpi_init( &V );

MPI_CHK( mpi_read_string( &A, 16,
    "EFE021C2645FD1DC586E69184AF4A31E" \
    "D5F53E93B5F123FA41680867BA110131" \
    "944FE7952E2517337780CB0DB80E61AA" \
    "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );

MPI_CHK( mpi_read_string( &E, 16,
    "B2E7EFD37075B9F03FF989C7C5051C20" \
    "34D2A323810251127E7BF8625A4F49A5" \
    "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
    "5B5C25763222FEFCCFC38B832366C29E" ) );

MPI_CHK( mpi_read_string( &N, 16,
    "0066A198186C18C10B2F5ED9B522752A" \
    "9830B69916E535C8F047518A889A43A5" \
    "94B6BED27A168D31D4A52F88925AA8F5" ) );

MPI_CHK( mpi_mul_mpi( &X, &A, &N ) );

MPI_CHK( mpi_read_string( &U, 16,
    "602AB7ECA597A3D6B56FF9829A5E8B85" \
    "9E857EA95A03512E2BAE7391688D264A" \
    "A5663B0341DB9CCFD2C4C5F421FEC814" \
    "8001B72E848A38CAE1C65F78E56ABDEF" \
    "E12D3C039B8A02D6BE593F0BBBDA56F1" \
    "ECF677152EF804370C1A305CAF3B5BF1" \
    "30879B56C61DE584A0F53A2447A51E" ) );

if( verbose != 0 )
    polarssl_printf( "  MPI test #1 (mul_mpi): " );

if( mpi_cmp_mpi( &X, &U ) != 0 )
{
    if( verbose != 0 )
        polarssl_printf( "failed\n" );

    ret = 1;
    goto cleanup;
}

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

MPI_CHK( mpi_div_mpi( &X, &Y, &A, &N ) );

MPI_CHK( mpi_read_string( &U, 16,
    "256567336059E52CAE22925474705F39A94" ) );

MPI_CHK( mpi_read_string( &V, 16,
    "6613F26162223DF488E9CD48CC132C7A" \
    "0AC93C701B001B092E4E5B9F73BCD27B" \
    "9EE50D0657C77F374E903CDFA4C642" ) );

if( verbose != 0 )
    polarssl_printf( "  MPI test #2 (div_mpi): " );

if( mpi_cmp_mpi( &X, &U ) != 0 ||
    mpi_cmp_mpi( &Y, &V ) != 0 )
{
    if( verbose != 0 )
        polarssl_printf( "failed\n" );

    ret = 1;
    goto cleanup;
}

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

MPI_CHK( mpi_exp_mod( &X, &A, &E, &N, NULL ) );

MPI_CHK( mpi_read_string( &U, 16,
    "36E139AEA55215609D2816998ED020BB" \
    "BD96C37890F65171D948E9BC7CBAA4D9" \
    "325D24D6A3C12710F10A09FA08AB87" ) );

if( verbose != 0 )
    polarssl_printf( "  MPI test #3 (exp_mod): " );

if( mpi_cmp_mpi( &X, &U ) != 0 )
{
    if( verbose != 0 )
        polarssl_printf( "failed\n" );

    ret = 1;
    goto cleanup;
}

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

MPI_CHK( mpi_inv_mod( &X, &A, &N ) );

MPI_CHK( mpi_read_string( &U, 16,
    "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
    "C3DBA76456363A10869622EAC2DD84EC" \
    "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );

if( verbose != 0 )
    polarssl_printf( "  MPI test #4 (inv_mod): " );

if( mpi_cmp_mpi( &X, &U ) != 0 )
{
    if( verbose != 0 )
        polarssl_printf( "failed\n" );

    ret = 1;
    goto cleanup;
}

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

if( verbose != 0 )
    polarssl_printf( "  MPI test #5 (simple gcd): " );

for( i = 0; i < GCD_PAIR_COUNT; i++ )
{
    MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) );
    MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) );

    MPI_CHK( mpi_gcd( &A, &X, &Y ) );

    if( mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 )
    {
        if( verbose != 0 )
            polarssl_printf( "failed at %d\n", i );

        ret = 1;
        goto cleanup;
    }
}

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

cleanup:

if( ret != 0 && verbose != 0 )
    polarssl_printf( "Unexpected error, return code = %08X\n", ret );

mpi_free( &A ); mpi_free( &E ); mpi_free( &N ); mpi_free( &X );
mpi_free( &Y ); mpi_free( &U ); mpi_free( &V );

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

return( ret );
}

And I find the problem is in the mpi_function, like mpi_mul_hlp()

void mpi_mul_hlp( size_t i, t_uint *s, t_uint *d, t_uint b )
{
t_uint c = 0, t = 0;

#if defined(MULADDC_HUIT)
for( ; i >= 8; i -= 8 )
{
    MULADDC_INIT
    MULADDC_HUIT
    MULADDC_STOP
}

for( ; i > 0; i-- )
{
    MULADDC_INIT
    MULADDC_CORE
    MULADDC_STOP
}
#else /* MULADDC_HUIT */
for( ; i >= 16; i -= 16 )
{
    MULADDC_INIT
    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE

    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE
    MULADDC_STOP
}

for( ; i >= 8; i -= 8 )
{
    MULADDC_INIT
    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE

    MULADDC_CORE   MULADDC_CORE
    MULADDC_CORE   MULADDC_CORE
    MULADDC_STOP
}

for( ; i > 0; i-- )
{
    MULADDC_INIT
    MULADDC_CORE
    MULADDC_STOP
}
#endif /* MULADDC_HUIT */

t++;

do {
    *d += c; c = ( *d < c ); d++;
}
while( c != 0 );
}

I find it is asm code difined in bn_mul.h.

 /*
     *      Multiply source vector [s] with b, add result
     *       to destination vector [d] and set carry c.
     *
     *      Currently supports:
     *
     *         . IA-32 (386+)         . AMD64 / EM64T
     *         . IA-32 (SSE2)         . Motorola 68000
     *         . PowerPC, 32-bit      . MicroBlaze
     *         . PowerPC, 64-bit      . TriCore
     *         . SPARC v8             . ARM v3+
     *         . Alpha                . MIPS32
     *         . C, longlong          . C, generic
     */
    #ifndef POLARSSL_BN_MUL_H
    #define POLARSSL_BN_MUL_H

    #include "BigNum.h"

    #if defined(POLARSSL_HAVE_ASM)

    #if defined(__GNUC__)
    #if defined(__i386__)

    #define MULADDC_INIT                \
    asm( "                          \
        movl   %%ebx, %0;           \
        movl   %5, %%esi;           \
        movl   %6, %%edi;           \
        movl   %7, %%ecx;           \
        movl   %8, %%ebx;           \
        "

    #define MULADDC_CORE                \
        "                           \
        lodsl;                      \
        mull   %%ebx;               \
        addl   %%ecx,   %%eax;      \
        adcl   $0,      %%edx;      \
        addl   (%%edi), %%eax;      \
        adcl   $0,      %%edx;      \
        movl   %%edx,   %%ecx;      \
        stosl;                      \
        "

    #if defined(POLARSSL_HAVE_SSE2)

    #define MULADDC_HUIT                    \
        "                               \
        movd     %%ecx,     %%mm1;      \
        movd     %%ebx,     %%mm0;      \
        movd     (%%edi),   %%mm3;      \
        paddq    %%mm3,     %%mm1;      \
        movd     (%%esi),   %%mm2;      \
        pmuludq  %%mm0,     %%mm2;      \
        movd     4(%%esi),  %%mm4;      \
        pmuludq  %%mm0,     %%mm4;      \
        movd     8(%%esi),  %%mm6;      \
        pmuludq  %%mm0,     %%mm6;      \
        movd     12(%%esi), %%mm7;      \
        pmuludq  %%mm0,     %%mm7;      \
        paddq    %%mm2,     %%mm1;      \
        movd     4(%%edi),  %%mm3;      \
        paddq    %%mm4,     %%mm3;      \
        movd     8(%%edi),  %%mm5;      \
        paddq    %%mm6,     %%mm5;      \
        movd     12(%%edi), %%mm4;      \
        paddq    %%mm4,     %%mm7;      \
        movd     %%mm1,     (%%edi);    \
        movd     16(%%esi), %%mm2;      \
        pmuludq  %%mm0,     %%mm2;      \
        psrlq    $32,       %%mm1;      \
        movd     20(%%esi), %%mm4;      \
        pmuludq  %%mm0,     %%mm4;      \
        paddq    %%mm3,     %%mm1;      \
        movd     24(%%esi), %%mm6;      \
        pmuludq  %%mm0,     %%mm6;      \
        movd     %%mm1,     4(%%edi);   \
        psrlq    $32,       %%mm1;      \
        movd     28(%%esi), %%mm3;      \
        pmuludq  %%mm0,     %%mm3;      \
        paddq    %%mm5,     %%mm1;      \
        movd     16(%%edi), %%mm5;      \
        paddq    %%mm5,     %%mm2;      \
        movd     %%mm1,     8(%%edi);   \
        psrlq    $32,       %%mm1;      \
        paddq    %%mm7,     %%mm1;      \
        movd     20(%%edi), %%mm5;      \
        paddq    %%mm5,     %%mm4;      \
        movd     %%mm1,     12(%%edi);  \
        psrlq    $32,       %%mm1;      \
        paddq    %%mm2,     %%mm1;      \
        movd     24(%%edi), %%mm5;      \
        paddq    %%mm5,     %%mm6;      \
        movd     %%mm1,     16(%%edi);  \
        psrlq    $32,       %%mm1;      \
        paddq    %%mm4,     %%mm1;      \
        movd     28(%%edi), %%mm5;      \
        paddq    %%mm5,     %%mm3;      \
        movd     %%mm1,     20(%%edi);  \
        psrlq    $32,       %%mm1;      \
        paddq    %%mm6,     %%mm1;      \
        movd     %%mm1,     24(%%edi);  \
        psrlq    $32,       %%mm1;      \
        paddq    %%mm3,     %%mm1;      \
        movd     %%mm1,     28(%%edi);  \
        addl     $32,       %%edi;      \
        addl     $32,       %%esi;      \
        psrlq    $32,       %%mm1;      \
        movd     %%mm1,     %%ecx;      \
        "

    #define MULADDC_STOP            \
        "                       \
        emms;                   \
        movl   %4, %%ebx;       \
        movl   %%ecx, %1;       \
        movl   %%edi, %2;       \
        movl   %%esi, %3;       \
        "                       \
        : "=m" (t), "=m" (c), "=m" (d), "=m" (s)        \
        : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b)   \
        : "eax", "ecx", "edx", "esi", "edi"             \
    );

    #else

    #define MULADDC_STOP            \
        "                       \
        movl   %4, %%ebx;       \
        movl   %%ecx, %1;       \
        movl   %%edi, %2;       \
        movl   %%esi, %3;       \
        "                       \
        : "=m" (t), "=m" (c), "=m" (d), "=m" (s)        \
        : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b)   \
        : "eax", "ecx", "edx", "esi", "edi"             \
    );
    #endif /* SSE2 */
    #endif /* i386 */

    #if defined(__amd64__) || defined (__x86_64__)

....However,I do not know why it works well in Android 4,4

#ifndef POLARSSL_CONFIG_H
#define POLARSSL_CONFIG_H
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE 1
#endif
#define POLARSSL_HAVE_LONGLONG
#define POLARSSL_HAVE_ASM
#define POLARSSL_HAVE_READDIR_R
#define POLARSSL_HAVE_TIME
#define POLARSSL_CIPHER_MODE_CBC
#define POLARSSL_CIPHER_MODE_CFB
#define POLARSSL_CIPHER_MODE_CTR
#define POLARSSL_CIPHER_NULL_CIPHER
#define POLARSSL_CIPHER_PADDING_PKCS7
#define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS
#define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN
#define POLARSSL_CIPHER_PADDING_ZEROS
#define POLARSSL_ENABLE_WEAK_CIPHERSUITES
#define POLARSSL_ECP_NIST_OPTIM
#define POLARSSL_ERROR_STRERROR_BC
#define POLARSSL_ERROR_STRERROR_DUMMY
#define POLARSSL_FS_IO
#define POLARSSL_PKCS1_V15
 #define POLARSSL_SELF_TEST
#define POLARSSL_SSL_ALERT_MESSAGES
#define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
#define POLARSSL_SSL_MAX_FRAGMENT_LENGTH
#define POLARSSL_SSL_SESSION_TICKETS
#define POLARSSL_SSL_SERVER_NAME_INDICATION
#define POLARSSL_SSL_TRUNCATED_HMAC
#define POLARSSL_BASE64_C
// #define POLARSSL_AES_C
// #define POLARSSL_ASN1_PARSE_C
#define POLARSSL_BIGNUM_C
// #define POLARSSL_CTR_DRBG_C
#define POLARSSL_MD_C
#define POLARSSL_OID_C
// #define POLARSSL_PK_C
#define POLARSSL_RSA_C

#if defined(POLARSSL_CONFIG_OPTIONS)
#define POLARSSL_MPI_WINDOW_SIZE            6 /**< Maximum windows size used. */
#define POLARSSL_MPI_MAX_SIZE             512 /**< Maximum number of bytes for usable MPIs. */
#define CTR_DRBG_ENTROPY_LEN               48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */
#define CTR_DRBG_RESEED_INTERVAL        10000 /**< Interval before reseed is performed by default */
#define CTR_DRBG_MAX_INPUT                256 /**< Maximum number of additional input bytes */
#define CTR_DRBG_MAX_REQUEST             1024 /**< Maximum number of requested bytes per call */
#define CTR_DRBG_MAX_SEED_INPUT           384 /**< Maximum size of (re)seed buffer */
#define ENTROPY_MAX_SOURCES                20 /**< Maximum number of sources supported */
#define ENTROPY_MAX_GATHER                128 /**< Maximum amount requested from entropy sources */
#define MEMORY_ALIGN_MULTIPLE               4 /**< Align on multiples of this value */
#define POLARSSL_MEMORY_STDMALLOC      malloc /**< Default allocator to use, can be undefined */
#define POLARSSL_MEMORY_STDFREE          free /**< Default free to use, can be undefined */
#define SSL_CACHE_DEFAULT_TIMEOUT       86400 /**< 1 day  */
#define SSL_CACHE_DEFAULT_MAX_ENTRIES      50 /**< Maximum entries in cache */
#define SSL_MAX_CONTENT_LEN             16384 /**< Size of the input / output buffer */
#define SSL_DEFAULT_TICKET_LIFETIME     86400 /**< Lifetime of session tickets (if enabled) */
#endif /* POLARSSL_CONFIG_OPTIONS */

/*
 * Sanity checks on defines and dependencies
 */
#if defined(POLARSSL_CERTS_C) && !defined(POLARSSL_PEM_PARSE_C)
#error "POLARSSL_CERTS_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_CTR_DRBG_C) && !defined(POLARSSL_AES_C)
#error "POLARSSL_CTR_DRBG_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_DHM_C) && !defined(POLARSSL_BIGNUM_C)
#error "POLARSSL_DHM_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_ECDH_C) && !defined(POLARSSL_ECP_C)
#error "POLARSSL_ECDH_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_ECDSA_C) &&            \
    ( !defined(POLARSSL_ECP_C) ||           \
      !defined(POLARSSL_ASN1_PARSE_C) ||    \
      !defined(POLARSSL_ASN1_WRITE_C) )
#error "POLARSSL_ECDSA_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_ECP_C) && ( !defined(POLARSSL_BIGNUM_C) || (   \
    !defined(POLARSSL_ECP_DP_SECP192R1_ENABLED) &&                  \
    !defined(POLARSSL_ECP_DP_SECP224R1_ENABLED) &&                  \
    !defined(POLARSSL_ECP_DP_SECP256R1_ENABLED) &&                  \
    !defined(POLARSSL_ECP_DP_SECP384R1_ENABLED) &&                  \
    !defined(POLARSSL_ECP_DP_SECP521R1_ENABLED) &&                  \
    !defined(POLARSSL_ECP_DP_BP256R1_ENABLED)   &&                  \
    !defined(POLARSSL_ECP_DP_BP384R1_ENABLED)   &&                  \
    !defined(POLARSSL_ECP_DP_BP512R1_ENABLED) ) )
#error "POLARSSL_ECP_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_ENTROPY_C) && (!defined(POLARSSL_SHA512_C) &&      \
                                    !defined(POLARSSL_SHA256_C))
#error "POLARSSL_ENTROPY_C defined, but not all prerequisites"
#endif
#if defined(POLARSSL_ENTROPY_C) && defined(POLARSSL_SHA512_C) &&         \
    defined(POLARSSL_CONFIG_OPTIONS) && (CTR_DRBG_ENTROPY_LEN > 64)
#error "CTR_DRBG_ENTROPY_LEN value too high"
#endif
#if defined(POLARSSL_ENTROPY_C) && !defined(POLARSSL_SHA512_C) &&        \
    defined(POLARSSL_CONFIG_OPTIONS) && (CTR_DRBG_ENTROPY_LEN > 32)
#error "CTR_DRBG_ENTROPY_LEN value too high"
#endif

#if defined(POLARSSL_GCM_C) && (                                        \
        !defined(POLARSSL_AES_C) && !defined(POLARSSL_CAMELLIA_C) )
#error "POLARSSL_GCM_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_HAVEGE_C) && !defined(POLARSSL_TIMING_C)
#error "POLARSSL_HAVEGE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(POLARSSL_DHM_C)
#error "POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites"
#endif

#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED) &&                     \
    !defined(POLARSSL_ECDH_C)
#error "POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites"
#endif

#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) &&                   \
    ( !defined(POLARSSL_DHM_C) || !defined(POLARSSL_RSA_C) ||           \
      !defined(POLARSSL_X509_CRT_PARSE_C) || !defined(POLARSSL_PKCS1_V15) )
#error "POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites"
#endif

#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) &&                 \
    ( !defined(POLARSSL_ECDH_C) || !defined(POLARSSL_RSA_C) ||          \
      !defined(POLARSSL_X509_CRT_PARSE_C) || !defined(POLARSSL_PKCS1_V15) )
#error "POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites"
#endif

#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) &&                 \
    ( !defined(POLARSSL_ECDH_C) || !defined(POLARSSL_ECDSA_C) ||          \
      !defined(POLARSSL_X509_CRT_PARSE_C) )
#error "POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites"
#endif

#if defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED) &&                   \
    ( !defined(POLARSSL_RSA_C) || !defined(POLARSSL_X509_CRT_PARSE_C) ||\
      !defined(POLARSSL_PKCS1_V15) )
#error "POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites"
#endif

#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) &&                       \
    ( !defined(POLARSSL_RSA_C) || !defined(POLARSSL_X509_CRT_PARSE_C) ||\
      !defined(POLARSSL_PKCS1_V15) )
#error "POLARSSL_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites"
#endif

#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && !defined(POLARSSL_MEMORY_C)
#error "POLARSSL_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_PBKDF2_C) && !defined(POLARSSL_MD_C)
#error "POLARSSL_PBKDF2_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_PEM_PARSE_C) && !defined(POLARSSL_BASE64_C)
#error "POLARSSL_PEM_PARSE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_PEM_WRITE_C) && !defined(POLARSSL_BASE64_C)
#error "POLARSSL_PEM_WRITE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_PK_PARSE_C) && !defined(POLARSSL_PK_C)
#error "POLARSSL_PK_PARSE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_PK_WRITE_C) && !defined(POLARSSL_PK_C)
#error "POLARSSL_PK_WRITE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_PKCS11_C) && !defined(POLARSSL_PK_C)
#error "POLARSSL_PKCS11_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_RSA_C) && ( !defined(POLARSSL_BIGNUM_C) ||         \
    !defined(POLARSSL_OID_C) )
#error "POLARSSL_RSA_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_PROTO_SSL3) && ( !defined(POLARSSL_MD5_C) ||     \
    !defined(POLARSSL_SHA1_C) )
#error "POLARSSL_SSL_PROTO_SSL3 defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_PROTO_TLS1) && ( !defined(POLARSSL_MD5_C) ||     \
    !defined(POLARSSL_SHA1_C) )
#error "POLARSSL_SSL_PROTO_TLS1 defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_PROTO_TLS1_1) && ( !defined(POLARSSL_MD5_C) ||     \
    !defined(POLARSSL_SHA1_C) )
#error "POLARSSL_SSL_PROTO_TLS1_1 defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_PROTO_TLS1_2) && ( !defined(POLARSSL_SHA1_C) &&     \
    !defined(POLARSSL_SHA256_C) && !defined(POLARSSL_SHA512_C) )
#error "POLARSSL_SSL_PROTO_TLS1_2 defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_CLI_C) && !defined(POLARSSL_SSL_TLS_C)
#error "POLARSSL_SSL_CLI_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_TLS_C) && ( !defined(POLARSSL_CIPHER_C) ||     \
    !defined(POLARSSL_MD_C) )
#error "POLARSSL_SSL_TLS_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_SRV_C) && !defined(POLARSSL_SSL_TLS_C)
#error "POLARSSL_SSL_SRV_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_SSL_TLS_C) && (!defined(POLARSSL_SSL_PROTO_SSL3) && \
    !defined(POLARSSL_SSL_PROTO_TLS1) && !defined(POLARSSL_SSL_PROTO_TLS1_1) && \
    !defined(POLARSSL_SSL_PROTO_TLS1_2))
#error "POLARSSL_SSL_TLS_C defined, but no protocols are active"
#endif

#if defined(POLARSSL_SSL_TLS_C) && (defined(POLARSSL_SSL_PROTO_SSL3) && \
    defined(POLARSSL_SSL_PROTO_TLS1_1) && !defined(POLARSSL_SSL_PROTO_TLS1))
#error "Illegal protocol selection"
#endif

#if defined(POLARSSL_SSL_TLS_C) && (defined(POLARSSL_SSL_PROTO_TLS1) && \
    defined(POLARSSL_SSL_PROTO_TLS1_2) && !defined(POLARSSL_SSL_PROTO_TLS1_1))
#error "Illegal protocol selection"
#endif

#if defined(POLARSSL_SSL_TLS_C) && (defined(POLARSSL_SSL_PROTO_SSL3) && \
    defined(POLARSSL_SSL_PROTO_TLS1_2) && (!defined(POLARSSL_SSL_PROTO_TLS1) || \
    !defined(POLARSSL_SSL_PROTO_TLS1_1)))
#error "Illegal protocol selection"
#endif

#if defined(POLARSSL_SSL_SESSION_TICKETS) && defined(POLARSSL_SSL_TLS_C) && \
    ( !defined(POLARSSL_AES_C) || !defined(POLARSSL_SHA256_C) ||            \
      !defined(POLARSSL_CIPHER_MODE_CBC) )
#error "POLARSSL_SSL_SESSION_TICKETS_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_THREADING_DUMMY)
#if !defined(POLARSSL_THREADING_C) || defined(POLARSSL_THREADING_IMPL)
#error "POLARSSL_THREADING_DUMMY defined, but not all prerequisites"
#endif
#define POLARSSL_THREADING_IMPL
#endif

#if defined(POLARSSL_THREADING_PTHREAD)
#if !defined(POLARSSL_THREADING_C) || defined(POLARSSL_THREADING_IMPL)
#error "POLARSSL_THREADING_PTHREAD defined, but not all prerequisites"
#endif
#define POLARSSL_THREADING_IMPL
#endif

#if defined(POLARSSL_THREADING_ALT)
#if !defined(POLARSSL_THREADING_C) || defined(POLARSSL_THREADING_IMPL)
#error "POLARSSL_THREADING_ALT defined, but not all prerequisites"
#endif
#define POLARSSL_THREADING_IMPL
#endif

#if defined(POLARSSL_THREADING_C) && !defined(POLARSSL_THREADING_IMPL)
#error "POLARSSL_THREADING_C defined, single threading implementation required"
#endif
#undef POLARSSL_THREADING_IMPL

#if defined(POLARSSL_X509_USE_C) && ( !defined(POLARSSL_BIGNUM_C) ||  \
    !defined(POLARSSL_OID_C) || !defined(POLARSSL_ASN1_PARSE_C) ||      \
    !defined(POLARSSL_PK_PARSE_C) )
#error "POLARSSL_X509_USE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_X509_CREATE_C) && ( !defined(POLARSSL_BIGNUM_C) ||  \
    !defined(POLARSSL_OID_C) || !defined(POLARSSL_ASN1_WRITE_C) ||       \
    !defined(POLARSSL_PK_WRITE_C) )
#error "POLARSSL_X509_CREATE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_X509_CRT_PARSE_C) && ( !defined(POLARSSL_X509_USE_C) )
#error "POLARSSL_X509_CRT_PARSE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_X509_CRL_PARSE_C) && ( !defined(POLARSSL_X509_USE_C) )
#error "POLARSSL_X509_CRL_PARSE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_X509_CSR_PARSE_C) && ( !defined(POLARSSL_X509_USE_C) )
#error "POLARSSL_X509_CSR_PARSE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_X509_CRT_WRITE_C) && ( !defined(POLARSSL_X509_CREATE_C) )
#error "POLARSSL_X509_CRT_WRITE_C defined, but not all prerequisites"
#endif

#if defined(POLARSSL_X509_CSR_WRITE_C) && ( !defined(POLARSSL_X509_CREATE_C) )
#error "POLARSSL_X509_CSR_WRITE_C defined, but not all prerequisites"
#endif

#endif /* config.h */

Solution

  • Simple solution: Remove / disable POLARSSL_HAVE_ASM from your configuration, as it makes mpi_mul_hlp() behave with only C code an no assembly optimizations.