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

Go to the source code of this file.

Macros

#define N_PARALLEL_TWEAKS   16
 
#define SYMCRYPT_XTS_AES_LOCALSCRATCH_DEFN    SYMCRYPT_ALIGN BYTE localScratch[N_PARALLEL_TWEAKS * SYMCRYPT_AES_BLOCK_SIZE];
 
#define SYMCRYPT_AesEcbEncryptXxx   SymCryptAesEcbEncryptC
 
#define SYMCRYPT_XtsAesXxx   SymCryptXtsAesEncryptInternalC
 
#define SYMCRYPT_XTSAESDATAUNIT_INVOKE    SymCryptXtsAesEncryptDataUnitC( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
 
#define SYMCRYPT_XtsAesXxx   SymCryptXtsAesDecryptInternalC
 
#define SYMCRYPT_XTSAESDATAUNIT_INVOKE    SymCryptXtsAesDecryptDataUnitC( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
 

Functions

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXtsAesExpandKey (_Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey)
 
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXtsAesExpandKeyEx (_Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey, UINT32 flags)
 
VOID SYMCRYPT_CALL SymCryptXtsAesKeyCopy (_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pSrc, _Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY pDst)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptInternal (_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbTweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, BOOLEAN bOverflow)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncrypt (_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, UINT64 tweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptWith128bTweak (_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbTweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptInternal (_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbTweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, BOOLEAN bOverflow)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecrypt (_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, UINT64 tweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptWith128bTweak (_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbTweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsUpdateTweak (_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE buf)
 
VOID SYMCRYPT_CALL SymCryptXtsEncryptDataUnit (_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsDecryptDataUnit (_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitAsm (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitC (_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
 
VOID SYMCRYPT_CALL SymCryptXtsAesSelftest (void)
 

Variables

static const BYTE SymCryptXtsAesCiphertext [32]
 

Macro Definition Documentation

◆ N_PARALLEL_TWEAKS

#define N_PARALLEL_TWEAKS   16

Definition at line 77 of file xtsaes.c.

◆ SYMCRYPT_AesEcbEncryptXxx

#define SYMCRYPT_AesEcbEncryptXxx   SymCryptAesEcbEncryptC

Definition at line 82 of file xtsaes.c.

◆ SYMCRYPT_XTS_AES_LOCALSCRATCH_DEFN

#define SYMCRYPT_XTS_AES_LOCALSCRATCH_DEFN    SYMCRYPT_ALIGN BYTE localScratch[N_PARALLEL_TWEAKS * SYMCRYPT_AES_BLOCK_SIZE];

Definition at line 79 of file xtsaes.c.

◆ SYMCRYPT_XTSAESDATAUNIT_INVOKE [1/2]

#define SYMCRYPT_XTSAESDATAUNIT_INVOKE    SymCryptXtsAesEncryptDataUnitC( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );

Definition at line 92 of file xtsaes.c.

◆ SYMCRYPT_XTSAESDATAUNIT_INVOKE [2/2]

#define SYMCRYPT_XTSAESDATAUNIT_INVOKE    SymCryptXtsAesDecryptDataUnitC( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );

Definition at line 92 of file xtsaes.c.

◆ SYMCRYPT_XtsAesXxx [1/2]

#define SYMCRYPT_XtsAesXxx   SymCryptXtsAesEncryptInternalC

Definition at line 91 of file xtsaes.c.

◆ SYMCRYPT_XtsAesXxx [2/2]

#define SYMCRYPT_XtsAesXxx   SymCryptXtsAesDecryptInternalC

Definition at line 91 of file xtsaes.c.

Function Documentation

◆ SymCryptXtsAesDecrypt()

VOID SYMCRYPT_CALL SymCryptXtsAesDecrypt ( _In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
SIZE_T  cbDataUnit,
UINT64  tweak,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 354 of file xtsaes.c.

361{
363
364 SYMCRYPT_ASSERT( cbData % cbDataUnit == 0 );
365
366 if( cbDataUnit < SYMCRYPT_AES_BLOCK_SIZE )
367 {
368 // Invalid data unit size
369 // Return early to avoid repeated checks deeper in the code
370 return;
371 }
372
373 SYMCRYPT_STORE_LSBFIRST64(&fullTweak[0], tweak);
374 SYMCRYPT_STORE_LSBFIRST64(&fullTweak[8], 0);
375
376 SymCryptXtsAesDecryptInternal( pExpandedKey, cbDataUnit, &fullTweak[0], pbSrc, pbDst, cbData, FALSE );
377}
#define FALSE
Definition: types.h:117
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
#define SYMCRYPT_AES_BLOCK_SIZE
Definition: symcrypt.h:4255
#define SYMCRYPT_STORE_LSBFIRST64(p, v)
Definition: symcrypt.h:308
#define SYMCRYPT_ALIGN
PCBYTE pbSrc
PCBYTE PBYTE SIZE_T cbData
PCBYTE PBYTE pbDst
PCVOID pExpandedKey
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptInternal(_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbTweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, BOOLEAN bOverflow)
Definition: xtsaes.c:303
unsigned char BYTE
Definition: xxhash.c:193

Referenced by SymCryptXtsAesSelftest().

◆ SymCryptXtsAesDecryptDataUnitAsm()

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

Definition at line 629 of file xtsaes.c.

635{
636 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
640 pbTweakBlock,
641 pbSrc,
642 pbDst,
643 cbData );
644}
const SYMCRYPT_BLOCKCIPHER SymCryptAesBlockCipherNoOpt
Definition: aes-default.c:20
VOID SYMCRYPT_CALL SymCryptXtsDecryptDataUnit(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: xtsaes.c:524

◆ SymCryptXtsAesDecryptDataUnitC()

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

Definition at line 668 of file xtsaes.c.

674{
675 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
679 pbTweakBlock,
680 pbSrc,
681 pbDst,
682 cbData );
683
684}

◆ SymCryptXtsAesDecryptInternal()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptInternal ( _In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
SIZE_T  cbDataUnit,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE  pbTweak,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData,
BOOLEAN  bOverflow 
)

Definition at line 303 of file xtsaes.c.

311{
312#if SYMCRYPT_CPU_AMD64
313 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
314 /* if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURES_FOR_VAES_512_CODE ) ) {
315 SymCryptXtsAesDecryptInternalZmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
316 } else */
318 SymCryptSaveYmm( &SaveData ) == SYMCRYPT_NO_ERROR )
319 {
320 SymCryptXtsAesDecryptInternalYmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
321 SymCryptRestoreYmm( &SaveData );
323 SymCryptXtsAesDecryptInternalXmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
324 } else {
325 SymCryptXtsAesDecryptInternalAsm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
326 }
327#elif SYMCRYPT_CPU_X86
328 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
329
331 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
332 {
333 SymCryptXtsAesDecryptInternalXmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
334 SymCryptRestoreXmm( &SaveData );
335 } else {
336 SymCryptXtsAesDecryptInternalAsm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
337 }
338#elif SYMCRYPT_CPU_ARM
339 SymCryptXtsAesDecryptInternalAsm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
340#elif SYMCRYPT_CPU_ARM64
341 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
342 {
343 SymCryptXtsAesDecryptInternalNeon( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
344 } else {
345 SymCryptXtsAesDecryptInternalC( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
346 }
347#else
348 SymCryptXtsAesDecryptInternalC( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
349#endif
350}
VOID SaveData(HWND hwndDlg)
Definition: volume.c:368
#define SYMCRYPT_CPU_FEATURES_FOR_AESNI_CODE
Definition: sc_lib.h:307
#define SYMCRYPT_CPU_FEATURES_FOR_VAES_256_CODE
Definition: sc_lib.h:309
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)

Referenced by SymCryptXtsAesDecrypt(), and SymCryptXtsAesDecryptWith128bTweak().

◆ SymCryptXtsAesDecryptWith128bTweak()

VOID SYMCRYPT_CALL SymCryptXtsAesDecryptWith128bTweak ( _In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
SIZE_T  cbDataUnit,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE  pbTweak,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 381 of file xtsaes.c.

388{
389 if( cbDataUnit < SYMCRYPT_AES_BLOCK_SIZE )
390 {
391 // Invalid data unit size
392 // Return early to avoid repeated checks deeper in the code
393 return;
394 }
395
397}
#define TRUE
Definition: types.h:120

◆ SymCryptXtsAesEncrypt()

VOID SYMCRYPT_CALL SymCryptXtsAesEncrypt ( _In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
SIZE_T  cbDataUnit,
UINT64  tweak,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 255 of file xtsaes.c.

262{
264
265 SYMCRYPT_ASSERT( cbData % cbDataUnit == 0 );
266
267 if( cbDataUnit < SYMCRYPT_AES_BLOCK_SIZE )
268 {
269 // Invalid data unit size
270 // Return early to avoid repeated checks deeper in the code
271 return;
272 }
273
274 SYMCRYPT_STORE_LSBFIRST64(&fullTweak[0], tweak);
275 SYMCRYPT_STORE_LSBFIRST64(&fullTweak[8], 0);
276
277 SymCryptXtsAesEncryptInternal( pExpandedKey, cbDataUnit, &fullTweak[0], pbSrc, pbDst, cbData, FALSE );
278}
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptInternal(_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbTweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, BOOLEAN bOverflow)
Definition: xtsaes.c:204

Referenced by SymCryptXtsAesSelftest().

◆ SymCryptXtsAesEncryptDataUnitAsm()

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

Definition at line 610 of file xtsaes.c.

616{
617 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
621 pbTweakBlock,
622 pbSrc,
623 pbDst,
624 cbData );
625}
VOID SYMCRYPT_CALL SymCryptXtsEncryptDataUnit(_In_ PCSYMCRYPT_BLOCKCIPHER pBlockCipher, _In_ PCVOID pExpandedKey, _Inout_updates_(pBlockCipher->blockSize) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: xtsaes.c:444

◆ SymCryptXtsAesEncryptDataUnitC()

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

Definition at line 648 of file xtsaes.c.

654{
655 // No special optimizations...
656 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
660 pbTweakBlock,
661 pbSrc,
662 pbDst,
663 cbData );
664}

◆ SymCryptXtsAesEncryptInternal()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptInternal ( _In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
SIZE_T  cbDataUnit,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE  pbTweak,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData,
BOOLEAN  bOverflow 
)

Definition at line 204 of file xtsaes.c.

212{
213#if SYMCRYPT_CPU_AMD64
214 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
215 /* if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURES_FOR_VAES_512_CODE ) ) {
216 SymCryptXtsAesEncryptInternalZmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
217 } else */
219 SymCryptSaveYmm( &SaveData ) == SYMCRYPT_NO_ERROR )
220 {
221 SymCryptXtsAesEncryptInternalYmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
222 SymCryptRestoreYmm( &SaveData );
224 SymCryptXtsAesEncryptInternalXmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
225 } else {
226 SymCryptXtsAesEncryptInternalAsm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
227 }
228#elif SYMCRYPT_CPU_X86
229 SYMCRYPT_EXTENDED_SAVE_DATA SaveData;
230
232 SymCryptSaveXmm( &SaveData ) == SYMCRYPT_NO_ERROR )
233 {
234 SymCryptXtsAesEncryptInternalXmm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
235 SymCryptRestoreXmm( &SaveData );
236 } else {
237 SymCryptXtsAesEncryptInternalAsm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
238 }
239#elif SYMCRYPT_CPU_ARM
240 SymCryptXtsAesEncryptInternalAsm( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
241#elif SYMCRYPT_CPU_ARM64
242 if( SYMCRYPT_CPU_FEATURES_PRESENT( SYMCRYPT_CPU_FEATURE_NEON_AES ) )
243 {
244 SymCryptXtsAesEncryptInternalNeon( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
245 } else {
246 SymCryptXtsAesEncryptInternalC( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
247 }
248#else
249 SymCryptXtsAesEncryptInternalC( pExpandedKey, cbDataUnit, pbTweak, pbSrc, pbDst, cbData, bOverflow );
250#endif
251}

Referenced by SymCryptXtsAesEncrypt(), and SymCryptXtsAesEncryptWith128bTweak().

◆ SymCryptXtsAesEncryptWith128bTweak()

VOID SYMCRYPT_CALL SymCryptXtsAesEncryptWith128bTweak ( _In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
SIZE_T  cbDataUnit,
_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE  pbTweak,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 282 of file xtsaes.c.

289{
290 if( cbDataUnit < SYMCRYPT_AES_BLOCK_SIZE )
291 {
292 // Invalid data unit size
293 // Return early to avoid repeated checks deeper in the code
294 return;
295 }
296
298}

◆ SymCryptXtsAesExpandKey()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXtsAesExpandKey ( _Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbKey) PCBYTE  pbKey,
SIZE_T  cbKey 
)

Definition at line 11 of file xtsaes.c.

15{
16 SYMCRYPT_ERROR scError;
17 SIZE_T halfKeySize = cbKey / 2;
18
19 scError = SymCryptAesExpandKey( &pExpandedKey->key1, pbKey, halfKeySize );
20 if( scError != SYMCRYPT_NO_ERROR )
21 {
22 goto cleanup;
23 }
24
25 //
26 // Pass the 'rest' of the key to the second one. This catches errors such as
27 // an attempt to pass a 33 byte key.
28 // halfKeySize = 16, which is valid, but this expansion gets a 17-byte key which will fail.
29 // Key2 is only used for tweak encryption, so we can use the EncryptOnly key expansion.
30 //
31 scError = SymCryptAesExpandKeyEncryptOnly( &pExpandedKey->key2, pbKey + halfKeySize, cbKey - halfKeySize );
32 if( scError != SYMCRYPT_NO_ERROR )
33 {
34 goto cleanup;
35 }
36
38
39 return scError;
40}
static void cleanup(void)
Definition: main.c:1335
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_ERROR SYMCRYPT_CALL SymCryptAesExpandKeyEncryptOnly(_Out_ PSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey)
Definition: aes-key.c:230
SYMCRYPT_ERROR
Definition: symcrypt.h:227
PCBYTE pbKey
PCBYTE SIZE_T cbKey
ULONG_PTR SIZE_T
Definition: typedefs.h:80

Referenced by SymCryptXtsAesExpandKeyEx().

◆ SymCryptXtsAesExpandKeyEx()

SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXtsAesExpandKeyEx ( _Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY  pExpandedKey,
_In_reads_(cbKey) PCBYTE  pbKey,
SIZE_T  cbKey,
UINT32  flags 
)

Definition at line 44 of file xtsaes.c.

49{
50 if( ( flags & SYMCRYPT_FLAG_KEY_NO_FIPS ) == 0 )
51 {
52 // FIPS IG C.I enforces that the two AES keys internally used in XTS-AES are non-equal
53 if( cbKey > 64 )
54 {
55 return SYMCRYPT_WRONG_KEY_SIZE;
56 }
57 if( SymCryptEqual( pbKey, pbKey+(cbKey/2), (cbKey/2) ) )
58 {
59 return SYMCRYPT_FIPS_FAILURE;
60 }
61 }
62
64}
GLbitfield flags
Definition: glext.h:7161
#define SYMCRYPT_FLAG_KEY_NO_FIPS
Definition: symcrypt.h:7579
BOOLEAN SYMCRYPT_CALL SymCryptEqual(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, SIZE_T cbBytes)
Definition: equal.c:11
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXtsAesExpandKey(_Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey)
Definition: xtsaes.c:11

Referenced by SymCryptXtsAesSelftest().

◆ SymCryptXtsAesKeyCopy()

Definition at line 69 of file xtsaes.c.

72{
73 SymCryptAesKeyCopy( &pSrc->key1, &pDst->key1 );
74 SymCryptAesKeyCopy( &pSrc->key2, &pDst->key2 );
75}
VOID SYMCRYPT_CALL SymCryptAesKeyCopy(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pSrc, _Out_ PSYMCRYPT_AES_EXPANDED_KEY pDst)
Definition: aes-key.c:240

◆ SymCryptXtsAesSelftest()

VOID SYMCRYPT_CALL SymCryptXtsAesSelftest ( void  )

Definition at line 695 of file xtsaes.c.

696{
698 BYTE buf[32];
699 BYTE plaintext[sizeof( buf )];
700
701 SymCryptWipeKnownSize( buf, sizeof( buf ) );
702 buf[0] = 1;
703
704 if( SymCryptXtsAesExpandKeyEx( &key, buf, sizeof( buf ), 0 ) != SYMCRYPT_NO_ERROR )
705 {
706 SymCryptFatal( 'xtsa' );
707 }
708
709 SymCryptXtsAesEncrypt( &key, sizeof( buf ), 0, buf, buf, sizeof( buf ) );
710
711 SymCryptInjectError( buf, sizeof( buf ) );
712 if( memcmp( buf, SymCryptXtsAesCiphertext, sizeof( buf ) ) != 0 )
713 {
714 SymCryptFatal( 'xtsa' );
715 }
716
717 SymCryptXtsAesDecrypt( &key, sizeof( buf ), 0, buf, buf, sizeof( buf ) );
718
719 SymCryptInjectError( buf, sizeof( buf ) );
720
721 SymCryptWipeKnownSize( plaintext, sizeof( plaintext ) );
722 plaintext[0] = 1;
723 if( memcmp( buf, plaintext, sizeof( buf ) ) != 0 )
724 {
725 SymCryptFatal( 'xtsa' );
726 }
727}
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
VOID SYMCRYPT_CALL SymCryptInjectError(PBYTE pbData, SIZE_T cbData)
Definition: copy.c:22
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
SYMCRYPT_XTS_AES_EXPANDED_KEY
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXtsAesExpandKeyEx(_Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey, UINT32 flags)
Definition: xtsaes.c:44
VOID SYMCRYPT_CALL SymCryptXtsAesDecrypt(_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, UINT64 tweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: xtsaes.c:354
VOID SYMCRYPT_CALL SymCryptXtsAesEncrypt(_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, SIZE_T cbDataUnit, UINT64 tweak, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
Definition: xtsaes.c:255
static const BYTE SymCryptXtsAesCiphertext[32]
Definition: xtsaes.c:686

◆ SymCryptXtsDecryptDataUnit()

VOID SYMCRYPT_CALL SymCryptXtsDecryptDataUnit ( _In_ PCSYMCRYPT_BLOCKCIPHER  pBlockCipher,
_In_ PCVOID  pExpandedKey,
_Inout_updates_(pBlockCipher->blockSize) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 524 of file xtsaes.c.

531{
534
535 while( cbData >= 2*SYMCRYPT_AES_BLOCK_SIZE )
536 {
540
542 SymCryptXtsUpdateTweak( pbTweakBlock );
543
547 }
548
550 {
551 // Ciphertext stealing decryption
552 //
553 // +--------------+
554 // | |
555 // | V
556 // +-----------------+ | +-----+-----------+
557 // | C_m-1 | | | C_m |++++CP+++++|
558 // +-----------------+ | +-----+-----------+
559 // | | |
560 // dec_m | dec_m-1
561 // | | |
562 // V | V
563 // +-----+-----------+ | +-----------------+
564 // | P_m |++++CP+++++|--+ | P_m-1 |
565 // +-----+-----------+ +-----------------+
566 // | /
567 // +---------------- / --+
568 // / |
569 // | V
570 // +-----------------+ | +-----+
571 // | P_m-1 |<-+ | P_m |
572 // +-----------------+ +-----+
573
574 // Save penultimate value of tweak to tweakBuf
575 memcpy( tweakBuf, pbTweakBlock, SYMCRYPT_AES_BLOCK_SIZE );
576
577 // Do final tweak update
578 SymCryptXtsUpdateTweak( pbTweakBlock );
579
580 // Decrypt penultimate ciphertext block into buf
584
586
587 // Copy buf to buf[SYMCRYPT_AES_BLOCK_SIZE]
589 // Copy final ciphertext bytes to prefix of buf - we must read before writing to support in-place decryption
591 // Copy prefix of buf[SYMCRYPT_AES_BLOCK_SIZE] to the right place in the destination buffer
593
594 // Set pbSrc and pbTweakBlock correctly to share code with non-ciphertext stealing case
595 pbSrc = &buf[0];
596 pbTweakBlock = &tweakBuf[0];
597 }
598
599 // Final full block decryption
603
604 SymCryptWipeKnownSize( buf, sizeof(buf) );
605 SymCryptWipeKnownSize( tweakBuf, sizeof(tweakBuf) );
606}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PSYMCRYPT_BLOCKCIPHER_CRYPT decryptFunc
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
PCSYMCRYPT_BLOCKCIPHER pBlockCipher
VOID SYMCRYPT_CALL SymCryptXtsUpdateTweak(_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE buf)
Definition: xtsaes.c:401

Referenced by SymCryptXtsAesDecryptDataUnitAsm(), and SymCryptXtsAesDecryptDataUnitC().

◆ SymCryptXtsEncryptDataUnit()

VOID SYMCRYPT_CALL SymCryptXtsEncryptDataUnit ( _In_ PCSYMCRYPT_BLOCKCIPHER  pBlockCipher,
_In_ PCVOID  pExpandedKey,
_Inout_updates_(pBlockCipher->blockSize) PBYTE  pbTweakBlock,
_In_reads_(cbData) PCBYTE  pbSrc,
_Out_writes_(cbData) PBYTE  pbDst,
SIZE_T  cbData 
)

Definition at line 444 of file xtsaes.c.

451{
453
454 while( cbData >= 2*SYMCRYPT_AES_BLOCK_SIZE )
455 {
459
461 SymCryptXtsUpdateTweak( pbTweakBlock );
462
466 }
467
469 {
470 // Ciphertext stealing encryption
471 //
472 // +--------------+
473 // | |
474 // | V
475 // +-----------------+ | +-----+-----------+
476 // | P_m-1 | | | P_m |++++CP+++++|
477 // +-----------------+ | +-----+-----------+
478 // | | |
479 // enc_m-1 | enc_m
480 // | | |
481 // V | V
482 // +-----+-----------+ | +-----------------+
483 // | C_m |++++CP+++++|--+ | C_m-1 |
484 // +-----+-----------+ +-----------------+
485 // | /
486 // +---------------- / --+
487 // / |
488 // | V
489 // +-----------------+ | +-----+
490 // | C_m-1 |<-+ | C_m |
491 // +-----------------+ +-----+
492
493 // Encrypt penultimate plaintext block into buf
497
499
500 // Copy buf to buf[SYMCRYPT_AES_BLOCK_SIZE]
502 // Copy final plaintext bytes to prefix of buf - we must read before writing to support in-place encryption
504 // Copy prefix of buf[SYMCRYPT_AES_BLOCK_SIZE] to the right place in the destination buffer
506
507 // Do final tweak update
508 SymCryptXtsUpdateTweak( pbTweakBlock );
509
510 // Set pbSrc correctly to share code with non-ciphertext stealing case
511 pbSrc = &buf[0];
512 }
513
514 // Final full block encryption
518
519 SymCryptWipeKnownSize( buf, sizeof(buf) );
520}
PSYMCRYPT_BLOCKCIPHER_CRYPT encryptFunc

Referenced by SymCryptXtsAesEncryptDataUnitAsm(), and SymCryptXtsAesEncryptDataUnitC().

◆ SymCryptXtsUpdateTweak()

Definition at line 401 of file xtsaes.c.

403{
404/*
405 UINT32 b0 = LOAD_LSBFIRST32( buf );
406 UINT32 b1 = LOAD_LSBFIRST32( buf + 4 );
407 UINT32 b2 = LOAD_LSBFIRST32( buf + 8 );
408 UINT32 b3 = LOAD_LSBFIRST32( buf + 12 );
409 UINT32 msbit = b3 >> 31;
410
411 //
412 // The STORE_* macros re-evaluate their arguments sometimes, so we
413 // keep all computations in local variables.
414 //
415 UINT32 r0 = (b0 << 1) ^ (135 * msbit);
416 UINT32 r1 = (b1 << 1) | (b0 >> 31);
417 UINT32 r2 = (b2 << 1) | (b1 >> 31);
418 UINT32 r3 = (b3 << 1) | (b2 >> 31);
419
420 STORE_LSBFIRST32( buf , r0 );
421 STORE_LSBFIRST32( buf + 4, r1 );
422 STORE_LSBFIRST32( buf + 8, r2 );
423 STORE_LSBFIRST32( buf + 12, r3 );
424*/
427
428 /*
429 UINT32 msbit = (UINT32)(b1 >> 63);
430 //UINT32 feedback = 135 * msbit;
431 UINT32 feedback = (msbit << 7) + (msbit << 3) - msbit;
432 */
433 UINT32 feedback = (((INT64)b1) >> 63) & 135;
434
435 UINT64 r0 = (b0 << 1) ^ feedback;
436 UINT64 r1 = (b1 << 1) | (b0 >> 63);
437
440}
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
static CRYPT_DATA_BLOB b1[]
Definition: msg.c:529
static DNS_RECORDW r1
Definition: record.c:37
#define SYMCRYPT_LOAD_LSBFIRST64(p)
Definition: symcrypt.h:300
uint32_t UINT32
Definition: typedefs.h:59

Referenced by SymCryptXtsDecryptDataUnit(), and SymCryptXtsEncryptDataUnit().

Variable Documentation

◆ SymCryptXtsAesCiphertext

const BYTE SymCryptXtsAesCiphertext[32]
static
Initial value:
= {
0xef, 0xe5, 0x8b, 0x1a, 0x0b, 0xaf, 0xc1, 0x08,
0xe9, 0xb7, 0x74, 0x1c, 0xcb, 0xdc, 0xf8, 0x53,
0x4f, 0x90, 0x55, 0x32, 0x53, 0xf6, 0x18, 0xd2,
0x34, 0xd5, 0xf2, 0x29, 0xf6, 0x4f, 0xd3, 0x8c,
}

Definition at line 686 of file xtsaes.c.

Referenced by SymCryptXtsAesSelftest().