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

Go to the source code of this file.

Functions

VOID SYMCRYPT_CALL SymCryptAes4Sbox (_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut, BOOL UseSimd)
 
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKey (_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey, BOOL UseSimd)
 
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)
 
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)
 
VOID SYMCRYPT_CALL SymCryptAesCbcEncrypt (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcDecrypt (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesEcbEncrypt (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesEcbDecrypt (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCbcMac (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64 (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPartOnePass (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPartOnePass (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPart (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPart (_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 

Variables

const SYMCRYPT_BLOCKCIPHER SymCryptAesBlockCipherNoOpt
 

Function Documentation

◆ SymCryptAes4Sbox()

VOID SYMCRYPT_CALL SymCryptAes4Sbox ( _In_reads_(4) PCBYTE  pIn,
_Out_writes_(4) PBYTE  pOut,
BOOL  UseSimd 
)

Definition at line 44 of file aes-default.c.

45{
46#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
47 if( UseSimd )
48 {
49 SymCryptAes4SboxXmm( pIn, pOut );
50 } else {
51 SymCryptAes4SboxC( pIn, pOut );
52 }
53#elif SYMCRYPT_CPU_ARM64
54 if( UseSimd )
55 {
56 SymCryptAes4SboxNeon( pIn, pOut );
57 } else {
58 SymCryptAes4SboxC( pIn, pOut );
59 }
60#else
61 UNREFERENCED_PARAMETER( UseSimd );
62 SymCryptAes4SboxC( pIn, pOut ); // never use XMM on SaveXmm arch, save/restore overhead is too large.
63#endif
64}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
VOID SYMCRYPT_CALL SymCryptAes4SboxNeon(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
VOID SYMCRYPT_CALL SymCryptAes4SboxC(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
VOID SYMCRYPT_CALL SymCryptAes4SboxXmm(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)

Referenced by SymCryptAesExpandKeyInternal().

◆ SymCryptAesCbcDecrypt()

VOID SYMCRYPT_CALL SymCryptAesCbcDecrypt ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 214 of file aes-default.c.

220{
221#if SYMCRYPT_CPU_AMD64
223 {
225 } else {
227 }
228#elif SYMCRYPT_CPU_X86
229 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
230
232 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
233 {
235 SymCryptRestoreXmm( &SaveData );
236 } else {
238 }
239#elif SYMCRYPT_CPU_ARM
241#elif SYMCRYPT_CPU_ARM64
242 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
243 {
245 } else {
247 }
248#else
250#endif
251}
const SYMCRYPT_BLOCKCIPHER SymCryptAesBlockCipherNoOpt
Definition: aes-default.c:20
VOID SaveData(HWND hwndDlg)
Definition: volume.c:368
VOID SYMCRYPT_CALL SymCryptAesCbcDecryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCbcDecryptNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCbcDecryptAsm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE
Definition: sc_lib.h:307
VOID SYMCRYPT_CALL SymCryptCbcDecrypt(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
PBYTE pbChainingValue
PCBYTE pbSrc
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)
PCBYTE PBYTE SIZE_T cbData
PCBYTE PBYTE pbDst
PCVOID pExpandedKey

◆ SymCryptAesCbcEncrypt()

VOID SYMCRYPT_CALL SymCryptAesCbcEncrypt ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 173 of file aes-default.c.

179{
180#if SYMCRYPT_CPU_AMD64
182 {
184 } else {
186 }
187#elif SYMCRYPT_CPU_X86
188 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
189
191 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
192 {
194 SymCryptRestoreXmm( &SaveData );
195 } else {
197 }
198#elif SYMCRYPT_CPU_ARM
200#elif SYMCRYPT_CPU_ARM64
201 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
202 {
204 } else {
206 }
207#else
209#endif
210}
VOID SYMCRYPT_CALL SymCryptAesCbcEncryptNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCbcEncryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCbcEncryptAsm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptCbcEncrypt(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)

◆ SymCryptAesCbcMac()

VOID SYMCRYPT_CALL SymCryptAesCbcMac ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbData,
SIZE_T  cbData 
)

Definition at line 317 of file aes-default.c.

322{
323#if SYMCRYPT_CPU_AMD64
325 {
327 } else {
330 }
331#elif SYMCRYPT_CPU_X86
332 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
333
335 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
336 {
338 SymCryptRestoreXmm( &SaveData );
339 } else {
342 }
343#elif SYMCRYPT_CPU_ARM64
344 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
345 {
347 } else {
350 }
351#else
354#endif
355}
VOID SYMCRYPT_CALL SymCryptAesCbcMacXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCbcMacNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
#define SYMCRYPT_AES_BLOCK_SIZE
Definition: symcrypt.h:4255
VOID SYMCRYPT_CALL SymCryptCbcMac(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, SIZE_T cbData)
PCBYTE pbData

Referenced by SymCryptAesCmacAppend(), SymCryptAesCmacResult(), and SymCryptRngAesBcc().

◆ SymCryptAesCreateDecryptionRoundKey()

VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKey ( _In_reads_(16) PCBYTE  pEncryptionRoundKey,
_Out_writes_(16) PBYTE  pDecryptionRoundKey,
BOOL  UseSimd 
)

Definition at line 68 of file aes-default.c.

72{
73#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
74 if( UseSimd )
75 {
76 SymCryptAesCreateDecryptionRoundKeyXmm( pEncryptionRoundKey, pDecryptionRoundKey );
77 } else {
78 SymCryptAesCreateDecryptionRoundKeyC( pEncryptionRoundKey, pDecryptionRoundKey );
79 }
80#elif SYMCRYPT_CPU_ARM64
81 if( UseSimd )
82 {
83 SymCryptAesCreateDecryptionRoundKeyNeon( pEncryptionRoundKey, pDecryptionRoundKey );
84 } else {
85 SymCryptAesCreateDecryptionRoundKeyC( pEncryptionRoundKey, pDecryptionRoundKey );
86 }
87#else
88 UNREFERENCED_PARAMETER( UseSimd );
89 SymCryptAesCreateDecryptionRoundKeyC( pEncryptionRoundKey, pDecryptionRoundKey ); // never use XMM on SaveXmm arch, save/restore overhead is too large.
90#endif
91}
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyC(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
Definition: aes-c.c:81
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyNeon(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyXmm(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)

Referenced by SymCryptAesExpandKeyInternal().

◆ SymCryptAesCtrMsb32()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb32 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 359 of file aes-default.c.

365{
366#if SYMCRYPT_CPU_AMD64
368 {
370 } else {
371 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
373 }
374
375#elif SYMCRYPT_CPU_X86
376 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
377
379 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
380 {
382 SymCryptRestoreXmm( &SaveData );
383 } else {
384 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
386 }
387
388#elif SYMCRYPT_CPU_ARM64
389 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
390 {
392 } else {
394 }
395
396#else
397 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
399#endif
400}
VOID SYMCRYPT_CALL SymCryptCtrMsb32(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Neon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32Xmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)

Referenced by SymCryptAesGcmDecryptPartOnePass(), and SymCryptAesGcmEncryptPartOnePass().

◆ SymCryptAesCtrMsb64()

VOID SYMCRYPT_CALL SymCryptAesCtrMsb64 ( _In_ PCSYMCRYPT_AES_EXPANDED_KEY  pExpandedKey,
_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE  pbChainingValue,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 404 of file aes-default.c.

410{
411#if SYMCRYPT_CPU_AMD64
413 {
415 } else {
417 }
418
419#elif SYMCRYPT_CPU_X86
420 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
421
423 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
424 {
426 SymCryptRestoreXmm( &SaveData );
427 } else {
429 }
430
431#elif SYMCRYPT_CPU_ARM
433
434#elif SYMCRYPT_CPU_ARM64
435 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
436 {
438 } else {
440 }
441
442#else
443 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
445#endif
446}
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Xmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Neon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64Asm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptCtrMsb64(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)

Referenced by SymCryptRngAesGenerateBlocks(), and SymCryptSrtpKdfDerive().

◆ SymCryptAesDecrypt()

Definition at line 134 of file aes-default.c.

138{
139#if SYMCRYPT_CPU_AMD64
141 {
143 } else {
145 }
146#elif SYMCRYPT_CPU_X86
147 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
148
150 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
151 {
153 SymCryptRestoreXmm( &SaveData );
154 } else {
156 }
157#elif SYMCRYPT_CPU_ARM
159#elif SYMCRYPT_CPU_ARM64
160 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
161 {
163 } else {
165 }
166#else
168#endif
169}
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
VOID SYMCRYPT_CALL SymCryptAesDecryptAsm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
VOID SYMCRYPT_CALL SymCryptAesDecryptNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
VOID SYMCRYPT_CALL SymCryptAesDecryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)

Referenced by decrypt_block_impl(), SymCryptAesDecryptC(), SymCryptAesEcbDecrypt(), SymCryptAesKwpDecrypt(), and SymCryptAesKwxInternalUnwrap().

◆ SymCryptAesEcbDecrypt()

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

Definition at line 300 of file aes-default.c.

305{
307 {
312 }
313}
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

◆ SymCryptAesEcbEncrypt()

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

Definition at line 255 of file aes-default.c.

260{
261#if SYMCRYPT_CPU_AMD64
263 {
265 } else {
267 }
268#elif SYMCRYPT_CPU_X86
269 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
270
272 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
273 {
275 SymCryptRestoreXmm( &SaveData );
276 } else {
278 }
279#elif SYMCRYPT_CPU_ARM
281#elif SYMCRYPT_CPU_ARM64
282 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
283 {
285 } else {
287 }
288#else
290#endif
291}
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptC(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: aes-c.c:361
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesEcbEncryptAsm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)

◆ SymCryptAesEncrypt()

Definition at line 95 of file aes-default.c.

99{
100#if SYMCRYPT_CPU_AMD64
102 {
104 } else {
106 }
107#elif SYMCRYPT_CPU_X86
108 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
109
111 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
112 {
114 SymCryptRestoreXmm( &SaveData );
115 } else {
117 }
118#elif SYMCRYPT_CPU_ARM
120#elif SYMCRYPT_CPU_ARM64
121 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
122 {
124 } else {
126 }
127#else
129#endif
130}
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
VOID SYMCRYPT_CALL SymCryptAesEncryptNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
VOID SYMCRYPT_CALL SymCryptAesEncryptAsm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
VOID SYMCRYPT_CALL SymCryptAesEncryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)

Referenced by encrypt_block_impl(), SymCryptAesCmacExpandKey(), SymCryptAesEncryptC(), SymCryptAesKwpEncrypt(), SymCryptAesKwxInternalWrap(), SymCryptRngAesDf(), and SymCryptRngAesGenerateBlocks().

◆ SymCryptAesGcmDecryptPart()

VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPart ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 835 of file aes-default.c.

840{
841#if SYMCRYPT_CPU_AMD64
843 {
845 } else {
847 }
848
849#elif SYMCRYPT_CPU_X86
850 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
851
853 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
854 {
856 SymCryptRestoreXmm( &SaveData );
857 } else {
859 }
860
861#elif SYMCRYPT_CPU_ARM64
862 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES | SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
863 {
865 } else {
867 }
868
869#else
871#endif
872}
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPartOnePass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: aes-default.c:623
#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_PCLMULQDQ_CODE
Definition: sc_lib.h:308
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptGcmDecryptPartTwoPass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: gcm.c:543
PSYMCRYPT_COMMON_HASH_STATE pState

◆ SymCryptAesGcmDecryptPartOnePass()

VOID SYMCRYPT_CALL SymCryptAesGcmDecryptPartOnePass ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 623 of file aes-default.c.

628{
629 SIZE_T bytesToProcess;
630#if SYMCRYPT_CPU_AMD64
631 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
632#endif
633
634 //
635 // We have entered the decrypt phase, the AAD has been padded to be a multiple of block size
636 // We know that the bytes still to use in the key stream buffer and the bytes left to fill the
637 // macBlock will be the same in the context of this function
638 //
639 SYMCRYPT_ASSERT( (pState->cbData & SYMCRYPT_GCM_BLOCK_MOD_MASK) == pState->bytesInMacBlock );
640
641 //
642 // We update pState->cbData once before we modify cbData.
643 // pState->cbData is not used in the rest of this function
644 //
646 pState->cbData += cbData;
647
648 if( pState->bytesInMacBlock > 0 )
649 {
650 bytesToProcess = SYMCRYPT_MIN( cbData, SYMCRYPT_GCM_BLOCK_SIZE - pState->bytesInMacBlock );
651 memcpy( &pState->macBlock[pState->bytesInMacBlock], pbSrc, bytesToProcess );
653 &pState->keystreamBlock[pState->bytesInMacBlock],
654 &pState->macBlock[pState->bytesInMacBlock],
655 pbDst,
656 bytesToProcess );
657
658 pbSrc += bytesToProcess;
659 pbDst += bytesToProcess;
660 cbData -= bytesToProcess;
661 pState->bytesInMacBlock += bytesToProcess;
662
663 if( pState->bytesInMacBlock == SYMCRYPT_GCM_BLOCK_SIZE )
664 {
665 SymCryptGHashAppendData( &pState->pKey->ghashKey,
666 &pState->ghashState,
667 &pState->macBlock[0],
669 pState->bytesInMacBlock = 0;
670 }
671
672 //
673 // If there are bytes left in the key stream buffer, then cbData == 0 and we're done.
674 // If we used up all the bytes, then we are fine, no need to compute the next key stream block
675 //
676 }
677
679 {
680 bytesToProcess = cbData & SYMCRYPT_GCM_BLOCK_ROUND_MASK;
681
682 //
683 // We use a Gcm function that increments the CTR by 64 bits, rather than the 32 bits that GCM requires.
684 // As we only support 12-byte nonces, the 32-bit counter never overflows, and we can safely use
685 // the 64-bit incrementing primitive.
686 // If we ever support other nonce sizes this is going to be a big problem.
687 // You can't fake a 32-bit counter using a 64-bit counter function without side-channels that expose
688 // information about the current counter value.
689 // With other nonce sizes the actual counter value itself is not public, so we can't expose that.
690 // We can do two things:
691 // - create SymCryptAesGcmDecryptXXX32
692 // - Accept that we leak information about the counter value; after all it is not treated as a
693 // secret when the nonce is 12 bytes.
694 //
695 SYMCRYPT_ASSERT( pState->pKey->pBlockCipher->blockSize == SYMCRYPT_GCM_BLOCK_SIZE );
696
697#if SYMCRYPT_CPU_AMD64
699 (bytesToProcess >= GCM_YMM_MINBLOCKS * SYMCRYPT_GCM_BLOCK_SIZE) &&
700 SymCryptSaveYmm( &SaveData ) == SYMCRYPT_NO_ERROR )
701 {
703 &pState->pKey->blockcipherKey.aes,
704 &pState->counterBlock[0],
705 &pState->pKey->ghashKey.table[0],
706 &pState->ghashState,
707 pbSrc,
708 pbDst,
709 bytesToProcess );
710
711 SymCryptRestoreYmm( &SaveData );
712 } else {
714 &pState->pKey->blockcipherKey.aes,
715 &pState->counterBlock[0],
716 &pState->pKey->ghashKey.table[0],
717 &pState->ghashState,
718 pbSrc,
719 pbDst,
720 bytesToProcess );
721 }
722
723#elif SYMCRYPT_CPU_X86
725 &pState->pKey->blockcipherKey.aes,
726 &pState->counterBlock[0],
727 (PSYMCRYPT_GF128_ELEMENT)&pState->pKey->ghashKey.tableSpace[pState->pKey->ghashKey.tableOffset],
728 &pState->ghashState,
729 pbSrc,
730 pbDst,
731 bytesToProcess );
732
733#elif SYMCRYPT_CPU_ARM64
735 &pState->pKey->blockcipherKey.aes,
736 &pState->counterBlock[0],
737 &pState->pKey->ghashKey.table[0],
738 &pState->ghashState,
739 pbSrc,
740 pbDst,
741 bytesToProcess );
742
743#else
744 SymCryptGHashAppendData(&pState->pKey->ghashKey,
745 &pState->ghashState,
746 pbSrc,
747 cbData );
748 //
749 // Do the actual decryption
750 // This violates the read-once rule, but it is safe for the same reasons as above
751 // in the encryption case.
752 //
753 SymCryptAesCtrMsb32(&pState->pKey->blockcipherKey.aes,
754 &pState->counterBlock[0],
755 pbSrc,
756 pbDst,
757 cbData );
758
759#endif
760 pbSrc += bytesToProcess;
761 pbDst += bytesToProcess;
762 cbData -= bytesToProcess;
763 }
764
765 if( cbData > 0 )
766 {
768
769 SYMCRYPT_ASSERT( pState->pKey->pBlockCipher->blockSize == SYMCRYPT_GCM_BLOCK_SIZE );
770 SymCryptAesCtrMsb32(&pState->pKey->blockcipherKey.aes,
771 &pState->counterBlock[0],
772 &pState->keystreamBlock[0],
773 &pState->keystreamBlock[0],
775
776 memcpy( &pState->macBlock[0], pbSrc, cbData );
778 &pState->keystreamBlock[0],
779 &pState->macBlock[0],
780 pbDst,
781 cbData );
782
783 pState->bytesInMacBlock = cbData;
784
785 //
786 // pState->cbData contains the data length after this call already, so it knows how many
787 // bytes are left in the keystream block
788 //
789 }
790}
VOID SYMCRYPT_CALL SymCryptAesCtrMsb32(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: aes-default.c:359
VOID SYMCRYPT_CALL SymCryptGHashAppendData(_In_ PCSYMCRYPT_GHASH_EXPANDED_KEY expandedKey, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: ghash.c:884
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define GCM_YMM_MINBLOCKS
Definition: sc_lib.h:1611
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedYmm_2048(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
#define SYMCRYPT_CPU_FEATURES_FOR_VAES_256_CODE
Definition: sc_lib.h:309
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptXorBytes(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, _Out_writes_(cbBytes) PBYTE pbResult, SIZE_T cbBytes)
Definition: libmain.c:236
#define SYMCRYPT_GCM_BLOCK_SIZE
#define SYMCRYPT_GCM_BLOCK_MOD_MASK
#define SYMCRYPT_MIN(_a, _b)
* PSYMCRYPT_GF128_ELEMENT
#define SYMCRYPT_GCM_MAX_DATA_SIZE
#define SYMCRYPT_GCM_BLOCK_ROUND_MASK
ULONG_PTR SIZE_T
Definition: typedefs.h:80

Referenced by SymCryptAesGcmDecryptPart().

◆ SymCryptAesGcmEncryptPart()

VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPart ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 794 of file aes-default.c.

799{
800#if SYMCRYPT_CPU_AMD64
802 {
804 } else {
806 }
807
808#elif SYMCRYPT_CPU_X86
809 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
810
812 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
813 {
815 SymCryptRestoreXmm( &SaveData );
816 } else {
818 }
819
820#elif SYMCRYPT_CPU_ARM64
821 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES | SYMCRYPT_CPU_FEATURE_NEON_PMULL ) )
822 {
824 } else {
826 }
827
828#else
830#endif
831}
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPartOnePass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: aes-default.c:450
SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptGcmEncryptPartTwoPass(_Inout_ PSYMCRYPT_GCM_STATE pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: gcm.c:481

◆ SymCryptAesGcmEncryptPartOnePass()

VOID SYMCRYPT_CALL SymCryptAesGcmEncryptPartOnePass ( _Inout_ PSYMCRYPT_GCM_STATE  pState,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 450 of file aes-default.c.

455{
456 SIZE_T bytesToProcess;
457#if SYMCRYPT_CPU_AMD64
458 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
459#endif
460
461 //
462 // We have entered the encrypt phase, the AAD has been padded to be a multiple of block size
463 // We know that the bytes still to use in the key stream buffer and the bytes left to fill the
464 // macBlock will be the same in the context of this function
465 //
466 SYMCRYPT_ASSERT( (pState->cbData & SYMCRYPT_GCM_BLOCK_MOD_MASK) == pState->bytesInMacBlock );
467
468 //
469 // We update pState->cbData once before we modify cbData.
470 // pState->cbData is not used in the rest of this function
471 //
473 pState->cbData += cbData;
474
475 if( pState->bytesInMacBlock > 0 )
476 {
477 bytesToProcess = SYMCRYPT_MIN( cbData, SYMCRYPT_GCM_BLOCK_SIZE - pState->bytesInMacBlock );
479 pbSrc,
480 &pState->keystreamBlock[pState->bytesInMacBlock],
481 &pState->macBlock[pState->bytesInMacBlock],
482 bytesToProcess );
483 memcpy( pbDst, &pState->macBlock[pState->bytesInMacBlock], bytesToProcess );
484 pbSrc += bytesToProcess;
485 pbDst += bytesToProcess;
486 cbData -= bytesToProcess;
487 pState->bytesInMacBlock += bytesToProcess;
488
489 if( pState->bytesInMacBlock == SYMCRYPT_GCM_BLOCK_SIZE )
490 {
491 SymCryptGHashAppendData( &pState->pKey->ghashKey,
492 &pState->ghashState,
493 &pState->macBlock[0],
495 pState->bytesInMacBlock = 0;
496 }
497
498 //
499 // If there are bytes left in the key stream buffer, then cbData == 0 and we're done.
500 // If we used up all the bytes, then we are fine, no need to compute the next key stream block
501 //
502 }
503
505 {
506 bytesToProcess = cbData & SYMCRYPT_GCM_BLOCK_ROUND_MASK;
507
508 //
509 // We use a Gcm function that increments the CTR by 64 bits, rather than the 32 bits that GCM requires.
510 // As we only support 12-byte nonces, the 32-bit counter never overflows, and we can safely use
511 // the 64-bit incrementing primitive.
512 // If we ever support other nonce sizes this is going to be a big problem.
513 // You can't fake a 32-bit counter using a 64-bit counter function without side-channels that expose
514 // information about the current counter value.
515 // With other nonce sizes the actual counter value itself is not public, so we can't expose that.
516 // We can do two things:
517 // - create SymCryptAesGcmEncryptXXX32
518 // - Accept that we leak information about the counter value; after all it is not treated as a
519 // secret when the nonce is 12 bytes.
520 //
521 SYMCRYPT_ASSERT( pState->pKey->pBlockCipher->blockSize == SYMCRYPT_GCM_BLOCK_SIZE );
522
523#if SYMCRYPT_CPU_AMD64
525 (bytesToProcess >= GCM_YMM_MINBLOCKS * SYMCRYPT_GCM_BLOCK_SIZE) &&
526 SymCryptSaveYmm( &SaveData ) == SYMCRYPT_NO_ERROR )
527 {
529 &pState->pKey->blockcipherKey.aes,
530 &pState->counterBlock[0],
531 &pState->pKey->ghashKey.table[0],
532 &pState->ghashState,
533 pbSrc,
534 pbDst,
535 bytesToProcess );
536
537 SymCryptRestoreYmm( &SaveData );
538 } else {
540 &pState->pKey->blockcipherKey.aes,
541 &pState->counterBlock[0],
542 &pState->pKey->ghashKey.table[0],
543 &pState->ghashState,
544 pbSrc,
545 pbDst,
546 bytesToProcess );
547 }
548
549#elif SYMCRYPT_CPU_X86
551 &pState->pKey->blockcipherKey.aes,
552 &pState->counterBlock[0],
553 (PSYMCRYPT_GF128_ELEMENT)&pState->pKey->ghashKey.tableSpace[pState->pKey->ghashKey.tableOffset],
554 &pState->ghashState,
555 pbSrc,
556 pbDst,
557 bytesToProcess );
558
559#elif SYMCRYPT_CPU_ARM64
561 &pState->pKey->blockcipherKey.aes,
562 &pState->counterBlock[0],
563 &pState->pKey->ghashKey.table[0],
564 &pState->ghashState,
565 pbSrc,
566 pbDst,
567 bytesToProcess );
568
569#else
570 SymCryptAesCtrMsb32(&pState->pKey->blockcipherKey.aes,
571 &pState->counterBlock[0],
572 pbSrc,
573 pbDst,
574 cbData );
575 //
576 // We break the read-once/write once rule here by reading the pbDst data back.
577 // In this particular situation this is safe, and avoiding it is expensive as it
578 // requires an extra copy and an extra memory buffer.
579 // The first write exposes the GCM key stream, independent of the underlying data that
580 // we are processing. From an attacking point of view we can think of this as literally
581 // handing over the key stream. So encryption consists of two steps:
582 // - hand over the key stream
583 // - MAC some ciphertext
584 // In this view (which has equivalent security properties to GCM) is obviously doesn't
585 // matter that we read pbDst back.
586 //
587 SymCryptGHashAppendData(&pState->pKey->ghashKey,
588 &pState->ghashState,
589 pbDst,
590 cbData );
591
592#endif
593
594 pbSrc += bytesToProcess;
595 pbDst += bytesToProcess;
596 cbData -= bytesToProcess;
597 }
598
599 if( cbData > 0 )
600 {
602
603 SYMCRYPT_ASSERT( pState->pKey->pBlockCipher->blockSize == SYMCRYPT_GCM_BLOCK_SIZE );
604 SymCryptAesCtrMsb32(&pState->pKey->blockcipherKey.aes,
605 &pState->counterBlock[0],
606 &pState->keystreamBlock[0],
607 &pState->keystreamBlock[0],
609
610 SymCryptXorBytes( &pState->keystreamBlock[0], pbSrc, &pState->macBlock[0], cbData );
611 memcpy( pbDst, &pState->macBlock[0], cbData );
612 pState->bytesInMacBlock = cbData;
613
614 //
615 // pState->cbData contains the data length after this call already, so it knows how many
616 // bytes are left in the keystream block
617 //
618 }
619}
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedYmm_2048(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)

Referenced by SymCryptAesGcmEncryptPart().

Variable Documentation

◆ SymCryptAesBlockCipherNoOpt

const SYMCRYPT_BLOCKCIPHER SymCryptAesBlockCipherNoOpt
Initial value:
= {
}
#define NULL
Definition: types.h:112
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptAesExpandKey(_Out_ PSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey)
Definition: aes-key.c:219
SYMCRYPT_MAGIC_FIELD SYMCRYPT_AES_EXPANDED_KEY

Definition at line 20 of file aes-default.c.

Referenced by SymCryptAesCbcDecrypt(), SymCryptAesCbcEncrypt(), SymCryptAesCbcMac(), SymCryptAesCtrMsb32(), SymCryptAesCtrMsb64(), SymCryptXtsAesDecryptDataUnitAsm(), SymCryptXtsAesDecryptDataUnitC(), SymCryptXtsAesEncryptDataUnitAsm(), and SymCryptXtsAesEncryptDataUnitC().