crypt_aes.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. /*
  2. * FIPS-197 compliant AES implementation
  3. *
  4. * Copyright (C) 2006-2007 Christophe Devine
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * * Redistributions of source code _must_ retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form may or may not reproduce the above
  13. * copyright notice, this list of conditions and the following
  14. * disclaimer in the documentation and/or other materials provided
  15. * with the distribution.
  16. * * Neither the name of XySSL nor the names of its contributors may be
  17. * used to endorse or promote products derived from this software
  18. * without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  24. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
  26. * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. /*
  33. * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
  34. *
  35. * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
  36. * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
  37. */
  38. #include "fitz-internal.h"
  39. #define aes_context fz_aes
  40. /* AES block cipher implementation from XYSSL */
  41. /*
  42. * 32-bit integer manipulation macros (little endian)
  43. */
  44. #ifndef GET_ULONG_LE
  45. #define GET_ULONG_LE(n,b,i) \
  46. { \
  47. (n) = ( (unsigned long) (b)[(i)] ) \
  48. | ( (unsigned long) (b)[(i) + 1] << 8 ) \
  49. | ( (unsigned long) (b)[(i) + 2] << 16 ) \
  50. | ( (unsigned long) (b)[(i) + 3] << 24 ); \
  51. }
  52. #endif
  53. #ifndef PUT_ULONG_LE
  54. #define PUT_ULONG_LE(n,b,i) \
  55. { \
  56. (b)[(i) ] = (unsigned char) ( (n) ); \
  57. (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
  58. (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
  59. (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
  60. }
  61. #endif
  62. /*
  63. * Forward S-box & tables
  64. */
  65. static unsigned char FSb[256];
  66. static unsigned long FT0[256];
  67. static unsigned long FT1[256];
  68. static unsigned long FT2[256];
  69. static unsigned long FT3[256];
  70. /*
  71. * Reverse S-box & tables
  72. */
  73. static unsigned char RSb[256];
  74. static unsigned long RT0[256];
  75. static unsigned long RT1[256];
  76. static unsigned long RT2[256];
  77. static unsigned long RT3[256];
  78. /*
  79. * Round constants
  80. */
  81. static unsigned long RCON[10];
  82. /*
  83. * Tables generation code
  84. */
  85. #define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )
  86. #define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
  87. #define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )
  88. static int aes_init_done = 0;
  89. static void aes_gen_tables( void )
  90. {
  91. int i, x, y, z;
  92. int pow[256];
  93. int log[256];
  94. /*
  95. * compute pow and log tables over GF(2^8)
  96. */
  97. for( i = 0, x = 1; i < 256; i++ )
  98. {
  99. pow[i] = x;
  100. log[x] = i;
  101. x = ( x ^ XTIME( x ) ) & 0xFF;
  102. }
  103. /*
  104. * calculate the round constants
  105. */
  106. for( i = 0, x = 1; i < 10; i++ )
  107. {
  108. RCON[i] = (unsigned long) x;
  109. x = XTIME( x ) & 0xFF;
  110. }
  111. /*
  112. * generate the forward and reverse S-boxes
  113. */
  114. FSb[0x00] = 0x63;
  115. RSb[0x63] = 0x00;
  116. for( i = 1; i < 256; i++ )
  117. {
  118. x = pow[255 - log[i]];
  119. y = x; y = ( (y << 1) | (y >> 7) ) & 0xFF;
  120. x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF;
  121. x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF;
  122. x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF;
  123. x ^= y ^ 0x63;
  124. FSb[i] = (unsigned char) x;
  125. RSb[x] = (unsigned char) i;
  126. }
  127. /*
  128. * generate the forward and reverse tables
  129. */
  130. for( i = 0; i < 256; i++ )
  131. {
  132. x = FSb[i];
  133. y = XTIME( x ) & 0xFF;
  134. z = ( y ^ x ) & 0xFF;
  135. FT0[i] = ( (unsigned long) y ) ^
  136. ( (unsigned long) x << 8 ) ^
  137. ( (unsigned long) x << 16 ) ^
  138. ( (unsigned long) z << 24 );
  139. FT1[i] = ROTL8( FT0[i] );
  140. FT2[i] = ROTL8( FT1[i] );
  141. FT3[i] = ROTL8( FT2[i] );
  142. x = RSb[i];
  143. RT0[i] = ( (unsigned long) MUL( 0x0E, x ) ) ^
  144. ( (unsigned long) MUL( 0x09, x ) << 8 ) ^
  145. ( (unsigned long) MUL( 0x0D, x ) << 16 ) ^
  146. ( (unsigned long) MUL( 0x0B, x ) << 24 );
  147. RT1[i] = ROTL8( RT0[i] );
  148. RT2[i] = ROTL8( RT1[i] );
  149. RT3[i] = ROTL8( RT2[i] );
  150. }
  151. }
  152. /*
  153. * AES key schedule (encryption)
  154. */
  155. int aes_setkey_enc( aes_context *ctx, const unsigned char *key, int keysize )
  156. {
  157. int i;
  158. unsigned long *RK;
  159. #if !defined(XYSSL_AES_ROM_TABLES)
  160. if( aes_init_done == 0 )
  161. {
  162. aes_gen_tables();
  163. aes_init_done = 1;
  164. }
  165. #endif
  166. switch( keysize )
  167. {
  168. case 128: ctx->nr = 10; break;
  169. case 192: ctx->nr = 12; break;
  170. case 256: ctx->nr = 14; break;
  171. default : return 1;
  172. }
  173. #if defined(PADLOCK_ALIGN16)
  174. ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf );
  175. #else
  176. ctx->rk = RK = ctx->buf;
  177. #endif
  178. for( i = 0; i < (keysize >> 5); i++ )
  179. {
  180. GET_ULONG_LE( RK[i], key, i << 2 );
  181. }
  182. switch( ctx->nr )
  183. {
  184. case 10:
  185. for( i = 0; i < 10; i++, RK += 4 )
  186. {
  187. RK[4] = RK[0] ^ RCON[i] ^
  188. ( FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
  189. ( FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
  190. ( FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
  191. ( FSb[ ( RK[3] ) & 0xFF ] << 24 );
  192. RK[5] = RK[1] ^ RK[4];
  193. RK[6] = RK[2] ^ RK[5];
  194. RK[7] = RK[3] ^ RK[6];
  195. }
  196. break;
  197. case 12:
  198. for( i = 0; i < 8; i++, RK += 6 )
  199. {
  200. RK[6] = RK[0] ^ RCON[i] ^
  201. ( FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
  202. ( FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
  203. ( FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
  204. ( FSb[ ( RK[5] ) & 0xFF ] << 24 );
  205. RK[7] = RK[1] ^ RK[6];
  206. RK[8] = RK[2] ^ RK[7];
  207. RK[9] = RK[3] ^ RK[8];
  208. RK[10] = RK[4] ^ RK[9];
  209. RK[11] = RK[5] ^ RK[10];
  210. }
  211. break;
  212. case 14:
  213. for( i = 0; i < 7; i++, RK += 8 )
  214. {
  215. RK[8] = RK[0] ^ RCON[i] ^
  216. ( FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
  217. ( FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
  218. ( FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
  219. ( FSb[ ( RK[7] ) & 0xFF ] << 24 );
  220. RK[9] = RK[1] ^ RK[8];
  221. RK[10] = RK[2] ^ RK[9];
  222. RK[11] = RK[3] ^ RK[10];
  223. RK[12] = RK[4] ^
  224. ( FSb[ ( RK[11] ) & 0xFF ] ) ^
  225. ( FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
  226. ( FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
  227. ( FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
  228. RK[13] = RK[5] ^ RK[12];
  229. RK[14] = RK[6] ^ RK[13];
  230. RK[15] = RK[7] ^ RK[14];
  231. }
  232. break;
  233. default:
  234. break;
  235. }
  236. return 0;
  237. }
  238. /*
  239. * AES key schedule (decryption)
  240. */
  241. int aes_setkey_dec(aes_context *ctx, const unsigned char *key, int keysize)
  242. {
  243. int i, j;
  244. aes_context cty;
  245. unsigned long *RK;
  246. unsigned long *SK;
  247. switch( keysize )
  248. {
  249. case 128: ctx->nr = 10; break;
  250. case 192: ctx->nr = 12; break;
  251. case 256: ctx->nr = 14; break;
  252. default: return 1;
  253. }
  254. #if defined(PADLOCK_ALIGN16)
  255. ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf );
  256. #else
  257. ctx->rk = RK = ctx->buf;
  258. #endif
  259. i = aes_setkey_enc( &cty, key, keysize );
  260. if (i)
  261. return i;
  262. SK = cty.rk + cty.nr * 4;
  263. *RK++ = *SK++;
  264. *RK++ = *SK++;
  265. *RK++ = *SK++;
  266. *RK++ = *SK++;
  267. for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
  268. {
  269. for( j = 0; j < 4; j++, SK++ )
  270. {
  271. *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^
  272. RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^
  273. RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^
  274. RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];
  275. }
  276. }
  277. *RK++ = *SK++;
  278. *RK++ = *SK++;
  279. *RK++ = *SK++;
  280. *RK++ = *SK++;
  281. memset( &cty, 0, sizeof( aes_context ) );
  282. return 0;
  283. }
  284. #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
  285. { \
  286. X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \
  287. FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
  288. FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
  289. FT3[ ( Y3 >> 24 ) & 0xFF ]; \
  290. \
  291. X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \
  292. FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
  293. FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
  294. FT3[ ( Y0 >> 24 ) & 0xFF ]; \
  295. \
  296. X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \
  297. FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
  298. FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
  299. FT3[ ( Y1 >> 24 ) & 0xFF ]; \
  300. \
  301. X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \
  302. FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
  303. FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
  304. FT3[ ( Y2 >> 24 ) & 0xFF ]; \
  305. }
  306. #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
  307. { \
  308. X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \
  309. RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
  310. RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
  311. RT3[ ( Y1 >> 24 ) & 0xFF ]; \
  312. \
  313. X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \
  314. RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
  315. RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
  316. RT3[ ( Y2 >> 24 ) & 0xFF ]; \
  317. \
  318. X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \
  319. RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
  320. RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
  321. RT3[ ( Y3 >> 24 ) & 0xFF ]; \
  322. \
  323. X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \
  324. RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
  325. RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
  326. RT3[ ( Y0 >> 24 ) & 0xFF ]; \
  327. }
  328. /*
  329. * AES-ECB block encryption/decryption
  330. */
  331. void aes_crypt_ecb( aes_context *ctx,
  332. int mode,
  333. const unsigned char input[16],
  334. unsigned char output[16] )
  335. {
  336. int i;
  337. unsigned long *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
  338. #if defined(XYSSL_PADLOCK_C) && defined(XYSSL_HAVE_X86)
  339. if( padlock_supports( PADLOCK_ACE ) )
  340. {
  341. if( padlock_xcryptecb( ctx, mode, input, output ) == 0 )
  342. return;
  343. }
  344. #endif
  345. RK = ctx->rk;
  346. GET_ULONG_LE( X0, input, 0 ); X0 ^= *RK++;
  347. GET_ULONG_LE( X1, input, 4 ); X1 ^= *RK++;
  348. GET_ULONG_LE( X2, input, 8 ); X2 ^= *RK++;
  349. GET_ULONG_LE( X3, input, 12 ); X3 ^= *RK++;
  350. if( mode == AES_DECRYPT )
  351. {
  352. for( i = (ctx->nr >> 1) - 1; i > 0; i-- )
  353. {
  354. AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  355. AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
  356. }
  357. AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  358. X0 = *RK++ ^ ( RSb[ ( Y0 ) & 0xFF ] ) ^
  359. ( RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
  360. ( RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
  361. ( RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
  362. X1 = *RK++ ^ ( RSb[ ( Y1 ) & 0xFF ] ) ^
  363. ( RSb[ ( Y0 >>8 ) & 0xFF ] << 8 ) ^
  364. ( RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
  365. ( RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
  366. X2 = *RK++ ^ ( RSb[ ( Y2 ) & 0xFF ] ) ^
  367. ( RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
  368. ( RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
  369. ( RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
  370. X3 = *RK++ ^ ( RSb[ ( Y3 ) & 0xFF ] ) ^
  371. ( RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
  372. ( RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
  373. ( RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
  374. }
  375. else /* AES_ENCRYPT */
  376. {
  377. for( i = (ctx->nr >> 1) - 1; i > 0; i-- )
  378. {
  379. AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  380. AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
  381. }
  382. AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  383. X0 = *RK++ ^ ( FSb[ ( Y0 ) & 0xFF ] ) ^
  384. ( FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
  385. ( FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
  386. ( FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
  387. X1 = *RK++ ^ ( FSb[ ( Y1 ) & 0xFF ] ) ^
  388. ( FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
  389. ( FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
  390. ( FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
  391. X2 = *RK++ ^ ( FSb[ ( Y2 ) & 0xFF ] ) ^
  392. ( FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
  393. ( FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
  394. ( FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
  395. X3 = *RK++ ^ ( FSb[ ( Y3 ) & 0xFF ] ) ^
  396. ( FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
  397. ( FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
  398. ( FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
  399. }
  400. PUT_ULONG_LE( X0, output, 0 );
  401. PUT_ULONG_LE( X1, output, 4 );
  402. PUT_ULONG_LE( X2, output, 8 );
  403. PUT_ULONG_LE( X3, output, 12 );
  404. }
  405. /*
  406. * AES-CBC buffer encryption/decryption
  407. */
  408. void aes_crypt_cbc( aes_context *ctx,
  409. int mode,
  410. int length,
  411. unsigned char iv[16],
  412. const unsigned char *input,
  413. unsigned char *output )
  414. {
  415. int i;
  416. unsigned char temp[16];
  417. #if defined(XYSSL_PADLOCK_C) && defined(XYSSL_HAVE_X86)
  418. if( padlock_supports( PADLOCK_ACE ) )
  419. {
  420. if( padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
  421. return;
  422. }
  423. #endif
  424. if( mode == AES_DECRYPT )
  425. {
  426. while( length > 0 )
  427. {
  428. memcpy( temp, input, 16 );
  429. aes_crypt_ecb( ctx, mode, input, output );
  430. for( i = 0; i < 16; i++ )
  431. output[i] = (unsigned char)( output[i] ^ iv[i] );
  432. memcpy( iv, temp, 16 );
  433. input += 16;
  434. output += 16;
  435. length -= 16;
  436. }
  437. }
  438. else
  439. {
  440. while( length > 0 )
  441. {
  442. for( i = 0; i < 16; i++ )
  443. output[i] = (unsigned char)( input[i] ^ iv[i] );
  444. aes_crypt_ecb( ctx, mode, output, output );
  445. memcpy( iv, output, 16 );
  446. input += 16;
  447. output += 16;
  448. length -= 16;
  449. }
  450. }
  451. }
  452. /*
  453. * AES-CFB buffer encryption/decryption
  454. */
  455. void aes_crypt_cfb( aes_context *ctx,
  456. int mode,
  457. int length,
  458. int *iv_off,
  459. unsigned char iv[16],
  460. const unsigned char *input,
  461. unsigned char *output )
  462. {
  463. int c, n = *iv_off;
  464. if( mode == AES_DECRYPT )
  465. {
  466. while( length-- )
  467. {
  468. if( n == 0 )
  469. aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv );
  470. c = *input++;
  471. *output++ = (unsigned char)( c ^ iv[n] );
  472. iv[n] = (unsigned char) c;
  473. n = (n + 1) & 0x0F;
  474. }
  475. }
  476. else
  477. {
  478. while( length-- )
  479. {
  480. if( n == 0 )
  481. aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv );
  482. iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
  483. n = (n + 1) & 0x0F;
  484. }
  485. }
  486. *iv_off = n;
  487. }