43 expandedKey[
i].ull[0] = H0;
44 expandedKey[
i].ull[1] = H1;
49 H0 = (H0 >> 1) | (H1 << 63);
88 for(
j=31;
j>=0;
j-- )
91 R0 ^= expandedKeyTable[32*
i+
j].ull[0] &
mask;
92 R1 ^= expandedKeyTable[32*
i+
j].ull[1] &
mask;
135#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
138#pragma clang attribute push (__attribute__((target("sse2"))), apply_to=function)
140#pragma GCC push_options
141#pragma GCC target("sse2")
177 p = &expandedKeyTable[0];
178 pLimit = &expandedKeyTable[32];
242#pragma clang attribute pop
244#pragma GCC pop_options
249#if SYMCRYPT_CPU_ARM | SYMCRYPT_CPU_ARM64
282 cmpValue = vdupq_n_u32(0);
291 p = &expandedKeyTable[0];
292 pLimit = &expandedKeyTable[32];
307 T = vdupq_n_u32(
t );
318 mask = vcgtq_s32( cmpValue,
T );
319 T = vaddq_u32(
T,
T );
323 mask = vcgtq_s32( cmpValue,
T );
324 T = vaddq_u32(
T,
T );
328 mask = vcgtq_s32( cmpValue,
T );
329 T = vaddq_u32(
T,
T );
333 mask = vcgtq_s32( cmpValue,
T );
334 T = vaddq_u32(
T,
T );
514#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
517#pragma clang attribute push (__attribute__((target("ssse3,pclmul"))), apply_to=function)
519#pragma GCC push_options
520#pragma GCC target("ssse3,pclmul")
525SymCryptGHashExpandKeyPclmulqdq(
530 __m128i
H, Hx,
H2, H2x;
531 __m128i t0, t1, t2, t3, t4, t5;
532 __m128i Hi_even, Hix_even, Hi_odd, Hix_odd;
534 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
535 __m128i vMultiplicationConstant =
_mm_set_epi32( 0, 0, 0xc2000000, 0 );
556 H = _mm_shuffle_epi8(
H, BYTE_REVERSE_ORDER );
562 CLMUL_X_3(
H, Hx,
H, Hx, t0, t1, t2 );
563 CLMUL_3_POST( t0, t1, t2 );
564 MODREDUCE( vMultiplicationConstant, t0, t1, t2,
H2 );
572 for(
i=2;
i<SYMCRYPT_GHASH_PCLMULQDQ_HPOWERS;
i+=2 )
574 CLMUL_X_3(
H, Hx, Hi_even, Hix_even, t0, t1, t2 );
575 CLMUL_3_POST( t0, t1, t2 );
576 CLMUL_X_3(
H2, H2x, Hi_even, Hix_even, t3, t4, t5 );
577 CLMUL_3_POST( t3, t4, t5 );
578 MODREDUCE( vMultiplicationConstant, t0, t1, t2, Hi_odd );
579 MODREDUCE( vMultiplicationConstant, t3, t4, t5, Hi_even );
613 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
614 __m128i vMultiplicationConstant =
_mm_set_epi32( 0, 0, 0xc2000000, 0 );
629 data = _mm_shuffle_epi8(
data, BYTE_REVERSE_ORDER );
633 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
641 data = _mm_shuffle_epi8(
data, BYTE_REVERSE_ORDER );
646 CLMUL_ACC_3(
data, Hi, Hix, a0,
a1,
a2 );
649 CLMUL_3_POST( a0,
a1,
a2 );
650 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
658#pragma clang attribute pop
660#pragma GCC pop_options
665#if SYMCRYPT_CPU_ARM64
668#pragma clang attribute push (__attribute__((target("aes"))), apply_to=function)
670#pragma GCC push_options
671#pragma GCC target("aes")
676SymCryptGHashExpandKeyPmull(
681 __n128
H, Hx,
H2, H2x;
682 __n128 t0, t1, t2, t3, t4, t5;
683 __n128 Hi_even, Hix_even, Hi_odd, Hix_odd;
684 const __n64 vMultiplicationConstant = SYMCRYPT_SET_N64_U64(0xc200000000000000);
704 Hx = vrev64q_u8(
H );
705 H = vextq_u8( Hx, Hx, 8 );
706 Hx = veorq_u8(
H, Hx );
708 GHASH_H_POWER(expandedKey, 1) =
H;
709 GHASH_Hx_POWER(expandedKey, 1) = Hx;
711 CLMUL_X_3(
H, Hx,
H, Hx, t0, t1, t2 );
712 CLMUL_3_POST( t0, t1, t2 );
713 MODREDUCE( vMultiplicationConstant, t0, t1, t2,
H2 );
714 H2x = veorq_u8(
H2, vextq_u8(
H2,
H2, 8 ) );
715 GHASH_H_POWER(expandedKey, 2) =
H2;
716 GHASH_Hx_POWER(expandedKey, 2) = H2x;
721 for(
i=2;
i<SYMCRYPT_GHASH_PMULL_HPOWERS;
i+=2 )
723 CLMUL_X_3(
H, Hx, Hi_even, Hix_even, t0, t1, t2 );
724 CLMUL_3_POST( t0, t1, t2 );
725 CLMUL_X_3(
H2, H2x, Hi_even, Hix_even, t3, t4, t5 );
726 CLMUL_3_POST( t3, t4, t5 );
727 MODREDUCE( vMultiplicationConstant, t0, t1, t2, Hi_odd );
728 MODREDUCE( vMultiplicationConstant, t3, t4, t5, Hi_even );
729 Hix_odd = veorq_u8( Hi_odd, vextq_u8( Hi_odd, Hi_odd, 8 ) );
730 Hix_even = veorq_u8( Hi_even, vextq_u8( Hi_even, Hi_even, 8 ) );
732 GHASH_H_POWER(expandedKey,
i + 1) = Hi_odd;
733 GHASH_H_POWER(expandedKey,
i + 2) = Hi_even;
734 GHASH_Hx_POWER(expandedKey,
i + 1) = Hix_odd;
735 GHASH_Hx_POWER(expandedKey,
i + 2) = Hix_even;
741SymCryptGHashAppendDataPmull(
751 const __n64 vMultiplicationConstant = SYMCRYPT_SET_N64_U64(0xc200000000000000);
773 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
781 datax = vrev64q_u8( *(__n128 *)
pbData );
782 data = vextq_u8( datax, datax, 8 );
783 datax = veorq_u8(
data, datax );
786 Hi = GHASH_H_POWER(expandedKeyTable,
todo -
i);
787 Hix = GHASH_Hx_POWER(expandedKeyTable,
todo -
i);
788 CLMUL_ACCX_3(
data, datax, Hi, Hix, a0,
a1,
a2 );
791 CLMUL_3_POST( a0,
a1,
a2 );
792 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
800#pragma clang attribute pop
802#pragma GCC pop_options
822 SYMCRYPT_EXTENDED_SAVE_DATA
SaveData;
838 if( SymCryptSaveXmm( &
SaveData ) != SYMCRYPT_NO_ERROR )
842 SymCryptGHashExpandKeyPclmulqdq( pExpandedKeyTable, pH );
852#elif SYMCRYPT_CPU_AMD64
854 pExpandedKeyTable = &expandedKey->table[0];
858 SymCryptGHashExpandKeyPclmulqdq( pExpandedKeyTable, pH );
866#elif SYMCRYPT_CPU_ARM64
868 pExpandedKeyTable = &expandedKey->table[0];
872 SymCryptGHashExpandKeyPmull( pExpandedKeyTable, pH );
892 SYMCRYPT_EXTENDED_SAVE_DATA
SaveData;
898 if( SymCryptSaveXmm( &
SaveData ) != SYMCRYPT_NO_ERROR )
912#elif SYMCRYPT_CPU_AMD64
915 pExpandedKeyTable = &expandedKey->table[0];
925#elif SYMCRYPT_CPU_ARM
928 pExpandedKeyTable = &expandedKey->table[0];
935#elif SYMCRYPT_CPU_ARM64
938 pExpandedKeyTable = &expandedKey->table[0];
COMPILER_DEPENDENT_INT64 INT64
COMPILER_DEPENDENT_UINT64 UINT64
VOID SaveData(HWND hwndDlg)
void _mm_storeu_si128(__m128i_u *p, __m128i b)
__m128i _mm_set_epi8(char b15, char b14, char b13, char b12, char b11, char b10, char b9, char b8, char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0)
__m128i _mm_set_epi32(int i3, int i2, int i1, int i0)
void _mm_store_si128(__m128i *p, __m128i b)
__m128i _mm_setzero_si128(void)
__m128i _mm_xor_si128(__m128i a, __m128i b)
__m128i _mm_load_si128(__m128i const *p)
__m128i _mm_and_si128(__m128i a, __m128i b)
__m128i _mm_srli_si128(__m128i a, int imm)
__m128i _mm_add_epi32(__m128i a, __m128i b)
__m128i _mm_cmpgt_epi32(__m128i a, __m128i b)
__m128i _mm_loadu_si128(__m128i_u const *p)
VOID SYMCRYPT_CALL SymCryptGHashAppendDataC(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyC(_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
VOID SYMCRYPT_CALL SymCryptGHashResult(_In_ PCSYMCRYPT_GF128_ELEMENT pState, _Out_writes_(SYMCRYPT_GF128_BLOCK_SIZE) PBYTE pbResult)
VOID SYMCRYPT_CALL SymCryptGHashExpandKey(_Out_ PSYMCRYPT_GHASH_EXPANDED_KEY expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
VOID SYMCRYPT_CALL SymCryptGHashAppendData(_In_ PCSYMCRYPT_GHASH_EXPANDED_KEY expandedKey, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyXmm(_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
#define GF128_FIELD_R_BYTE
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
static const struct update_accum a1
static const struct update_accum a2
unsigned __int3264 UINT_PTR
#define SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE
VOID SYMCRYPT_CALL SymCryptGHashAppendDataXmm(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptGHashAppendDataPclmulqdq(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptGHashAppendDataNeon(_In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
#define REVERSE_BYTES(Destination, Source)
#define R1(v, w, x, y, z, i)
#define R0(v, w, x, y, z, i)
static const BYTE pbResult[]
#define SYMCRYPT_ASSERT(_x)
#define SYMCRYPT_LOAD_MSBFIRST32(p)
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
#define SYMCRYPT_LOAD_MSBFIRST64(p)
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
const SYMCRYPT_GF128_ELEMENT * PCSYMCRYPT_GF128_ELEMENT
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)
#define SYMCRYPT_GF128_FIELD_SIZE
#define SYMCRYPT_GF128_BLOCK_SIZE
#define SYMCRYPT_MIN(_a, _b)
* PSYMCRYPT_GF128_ELEMENT
PCBYTE PBYTE SIZE_T cbData
const SYMCRYPT_GHASH_EXPANDED_KEY * PCSYMCRYPT_GHASH_EXPANDED_KEY
PSYMCRYPT_COMMON_HASH_STATE pState
* PSYMCRYPT_GHASH_EXPANDED_KEY