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

Go to the source code of this file.

Macros

#define SYMCRYPT_SCSTABLE_USE64   0
 
#define SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE   16
 
#define SYMCRYPT_SCSTABLE_GROUP_SIZE   4
 
#define SCS_MASK_EQUAL32(_a, _b)   (SYMCRYPT_MASK32_EQ( _a, _b ))
 

Typedefs

typedef UINT32 SYMCRYPT_SCSTABLE_TYPE
 

Functions

UINT32 SYMCRYPT_CALL SymCryptScsTableInit (_Out_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 nElements, UINT32 elementSize)
 
VOID SYMCRYPT_CALL SymCryptScsTableSetBuffer (_Inout_ PSYMCRYPT_SCSTABLE pScsTable, _Inout_updates_bytes_(cbBuffer) PBYTE pbBuffer, UINT32 cbBuffer)
 
 C_ASSERT (SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE==16||SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE==32)
 
VOID SYMCRYPT_CALL SymCryptScsTableStoreC (_Inout_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _In_reads_bytes_(cbData) PCBYTE pbData, UINT32 cbData)
 
VOID SYMCRYPT_CALL SymCryptScsTableLoadC (_In_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _Out_writes_bytes_(cbData) PBYTE pbData, UINT32 cbData)
 
VOID SYMCRYPT_CALL SymCryptScsTableStore (_Inout_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _In_reads_bytes_(cbData) PCBYTE pbData, UINT32 cbData)
 
VOID SYMCRYPT_CALL SymCryptScsTableLoad (_In_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _Out_writes_bytes_(cbData) PBYTE pbData, UINT32 cbData)
 
VOID SYMCRYPT_CALL SymCryptScsTableWipe (_Inout_ PSYMCRYPT_SCSTABLE pScsTable)
 

Macro Definition Documentation

◆ SCS_MASK_EQUAL32

#define SCS_MASK_EQUAL32 (   _a,
  _b 
)    (SYMCRYPT_MASK32_EQ( _a, _b ))

◆ SYMCRYPT_SCSTABLE_GROUP_SIZE

#define SYMCRYPT_SCSTABLE_GROUP_SIZE   4

Definition at line 50 of file ScsTable.c.

◆ SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE

#define SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE   16

Definition at line 49 of file ScsTable.c.

◆ SYMCRYPT_SCSTABLE_USE64

#define SYMCRYPT_SCSTABLE_USE64   0

Definition at line 48 of file ScsTable.c.

Typedef Documentation

◆ SYMCRYPT_SCSTABLE_TYPE

Definition at line 51 of file ScsTable.c.

Function Documentation

◆ C_ASSERT()

◆ SymCryptScsTableInit()

UINT32 SYMCRYPT_CALL SymCryptScsTableInit ( _Out_ PSYMCRYPT_SCSTABLE  pScsTable,
UINT32  nElements,
UINT32  elementSize 
)

Definition at line 56 of file ScsTable.c.

60{
61 UINT32 groupSize;
62 UINT32 interleaveSize;
64
65 SYMCRYPT_ASSERT( nElements > 0 );
66
67#pragma warning( suppress: 4127 ) // conditional expression is constant
68 if( SYMCRYPT_CPU_AMD64 && elementSize == 128 )
69 {
70 // Highly optimized assembler mode for 1024-bit entries for RSA-2048...
71 interleaveSize = 128;
72 groupSize = 1;
73 } else {
74 // Standard C implementation
75 interleaveSize = SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE;
77 }
78
79 // Right now, we limit ourselves to element sizes that are a multiple of the interleaveSize and
80 // # elements that are a multiple of the group size.
81 // We also limit ourselves to sensible input sizes
82 SYMCRYPT_ASSERT( elementSize % interleaveSize == 0 && nElements % groupSize == 0 && (elementSize | nElements) < (1 << 16) && elementSize > 0 );
83
84 cbBuffer = elementSize * nElements; // Each factor is < 2^16, so there is no overflow in the mul
85
86 pScsTable->groupSize = groupSize;
87 pScsTable->interleaveSize = interleaveSize;
88 pScsTable->nElements = nElements;
89 pScsTable->elementSize = elementSize;
90 pScsTable->cbTableData = cbBuffer;
91 pScsTable->pbTableData = NULL;
92
93 return cbBuffer;
94}
#define SYMCRYPT_SCSTABLE_INTERLEAVE_SIZE
Definition: ScsTable.c:49
#define SYMCRYPT_SCSTABLE_GROUP_SIZE
Definition: ScsTable.c:50
#define NULL
Definition: types.h:112
SIZE_T cbBuffer
Definition: sc_lib_mldsa.h:405
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
#define SYMCRYPT_CPU_AMD64
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptModExpWindowed().

◆ SymCryptScsTableLoad()

