00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 #ifndef _AESOPT_H
00133 #define _AESOPT_H
00134
00135 #if defined(__cplusplus)
00136 extern "C"
00137 {
00138 #endif
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 #define NO_TABLES 0
00154 #define ONE_TABLE 1
00155 #define FOUR_TABLES 4
00156 #define NONE 0
00157 #define PARTIAL 1
00158 #define FULL 2
00159 #define AES_LITTLE_ENDIAN 1234
00160 #define AES_BIG_ENDIAN 4321
00161
00162
00163
00164 #if defined( __CRYPTLIB__ ) && !defined( INC_ALL ) && !defined( INC_CHILD )
00165 #include "crypt/aes.h"
00166 #else
00167 #include "aes.h"
00168 #endif
00169
00170 #if defined(__GNUC__) || defined(__GNU_LIBRARY__)
00171 # if defined( __FreeBSD__ ) || defined( __OpenBSD__ )
00172 # include <sys/endian.h>
00173 # else
00174 # include <endian.h>
00175 # include <byteswap.h>
00176 #endif
00177 #elif defined(__CRYPTLIB__)
00178 # if defined( INC_ALL )
00179 # include "crypt.h"
00180 # elif defined( INC_CHILD )
00181 # include "../crypt.h"
00182 # else
00183 # include "crypt.h"
00184 # endif
00185 # if defined(DATA_LITTLEENDIAN)
00186 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00187 # else
00188 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00189 # endif
00190 #elif defined(_MSC_VER)
00191 # include <stdlib.h>
00192 #elif !defined(WIN32)
00193 # include <stdlib.h>
00194 # if !defined (_ENDIAN_H)
00195 # include <sys/param.h>
00196 # else
00197 # include _ENDIAN_H
00198 # endif
00199 #endif
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 #if !defined(PLATFORM_BYTE_ORDER)
00211 #if defined(LITTLE_ENDIAN) || defined(BIG_ENDIAN)
00212 # if defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
00213 # if defined(BYTE_ORDER)
00214 # if (BYTE_ORDER == LITTLE_ENDIAN)
00215 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00216 # elif (BYTE_ORDER == BIG_ENDIAN)
00217 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00218 # endif
00219 # endif
00220 # elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
00221 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00222 # elif !defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
00223 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00224 # endif
00225 #elif defined(_LITTLE_ENDIAN) || defined(_BIG_ENDIAN)
00226 # if defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
00227 # if defined(_BYTE_ORDER)
00228 # if (_BYTE_ORDER == _LITTLE_ENDIAN)
00229 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00230 # elif (_BYTE_ORDER == _BIG_ENDIAN)
00231 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00232 # endif
00233 # endif
00234 # elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
00235 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00236 # elif !defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
00237 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00238 # endif
00239 #elif 0
00240 #define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00241 #elif 0
00242 #define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00243 #elif (('1234' >> 24) == '1')
00244 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00245 #elif (('4321' >> 24) == '1')
00246 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00247 #endif
00248 #endif
00249
00250 #if !defined(PLATFORM_BYTE_ORDER)
00251 # error Please set undetermined byte order (lines 241 or 243 of aesopt.h).
00252 #endif
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 #ifdef AES_ENCRYPT
00263 #define ENCRYPTION
00264 #define ENCRYPTION_KEY_SCHEDULE
00265 #endif
00266
00267 #ifdef AES_DECRYPT
00268 #define DECRYPTION
00269 #define DECRYPTION_KEY_SCHEDULE
00270 #endif
00271
00272
00273
00274
00275
00276
00277
00278 #if 0
00279 #define AES_ASM
00280 #endif
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311 #if 1 || defined(AES_ASM)
00312 #define INTERNAL_BYTE_ORDER PLATFORM_BYTE_ORDER
00313 #elif 0
00314 #define INTERNAL_BYTE_ORDER AES_LITTLE_ENDIAN
00315 #elif 0
00316 #define INTERNAL_BYTE_ORDER AES_BIG_ENDIAN
00317 #else
00318 #error The internal byte order is not defined
00319 #endif
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 #if 1 && !defined(_MSC_VER)
00338 #define SAFE_IO
00339 #endif
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 #if 1
00353 #define ENC_UNROLL FULL
00354 #elif 0
00355 #define ENC_UNROLL PARTIAL
00356 #else
00357 #define ENC_UNROLL NONE
00358 #endif
00359
00360 #if 1
00361 #define DEC_UNROLL FULL
00362 #elif 0
00363 #define DEC_UNROLL PARTIAL
00364 #else
00365 #define DEC_UNROLL NONE
00366 #endif
00367
00368
00369
00370
00371
00372
00373 #if 1
00374 #define FF_TABLES
00375 #endif
00376
00377
00378
00379
00380
00381
00382
00383
00384 #if 1
00385 #define ARRAYS
00386 #endif
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399 #if defined(ARRAYS)
00400 #define s(x,c) x[c]
00401 #else
00402 #define s(x,c) x##c
00403 #endif
00404
00405
00406
00407
00408
00409
00410
00411 #if 1
00412 #define FIXED_TABLES
00413 #endif
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435 #if 1
00436 #define ENC_ROUND FOUR_TABLES
00437 #elif 0
00438 #define ENC_ROUND ONE_TABLE
00439 #else
00440 #define ENC_ROUND NO_TABLES
00441 #endif
00442
00443 #if 1
00444 #define LAST_ENC_ROUND FOUR_TABLES
00445 #elif 0
00446 #define LAST_ENC_ROUND ONE_TABLE
00447 #else
00448 #define LAST_ENC_ROUND NO_TABLES
00449 #endif
00450
00451 #if 1
00452 #define DEC_ROUND FOUR_TABLES
00453 #elif 0
00454 #define DEC_ROUND ONE_TABLE
00455 #else
00456 #define DEC_ROUND NO_TABLES
00457 #endif
00458
00459 #if 1
00460 #define LAST_DEC_ROUND FOUR_TABLES
00461 #elif 0
00462 #define LAST_DEC_ROUND ONE_TABLE
00463 #else
00464 #define LAST_DEC_ROUND NO_TABLES
00465 #endif
00466
00467
00468
00469
00470
00471 #if 1
00472 #define KEY_SCHED FOUR_TABLES
00473 #elif 0
00474 #define KEY_SCHED ONE_TABLE
00475 #else
00476 #define KEY_SCHED NO_TABLES
00477 #endif
00478
00479
00480
00481 #define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2))
00482
00483
00484
00485 #if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES
00486 #undef LAST_ENC_ROUND
00487 #define LAST_ENC_ROUND NO_TABLES
00488 #elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES
00489 #undef LAST_ENC_ROUND
00490 #define LAST_ENC_ROUND ONE_TABLE
00491 #endif
00492
00493 #if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE
00494 #undef ENC_UNROLL
00495 #define ENC_UNROLL NONE
00496 #endif
00497
00498 #if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES
00499 #undef LAST_DEC_ROUND
00500 #define LAST_DEC_ROUND NO_TABLES
00501 #elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES
00502 #undef LAST_DEC_ROUND
00503 #define LAST_DEC_ROUND ONE_TABLE
00504 #endif
00505
00506 #if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE
00507 #undef DEC_UNROLL
00508 #define DEC_UNROLL NONE
00509 #endif
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522 #if (INTERNAL_BYTE_ORDER == AES_LITTLE_ENDIAN)
00523 #define upr(x,n) (((aes_32t)(x) << (8 * (n))) | ((aes_32t)(x) >> (32 - 8 * (n))))
00524 #define ups(x,n) ((aes_32t) (x) << (8 * (n)))
00525 #define bval(x,n) ((aes_08t)((x) >> (8 * (n))))
00526 #define bytes2word(b0, b1, b2, b3) \
00527 (((aes_32t)(b3) << 24) | ((aes_32t)(b2) << 16) | ((aes_32t)(b1) << 8) | (b0))
00528 #endif
00529
00530 #if (INTERNAL_BYTE_ORDER == AES_BIG_ENDIAN)
00531 #define upr(x,n) (((aes_32t)(x) >> (8 * (n))) | ((aes_32t)(x) << (32 - 8 * (n))))
00532 #define ups(x,n) ((aes_32t) (x) >> (8 * (n))))
00533 #define bval(x,n) ((aes_08t)((x) >> (24 - 8 * (n))))
00534 #define bytes2word(b0, b1, b2, b3) \
00535 (((aes_32t)(b0) << 24) | ((aes_32t)(b1) << 16) | ((aes_32t)(b2) << 8) | (b3))
00536 #endif
00537
00538 #if defined(SAFE_IO)
00539
00540 #define word_in(x,c) bytes2word(((aes_08t*)(x)+4*c)[0], ((aes_08t*)(x)+4*c)[1], \
00541 ((aes_08t*)(x)+4*c)[2], ((aes_08t*)(x)+4*c)[3])
00542 #define word_out(x,c,v) { ((aes_08t*)(x)+4*c)[0] = bval(v,0); ((aes_08t*)(x)+4*c)[1] = bval(v,1); \
00543 ((aes_08t*)(x)+4*c)[2] = bval(v,2); ((aes_08t*)(x)+4*c)[3] = bval(v,3); }
00544
00545 #elif (INTERNAL_BYTE_ORDER == PLATFORM_BYTE_ORDER)
00546
00547 #define word_in(x,c) (*((aes_32t*)(x)+(c)))
00548 #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = (v))
00549
00550 #else
00551
00552 #if defined(bswap32)
00553 #define bsw_32 bswap32
00554 #elif defined(bswap_32)
00555 #define bsw_32 bswap_32
00556 #else
00557 #define brot(x,n) (((aes_32t)(x) << n) | ((aes_32t)(x) >> (32 - n)))
00558 #define bsw_32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))
00559 #endif
00560
00561 #define word_in(x,c) bsw_32(*((aes_32t*)(x)+(c)))
00562 #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = bsw_32(v))
00563
00564 #endif
00565
00566
00567
00568 #define WPOLY 0x011b
00569 #define BPOLY 0x1b
00570
00571
00572
00573 #define m1 0x80808080
00574 #define m2 0x7f7f7f7f
00575 #define gf_mulx(x) ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY))
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588 #ifdef AES_ASM
00589 #ifdef ENC_ROUND
00590 #undef ENC_ROUND
00591 #endif
00592 #define ENC_ROUND FOUR_TABLES
00593 #ifdef LAST_ENC_ROUND
00594 #undef LAST_ENC_ROUND
00595 #endif
00596 #define LAST_ENC_ROUND FOUR_TABLES
00597 #ifdef DEC_ROUND
00598 #undef DEC_ROUND
00599 #endif
00600 #define DEC_ROUND FOUR_TABLES
00601 #ifdef LAST_DEC_ROUND
00602 #undef LAST_DEC_ROUND
00603 #endif
00604 #define LAST_DEC_ROUND FOUR_TABLES
00605 #ifdef KEY_SCHED
00606 #undef KEY_SCHED
00607 #define KEY_SCHED FOUR_TABLES
00608 #endif
00609 #endif
00610
00611 #if defined(ENCRYPTION) || defined(AES_ASM)
00612 #if ENC_ROUND == ONE_TABLE
00613 #define FT1_SET
00614 #elif ENC_ROUND == FOUR_TABLES
00615 #define FT4_SET
00616 #else
00617 #define SBX_SET
00618 #endif
00619 #if LAST_ENC_ROUND == ONE_TABLE
00620 #define FL1_SET
00621 #elif LAST_ENC_ROUND == FOUR_TABLES
00622 #define FL4_SET
00623 #elif !defined(SBX_SET)
00624 #define SBX_SET
00625 #endif
00626 #endif
00627
00628 #if defined(DECRYPTION) || defined(AES_ASM)
00629 #if DEC_ROUND == ONE_TABLE
00630 #define IT1_SET
00631 #elif DEC_ROUND == FOUR_TABLES
00632 #define IT4_SET
00633 #else
00634 #define ISB_SET
00635 #endif
00636 #if LAST_DEC_ROUND == ONE_TABLE
00637 #define IL1_SET
00638 #elif LAST_DEC_ROUND == FOUR_TABLES
00639 #define IL4_SET
00640 #elif !defined(ISB_SET)
00641 #define ISB_SET
00642 #endif
00643 #endif
00644
00645 #if defined(ENCRYPTION_KEY_SCHEDULE) || defined(DECRYPTION_KEY_SCHEDULE)
00646 #if KEY_SCHED == ONE_TABLE
00647 #define LS1_SET
00648 #define IM1_SET
00649 #elif KEY_SCHED == FOUR_TABLES
00650 #define LS4_SET
00651 #define IM4_SET
00652 #elif !defined(SBX_SET)
00653 #define SBX_SET
00654 #endif
00655 #endif
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696 #define t_dec(m,n) t_##m##n
00697 #define t_set(m,n) t_##m##n
00698 #define t_use(m,n) t_##m##n
00699
00700 #if defined(DO_TABLES)
00701
00702
00703
00704 #if defined(FIXED_TABLES) || !defined(FF_TABLES)
00705
00706 #define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY))
00707 #define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
00708 #define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \
00709 ^ (((x>>5) & 4) * WPOLY))
00710 #define f3(x) (f2(x) ^ x)
00711 #define f9(x) (f8(x) ^ x)
00712 #define fb(x) (f8(x) ^ f2(x) ^ x)
00713 #define fd(x) (f8(x) ^ f4(x) ^ x)
00714 #define fe(x) (f8(x) ^ f4(x) ^ f2(x))
00715
00716 #else
00717
00718 #define f2(x) ((x) ? pow[log[x] + 0x19] : 0)
00719 #define f3(x) ((x) ? pow[log[x] + 0x01] : 0)
00720 #define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)
00721 #define fb(x) ((x) ? pow[log[x] + 0x68] : 0)
00722 #define fd(x) ((x) ? pow[log[x] + 0xee] : 0)
00723 #define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)
00724 #define fi(x) ((x) ? pow[ 255 - log[x]] : 0)
00725
00726 #endif
00727
00728 #if defined(FIXED_TABLES)
00729
00730 #define sb_data(w) \
00731 w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
00732 w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
00733 w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
00734 w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
00735 w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
00736 w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
00737 w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
00738 w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
00739 w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
00740 w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
00741 w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
00742 w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
00743 w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
00744 w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
00745 w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
00746 w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
00747 w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
00748 w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
00749 w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
00750 w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
00751 w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
00752 w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
00753 w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
00754 w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
00755 w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
00756 w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
00757 w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
00758 w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
00759 w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
00760 w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
00761 w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
00762 w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16)
00763
00764 #define isb_data(w) \
00765 w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
00766 w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
00767 w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
00768 w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
00769 w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
00770 w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
00771 w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
00772 w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
00773 w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
00774 w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
00775 w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
00776 w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
00777 w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
00778 w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
00779 w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
00780 w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
00781 w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
00782 w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
00783 w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
00784 w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
00785 w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
00786 w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
00787 w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
00788 w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
00789 w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
00790 w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
00791 w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
00792 w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
00793 w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
00794 w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
00795 w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
00796 w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d),
00797
00798 #define mm_data(w) \
00799 w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
00800 w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
00801 w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
00802 w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
00803 w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
00804 w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
00805 w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
00806 w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
00807 w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
00808 w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
00809 w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
00810 w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
00811 w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
00812 w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
00813 w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
00814 w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
00815 w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
00816 w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
00817 w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
00818 w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
00819 w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
00820 w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
00821 w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
00822 w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
00823 w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
00824 w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
00825 w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
00826 w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
00827 w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
00828 w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
00829 w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
00830 w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff)
00831
00832 #define h0(x) (x)
00833
00834
00835
00836
00837
00838 #define w0(p) bytes2word(p, 0, 0, 0)
00839 #define w1(p) bytes2word(0, p, 0, 0)
00840 #define w2(p) bytes2word(0, 0, p, 0)
00841 #define w3(p) bytes2word(0, 0, 0, p)
00842
00843 #define u0(p) bytes2word(f2(p), p, p, f3(p))
00844 #define u1(p) bytes2word(f3(p), f2(p), p, p)
00845 #define u2(p) bytes2word(p, f3(p), f2(p), p)
00846 #define u3(p) bytes2word(p, p, f3(p), f2(p))
00847
00848 #define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p))
00849 #define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p))
00850 #define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p))
00851 #define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p))
00852
00853 const aes_32t t_dec(r,c)[RC_LENGTH] =
00854 {
00855 w0(0x01), w0(0x02), w0(0x04), w0(0x08), w0(0x10),
00856 w0(0x20), w0(0x40), w0(0x80), w0(0x1b), w0(0x36)
00857 };
00858
00859 #define d_1(t,n,b,v) const t n[256] = { b(v##0) }
00860 #define d_4(t,n,b,v) const t n[4][256] = { { b(v##0) }, { b(v##1) }, { b(v##2) }, { b(v##3) } }
00861
00862 #else
00863
00864 aes_32t t_dec(r,c)[RC_LENGTH];
00865
00866 #define d_1(t,n,b,v) t n[256]
00867 #define d_4(t,n,b,v) t n[4][256]
00868
00869 #endif
00870
00871 #else
00872
00873 #if defined(FIXED_TABLES)
00874
00875 extern const aes_32t t_dec(r,c)[RC_LENGTH];
00876
00877 #define d_1(t,n,b,v) extern const t n[256]
00878 #define d_4(t,n,b,v) extern const t n[4][256]
00879
00880 #else
00881
00882 extern aes_32t t_dec(r,c)[RC_LENGTH];
00883
00884 #define d_1(t,n,b,v) extern t n[256]
00885 #define d_4(t,n,b,v) extern t n[4][256]
00886
00887 #endif
00888
00889 #endif
00890
00891 #ifdef SBX_SET
00892 d_1(aes_08t, t_dec(s,box), sb_data, h);
00893 #endif
00894 #ifdef ISB_SET
00895 d_1(aes_08t, t_dec(i,box), isb_data, h);
00896 #endif
00897
00898 #ifdef FT1_SET
00899 d_1(aes_32t, t_dec(f,n), sb_data, u);
00900 #endif
00901 #ifdef FT4_SET
00902 d_4(aes_32t, t_dec(f,n), sb_data, u);
00903 #endif
00904
00905 #ifdef FL1_SET
00906 d_1(aes_32t, t_dec(f,l), sb_data, w);
00907 #endif
00908 #ifdef FL4_SET
00909 d_4(aes_32t, t_dec(f,l), sb_data, w);
00910 #endif
00911
00912 #ifdef IT1_SET
00913 d_1(aes_32t, t_dec(i,n), isb_data, v);
00914 #endif
00915 #ifdef IT4_SET
00916 d_4(aes_32t, t_dec(i,n), isb_data, v);
00917 #endif
00918
00919 #ifdef IL1_SET
00920 d_1(aes_32t, t_dec(i,l), isb_data, w);
00921 #endif
00922 #ifdef IL4_SET
00923 d_4(aes_32t, t_dec(i,l), isb_data, w);
00924 #endif
00925
00926 #ifdef LS1_SET
00927 #ifdef FL1_SET
00928 #undef LS1_SET
00929 #else
00930 d_1(aes_32t, t_dec(l,s), sb_data, w);
00931 #endif
00932 #endif
00933
00934 #ifdef LS4_SET
00935 #ifdef FL4_SET
00936 #undef LS4_SET
00937 #else
00938 d_4(aes_32t, t_dec(l,s), sb_data, w);
00939 #endif
00940 #endif
00941
00942 #ifdef IM1_SET
00943 d_1(aes_32t, t_dec(i,m), mm_data, v);
00944 #endif
00945 #ifdef IM4_SET
00946 d_4(aes_32t, t_dec(i,m), mm_data, v);
00947 #endif
00948
00949
00950
00951 #define no_table(x,box,vf,rf,c) bytes2word( \
00952 box[bval(vf(x,0,c),rf(0,c))], \
00953 box[bval(vf(x,1,c),rf(1,c))], \
00954 box[bval(vf(x,2,c),rf(2,c))], \
00955 box[bval(vf(x,3,c),rf(3,c))])
00956
00957 #define one_table(x,op,tab,vf,rf,c) \
00958 ( tab[bval(vf(x,0,c),rf(0,c))] \
00959 ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \
00960 ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \
00961 ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))
00962
00963 #define four_tables(x,tab,vf,rf,c) \
00964 ( tab[0][bval(vf(x,0,c),rf(0,c))] \
00965 ^ tab[1][bval(vf(x,1,c),rf(1,c))] \
00966 ^ tab[2][bval(vf(x,2,c),rf(2,c))] \
00967 ^ tab[3][bval(vf(x,3,c),rf(3,c))])
00968
00969 #define vf1(x,r,c) (x)
00970 #define rf1(r,c) (r)
00971 #define rf2(r,c) ((8+r-c)&3)
00972
00973
00974
00975
00976 #if defined(FM4_SET)
00977 #define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0)
00978 #elif defined(FM1_SET)
00979 #define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0)
00980 #else
00981 #define dec_fmvars aes_32t g2
00982 #define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))
00983 #endif
00984
00985 #if defined(IM4_SET)
00986 #define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0)
00987 #elif defined(IM1_SET)
00988 #define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0)
00989 #else
00990 #define dec_imvars aes_32t g2, g4, g9
00991 #define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \
00992 (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1))
00993 #endif
00994
00995 #if defined(FL4_SET)
00996 #define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c)
00997 #elif defined(LS4_SET)
00998 #define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c)
00999 #elif defined(FL1_SET)
01000 #define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c)
01001 #elif defined(LS1_SET)
01002 #define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c)
01003 #else
01004 #define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c)
01005 #endif
01006
01007 #if defined(__cplusplus)
01008 }
01009 #endif
01010
01011 #endif