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

Go to the source code of this file.

Macros

#define IS_UINT32_ALIGNED(__p)   ((((intptr_t)__p) & 3) == 0)
 
#define NEED_ALIGN   (!(SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM | SYMCRYPT_CPU_ARM64))
 

Functions

 SYMCRYPT_ALIGN_AT (256)
 
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyC (_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesEncryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbPlaintext, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbCiphertext)
 
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesDecryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbCiphertext, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbPlaintext)
 
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesEcbDecryptC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 

Macro Definition Documentation

◆ IS_UINT32_ALIGNED

#define IS_UINT32_ALIGNED (   __p)    ((((intptr_t)__p) & 3) == 0)

◆ NEED_ALIGN

Function Documentation

◆ SYMCRYPT_ALIGN_AT()

SYMCRYPT_ALIGN_AT ( 256  )

Definition at line 36 of file aes-c.c.

72{
73 pOut[0] = SymCryptAesSboxMatrixMult[0][pIn[0]][1];
74 pOut[1] = SymCryptAesSboxMatrixMult[0][pIn[1]][1];
75 pOut[2] = SymCryptAesSboxMatrixMult[0][pIn[2]][1];
76 pOut[3] = SymCryptAesSboxMatrixMult[0][pIn[3]][1];
77}

◆ SymCryptAesCreateDecryptionRoundKeyC()

VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyC ( _In_reads_(16) PCBYTE  pEncryptionRoundKey,
_Out_writes_(16) PBYTE  pDecryptionRoundKey 
)

Definition at line 81 of file aes-c.c.

90{
91 int i;
92 PBYTE p = pDecryptionRoundKey;
93 PCBYTE q = pEncryptionRoundKey;
94
95 for( i=0; i<4; i++ ) {
96 *(UINT32 *)p =
97 *(UINT32 *)SymCryptAesInvMatrixMult[0][q[0]] ^
98 *(UINT32 *)SymCryptAesInvMatrixMult[1][q[1]] ^
99 *(UINT32 *)SymCryptAesInvMatrixMult[2][q[2]] ^
100 *(UINT32 *)SymCryptAesInvMatrixMult[3][q[3]];
101 p += 4;
102 q += 4;
103 }
104
105}
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLfloat GLfloat p
Definition: glext.h:8902
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
BYTE * PBYTE
Definition: pedump.c:66
const BYTE * PCBYTE
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptAesCreateDecryptionRoundKey().

◆ SymCryptAesDecryptC()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesDecryptC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE  pbCiphertext,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbPlaintext 
)

Definition at line 242 of file aes-c.c.

