You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

409 regels
13 KiB

  1. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  2. * All rights reserved.
  3. *
  4. * This package is an SSL implementation written
  5. * by Eric Young (eay@cryptsoft.com).
  6. * The implementation was written so as to conform with Netscapes SSL.
  7. *
  8. * This library is free for commercial and non-commercial use as long as
  9. * the following conditions are aheared to. The following conditions
  10. * apply to all code found in this distribution, be it the RC4, RSA,
  11. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  12. * included with this distribution is covered by the same copyright terms
  13. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  14. *
  15. * Copyright remains Eric Young's, and as such any Copyright notices in
  16. * the code are not to be removed.
  17. * If this package is used in a product, Eric Young should be given attribution
  18. * as the author of the parts of the library used.
  19. * This can be in the form of a textual message at program startup or
  20. * in documentation (online or textual) provided with the package.
  21. *
  22. * Redistribution and use in source and binary forms, with or without
  23. * modification, are permitted provided that the following conditions
  24. * are met:
  25. * 1. Redistributions of source code must retain the copyright
  26. * notice, this list of conditions and the following disclaimer.
  27. * 2. Redistributions in binary form must reproduce the above copyright
  28. * notice, this list of conditions and the following disclaimer in the
  29. * documentation and/or other materials provided with the distribution.
  30. * 3. All advertising materials mentioning features or use of this software
  31. * must display the following acknowledgement:
  32. * "This product includes cryptographic software written by
  33. * Eric Young (eay@cryptsoft.com)"
  34. * The word 'cryptographic' can be left out if the rouines from the library
  35. * being used are not cryptographic related :-).
  36. * 4. If you include any Windows specific code (or a derivative thereof) from
  37. * the apps directory (application code) you must include an acknowledgement:
  38. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  39. *
  40. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  41. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  44. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50. * SUCH DAMAGE.
  51. *
  52. * The licence and distribution terms for any publically available version or
  53. * derivative of this code cannot be changed. i.e. this code cannot simply be
  54. * copied and put under another distribution licence
  55. * [including the GNU Public Licence.]. */
  56. #include <openssl/cast.h>
  57. #if defined(OPENSSL_WINDOWS)
  58. OPENSSL_MSVC_PRAGMA(warning(push, 3))
  59. #include <intrin.h>
  60. OPENSSL_MSVC_PRAGMA(warning(pop))
  61. #endif
  62. #include "internal.h"
  63. #include "../macros.h"
  64. void CAST_ecb_encrypt(const uint8_t *in, uint8_t *out, const CAST_KEY *ks,
  65. int enc) {
  66. uint32_t d[2];
  67. n2l(in, d[0]);
  68. n2l(in, d[1]);
  69. if (enc) {
  70. CAST_encrypt(d, ks);
  71. } else {
  72. CAST_decrypt(d, ks);
  73. }
  74. l2n(d[0], out);
  75. l2n(d[1], out);
  76. }
  77. #if defined(OPENSSL_WINDOWS) && defined(_MSC_VER)
  78. #define ROTL(a, n) (_lrotl(a, n))
  79. #else
  80. #define ROTL(a, n) ((((a) << (n)) | ((a) >> ((-(n))&31))) & 0xffffffffL)
  81. #endif
  82. #define E_CAST(n, key, L, R, OP1, OP2, OP3) \
  83. { \
  84. uint32_t a, b, c, d; \
  85. t = (key[n * 2] OP1 R) & 0xffffffff; \
  86. t = ROTL(t, (key[n * 2 + 1])); \
  87. a = CAST_S_table0[(t >> 8) & 0xff]; \
  88. b = CAST_S_table1[(t)&0xff]; \
  89. c = CAST_S_table2[(t >> 24) & 0xff]; \
  90. d = CAST_S_table3[(t >> 16) & 0xff]; \
  91. L ^= (((((a OP2 b)&0xffffffffL)OP3 c) & 0xffffffffL)OP1 d) & 0xffffffffL; \
  92. }
  93. void CAST_encrypt(uint32_t *data, const CAST_KEY *key) {
  94. uint32_t l, r, t;
  95. const uint32_t *k;
  96. k = &key->data[0];
  97. l = data[0];
  98. r = data[1];
  99. E_CAST(0, k, l, r, +, ^, -);
  100. E_CAST(1, k, r, l, ^, -, +);
  101. E_CAST(2, k, l, r, -, +, ^);
  102. E_CAST(3, k, r, l, +, ^, -);
  103. E_CAST(4, k, l, r, ^, -, +);
  104. E_CAST(5, k, r, l, -, +, ^);
  105. E_CAST(6, k, l, r, +, ^, -);
  106. E_CAST(7, k, r, l, ^, -, +);
  107. E_CAST(8, k, l, r, -, +, ^);
  108. E_CAST(9, k, r, l, +, ^, -);
  109. E_CAST(10, k, l, r, ^, -, +);
  110. E_CAST(11, k, r, l, -, +, ^);
  111. if (!key->short_key) {
  112. E_CAST(12, k, l, r, +, ^, -);
  113. E_CAST(13, k, r, l, ^, -, +);
  114. E_CAST(14, k, l, r, -, +, ^);
  115. E_CAST(15, k, r, l, +, ^, -);
  116. }
  117. data[1] = l & 0xffffffffL;
  118. data[0] = r & 0xffffffffL;
  119. }
  120. void CAST_decrypt(uint32_t *data, const CAST_KEY *key) {
  121. uint32_t l, r, t;
  122. const uint32_t *k;
  123. k = &key->data[0];
  124. l = data[0];
  125. r = data[1];
  126. if (!key->short_key) {
  127. E_CAST(15, k, l, r, +, ^, -);
  128. E_CAST(14, k, r, l, -, +, ^);
  129. E_CAST(13, k, l, r, ^, -, +);
  130. E_CAST(12, k, r, l, +, ^, -);
  131. }
  132. E_CAST(11, k, l, r, -, +, ^);
  133. E_CAST(10, k, r, l, ^, -, +);
  134. E_CAST(9, k, l, r, +, ^, -);
  135. E_CAST(8, k, r, l, -, +, ^);
  136. E_CAST(7, k, l, r, ^, -, +);
  137. E_CAST(6, k, r, l, +, ^, -);
  138. E_CAST(5, k, l, r, -, +, ^);
  139. E_CAST(4, k, r, l, ^, -, +);
  140. E_CAST(3, k, l, r, +, ^, -);
  141. E_CAST(2, k, r, l, -, +, ^);
  142. E_CAST(1, k, l, r, ^, -, +);
  143. E_CAST(0, k, r, l, +, ^, -);
  144. data[1] = l & 0xffffffffL;
  145. data[0] = r & 0xffffffffL;
  146. }
  147. void CAST_cbc_encrypt(const uint8_t *in, uint8_t *out, long length,
  148. const CAST_KEY *ks, uint8_t *iv, int enc) {
  149. uint32_t tin0, tin1;
  150. uint32_t tout0, tout1, xor0, xor1;
  151. long l = length;
  152. uint32_t tin[2];
  153. if (enc) {
  154. n2l(iv, tout0);
  155. n2l(iv, tout1);
  156. iv -= 8;
  157. for (l -= 8; l >= 0; l -= 8) {
  158. n2l(in, tin0);
  159. n2l(in, tin1);
  160. tin0 ^= tout0;
  161. tin1 ^= tout1;
  162. tin[0] = tin0;
  163. tin[1] = tin1;
  164. CAST_encrypt(tin, ks);
  165. tout0 = tin[0];
  166. tout1 = tin[1];
  167. l2n(tout0, out);
  168. l2n(tout1, out);
  169. }
  170. if (l != -8) {
  171. n2ln(in, tin0, tin1, l + 8);
  172. tin0 ^= tout0;
  173. tin1 ^= tout1;
  174. tin[0] = tin0;
  175. tin[1] = tin1;
  176. CAST_encrypt(tin, ks);
  177. tout0 = tin[0];
  178. tout1 = tin[1];
  179. l2n(tout0, out);
  180. l2n(tout1, out);
  181. }
  182. l2n(tout0, iv);
  183. l2n(tout1, iv);
  184. } else {
  185. n2l(iv, xor0);
  186. n2l(iv, xor1);
  187. iv -= 8;
  188. for (l -= 8; l >= 0; l -= 8) {
  189. n2l(in, tin0);
  190. n2l(in, tin1);
  191. tin[0] = tin0;
  192. tin[1] = tin1;
  193. CAST_decrypt(tin, ks);
  194. tout0 = tin[0] ^ xor0;
  195. tout1 = tin[1] ^ xor1;
  196. l2n(tout0, out);
  197. l2n(tout1, out);
  198. xor0 = tin0;
  199. xor1 = tin1;
  200. }
  201. if (l != -8) {
  202. n2l(in, tin0);
  203. n2l(in, tin1);
  204. tin[0] = tin0;
  205. tin[1] = tin1;
  206. CAST_decrypt(tin, ks);
  207. tout0 = tin[0] ^ xor0;
  208. tout1 = tin[1] ^ xor1;
  209. l2nn(tout0, tout1, out, l + 8);
  210. xor0 = tin0;
  211. xor1 = tin1;
  212. }
  213. l2n(xor0, iv);
  214. l2n(xor1, iv);
  215. }
  216. tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
  217. tin[0] = tin[1] = 0;
  218. }
  219. #define CAST_exp(l, A, a, n) \
  220. A[n / 4] = l; \
  221. a[n + 3] = (l)&0xff; \
  222. a[n + 2] = (l >> 8) & 0xff; \
  223. a[n + 1] = (l >> 16) & 0xff; \
  224. a[n + 0] = (l >> 24) & 0xff;
  225. #define S4 CAST_S_table4
  226. #define S5 CAST_S_table5
  227. #define S6 CAST_S_table6
  228. #define S7 CAST_S_table7
  229. void CAST_set_key(CAST_KEY *key, size_t len, const uint8_t *data) {
  230. uint32_t x[16];
  231. uint32_t z[16];
  232. uint32_t k[32];
  233. uint32_t X[4], Z[4];
  234. uint32_t l, *K;
  235. size_t i;
  236. for (i = 0; i < 16; i++) {
  237. x[i] = 0;
  238. }
  239. if (len > 16) {
  240. len = 16;
  241. }
  242. for (i = 0; i < len; i++) {
  243. x[i] = data[i];
  244. }
  245. if (len <= 10) {
  246. key->short_key = 1;
  247. } else {
  248. key->short_key = 0;
  249. }
  250. K = &k[0];
  251. X[0] = ((x[0] << 24) | (x[1] << 16) | (x[2] << 8) | x[3]) & 0xffffffffL;
  252. X[1] = ((x[4] << 24) | (x[5] << 16) | (x[6] << 8) | x[7]) & 0xffffffffL;
  253. X[2] = ((x[8] << 24) | (x[9] << 16) | (x[10] << 8) | x[11]) & 0xffffffffL;
  254. X[3] = ((x[12] << 24) | (x[13] << 16) | (x[14] << 8) | x[15]) & 0xffffffffL;
  255. for (;;) {
  256. l = X[0] ^ S4[x[13]] ^ S5[x[15]] ^ S6[x[12]] ^ S7[x[14]] ^ S6[x[8]];
  257. CAST_exp(l, Z, z, 0);
  258. l = X[2] ^ S4[z[0]] ^ S5[z[2]] ^ S6[z[1]] ^ S7[z[3]] ^ S7[x[10]];
  259. CAST_exp(l, Z, z, 4);
  260. l = X[3] ^ S4[z[7]] ^ S5[z[6]] ^ S6[z[5]] ^ S7[z[4]] ^ S4[x[9]];
  261. CAST_exp(l, Z, z, 8);
  262. l = X[1] ^ S4[z[10]] ^ S5[z[9]] ^ S6[z[11]] ^ S7[z[8]] ^ S5[x[11]];
  263. CAST_exp(l, Z, z, 12);
  264. K[0] = S4[z[8]] ^ S5[z[9]] ^ S6[z[7]] ^ S7[z[6]] ^ S4[z[2]];
  265. K[1] = S4[z[10]] ^ S5[z[11]] ^ S6[z[5]] ^ S7[z[4]] ^ S5[z[6]];
  266. K[2] = S4[z[12]] ^ S5[z[13]] ^ S6[z[3]] ^ S7[z[2]] ^ S6[z[9]];
  267. K[3] = S4[z[14]] ^ S5[z[15]] ^ S6[z[1]] ^ S7[z[0]] ^ S7[z[12]];
  268. l = Z[2] ^ S4[z[5]] ^ S5[z[7]] ^ S6[z[4]] ^ S7[z[6]] ^ S6[z[0]];
  269. CAST_exp(l, X, x, 0);
  270. l = Z[0] ^ S4[x[0]] ^ S5[x[2]] ^ S6[x[1]] ^ S7[x[3]] ^ S7[z[2]];
  271. CAST_exp(l, X, x, 4);
  272. l = Z[1] ^ S4[x[7]] ^ S5[x[6]] ^ S6[x[5]] ^ S7[x[4]] ^ S4[z[1]];
  273. CAST_exp(l, X, x, 8);
  274. l = Z[3] ^ S4[x[10]] ^ S5[x[9]] ^ S6[x[11]] ^ S7[x[8]] ^ S5[z[3]];
  275. CAST_exp(l, X, x, 12);
  276. K[4] = S4[x[3]] ^ S5[x[2]] ^ S6[x[12]] ^ S7[x[13]] ^ S4[x[8]];
  277. K[5] = S4[x[1]] ^ S5[x[0]] ^ S6[x[14]] ^ S7[x[15]] ^ S5[x[13]];
  278. K[6] = S4[x[7]] ^ S5[x[6]] ^ S6[x[8]] ^ S7[x[9]] ^ S6[x[3]];
  279. K[7] = S4[x[5]] ^ S5[x[4]] ^ S6[x[10]] ^ S7[x[11]] ^ S7[x[7]];
  280. l = X[0] ^ S4[x[13]] ^ S5[x[15]] ^ S6[x[12]] ^ S7[x[14]] ^ S6[x[8]];
  281. CAST_exp(l, Z, z, 0);
  282. l = X[2] ^ S4[z[0]] ^ S5[z[2]] ^ S6[z[1]] ^ S7[z[3]] ^ S7[x[10]];
  283. CAST_exp(l, Z, z, 4);
  284. l = X[3] ^ S4[z[7]] ^ S5[z[6]] ^ S6[z[5]] ^ S7[z[4]] ^ S4[x[9]];
  285. CAST_exp(l, Z, z, 8);
  286. l = X[1] ^ S4[z[10]] ^ S5[z[9]] ^ S6[z[11]] ^ S7[z[8]] ^ S5[x[11]];
  287. CAST_exp(l, Z, z, 12);
  288. K[8] = S4[z[3]] ^ S5[z[2]] ^ S6[z[12]] ^ S7[z[13]] ^ S4[z[9]];
  289. K[9] = S4[z[1]] ^ S5[z[0]] ^ S6[z[14]] ^ S7[z[15]] ^ S5[z[12]];
  290. K[10] = S4[z[7]] ^ S5[z[6]] ^ S6[z[8]] ^ S7[z[9]] ^ S6[z[2]];
  291. K[11] = S4[z[5]] ^ S5[z[4]] ^ S6[z[10]] ^ S7[z[11]] ^ S7[z[6]];
  292. l = Z[2] ^ S4[z[5]] ^ S5[z[7]] ^ S6[z[4]] ^ S7[z[6]] ^ S6[z[0]];
  293. CAST_exp(l, X, x, 0);
  294. l = Z[0] ^ S4[x[0]] ^ S5[x[2]] ^ S6[x[1]] ^ S7[x[3]] ^ S7[z[2]];
  295. CAST_exp(l, X, x, 4);
  296. l = Z[1] ^ S4[x[7]] ^ S5[x[6]] ^ S6[x[5]] ^ S7[x[4]] ^ S4[z[1]];
  297. CAST_exp(l, X, x, 8);
  298. l = Z[3] ^ S4[x[10]] ^ S5[x[9]] ^ S6[x[11]] ^ S7[x[8]] ^ S5[z[3]];
  299. CAST_exp(l, X, x, 12);
  300. K[12] = S4[x[8]] ^ S5[x[9]] ^ S6[x[7]] ^ S7[x[6]] ^ S4[x[3]];
  301. K[13] = S4[x[10]] ^ S5[x[11]] ^ S6[x[5]] ^ S7[x[4]] ^ S5[x[7]];
  302. K[14] = S4[x[12]] ^ S5[x[13]] ^ S6[x[3]] ^ S7[x[2]] ^ S6[x[8]];
  303. K[15] = S4[x[14]] ^ S5[x[15]] ^ S6[x[1]] ^ S7[x[0]] ^ S7[x[13]];
  304. if (K != k) {
  305. break;
  306. }
  307. K += 16;
  308. }
  309. for (i = 0; i < 16; i++) {
  310. key->data[i * 2] = k[i];
  311. key->data[i * 2 + 1] = ((k[i + 16]) + 16) & 0x1f;
  312. }
  313. }
  314. /* The input and output encrypted as though 64bit cfb mode is being used. The
  315. * extra state information to record how much of the 64bit block we have used
  316. * is contained in *num. */
  317. void CAST_cfb64_encrypt(const uint8_t *in, uint8_t *out, long length,
  318. const CAST_KEY *schedule, uint8_t *ivec, int *num,
  319. int enc) {
  320. uint32_t v0, v1, t;
  321. int n = *num;
  322. long l = length;
  323. uint32_t ti[2];
  324. uint8_t *iv, c, cc;
  325. iv = ivec;
  326. if (enc) {
  327. while (l--) {
  328. if (n == 0) {
  329. n2l(iv, v0);
  330. ti[0] = v0;
  331. n2l(iv, v1);
  332. ti[1] = v1;
  333. CAST_encrypt((uint32_t *)ti, schedule);
  334. iv = ivec;
  335. t = ti[0];
  336. l2n(t, iv);
  337. t = ti[1];
  338. l2n(t, iv);
  339. iv = ivec;
  340. }
  341. c = *(in++) ^ iv[n];
  342. *(out++) = c;
  343. iv[n] = c;
  344. n = (n + 1) & 0x07;
  345. }
  346. } else {
  347. while (l--) {
  348. if (n == 0) {
  349. n2l(iv, v0);
  350. ti[0] = v0;
  351. n2l(iv, v1);
  352. ti[1] = v1;
  353. CAST_encrypt((uint32_t *)ti, schedule);
  354. iv = ivec;
  355. t = ti[0];
  356. l2n(t, iv);
  357. t = ti[1];
  358. l2n(t, iv);
  359. iv = ivec;
  360. }
  361. cc = *(in++);
  362. c = iv[n];
  363. iv[n] = cc;
  364. *(out++) = c ^ cc;
  365. n = (n + 1) & 0x07;
  366. }
  367. }
  368. v0 = v1 = ti[0] = ti[1] = t = c = cc = 0;
  369. *num = n;
  370. }