VOID SYMCRYPT_CALL SymCryptScsTableLoad ( _In_ PSYMCRYPT_SCSTABLE  pScsTable,
UINT32  iIndex,
_Out_writes_bytes_(cbData) PBYTE  pbData,
UINT32  cbData 
)

Definition at line 358 of file ScsTable.c.

363{
364 // This is the side-channel safe routine
365
366#if SYMCRYPT_CPU_AMD64
367
368 if( pScsTable->elementSize == 128 )
369 {
370 SymCryptScsTableLoad128Xmm( pScsTable, iIndex, pbData, cbData );
371 } else {
372 SymCryptScsTableLoadC( pScsTable, iIndex, pbData, cbData );
373 }
374
375#else
376
377 SymCryptScsTableLoadC( pScsTable, iIndex, pbData, cbData );
378
379#endif
380}
VOID SYMCRYPT_CALL SymCryptScsTableLoadC(_In_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _Out_writes_bytes_(cbData) PBYTE pbData, UINT32 cbData)
Definition: ScsTable.c:185
PCBYTE PBYTE SIZE_T cbData
PCBYTE pbData

Referenced by SymCryptModExpWindowed().

◆ SymCryptScsTableLoadC()

VOID SYMCRYPT_CALL SymCryptScsTableLoadC ( _In_ PSYMCRYPT_SCSTABLE  pScsTable,
UINT32  iIndex,
_Out_writes_bytes_(cbData) PBYTE  pbData,
UINT32  cbData 
)

Definition at line 185 of file ScsTable.c.

190{
193 UINT32 elementSize = pScsTable->elementSize;
194
195 SYMCRYPT_SCSTABLE_TYPE mask0, mask1, mask2, mask3;
196 UINT32 i;
197 UINT32 j;
198 UINT32 nElements = pScsTable->nElements;
199
200 const SYMCRYPT_SCSTABLE_TYPE * pSrc = (SYMCRYPT_SCSTABLE_TYPE *) pScsTable->pbTableData;
203
204 UINT32 nInterleaves = elementSize / interleaveSize;
205
206
207 SYMCRYPT_ASSERT( groupSize == pScsTable->groupSize );
208 SYMCRYPT_ASSERT( interleaveSize == pScsTable->interleaveSize );
209
211 SYMCRYPT_ASSERT( cbData == pScsTable->elementSize );
213
214#if SYMCRYPT_SCSTABLE_USE64
215#define SCS_MASK_EQUAL32( _a, _b ) ( ~(UINT64) ((INT64) ((UINT64)0 - (_a ^ _b)) >> 32 ) )
216#else
217#define SCS_MASK_EQUAL32( _a, _b ) (SYMCRYPT_MASK32_EQ( _a, _b ))
218#endif
219
220 i = 0;
221
222 mask0 = SCS_MASK_EQUAL32( i+0, iIndex );
223 mask1 = SCS_MASK_EQUAL32( i+1, iIndex );
224 mask2 = SCS_MASK_EQUAL32( i+2, iIndex );
225 mask3 = SCS_MASK_EQUAL32( i+3, iIndex );
226
227 j = nInterleaves;
228 pD = pDst;
229
230 do {
231 pD[0] = (mask0 & pSrc[0]) | (mask1 & pSrc[4]) | (mask2 & pSrc[ 8]) | (mask3 & pSrc[12]);
232 pD[1] = (mask0 & pSrc[1]) | (mask1 & pSrc[5]) | (mask2 & pSrc[ 9]) | (mask3 & pSrc[13]);
233 pD[2] = (mask0 & pSrc[2]) | (mask1 & pSrc[6]) | (mask2 & pSrc[10]) | (mask3 & pSrc[14]);
234 pD[3] = (mask0 & pSrc[3]) | (mask1 & pSrc[7]) | (mask2 & pSrc[11]) | (mask3 & pSrc[15]);
235 pD += interleaveSize / sizeof( *pD );
236 pSrc += interleaveSize * groupSize / sizeof( *pSrc );
237 j--;
238 } while( j > 0 );
239
240 i += groupSize;
241
242 while (i + groupSize <= nElements)
243 {
244
245 mask0 = SCS_MASK_EQUAL32( i+0, iIndex );
246 mask1 = SCS_MASK_EQUAL32( i+1, iIndex );
247 mask2 = SCS_MASK_EQUAL32( i+2, iIndex );
248 mask3 = SCS_MASK_EQUAL32( i+3, iIndex );
249
250 j = nInterleaves;
251 pD = pDst;
252
253 do {
254 pD[0] |= (mask0 & pSrc[0]) | (mask1 & pSrc[4]) | (mask2 & pSrc[ 8]) | (mask3 & pSrc[12]);
255 pD[1] |= (mask0 & pSrc[1]) | (mask1 & pSrc[5]) | (mask2 & pSrc[ 9]) | (mask3 & pSrc[13]);
256 pD[2] |= (mask0 & pSrc[2]) | (mask1 & pSrc[6]) | (mask2 & pSrc[10]) | (mask3 & pSrc[14]);
257 pD[3] |= (mask0 & pSrc[3]) | (mask1 & pSrc[7]) | (mask2 & pSrc[11]) | (mask3 & pSrc[15]);
258 pD += interleaveSize / sizeof( *pD );
259 pSrc += interleaveSize * groupSize / sizeof( *pSrc );
260 j--;
261 } while( j > 0 );
262
263 i += groupSize;
264 }
265}
UINT32 SYMCRYPT_SCSTABLE_TYPE
Definition: ScsTable.c:51
#define SCS_MASK_EQUAL32(_a, _b)
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 UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329

