ReactOS 0.4.17-dev-1005-g171e1de
ghash.c File Reference
#include "precomp.h"
#include "ghash_definitions.h"
Include dependency graph for ghash.c:

Go to the source code of this file.

Functions

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 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 SymCryptGHashResult (_In_ PCSYMCRYPT_GF128_ELEMENT pState, _Out_writes_(SYMCRYPT_GF128_BLOCK_SIZE) PBYTE pbResult)
 
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyXmm (_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
 
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)
 

Function Documentation

◆ SymCryptGHashAppendData()

VOID SYMCRYPT_CALL SymCryptGHashAppendData ( _In_ PCSYMCRYPT_GHASH_EXPANDED_KEY  expandedKey,
_Inout_ PSYMCRYPT_GF128_ELEMENT  pState,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 884 of file ghash.c.

889{
890#if SYMCRYPT_CPU_X86
891 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
892 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
893
894 pExpandedKeyTable = (PSYMCRYPT_GF128_ELEMENT)&expandedKey->tableSpace[expandedKey->tableOffset];
895
897 {
898 if( SymCryptSaveXmm( &SaveData ) != SYMCRYPT_NO_ERROR )
899 {
900 SymCryptFatal( 'pclm' );
901 }
903 SymCryptRestoreXmm( &SaveData );
904 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) && SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
905 {
906 SymCryptGHashAppendDataXmm( pExpandedKeyTable, pState, pbData, cbData );
907 SymCryptRestoreXmm( &SaveData );
908 } else {
909 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
910 }
911
912#elif SYMCRYPT_CPU_AMD64
913 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
914
915 pExpandedKeyTable = &expandedKey->table[0];
917 {
919 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) )
920 {
921 SymCryptGHashAppendDataXmm( pExpandedKeyTable, pState, pbData, cbData );
922 } else {
923 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
924 }
925#elif SYMCRYPT_CPU_ARM
926 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
927
928 pExpandedKeyTable = &expandedKey->table[0];
929 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON ) )
930 {
931 SymCryptGHashAppendDataNeon( pExpandedKeyTable, pState, pbData, cbData );
932 } else {
933 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
934 }
935#elif SYMCRYPT_CPU_ARM64
936 PCSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
937
938 pExpandedKeyTable = &expandedKey->table[0];
939 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
940 {
941 SymCryptGHashAppendDataPmull( pExpandedKeyTable, pState, pbData, cbData );
942 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON ) )
943 {
944 SymCryptGHashAppendDataNeon( pExpandedKeyTable, pState, pbData, cbData );
945 } else {
946 SymCryptGHashAppendDataC( pExpandedKeyTable, pState, pbData, cbData );
947 }
948#else
949 SymCryptGHashAppendDataC( &expandedKey->table[0], pState, pbData, cbData );
950#endif
951}
VOID SaveData(HWND hwndDlg)
Definition: volume.c:368
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)
Definition: ghash.c:61
#define SYMCRYPT_CPU_FEATURES_FOR_PCLMULQDQ_CODE
Definition: sc_lib.h:305
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)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
const SYMCRYPT_GF128_ELEMENT * PCSYMCRYPT_GF128_ELEMENT
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)
* PSYMCRYPT_GF128_ELEMENT
PCBYTE PBYTE SIZE_T cbData
PSYMCRYPT_COMMON_HASH_STATE pState
PCBYTE pbData

Referenced by SymCryptAesGcmDecryptPartOnePass(), SymCryptAesGcmEncryptPartOnePass(), SymCryptGcmAddMacData(), SymCryptGcmComputeTag(), SymCryptGcmDecrypt(), SymCryptGcmEncrypt(), SymCryptGcmPadMacData(), and SymCryptGcmSetNonce().

◆ SymCryptGHashAppendDataC()

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 
)

Definition at line 61 of file ghash.c.

66{
67 UINT64 R0, R1;
69 SYMCRYPT_ALIGN UINT32 state32[4];
70 UINT32 t;
71 int i,j;
73 {
74 R0 = R1 = 0;
75
76 //
77 // We have two nested loops so that we can do most of our operations
78 // on 32-bit words. 64-bit rotates/shifts can be really slow on a 32-bit CPU.
79 // On AMD64 we use the XMM version which is much faster.
80 //
81 state32[0] = (UINT32)pState->ull[0];
82 state32[1] = (UINT32)(pState->ull[0] >> 32);
83 state32[2] = (UINT32)pState->ull[1];
84 state32[3] = (UINT32)(pState->ull[1] >> 32);
85 for( i=0; i<4; i++ )
86 {
87 t = SYMCRYPT_LOAD_MSBFIRST32( &pbData[4*i] ) ^ state32[3-i];
88 for( j=31; j>=0; j-- )
89 {
90 mask = (UINT64)( -(INT64)(t & 1 ));
91 R0 ^= expandedKeyTable[32*i+j].ull[0] & mask;
92 R1 ^= expandedKeyTable[32*i+j].ull[1] & mask;
93 t >>= 1;
94 }
95 }
96 pState->ull[0] = R0;
97 pState->ull[1] = R1;
100 }
101
102 SymCryptWipeKnownSize( state32, sizeof( state32 ) );
103}
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
GLdouble GLdouble t
Definition: gl.h:2047
GLenum GLint GLuint mask
Definition: glext.h:6028
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
Definition: glfuncs.h:248
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
Definition: glfuncs.h:250
#define R1(v, w, x, y, z, i)
Definition: sha1.c:36
#define R0(v, w, x, y, z, i)
Definition: sha1.c:35
#define SYMCRYPT_LOAD_MSBFIRST32(p)
Definition: symcrypt.h:303
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_ALIGN
#define SYMCRYPT_GF128_BLOCK_SIZE
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptGHashAppendData().