246{
247 SYMCRYPT_ALIGN BYTE state[4][4] = { 0 };
248 SYMCRYPT_ALIGN UINT32 state2[4] = { 0 };
249
250 const BYTE (*keyPtr)[4][4];
251 const BYTE (*keyLimit)[4][4];
252
253#if NEED_ALIGN
255#endif
256
257#if NEED_ALIGN
258 //
259 // Callers who don't have their buffers aligned don't care about speed,
260 // so we do this in the simplest way.
261 //
262 if( !(IS_UINT32_ALIGNED( pbPlaintext ) & IS_UINT32_ALIGNED( pbCiphertext )) ) {
263 memcpy( alignBuffer, pbCiphertext, SYMCRYPT_AES_BLOCK_SIZE );
264 SymCryptAesDecrypt( pExpandedKey, alignBuffer, alignBuffer );
265 memcpy( pbPlaintext, alignBuffer, SYMCRYPT_AES_BLOCK_SIZE );
266 SymCryptWipeKnownSize( alignBuffer, sizeof( alignBuffer ) );
267 return;
268 }
269#endif
270
272
273 keyPtr = &pExpandedKey->lastEncRoundKey[0]; // First round key
274 keyLimit = &pExpandedKey->lastDecRoundKey[0]; // Last round key
275
276 // Initial round (AddRoundKey)
277 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ *(UINT32 *) &pbCiphertext[0];
278 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ *(UINT32 *) &pbCiphertext[4];
279 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ *(UINT32 *) &pbCiphertext[8];
280 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ *(UINT32 *) &pbCiphertext[12];
281
282 keyPtr += 1;
283
284 // Main rounds
285 while (keyPtr < keyLimit)
286 {
287
288 // SubBytes/ShiftRows/MixColumns for col. 0
289 state2[0] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[0][0] ]);
290 state2[1] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[0][1] ]);
291 state2[2] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[0][2] ]);
292 state2[3] = *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[0][3] ]);
293
294 // SubBytes/ShiftRows/MixColumns for col. 1
295 state2[1] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[1][0] ]);
296 state2[2] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[1][1] ]);
297 state2[3] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[1][2] ]);
298 state2[0] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[1][3] ]);
299
300 // SubBytes/ShiftRows/MixColumns for col. 2
301 state2[2] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[2][0] ]);
302 state2[3] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[2][1] ]);
303 state2[0] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[2][2] ]);
304 state2[1] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[2][3] ]);
305
306 // SubBytes/ShiftRows/MixColumns for col. 3
307 state2[3] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[0][ state[3][0] ]);
308 state2[0] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[1][ state[3][1] ]);
309 state2[1] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[2][ state[3][2] ]);
310 state2[2] ^= *((UINT32 *) &SymCryptAesInvSboxMatrixMult[3][ state[3][3] ]);
311
312 // AddRoundKey
313 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
314 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
315 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
316 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
317
318 keyPtr += 1;
319 }
320
321 // Final round
322
323 // SubBytes/ShiftRows for col. 0
324 state2[0] = (UINT32) SymCryptAesInvSbox[ state[0][0] ];
325 state2[1] = (UINT32) SymCryptAesInvSbox[ state[0][1] ] << 8;
326 state2[2] = (UINT32) SymCryptAesInvSbox[ state[0][2] ] << 16;
327 state2[3] = (UINT32) SymCryptAesInvSbox[ state[0][3] ] << 24;
328
329 // SubBytes/ShiftRows for col. 1
330 state2[1] |= (UINT32) SymCryptAesInvSbox[ state[1][0] ];
331 state2[2] |= (UINT32) SymCryptAesInvSbox[ state[1][1] ] << 8;
332 state2[3] |= (UINT32) SymCryptAesInvSbox[ state[1][2] ] << 16;
333 state2[0] |= (UINT32) SymCryptAesInvSbox[ state[1][3] ] << 24;
334
335 // SubBytes/ShiftRows for col. 2
336 state2[2] |= (UINT32) SymCryptAesInvSbox[ state[2][0] ];
337 state2[3] |= (UINT32) SymCryptAesInvSbox[ state[2][1] ] << 8;
338 state2[0] |= (UINT32) SymCryptAesInvSbox[ state[2][2] ] << 16;
339 state2[1] |= (UINT32) SymCryptAesInvSbox[ state[2][3] ] << 24;
340
341 // SubBytes/ShiftRows for col. 3
342 state2[3] |= (UINT32) SymCryptAesInvSbox[ state[3][0] ];
343 state2[0] |= (UINT32) SymCryptAesInvSbox[ state[3][1] ] << 8;
344 state2[1] |= (UINT32) SymCryptAesInvSbox[ state[3][2] ] << 16;
345 state2[2] |= (UINT32) SymCryptAesInvSbox[ state[3][3] ] << 24;
346
347 // AddRoundKey
348 *((UINT32 *) &pbPlaintext[0 ]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
349 *((UINT32 *) &pbPlaintext[4 ]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
350 *((UINT32 *) &pbPlaintext[8 ]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
351 *((UINT32 *) &pbPlaintext[12]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
352
353 SymCryptWipeKnownSize( state, sizeof( state ) );
354 SymCryptWipeKnownSize( state2, sizeof( state2 ) );
355
356 return;
357}
#define IS_UINT32_ALIGNED(__p)
static int state
Definition: maze.c:121
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
VOID SYMCRYPT_CALL SymCryptAesDecrypt(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
Definition: aes-default.c:134
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_AES_BLOCK_SIZE
Definition: symcrypt.h:4255
#define SYMCRYPT_ALIGN
#define SYMCRYPT_CHECK_MAGIC(p)
PCVOID pExpandedKey
unsigned char BYTE
Definition: xxhash.c:193

Referenced by SymCryptAesDecrypt(), and SymCryptAesEcbDecryptC().

◆ SymCryptAesEcbDecryptC()

VOID SYMCRYPT_CALL SymCryptAesEcbDecryptC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 378 of file aes-c.c.

383{
385 {
390 }
391}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesDecryptC(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbCiphertext, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbPlaintext)
Definition: aes-c.c:242
PCBYTE pbSrc
PCBYTE PBYTE SIZE_T cbData
PCBYTE PBYTE pbDst

◆ SymCryptAesEcbEncryptC()

VOID SYMCRYPT_CALL SymCryptAesEcbEncryptC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 361 of file aes-c.c.

366{
368 {
373 }
374}
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesEncryptC(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbPlaintext, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbCiphertext)
Definition: aes-c.c:115

Referenced by SymCryptAesEcbEncrypt().

◆ SymCryptAesEncryptC()

SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptAesEncryptC ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE  pbPlaintext,
_Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbCiphertext 
)

Definition at line 115 of file aes-c.c.

119{
120 SYMCRYPT_ALIGN BYTE state[4][4] = { 0 };
121 SYMCRYPT_ALIGN UINT32 state2[4] = { 0 };
122
123 const BYTE (*keyPtr)[4][4];
124 const BYTE (*keyLimit)[4][4];
125
126#if NEED_ALIGN
128#endif
129
130#if NEED_ALIGN
131
132 //
133 // Callers who don't have their buffers aligned don't care about speed,
134 // so we do this in the simplest way.
135 //
136 if( !(IS_UINT32_ALIGNED( pbPlaintext ) & IS_UINT32_ALIGNED( pbCiphertext )) ) {
137 memcpy( alignBuffer, pbPlaintext, SYMCRYPT_AES_BLOCK_SIZE );
138 SymCryptAesEncrypt( pExpandedKey, alignBuffer, alignBuffer );
139 memcpy( pbCiphertext, alignBuffer, SYMCRYPT_AES_BLOCK_SIZE );
140 SymCryptWipeKnownSize( alignBuffer, sizeof( alignBuffer ) );
141 return;
142 }
143#endif
144
146
147 //
148 // From this point on all our data is UINT32 aligned or better on those
149 // platforms that have alignment restrictions.
150 //
151
152 keyPtr = &pExpandedKey->RoundKey[0]; // First round key
153 keyLimit = &pExpandedKey->lastEncRoundKey[0]; // Last round key
154
155 // Initial round (AddRoundKey)
156 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ *(UINT32 *) &pbPlaintext[0];
157 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ *(UINT32 *) &pbPlaintext[4];
158 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ *(UINT32 *) &pbPlaintext[8];
159 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ *(UINT32 *) &pbPlaintext[12];
160
161 keyPtr += 1;
162
163 // Main rounds
164 while (keyPtr < keyLimit)
165 {
166
167 // SubBytes/ShiftRows/MixColumns for col. 0
168 state2[0] = *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[0][0] ]);
169 state2[3] = *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[0][1] ]);
170 state2[2] = *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[0][2] ]);
171 state2[1] = *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[0][3] ]);
172
173 // SubBytes/ShiftRows/MixColumns for col. 1
174 state2[1] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[1][0] ]);
175 state2[0] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[1][1] ]);
176 state2[3] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[1][2] ]);
177 state2[2] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[1][3] ]);
178
179 // SubBytes/ShiftRows/MixColumns for col. 2
180 state2[2] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[2][0] ]);
181 state2[1] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[2][1] ]);
182 state2[0] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[2][2] ]);
183 state2[3] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[2][3] ]);
184
185 // SubBytes/ShiftRows/MixColumns for col. 3
186 state2[3] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[0][ state[3][0] ]);
187 state2[2] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[1][ state[3][1] ]);
188 state2[1] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[2][ state[3][2] ]);
189 state2[0] ^= *((UINT32 *) &SymCryptAesSboxMatrixMult[3][ state[3][3] ]);
190
191 // AddRoundKey
192 *((UINT32 *) &state[0][0]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
193 *((UINT32 *) &state[1][0]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
194 *((UINT32 *) &state[2][0]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
195 *((UINT32 *) &state[3][0]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
196
197 keyPtr += 1;
198 }
199
200 // Final round
201
202 // SubBytes/ShiftRows for col. 0
203 state2[0] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][0] ][1];
204 state2[3] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][1] ][1] << 8;
205 state2[2] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][2] ][1] << 16;
206 state2[1] = (UINT32) SymCryptAesSboxMatrixMult[0][ state[0][3] ][1] << 24;
207
208 // SubBytes/ShiftRows for col. 1
209 state2[1] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][0] ][1];
210 state2[0] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][1] ][1] << 8;
211 state2[3] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][2] ][1] << 16;
212 state2[2] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[1][3] ][1] << 24;
213
214 // SubBytes/ShiftRows for col. 2
215 state2[2] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][0] ][1];
216 state2[1] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][1] ][1] << 8;
217 state2[0] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][2] ][1] << 16;
218 state2[3] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[2][3] ][1] << 24;
219
220 // SubBytes/ShiftRows for col. 3
221 state2[3] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][0] ][1];
222 state2[2] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][1] ][1] << 8;
223 state2[1] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][2] ][1] << 16;
224 state2[0] |= (UINT32) SymCryptAesSboxMatrixMult[0][ state[3][3] ][1] << 24;
225
226 // AddRoundKey
227 *((UINT32 *) &pbCiphertext[0 ]) = *(UINT32 *) (*keyPtr)[0] ^ state2[0];
228 *((UINT32 *) &pbCiphertext[4 ]) = *(UINT32 *) (*keyPtr)[1] ^ state2[1];
229 *((UINT32 *) &pbCiphertext[8 ]) = *(UINT32 *) (*keyPtr)[2] ^ state2[2];
230 *((UINT32 *) &pbCiphertext[12]) = *(UINT32 *) (*keyPtr)[3] ^ state2[3];
231
232 SymCryptWipeKnownSize( state, sizeof( state ) );
233 SymCryptWipeKnownSize( state2, sizeof( state2 ) );
234
235 return;
236}
VOID SYMCRYPT_CALL SymCryptAesEncrypt(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
Definition: aes-default.c:95

Referenced by SymCryptAesEcbEncryptC(), and SymCryptAesEncrypt().