Nenhuma Descrição

aestab.c 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. /*
  2. ---------------------------------------------------------------------------
  3. Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.
  4. The redistribution and use of this software (with or without changes)
  5. is allowed without the payment of fees or royalties provided that:
  6. source code distributions include the above copyright notice, this
  7. list of conditions and the following disclaimer;
  8. binary distributions include the above copyright notice, this list
  9. of conditions and the following disclaimer in their documentation.
  10. This software is provided 'as is' with no explicit or implied warranties
  11. in respect of its operation, including, but not limited to, correctness
  12. and fitness for purpose.
  13. ---------------------------------------------------------------------------
  14. Issue Date: 20/12/2007
  15. */
  16. #define DO_TABLES
  17. #include "aes.h"
  18. #include "aesopt.h"
  19. #if defined(FIXED_TABLES)
  20. #define sb_data(w) {\
  21. w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
  22. w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
  23. w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
  24. w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
  25. w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
  26. w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
  27. w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
  28. w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
  29. w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
  30. w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
  31. w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
  32. w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
  33. w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
  34. w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
  35. w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
  36. w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
  37. w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
  38. w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
  39. w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
  40. w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
  41. w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
  42. w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
  43. w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
  44. w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
  45. w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
  46. w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
  47. w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
  48. w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
  49. w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
  50. w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
  51. w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
  52. w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }
  53. #define isb_data(w) {\
  54. w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
  55. w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
  56. w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
  57. w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
  58. w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
  59. w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
  60. w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
  61. w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
  62. w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
  63. w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
  64. w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
  65. w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
  66. w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
  67. w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
  68. w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
  69. w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
  70. w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
  71. w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
  72. w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
  73. w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
  74. w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
  75. w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
  76. w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
  77. w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
  78. w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
  79. w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
  80. w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
  81. w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
  82. w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
  83. w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
  84. w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
  85. w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) }
  86. #define mm_data(w) {\
  87. w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
  88. w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
  89. w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
  90. w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
  91. w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
  92. w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
  93. w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
  94. w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
  95. w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
  96. w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
  97. w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
  98. w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
  99. w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
  100. w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
  101. w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
  102. w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
  103. w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
  104. w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
  105. w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
  106. w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
  107. w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
  108. w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
  109. w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
  110. w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
  111. w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
  112. w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
  113. w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
  114. w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
  115. w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
  116. w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
  117. w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
  118. w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) }
  119. #define rc_data(w) {\
  120. w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\
  121. w(0x1b), w(0x36) }
  122. #define h0(x) (x)
  123. #define w0(p) bytes2word(p, 0, 0, 0)
  124. #define w1(p) bytes2word(0, p, 0, 0)
  125. #define w2(p) bytes2word(0, 0, p, 0)
  126. #define w3(p) bytes2word(0, 0, 0, p)
  127. #define u0(p) bytes2word(f2(p), p, p, f3(p))
  128. #define u1(p) bytes2word(f3(p), f2(p), p, p)
  129. #define u2(p) bytes2word(p, f3(p), f2(p), p)
  130. #define u3(p) bytes2word(p, p, f3(p), f2(p))
  131. #define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p))
  132. #define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p))
  133. #define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p))
  134. #define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p))
  135. #endif
  136. #if defined(FIXED_TABLES) || !defined(FF_TABLES)
  137. #define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY))
  138. #define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
  139. #define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \
  140. ^ (((x>>5) & 4) * WPOLY))
  141. #define f3(x) (f2(x) ^ x)
  142. #define f9(x) (f8(x) ^ x)
  143. #define fb(x) (f8(x) ^ f2(x) ^ x)
  144. #define fd(x) (f8(x) ^ f4(x) ^ x)
  145. #define fe(x) (f8(x) ^ f4(x) ^ f2(x))
  146. #else
  147. #define f2(x) ((x) ? pow[log[x] + 0x19] : 0)
  148. #define f3(x) ((x) ? pow[log[x] + 0x01] : 0)
  149. #define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)
  150. #define fb(x) ((x) ? pow[log[x] + 0x68] : 0)
  151. #define fd(x) ((x) ? pow[log[x] + 0xee] : 0)
  152. #define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)
  153. #endif
  154. #include "aestab.h"
  155. #if defined(__cplusplus)
  156. extern "C"
  157. {
  158. #endif
  159. #if defined(FIXED_TABLES)
  160. /* implemented in case of wrong call for fixed tables */
  161. AES_RETURN aes_init(void)
  162. {
  163. return EXIT_SUCCESS;
  164. }
  165. #else /* Generate the tables for the dynamic table option */
  166. #if defined(FF_TABLES)
  167. #define gf_inv(x) ((x) ? pow[ 255 - log[x]] : 0)
  168. #else
  169. /* It will generally be sensible to use tables to compute finite
  170. field multiplies and inverses but where memory is scarse this
  171. code might sometimes be better. But it only has effect during
  172. initialisation so its pretty unimportant in overall terms.
  173. */
  174. /* return 2 ^ (n - 1) where n is the bit number of the highest bit
  175. set in x with x in the range 1 < x < 0x00000200. This form is
  176. used so that locals within fi can be bytes rather than words
  177. */
  178. static uint_8t hibit(const uint_32t x)
  179. { uint_8t r = (uint_8t)((x >> 1) | (x >> 2));
  180. r |= (r >> 2);
  181. r |= (r >> 4);
  182. return (r + 1) >> 1;
  183. }
  184. /* return the inverse of the finite field element x */
  185. static uint_8t gf_inv(const uint_8t x)
  186. { uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;
  187. if(x < 2)
  188. return x;
  189. for( ; ; )
  190. {
  191. if(n1)
  192. while(n2 >= n1) /* divide polynomial p2 by p1 */
  193. {
  194. n2 /= n1; /* shift smaller polynomial left */
  195. p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */
  196. v2 ^= v1 * n2; /* shift accumulated value and */
  197. n2 = hibit(p2); /* add into result */
  198. }
  199. else
  200. return v1;
  201. if(n2) /* repeat with values swapped */
  202. while(n1 >= n2)
  203. {
  204. n1 /= n2;
  205. p1 ^= p2 * n1;
  206. v1 ^= v2 * n1;
  207. n1 = hibit(p1);
  208. }
  209. else
  210. return v2;
  211. }
  212. }
  213. #endif
  214. /* The forward and inverse affine transformations used in the S-box */
  215. uint_8t fwd_affine(const uint_8t x)
  216. { uint_32t w = x;
  217. w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);
  218. return 0x63 ^ ((w ^ (w >> 8)) & 0xff);
  219. }
  220. uint_8t inv_affine(const uint_8t x)
  221. { uint_32t w = x;
  222. w = (w << 1) ^ (w << 3) ^ (w << 6);
  223. return 0x05 ^ ((w ^ (w >> 8)) & 0xff);
  224. }
  225. static int init = 0;
  226. AES_RETURN aes_init(void)
  227. { uint_32t i, w;
  228. #if defined(FF_TABLES)
  229. uint_8t pow[512], log[256];
  230. if(init)
  231. return EXIT_SUCCESS;
  232. /* log and power tables for GF(2^8) finite field with
  233. WPOLY as modular polynomial - the simplest primitive
  234. root is 0x03, used here to generate the tables
  235. */
  236. i = 0; w = 1;
  237. do
  238. {
  239. pow[i] = (uint_8t)w;
  240. pow[i + 255] = (uint_8t)w;
  241. log[w] = (uint_8t)i++;
  242. w ^= (w << 1) ^ (w & 0x80 ? WPOLY : 0);
  243. }
  244. while (w != 1);
  245. #else
  246. if(init)
  247. return EXIT_SUCCESS;
  248. #endif
  249. for(i = 0, w = 1; i < RC_LENGTH; ++i)
  250. {
  251. t_set(r,c)[i] = bytes2word(w, 0, 0, 0);
  252. w = f2(w);
  253. }
  254. for(i = 0; i < 256; ++i)
  255. { uint_8t b;
  256. b = fwd_affine(gf_inv((uint_8t)i));
  257. w = bytes2word(f2(b), b, b, f3(b));
  258. #if defined( SBX_SET )
  259. t_set(s,box)[i] = b;
  260. #endif
  261. #if defined( FT1_SET ) /* tables for a normal encryption round */
  262. t_set(f,n)[i] = w;
  263. #endif
  264. #if defined( FT4_SET )
  265. t_set(f,n)[0][i] = w;
  266. t_set(f,n)[1][i] = upr(w,1);
  267. t_set(f,n)[2][i] = upr(w,2);
  268. t_set(f,n)[3][i] = upr(w,3);
  269. #endif
  270. w = bytes2word(b, 0, 0, 0);
  271. #if defined( FL1_SET ) /* tables for last encryption round (may also */
  272. t_set(f,l)[i] = w; /* be used in the key schedule) */
  273. #endif
  274. #if defined( FL4_SET )
  275. t_set(f,l)[0][i] = w;
  276. t_set(f,l)[1][i] = upr(w,1);
  277. t_set(f,l)[2][i] = upr(w,2);
  278. t_set(f,l)[3][i] = upr(w,3);
  279. #endif
  280. #if defined( LS1_SET ) /* table for key schedule if t_set(f,l) above is*/
  281. t_set(l,s)[i] = w; /* not of the required form */
  282. #endif
  283. #if defined( LS4_SET )
  284. t_set(l,s)[0][i] = w;
  285. t_set(l,s)[1][i] = upr(w,1);
  286. t_set(l,s)[2][i] = upr(w,2);
  287. t_set(l,s)[3][i] = upr(w,3);
  288. #endif
  289. b = gf_inv(inv_affine((uint_8t)i));
  290. w = bytes2word(fe(b), f9(b), fd(b), fb(b));
  291. #if defined( IM1_SET ) /* tables for the inverse mix column operation */
  292. t_set(i,m)[b] = w;
  293. #endif
  294. #if defined( IM4_SET )
  295. t_set(i,m)[0][b] = w;
  296. t_set(i,m)[1][b] = upr(w,1);
  297. t_set(i,m)[2][b] = upr(w,2);
  298. t_set(i,m)[3][b] = upr(w,3);
  299. #endif
  300. #if defined( ISB_SET )
  301. t_set(i,box)[i] = b;
  302. #endif
  303. #if defined( IT1_SET ) /* tables for a normal decryption round */
  304. t_set(i,n)[i] = w;
  305. #endif
  306. #if defined( IT4_SET )
  307. t_set(i,n)[0][i] = w;
  308. t_set(i,n)[1][i] = upr(w,1);
  309. t_set(i,n)[2][i] = upr(w,2);
  310. t_set(i,n)[3][i] = upr(w,3);
  311. #endif
  312. w = bytes2word(b, 0, 0, 0);
  313. #if defined( IL1_SET ) /* tables for last decryption round */
  314. t_set(i,l)[i] = w;
  315. #endif
  316. #if defined( IL4_SET )
  317. t_set(i,l)[0][i] = w;
  318. t_set(i,l)[1][i] = upr(w,1);
  319. t_set(i,l)[2][i] = upr(w,2);
  320. t_set(i,l)[3][i] = upr(w,3);
  321. #endif
  322. }
  323. init = 1;
  324. return EXIT_SUCCESS;
  325. }
  326. #endif
  327. #if defined(__cplusplus)
  328. }
  329. #endif