◆ SymCryptGHashExpandKey()

Definition at line 816 of file ghash.c.

819{
820#if SYMCRYPT_CPU_X86
821 PSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
822 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
823
824 //
825 // Initialize offset into table space for 16-alignment.
826 //
827 expandedKey->tableOffset = (0 -((UINT_PTR) &expandedKey->tableSpace[0])) % sizeof(SYMCRYPT_GF128_ELEMENT);
828
829 pExpandedKeyTable = (PSYMCRYPT_GF128_ELEMENT)&expandedKey->tableSpace[expandedKey->tableOffset];
830
832 {
833 //
834 // We can only use the PCLMULQDQ data representation if the SaveXmm never fails.
835 // This is one of the CPU features required.
836 // We check anyway...
837 //
838 if( SymCryptSaveXmm( &SaveData ) != SYMCRYPT_NO_ERROR )
839 {
840 SymCryptFatal( 'pclm' );
841 }
842 SymCryptGHashExpandKeyPclmulqdq( pExpandedKeyTable, pH );
843 SymCryptRestoreXmm( &SaveData );
844 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) && SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
845 {
846 SymCryptGHashExpandKeyXmm( pExpandedKeyTable, pH );
847 SymCryptRestoreXmm( &SaveData );
848 } else {
849 SymCryptGHashExpandKeyC( pExpandedKeyTable, pH );
850 }
851
852#elif SYMCRYPT_CPU_AMD64
853 PSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
854 pExpandedKeyTable = &expandedKey->table[0];
855
857 {
858 SymCryptGHashExpandKeyPclmulqdq( pExpandedKeyTable, pH );
859 } else if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_SSE2 ) )
860 {
861 SymCryptGHashExpandKeyXmm( pExpandedKeyTable, pH );
862 } else {
863 SymCryptGHashExpandKeyC( pExpandedKeyTable, pH );
864 }
865
866#elif SYMCRYPT_CPU_ARM64
867 PSYMCRYPT_GF128_ELEMENT pExpandedKeyTable;
868 pExpandedKeyTable = &expandedKey->table[0];
869
870 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
871 {
872 SymCryptGHashExpandKeyPmull( pExpandedKeyTable, pH );
873 } else {
874 SymCryptGHashExpandKeyC( pExpandedKeyTable, pH );
875 }
876
877#else
878 SymCryptGHashExpandKeyC( &expandedKey->table[0], pH ); // Default expansion (does not need alignment)
879#endif
880}
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyC(_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
Definition: ghash.c:27
VOID SYMCRYPT_CALL SymCryptGHashExpandKeyXmm(_Out_writes_(SYMCRYPT_GF128_FIELD_SIZE) PSYMCRYPT_GF128_ELEMENT expandedKey, _In_reads_(SYMCRYPT_GF128_BLOCK_SIZE) PCBYTE pH)
Definition: ghash.c:122
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
SYMCRYPT_GF128_ELEMENT

Referenced by SymCryptGcmExpandKey().

◆ SymCryptGHashExpandKeyC()

Definition at line 27 of file ghash.c.

30{
31 UINT64 H0, H1, t;
32 UINT32 i;
33
34 //
35 // (H1, H0) form a 128-bit integer, H1 is the upper part, H0 the lower part.
36 // Convert pH[] to (H1, H0) using MSByte first convention.
37 //
38 H1 = SYMCRYPT_LOAD_MSBFIRST64( &pH[0] );
39 H0 = SYMCRYPT_LOAD_MSBFIRST64( &pH[8] );
40
41 for( i=0; i<SYMCRYPT_GF128_FIELD_SIZE; i++ )
42 {
43 expandedKey[i].ull[0] = H0;
44 expandedKey[i].ull[1] = H1;
45 //
46 // Multiply (H1,H0) by x in the GF(2^128) field using the field encoding from SP800-38D
47 //
48 t = UINT64_NEG(H0 & 1) & ((UINT64)GF128_FIELD_R_BYTE << (8 * ( sizeof( UINT64 ) - 1 )) ) ;
49 H0 = (H0 >> 1) | (H1 << 63);
50 H1 = (H1 >> 1) ^ t;
51 }
52}
#define UINT64_NEG(x)
#define GF128_FIELD_R_BYTE
#define SYMCRYPT_LOAD_MSBFIRST64(p)
Definition: symcrypt.h:304
#define SYMCRYPT_GF128_FIELD_SIZE

Referenced by SymCryptGHashExpandKey(), and SymCryptGHashExpandKeyXmm().

◆ SymCryptGHashExpandKeyXmm()

Definition at line 122 of file ghash.c.

125{
126 //
127 // We use the same layout for XMM code as we did for C code, so we can use the same key
128 // expansion code.
129 // Improvement: we can add an expansion routine that uses the XMM registers for speed.
130 //
131
132 SymCryptGHashExpandKeyC( expandedKey, pH );
133}

Referenced by SymCryptGHashExpandKey().

◆ SymCryptGHashResult()

Definition at line 108 of file ghash.c.

111{
114}
static const BYTE pbResult[]
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
Definition: symcrypt.h:312

Referenced by SymCryptGcmSetNonce().