ReactOS 0.4.17-dev-1005-g171e1de
xtsaes.c
Go to the documentation of this file.
1//
2// xtsaes.c code for XTS-AES implementation
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6
7#include "precomp.h"
8
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}
41
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}
65
66
67VOID
72{
73 SymCryptAesKeyCopy( &pSrc->key1, &pDst->key1 );
74 SymCryptAesKeyCopy( &pSrc->key2, &pDst->key2 );
75}
76
77#define N_PARALLEL_TWEAKS 16
78
79#define SYMCRYPT_XTS_AES_LOCALSCRATCH_DEFN \
80 SYMCRYPT_ALIGN BYTE localScratch[N_PARALLEL_TWEAKS * SYMCRYPT_AES_BLOCK_SIZE];
81
82#define SYMCRYPT_AesEcbEncryptXxx SymCryptAesEcbEncryptC
83
84#define SYMCRYPT_XtsAesXxx SymCryptXtsAesEncryptInternalC
85#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
86 SymCryptXtsAesEncryptDataUnitC( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
87#include "xtsaes_pattern.c"
88#undef SYMCRYPT_XtsAesXxx
89#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
90
91#define SYMCRYPT_XtsAesXxx SymCryptXtsAesDecryptInternalC
92#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
93 SymCryptXtsAesDecryptDataUnitC( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
94#include "xtsaes_pattern.c"
95#undef SYMCRYPT_XtsAesXxx
96#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
97
98#undef SYMCRYPT_AesEcbEncryptXxx
99
100
101#if SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM
102#define SYMCRYPT_AesEcbEncryptXxx SymCryptAesEcbEncryptAsm
103
104#define SYMCRYPT_XtsAesXxx SymCryptXtsAesEncryptInternalAsm
105#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
106 SymCryptXtsAesEncryptDataUnitAsm( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
107#include "xtsaes_pattern.c"
108#undef SYMCRYPT_XtsAesXxx
109#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
110
111#define SYMCRYPT_XtsAesXxx SymCryptXtsAesDecryptInternalAsm
112#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
113 SymCryptXtsAesDecryptDataUnitAsm( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
114#include "xtsaes_pattern.c"
115#undef SYMCRYPT_XtsAesXxx
116#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
117
118#undef SYMCRYPT_AesEcbEncryptXxx
119#endif
120
121#if SYMCRYPT_CPU_ARM64
122#define SYMCRYPT_AesEcbEncryptXxx SymCryptAesEcbEncryptNeon
123
124#define SYMCRYPT_XtsAesXxx SymCryptXtsAesEncryptInternalNeon
125#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
126 SymCryptXtsAesEncryptDataUnitNeon( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
127#include "xtsaes_pattern.c"
128#undef SYMCRYPT_XtsAesXxx
129#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
130
131#define SYMCRYPT_XtsAesXxx SymCryptXtsAesDecryptInternalNeon
132#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
133 SymCryptXtsAesDecryptDataUnitNeon( &pExpandedKey->key1, &tweakBuf[i], pbSrc, pbDst, cbDataUnit );
134#include "xtsaes_pattern.c"
135#undef SYMCRYPT_XtsAesXxx
136#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
137
138#undef SYMCRYPT_AesEcbEncryptXxx
139#endif
140
141#undef SYMCRYPT_XTS_AES_LOCALSCRATCH_DEFN
142
143
144#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
145
146#define SYMCRYPT_XTS_AES_LOCALSCRATCH_DEFN \
147 /* Defining localScratch as a buffer of __m128is ensures there is required 16B alignment on x86 */ \
148 __m128i localScratch[ N_PARALLEL_TWEAKS + 16 ];
149#define SYMCRYPT_AesEcbEncryptXxx SymCryptAesEcbEncryptXmm
150
151#define SYMCRYPT_XtsAesXxx SymCryptXtsAesEncryptInternalXmm
152#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
153 SymCryptXtsAesEncryptDataUnitXmm( &pExpandedKey->key1, &tweakBuf[i], (PBYTE) &localScratch[N_PARALLEL_TWEAKS], pbSrc, pbDst, cbDataUnit );
154#include "xtsaes_pattern.c"
155#undef SYMCRYPT_XtsAesXxx
156#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
157
158#define SYMCRYPT_XtsAesXxx SymCryptXtsAesDecryptInternalXmm
159#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
160 SymCryptXtsAesDecryptDataUnitXmm( &pExpandedKey->key1, &tweakBuf[i], (PBYTE) &localScratch[N_PARALLEL_TWEAKS], pbSrc, pbDst, cbDataUnit );
161#include "xtsaes_pattern.c"
162#undef SYMCRYPT_XtsAesXxx
163#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
164
165#define SYMCRYPT_XtsAesXxx SymCryptXtsAesEncryptInternalYmm
166#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
167 SymCryptXtsAesEncryptDataUnitYmm_2048( &pExpandedKey->key1, &tweakBuf[i], (PBYTE) &localScratch[N_PARALLEL_TWEAKS], pbSrc, pbDst, cbDataUnit );
168#include "xtsaes_pattern.c"
169#undef SYMCRYPT_XtsAesXxx
170#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
171
172#define SYMCRYPT_XtsAesXxx SymCryptXtsAesDecryptInternalYmm
173#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
174 SymCryptXtsAesDecryptDataUnitYmm_2048( &pExpandedKey->key1, &tweakBuf[i], (PBYTE) &localScratch[N_PARALLEL_TWEAKS], pbSrc, pbDst, cbDataUnit );
175#include "xtsaes_pattern.c"
176#undef SYMCRYPT_XtsAesXxx
177#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
178
179#if 0 //do not compile Zmm code for now
180
181#define SYMCRYPT_XtsAesXxx SymCryptXtsAesEncryptInternalZmm
182#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
183 SymCryptXtsAesEncryptDataUnitZmm_2048( &pExpandedKey->key1, &tweakBuf[i], (PBYTE) &localScratch[N_PARALLEL_TWEAKS], pbSrc, pbDst, cbDataUnit );
184#include "xtsaes_pattern.c"
185#undef SYMCRYPT_XtsAesXxx
186#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
187
188#define SYMCRYPT_XtsAesXxx SymCryptXtsAesDecryptInternalZmm
189#define SYMCRYPT_XTSAESDATAUNIT_INVOKE \
190 SymCryptXtsAesDecryptDataUnitZmm_2048( &pExpandedKey->key1, &tweakBuf[i], (PBYTE) &localScratch[N_PARALLEL_TWEAKS], pbSrc, pbDst, cbDataUnit );
191#include "xtsaes_pattern.c"
192#undef SYMCRYPT_XtsAesXxx
193#undef SYMCRYPT_XTSAESDATAUNIT_INVOKE
194
195#endif
196
197#undef SYMCRYPT_XTS_AES_LOCALSCRATCH_DEFN
198#undef SYMCRYPT_AesEcbEncryptXxx
199
200#endif
201
202VOID
206 SIZE_T cbDataUnit,
211 BOOLEAN bOverflow )
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}
252
253VOID
257 SIZE_T cbDataUnit,
258 UINT64 tweak,
261 SIZE_T cbData )
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}
279
280VOID
284 SIZE_T cbDataUnit,
288 SIZE_T cbData )
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}
299
300
301VOID
305 SIZE_T cbDataUnit,
310 BOOLEAN bOverflow )
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}
351
352VOID
356 SIZE_T cbDataUnit,
357 UINT64 tweak,
360 SIZE_T cbData )
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}
378
379VOID
383 SIZE_T cbDataUnit,
387 SIZE_T cbData )
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}
398
399VOID
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}
441
442VOID
447 _Inout_updates_( pBlockCipher->blockSize ) PBYTE pbTweakBlock,
450 SIZE_T cbData )
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}
521
522VOID
527 _Inout_updates_( pBlockCipher->blockSize ) PBYTE pbTweakBlock,
530 SIZE_T cbData )
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}
607
608VOID
615 SIZE_T cbData )
616{
617 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
621 pbTweakBlock,
622 pbSrc,
623 pbDst,
624 cbData );
625}
626
627VOID
634 SIZE_T cbData )
635{
636 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
640 pbTweakBlock,
641 pbSrc,
642 pbDst,
643 cbData );
644}
645
646VOID
653 SIZE_T cbData )
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}
665
666VOID
673 SIZE_T cbData )
674{
675 SYMCRYPT_ASSERT( SymCryptAesBlockCipherNoOpt.blockSize == SYMCRYPT_AES_BLOCK_SIZE ); // keep Prefast happy
679 pbTweakBlock,
680 pbSrc,
681 pbDst,
682 cbData );
683
684}
685
686static const BYTE SymCryptXtsAesCiphertext[32] = {
687 0xef, 0xe5, 0x8b, 0x1a, 0x0b, 0xaf, 0xc1, 0x08,
688 0xe9, 0xb7, 0x74, 0x1c, 0xcb, 0xdc, 0xf8, 0x53,
689 0x4f, 0x90, 0x55, 0x32, 0x53, 0xf6, 0x18, 0xd2,
690 0x34, 0xd5, 0xf2, 0x29, 0xf6, 0x4f, 0xd3, 0x8c,
691};
692
693VOID
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}
unsigned char BOOLEAN
Definition: actypes.h:127
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
const SYMCRYPT_BLOCKCIPHER SymCryptAesBlockCipherNoOpt
Definition: aes-default.c:20
CONST VOID * PCVOID
Definition: cfgmgr32.h:44
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
VOID SaveData(HWND hwndDlg)
Definition: volume.c:368
static void cleanup(void)
Definition: main.c:1335
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
GLbitfield flags
Definition: glext.h:7161
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static CRYPT_DATA_BLOB b1[]
Definition: msg.c:529
static DNS_RECORDW r1
Definition: record.c:37
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_updates_(s)
Definition: no_sal2.h:182
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
BYTE * PBYTE
Definition: pedump.c:66
VOID SYMCRYPT_CALL SymCryptInjectError(PBYTE pbData, SIZE_T cbData)
#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
PSYMCRYPT_BLOCKCIPHER_CRYPT decryptFunc
PSYMCRYPT_BLOCKCIPHER_CRYPT encryptFunc
Definition: copy.c:22
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
#define SYMCRYPT_LOAD_LSBFIRST64(p)
Definition: symcrypt.h:300
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
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_AES_BLOCK_SIZE
Definition: symcrypt.h:4255
#define SYMCRYPT_FLAG_KEY_NO_FIPS
Definition: symcrypt.h:7579
#define SYMCRYPT_STORE_LSBFIRST64(p, v)
Definition: symcrypt.h:308
BOOLEAN SYMCRYPT_CALL SymCryptEqual(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, SIZE_T cbBytes)
Definition: equal.c:11
VOID SYMCRYPT_CALL SymCryptAesKeyCopy(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pSrc, _Out_ PSYMCRYPT_AES_EXPANDED_KEY pDst)
Definition: aes-key.c:240
SYMCRYPT_ERROR
Definition: symcrypt.h:227
#define SYMCRYPT_ALIGN
PCBYTE pbSrc
#define SYMCRYPT_CALL
PCBYTE pbKey
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)
SYMCRYPT_XTS_AES_EXPANDED_KEY
PCBYTE SIZE_T cbKey
* PSYMCRYPT_XTS_AES_EXPANDED_KEY
const SYMCRYPT_AES_EXPANDED_KEY * PCSYMCRYPT_AES_EXPANDED_KEY
PCSYMCRYPT_BLOCKCIPHER pBlockCipher
PCBYTE PBYTE SIZE_T cbData
PCBYTE PBYTE pbDst
const BYTE * PCBYTE
const SYMCRYPT_XTS_AES_EXPANDED_KEY * PCSYMCRYPT_XTS_AES_EXPANDED_KEY
PCVOID pExpandedKey
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59
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: xtsaes.c:648
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 SymCryptXtsAesSelftest(void)
Definition: xtsaes.c:695
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
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
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: xtsaes.c:282
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
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: xtsaes.c:381
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: xtsaes.c:668
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: xtsaes.c:629
VOID SYMCRYPT_CALL SymCryptXtsUpdateTweak(_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE buf)
Definition: xtsaes.c:401
VOID SYMCRYPT_CALL SymCryptXtsAesKeyCopy(_In_ PCSYMCRYPT_XTS_AES_EXPANDED_KEY pSrc, _Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY pDst)
Definition: xtsaes.c:69
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
static const BYTE SymCryptXtsAesCiphertext[32]
Definition: xtsaes.c:686
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: xtsaes.c:610
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXtsAesExpandKey(_Out_ PSYMCRYPT_XTS_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey)
Definition: xtsaes.c:11
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
unsigned char BYTE
Definition: xxhash.c:193