Ap4AesBlockCipher.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:62k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2. * AES Block cipher
  3. * (c) 2005 Gilles Boccon-Gibod
  4. * Portions (c) 2001, Dr Brian Gladman (see below)
  5. */
  6. /*
  7. -------------------------------------------------------------------------
  8. Copyright (c) 2001, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK.
  9. All rights reserved.
  10. LICENSE TERMS
  11. The free distribution and use of this software in both source and binary 
  12. form is allowed (with or without changes) provided that:
  13. 1. distributions of this source code include the above copyright 
  14. notice, this list of conditions and the following disclaimer;
  15. 2. distributions in binary form include the above copyright
  16. notice, this list of conditions and the following disclaimer
  17. in the documentation and/or other associated materials;
  18. 3. the copyright holder's name is not used to endorse products 
  19. built using this software without specific written permission. 
  20. DISCLAIMER
  21. This software is provided 'as is' with no explicit or implied warranties
  22. in respect of its properties, including, but not limited to, correctness 
  23. and fitness for purpose.
  24. -------------------------------------------------------------------------
  25. Issue Date: 29/07/2002
  26. */
  27. /*----------------------------------------------------------------------
  28. |       includes
  29. +---------------------------------------------------------------------*/
  30. #include "Ap4AesBlockCipher.h"
  31. #include "Ap4Results.h"
  32. /*----------------------------------------------------------------------
  33. |       build options
  34. +---------------------------------------------------------------------*/
  35. #define ENCRYPTION_KEY_SCHEDULE
  36. #define ENCRYPTION
  37. #define BLOCK_SIZE AP4_AES_BLOCK_SIZE
  38. /*----------------------------------------------------------------------
  39. |       options
  40. +---------------------------------------------------------------------*/
  41. /*  START OF CONFIGURATION OPTIONS
  42.     USE OF DEFINES
  43.   
  44.     Later in this section there are a number of defines that control the 
  45.     operation of the code.  In each section, the purpose of each define is 
  46.     explained so that the relevant form can be included or excluded by 
  47.     setting either 1's or 0's respectively on the branches of the related 
  48.     #if clauses.
  49. */
  50. /*  1. BYTE ORDER IN 32-BIT WORDS
  51.     To obtain the highest speed on processors with 32-bit words, this code 
  52.     needs to determine the order in which bytes are packed into such words.
  53.     The following block of code is an attempt to capture the most obvious 
  54.     ways in which various environemnts define byte order. It may well fail, 
  55.     in which case the definitions will need to be set by editing at the 
  56.     points marked **** EDIT HERE IF NECESSARY **** below.
  57. */
  58. #define AES_LITTLE_ENDIAN   1234 /* byte 0 is least significant (i386) */
  59. #define AES_BIG_ENDIAN      4321 /* byte 0 is most significant (mc68k) */
  60. #if !defined(AP4_PLATFORM_BYTE_ORDER)
  61. #  error AP4_PLATFORM_BYTE_ORDER is not set
  62. #endif
  63. #if 0
  64. #if AP4_PLATFORM_BYTE_ORDER == AP4_PLATFORM_BIG_ENDIAN
  65. #define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
  66. #elif AP4_PLATFORM_BYTE_ORDER == AP4_PLATFORM_LITTLE_ENDIAN
  67. #define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
  68. #else
  69. #error unsupported value for AP4_PLATFORM_BYTE_ORDER
  70. #endif
  71. #endif
  72. #define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
  73. /*  2. BYTE ORDER WITHIN 32 BIT WORDS
  74.     The fundamental data processing units in Rijndael are 8-bit bytes. The 
  75.     input, output and key input are all enumerated arrays of bytes in which 
  76.     bytes are numbered starting at zero and increasing to one less than the 
  77.     number of bytes in the array in question. This enumeration is only used 
  78.     for naming bytes and does not imply any adjacency or order relationship 
  79.     from one byte to another. When these inputs and outputs are considered 
  80.     as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to 
  81.     byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte. 
  82.     In this implementation bits are numbered from 0 to 7 starting at the 
  83.     numerically least significant end of each byte (bit n represents 2^n).
  84.     However, Rijndael can be implemented more efficiently using 32-bit 
  85.     words by packing bytes into words so that bytes 4*n to 4*n+3 are placed
  86.     into word[n]. While in principle these bytes can be assembled into words 
  87.     in any positions, this implementation only supports the two formats in 
  88.     which bytes in adjacent positions within words also have adjacent byte
  89.     numbers. This order is called big-endian if the lowest numbered bytes 
  90.     in words have the highest numeric significance and little-endian if the 
  91.     opposite applies. 
  92.     
  93.     This code can work in either order irrespective of the order used by the 
  94.     machine on which it runs. Normally the internal byte order will be set
  95.     to the order of the processor on which the code is to be run but this
  96.     define can be used to reverse this in special situations
  97. */
  98. #if 1
  99. #define INTERNAL_BYTE_ORDER PLATFORM_BYTE_ORDER
  100. #elif defined(AES_LITTLE_ENDIAN)
  101. #define INTERNAL_BYTE_ORDER AES_LITTLE_ENDIAN
  102. #elif defined(AES_BIG_ENDIAN)
  103. #define INTERNAL_BYTE_ORDER AES_BIG_ENDIAN
  104. #endif
  105. /*  3. FAST INPUT/OUTPUT OPERATIONS.  
  106.     On some machines it is possible to improve speed by transferring the 
  107.     bytes in the input and output arrays to and from the internal 32-bit 
  108.     variables by addressing these arrays as if they are arrays of 32-bit 
  109.     words.  On some machines this will always be possible but there may 
  110.     be a large performance penalty if the byte arrays are not aligned on 
  111.     the normal word boundaries. On other machines this technique will 
  112.     lead to memory access errors when such 32-bit word accesses are not
  113.     properly aligned. The option SAFE_IO avoids such problems but will 
  114.     often be slower on those machines that support misaligned access 
  115.     (especially so if care is taken to align the input  and output byte 
  116.     arrays on 32-bit word boundaries). If SAFE_IO is not defined it is 
  117.     assumed that access to byte arrays as if they are arrays of 32-bit 
  118.     words will not cause problems when such accesses are misaligned.
  119. */
  120. #if 1
  121. #define SAFE_IO
  122. #endif
  123. /*  4. LOOP UNROLLING
  124.     The code for encryption and decrytpion cycles through a number of rounds
  125.     that can be implemented either in a loop or by expanding the code into a 
  126.     long sequence of instructions, the latter producing a larger program but
  127.     one that will often be much faster. The latter is called loop unrolling.
  128.     There are also potential speed advantages in expanding two iterations in
  129.     a loop with half the number of iterations, which is called partial loop
  130.     unrolling.  The following options allow partial or full loop unrolling 
  131.     to be set independently for encryption and decryption
  132. */
  133. #if 1
  134. #define ENC_UNROLL  FULL
  135. #elif 0
  136. #define ENC_UNROLL  PARTIAL
  137. #else
  138. #define ENC_UNROLL  NONE
  139. #endif
  140. #if 1
  141. #define DEC_UNROLL  FULL
  142. #elif 0
  143. #define DEC_UNROLL  PARTIAL
  144. #else
  145. #define DEC_UNROLL  NONE
  146. #endif
  147. /*  5. FIXED OR DYNAMIC TABLES
  148.     When this section is included the tables used by the code are comipled 
  149.     statically into the binary file.  Otherwise they are computed once when 
  150.     the code is first used.
  151. */
  152. #if 1
  153. #define FIXED_TABLES
  154. #endif
  155. /*  6. FAST FINITE FIELD OPERATIONS
  156.     If this section is included, tables are used to provide faster finite 
  157.     field arithmetic (this has no effect if FIXED_TABLES is defined).
  158. */
  159. #if 1
  160. #define FF_TABLES
  161. #endif
  162. /*  7. INTERNAL STATE VARIABLE FORMAT
  163.     The internal state of Rijndael is stored in a number of local 32-bit 
  164.     word varaibles which can be defined either as an array or as individual 
  165.     names variables. Include this section if you want to store these local
  166.     variables in arrays. Otherwise individual local variables will be used.
  167. */
  168. #if 1
  169. #define ARRAYS
  170. #endif
  171. /* In this implementation the columns of the state array are each held in
  172.    32-bit words. The state array can be held in various ways: in an array
  173.    of words, in a number of individual word variables or in a number of 
  174.    processor registers. The following define maps a variable name x and
  175.    a column number c to the way the state array variable is to be held.
  176.    The first define below maps the state into an array x[c] whereas the 
  177.    second form maps the state into a number of individual variables x0,
  178.    x1, etc.  Another form could map individual state colums to machine
  179.    register names.
  180. */
  181. #if defined(ARRAYS)
  182. #define s(x,c) x[c]
  183. #else
  184. #define s(x,c) x##c
  185. #endif
  186. /*  8. VARIABLE BLOCK SIZE SPEED
  187.     This section is only relevant if you wish to use the variable block
  188.     length feature of the code.  Include this section if you place more
  189.     emphasis on speed rather than code size.
  190. */
  191. #if 1
  192. #define FAST_VARIABLE
  193. #endif
  194. /*  9. INTERNAL TABLE CONFIGURATION
  195.     This cipher proceeds by repeating in a number of cycles known as 'rounds'
  196.     which are implemented by a round function which can optionally be speeded
  197.     up using tables.  The basic tables are each 256 32-bit words, with either 
  198.     one or four tables being required for each round function depending on
  199.     how much speed is required. The encryption and decryption round functions
  200.     are different and the last encryption and decrytpion round functions are
  201.     different again making four different round functions in all.
  202.     This means that:
  203.       1. Normal encryption and decryption rounds can each use either 0, 1 
  204.          or 4 tables and table spaces of 0, 1024 or 4096 bytes each.
  205.       2. The last encryption and decryption rounds can also use either 0, 1 
  206.          or 4 tables and table spaces of 0, 1024 or 4096 bytes each.
  207.     Include or exclude the appropriate definitions below to set the number
  208.     of tables used by this implementation.
  209. */
  210. #if 1   /* set tables for the normal encryption round */
  211. #define ENC_ROUND   FOUR_TABLES
  212. #elif 0
  213. #define ENC_ROUND   ONE_TABLE
  214. #else
  215. #define ENC_ROUND   NO_TABLES
  216. #endif
  217. #if 1   /* set tables for the last encryption round */
  218. #define LAST_ENC_ROUND  FOUR_TABLES
  219. #elif 0
  220. #define LAST_ENC_ROUND  ONE_TABLE
  221. #else
  222. #define LAST_ENC_ROUND  NO_TABLES
  223. #endif
  224. #if 1   /* set tables for the normal decryption round */
  225. #define DEC_ROUND   FOUR_TABLES
  226. #elif 0
  227. #define DEC_ROUND   ONE_TABLE
  228. #else
  229. #define DEC_ROUND   NO_TABLES
  230. #endif
  231. #if 1   /* set tables for the last decryption round */
  232. #define LAST_DEC_ROUND  FOUR_TABLES
  233. #elif 0
  234. #define LAST_DEC_ROUND  ONE_TABLE
  235. #else
  236. #define LAST_DEC_ROUND  NO_TABLES
  237. #endif
  238. /*  The decryption key schedule can be speeded up with tables in the same
  239.     way that the round functions can.  Include or exclude the following 
  240.     defines to set this requirement.
  241. */
  242. #if 1
  243. #define KEY_SCHED   FOUR_TABLES
  244. #elif 0
  245. #define KEY_SCHED   ONE_TABLE
  246. #else
  247. #define KEY_SCHED   NO_TABLES
  248. #endif
  249. /* END OF CONFIGURATION OPTIONS */
  250. #define NO_TABLES   0   /* DO NOT CHANGE */
  251. #define ONE_TABLE   1   /* DO NOT CHANGE */
  252. #define FOUR_TABLES 4   /* DO NOT CHANGE */
  253. #define NONE        0   /* DO NOT CHANGE */
  254. #define PARTIAL     1   /* DO NOT CHANGE */
  255. #define FULL        2   /* DO NOT CHANGE */
  256. #if defined(BLOCK_SIZE) && ((BLOCK_SIZE & 3) || BLOCK_SIZE < 16 || BLOCK_SIZE > 32)
  257. #error An illegal block size has been specified.
  258. #endif  
  259. #if !defined(BLOCK_SIZE)
  260. #define RC_LENGTH    29
  261. #else
  262. #define RC_LENGTH   5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11)
  263. #endif
  264. /* Disable at least some poor combinations of options */
  265. #if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES
  266. #undef  LAST_ENC_ROUND
  267. #define LAST_ENC_ROUND  NO_TABLES
  268. #elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES
  269. #undef  LAST_ENC_ROUND
  270. #define LAST_ENC_ROUND  ONE_TABLE 
  271. #endif
  272. #if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE
  273. #undef  ENC_UNROLL
  274. #define ENC_UNROLL  NONE
  275. #endif
  276. #if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES
  277. #undef  LAST_DEC_ROUND
  278. #define LAST_DEC_ROUND  NO_TABLES
  279. #elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES
  280. #undef  LAST_DEC_ROUND
  281. #define LAST_DEC_ROUND  ONE_TABLE 
  282. #endif
  283. #if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE
  284. #undef  DEC_UNROLL
  285. #define DEC_UNROLL  NONE
  286. #endif
  287. /*  upr(x,n):  rotates bytes within words by n positions, moving bytes to
  288.                higher index positions with wrap around into low positions
  289.     ups(x,n):  moves bytes by n positions to higher index positions in 
  290.                words but without wrap around
  291.     bval(x,n): extracts a byte from a word
  292.     NOTE:      The definitions given here are intended only for use with 
  293.                unsigned variables and with shift counts that are compile
  294.                time constants
  295. */
  296. #if (INTERNAL_BYTE_ORDER == AES_LITTLE_ENDIAN)
  297. #if defined(_MSC_VER)
  298. #define upr(x,n)        _lrotl((aes_32t)(x), 8 * (n))
  299. #else
  300. #define upr(x,n)        ((aes_32t)(x) << 8 * (n) | (aes_32t)(x) >> (32 - 8 * (n)))
  301. #endif
  302. #define ups(x,n)        ((aes_32t)(x) << 8 * (n))
  303. #define bval(x,n)       ((aes_08t)((x) >> 8 * (n)))
  304. #define bytes2word(b0, b1, b2, b3)  
  305.         (((aes_32t)(b3) << 24) | ((aes_32t)(b2) << 16) | ((aes_32t)(b1) << 8) | (b0))
  306. #endif
  307. #if (INTERNAL_BYTE_ORDER == AES_BIG_ENDIAN)
  308. #define upr(x,n)        ((aes_32t)(x) >> 8 * (n) | (aes_32t)(x) << 32 - 8 * (n))
  309. #define ups(x,n)        ((aes_32t)(x) >> 8 * (n)))
  310. #define bval(x,n)       ((aes_08t)((x) >> (24 - 8 * (n))))
  311. #define bytes2word(b0, b1, b2, b3)  
  312.         (((aes_32t)(b0) << 24) | ((aes_32t)(b1) << 16) | ((aes_32t)(b2) << 8) | (b3))
  313. #endif
  314. #if defined(SAFE_IO)
  315. #define word_in(x)      bytes2word((x)[0], (x)[1], (x)[2], (x)[3])
  316. #define word_out(x,v)   { (x)[0] = bval(v,0); (x)[1] = bval(v,1);   
  317.                           (x)[2] = bval(v,2); (x)[3] = bval(v,3);   }
  318. #elif (INTERNAL_BYTE_ORDER == PLATFORM_BYTE_ORDER)
  319. #define word_in(x)      *(aes_32t*)(x)
  320. #define word_out(x,v)   *(aes_32t*)(x) = (v)
  321. #else
  322. #if !defined(bswap_32)
  323. #if !defined(_MSC_VER)
  324. #define _lrotl(x,n)     ((((aes_32t)(x)) <<  n) | (((aes_32t)(x)) >> (32 - n)))
  325. #endif
  326. #define bswap_32(x)     ((_lrotl((x),8) & 0x00ff00ff) | (_lrotl((x),24) & 0xff00ff00)) 
  327. #endif
  328. #define word_in(x)      bswap_32(*(aes_32t*)(x))
  329. #define word_out(x,v)   *(aes_32t*)(x) = bswap_32(v)
  330. #endif
  331. /* the finite field modular polynomial and elements */
  332. #define WPOLY   0x011b
  333. #define BPOLY     0x1b
  334. /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
  335. #define m1  0x80808080
  336. #define m2  0x7f7f7f7f
  337. #define FFmulX(x)  ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY))
  338. /* The following defines provide alternative definitions of FFmulX that might
  339.    give improved performance if a fast 32-bit multiply is not available. Note
  340.    that a temporary variable u needs to be defined where FFmulX is used.
  341. #define FFmulX(x) (u = (x) & m1, u |= (u >> 1), ((x) & m2) << 1) ^ ((u >> 3) | (u >> 6)) 
  342. #define m4  (0x01010101 * BPOLY)
  343. #define FFmulX(x) (u = (x) & m1, ((x) & m2) << 1) ^ ((u - (u >> 7)) & m4) 
  344. */
  345. /* Work out which tables are needed for the different options   */
  346. #ifdef  AES_ASM
  347. #ifdef  ENC_ROUND
  348. #undef  ENC_ROUND
  349. #endif
  350. #define ENC_ROUND   FOUR_TABLES
  351. #ifdef  LAST_ENC_ROUND
  352. #undef  LAST_ENC_ROUND
  353. #endif
  354. #define LAST_ENC_ROUND  FOUR_TABLES
  355. #ifdef  DEC_ROUND
  356. #undef  DEC_ROUND
  357. #endif
  358. #define DEC_ROUND   FOUR_TABLES
  359. #ifdef  LAST_DEC_ROUND
  360. #undef  LAST_DEC_ROUND
  361. #endif
  362. #define LAST_DEC_ROUND  FOUR_TABLES
  363. #ifdef  KEY_SCHED
  364. #undef  KEY_SCHED
  365. #define KEY_SCHED   FOUR_TABLES
  366. #endif
  367. #endif
  368. #if defined(ENCRYPTION) || defined(AES_ASM)
  369. #if ENC_ROUND == ONE_TABLE
  370. #define FT1_SET
  371. #elif ENC_ROUND == FOUR_TABLES
  372. #define FT4_SET
  373. #else
  374. #define SBX_SET
  375. #endif
  376. #if LAST_ENC_ROUND == ONE_TABLE
  377. #define FL1_SET
  378. #elif LAST_ENC_ROUND == FOUR_TABLES
  379. #define FL4_SET
  380. #elif !defined(SBX_SET)
  381. #define SBX_SET
  382. #endif
  383. #endif
  384. #if defined(DECRYPTION) || defined(AES_ASM)
  385. #if DEC_ROUND == ONE_TABLE
  386. #define IT1_SET
  387. #elif DEC_ROUND == FOUR_TABLES
  388. #define IT4_SET
  389. #else
  390. #define ISB_SET
  391. #endif
  392. #if LAST_DEC_ROUND == ONE_TABLE
  393. #define IL1_SET
  394. #elif LAST_DEC_ROUND == FOUR_TABLES
  395. #define IL4_SET
  396. #elif !defined(ISB_SET)
  397. #define ISB_SET
  398. #endif
  399. #endif
  400. #if defined(ENCRYPTION_KEY_SCHEDULE) || defined(DECRYPTION_KEY_SCHEDULE)
  401. #if KEY_SCHED == ONE_TABLE
  402. #define LS1_SET
  403. #define IM1_SET
  404. #elif KEY_SCHED == FOUR_TABLES
  405. #define LS4_SET
  406. #define IM4_SET
  407. #elif !defined(SBX_SET)
  408. #define SBX_SET
  409. #endif
  410. #endif
  411. #ifdef  FIXED_TABLES
  412. #define prefx   static const
  413. #else
  414. #define prefx   extern
  415. extern aes_08t  tab_init;
  416. void gen_tabs(void);
  417. #endif
  418. //prefx aes_32t  rcon_tab[29];
  419. //
  420. //#ifdef  SBX_SET
  421. //prefx aes_08t s_box[256];
  422. //#endif
  423. //
  424. //#ifdef  ISB_SET
  425. //prefx aes_08t inv_s_box[256];
  426. //#endif
  427. //
  428. //#ifdef  FT1_SET
  429. //prefx aes_32t ft_tab[256];
  430. //#endif
  431. //
  432. //#ifdef  FT4_SET
  433. //prefx aes_32t ft_tab[4][256];
  434. //#endif
  435. //
  436. //#ifdef  FL1_SET
  437. //prefx aes_32t fl_tab[256];
  438. //#endif
  439. //
  440. //#ifdef  FL4_SET
  441. //prefx aes_32t fl_tab[4][256];
  442. //#endif
  443. //
  444. //#ifdef  IT1_SET
  445. //prefx aes_32t it_tab[256];
  446. //#endif
  447. //
  448. //#ifdef  IT4_SET
  449. //prefx aes_32t it_tab[4][256];
  450. //#endif
  451. //
  452. //#ifdef  IL1_SET
  453. //prefx aes_32t il_tab[256];
  454. //#endif
  455. //
  456. //#ifdef  IL4_SET
  457. //prefx aes_32t il_tab[4][256];
  458. //#endif
  459. //
  460. //#ifdef  LS1_SET
  461. //#ifdef  FL1_SET
  462. //#undef  LS1_SET
  463. //#else
  464. //prefx aes_32t ls_tab[256];
  465. //#endif
  466. //#endif
  467. //
  468. //#ifdef  LS4_SET
  469. //#ifdef  FL4_SET
  470. //#undef  LS4_SET
  471. //#else
  472. //prefx aes_32t ls_tab[4][256];
  473. //#endif
  474. //#endif
  475. //
  476. //#ifdef  IM1_SET
  477. //prefx aes_32t im_tab[256];
  478. //#endif
  479. //
  480. //#ifdef  IM4_SET
  481. //prefx aes_32t im_tab[4][256];
  482. //#endif
  483. /* Set the number of columns in nc.  Note that it is important
  484.    that nc is a constant which is known at compile time if the
  485.    highest speed version of the code is needed.
  486. */
  487. #if defined(BLOCK_SIZE)
  488. #define nc  (BLOCK_SIZE >> 2)
  489. #else
  490. #define nc  (cx->n_blk >> 2)
  491. #endif
  492. /* generic definitions of Rijndael macros that use tables    */
  493. #define no_table(x,box,vf,rf,c) bytes2word( 
  494.     box[bval(vf(x,0,c),rf(0,c))], 
  495.     box[bval(vf(x,1,c),rf(1,c))], 
  496.     box[bval(vf(x,2,c),rf(2,c))], 
  497.     box[bval(vf(x,3,c),rf(3,c))])
  498. #define one_table(x,op,tab,vf,rf,c) 
  499.  (     tab[bval(vf(x,0,c),rf(0,c))] 
  500.   ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) 
  501.   ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) 
  502.   ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))
  503. #define four_tables(x,tab,vf,rf,c) 
  504.  (  tab[0][bval(vf(x,0,c),rf(0,c))] 
  505.   ^ tab[1][bval(vf(x,1,c),rf(1,c))] 
  506.   ^ tab[2][bval(vf(x,2,c),rf(2,c))] 
  507.   ^ tab[3][bval(vf(x,3,c),rf(3,c))])
  508. #define vf1(x,r,c)  (x)
  509. #define rf1(r,c)    (r)
  510. #define rf2(r,c)    ((r-c)&3)
  511. /* perform forward and inverse column mix operation on four bytes in long word x in */
  512. /* parallel. NOTE: x must be a simple variable, NOT an expression in these macros.  */
  513. #define dec_fmvars
  514. #if defined(FM4_SET)    /* not currently used */
  515. #define fwd_mcol(x)     four_tables(x,fm_tab,vf1,rf1,0)
  516. #elif defined(FM1_SET)  /* not currently used */
  517. #define fwd_mcol(x)     one_table(x,upr,fm_tab,vf1,rf1,0)
  518. #else
  519. #undef  dec_fmvars
  520. #define dec_fmvars      aes_32t f1, f2;
  521. #define fwd_mcol(x)     (f1 = (x), f2 = FFmulX(f1), f2 ^ upr(f1 ^ f2, 3) ^ upr(f1, 2) ^ upr(f1, 1))
  522. #endif
  523. #define dec_imvars
  524. #if defined(IM4_SET)
  525. #define inv_mcol(x)     four_tables(x,im_tab,vf1,rf1,0)
  526. #elif defined(IM1_SET)
  527. #define inv_mcol(x)     one_table(x,upr,im_tab,vf1,rf1,0)
  528. #else
  529. #undef  dec_imvars
  530. #define dec_imvars      aes_32t    f2, f4, f8, f9;
  531. #define inv_mcol(x) 
  532.     (f9 = (x), f2 = FFmulX(f9), f4 = FFmulX(f2), f8 = FFmulX(f4), f9 ^= f8, 
  533.     f2 ^= f4 ^ f8 ^ upr(f2 ^ f9,3) ^ upr(f4 ^ f9,2) ^ upr(f9,1))
  534. #endif
  535. #if defined(FL4_SET)
  536. #define ls_box(x,c)     four_tables(x,fl_tab,vf1,rf2,c)
  537. #elif   defined(LS4_SET)
  538. #define ls_box(x,c)     four_tables(x,ls_tab,vf1,rf2,c)
  539. #elif defined(FL1_SET)
  540. #define ls_box(x,c)     one_table(x,upr,fl_tab,vf1,rf2,c)
  541. #elif defined(LS1_SET)
  542. #define ls_box(x,c)     one_table(x,upr,ls_tab,vf1,rf2,c)
  543. #else
  544. #define ls_box(x,c)     no_table(x,s_box,vf1,rf2,c)
  545. #endif
  546. /*----------------------------------------------------------------------
  547. |       tables
  548. +---------------------------------------------------------------------*/
  549. #if defined(FIXED_TABLES) || !defined(FF_TABLES) 
  550. /*  finite field arithmetic operations */
  551. #define f2(x)   ((x<<1) ^ (((x>>7) & 1) * WPOLY))
  552. #define f4(x)   ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
  553. #define f8(x)   ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) 
  554.                         ^ (((x>>5) & 4) * WPOLY))
  555. #define f3(x)   (f2(x) ^ x)
  556. #define f9(x)   (f8(x) ^ x)
  557. #define fb(x)   (f8(x) ^ f2(x) ^ x)
  558. #define fd(x)   (f8(x) ^ f4(x) ^ x)
  559. #define fe(x)   (f8(x) ^ f4(x) ^ f2(x))
  560. #endif
  561. #if defined(FIXED_TABLES)
  562. #define sb_data(w) 
  563.     w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),
  564.     w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),
  565.     w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),
  566.     w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),
  567.     w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),
  568.     w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),
  569.     w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),
  570.     w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),
  571.     w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),
  572.     w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),
  573.     w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),
  574.     w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),
  575.     w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),
  576.     w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),
  577.     w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),
  578.     w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),
  579.     w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),
  580.     w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),
  581.     w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),
  582.     w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),
  583.     w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),
  584.     w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),
  585.     w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),
  586.     w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),
  587.     w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),
  588.     w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),
  589.     w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),
  590.     w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),
  591.     w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),
  592.     w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),
  593.     w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),
  594.     w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16)
  595. #define isb_data(w) 
  596.     w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),
  597.     w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),
  598.     w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),
  599.     w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),
  600.     w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),
  601.     w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),
  602.     w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),
  603.     w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),
  604.     w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),
  605.     w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),
  606.     w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),
  607.     w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),
  608.     w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),
  609.     w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),
  610.     w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),
  611.     w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),
  612.     w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),
  613.     w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),
  614.     w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),
  615.     w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),
  616.     w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),
  617.     w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),
  618.     w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),
  619.     w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),
  620.     w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),
  621.     w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),
  622.     w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),
  623.     w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),
  624.     w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),
  625.     w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),
  626.     w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),
  627.     w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d),
  628. #define mm_data(w) 
  629.     w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),
  630.     w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),
  631.     w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),
  632.     w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),
  633.     w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),
  634.     w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),
  635.     w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),
  636.     w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),
  637.     w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),
  638.     w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),
  639.     w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),
  640.     w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),
  641.     w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),
  642.     w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),
  643.     w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),
  644.     w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),
  645.     w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),
  646.     w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),
  647.     w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),
  648.     w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),
  649.     w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),
  650.     w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),
  651.     w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),
  652.     w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),
  653.     w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),
  654.     w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),
  655.     w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),
  656.     w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),
  657.     w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),
  658.     w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),
  659.     w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),
  660.     w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff)
  661. #define h0(x)   (x)
  662. /*  These defines are used to ensure tables are generated in the 
  663.     right format depending on the internal byte order required
  664. */
  665. #define w0(p)   bytes2word(p, 0, 0, 0)
  666. #define w1(p)   bytes2word(0, p, 0, 0)
  667. #define w2(p)   bytes2word(0, 0, p, 0)
  668. #define w3(p)   bytes2word(0, 0, 0, p)
  669. /*  Number of elements required in this table for different
  670.     block and key lengths is:
  671.     Rcon Table      key length (bytes)
  672.     Length          16  20  24  28  32
  673.                 ---------------------
  674.     block     16 |  10   9   8   7   7
  675.     length    20 |  14  11  10   9   9
  676.     (bytes)   24 |  19  15  12  11  11
  677.               28 |  24  19  16  13  13
  678.               32 |  29  23  19  17  14
  679.     this table can be a table of bytes if the key schedule
  680.     code is adjusted accordingly
  681. */
  682. #define u0(p)   bytes2word(f2(p), p, p, f3(p))
  683. #define u1(p)   bytes2word(f3(p), f2(p), p, p)
  684. #define u2(p)   bytes2word(p, f3(p), f2(p), p)
  685. #define u3(p)   bytes2word(p, p, f3(p), f2(p))
  686. #define v0(p)   bytes2word(fe(p), f9(p), fd(p), fb(p))
  687. #define v1(p)   bytes2word(fb(p), fe(p), f9(p), fd(p))
  688. #define v2(p)   bytes2word(fd(p), fb(p), fe(p), f9(p))
  689. #define v3(p)   bytes2word(f9(p), fd(p), fb(p), fe(p))
  690. static const aes_32t rcon_tab[29] =
  691. {
  692.     w0(0x01), w0(0x02), w0(0x04), w0(0x08),
  693.     w0(0x10), w0(0x20), w0(0x40), w0(0x80),
  694.     w0(0x1b), w0(0x36), w0(0x6c), w0(0xd8),
  695.     w0(0xab), w0(0x4d), w0(0x9a), w0(0x2f),
  696.     w0(0x5e), w0(0xbc), w0(0x63), w0(0xc6),
  697.     w0(0x97), w0(0x35), w0(0x6a), w0(0xd4),
  698.     w0(0xb3), w0(0x7d), w0(0xfa), w0(0xef),
  699.     w0(0xc5)
  700. };
  701. #ifdef  SBX_SET
  702. static const aes_08t s_box[256] = { sb_data(h0) };
  703. #endif
  704. #ifdef  ISB_SET
  705. static const aes_08t inv_s_box[256] = { isb_data(h0) };
  706. #endif
  707. #ifdef  FT1_SET
  708. static const aes_32t ft_tab[256] = { sb_data(u0) };
  709. #endif
  710. #ifdef  FT4_SET
  711. static const aes_32t ft_tab[4][256] = 
  712.     { {  sb_data(u0) }, {  sb_data(u1) }, {  sb_data(u2) }, {  sb_data(u3) } };
  713. #endif
  714. #ifdef  FL1_SET
  715. static const aes_32t fl_tab[256] = { sb_data(w0) };
  716. #endif
  717. #ifdef  FL4_SET
  718. static const aes_32t fl_tab[4][256] = 
  719.     { {  sb_data(w0) }, {  sb_data(w1) }, {  sb_data(w2) }, {  sb_data(w3) } };
  720. #endif
  721. #ifdef  IT1_SET
  722. static const aes_32t it_tab[256] = { isb_data(v0) };
  723. #endif
  724. #ifdef  IT4_SET
  725. static const aes_32t it_tab[4][256] =
  726.     { { isb_data(v0) }, { isb_data(v1) }, { isb_data(v2) }, { isb_data(v3) } };
  727. #endif
  728. #ifdef  IL1_SET
  729. static const aes_32t il_tab[256] = { isb_data(w0) };
  730. #endif
  731. #ifdef  IL4_SET
  732. static const aes_32t il_tab[4][256] = 
  733.     { { isb_data(w0) }, { isb_data(w1) }, { isb_data(w2) }, { isb_data(w3) } };
  734. #endif
  735. #ifdef  LS1_SET
  736. static const aes_32t ls_tab[256] = { sb_data(w0) };
  737. #endif
  738. #ifdef  LS4_SET
  739. static const aes_32t ls_tab[4][256] =
  740.     { {  sb_data(w0) }, {  sb_data(w1) }, {  sb_data(w2) }, {  sb_data(w3) } };
  741. #endif
  742. #ifdef  IM1_SET
  743. static const aes_32t im_tab[256] = { mm_data(v0) };
  744. #endif
  745. #ifdef  IM4_SET
  746. static const aes_32t im_tab[4][256] = 
  747.     { {  mm_data(v0) }, {  mm_data(v1) }, {  mm_data(v2) }, {  mm_data(v3) } };
  748. #endif
  749. #else   /* dynamic table generation */
  750. aes_08t tab_init = 0;
  751. #define const
  752. static aes_32t  rcon_tab[RC_LENGTH];
  753. #ifdef  SBX_SET
  754. aes_08t s_box[256];
  755. #endif
  756. #ifdef  ISB_SET
  757. aes_08t inv_s_box[256];
  758. #endif
  759. #ifdef  FT1_SET
  760. aes_32t ft_tab[256];
  761. #endif
  762. #ifdef  FT4_SET
  763. aes_32t ft_tab[4][256];
  764. #endif
  765. #ifdef  FL1_SET
  766. aes_32t fl_tab[256];
  767. #endif
  768. #ifdef  FL4_SET
  769. aes_32t fl_tab[4][256];
  770. #endif
  771. #ifdef  IT1_SET
  772. aes_32t it_tab[256];
  773. #endif
  774. #ifdef  IT4_SET
  775. aes_32t it_tab[4][256];
  776. #endif
  777. #ifdef  IL1_SET
  778. aes_32t il_tab[256];
  779. #endif
  780. #ifdef  IL4_SET
  781. aes_32t il_tab[4][256];
  782. #endif
  783. #ifdef  LS1_SET
  784. aes_32t ls_tab[256];
  785. #endif
  786. #ifdef  LS4_SET
  787. aes_32t ls_tab[4][256];
  788. #endif
  789. #ifdef  IM1_SET
  790. aes_32t im_tab[256];
  791. #endif
  792. #ifdef  IM4_SET
  793. aes_32t im_tab[4][256];
  794. #endif
  795. #if !defined(FF_TABLES)
  796. /*  Generate the tables for the dynamic table option
  797.     It will generally be sensible to use tables to compute finite 
  798.     field multiplies and inverses but where memory is scarse this 
  799.     code might sometimes be better. But it only has effect during
  800.     initialisation so its pretty unimportant in overall terms.
  801. */
  802. /*  return 2 ^ (n - 1) where n is the bit number of the highest bit
  803.     set in x with x in the range 1 < x < 0x00000200.   This form is
  804.     used so that locals within fi can be bytes rather than words
  805. */
  806. static aes_08t hibit(const aes_32t x)
  807. {   aes_08t r = (aes_08t)((x >> 1) | (x >> 2));
  808.     
  809.     r |= (r >> 2);
  810.     r |= (r >> 4);
  811.     return (r + 1) >> 1;
  812. }
  813. /* return the inverse of the finite field element x */
  814. static aes_08t fi(const aes_08t x)
  815. {   aes_08t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;
  816.     if(x < 2) return x;
  817.     for(;;)
  818.     {
  819.         if(!n1) return v1;
  820.         while(n2 >= n1)
  821.         {   
  822.             n2 /= n1; p2 ^= p1 * n2; v2 ^= v1 * n2; n2 = hibit(p2);
  823.         }
  824.         
  825.         if(!n2) return v2;
  826.         while(n1 >= n2)
  827.         {   
  828.             n1 /= n2; p1 ^= p2 * n1; v1 ^= v2 * n1; n1 = hibit(p1);
  829.         }
  830.     }
  831. }
  832. #else
  833. /* define the finite field multiplies required for Rijndael */
  834. #define f2(x) ((x) ? pow[log[x] + 0x19] : 0)
  835. #define f3(x) ((x) ? pow[log[x] + 0x01] : 0)
  836. #define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)
  837. #define fb(x) ((x) ? pow[log[x] + 0x68] : 0)
  838. #define fd(x) ((x) ? pow[log[x] + 0xee] : 0)
  839. #define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)
  840. #define fi(x) ((x) ?   pow[255 - log[x]]: 0)
  841. #endif
  842. /* The forward and inverse affine transformations used in the S-box */
  843. #define fwd_affine(x) 
  844.     (w = (aes_32t)x, w ^= (w<<1)^(w<<2)^(w<<3)^(w<<4), 0x63^(aes_08t)(w^(w>>8)))
  845. #define inv_affine(x) 
  846.     (w = (aes_32t)x, w = (w<<1)^(w<<3)^(w<<6), 0x05^(aes_08t)(w^(w>>8)))
  847. void gen_tabs(void)
  848. {   aes_32t  i, w;
  849. #if defined(FF_TABLES)
  850.     aes_08t  pow[512], log[256];
  851.     /*  log and power tables for GF(2^8) finite field with
  852.         WPOLY as modular polynomial - the simplest primitive
  853.         root is 0x03, used here to generate the tables
  854.     */
  855.     i = 0; w = 1; 
  856.     do
  857.     {   
  858.         pow[i] = (aes_08t)w;
  859.         pow[i + 255] = (aes_08t)w;
  860.         log[w] = (aes_08t)i++;
  861.         w ^=  (w << 1) ^ (w & 0x80 ? WPOLY : 0);
  862.     }
  863.     while (w != 1);
  864. #endif
  865.     for(i = 0, w = 1; i < RC_LENGTH; ++i)
  866.     {
  867.         rcon_tab[i] = bytes2word(w, 0, 0, 0);
  868.         w = f2(w);
  869.     }
  870.     for(i = 0; i < 256; ++i)
  871.     {   aes_08t    b;
  872.         b = fwd_affine(fi((aes_08t)i));
  873.         w = bytes2word(f2(b), b, b, f3(b));
  874. #ifdef  SBX_SET
  875.         s_box[i] = b;
  876. #endif
  877. #ifdef  FT1_SET                 /* tables for a normal encryption round */
  878.         ft_tab[i] = w;
  879. #endif
  880. #ifdef  FT4_SET
  881.         ft_tab[0][i] = w;
  882.         ft_tab[1][i] = upr(w,1);
  883.         ft_tab[2][i] = upr(w,2);
  884.         ft_tab[3][i] = upr(w,3);
  885. #endif
  886.         w = bytes2word(b, 0, 0, 0);
  887. #ifdef  FL1_SET                 /* tables for last encryption round (may also   */
  888.         fl_tab[i] = w;          /* be used in the key schedule)                 */
  889. #endif
  890. #ifdef  FL4_SET
  891.         fl_tab[0][i] = w;
  892.         fl_tab[1][i] = upr(w,1);
  893.         fl_tab[2][i] = upr(w,2);
  894.         fl_tab[3][i] = upr(w,3);
  895. #endif
  896. #ifdef  LS1_SET                 /* table for key schedule if fl_tab above is    */
  897.         ls_tab[i] = w;          /* not of the required form                     */
  898. #endif
  899. #ifdef  LS4_SET
  900.         ls_tab[0][i] = w;
  901.         ls_tab[1][i] = upr(w,1);
  902.         ls_tab[2][i] = upr(w,2);
  903.         ls_tab[3][i] = upr(w,3);
  904. #endif
  905.         b = fi(inv_affine((aes_08t)i));
  906.         w = bytes2word(fe(b), f9(b), fd(b), fb(b));
  907. #ifdef  IM1_SET                 /* tables for the inverse mix column operation  */
  908.         im_tab[b] = w;
  909. #endif
  910. #ifdef  IM4_SET
  911.         im_tab[0][b] = w;
  912.         im_tab[1][b] = upr(w,1);
  913.         im_tab[2][b] = upr(w,2);
  914.         im_tab[3][b] = upr(w,3);
  915. #endif
  916. #ifdef  ISB_SET
  917.         inv_s_box[i] = b;
  918. #endif
  919. #ifdef  IT1_SET                 /* tables for a normal decryption round */
  920.         it_tab[i] = w;
  921. #endif
  922. #ifdef  IT4_SET
  923.         it_tab[0][i] = w;
  924.         it_tab[1][i] = upr(w,1);
  925.         it_tab[2][i] = upr(w,2);
  926.         it_tab[3][i] = upr(w,3);
  927. #endif
  928.         w = bytes2word(b, 0, 0, 0);
  929. #ifdef  IL1_SET                 /* tables for last decryption round */
  930.         il_tab[i] = w;
  931. #endif
  932. #ifdef  IL4_SET
  933.         il_tab[0][i] = w;
  934.         il_tab[1][i] = upr(w,1);
  935.         il_tab[2][i] = upr(w,2);
  936.         il_tab[3][i] = upr(w,3);
  937. #endif
  938.     }
  939.     tab_init = 1;
  940. }
  941. #endif
  942. /*----------------------------------------------------------------------
  943. |       key schedule
  944. +---------------------------------------------------------------------*/
  945. #if !defined(BLOCK_SIZE)
  946. static aes_rval aes_blk_len(unsigned int blen, aes_ctx cx[1])
  947. {
  948. #if !defined(FIXED_TABLES)
  949.     if(!tab_init) gen_tabs();
  950. #endif
  951.     if((blen & 7) || blen < 16 || blen > 32) 
  952.     {     
  953.         cx->n_blk = 0; return aes_bad;
  954.     }
  955.     cx->n_blk = blen;
  956.     return aes_good;
  957. }
  958. #endif
  959. /* Initialise the key schedule from the user supplied key. The key
  960.    length is now specified in bytes - 16, 24 or 32 as appropriate.
  961.    This corresponds to bit lengths of 128, 192 and 256 bits, and
  962.    to Nk values of 4, 6 and 8 respectively.
  963.    The following macros implement a single cycle in the key 
  964.    schedule generation process. The number of cycles needed 
  965.    for each cx->n_col and nk value is:
  966.  
  967.     nk =             4  5  6  7  8
  968.     ------------------------------
  969.     cx->n_col = 4   10  9  8  7  7
  970.     cx->n_col = 5   14 11 10  9  9
  971.     cx->n_col = 6   19 15 12 11 11
  972.     cx->n_col = 7   21 19 16 13 14
  973.     cx->n_col = 8   29 23 19 17 14
  974. */
  975. #define ke4(k,i) 
  976. {   k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ rcon_tab[i]; k[4*(i)+5] = ss[1] ^= ss[0]; 
  977.     k[4*(i)+6] = ss[2] ^= ss[1]; k[4*(i)+7] = ss[3] ^= ss[2]; 
  978. }
  979. #define kel4(k,i) 
  980. {   k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ rcon_tab[i]; k[4*(i)+5] = ss[1] ^= ss[0]; 
  981.     k[4*(i)+6] = ss[2] ^= ss[1]; k[4*(i)+7] = ss[3] ^= ss[2]; 
  982. }
  983. #define ke6(k,i) 
  984. {   k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; k[6*(i)+ 7] = ss[1] ^= ss[0]; 
  985.     k[6*(i)+ 8] = ss[2] ^= ss[1]; k[6*(i)+ 9] = ss[3] ^= ss[2]; 
  986.     k[6*(i)+10] = ss[4] ^= ss[3]; k[6*(i)+11] = ss[5] ^= ss[4]; 
  987. }
  988. #define kel6(k,i) 
  989. {   k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; k[6*(i)+ 7] = ss[1] ^= ss[0]; 
  990.     k[6*(i)+ 8] = ss[2] ^= ss[1]; k[6*(i)+ 9] = ss[3] ^= ss[2]; 
  991. }
  992. #define ke8(k,i) 
  993. {   k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; k[8*(i)+ 9] = ss[1] ^= ss[0]; 
  994.     k[8*(i)+10] = ss[2] ^= ss[1]; k[8*(i)+11] = ss[3] ^= ss[2]; 
  995.     k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); k[8*(i)+13] = ss[5] ^= ss[4]; 
  996.     k[8*(i)+14] = ss[6] ^= ss[5]; k[8*(i)+15] = ss[7] ^= ss[6]; 
  997. }
  998. #define kel8(k,i) 
  999. {   k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; k[8*(i)+ 9] = ss[1] ^= ss[0]; 
  1000.     k[8*(i)+10] = ss[2] ^= ss[1]; k[8*(i)+11] = ss[3] ^= ss[2]; 
  1001. }
  1002. #if defined(ENCRYPTION_KEY_SCHEDULE)
  1003. static aes_rval aes_enc_key(const unsigned char in_key[], unsigned int klen, aes_ctx cx[1])
  1004. {   aes_32t    ss[8]; 
  1005. #if !defined(FIXED_TABLES)
  1006.     if(!tab_init) gen_tabs();
  1007. #endif
  1008. #if !defined(BLOCK_SIZE)
  1009.     if(!cx->n_blk) cx->n_blk = 16;
  1010. #else
  1011.     cx->n_blk = BLOCK_SIZE;
  1012. #endif
  1013.     
  1014.     cx->n_blk = (cx->n_blk & ~3) | 1;
  1015.     cx->k_sch[0] = ss[0] = word_in(in_key     );
  1016.     cx->k_sch[1] = ss[1] = word_in(in_key +  4);
  1017.     cx->k_sch[2] = ss[2] = word_in(in_key +  8);
  1018.     cx->k_sch[3] = ss[3] = word_in(in_key + 12);
  1019. #if (BLOCK_SIZE == 16) && (ENC_UNROLL != NONE)
  1020.     switch(klen)
  1021.     {
  1022.     case 16:    ke4(cx->k_sch, 0); ke4(cx->k_sch, 1); 
  1023.                 ke4(cx->k_sch, 2); ke4(cx->k_sch, 3);
  1024.                 ke4(cx->k_sch, 4); ke4(cx->k_sch, 5); 
  1025.                 ke4(cx->k_sch, 6); ke4(cx->k_sch, 7);
  1026.                 ke4(cx->k_sch, 8); kel4(cx->k_sch, 9); 
  1027.                 cx->n_rnd = 10; break;
  1028.     case 24:    cx->k_sch[4] = ss[4] = word_in(in_key + 16);
  1029.                 cx->k_sch[5] = ss[5] = word_in(in_key + 20);
  1030.                 ke6(cx->k_sch, 0); ke6(cx->k_sch, 1); 
  1031.                 ke6(cx->k_sch, 2); ke6(cx->k_sch, 3);
  1032.                 ke6(cx->k_sch, 4); ke6(cx->k_sch, 5); 
  1033.                 ke6(cx->k_sch, 6); kel6(cx->k_sch, 7); 
  1034.                 cx->n_rnd = 12; break;
  1035.     case 32:    cx->k_sch[4] = ss[4] = word_in(in_key + 16);
  1036.                 cx->k_sch[5] = ss[5] = word_in(in_key + 20);
  1037.                 cx->k_sch[6] = ss[6] = word_in(in_key + 24);
  1038.                 cx->k_sch[7] = ss[7] = word_in(in_key + 28);
  1039.                 ke8(cx->k_sch, 0); ke8(cx->k_sch, 1); 
  1040.                 ke8(cx->k_sch, 2); ke8(cx->k_sch, 3);
  1041.                 ke8(cx->k_sch, 4); ke8(cx->k_sch, 5); 
  1042.                 kel8(cx->k_sch, 6); 
  1043.                 cx->n_rnd = 14; break;
  1044.     default:    cx->n_rnd = 0; return aes_bad; 
  1045.     }
  1046. #else
  1047.     {   aes_32t i, l;
  1048.         cx->n_rnd = ((klen >> 2) > nc ? (klen >> 2) : nc) + 6;
  1049.         l = (nc * cx->n_rnd + nc - 1) / (klen >> 2);
  1050.         switch(klen)
  1051.         {
  1052.         case 16:    for(i = 0; i < l; ++i)
  1053.                         ke4(cx->k_sch, i);
  1054.                     break;
  1055.         case 24:    cx->k_sch[4] = ss[4] = word_in(in_key + 16);
  1056.                     cx->k_sch[5] = ss[5] = word_in(in_key + 20);
  1057.                     for(i = 0; i < l; ++i)
  1058.                         ke6(cx->k_sch, i);
  1059.                     break;
  1060.         case 32:    cx->k_sch[4] = ss[4] = word_in(in_key + 16);
  1061.                     cx->k_sch[5] = ss[5] = word_in(in_key + 20);
  1062.                     cx->k_sch[6] = ss[6] = word_in(in_key + 24);
  1063.                     cx->k_sch[7] = ss[7] = word_in(in_key + 28);
  1064.                     for(i = 0; i < l; ++i)
  1065.                         ke8(cx->k_sch,  i);
  1066.                     break;
  1067.         default:    cx->n_rnd = 0; return aes_bad; 
  1068.         }
  1069.     }
  1070. #endif
  1071.     return aes_good;
  1072. }
  1073. #endif
  1074. #if defined(DECRYPTION_KEY_SCHEDULE)
  1075. #if (DEC_ROUND != NO_TABLES)
  1076. #define d_vars  dec_imvars
  1077. #define ff(x)   inv_mcol(x)
  1078. #else
  1079. #define ff(x)   (x)
  1080. #define d_vars
  1081. #endif
  1082. #if 1
  1083. #define kdf4(k,i) 
  1084. {   ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; ss[1] = ss[1] ^ ss[3]; ss[2] = ss[2] ^ ss[3]; ss[3] = ss[3]; 
  1085.     ss[4] = ls_box(ss[(i+3) % 4], 3) ^ rcon_tab[i]; ss[i % 4] ^= ss[4]; 
  1086.     ss[4] ^= k[4*(i)];   k[4*(i)+4] = ff(ss[4]); ss[4] ^= k[4*(i)+1]; k[4*(i)+5] = ff(ss[4]); 
  1087.     ss[4] ^= k[4*(i)+2]; k[4*(i)+6] = ff(ss[4]); ss[4] ^= k[4*(i)+3]; k[4*(i)+7] = ff(ss[4]); 
  1088. }
  1089. #define kd4(k,i) 
  1090. {   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ rcon_tab[i]; ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); 
  1091.     k[4*(i)+4] = ss[4] ^= k[4*(i)]; k[4*(i)+5] = ss[4] ^= k[4*(i)+1]; 
  1092.     k[4*(i)+6] = ss[4] ^= k[4*(i)+2]; k[4*(i)+7] = ss[4] ^= k[4*(i)+3]; 
  1093. }
  1094. #define kdl4(k,i) 
  1095. {   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ rcon_tab[i]; ss[i % 4] ^= ss[4]; 
  1096.     k[4*(i)+4] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; k[4*(i)+5] = ss[1] ^ ss[3]; 
  1097.     k[4*(i)+6] = ss[0]; k[4*(i)+7] = ss[1]; 
  1098. }
  1099. #else
  1100. #define kdf4(k,i) 
  1101. {   ss[0] ^= ls_box(ss[3],3) ^ rcon_tab[i]; k[4*(i)+ 4] = ff(ss[0]); ss[1] ^= ss[0]; k[4*(i)+ 5] = ff(ss[1]); 
  1102.     ss[2] ^= ss[1]; k[4*(i)+ 6] = ff(ss[2]); ss[3] ^= ss[2]; k[4*(i)+ 7] = ff(ss[3]); 
  1103. }
  1104. #define kd4(k,i) 
  1105. {   ss[4] = ls_box(ss[3],3) ^ rcon_tab[i]; 
  1106.     ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[4*(i)+ 4] = ss[4] ^= k[4*(i)]; 
  1107.     ss[1] ^= ss[0]; k[4*(i)+ 5] = ss[4] ^= k[4*(i)+ 1]; 
  1108.     ss[2] ^= ss[1]; k[4*(i)+ 6] = ss[4] ^= k[4*(i)+ 2]; 
  1109.     ss[3] ^= ss[2]; k[4*(i)+ 7] = ss[4] ^= k[4*(i)+ 3]; 
  1110. }
  1111. #define kdl4(k,i) 
  1112. {   ss[0] ^= ls_box(ss[3],3) ^ rcon_tab[i]; k[4*(i)+ 4] = ss[0]; ss[1] ^= ss[0]; k[4*(i)+ 5] = ss[1]; 
  1113.     ss[2] ^= ss[1]; k[4*(i)+ 6] = ss[2]; ss[3] ^= ss[2]; k[4*(i)+ 7] = ss[3]; 
  1114. }
  1115. #endif
  1116. #define kdf6(k,i) 
  1117. {   ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; k[6*(i)+ 6] = ff(ss[0]); ss[1] ^= ss[0]; k[6*(i)+ 7] = ff(ss[1]); 
  1118.     ss[2] ^= ss[1]; k[6*(i)+ 8] = ff(ss[2]); ss[3] ^= ss[2]; k[6*(i)+ 9] = ff(ss[3]); 
  1119.     ss[4] ^= ss[3]; k[6*(i)+10] = ff(ss[4]); ss[5] ^= ss[4]; k[6*(i)+11] = ff(ss[5]); 
  1120. }
  1121. #define kd6(k,i) 
  1122. {   ss[6] = ls_box(ss[5],3) ^ rcon_tab[i]; 
  1123.     ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[6*(i)+ 6] = ss[6] ^= k[6*(i)]; 
  1124.     ss[1] ^= ss[0]; k[6*(i)+ 7] = ss[6] ^= k[6*(i)+ 1]; 
  1125.     ss[2] ^= ss[1]; k[6*(i)+ 8] = ss[6] ^= k[6*(i)+ 2]; 
  1126.     ss[3] ^= ss[2]; k[6*(i)+ 9] = ss[6] ^= k[6*(i)+ 3]; 
  1127.     ss[4] ^= ss[3]; k[6*(i)+10] = ss[6] ^= k[6*(i)+ 4]; 
  1128.     ss[5] ^= ss[4]; k[6*(i)+11] = ss[6] ^= k[6*(i)+ 5]; 
  1129. }
  1130. #define kdl6(k,i) 
  1131. {   ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; k[6*(i)+ 6] = ss[0]; ss[1] ^= ss[0]; k[6*(i)+ 7] = ss[1]; 
  1132.     ss[2] ^= ss[1]; k[6*(i)+ 8] = ss[2]; ss[3] ^= ss[2]; k[6*(i)+ 9] = ss[3]; 
  1133. }
  1134. #define kdf8(k,i) 
  1135. {   ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; k[8*(i)+ 8] = ff(ss[0]); ss[1] ^= ss[0]; k[8*(i)+ 9] = ff(ss[1]); 
  1136.     ss[2] ^= ss[1]; k[8*(i)+10] = ff(ss[2]); ss[3] ^= ss[2]; k[8*(i)+11] = ff(ss[3]); 
  1137.     ss[4] ^= ls_box(ss[3],0); k[8*(i)+12] = ff(ss[4]); ss[5] ^= ss[4]; k[8*(i)+13] = ff(ss[5]); 
  1138.     ss[6] ^= ss[5]; k[8*(i)+14] = ff(ss[6]); ss[7] ^= ss[6]; k[8*(i)+15] = ff(ss[7]); 
  1139. }
  1140. #define kd8(k,i) 
  1141. {   aes_32t g = ls_box(ss[7],3) ^ rcon_tab[i]; 
  1142.     ss[0] ^= g; g = ff(g); k[8*(i)+ 8] = g ^= k[8*(i)]; 
  1143.     ss[1] ^= ss[0]; k[8*(i)+ 9] = g ^= k[8*(i)+ 1]; 
  1144.     ss[2] ^= ss[1]; k[8*(i)+10] = g ^= k[8*(i)+ 2]; 
  1145.     ss[3] ^= ss[2]; k[8*(i)+11] = g ^= k[8*(i)+ 3]; 
  1146.     g = ls_box(ss[3],0); 
  1147.     ss[4] ^= g; g = ff(g); k[8*(i)+12] = g ^= k[8*(i)+ 4]; 
  1148.     ss[5] ^= ss[4]; k[8*(i)+13] = g ^= k[8*(i)+ 5]; 
  1149.     ss[6] ^= ss[5]; k[8*(i)+14] = g ^= k[8*(i)+ 6]; 
  1150.     ss[7] ^= ss[6]; k[8*(i)+15] = g ^= k[8*(i)+ 7]; 
  1151. }
  1152. #define kdl8(k,i) 
  1153. {   ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; k[8*(i)+ 8] = ss[0]; ss[1] ^= ss[0]; k[8*(i)+ 9] = ss[1]; 
  1154.     ss[2] ^= ss[1]; k[8*(i)+10] = ss[2]; ss[3] ^= ss[2]; k[8*(i)+11] = ss[3]; 
  1155. }
  1156. static aes_rval aes_dec_key(const unsigned char in_key[], unsigned int klen, aes_ctx cx[1])
  1157. {   aes_32t    ss[8]; 
  1158.     d_vars
  1159. #if !defined(FIXED_TABLES)
  1160.     if(!tab_init) gen_tabs();
  1161. #endif
  1162. #if !defined(BLOCK_SIZE)
  1163.     if(!cx->n_blk) cx->n_blk = 16;
  1164. #else
  1165.     cx->n_blk = BLOCK_SIZE;
  1166. #endif
  1167.     cx->n_blk = (cx->n_blk & ~3) | 2;
  1168.     cx->k_sch[0] = ss[0] = word_in(in_key     );
  1169.     cx->k_sch[1] = ss[1] = word_in(in_key +  4);
  1170.     cx->k_sch[2] = ss[2] = word_in(in_key +  8);
  1171.     cx->k_sch[3] = ss[3] = word_in(in_key + 12);
  1172. #if (BLOCK_SIZE == 16) && (DEC_UNROLL != NONE)
  1173.     switch(klen)
  1174.     {
  1175.     case 16:    kdf4(cx->k_sch, 0); kd4(cx->k_sch, 1); 
  1176.                 kd4(cx->k_sch, 2); kd4(cx->k_sch, 3);
  1177.                 kd4(cx->k_sch, 4); kd4(cx->k_sch, 5); 
  1178.                 kd4(cx->k_sch, 6); kd4(cx->k_sch, 7);
  1179.                 kd4(cx->k_sch, 8); kdl4(cx->k_sch, 9); 
  1180.                 cx->n_rnd = 10; break;
  1181.     case 24:    cx->k_sch[4] = ff(ss[4] = word_in(in_key + 16));
  1182.                 cx->k_sch[5] = ff(ss[5] = word_in(in_key + 20));
  1183.                 kdf6(cx->k_sch, 0); kd6(cx->k_sch, 1); 
  1184.                 kd6(cx->k_sch, 2); kd6(cx->k_sch, 3);
  1185.                 kd6(cx->k_sch, 4); kd6(cx->k_sch, 5); 
  1186.                 kd6(cx->k_sch, 6); kdl6(cx->k_sch, 7); 
  1187.                 cx->n_rnd = 12; break;
  1188.     case 32:    cx->k_sch[4] = ff(ss[4] = word_in(in_key + 16));
  1189.                 cx->k_sch[5] = ff(ss[5] = word_in(in_key + 20));
  1190.                 cx->k_sch[6] = ff(ss[6] = word_in(in_key + 24));
  1191.                 cx->k_sch[7] = ff(ss[7] = word_in(in_key + 28));
  1192.                 kdf8(cx->k_sch, 0); kd8(cx->k_sch, 1); 
  1193.                 kd8(cx->k_sch, 2); kd8(cx->k_sch, 3);
  1194.                 kd8(cx->k_sch, 4); kd8(cx->k_sch, 5); 
  1195.                 kdl8(cx->k_sch, 6); 
  1196.                 cx->n_rnd = 14; break;
  1197.     default:    cx->n_rnd = 0; return aes_bad; 
  1198.     }
  1199. #else
  1200.     {   aes_32t i, l;
  1201.         cx->n_rnd = ((klen >> 2) > nc ? (klen >> 2) : nc) + 6;
  1202.         l = (nc * cx->n_rnd + nc - 1) / (klen >> 2);
  1203.         switch(klen)
  1204.         {
  1205.         case 16: 
  1206.                     for(i = 0; i < l; ++i)
  1207.                         ke4(cx->k_sch, i);
  1208.                     break;
  1209.         case 24:    cx->k_sch[4] = ss[4] = word_in(in_key + 16);
  1210.                     cx->k_sch[5] = ss[5] = word_in(in_key + 20);
  1211.                     for(i = 0; i < l; ++i)
  1212.                         ke6(cx->k_sch, i);
  1213.                     break;
  1214.         case 32:    cx->k_sch[4] = ss[4] = word_in(in_key + 16);
  1215.                     cx->k_sch[5] = ss[5] = word_in(in_key + 20);
  1216.                     cx->k_sch[6] = ss[6] = word_in(in_key + 24);
  1217.                     cx->k_sch[7] = ss[7] = word_in(in_key + 28);
  1218.                     for(i = 0; i < l; ++i)
  1219.                         ke8(cx->k_sch,  i);
  1220.                     break;
  1221.         default:    cx->n_rnd = 0; return aes_bad; 
  1222.         }
  1223. #if (DEC_ROUND != NO_TABLES)
  1224.         for(i = nc; i < nc * cx->n_rnd; ++i)
  1225.             cx->k_sch[i] = inv_mcol(cx->k_sch[i]);
  1226. #endif
  1227.     }
  1228. #endif
  1229.     return aes_good;
  1230. }
  1231. #endif
  1232. /*----------------------------------------------------------------------
  1233. |       cipher
  1234. +---------------------------------------------------------------------*/
  1235. #define unused  77  /* Sunset Strip */
  1236. #define si(y,x,k,c) s(y,c) = word_in(x + 4 * c) ^ k[c]
  1237. #define so(y,x,c)   word_out(y + 4 * c, s(x,c))
  1238. #if BLOCK_SIZE == 16
  1239. #if defined(ARRAYS)
  1240. #define locals(y,x)     x[4],y[4]
  1241. #else
  1242. #define locals(y,x)     x##0,x##1,x##2,x##3,y##0,y##1,y##2,y##3
  1243.  /* 
  1244.    the following defines prevent the compiler requiring the declaration
  1245.    of generated but unused variables in the fwd_var and inv_var macros
  1246.  */
  1247. #define b04 unused
  1248. #define b05 unused
  1249. #define b06 unused
  1250. #define b07 unused
  1251. #define b14 unused
  1252. #define b15 unused
  1253. #define b16 unused
  1254. #define b17 unused
  1255. #endif
  1256. #define l_copy(y, x)    s(y,0) = s(x,0); s(y,1) = s(x,1); 
  1257.                         s(y,2) = s(x,2); s(y,3) = s(x,3);
  1258. #define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3)
  1259. #define state_out(y,x)  so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3)
  1260. #define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3)
  1261. #elif BLOCK_SIZE == 24
  1262. #if defined(ARRAYS)
  1263. #define locals(y,x)     x[6],y[6]
  1264. #else
  1265. #define locals(y,x)     x##0,x##1,x##2,x##3,x##4,x##5, 
  1266.                         y##0,y##1,y##2,y##3,y##4,y##5
  1267. #define b06 unused
  1268. #define b07 unused
  1269. #define b16 unused
  1270. #define b17 unused
  1271. #endif
  1272. #define l_copy(y, x)    s(y,0) = s(x,0); s(y,1) = s(x,1); 
  1273.                         s(y,2) = s(x,2); s(y,3) = s(x,3); 
  1274.                         s(y,4) = s(x,4); s(y,5) = s(x,5);
  1275. #define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); 
  1276.                         si(y,x,k,3); si(y,x,k,4); si(y,x,k,5)
  1277. #define state_out(y,x)  so(y,x,0); so(y,x,1); so(y,x,2); 
  1278.                         so(y,x,3); so(y,x,4); so(y,x,5)
  1279. #define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); 
  1280.                         rm(y,x,k,3); rm(y,x,k,4); rm(y,x,k,5)
  1281. #else
  1282. #if defined(ARRAYS)
  1283. #define locals(y,x)     x[8],y[8]
  1284. #else
  1285. #define locals(y,x)     x##0,x##1,x##2,x##3,x##4,x##5,x##6,x##7, 
  1286.                         y##0,y##1,y##2,y##3,y##4,y##5,y##6,y##7
  1287. #endif
  1288. #define l_copy(y, x)    s(y,0) = s(x,0); s(y,1) = s(x,1); 
  1289.                         s(y,2) = s(x,2); s(y,3) = s(x,3); 
  1290.                         s(y,4) = s(x,4); s(y,5) = s(x,5); 
  1291.                         s(y,6) = s(x,6); s(y,7) = s(x,7);
  1292. #if BLOCK_SIZE == 32
  1293. #define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3); 
  1294.                         si(y,x,k,4); si(y,x,k,5); si(y,x,k,6); si(y,x,k,7)
  1295. #define state_out(y,x)  so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3); 
  1296.                         so(y,x,4); so(y,x,5); so(y,x,6); so(y,x,7)
  1297. #define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3); 
  1298.                         rm(y,x,k,4); rm(y,x,k,5); rm(y,x,k,6); rm(y,x,k,7)
  1299. #else
  1300. #define state_in(y,x,k) 
  1301. switch(nc) 
  1302. {   case 8: si(y,x,k,7); si(y,x,k,6); 
  1303.     case 6: si(y,x,k,5); si(y,x,k,4); 
  1304.     case 4: si(y,x,k,3); si(y,x,k,2); 
  1305.             si(y,x,k,1); si(y,x,k,0); 
  1306. }
  1307. #define state_out(y,x) 
  1308. switch(nc) 
  1309. {   case 8: so(y,x,7); so(y,x,6); 
  1310.     case 6: so(y,x,5); so(y,x,4); 
  1311.     case 4: so(y,x,3); so(y,x,2); 
  1312.             so(y,x,1); so(y,x,0); 
  1313. }
  1314. #if defined(FAST_VARIABLE)
  1315. #define round(rm,y,x,k) 
  1316. switch(nc) 
  1317. {   case 8: rm(y,x,k,7); rm(y,x,k,6); 
  1318.             rm(y,x,k,5); rm(y,x,k,4); 
  1319.             rm(y,x,k,3); rm(y,x,k,2); 
  1320.             rm(y,x,k,1); rm(y,x,k,0); 
  1321.             break; 
  1322.     case 6: rm(y,x,k,5); rm(y,x,k,4); 
  1323.             rm(y,x,k,3); rm(y,x,k,2); 
  1324.             rm(y,x,k,1); rm(y,x,k,0); 
  1325.             break; 
  1326.     case 4: rm(y,x,k,3); rm(y,x,k,2); 
  1327.             rm(y,x,k,1); rm(y,x,k,0); 
  1328.             break; 
  1329. }
  1330. #else
  1331. #define round(rm,y,x,k) 
  1332. switch(nc) 
  1333. {   case 8: rm(y,x,k,7); rm(y,x,k,6); 
  1334.     case 6: rm(y,x,k,5); rm(y,x,k,4); 
  1335.     case 4: rm(y,x,k,3); rm(y,x,k,2); 
  1336.             rm(y,x,k,1); rm(y,x,k,0); 
  1337. }
  1338. #endif
  1339. #endif
  1340. #endif
  1341. #if defined(ENCRYPTION)
  1342. /* I am grateful to Frank Yellin for the following construction
  1343.    (and that for decryption) which, given the column (c) of the 
  1344.    output state variable, gives the input state variables which 
  1345.    are needed in its computation for each row (r) of the state.
  1346.    For the fixed block size options, compilers should be able to 
  1347.    reduce this complex expression (and the equivalent one for 
  1348.    decryption) to a static variable reference at compile time. 
  1349.    But for variable block size code, there will be some limbs on
  1350.    which conditional clauses will be returned.
  1351. */
  1352. /* y = output word, x = input word, r = row, c = column for r = 0, 
  1353.    1, 2 and 3 = column accessed for row r.
  1354. */
  1355. #define fwd_var(x,r,c)
  1356.  ( r == 0 ?           
  1357.     ( c == 0 ? s(x,0) 
  1358.     : c == 1 ? s(x,1) 
  1359.     : c == 2 ? s(x,2) 
  1360.     : c == 3 ? s(x,3) 
  1361.     : c == 4 ? s(x,4) 
  1362.     : c == 5 ? s(x,5) 
  1363.     : c == 6 ? s(x,6) 
  1364.     :          s(x,7))
  1365.  : r == 1 ?           
  1366.     ( c == 0 ? s(x,1) 
  1367.     : c == 1 ? s(x,2) 
  1368.     : c == 2 ? s(x,3) 
  1369.     : c == 3 ? nc == 4 ? s(x,0) : s(x,4) 
  1370.     : c == 4 ? s(x,5) 
  1371.     : c == 5 ? nc == 8 ? s(x,6) : s(x,0) 
  1372.     : c == 6 ? s(x,7) 
  1373.     :          s(x,0))
  1374.  : r == 2 ?           
  1375.     ( c == 0 ? nc == 8 ? s(x,3) : s(x,2) 
  1376.     : c == 1 ? nc == 8 ? s(x,4) : s(x,3) 
  1377.     : c == 2 ? nc == 4 ? s(x,0) : nc == 8 ? s(x,5) : s(x,4) 
  1378.     : c == 3 ? nc == 4 ? s(x,1) : nc == 8 ? s(x,6) : s(x,5) 
  1379.     : c == 4 ? nc == 8 ? s(x,7) : s(x,0) 
  1380.     : c == 5 ? nc == 8 ? s(x,0) : s(x,1) 
  1381.     : c == 6 ? s(x,1) 
  1382.     :          s(x,2))
  1383.  :                    
  1384.     ( c == 0 ? nc == 8 ? s(x,4) : s(x,3) 
  1385.     : c == 1 ? nc == 4 ? s(x,0) : nc == 8 ? s(x,5) : s(x,4) 
  1386.     : c == 2 ? nc == 4 ? s(x,1) : nc == 8 ? s(x,6) : s(x,5) 
  1387.     : c == 3 ? nc == 4 ? s(x,2) : nc == 8 ? s(x,7) : s(x,0) 
  1388.     : c == 4 ? nc == 8 ? s(x,0) : s(x,1) 
  1389.     : c == 5 ? nc == 8 ? s(x,1) : s(x,2) 
  1390.     : c == 6 ? s(x,2) 
  1391.     :          s(x,3)))
  1392. #if defined(FT4_SET)
  1393. #undef  dec_fmvars
  1394. #define dec_fmvars
  1395. #define fwd_rnd(y,x,k,c)    s(y,c)= (k)[c] ^ four_tables(x,ft_tab,fwd_var,rf1,c)
  1396. #elif defined(FT1_SET)
  1397. #undef  dec_fmvars
  1398. #define dec_fmvars
  1399. #define fwd_rnd(y,x,k,c)    s(y,c)= (k)[c] ^ one_table(x,upr,ft_tab,fwd_var,rf1,c)
  1400. #else
  1401. #define fwd_rnd(y,x,k,c)    s(y,c) = fwd_mcol(no_table(x,s_box,fwd_var,rf1,c)) ^ (k)[c]
  1402. #endif
  1403. #if defined(FL4_SET)
  1404. #define fwd_lrnd(y,x,k,c)   s(y,c)= (k)[c] ^ four_tables(x,fl_tab,fwd_var,rf1,c)
  1405. #elif defined(FL1_SET)
  1406. #define fwd_lrnd(y,x,k,c)   s(y,c)= (k)[c] ^ one_table(x,ups,fl_tab,fwd_var,rf1,c)
  1407. #else
  1408. #define fwd_lrnd(y,x,k,c)   s(y,c) = no_table(x,s_box,fwd_var,rf1,c) ^ (k)[c]
  1409. #endif
  1410. static aes_rval aes_enc_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1])
  1411. {   aes_32t        locals(b0, b1);
  1412.     const aes_32t  *kp = cx->k_sch;
  1413.     dec_fmvars  /* declare variables for fwd_mcol() if needed */
  1414.     if(!(cx->n_blk & 1)) return aes_bad;
  1415.     state_in(b0, in_blk, kp); 
  1416. #if (ENC_UNROLL == FULL)
  1417.     kp += (cx->n_rnd - 9) * nc;
  1418.     switch(cx->n_rnd)
  1419.     {
  1420.     case 14:    round(fwd_rnd,  b1, b0, kp - 4 * nc); 
  1421.                 round(fwd_rnd,  b0, b1, kp - 3 * nc);
  1422.     case 12:    round(fwd_rnd,  b1, b0, kp - 2 * nc); 
  1423.                 round(fwd_rnd,  b0, b1, kp -     nc);
  1424.     case 10:    round(fwd_rnd,  b1, b0, kp         );             
  1425.                 round(fwd_rnd,  b0, b1, kp +     nc);
  1426.                 round(fwd_rnd,  b1, b0, kp + 2 * nc); 
  1427.                 round(fwd_rnd,  b0, b1, kp + 3 * nc);
  1428.                 round(fwd_rnd,  b1, b0, kp + 4 * nc); 
  1429.                 round(fwd_rnd,  b0, b1, kp + 5 * nc);
  1430.                 round(fwd_rnd,  b1, b0, kp + 6 * nc); 
  1431.                 round(fwd_rnd,  b0, b1, kp + 7 * nc);
  1432.                 round(fwd_rnd,  b1, b0, kp + 8 * nc);
  1433.                 round(fwd_lrnd, b0, b1, kp + 9 * nc);
  1434.     }
  1435. #else
  1436.     
  1437. #if (ENC_UNROLL == PARTIAL)
  1438.     {   aes_32t    rnd;
  1439.         for(rnd = 0; rnd < (cx->n_rnd >> 1) - 1; ++rnd)
  1440.         {
  1441.             kp += nc;
  1442.             round(fwd_rnd, b1, b0, kp); 
  1443.             kp += nc;
  1444.             round(fwd_rnd, b0, b1, kp); 
  1445.         }
  1446.         kp += nc;
  1447.         round(fwd_rnd,  b1, b0, kp);
  1448. #else
  1449.     {   aes_32t    rnd, *p0 = b0, *p1 = b1, *pt;
  1450.         for(rnd = 0; rnd < cx->n_rnd - 1; ++rnd)
  1451.         {
  1452.             kp += nc;
  1453.             round(fwd_rnd, p1, p0, kp); 
  1454.             pt = p0, p0 = p1, p1 = pt;
  1455.         }
  1456. #endif
  1457.         kp += nc;
  1458.         round(fwd_lrnd, b0, b1, kp);
  1459.     }
  1460. #endif
  1461.     state_out(out_blk, b0);
  1462.     return aes_good;
  1463. }
  1464. #endif
  1465. #if defined(DECRYPTION)
  1466. #define inv_var(x,r,c) 
  1467.  ( r == 0 ?           
  1468.     ( c == 0 ? s(x,0) 
  1469.     : c == 1 ? s(x,1) 
  1470.     : c == 2 ? s(x,2) 
  1471.     : c == 3 ? s(x,3) 
  1472.     : c == 4 ? s(x,4) 
  1473.     : c == 5 ? s(x,5) 
  1474.     : c == 6 ? s(x,6) 
  1475.     :          s(x,7))
  1476.  : r == 1 ?           
  1477.     ( c == 0 ? nc == 4 ? s(x,3) : nc == 8 ? s(x,7) : s(x,5) 
  1478.     : c == 1 ? s(x,0) 
  1479.     : c == 2 ? s(x,1) 
  1480.     : c == 3 ? s(x,2) 
  1481.     : c == 4 ? s(x,3) 
  1482.     : c == 5 ? s(x,4) 
  1483.     : c == 6 ? s(x,5) 
  1484.     :          s(x,6))
  1485.  : r == 2 ?           
  1486.     ( c == 0 ? nc == 4 ? s(x,2) : nc == 8 ? s(x,5) : s(x,4) 
  1487.     : c == 1 ? nc == 4 ? s(x,3) : nc == 8 ? s(x,6) : s(x,5) 
  1488.     : c == 2 ? nc == 8 ? s(x,7) : s(x,0) 
  1489.     : c == 3 ? nc == 8 ? s(x,0) : s(x,1) 
  1490.     : c == 4 ? nc == 8 ? s(x,1) : s(x,2) 
  1491.     : c == 5 ? nc == 8 ? s(x,2) : s(x,3) 
  1492.     : c == 6 ? s(x,3) 
  1493.     :          s(x,4))
  1494.  :                    
  1495.     ( c == 0 ? nc == 4 ? s(x,1) : nc == 8 ? s(x,4) : s(x,3) 
  1496.     : c == 1 ? nc == 4 ? s(x,2) : nc == 8 ? s(x,5) : s(x,4) 
  1497.     : c == 2 ? nc == 4 ? s(x,3) : nc == 8 ? s(x,6) : s(x,5) 
  1498.     : c == 3 ? nc == 8 ? s(x,7) : s(x,0) 
  1499.     : c == 4 ? nc == 8 ? s(x,0) : s(x,1) 
  1500.     : c == 5 ? nc == 8 ? s(x,1) : s(x,2) 
  1501.     : c == 6 ? s(x,2) 
  1502.     :          s(x,3)))
  1503. #if defined(IT4_SET)
  1504. #undef  dec_imvars
  1505. #define dec_imvars
  1506. #define inv_rnd(y,x,k,c)    s(y,c)= (k)[c] ^ four_tables(x,it_tab,inv_var,rf1,c)
  1507. #elif defined(IT1_SET)
  1508. #undef  dec_imvars
  1509. #define dec_imvars
  1510. #define inv_rnd(y,x,k,c)    s(y,c)= (k)[c] ^ one_table(x,upr,it_tab,inv_var,rf1,c)
  1511. #else
  1512. #define inv_rnd(y,x,k,c)    s(y,c) = inv_mcol(no_table(x,inv_s_box,inv_var,rf1,c) ^ (k)[c])
  1513. #endif
  1514. #if defined(IL4_SET)
  1515. #define inv_lrnd(y,x,k,c)   s(y,c)= (k)[c] ^ four_tables(x,il_tab,inv_var,rf1,c)
  1516. #elif defined(IL1_SET)
  1517. #define inv_lrnd(y,x,k,c)   s(y,c)= (k)[c] ^ one_table(x,ups,il_tab,inv_var,rf1,c)
  1518. #else
  1519. #define inv_lrnd(y,x,k,c)   s(y,c) = no_table(x,inv_s_box,inv_var,rf1,c) ^ (k)[c]
  1520. #endif
  1521. static aes_rval aes_dec_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1])
  1522. {   aes_32t        locals(b0, b1);
  1523.     const aes_32t  *kp = cx->k_sch + nc * cx->n_rnd;
  1524.     dec_imvars  /* declare variables for inv_mcol() if needed */
  1525.     if(!(cx->n_blk & 2)) return aes_bad;
  1526.     state_in(b0, in_blk, kp);
  1527. #if (DEC_UNROLL == FULL)
  1528.     kp = cx->k_sch + 9 * nc;
  1529.     switch(cx->n_rnd)
  1530.     {
  1531.     case 14:    round(inv_rnd,  b1, b0, kp + 4 * nc);
  1532.                 round(inv_rnd,  b0, b1, kp + 3 * nc);
  1533.     case 12:    round(inv_rnd,  b1, b0, kp + 2 * nc);
  1534.                 round(inv_rnd,  b0, b1, kp + nc    );
  1535.     case 10:    round(inv_rnd,  b1, b0, kp         );             
  1536.                 round(inv_rnd,  b0, b1, kp -     nc);
  1537.                 round(inv_rnd,  b1, b0, kp - 2 * nc); 
  1538.                 round(inv_rnd,  b0, b1, kp - 3 * nc);
  1539.                 round(inv_rnd,  b1, b0, kp - 4 * nc); 
  1540.                 round(inv_rnd,  b0, b1, kp - 5 * nc);
  1541.                 round(inv_rnd,  b1, b0, kp - 6 * nc); 
  1542.                 round(inv_rnd,  b0, b1, kp - 7 * nc);
  1543.                 round(inv_rnd,  b1, b0, kp - 8 * nc);
  1544.                 round(inv_lrnd, b0, b1, kp - 9 * nc);
  1545.     }
  1546. #else
  1547.     
  1548. #if (DEC_UNROLL == PARTIAL)
  1549.     {   aes_32t    rnd;
  1550.         for(rnd = 0; rnd < (cx->n_rnd >> 1) - 1; ++rnd)
  1551.         {
  1552.             kp -= nc; 
  1553.             round(inv_rnd, b1, b0, kp); 
  1554.             kp -= nc; 
  1555.             round(inv_rnd, b0, b1, kp); 
  1556.         }
  1557.         kp -= nc;
  1558.         round(inv_rnd, b1, b0, kp);
  1559. #else
  1560.     {   aes_32t    rnd, *p0 = b0, *p1 = b1, *pt;
  1561.         for(rnd = 0; rnd < cx->n_rnd - 1; ++rnd)
  1562.         {
  1563.             kp -= nc;
  1564.             round(inv_rnd, p1, p0, kp); 
  1565.             pt = p0, p0 = p1, p1 = pt;
  1566.         }
  1567. #endif
  1568.         kp -= nc;
  1569.         round(inv_lrnd, b0, b1, kp);
  1570.     }
  1571. #endif
  1572.     state_out(out_blk, b0);
  1573.     return aes_good;
  1574. }
  1575. #endif
  1576. /*----------------------------------------------------------------------
  1577. |       AP4_AesBlockCipher::AP4_AesBlockCipher
  1578. +---------------------------------------------------------------------*/
  1579. AP4_AesBlockCipher::AP4_AesBlockCipher(const AP4_UI08* key)
  1580. {
  1581.     aes_enc_key(key, AP4_AES_KEY_LENGTH, &m_Context);
  1582. }
  1583. /*----------------------------------------------------------------------
  1584. |       AP4_AesBlockCipher::~AP4_AesBlockCipher
  1585. +---------------------------------------------------------------------*/
  1586. AP4_AesBlockCipher::~AP4_AesBlockCipher()
  1587. {
  1588. }
  1589. /*----------------------------------------------------------------------
  1590. |       AP4_AesCipher::EncryptBlock
  1591. +---------------------------------------------------------------------*/
  1592. AP4_Result 
  1593. AP4_AesBlockCipher::EncryptBlock(const AP4_UI08* block_in, AP4_UI08* block_out)
  1594. {
  1595.     aes_rval result;
  1596.     result = aes_enc_blk(block_in, block_out, &m_Context);
  1597.     return result == aes_good ? AP4_SUCCESS : AP4_FAILURE;
  1598. }