 |
OpenZWave Library
1.2
|
Go to the documentation of this file.
87 #if !defined( _AESOPT_H )
90 #if defined( __cplusplus )
109 #define ENCRYPTION_IN_C 1
110 #define DECRYPTION_IN_C 2
111 #define ENC_KEYING_IN_C 4
112 #define DEC_KEYING_IN_C 8
116 #define FOUR_TABLES 4
155 # define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER
157 # define ALGORITHM_BYTE_ORDER IS_LITTLE_ENDIAN
159 # define ALGORITHM_BYTE_ORDER IS_BIG_ENDIAN
161 # error The algorithm byte order is not defined
166 #if defined( __GNUC__ ) && defined( __i386__ ) \
167 || defined(_WIN32) && defined(_M_IX86) \
168 && !(defined(_WIN64) || defined(_WIN32_WCE) || defined(_MSC_VER) && (_MSC_VER <= 800))
169 # define VIA_ACE_POSSIBLE
186 #if 0 && defined( _WIN64 ) && defined( _MSC_VER )
187 # define INTEL_AES_POSSIBLE
190 #if defined( INTEL_AES_POSSIBLE ) && !defined( USE_INTEL_AES_IF_PRESENT )
191 # define USE_INTEL_AES_IF_PRESENT
211 #if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( USE_VIA_ACE_IF_PRESENT )
212 # define USE_VIA_ACE_IF_PRESENT
215 #if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( ASSUME_VIA_ACE_PRESENT )
216 # define ASSUME_VIA_ACE_PRESENT
238 #if 0 && !defined( ASM_X86_V1C )
240 #elif 0 && !defined( ASM_X86_V2 )
242 #elif 0 && !defined( ASM_X86_V2C )
244 #elif 0 && !defined( ASM_AMD64_C )
248 #if (defined ( ASM_X86_V1C ) || defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) \
249 && !defined( _M_IX86 ) || defined( ASM_AMD64_C ) && !defined( _M_X64 )
250 # error Assembler code is only available for x86 and AMD64 systems
269 #if 1 && !defined( _MSC_VER )
285 # define ENC_UNROLL FULL
287 # define ENC_UNROLL PARTIAL
289 # define ENC_UNROLL NONE
293 # define DEC_UNROLL FULL
295 # define DEC_UNROLL PARTIAL
297 # define DEC_UNROLL NONE
301 # define ENC_KS_UNROLL
305 # define DEC_KS_UNROLL
334 #if 1 && !(defined( _MSC_VER ) && ( _MSC_VER <= 800 ))
335 # define FIXED_TABLES
344 # define to_byte(x) ((uint8_t)(x))
346 # define to_byte(x) ((x) & 0xff)
358 #if 1 && defined( _MSC_VER ) && ( _MSC_VER >= 1300 )
359 # define TABLE_ALIGN 32
368 #if 0 && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))
369 # define REDUCE_CODE_SIZE
393 # define ENC_ROUND FOUR_TABLES
395 # define ENC_ROUND ONE_TABLE
397 # define ENC_ROUND NO_TABLES
401 # define LAST_ENC_ROUND FOUR_TABLES
403 # define LAST_ENC_ROUND ONE_TABLE
405 # define LAST_ENC_ROUND NO_TABLES
409 # define DEC_ROUND FOUR_TABLES
411 # define DEC_ROUND ONE_TABLE
413 # define DEC_ROUND NO_TABLES
417 # define LAST_DEC_ROUND FOUR_TABLES
419 # define LAST_DEC_ROUND ONE_TABLE
421 # define LAST_DEC_ROUND NO_TABLES
429 # define KEY_SCHED FOUR_TABLES
431 # define KEY_SCHED ONE_TABLE
433 # define KEY_SCHED NO_TABLES
440 #if !defined( _MSC_VER ) && !defined( __GNUC__ )
441 # if defined( ASSUME_VIA_ACE_PRESENT )
442 # undef ASSUME_VIA_ACE_PRESENT
444 # if defined( USE_VIA_ACE_IF_PRESENT )
445 # undef USE_VIA_ACE_IF_PRESENT
449 #if defined( ASSUME_VIA_ACE_PRESENT ) && !defined( USE_VIA_ACE_IF_PRESENT )
450 # define USE_VIA_ACE_IF_PRESENT
454 #if 1 || defined( USE_VIA_ACE_IF_PRESENT ) && !defined ( AES_REV_DKS )
459 #if defined( USE_INTEL_AES_IF_PRESENT ) && defined ( AES_REV_DKS )
465 #if ( defined( ASM_X86_V1C ) || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) ) \
466 && (ALGORITHM_BYTE_ORDER != PLATFORM_BYTE_ORDER)
467 # undef ALGORITHM_BYTE_ORDER
468 # define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER
482 #if defined( ARRAYS )
494 #if !defined( AES_ENCRYPT )
495 # define EFUNCS_IN_C 0
496 #elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \
497 || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )
498 # define EFUNCS_IN_C ENC_KEYING_IN_C
499 #elif !defined( ASM_X86_V2 )
500 # define EFUNCS_IN_C ( ENCRYPTION_IN_C | ENC_KEYING_IN_C )
502 # define EFUNCS_IN_C 0
505 #if !defined( AES_DECRYPT )
506 # define DFUNCS_IN_C 0
507 #elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \
508 || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )
509 # define DFUNCS_IN_C DEC_KEYING_IN_C
510 #elif !defined( ASM_X86_V2 )
511 # define DFUNCS_IN_C ( DECRYPTION_IN_C | DEC_KEYING_IN_C )
513 # define DFUNCS_IN_C 0
516 #define FUNCS_IN_C ( EFUNCS_IN_C | DFUNCS_IN_C )
520 #define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2))
524 #if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES
525 # undef LAST_ENC_ROUND
526 # define LAST_ENC_ROUND NO_TABLES
527 #elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES
528 # undef LAST_ENC_ROUND
529 # define LAST_ENC_ROUND ONE_TABLE
532 #if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE
534 # define ENC_UNROLL NONE
537 #if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES
538 # undef LAST_DEC_ROUND
539 # define LAST_DEC_ROUND NO_TABLES
540 #elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES
541 # undef LAST_DEC_ROUND
542 # define LAST_DEC_ROUND ONE_TABLE
545 #if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE
547 # define DEC_UNROLL NONE
550 #if defined( bswap32 )
551 # define aes_sw32 bswap32
552 #elif defined( bswap_32 )
553 # define aes_sw32 bswap_32
555 # define brot(x,n) (((uint32_t)(x) << n) | ((uint32_t)(x) >> (32 - n)))
556 # define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))
570 #if ( ALGORITHM_BYTE_ORDER == IS_LITTLE_ENDIAN )
571 # define upr(x,n) (((uint32_t)(x) << (8 * (n))) | ((uint32_t)(x) >> (32 - 8 * (n))))
572 # define ups(x,n) ((uint32_t) (x) << (8 * (n)))
573 # define bval(x,n) to_byte((x) >> (8 * (n)))
574 # define bytes2word(b0, b1, b2, b3) \
575 (((uint32_t)(b3) << 24) | ((uint32_t)(b2) << 16) | ((uint32_t)(b1) << 8) | (b0))
578 #if ( ALGORITHM_BYTE_ORDER == IS_BIG_ENDIAN )
579 # define upr(x,n) (((uint32_t)(x) >> (8 * (n))) | ((uint32_t)(x) << (32 - 8 * (n))))
580 # define ups(x,n) ((uint32_t) (x) >> (8 * (n)))
581 # define bval(x,n) to_byte((x) >> (24 - 8 * (n)))
582 # define bytes2word(b0, b1, b2, b3) \
583 (((uint32_t)(b0) << 24) | ((uint32_t)(b1) << 16) | ((uint32_t)(b2) << 8) | (b3))
586 #if defined( SAFE_IO )
587 # define word_in(x,c) bytes2word(((const uint8_t*)(x)+4*c)[0], ((const uint8_t*)(x)+4*c)[1], \
588 ((const uint8_t*)(x)+4*c)[2], ((const uint8_t*)(x)+4*c)[3])
589 # define word_out(x,c,v) { ((uint8_t*)(x)+4*c)[0] = bval(v,0); ((uint8_t*)(x)+4*c)[1] = bval(v,1); \
590 ((uint8_t*)(x)+4*c)[2] = bval(v,2); ((uint8_t*)(x)+4*c)[3] = bval(v,3); }
591 #elif ( ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER )
592 # define word_in(x,c) (*((uint32_t*)(x)+(c)))
593 # define word_out(x,c,v) (*((uint32_t*)(x)+(c)) = (v))
595 # define word_in(x,c) aes_sw32(*((uint32_t*)(x)+(c)))
596 # define word_out(x,c,v) (*((uint32_t*)(x)+(c)) = aes_sw32(v))
606 #define gf_c1 0x80808080
607 #define gf_c2 0x7f7f7f7f
608 #define gf_mulx(x) ((((x) & gf_c2) << 1) ^ ((((x) & gf_c1) >> 7) * BPOLY))
621 #if defined( ASM_X86_V1C )
622 # if defined( ENC_ROUND )
625 # define ENC_ROUND FOUR_TABLES
626 # if defined( LAST_ENC_ROUND )
627 # undef LAST_ENC_ROUND
629 # define LAST_ENC_ROUND FOUR_TABLES
630 # if defined( DEC_ROUND )
633 # define DEC_ROUND FOUR_TABLES
634 # if defined( LAST_DEC_ROUND )
635 # undef LAST_DEC_ROUND
637 # define LAST_DEC_ROUND FOUR_TABLES
638 # if defined( KEY_SCHED )
640 # define KEY_SCHED FOUR_TABLES
644 #if ( FUNCS_IN_C & ENCRYPTION_IN_C ) || defined( ASM_X86_V1C )
645 # if ENC_ROUND == ONE_TABLE
647 # elif ENC_ROUND == FOUR_TABLES
652 # if LAST_ENC_ROUND == ONE_TABLE
654 # elif LAST_ENC_ROUND == FOUR_TABLES
656 # elif !defined( SBX_SET )
661 #if ( FUNCS_IN_C & DECRYPTION_IN_C ) || defined( ASM_X86_V1C )
662 # if DEC_ROUND == ONE_TABLE
664 # elif DEC_ROUND == FOUR_TABLES
669 # if LAST_DEC_ROUND == ONE_TABLE
671 # elif LAST_DEC_ROUND == FOUR_TABLES
673 # elif !defined(ISB_SET)
678 #if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )))
679 # if ((FUNCS_IN_C & ENC_KEYING_IN_C) || (FUNCS_IN_C & DEC_KEYING_IN_C))
680 # if KEY_SCHED == ONE_TABLE
681 # if !defined( FL1_SET ) && !defined( FL4_SET )
684 # elif KEY_SCHED == FOUR_TABLES
685 # if !defined( FL4_SET )
688 # elif !defined( SBX_SET )
692 # if (FUNCS_IN_C & DEC_KEYING_IN_C)
693 # if KEY_SCHED == ONE_TABLE
695 # elif KEY_SCHED == FOUR_TABLES
697 # elif !defined( SBX_SET )
705 #define no_table(x,box,vf,rf,c) bytes2word( \
706 box[bval(vf(x,0,c),rf(0,c))], \
707 box[bval(vf(x,1,c),rf(1,c))], \
708 box[bval(vf(x,2,c),rf(2,c))], \
709 box[bval(vf(x,3,c),rf(3,c))])
711 #define one_table(x,op,tab,vf,rf,c) \
712 ( tab[bval(vf(x,0,c),rf(0,c))] \
713 ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \
714 ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \
715 ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))
717 #define four_tables(x,tab,vf,rf,c) \
718 ( tab[0][bval(vf(x,0,c),rf(0,c))] \
719 ^ tab[1][bval(vf(x,1,c),rf(1,c))] \
720 ^ tab[2][bval(vf(x,2,c),rf(2,c))] \
721 ^ tab[3][bval(vf(x,3,c),rf(3,c))])
723 #define vf1(x,r,c) (x)
725 #define rf2(r,c) ((8+r-c)&3)
730 #if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )))
732 #if defined( FM4_SET )
733 # define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0)
734 #elif defined( FM1_SET )
735 # define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0)
737 # define dec_fmvars uint32_t g2
738 # define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))
741 #if defined( IM4_SET )
742 # define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0)
743 #elif defined( IM1_SET )
744 # define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0)
746 # define dec_imvars uint32_t g2, g4, g9
747 # define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \
748 (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1))
751 #if defined( FL4_SET )
752 # define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c)
753 #elif defined( LS4_SET )
754 # define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c)
755 #elif defined( FL1_SET )
756 # define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c)
757 #elif defined( LS1_SET )
758 # define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c)
760 # define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c)
765 #if defined( ASM_X86_V1C ) && defined( AES_DECRYPT ) && !defined( ISB_SET )