/* This function multiplies a field element by x in the polynomial field representation. It uses 64-bit word operations to gain speed but compensates for machine endianess and hence works correctly on both big and little endian machines.  */
static void esp_gf128mul_x_ble(unsigned char r[16], const unsigned char x[16])
/* This function multiplies a field element by x in the polynomial field representation. It uses 64-bit word operations to gain speed but compensates for machine endianess and hence works correctly on both big and little endian machines.  */
static void esp_gf128mul_x_ble(unsigned char r[16], const unsigned char x[16])
{
    uint64_t a, b, ra, rb;
    GET_UINT64_LE( a, x, 0 );
    GET_UINT64_LE( b, x, 8 );
    ra = ( a << 1 )  ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
    rb = ( a >> 63 ) | ( b << 1 );
    PUT_UINT64_LE( ra, r, 0 );
    PUT_UINT64_LE( rb, r, 8 );
}