Referenced by SymCryptScsTableLoad().

◆ SymCryptScsTableSetBuffer()

VOID SYMCRYPT_CALL SymCryptScsTableSetBuffer ( _Inout_ PSYMCRYPT_SCSTABLE  pScsTable,
_Inout_updates_bytes_(cbBuffer) PBYTE  pbBuffer,
UINT32  cbBuffer 
)

Definition at line 98 of file ScsTable.c.

102{
103 SYMCRYPT_ASSERT(cbBuffer >= pScsTable->cbTableData);
105
106 pScsTable->pbTableData = pbBuffer;
107}

Referenced by SymCryptModExpWindowed().

◆ SymCryptScsTableStore()

VOID SYMCRYPT_CALL SymCryptScsTableStore ( _Inout_ PSYMCRYPT_SCSTABLE  pScsTable,
UINT32  iIndex,
_In_reads_bytes_(cbData) PCBYTE  pbData,
UINT32  cbData 
)

Definition at line 334 of file ScsTable.c.

339{
340#if SYMCRYPT_CPU_AMD64
341
342 if( pScsTable->elementSize == 128 )
343 {
344 SymCryptScsTableStore128Xmm( pScsTable, iIndex, pbData, cbData );
345 } else {
346 SymCryptScsTableStoreC( pScsTable, iIndex, pbData, cbData );
347 }
348
349#else
350
351 SymCryptScsTableStoreC( pScsTable, iIndex, pbData, cbData );
352
353#endif
354}
VOID SYMCRYPT_CALL SymCryptScsTableStoreC(_Inout_ PSYMCRYPT_SCSTABLE pScsTable, UINT32 iIndex, _In_reads_bytes_(cbData) PCBYTE pbData, UINT32 cbData)
Definition: ScsTable.c:116

Referenced by SymCryptModExpWindowed().

◆ SymCryptScsTableStoreC()

VOID SYMCRYPT_CALL SymCryptScsTableStoreC ( _Inout_ PSYMCRYPT_SCSTABLE  pScsTable,
UINT32  iIndex,
_In_reads_bytes_(cbData) PCBYTE  pbData,
UINT32  cbData 
)

Definition at line 116 of file ScsTable.c.

121{
124 UINT32 elementSize = pScsTable->elementSize;
125 UINT32 groupOffset;
126
127 SYMCRYPT_ASSERT( groupSize == pScsTable->groupSize );
128 SYMCRYPT_ASSERT( interleaveSize == pScsTable->interleaveSize );
129
130 SYMCRYPT_ASSERT( cbData == elementSize );
132
133 SYMCRYPT_ASSERT(iIndex < pScsTable->nElements);
134
135 groupOffset = iIndex % groupSize;
136
137 // dcl - document why this can't be an integer overflow
138 SYMCRYPT_SCSTABLE_TYPE * pDst = (SYMCRYPT_SCSTABLE_TYPE *) (pScsTable->pbTableData + (iIndex - groupOffset) * elementSize + groupOffset * interleaveSize);
140
141 UINT32 nInterleaves = elementSize / interleaveSize;
142
143 do
144 {
145 pDst[0] = pSrc[0];
146 pDst[1] = pSrc[1];
147 pDst[2] = pSrc[2];
148 pDst[3] = pSrc[3];
149
150 pDst += interleaveSize * groupSize / sizeof( *pDst );
151 pSrc += interleaveSize / sizeof( *pSrc );
152 nInterleaves--;
153 } while( nInterleaves > 0 );
154
155}

Referenced by SymCryptScsTableStore().

◆ SymCryptScsTableWipe()

VOID SYMCRYPT_CALL SymCryptScsTableWipe ( _Inout_ PSYMCRYPT_SCSTABLE  pScsTable)

Definition at line 384 of file ScsTable.c.

386{
387 SymCryptWipe( pScsTable->pbTableData, pScsTable->cbTableData );
388}
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137