Advertisement
Guest User

skype_rc4.c

a guest
Jul 8th, 2010
735
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 60.29 KB | None | 0 0
  1. /*\
  2. |*|
  3. |*| Skype Library RC4 v1.108 by Sean O'Neil.
  4. |*| All rights reserved.
  5. |*| Not for commercial use.
  6. |*|
  7. |*| We are reverse engineers.
  8. |*| We can prove if you have used this code in your product.
  9. |*| We will find you.
  10. |*| We will prosecute for copyright infringement.
  11. |*| This code is quite unique and is easily identifiable.
  12. |*| Result may match Skype's 100%, but this code is ours.
  13. |*| The computation is significantly different from Skype's.
  14. |*|
  15. |*| For academic research and educational purposes only.
  16. |*| If you require Skype compatibility in your products,
  17. |*| feel free to contact Sean O'Neil on www.enrupt.com
  18. |*|
  19. |*| Last changes: 01.12.2009
  20. |*| Published: 07.07.2010
  21. |*| More will be published at 27C3, December 2010 (http://www.ccc.de/en/calendar)
  22. |*|
  23. \*/
  24.  
  25. #include <string.h>
  26. #include "skype_rc4.h"
  27.  
  28. #if defined(_MSC_VER) || defined(__INTEL_COMPILER)
  29. #ifndef __inline__
  30. #define __inline__ __forceinline
  31. #endif
  32. #ifndef rotl32
  33. #define rotl32(x,r) _lrotl(x,r)
  34. #endif
  35. #ifndef rotr32
  36. #define rotr32(x,r) _lrotr(x,r)
  37. #endif
  38. #else
  39. #ifndef shr32
  40. #define shr32(x,r) (((x)&0xFFFFFFFF)>>(r))
  41. #endif
  42. #ifndef rotl32
  43. #define rotl32(x,r) (((x)<<((r)&31))|shr32(x,(0-(r))&31))
  44. #endif
  45. #ifndef rotr32
  46. #define rotr32(x,r) (shr32(x,(r)&31)|((x)<<((0-(r))&31)))
  47. #endif
  48. #endif
  49.  
  50. #ifndef __min
  51. static __inline__ u32 __min (u32 a, u32 b) { return a<b?a:b; }
  52. #endif
  53.  
  54. #define byte(x,n) (*(u8*)(((u8*)(x))+(n)))
  55. #define dword(x,n) (*(u32*)(((u8*)(x))+(n)))
  56.  
  57. static const u8 u8sqrt[256] =
  58. {
  59. 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4,
  60. 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
  61. 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  62. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8,
  63. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  64. 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
  65. 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
  66. 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
  67. 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
  68. 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  69. 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
  70. 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
  71. 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
  72. 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
  73. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  74. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16
  75. };
  76.  
  77. static const u8 u8fcos[256] =
  78. {
  79. 0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,
  80. 0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,
  81. 0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,
  82. 1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,
  83. 1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,
  84. 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,
  85. 1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,
  86. 1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1
  87. };
  88.  
  89. static const u8 u8fsin[256] =
  90. {
  91. 0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,
  92. 0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,
  93. 0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,
  94. 0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,
  95. 0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,
  96. 0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,
  97. 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,
  98. 1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1
  99. };
  100.  
  101. #define u32root(n) (u8sqrt[(n)&0xFF])
  102. #define u32cos(n) (u8fcos[(n)&0xFF])
  103. #define u32sin(n) (u8fsin[(n)&0xFF])
  104.  
  105. #define SKYPE_RC4_IV1() (key[10] ^= key[7] - 0x354C1FF2)
  106. #define SKYPE_RC4_IV2() (key[17] += key[13] - 0x292C1156)
  107. #define SKYPE_RC4_IV3n(n) (key[13] |= u32cos(n) ? 0x1510A109 : key[14])
  108. #define SKYPE_RC4_IV4() (key[15] ^= (key[14] < 0x291B9650) ? key[14] : key[2])
  109. #define SKYPE_RC4_IV5() (key[ 3] ^= key[0] + 0x4376FF7)
  110. #define SKYPE_RC4_IV6() {key[ 9] = rotl32 (key[9], rotl32 (key[1], 14)); if (key[9] & 1) return 1;}
  111. #define SKYPE_RC4_IV7n(n) (key[13] ^= (n < 0x2E0AF4F7) ? n : key[15])
  112. #define SKYPE_RC4_IV8() (key[ 6] *= 0x1304694A * key[11])
  113. #define SKYPE_RC4_IV9() (key[ 6] ^= u32cos(key[7]) ? 0x1AB1E599 : key[18])
  114. #define SKYPE_RC4_IV10() (key[ 5] += key[11] | 0xEA02A83)
  115. #define SKYPE_RC4_IV11() (key[ 6] = rotl32 (key[6], key[13] - 18))
  116. #define SKYPE_RC4_IV12() (key[11] ^= key[15] | 0x11273409)
  117. #define SKYPE_RC4_IV13() (key[ 2] += 0xEA2D3D5D * key[7])
  118. #define SKYPE_RC4_IV14() {key[ 3] -= key[17] | 0x2433636; if (key[3] & 1) return 1;}
  119. #define SKYPE_RC4_IV15() (key[ 3] += key[9] + 0x48210C78)
  120. #define SKYPE_RC4_IV16n(n) (key[ 0] = rotl32 (key[0], (n>>17)&0x1F))
  121. #define SKYPE_RC4_IV17() (key[ 9] = rotr32 (key[9], u32cos(key[9]) ? 20 : key[0]))
  122. #define SKYPE_RC4_IV18n(n) (key[ 5] *= rotl32 (n, 3))
  123. #define SKYPE_RC4_IV19() (key[16] &= (key[11] < 0x5578A05) ? key[11] : key[16])
  124. #define SKYPE_RC4_IV20n(n) (key[17] ^= n)
  125. #define SKYPE_RC4_IV21() (key[ 4] ^= 17 * key[0])
  126. #define SKYPE_RC4_IV22() (key[ 2] ^= u32sin(key[17]) ? 0x1C0E70BF : key[5])
  127. #define SKYPE_RC4_IV23() (key[16] = rotr32 (key[16], key[10] - 11))
  128. #define SKYPE_RC4_IV24() (key[ 6] += 0x975C61BA - key[8])
  129. #define SKYPE_RC4_IV25() {key[ 7] += rotr32 (key[7], 21); if (key[7] & 1) return 1;}
  130. #define SKYPE_RC4_IV26() {key[ 1] ^= u32cos(key[3]) ? 0x7C23395 : key[18]; if (key[1] & 1) return 1;}
  131. #define SKYPE_RC4_IV27() (key[ 9] += 0x3A82007 - key[14])
  132. #define SKYPE_RC4_IV28() {key[ 0] *= 33 * key[0]; if (key[0] & 1) return 1;}
  133. #define SKYPE_RC4_IV29n(n) {key[10] = rotl32 (key[10], n-6); if (key[10] & 1) return 1;}
  134. #define SKYPE_RC4_IV30n(n) (key[ 2] -= u32sin(n) ? 0x73423C3 : key[7])
  135. #define SKYPE_RC4_IV31() (key[ 2] ^= key[15] + 0x57CE331)
  136. #define SKYPE_RC4_IV32() (key[ 9] = rotr32 (key[9], key[17]*18))
  137. #define SKYPE_RC4_IV33n(n) (key[ 7] += n)
  138. #define SKYPE_RC4_IV34() (key[18] ^= key[10] + 0x1EE65B0C)
  139. #define SKYPE_RC4_IV35() (key[14] ^= u32cos(key[9]) ? 0x73CD560C : key[4])
  140. #define SKYPE_RC4_IV36n(n) (key[ 7] -= n)
  141. #define SKYPE_RC4_IV37() (key[ 7] ^= key[10] - 0x3035E544)
  142. #define SKYPE_RC4_IV38() {if (key[5] & 1) return 1;}
  143. #define SKYPE_RC4_IV39n(n) (key[9 ] *= u32sin(n) ? 0x28D781D2 : key[10])
  144. #define SKYPE_RC4_IV40() (key[11] -= key[12] << 5)
  145. #define SKYPE_RC4_IV41() (key[8 ] ^= u32cos(key[17]) ? 0x3544CA5E : key[8])
  146. #define SKYPE_RC4_IV42() (key[ 1] -= key[16] | 0x59C1677)
  147. #define SKYPE_RC4_IV43() {key[11] += 0xF6B10986 - key[14]; if (key[11] & 1) return 1;}
  148. #define SKYPE_RC4_IV44() (key[ 4] ^= key[19] - 0x303D46FE)
  149. #define SKYPE_RC4_IV45() (key[ 9] ^= u32cos(key[11]) ? 0xEEB638B : key[6])
  150. #define SKYPE_RC4_IV46() (key[16] ^= (key[18] < 0xE87F32) ? key[18] : key[11])
  151. #define SKYPE_RC4_IV47n(n) (key[12] *= u32cos(n) ? 0x1734D89C : key[5])
  152. #define SKYPE_RC4_IV48() (key[11] |= key[4] - 0x224114CD)
  153. #define SKYPE_RC4_IV49n(n) (key[11] &= n)
  154. #define SKYPE_RC4_IV50() (key[ 2] &= key[18] - 0x37CF1A3F)
  155. #define SKYPE_RC4_IV51n(n) (key[19] &= n)
  156. #define SKYPE_RC4_IV52n(n) (key[ 9] = rotl32 (key[9], n))
  157. #define SKYPE_RC4_IV53() (key[18] -= 122 * key[6])
  158. #define SKYPE_RC4_IV54() (key[11] = rotl32 (key[11], u32cos(key[5]) ? 19 : key[11]))
  159. #define SKYPE_RC4_IV55() (key[11] += 0x29CC7F53 - key[5])
  160. #define SKYPE_RC4_IV56() (key[12] -= 66 * key[2])
  161. #define SKYPE_RC4_IV57() {key[ 7] += key[2] ^ 0x376E1538; if (key[7] & 1) return 1;}
  162. #define SKYPE_RC4_IV58n(n) (key[15] -= u32cos(n) ? 0x344432F : key[18])
  163. #define SKYPE_RC4_IV59() (key[ 7] ^= u32root (key[15]))
  164. #define SKYPE_RC4_IV60() (key[10] = rotr32 (key[10], key[14] + 6))
  165. #define SKYPE_RC4_IV61n(n) (key[ 6] += (n < 0x61F0BAA) ? n : key[16])
  166. #define SKYPE_RC4_IV62n(n) (key[ 1] ^= rotl32 (n, 8))
  167. #define SKYPE_RC4_IV63n(n) (key[12] = rotr32 (key[12], key[18] ^ 9))
  168. #define SKYPE_RC4_IV64() (key[ 0] = rotl32 (key[0], 8 * key[18]))
  169. #define SKYPE_RC4_IV65() (key[17] ^= 0x2F961 * key[4])
  170. #define SKYPE_RC4_IV66() (key[ 6] ^= rotr32 (key[14], 28))
  171. #define SKYPE_RC4_IV67n(n) (key[ 2] &= rotr32 (n, 17))
  172. #define SKYPE_RC4_IV68n(n) {key[16] &= (key[12] < 0x28165E7B) ? key[12] : n; if (key[16] & 1) return 1;}
  173. #define SKYPE_RC4_IV69() (key[ 9] -= rotr32 (key[16], 25))
  174. #define SKYPE_RC4_IV70() {key[ 1] ^= (key[4] < 0x196D816A) ? key[4] : key[17]; if (key[1] & 1) return 1;}
  175. #define SKYPE_RC4_IV71n(n) {u32 jv = n + (u32sin (key[7]) ? 0xCC95AFBF : key[9]);\
  176. key[ 2] += jv + 0xE6ECDA3,\
  177. key[ 9] &= u32sin(key[7]) ? 0x13D68223 : jv,\
  178. key[15] += 0x38245913 - key[12],\
  179. key[16] = rotr32 (key[16], 30 * key[17]),\
  180. key[11] += 0x36F87E5B - key[5],\
  181. key[ 2] += 102 * key[3],\
  182. jv *= rotl32 (key[5], 30),\
  183. key[ 9] += 123 * jv,\
  184. key[ 5] = rotl32 (key[5], key[16] - 11),\
  185. key[10] |= u32sin(key[4]) ? 0x84EDC63 : key[4];}
  186. #define SKYPE_RC4_IV72n(n) {u32 jv = n & (u32cos(key[10]) ? 0xF998E196 : key[10]);\
  187. key[ 6] ^= rotl32 (jv, 7),\
  188. key[ 1] ^= jv - 0x4B327DA,\
  189. key[ 7] += jv ^ 0x672E5A7,\
  190. jv ^= u32sin(jv) ? 0xBC91B04 : key[8],\
  191. key[11] ^= key[6] & 0xBE53718,\
  192. jv ^= u32cos(key[2]) ? 0x9DADA8A4 : jv,\
  193. key[ 0] -= 0x9DADA8A4 & key[6],\
  194. key[13] += key[1] - 0x7B284744,\
  195. key[ 3] ^= 20 * key[18],\
  196. key[ 2] |= jv - 0x313BB22;}
  197.  
  198. static u32 skype_rc4_iv1 (u32 * const key, u32 n);
  199. static u32 skype_rc4_iv2 (u32 * const key, u32 n);
  200. static u32 skype_rc4_iv3 (u32 * const key, u32 n);
  201. static u32 skype_rc4_iv4 (u32 * const key, u32 n);
  202. static u32 skype_rc4_iv5 (u32 * const key, u32 n);
  203. static u32 skype_rc4_iv6 (u32 * const key, u32 n);
  204. static u32 skype_rc4_iv7 (u32 * const key, u32 n);
  205. static u32 skype_rc4_iv8 (u32 * const key, u32 n);
  206. static u32 skype_rc4_iv9 (u32 * const key, u32 n);
  207. static u32 skype_rc4_iv10 (u32 * const key, u32 n);
  208. static u32 skype_rc4_iv11 (u32 * const key, u32 n);
  209. static u32 skype_rc4_iv12 (u32 * const key, u32 n);
  210. static u32 skype_rc4_iv13 (u32 * const key, u32 n);
  211. static u32 skype_rc4_iv14 (u32 * const key, u32 n);
  212. static u32 skype_rc4_iv15 (u32 * const key, u32 n);
  213. static u32 skype_rc4_iv16 (u32 * const key, u32 n);
  214. static u32 skype_rc4_iv17 (u32 * const key, u32 n);
  215. static u32 skype_rc4_iv18 (u32 * const key, u32 n);
  216. static u32 skype_rc4_iv19 (u32 * const key, u32 n);
  217. static u32 skype_rc4_iv20 (u32 * const key, u32 n);
  218. static u32 skype_rc4_iv21 (u32 * const key, u32 n);
  219. static u32 skype_rc4_iv22 (u32 * const key, u32 n);
  220. static u32 skype_rc4_iv23 (u32 * const key, u32 n);
  221. static u32 skype_rc4_iv24 (u32 * const key, u32 n);
  222.  
  223. u32 skype_rc4_iva (u32 * const key, u32 iv)
  224. {
  225. u32 k = iv & 15;
  226.  
  227. if (k == 4)
  228. {
  229. SKYPE_RC4_IV1();
  230. SKYPE_RC4_IV2();
  231. skype_rc4_iv1 (key, key[2]);
  232. }
  233. if (k == 8)
  234. {
  235. SKYPE_RC4_IV3n (0x767255F0);
  236. SKYPE_RC4_IV4();
  237. skype_rc4_iv2 (key, iv);
  238. }
  239. key[12] -= 28 * key[19];
  240. if (k == 1)
  241. {
  242. SKYPE_RC4_IV5();
  243. SKYPE_RC4_IV2();
  244. skype_rc4_iv3 (key, key[16]);
  245. }
  246. if (k == 6)
  247. {
  248. SKYPE_RC4_IV6();
  249. SKYPE_RC4_IV7n (0x258A329D);
  250. skype_rc4_iv4 (key, key[16]);
  251. }
  252. if (k == 14)
  253. {
  254. SKYPE_RC4_IV8();
  255. SKYPE_RC4_IV9();
  256. skype_rc4_iv5 (key, iv);
  257. }
  258. key[15] ^= 45 * key[9];
  259. if (k == 0)
  260. {
  261. SKYPE_RC4_IV10();
  262. SKYPE_RC4_IV11();
  263. skype_rc4_iv6 (key, key[12]);
  264. }
  265. if (k == 9)
  266. {
  267. SKYPE_RC4_IV12();
  268. SKYPE_RC4_IV13();
  269. skype_rc4_iv7 (key, key[19]);
  270. }
  271. key[18] ^= 0x327BAFFB * key[2];
  272. if (k == 7)
  273. {
  274. SKYPE_RC4_IV2();
  275. SKYPE_RC4_IV14();
  276. skype_rc4_iv8 (key, key[8]);
  277. }
  278. if (k == 13)
  279. {
  280. SKYPE_RC4_IV15();
  281. SKYPE_RC4_IV16n (0xA1C70157);
  282. skype_rc4_iv9 (key, iv);
  283. }
  284. if (k == 3)
  285. {
  286. SKYPE_RC4_IV3n (0x5947B4C0);
  287. SKYPE_RC4_IV17();
  288. skype_rc4_iv10 (key, key[12]);
  289. }
  290. key[13] *= u32root (iv);
  291. if (k == 15)
  292. {
  293. SKYPE_RC4_IV18n (0x59BBBCF2);
  294. SKYPE_RC4_IV19();
  295. skype_rc4_iv11 (key, key[8]);
  296. }
  297. if (k == 2)
  298. {
  299. SKYPE_RC4_IV20n (0xB00FB3F3);
  300. SKYPE_RC4_IV21();
  301. skype_rc4_iv12 (key, key[3]);
  302. }
  303. iv &= key[19] ^ 0x22BD05B7;
  304. if (k == 0)
  305. {
  306. SKYPE_RC4_IV22();
  307. SKYPE_RC4_IV23();
  308. skype_rc4_iv1 (key, iv);
  309. }
  310. if (k == 6)
  311. {
  312. SKYPE_RC4_IV24();
  313. SKYPE_RC4_IV25();
  314. skype_rc4_iv2 (key, key[6]);
  315. }
  316. if (k == 3)
  317. {
  318. SKYPE_RC4_IV26();
  319. SKYPE_RC4_IV27();
  320. skype_rc4_iv3 (key, key[0]);
  321. }
  322. key[1] ^= key[15] & 0x1ED68333;
  323. if (k == 11)
  324. {
  325. SKYPE_RC4_IV28();
  326. SKYPE_RC4_IV29n (0x8FD14B43);
  327. skype_rc4_iv4 (key, iv);
  328. }
  329. if (k == 7)
  330. {
  331. SKYPE_RC4_IV30n (0x173A48D4);
  332. SKYPE_RC4_IV1 ();
  333. skype_rc4_iv5 (key, key[6]);
  334. }
  335. if (k == 9)
  336. {
  337. SKYPE_RC4_IV31();
  338. SKYPE_RC4_IV32();
  339. skype_rc4_iv6 (key, iv);
  340. }
  341. key[12] ^= iv - 0x7F670F2F;
  342. if (k == 12)
  343. {
  344. SKYPE_RC4_IV2();
  345. SKYPE_RC4_IV19();
  346. skype_rc4_iv7 (key, iv);
  347. }
  348. if (k == 10)
  349. {
  350. SKYPE_RC4_IV32();
  351. SKYPE_RC4_IV33n (0x62E34BC8);
  352. skype_rc4_iv8 (key, key[4]);
  353. }
  354. key[3] = rotr32 (key[3], key[10]*4);
  355. if (k == 5)
  356. {
  357. SKYPE_RC4_IV34();
  358. SKYPE_RC4_IV35();
  359. skype_rc4_iv9 (key, key[4]);
  360. }
  361. if (k == 10)
  362. {
  363. SKYPE_RC4_IV7n (0x224B5A8A);
  364. SKYPE_RC4_IV36n (0xE729AFE3);
  365. skype_rc4_iv10 (key, key[5]);
  366. }
  367. if (k == 8)
  368. {
  369. SKYPE_RC4_IV29n (0x7B403A3E);
  370. SKYPE_RC4_IV7n (0x2606748C);
  371. skype_rc4_iv11 (key, iv);
  372. }
  373. iv *= (0x72E979C7 ^ key[7]);
  374. if (k == 1)
  375. {
  376. SKYPE_RC4_IV7n (0x3F541FC9);
  377. SKYPE_RC4_IV13();
  378. skype_rc4_iv12 (key, key[6]);
  379. }
  380. if (k == 4)
  381. {
  382. SKYPE_RC4_IV20n (0xDB079C63);
  383. SKYPE_RC4_IV1();
  384. skype_rc4_iv1 (key, key[13]);
  385. }
  386. key[15] ^= u32root (key[15]);
  387. if (k == 5)
  388. {
  389. SKYPE_RC4_IV37();
  390. SKYPE_RC4_IV27();
  391. skype_rc4_iv2 (key, key[1]);
  392. }
  393. if (k == 2)
  394. {
  395. SKYPE_RC4_IV23();
  396. SKYPE_RC4_IV37();
  397. skype_rc4_iv3 (key, key[17]);
  398. }
  399. key[9] -= rotl32 (key[18], 15);
  400. return 0;
  401. }
  402.  
  403. u32 skype_rc4_iv1 (u32 * const key, u32 iv)
  404. {
  405. u32 k = (key[13] ^ key[12] ^ key[8]) % 14;
  406.  
  407. if (k == 0)
  408. {
  409. SKYPE_RC4_IV38();
  410. SKYPE_RC4_IV4();
  411. skype_rc4_iv13 (key, key[10]);
  412. }
  413. key[10] *= 87 * key[9];
  414. if (k == 13)
  415. {
  416. SKYPE_RC4_IV39n (0x2F378459);
  417. SKYPE_RC4_IV8();
  418. skype_rc4_iv14 (key, key[15]);
  419. }
  420. if (k == 11)
  421. {
  422. SKYPE_RC4_IV40();
  423. SKYPE_RC4_IV41();
  424. skype_rc4_iv15 (key, key[7]);
  425. }
  426. iv *= key[13] - 0x1B6664FC;
  427. if (k == 10)
  428. {
  429. SKYPE_RC4_IV42();
  430. SKYPE_RC4_IV1();
  431. skype_rc4_iv16 (key, key[7]);
  432. }
  433. key[19] = rotr32 (key[19], u32root (key[18]));
  434. if (k == 4)
  435. {
  436. SKYPE_RC4_IV39n (0x55CE2E77);
  437. SKYPE_RC4_IV43();
  438. skype_rc4_iv17 (key, iv);
  439. }
  440. if (k == 2)
  441. {
  442. SKYPE_RC4_IV44();
  443. SKYPE_RC4_IV3n (0xEEDD2781);
  444. skype_rc4_iv18 (key, key[19]);
  445. }
  446. key[17] += u32root (key[3]);
  447. if (k == 12)
  448. {
  449. SKYPE_RC4_IV8();
  450. SKYPE_RC4_IV45();
  451. skype_rc4_iv19 (key, key[4]);
  452. }
  453. key[2] *= iv + 0x3D4CFA4F;
  454. if (k == 9)
  455. {
  456. SKYPE_RC4_IV46();
  457. SKYPE_RC4_IV19();
  458. skype_rc4_iv20 (key, iv);
  459. }
  460. if (k == 1)
  461. {
  462. SKYPE_RC4_IV33n (0x505E90D8);
  463. SKYPE_RC4_IV47n (0x13951A5E);
  464. skype_rc4_iv21 (key, key[6]);
  465. }
  466. key[12] *= 79 * key[6];
  467. if (k == 6)
  468. {
  469. SKYPE_RC4_IV11();
  470. SKYPE_RC4_IV3n (0x6F001987);
  471. skype_rc4_iv22 (key, key[17]);
  472. }
  473. key[3] &= u32sin(key[17]) ? 0x4C35C59A : iv;
  474. if (k == 3)
  475. {
  476. SKYPE_RC4_IV48();
  477. SKYPE_RC4_IV14();
  478. skype_rc4_iv23 (key, key[11]);
  479. }
  480. if (k == 5)
  481. {
  482. SKYPE_RC4_IV47n (0xE2AEC47F);
  483. SKYPE_RC4_IV35();
  484. skype_rc4_iv24 (key, iv);
  485. }
  486. key[10] = rotl32 (key[10], 25 * key[16]);
  487. if (k == 0)
  488. {
  489. SKYPE_RC4_IV28();
  490. SKYPE_RC4_IV4();
  491. skype_rc4_iv13 (key, iv);
  492. }
  493. key[15] += 0xC7308059 - key[10];
  494. if (k == 8)
  495. {
  496. SKYPE_RC4_IV49n (0x45AE0A86);
  497. SKYPE_RC4_IV37();
  498. skype_rc4_iv14 (key, iv);
  499. }
  500. if (k == 7)
  501. {
  502. SKYPE_RC4_IV46();
  503. SKYPE_RC4_IV50();
  504. skype_rc4_iv15 (key, key[12]);
  505. }
  506. key[1] ^= iv & 0xF42F3BCF;
  507. return iv;
  508. }
  509.  
  510. u32 skype_rc4_iv2 (u32 * const key, u32 iv)
  511. {
  512. u32 k = key[4] % 15;
  513.  
  514. if (k == 5)
  515. {
  516. SKYPE_RC4_IV45();
  517. SKYPE_RC4_IV32();
  518. skype_rc4_iv14 (key, key[9]);
  519. }
  520. key[1] += rotl32 (iv, 4);
  521. if (k == 9)
  522. {
  523. SKYPE_RC4_IV51n (0xB0AB0E55);
  524. SKYPE_RC4_IV3n (0x1A8398B1);
  525. skype_rc4_iv15 (key, key[19]);
  526. }
  527. key[5] ^= 0x39C770C4 & key[2];
  528. if (k == 0)
  529. {
  530. SKYPE_RC4_IV52n (11);
  531. SKYPE_RC4_IV42();
  532. skype_rc4_iv16 (key, key[14]);
  533. }
  534. if (k == 1)
  535. {
  536. SKYPE_RC4_IV34();
  537. SKYPE_RC4_IV17();
  538. skype_rc4_iv17 (key, key[7]);
  539. }
  540. iv -= rotl32 (iv, 1);
  541. if (k == 13)
  542. {
  543. SKYPE_RC4_IV53();
  544. SKYPE_RC4_IV54();
  545. skype_rc4_iv18 (key, key[9]);
  546. }
  547. if (k == 8)
  548. {
  549. SKYPE_RC4_IV8();
  550. SKYPE_RC4_IV15();
  551. skype_rc4_iv19 (key, key[17]);
  552. }
  553. iv += key[17] + 0x25FB77C1;
  554. if (k == 14)
  555. {
  556. SKYPE_RC4_IV49n (0x094909EA);
  557. SKYPE_RC4_IV55();
  558. skype_rc4_iv20 (key, key[7]);
  559. }
  560. key[4] *= u32cos(key[19]) ? 0x336C9268 : key[4];
  561. if (k == 11)
  562. {
  563. SKYPE_RC4_IV8();
  564. SKYPE_RC4_IV6();
  565. skype_rc4_iv21 (key, iv);
  566. }
  567. key[17] *= u32root (iv);
  568. if (k == 2)
  569. {
  570. SKYPE_RC4_IV52n (17);
  571. SKYPE_RC4_IV56();
  572. skype_rc4_iv22 (key, key[12]);
  573. }
  574. if (k == 7)
  575. {
  576. SKYPE_RC4_IV57();
  577. SKYPE_RC4_IV17();
  578. skype_rc4_iv23 (key, key[14]);
  579. }
  580. key[5] += u32root (key[0]);
  581. if (k == 4)
  582. {
  583. SKYPE_RC4_IV32();
  584. SKYPE_RC4_IV27();
  585. skype_rc4_iv24 (key, key[13]);
  586. }
  587. key[14] ^= rotr32 (key[18], 20);
  588. if (k == 3)
  589. {
  590. SKYPE_RC4_IV40();
  591. SKYPE_RC4_IV54();
  592. skype_rc4_iv1 (key, key[15]);
  593. }
  594. if (k == 0)
  595. {
  596. SKYPE_RC4_IV34();
  597. SKYPE_RC4_IV51n (0xA14E4231);
  598. skype_rc4_iv14 (key, key[5]);
  599. }
  600. key[10] *= 34 * key[19];
  601. if (k == 6)
  602. {
  603. SKYPE_RC4_IV58n (0xA7E8E811);
  604. SKYPE_RC4_IV26();
  605. skype_rc4_iv15 (key, iv);
  606. }
  607. if (k == 10)
  608. {
  609. SKYPE_RC4_IV5();
  610. SKYPE_RC4_IV7n (0x27546CBA);
  611. skype_rc4_iv16 (key, key[16]);
  612. }
  613. iv |= 21 * key[10];
  614. if (k == 12)
  615. {
  616. SKYPE_RC4_IV59();
  617. SKYPE_RC4_IV29n (0xE8357BC6);
  618. skype_rc4_iv17 (key, key[8]);
  619. }
  620. key[17] &= u32sin(iv) ? 0x24D1E601 : key[17];
  621. return iv;
  622. }
  623.  
  624. u32 skype_rc4_iv3 (u32 * const key, u32 iv)
  625. {
  626. u32 k = (key[2] ^ key[11] ^ key[19]) & 15;
  627.  
  628. if (k == 7)
  629. {
  630. SKYPE_RC4_IV45();
  631. SKYPE_RC4_IV55();
  632. skype_rc4_iv15 (key, key[7]);
  633. }
  634. iv = rotl32 (iv, 20 * key[15]);
  635. if (k == 2)
  636. {
  637. SKYPE_RC4_IV49n (0x159A2134);
  638. SKYPE_RC4_IV3n (0x855DE620);
  639. skype_rc4_iv16 (key, key[2]);
  640. }
  641. if (k == 13)
  642. {
  643. SKYPE_RC4_IV3n (0xC4146E71);
  644. SKYPE_RC4_IV36n (0x3F3F6FFB);
  645. skype_rc4_iv17 (key, iv);
  646. }
  647. key[13] += key[18] & 0x2581026D;
  648. if (k == 11)
  649. {
  650. SKYPE_RC4_IV27();
  651. SKYPE_RC4_IV37();
  652. skype_rc4_iv18 (key, iv);
  653. }
  654. key[1] &= iv & 0x64BB010;
  655. if (k == 5)
  656. {
  657. SKYPE_RC4_IV60();
  658. SKYPE_RC4_IV23();
  659. skype_rc4_iv19 (key, key[13]);
  660. }
  661. if (k == 3)
  662. {
  663. SKYPE_RC4_IV2();
  664. SKYPE_RC4_IV51n (0x7EC9C31F);
  665. skype_rc4_iv20 (key, iv);
  666. }
  667. key[10] |= 67 * key[13];
  668. if (k == 8)
  669. {
  670. SKYPE_RC4_IV61n (0xDFDC4A68);
  671. SKYPE_RC4_IV44();
  672. skype_rc4_iv21 (key, key[5]);
  673. }
  674. key[9] += 0xAA213313 * iv;
  675. if (k == 0)
  676. {
  677. SKYPE_RC4_IV37();
  678. SKYPE_RC4_IV58n (0x16E7FB2A);
  679. skype_rc4_iv22 (key, iv);
  680. }
  681. if (k == 15)
  682. {
  683. SKYPE_RC4_IV1();
  684. SKYPE_RC4_IV62n (0x6D43A2A8);
  685. skype_rc4_iv23 (key, iv);
  686. }
  687. key[14] |= u32root (key[12]);
  688. if (k == 12)
  689. {
  690. SKYPE_RC4_IV47n (0xE5FB063D);
  691. SKYPE_RC4_IV42();
  692. skype_rc4_iv24 (key, iv);
  693. }
  694. if (k == 10)
  695. {
  696. SKYPE_RC4_IV10();
  697. SKYPE_RC4_IV21();
  698. skype_rc4_iv1 (key, key[4]);
  699. }
  700. iv = 107 * key[1] ^ iv;
  701. if (k == 1)
  702. {
  703. SKYPE_RC4_IV33n (0x357B0AC2);
  704. SKYPE_RC4_IV5();
  705. skype_rc4_iv2 (key, key[1]);
  706. }
  707. key[9] = rotr32 (key[9], u32sin(key[16]) ? 26 : key[12]);
  708. if (k == 4)
  709. {
  710. SKYPE_RC4_IV37();
  711. SKYPE_RC4_IV37();
  712. skype_rc4_iv15 (key, key[7]);
  713. }
  714. if (k == 0)
  715. {
  716. SKYPE_RC4_IV63n (0x60298842);
  717. SKYPE_RC4_IV22();
  718. skype_rc4_iv16 (key, iv);
  719. }
  720. key[13] *= key[18] ^ 0x1D347B67;
  721. if (k == 6)
  722. {
  723. SKYPE_RC4_IV30n (0xAC2CA8C4);
  724. SKYPE_RC4_IV61n (0xFF8CF458);
  725. skype_rc4_iv17 (key, key[6]);
  726. }
  727. key[2] = u32sin(key[0]) ? key[2] : rotr32 (key[2], key[0]);
  728. if (k == 14)
  729. {
  730. SKYPE_RC4_IV21();
  731. SKYPE_RC4_IV29n (0x52041287);
  732. skype_rc4_iv18 (key, key[7]);
  733. }
  734. if (k == 9)
  735. {
  736. SKYPE_RC4_IV36n (0xBF896FA3);
  737. SKYPE_RC4_IV64();
  738. skype_rc4_iv19 (key, key[3]);
  739. }
  740. return 50 * iv * iv;
  741. }
  742.  
  743. u32 skype_rc4_iv4 (u32 * const key, u32 iv)
  744. {
  745. u32 k = iv & 15;
  746.  
  747. if (k == 10)
  748. {
  749. SKYPE_RC4_IV13();
  750. SKYPE_RC4_IV51n (0x590CCB85);
  751. skype_rc4_iv16 (key, key[7]);
  752. }
  753. key[10] ^= (iv < 0x3D18A13) ? iv : key[9];
  754. if (k == 6)
  755. {
  756. SKYPE_RC4_IV11();
  757. SKYPE_RC4_IV17();
  758. skype_rc4_iv17 (key, key[17]);
  759. }
  760. if (k == 14)
  761. {
  762. SKYPE_RC4_IV58n (0xA6F86E90);
  763. SKYPE_RC4_IV50();
  764. skype_rc4_iv18 (key, key[17]);
  765. }
  766. iv -= key[10] & 0x16926664;
  767. if (k == 0)
  768. {
  769. SKYPE_RC4_IV18n (0x95AAFBC8);
  770. SKYPE_RC4_IV12();
  771. skype_rc4_iv19 (key, key[7]);
  772. }
  773. if (k == 11)
  774. {
  775. SKYPE_RC4_IV13();
  776. SKYPE_RC4_IV22();
  777. skype_rc4_iv20 (key, key[6]);
  778. }
  779. key[6] ^= key[7] - 0xD669F4D;
  780. if (k == 1)
  781. {
  782. SKYPE_RC4_IV11();
  783. SKYPE_RC4_IV24();
  784. skype_rc4_iv21 (key, key[7]);
  785. }
  786. key[1] ^= rotr32 (key[15], 14);
  787. if (k == 5)
  788. {
  789. SKYPE_RC4_IV21();
  790. SKYPE_RC4_IV65();
  791. skype_rc4_iv22 (key, iv);
  792. }
  793. if (k == 4)
  794. {
  795. SKYPE_RC4_IV3n (0x8EEA1FE3);
  796. SKYPE_RC4_IV22();
  797. skype_rc4_iv23 (key, key[13]);
  798. }
  799. iv = rotr32 (iv, 0x19 & key[5]);
  800. if (k == 2)
  801. {
  802. SKYPE_RC4_IV41();
  803. SKYPE_RC4_IV20n (0x34C48CA3);
  804. skype_rc4_iv24 (key, key[9]);
  805. }
  806. if (k == 3)
  807. {
  808. SKYPE_RC4_IV42();
  809. SKYPE_RC4_IV58n (0x104BE7AE);
  810. skype_rc4_iv1 (key, key[9]);
  811. }
  812. key[3] *= u32root (iv);
  813. if (k == 0)
  814. {
  815. SKYPE_RC4_IV54();
  816. SKYPE_RC4_IV62n (0x507DA30D);
  817. skype_rc4_iv2(key, key[2]);
  818. }
  819. key[16] -= u32root (iv);
  820. if (k == 13)
  821. {
  822. SKYPE_RC4_IV36n (0x3FCB3FA3);
  823. SKYPE_RC4_IV47n (0xD0D9B11D);
  824. skype_rc4_iv3 (key, key[4]);
  825. }
  826. if (k == 7)
  827. {
  828. SKYPE_RC4_IV45();
  829. SKYPE_RC4_IV33n (0x6E4473BD);
  830. skype_rc4_iv16 (key, key[19]);
  831. }
  832. iv += 0x720E12F5 + key[5];
  833. if (k == 15)
  834. {
  835. SKYPE_RC4_IV4();
  836. SKYPE_RC4_IV55();
  837. skype_rc4_iv17 (key, key[1]);
  838. }
  839. if (k == 9)
  840. {
  841. SKYPE_RC4_IV43();
  842. SKYPE_RC4_IV8();
  843. skype_rc4_iv18 (key, key[10]);
  844. }
  845. key[1] ^= (iv < 0x585C6D88) ? iv : key[13];
  846. if (k == 12)
  847. {
  848. SKYPE_RC4_IV48();
  849. SKYPE_RC4_IV38();
  850. skype_rc4_iv19 (key, key[14]);
  851. }
  852. if (k == 8)
  853. {
  854. SKYPE_RC4_IV44();
  855. SKYPE_RC4_IV50();
  856. skype_rc4_iv20 (key, key[11]);
  857. }
  858. iv |= key[13] + 0x38D39E93;
  859. if (k == 1)
  860. {
  861. SKYPE_RC4_IV6();
  862. SKYPE_RC4_IV9();
  863. skype_rc4_iv21 (key, key[8]);
  864. }
  865. key[19] ^= key[9] + 0x23280350;
  866. return iv;
  867. }
  868.  
  869. u32 skype_rc4_iv5 (u32 * const key, u32 iv)
  870. {
  871. u32 k = key[13] & 15;
  872.  
  873. if (k == 1)
  874. {
  875. SKYPE_RC4_IV19();
  876. SKYPE_RC4_IV42();
  877. skype_rc4_iv17 (key, iv);
  878. }
  879. iv += 0xCB72BB0E + key[10];
  880. if (k == 0)
  881. {
  882. SKYPE_RC4_IV54();
  883. SKYPE_RC4_IV32();
  884. skype_rc4_iv18 (key, key[0]);
  885. }
  886. if (k == 5)
  887. {
  888. SKYPE_RC4_IV2();
  889. SKYPE_RC4_IV20n (0xEFE4F823);
  890. skype_rc4_iv19 (key, key[3]);
  891. }
  892. key[7] += 0x72A1B49 - key[6];
  893. if (k == 1)
  894. {
  895. SKYPE_RC4_IV26();
  896. SKYPE_RC4_IV65();
  897. skype_rc4_iv20 (key, key[15]);
  898. }
  899. if (k == 4)
  900. {
  901. SKYPE_RC4_IV9();
  902. SKYPE_RC4_IV47n (0x391FA13E);
  903. skype_rc4_iv21 (key, iv);
  904. }
  905. key[17] += u32cos(key[16]) ? 0xD1C5DCA : key[10];
  906. if (k == 11)
  907. {
  908. SKYPE_RC4_IV5();
  909. SKYPE_RC4_IV43();
  910. skype_rc4_iv22 (key, key[5]);
  911. }
  912. if (k == 14)
  913. {
  914. SKYPE_RC4_IV52n (28);
  915. SKYPE_RC4_IV33n (0x5BAAA0D8);
  916. skype_rc4_iv23 (key, key[3]);
  917. }
  918. iv += 0xA4631CA4 & key[0];
  919. if (k == 10)
  920. {
  921. SKYPE_RC4_IV45();
  922. SKYPE_RC4_IV25();
  923. skype_rc4_iv24 (key, key[6]);
  924. }
  925. if (k == 3)
  926. {
  927. SKYPE_RC4_IV55();
  928. SKYPE_RC4_IV59();
  929. skype_rc4_iv1 (key, key[11]);
  930. }
  931. key[18] = rotl32 (key[18], u32root (key[13]));
  932. if (k == 2)
  933. {
  934. SKYPE_RC4_IV29n (0x255DB12E);
  935. SKYPE_RC4_IV63n (0x8570A62A);
  936. skype_rc4_iv2 (key, key[19]);
  937. }
  938. iv += key[12] & 0x3EB958F;
  939. if (k == 13)
  940. {
  941. SKYPE_RC4_IV2();
  942. SKYPE_RC4_IV50();
  943. skype_rc4_iv3 (key, key[19]);
  944. }
  945. if (k == 2)
  946. {
  947. SKYPE_RC4_IV12();
  948. SKYPE_RC4_IV30n (0xFD54B81D);
  949. skype_rc4_iv4 (key, iv);
  950. }
  951. key[10] *= 61 * iv;
  952. if (k == 15)
  953. {
  954. SKYPE_RC4_IV65();
  955. SKYPE_RC4_IV43();
  956. skype_rc4_iv17 (key, key[9]);
  957. }
  958. if (k == 0)
  959. {
  960. SKYPE_RC4_IV48();
  961. SKYPE_RC4_IV12();
  962. skype_rc4_iv18 (key, key[17]);
  963. }
  964. iv = rotl32 (iv, key[16]);
  965. if (k == 9)
  966. {
  967. SKYPE_RC4_IV3n (0xD59BE521);
  968. SKYPE_RC4_IV39n (0x59621E0F);
  969. skype_rc4_iv19 (key, key[6]);
  970. }
  971. if (k == 7)
  972. {
  973. SKYPE_RC4_IV55();
  974. SKYPE_RC4_IV51n (0x935A86BD);
  975. skype_rc4_iv20 (key, key[4]);
  976. }
  977. key[16] -= (key[5] < 0x4DEA623B) ? key[5] : key[2];
  978. if (k == 8)
  979. {
  980. SKYPE_RC4_IV20n (0xAC1EA487);
  981. SKYPE_RC4_IV3n (0x99B3E5F0);
  982. skype_rc4_iv21(key, key[10]);
  983. }
  984. if (k == 6)
  985. {
  986. SKYPE_RC4_IV45();
  987. SKYPE_RC4_IV53();
  988. skype_rc4_iv22 (key, key[11]);
  989. }
  990. key[14] = rotr32 (key[14], u32sin(key[19]) ? 27 : key[5]);
  991. if (k == 12)
  992. {
  993. SKYPE_RC4_IV6();
  994. SKYPE_RC4_IV54();
  995. skype_rc4_iv23 (key, key[12]);
  996. }
  997. return iv * (iv - 0x497488D1);
  998. }
  999.  
  1000. u32 skype_rc4_iv6 (u32 * const key, u32 iv)
  1001. {
  1002. u32 k = (key[11] ^ key[6] ^ key[4]) & 15;
  1003.  
  1004. if (k == 2)
  1005. {
  1006. SKYPE_RC4_IV11();
  1007. SKYPE_RC4_IV5();
  1008. skype_rc4_iv18 (key, iv);
  1009. }
  1010. key[10] |= rotr32 (iv, 6);
  1011. if (k == 14)
  1012. {
  1013. SKYPE_RC4_IV37();
  1014. SKYPE_RC4_IV31();
  1015. skype_rc4_iv19 (key, key[18]);
  1016. }
  1017. if (k == 9)
  1018. {
  1019. SKYPE_RC4_IV43();
  1020. SKYPE_RC4_IV58n (0x13BC76D5);
  1021. skype_rc4_iv20 (key, key[1]);
  1022. }
  1023. iv &= u32sin(key[11]) ? 0xDA03B206 : key[15];
  1024. if (k == 12)
  1025. {
  1026. SKYPE_RC4_IV37();
  1027. SKYPE_RC4_IV2();
  1028. skype_rc4_iv21 (key, key[0]);
  1029. }
  1030. if (k == 3)
  1031. {
  1032. SKYPE_RC4_IV41();
  1033. SKYPE_RC4_IV59();
  1034. skype_rc4_iv22 (key, iv);
  1035. }
  1036. key[14] ^= 83 * key[14];
  1037. if (k == 7)
  1038. {
  1039. SKYPE_RC4_IV41();
  1040. SKYPE_RC4_IV59();
  1041. skype_rc4_iv23 (key, key[12]);
  1042. }
  1043. if (k == 11)
  1044. {
  1045. SKYPE_RC4_IV6();
  1046. SKYPE_RC4_IV40();
  1047. skype_rc4_iv24 (key, key[10]);
  1048. }
  1049. key[11] -= u32sin(iv) ? 0xCA758BFB : key[12];
  1050. if (k == 10)
  1051. {
  1052. SKYPE_RC4_IV66();
  1053. SKYPE_RC4_IV38();
  1054. skype_rc4_iv1 (key, iv);
  1055. }
  1056. if (k == 8)
  1057. {
  1058. SKYPE_RC4_IV26();
  1059. SKYPE_RC4_IV67n (0x26B5176D);
  1060. skype_rc4_iv2 (key, key[14]);
  1061. }
  1062. iv *= 0xACA6EF1E ^ key[1];
  1063. if (k == 13)
  1064. {
  1065. SKYPE_RC4_IV44();
  1066. SKYPE_RC4_IV24();
  1067. skype_rc4_iv3 (key, iv);
  1068. }
  1069. if (k == 6)
  1070. {
  1071. SKYPE_RC4_IV44();
  1072. SKYPE_RC4_IV48();
  1073. skype_rc4_iv4 (key, key[13]);
  1074. }
  1075. iv += 41 * key[11];
  1076. if (k == 3)
  1077. {
  1078. SKYPE_RC4_IV17();
  1079. SKYPE_RC4_IV46();
  1080. skype_rc4_iv5 (key, key[17]);
  1081. }
  1082. if (k == 1)
  1083. {
  1084. SKYPE_RC4_IV54();
  1085. SKYPE_RC4_IV10();
  1086. skype_rc4_iv18 (key, iv);
  1087. }
  1088. key[8] += 35 * key[6];
  1089. if (k == 4)
  1090. {
  1091. SKYPE_RC4_IV50();
  1092. SKYPE_RC4_IV48();
  1093. skype_rc4_iv19 (key, key[1]);
  1094. }
  1095. if (k == 1)
  1096. {
  1097. SKYPE_RC4_IV47n (0x909F);
  1098. SKYPE_RC4_IV44();
  1099. skype_rc4_iv20 (key, key[2]);
  1100. }
  1101. key[11] *= key[12] - 0x48766E9C;
  1102. if (k == 0)
  1103. {
  1104. SKYPE_RC4_IV7n (0x29B6BEC0);
  1105. SKYPE_RC4_IV68n (0x5233F757);
  1106. skype_rc4_iv21 (key, key[9]);
  1107. }
  1108. if (k == 15)
  1109. {
  1110. SKYPE_RC4_IV59();
  1111. SKYPE_RC4_IV28();
  1112. skype_rc4_iv22 (key, iv);
  1113. }
  1114. key[3] += u32root (key[15]);
  1115. if (k == 5)
  1116. {
  1117. SKYPE_RC4_IV4();
  1118. SKYPE_RC4_IV28();
  1119. skype_rc4_iv23 (key, key[1]);
  1120. }
  1121. key[4] = rotl32 (key[4], u32sin(key[12]) ? 13 : key[14]);
  1122. if (k == 2)
  1123. {
  1124. SKYPE_RC4_IV4();
  1125. SKYPE_RC4_IV65();
  1126. skype_rc4_iv24 (key, key[4]);
  1127. }
  1128. if (k == 0)
  1129. {
  1130. SKYPE_RC4_IV40();
  1131. SKYPE_RC4_IV21();
  1132. skype_rc4_iv1 (key, key[5]);
  1133. }
  1134. key[5] &= 97 * key[16];
  1135. return iv;
  1136. }
  1137.  
  1138. u32 skype_rc4_iv7 (u32 * const key, u32 iv)
  1139. {
  1140. u32 k = (key[8] ^ key[7] ^ key[16]) & 15;
  1141.  
  1142. if (k == 8)
  1143. {
  1144. SKYPE_RC4_IV62n (0xCDBFC92);
  1145. SKYPE_RC4_IV6();
  1146. skype_rc4_iv19 (key, key[13]);
  1147. }
  1148. key[3] -= key[15] + 0xFE7A752E;
  1149. if (k == 3)
  1150. {
  1151. SKYPE_RC4_IV18n (0xB706A577);
  1152. SKYPE_RC4_IV1();
  1153. skype_rc4_iv20 (key, key[8]);
  1154. }
  1155. if (k == 7)
  1156. {
  1157. SKYPE_RC4_IV69();
  1158. SKYPE_RC4_IV70();
  1159. skype_rc4_iv21 (key, iv);
  1160. }
  1161. key[0] ^= 25 * key[14];
  1162. if (k == 2)
  1163. {
  1164. SKYPE_RC4_IV49n (0x06839B1C);
  1165. SKYPE_RC4_IV54();
  1166. skype_rc4_iv22 (key, key[6]);
  1167. }
  1168. if (k == 12)
  1169. {
  1170. SKYPE_RC4_IV38();
  1171. SKYPE_RC4_IV20n (0x2D742F43);
  1172. skype_rc4_iv23 (key, key[0]);
  1173. }
  1174. key[0] ^= (key[18] < 0xD339212E) ? key[18] : iv;
  1175. if (k == 11)
  1176. {
  1177. SKYPE_RC4_IV62n (0x5C1A35DA);
  1178. SKYPE_RC4_IV14();
  1179. skype_rc4_iv24 (key, key[15]);
  1180. }
  1181. if (k == 0)
  1182. {
  1183. SKYPE_RC4_IV39n (0x24FE0880);
  1184. SKYPE_RC4_IV3n (0x58FC9D30);
  1185. skype_rc4_iv1 (key, key[12]);
  1186. }
  1187. key[19] ^= key[2] ^ 0xACF3864;
  1188. if (k == 15)
  1189. {
  1190. SKYPE_RC4_IV35();
  1191. SKYPE_RC4_IV8();
  1192. skype_rc4_iv2 (key, iv);
  1193. }
  1194. if (k == 2)
  1195. {
  1196. SKYPE_RC4_IV62n (0xAAB1F08);
  1197. SKYPE_RC4_IV2();
  1198. skype_rc4_iv3 (key, iv);
  1199. }
  1200. iv -= (key[7] < 0xF2D2F7) ? key[7] : iv;
  1201. if (k == 10)
  1202. {
  1203. SKYPE_RC4_IV25();
  1204. SKYPE_RC4_IV34();
  1205. skype_rc4_iv4 (key, key[3]);
  1206. }
  1207. key[12] = rotr32 (key[12], key[19] + 3);
  1208. if (k == 6)
  1209. {
  1210. SKYPE_RC4_IV43();
  1211. SKYPE_RC4_IV68n (0x4ADA50AE);
  1212. skype_rc4_iv5 (key, key[19]);
  1213. }
  1214. if (k == 9)
  1215. {
  1216. SKYPE_RC4_IV42();
  1217. SKYPE_RC4_IV28();
  1218. skype_rc4_iv6 (key, key[9]);
  1219. }
  1220. iv ^= key[0] + 0xEC0FD36;
  1221. if (k == 1)
  1222. {
  1223. SKYPE_RC4_IV7n (0x2AB43EDB);
  1224. SKYPE_RC4_IV28();
  1225. skype_rc4_iv19 (key, iv);
  1226. }
  1227. if (k == 0)
  1228. {
  1229. SKYPE_RC4_IV61n (0xF7FB2E31);
  1230. SKYPE_RC4_IV2();
  1231. skype_rc4_iv20 (key, key[6]);
  1232. }
  1233. iv += 93 * key[5];
  1234. if (k == 13)
  1235. {
  1236. SKYPE_RC4_IV22();
  1237. SKYPE_RC4_IV9();
  1238. skype_rc4_iv21 (key, key[4]);
  1239. }
  1240. if (k == 5)
  1241. {
  1242. SKYPE_RC4_IV59();
  1243. SKYPE_RC4_IV32();
  1244. skype_rc4_iv22 (key, key[5]);
  1245. }
  1246. iv &= iv - 0x6718263;
  1247. if (k == 1)
  1248. {
  1249. SKYPE_RC4_IV39n (0x30A63C23);
  1250. SKYPE_RC4_IV12();
  1251. skype_rc4_iv23 (key, key[1]);
  1252. }
  1253. if (k == 14)
  1254. {
  1255. SKYPE_RC4_IV18n (0x98A2A62E);
  1256. SKYPE_RC4_IV1();
  1257. skype_rc4_iv24 (key, key[18]);
  1258. }
  1259. if (k == 3)
  1260. {
  1261. SKYPE_RC4_IV69();
  1262. SKYPE_RC4_IV68n (0x87E63075);
  1263. skype_rc4_iv1 (key, key[14]);
  1264. }
  1265. iv = 0xEC076923 - key[10];
  1266. if (k == 4)
  1267. {
  1268. SKYPE_RC4_IV56();
  1269. SKYPE_RC4_IV32();
  1270. skype_rc4_iv2 (key, key[10]);
  1271. SKYPE_RC4_IV57();
  1272. SKYPE_RC4_IV9();
  1273. skype_rc4_iv3 (key, key[9]);
  1274. }
  1275. return 0xD271A9AD - key[8] + iv;
  1276. }
  1277.  
  1278. u32 skype_rc4_iv8 (u32 * const key, u32 iv)
  1279. {
  1280. u32 k = (key[14] ^ key[1] ^ key[8]) & 15;
  1281.  
  1282. if (k == 3)
  1283. {
  1284. SKYPE_RC4_IV8();
  1285. SKYPE_RC4_IV7n (0x23841ACB);
  1286. skype_rc4_iv20 (key, key[18]);
  1287. }
  1288. if (k == 0)
  1289. {
  1290. SKYPE_RC4_IV15();
  1291. SKYPE_RC4_IV61n (0x1656F2C);
  1292. skype_rc4_iv21 (key, iv);
  1293. }
  1294. key[18] ^= u32root (key[1]);
  1295. if (k == 8)
  1296. {
  1297. SKYPE_RC4_IV52n (12);
  1298. SKYPE_RC4_IV51n (0xC98D4040);
  1299. skype_rc4_iv22 (key, key[10]);
  1300. }
  1301. if (k == 13)
  1302. {
  1303. SKYPE_RC4_IV6();
  1304. SKYPE_RC4_IV20n (0xC53796B3);
  1305. skype_rc4_iv23 (key, key[18]);
  1306. }
  1307. key[2] += rotr32 (key[14], 12);
  1308. if (k == 3)
  1309. {
  1310. SKYPE_RC4_IV49n (0x29D9DEBC);
  1311. SKYPE_RC4_IV64();
  1312. skype_rc4_iv24 (key, iv);
  1313. }
  1314. if (k == 9)
  1315. {
  1316. SKYPE_RC4_IV26();
  1317. SKYPE_RC4_IV70();
  1318. skype_rc4_iv1 (key, key[7]);
  1319. }
  1320. if (k == 11)
  1321. {
  1322. SKYPE_RC4_IV19();
  1323. SKYPE_RC4_IV42();
  1324. skype_rc4_iv2 (key, key[6]);
  1325. }
  1326. key[18] ^= u32root (key[17]);
  1327. if (k == 10)
  1328. {
  1329. SKYPE_RC4_IV31();
  1330. SKYPE_RC4_IV35();
  1331. skype_rc4_iv3(key, iv);
  1332. }
  1333. if (k == 4)
  1334. {
  1335. SKYPE_RC4_IV16n (0x41528AC);
  1336. SKYPE_RC4_IV56();
  1337. skype_rc4_iv4(key, iv);
  1338. }
  1339. key[16] += 73 * key[2];
  1340. if (k == 14)
  1341. {
  1342. SKYPE_RC4_IV15();
  1343. SKYPE_RC4_IV47n (0xA5DCFAFF);
  1344. skype_rc4_iv5(key, key[10]);
  1345. }
  1346. if (k == 5)
  1347. {
  1348. SKYPE_RC4_IV14();
  1349. SKYPE_RC4_IV69();
  1350. skype_rc4_iv6(key, iv);
  1351. }
  1352. iv += rotr32 (iv, 19);
  1353. if (k == 2)
  1354. {
  1355. SKYPE_RC4_IV7n (0x504F395C);
  1356. SKYPE_RC4_IV61n (0xB6E979A8);
  1357. skype_rc4_iv7 (key, iv);
  1358. SKYPE_RC4_IV41();
  1359. SKYPE_RC4_IV13();
  1360. skype_rc4_iv20 (key, iv);
  1361. }
  1362. key[9] ^= 110 * key[1];
  1363. if (k == 1)
  1364. {
  1365. SKYPE_RC4_IV56();
  1366. SKYPE_RC4_IV47n (0x6F09E141);
  1367. skype_rc4_iv21 (key, key[7]);
  1368. }
  1369. if (k == 4)
  1370. {
  1371. SKYPE_RC4_IV37();
  1372. SKYPE_RC4_IV31();
  1373. skype_rc4_iv22(key, key[7]);
  1374. }
  1375. if (k == 15)
  1376. {
  1377. SKYPE_RC4_IV29n (0xA09F88F1);
  1378. SKYPE_RC4_IV59();
  1379. skype_rc4_iv23(key, key[14]);
  1380. }
  1381. key[16] -= (key[0] < 0x22C8CF2) ? key[0] : key[5];
  1382. if (k == 0)
  1383. {
  1384. SKYPE_RC4_IV57();
  1385. SKYPE_RC4_IV45();
  1386. skype_rc4_iv24(key, key[2]);
  1387. }
  1388. if (k == 5)
  1389. {
  1390. SKYPE_RC4_IV53();
  1391. SKYPE_RC4_IV14();
  1392. skype_rc4_iv1(key, key[4]);
  1393. }
  1394. key[9] *= (iv < 0x5FD809D2) ? iv : key[4];
  1395. if (k == 7)
  1396. {
  1397. SKYPE_RC4_IV69();
  1398. SKYPE_RC4_IV49n (0x332DA0B6);
  1399. skype_rc4_iv2(key, key[5]);
  1400. }
  1401. if (k == 1)
  1402. {
  1403. SKYPE_RC4_IV12();
  1404. SKYPE_RC4_IV51n (0x86D5035B);
  1405. skype_rc4_iv3 (key, key[0]);
  1406. }
  1407. iv += iv - 0x5790C685;
  1408. if (k == 12)
  1409. {
  1410. SKYPE_RC4_IV13();
  1411. SKYPE_RC4_IV58n (0x121738E5);
  1412. skype_rc4_iv4 (key, iv);
  1413. }
  1414. if (k == 6)
  1415. {
  1416. SKYPE_RC4_IV27();
  1417. SKYPE_RC4_IV16n (0x60E885A6);
  1418. skype_rc4_iv5 (key, key[4]);
  1419. }
  1420. key[18] *= 0x5790C685 ^ key[13];
  1421. return iv;
  1422. }
  1423.  
  1424. u32 skype_rc4_iv9 (u32 * const key, u32 iv)
  1425. {
  1426. u32 k = (key[18] ^ key[5] ^ key[2]) & 15;
  1427.  
  1428. if (k == 10)
  1429. {
  1430. SKYPE_RC4_IV36n (0xA7EF6FAB);
  1431. SKYPE_RC4_IV31();
  1432. skype_rc4_iv21 (key, iv);
  1433. }
  1434. if (k == 6)
  1435. {
  1436. SKYPE_RC4_IV28();
  1437. SKYPE_RC4_IV24();
  1438. skype_rc4_iv22(key, key[19]);
  1439. }
  1440. key[5] |= u32root (key[11]);
  1441. if (k == 5)
  1442. {
  1443. SKYPE_RC4_IV15();
  1444. SKYPE_RC4_IV55();
  1445. skype_rc4_iv23(key, key[5]);
  1446. }
  1447. if (k == 4)
  1448. {
  1449. SKYPE_RC4_IV27();
  1450. SKYPE_RC4_IV8();
  1451. skype_rc4_iv24(key, key[9]);
  1452. }
  1453. key[15] &= 88 * key[12];
  1454. if (k == 0)
  1455. {
  1456. SKYPE_RC4_IV47n (0xF5D726FF);
  1457. SKYPE_RC4_IV32();
  1458. skype_rc4_iv1 (key, key[0]);
  1459. }
  1460. if (k == 7)
  1461. {
  1462. SKYPE_RC4_IV56();
  1463. SKYPE_RC4_IV62n (0x6C0A34BC);
  1464. skype_rc4_iv2 (key, key[10]);
  1465. }
  1466. if (k == 4)
  1467. {
  1468. SKYPE_RC4_IV54();
  1469. SKYPE_RC4_IV38();
  1470. skype_rc4_iv3 (key, key[2]);
  1471. }
  1472. iv += 0xFDFB78FE * key[11];
  1473. if (k == 5)
  1474. {
  1475. SKYPE_RC4_IV40();
  1476. SKYPE_RC4_IV34();
  1477. skype_rc4_iv4 (key, key[17]);
  1478. }
  1479. if (k == 12)
  1480. {
  1481. SKYPE_RC4_IV4();
  1482. SKYPE_RC4_IV47n (0x4EFAD4C);
  1483. skype_rc4_iv5 (key, key[9]);
  1484. }
  1485. key[12] += iv - 0x4C7E1193;
  1486. if (k == 3)
  1487. {
  1488. SKYPE_RC4_IV62n (0x6FFD6E50);
  1489. SKYPE_RC4_IV9();
  1490. skype_rc4_iv6 (key, key[17]);
  1491. }
  1492. if (k == 2)
  1493. {
  1494. SKYPE_RC4_IV59();
  1495. SKYPE_RC4_IV13();
  1496. skype_rc4_iv7 (key, key[15]);
  1497. }
  1498. if (k == 3)
  1499. {
  1500. SKYPE_RC4_IV9();
  1501. SKYPE_RC4_IV64();
  1502. skype_rc4_iv8 (key, iv);
  1503. }
  1504. key[16] += u32root (key[2]);
  1505. if (k == 6)
  1506. {
  1507. SKYPE_RC4_IV19();
  1508. SKYPE_RC4_IV47n (0x28288B07);
  1509. skype_rc4_iv21 (key, key[15]);
  1510. }
  1511. if (k == 2)
  1512. {
  1513. SKYPE_RC4_IV30n (0xA623C3F4);
  1514. SKYPE_RC4_IV65();
  1515. skype_rc4_iv22 (key, key[5]);
  1516. }
  1517. key[0] *= 123 * key[19];
  1518. if (k == 9)
  1519. {
  1520. SKYPE_RC4_IV41();
  1521. SKYPE_RC4_IV35();
  1522. skype_rc4_iv23 (key, key[0]);
  1523. }
  1524. if (k == 15)
  1525. {
  1526. SKYPE_RC4_IV1();
  1527. SKYPE_RC4_IV52n (5);
  1528. skype_rc4_iv24 (key, iv);
  1529. }
  1530. if (k == 14)
  1531. {
  1532. SKYPE_RC4_IV34();
  1533. SKYPE_RC4_IV6();
  1534. skype_rc4_iv1 (key, key[8]);
  1535. }
  1536. key[4] |= 0x89C7C4D3 ^ key[13];
  1537. if (k == 13)
  1538. {
  1539. SKYPE_RC4_IV6();
  1540. SKYPE_RC4_IV19();
  1541. skype_rc4_iv2 (key, key[3]);
  1542. }
  1543. if (k == 8)
  1544. {
  1545. SKYPE_RC4_IV13();
  1546. SKYPE_RC4_IV27();
  1547. skype_rc4_iv3 (key, key[5]);
  1548. }
  1549. iv -= u32cos(key[14]) ? 0x111DCA68 : key[18];
  1550. if (k == 11)
  1551. {
  1552. SKYPE_RC4_IV52n (29);
  1553. SKYPE_RC4_IV58n (0xA35F29BB);
  1554. skype_rc4_iv4 (key, key[3]);
  1555. }
  1556. if (k == 0)
  1557. {
  1558. SKYPE_RC4_IV69();
  1559. SKYPE_RC4_IV18n (0x20F609B2);
  1560. skype_rc4_iv5 (key, key[11]);
  1561. }
  1562. if (k == 1)
  1563. {
  1564. SKYPE_RC4_IV42();
  1565. SKYPE_RC4_IV34();
  1566. skype_rc4_iv6 (key, key[4]);
  1567. }
  1568. key[11] *= u32root (iv);
  1569. if (k == 1)
  1570. {
  1571. SKYPE_RC4_IV18n (0x8FE3C3F3);
  1572. SKYPE_RC4_IV1();
  1573. skype_rc4_iv7 (key, iv);
  1574. }
  1575. key[16] ^= u32sin(iv) ? 0x16283882 : key[12];
  1576. return iv;
  1577. }
  1578.  
  1579. u32 skype_rc4_iv10 (u32 * const key, u32 iv)
  1580. {
  1581. u32 k = key[14] & 15;
  1582.  
  1583. if (k == 5)
  1584. {
  1585. SKYPE_RC4_IV17();
  1586. SKYPE_RC4_IV59();
  1587. skype_rc4_iv22 (key, iv);
  1588. }
  1589. if (k == 9)
  1590. {
  1591. SKYPE_RC4_IV67n (0xBD460637);
  1592. SKYPE_RC4_IV67n (0x23D5BA3F);
  1593. skype_rc4_iv23 (key, key[19]);
  1594. }
  1595. key[19] *= u32root (iv);
  1596. if (k == 10)
  1597. {
  1598. SKYPE_RC4_IV55();
  1599. SKYPE_RC4_IV36n (0x7789BFF3);
  1600. skype_rc4_iv24 (key, key[12]);
  1601. }
  1602. if (k == 11)
  1603. {
  1604. SKYPE_RC4_IV65();
  1605. SKYPE_RC4_IV52n (1);
  1606. skype_rc4_iv1 (key, iv);
  1607. }
  1608. key[12] ^= u32cos(key[11]) ? 0x1594E0E0 : key[7];
  1609. if (k == 15)
  1610. {
  1611. SKYPE_RC4_IV57();
  1612. SKYPE_RC4_IV23();
  1613. skype_rc4_iv2 (key, iv);
  1614. }
  1615. if (k == 4)
  1616. {
  1617. SKYPE_RC4_IV29n (0x7D76C942);
  1618. SKYPE_RC4_IV53();
  1619. skype_rc4_iv3 (key, iv);
  1620. }
  1621. key[18] &= rotr32 (key[17], 29);
  1622. if (k == 12)
  1623. {
  1624. SKYPE_RC4_IV24();
  1625. SKYPE_RC4_IV16n (0xB82B0DAB);
  1626. skype_rc4_iv4 (key, key[3]);
  1627. }
  1628. if (k == 1)
  1629. {
  1630. SKYPE_RC4_IV36n (0x3F7FFFE3);
  1631. SKYPE_RC4_IV33n (0x6AEC3B22);
  1632. skype_rc4_iv5 (key, key[5]);
  1633. }
  1634. key[1] -= 92 * key[19];
  1635. if (k == 14)
  1636. {
  1637. SKYPE_RC4_IV30n (0x752B3066);
  1638. SKYPE_RC4_IV2();
  1639. skype_rc4_iv6 (key, key[0]);
  1640. }
  1641. if (k == 3)
  1642. {
  1643. SKYPE_RC4_IV65();
  1644. SKYPE_RC4_IV39n (0x2CE8A84E);
  1645. skype_rc4_iv7 (key, iv);
  1646. }
  1647. key[14] += 0x1579CA5 - iv;
  1648. if (k == 1)
  1649. {
  1650. SKYPE_RC4_IV35();
  1651. SKYPE_RC4_IV64();
  1652. skype_rc4_iv8 (key, iv);
  1653. }
  1654. if (k == 6)
  1655. {
  1656. SKYPE_RC4_IV20n (0x2EFE59F4);
  1657. SKYPE_RC4_IV66();
  1658. skype_rc4_iv9 (key, iv);
  1659. }
  1660. key[8] -= 78 * key[1];
  1661. if (k == 13)
  1662. {
  1663. SKYPE_RC4_IV20n (0x18A96853);
  1664. SKYPE_RC4_IV47n (0x0F6AF31E);
  1665. skype_rc4_iv22 (key, key[14]);
  1666. }
  1667. if (k == 2)
  1668. {
  1669. SKYPE_RC4_IV48();
  1670. SKYPE_RC4_IV52n (4);
  1671. skype_rc4_iv23 (key, key[13]);
  1672. }
  1673. key[16] = rotr32 (key[16], key[15] | 30);
  1674. if (k == 0)
  1675. {
  1676. SKYPE_RC4_IV36n (0xA7E9B7A3);
  1677. SKYPE_RC4_IV44();
  1678. skype_rc4_iv24 (key, key[7]);
  1679. SKYPE_RC4_IV49n (0xF7849C32);
  1680. SKYPE_RC4_IV32();
  1681. skype_rc4_iv1 (key, key[6]);
  1682. }
  1683. key[8] -= 12 * key[18];
  1684. if (k == 4)
  1685. {
  1686. SKYPE_RC4_IV69();
  1687. SKYPE_RC4_IV70();
  1688. skype_rc4_iv2 (key, iv);
  1689. }
  1690. if (k == 3)
  1691. {
  1692. SKYPE_RC4_IV33n (0x351E5020);
  1693. SKYPE_RC4_IV40();
  1694. skype_rc4_iv3 (key, key[1]);
  1695. }
  1696. key[14] ^= u32cos(key[5]) ? 0x579B4B85 : key[6];
  1697. if (k == 2)
  1698. {
  1699. SKYPE_RC4_IV64();
  1700. SKYPE_RC4_IV57();
  1701. skype_rc4_iv4 (key, key[10]);
  1702. }
  1703. if (k == 5)
  1704. {
  1705. SKYPE_RC4_IV38();
  1706. SKYPE_RC4_IV10();
  1707. skype_rc4_iv5 (key, iv);
  1708. }
  1709. key[10] += 0x3575DC9 * key[13];
  1710. if (k == 7)
  1711. {
  1712. SKYPE_RC4_IV50();
  1713. SKYPE_RC4_IV16n (0xB8AD3ED9);
  1714. skype_rc4_iv6 (key, key[16]);
  1715. SKYPE_RC4_IV29n (0xC279F292);
  1716. SKYPE_RC4_IV48();
  1717. skype_rc4_iv7 (key, key[16]);
  1718. }
  1719. if (k == 8)
  1720. {
  1721. SKYPE_RC4_IV2();
  1722. SKYPE_RC4_IV45();
  1723. skype_rc4_iv8 (key, key[14]);
  1724. }
  1725. key[4] ^= key[5] & 0x136008B9;
  1726. if (k == 6)
  1727. {
  1728. SKYPE_RC4_IV66();
  1729. SKYPE_RC4_IV10();
  1730. skype_rc4_iv9 (key, key[4]);
  1731. }
  1732. key[3] ^= 0x29909382 + key[13];
  1733. return iv;
  1734. }
  1735.  
  1736. u32 skype_rc4_iv11 (u32 * const key, u32 iv)
  1737. {
  1738. u32 k = key[3] & 15;
  1739.  
  1740. if (k == 5)
  1741. {
  1742. SKYPE_RC4_IV45();
  1743. SKYPE_RC4_IV14();
  1744. skype_rc4_iv23 (key, key[4]);
  1745. }
  1746. if (k == 7)
  1747. {
  1748. SKYPE_RC4_IV20n (0xBEF59983);
  1749. SKYPE_RC4_IV34();
  1750. skype_rc4_iv24 (key, iv);
  1751. }
  1752. key[4] *= u32sin(iv) ? 0x23D1B75F : key[11];
  1753. if (k == 10)
  1754. {
  1755. SKYPE_RC4_IV44();
  1756. SKYPE_RC4_IV15();
  1757. skype_rc4_iv1 (key, iv);
  1758. }
  1759. if (k == 8)
  1760. {
  1761. SKYPE_RC4_IV15();
  1762. SKYPE_RC4_IV13();
  1763. skype_rc4_iv2 (key, key[11]);
  1764. }
  1765. iv *= key[13] - 0x21175CB;
  1766. if (k == 4)
  1767. {
  1768. SKYPE_RC4_IV63n (0x60AB10C9);
  1769. SKYPE_RC4_IV12();
  1770. skype_rc4_iv3 (key, key[11]);
  1771. }
  1772. if (k == 2)
  1773. {
  1774. SKYPE_RC4_IV34();
  1775. SKYPE_RC4_IV32();
  1776. skype_rc4_iv4 (key, key[15]);
  1777. SKYPE_RC4_IV21();
  1778. SKYPE_RC4_IV1();
  1779. skype_rc4_iv5 (key, key[8]);
  1780. }
  1781. iv = rotl32 (iv, iv + 5);
  1782. if (k == 4)
  1783. {
  1784. SKYPE_RC4_IV67n (0xF2F0F729);
  1785. SKYPE_RC4_IV9();
  1786. skype_rc4_iv6 (key, key[7]);
  1787. }
  1788. if (k == 0)
  1789. {
  1790. SKYPE_RC4_IV59();
  1791. SKYPE_RC4_IV52n (12);
  1792. skype_rc4_iv7 (key, key[17]);
  1793. }
  1794. key[3] = rotl32 (key[3], (key[8] < 0x354AE538) ? key[8] : iv);
  1795. if (k == 0)
  1796. {
  1797. SKYPE_RC4_IV28();
  1798. SKYPE_RC4_IV8();
  1799. skype_rc4_iv8 (key, key[7]);
  1800. }
  1801. if (k == 11)
  1802. {
  1803. SKYPE_RC4_IV61n (0xD083A1C7);
  1804. SKYPE_RC4_IV23();
  1805. skype_rc4_iv9 (key, key[3]);
  1806. }
  1807. key[7] -= key[18] ^ 0xF1CDC7D;
  1808. if (k == 8)
  1809. {
  1810. SKYPE_RC4_IV9();
  1811. SKYPE_RC4_IV47n (0xC67A38DE);
  1812. skype_rc4_iv10 (key, key[16]);
  1813. }
  1814. if (k == 1)
  1815. {
  1816. SKYPE_RC4_IV14();
  1817. SKYPE_RC4_IV34();
  1818. skype_rc4_iv23 (key, iv);
  1819. }
  1820. if (k == 15)
  1821. {
  1822. SKYPE_RC4_IV44();
  1823. SKYPE_RC4_IV3n (0xE6E035C2);
  1824. skype_rc4_iv24 (key, key[3]);
  1825. }
  1826. iv += (key[13] < 0x32081481) ? key[13] : iv;
  1827. if (k == 9)
  1828. {
  1829. SKYPE_RC4_IV51n (0xBFAF8559);
  1830. SKYPE_RC4_IV30n (0x8494F082);
  1831. skype_rc4_iv1 (key, key[10]);
  1832. }
  1833. if (k == 3)
  1834. {
  1835. SKYPE_RC4_IV24();
  1836. SKYPE_RC4_IV20n (0x0D4CA763);
  1837. skype_rc4_iv2 (key, key[3]);
  1838. }
  1839. key[18] += 0xD3BE6F0E - key[17];
  1840. if (k == 1)
  1841. {
  1842. SKYPE_RC4_IV51n (0xAEB00548);
  1843. SKYPE_RC4_IV63n (0x91E7D2DC);
  1844. skype_rc4_iv3 (key, key[13]);
  1845. }
  1846. if (k == 5)
  1847. {
  1848. SKYPE_RC4_IV5();
  1849. SKYPE_RC4_IV36n (0x379DEFB3);
  1850. skype_rc4_iv4 (key, iv);
  1851. }
  1852. if (k == 6)
  1853. {
  1854. SKYPE_RC4_IV19();
  1855. SKYPE_RC4_IV4();
  1856. skype_rc4_iv5 (key, key[7]);
  1857. }
  1858. key[7] -= (iv < 0xD28B93FE) ? iv : key[18];
  1859. if (k == 14)
  1860. {
  1861. SKYPE_RC4_IV4();
  1862. SKYPE_RC4_IV67n (0xD0D89937);
  1863. skype_rc4_iv6 (key, iv);
  1864. }
  1865. if (k == 3)
  1866. {
  1867. SKYPE_RC4_IV3n (0x91403FF1);
  1868. SKYPE_RC4_IV54();
  1869. skype_rc4_iv7 (key, key[10]);
  1870. }
  1871. key[2] = rotl32 (key[2], -80 * key[17]);
  1872. if (k == 13)
  1873. {
  1874. SKYPE_RC4_IV63n (0x313B46D8);
  1875. SKYPE_RC4_IV47n (0xD9FEC55F);
  1876. skype_rc4_iv8 (key, key[10]);
  1877. }
  1878. if (k == 12)
  1879. {
  1880. SKYPE_RC4_IV20n (0xDFBCF197);
  1881. SKYPE_RC4_IV36n (0x3F4F37BB);
  1882. skype_rc4_iv9 (key, iv);
  1883. }
  1884. key[17] -= key[3] & 0x5C40869;
  1885. if (k == 7)
  1886. {
  1887. SKYPE_RC4_IV8();
  1888. SKYPE_RC4_IV47n (0xE8B5F17D);
  1889. skype_rc4_iv10 (key, key[4]);
  1890. }
  1891. if (k == 6)
  1892. {
  1893. SKYPE_RC4_IV63n (0x4321C7C4);
  1894. SKYPE_RC4_IV2();
  1895. skype_rc4_iv23 (key, key[7]);
  1896. }
  1897. key[6] += iv - 0xAD58C16C;
  1898. return iv;
  1899. }
  1900.  
  1901. u32 skype_rc4_iv12 (u32 * const key, u32 iv)
  1902. {
  1903. u32 k = (key[19] ^ iv ^ key[0]) & 15;
  1904.  
  1905. if (k == 2)
  1906. {
  1907. SKYPE_RC4_IV32();
  1908. SKYPE_RC4_IV38();
  1909. skype_rc4_iv24 (key, key[6]);
  1910. }
  1911. if (k == 3)
  1912. {
  1913. SKYPE_RC4_IV17();
  1914. SKYPE_RC4_IV69();
  1915. skype_rc4_iv1 (key, key[0]);
  1916. }
  1917. iv -= rotr32 (key[7], 10);
  1918. if (k == 8)
  1919. {
  1920. SKYPE_RC4_IV27();
  1921. SKYPE_RC4_IV39n (0x454B4CB0);
  1922. skype_rc4_iv2 (key, key[5]);
  1923. }
  1924. if (k == 13)
  1925. {
  1926. SKYPE_RC4_IV37();
  1927. SKYPE_RC4_IV14();
  1928. skype_rc4_iv3 (key, key[4]);
  1929. }
  1930. key[5] ^= key[13] - 0x05648E1C;
  1931. if (k == 1)
  1932. {
  1933. SKYPE_RC4_IV63n (0x5F7C048F);
  1934. SKYPE_RC4_IV4();
  1935. skype_rc4_iv4 (key, key[5]);
  1936. }
  1937. if (k == 15)
  1938. {
  1939. SKYPE_RC4_IV57();
  1940. SKYPE_RC4_IV61n (0xDBC32E55);
  1941. skype_rc4_iv5 (key, iv);
  1942. }
  1943. if (k == 7)
  1944. {
  1945. SKYPE_RC4_IV56();
  1946. SKYPE_RC4_IV69();
  1947. skype_rc4_iv6 (key, key[16]);
  1948. }
  1949. key[0] ^= 0xC8350BCD * key[17];
  1950. if (k == 1)
  1951. {
  1952. SKYPE_RC4_IV6();
  1953. SKYPE_RC4_IV61n (0xF14A0809);
  1954. skype_rc4_iv7 (key, key[12]);
  1955. }
  1956. if (k == 10)
  1957. {
  1958. SKYPE_RC4_IV42();
  1959. SKYPE_RC4_IV36n (0xEF4BAFA3);
  1960. skype_rc4_iv8 (key, key[16]);
  1961. }
  1962. if (k == 4)
  1963. {
  1964. SKYPE_RC4_IV57();
  1965. SKYPE_RC4_IV4();
  1966. skype_rc4_iv9 (key, key[18]);
  1967. }
  1968. iv &= (0xC8350BCD + key[13]);
  1969. if (k == 5)
  1970. {
  1971. SKYPE_RC4_IV16n (0x75B10262);
  1972. SKYPE_RC4_IV21();
  1973. skype_rc4_iv10 (key, key[7]);
  1974. }
  1975. if (k == 6)
  1976. {
  1977. SKYPE_RC4_IV56();
  1978. SKYPE_RC4_IV1();
  1979. skype_rc4_iv11 (key, key[2]);
  1980. }
  1981. key[2] = rotr32 (key[2], key[17] & 8);
  1982. if (k == 5)
  1983. {
  1984. SKYPE_RC4_IV22();
  1985. SKYPE_RC4_IV24();
  1986. skype_rc4_iv24 (key, iv);
  1987. }
  1988. if (k == 0)
  1989. {
  1990. SKYPE_RC4_IV23();
  1991. SKYPE_RC4_IV57();
  1992. skype_rc4_iv1 (key, key[8]);
  1993. }
  1994. iv = rotr32 (iv, iv - 16);
  1995. if (k == 9)
  1996. {
  1997. SKYPE_RC4_IV1();
  1998. SKYPE_RC4_IV62n (0x7C854F50);
  1999. skype_rc4_iv2 (key, key[2]);
  2000. }
  2001. if (k == 3)
  2002. {
  2003. SKYPE_RC4_IV38();
  2004. SKYPE_RC4_IV25();
  2005. skype_rc4_iv3 (key, key[16]);
  2006. }
  2007. if (k == 6)
  2008. {
  2009. SKYPE_RC4_IV37();
  2010. SKYPE_RC4_IV50();
  2011. skype_rc4_iv4 (key, key[12]);
  2012. }
  2013. key[17] ^= rotl32 (key[3], 5);
  2014. if (k == 4)
  2015. {
  2016. SKYPE_RC4_IV37();
  2017. SKYPE_RC4_IV54();
  2018. skype_rc4_iv5 (key, key[19]);
  2019. }
  2020. if (k == 11)
  2021. {
  2022. SKYPE_RC4_IV10();
  2023. SKYPE_RC4_IV30n (0xBDDD6945);
  2024. skype_rc4_iv6 (key, iv);
  2025. }
  2026. key[15] += 0x531BF4BD - key[5];
  2027. if (k == 0)
  2028. {
  2029. SKYPE_RC4_IV24();
  2030. SKYPE_RC4_IV70();
  2031. skype_rc4_iv7 (key, iv);
  2032. }
  2033. if (k == 9)
  2034. {
  2035. SKYPE_RC4_IV27();
  2036. SKYPE_RC4_IV22();
  2037. skype_rc4_iv8 (key, iv);
  2038. }
  2039. if (k == 14)
  2040. {
  2041. SKYPE_RC4_IV21();
  2042. SKYPE_RC4_IV8();
  2043. skype_rc4_iv9 (key, key[7]);
  2044. }
  2045. key[5] &= (key[9] < 0x802D5786) ? key[9] : key[16];
  2046. if (k == 12)
  2047. {
  2048. SKYPE_RC4_IV5();
  2049. SKYPE_RC4_IV48();
  2050. skype_rc4_iv10 (key, iv);
  2051. }
  2052. if (k == 7)
  2053. {
  2054. SKYPE_RC4_IV62n (0x75382920);
  2055. SKYPE_RC4_IV64();
  2056. skype_rc4_iv11 (key, key[10]);
  2057. }
  2058. key[1] *= 104 * key[12];
  2059. if (k == 8)
  2060. {
  2061. SKYPE_RC4_IV24();
  2062. SKYPE_RC4_IV3n (0xCCB27D90);
  2063. skype_rc4_iv24 (key, key[19]);
  2064. }
  2065. if (k == 2)
  2066. {
  2067. SKYPE_RC4_IV13();
  2068. SKYPE_RC4_IV54();
  2069. skype_rc4_iv1 (key, key[4]);
  2070. }
  2071. key[17] ^= (iv < 0x136FA01) ? iv : key[18];
  2072. return iv;
  2073. }
  2074.  
  2075. u32 skype_rc4_iv13 (u32 * const key, u32 iv)
  2076. {
  2077. u32 k = (iv ^ key[0] ^ key[18]) & 1;
  2078.  
  2079. key[11] ^= key[5] | 0x16AE2234;
  2080. key[12] += (key[8] & 0xAE32B8E);
  2081. key[0] -= 12 * key[16];
  2082. key[16] ^= iv + 0xA8BDFE15;
  2083. key[9] -= 0x8181F7E7 + key[10];
  2084. if (k == 0)
  2085. {
  2086. SKYPE_RC4_IV47n (0x24B5D4C1);
  2087. SKYPE_RC4_IV69();
  2088. SKYPE_RC4_IV71n (iv);
  2089. }
  2090. iv = rotr32 (iv, 30 * key[16]);
  2091. iv ^= rotr32 (key[15], 20);
  2092. key[13] += key[13] ^ 0x486B19AC;
  2093. key[2] |= key[9] + 0x1086C59F;
  2094. key[14] |= u32cos(iv) ? 0x5BADEF93 : key[10];
  2095. if (k == 1)
  2096. {
  2097. SKYPE_RC4_IV9();
  2098. SKYPE_RC4_IV29n (0xB0DAD1C3);
  2099. SKYPE_RC4_IV72n (key[17]);
  2100. }
  2101. key[12] += (key[10] < 0x2EE7C8C3) ? key[10] : iv;
  2102. return iv;
  2103. }
  2104.  
  2105. u32 skype_rc4_iv14 (u32 * const key, u32 iv)
  2106. {
  2107. u32 k = (iv ^ key[0] ^ key[16]) % 3;
  2108.  
  2109. key[12] += (iv < 0x3FEC317) ? iv : key[12];
  2110. iv = rotr32 (iv, iv - 8);
  2111. key[10] *= key[10] - 0x54940E;
  2112. if (k == 2)
  2113. {
  2114. SKYPE_RC4_IV52n (29);
  2115. SKYPE_RC4_IV1();
  2116. SKYPE_RC4_IV71n (key[19]);
  2117. }
  2118. key[2] = rotr32 (key[2], rotr32 (key[6], 22));
  2119. key[12] = rotr32 (key[12], key[1] - 0x2206F590);
  2120. key[15] = rotl32 (key[15], key[8] ^ 150);
  2121. if (k == 0)
  2122. {
  2123. SKYPE_RC4_IV32();
  2124. SKYPE_RC4_IV43();
  2125. SKYPE_RC4_IV72n (key[5]);
  2126. }
  2127. iv += u32root (key[9]);
  2128. key[10] -= rotl32 (iv, 0x209B4CB8);
  2129. key[1] += 41 * iv;
  2130. key[9] *= 105 * key[3];
  2131. if (k == 1)
  2132. {
  2133. SKYPE_RC4_IV24();
  2134. SKYPE_RC4_IV55();
  2135. skype_rc4_iv13 (key, key[0]);
  2136. }
  2137. iv -= 0xFCCEF753 | key[10];
  2138. return iv;
  2139. }
  2140.  
  2141. u32 skype_rc4_iv15 (u32 * const key, u32 iv)
  2142. {
  2143. u32 k = key[16] & 3;
  2144.  
  2145. iv += rotl32 (key[10], 4);
  2146. iv = rotr32 (iv, u32cos(key[18]) ? 14 : key[15]);
  2147. if (k == 3)
  2148. {
  2149. SKYPE_RC4_IV27();
  2150. SKYPE_RC4_IV53();
  2151. SKYPE_RC4_IV71n (key[2]);
  2152. }
  2153. iv = rotl32 (iv, rotr32 (key[6], 21));
  2154. key[17] |= key[11] - 0xBF85104;
  2155. key[17] -= 78 * iv;
  2156. if (k == 1)
  2157. {
  2158. SKYPE_RC4_IV70();
  2159. SKYPE_RC4_IV9();
  2160. SKYPE_RC4_IV72n (iv);
  2161. }
  2162. key[15] += u32cos(iv) ? 0xA82B365 : key[7];
  2163. key[17] -= u32cos(key[11]) ? 0x9AA8540 : iv;
  2164. iv ^= u32sin(key[12]) ? 0x3B018731 : key[12];
  2165. if (k == 2)
  2166. {
  2167. SKYPE_RC4_IV69();
  2168. SKYPE_RC4_IV70();
  2169. skype_rc4_iv13 (key, iv);
  2170. }
  2171. key[7] ^= u32sin(key[17]) ? 0x836B3E03 : key[6];
  2172. key[2] ^= key[6] + 0x1E0BBA53;
  2173. key[15] += 0x812EAA9D - key[1];
  2174. if (k == 0)
  2175. {
  2176. SKYPE_RC4_IV42();
  2177. SKYPE_RC4_IV37();
  2178. skype_rc4_iv14 (key, key[2]);
  2179. }
  2180. key[1] ^= (key[14] < 0x812EAA9D) ? key[14] : iv;
  2181. return iv;
  2182. }
  2183.  
  2184. u32 skype_rc4_iv16 (u32 * const key, u32 iv)
  2185. {
  2186. u32 k = (key[12] ^ iv ^ key[5]) % 5;
  2187.  
  2188. key[17] = rotl32 (key[17], u32cos(iv) ? 2 : key[19]);
  2189. iv -= iv | 0x16E2A7D1;
  2190. if (k == 2)
  2191. {
  2192. SKYPE_RC4_IV8();
  2193. SKYPE_RC4_IV8();
  2194. SKYPE_RC4_IV71n (key[0]);
  2195. }
  2196. key[15] *= 118 * iv;
  2197. key[12] = rotl32 (key[12], key[10] - 7);
  2198. if (k == 1)
  2199. {
  2200. SKYPE_RC4_IV4();
  2201. SKYPE_RC4_IV19();
  2202. SKYPE_RC4_IV72n (key[3]);
  2203. }
  2204. key[2] += (key[13] < 0x588BA7CA) ? key[13] : iv;
  2205. key[19] -= (key[12] < 0x3F5E1B0) ? key[12] : key[9];
  2206. if (k == 3)
  2207. {
  2208. SKYPE_RC4_IV12();
  2209. SKYPE_RC4_IV36n (0xBFA93FA3);
  2210. skype_rc4_iv13 (key, key[14]);
  2211. }
  2212. iv *= -11;
  2213. key[3] += 76 * key[5];
  2214. if (k == 4)
  2215. {
  2216. SKYPE_RC4_IV48();
  2217. SKYPE_RC4_IV55();
  2218. skype_rc4_iv14 (key, key[17]);
  2219. }
  2220. key[11] *= key[3] | 0xA760EE25;
  2221. key[19] += key[12] + 0xA760EE25;
  2222. if (k == 0)
  2223. {
  2224. SKYPE_RC4_IV32();
  2225. SKYPE_RC4_IV11();
  2226. skype_rc4_iv15 (key, key[6]);
  2227. }
  2228. key[15] = rotr32 (key[15], (key[14] < 0x9161D683) ? key[14] : key[9]);
  2229. return iv;
  2230. }
  2231.  
  2232. u32 skype_rc4_iv17 (u32 * const key, u32 iv)
  2233. {
  2234. u32 k = (key[14] ^ key[2] ^ key[6]) % 6;
  2235.  
  2236. key[1] += u32sin(key[1]) ? 0x1FAE4F0 : key[17];
  2237. if (k == 4)
  2238. {
  2239. SKYPE_RC4_IV67n (0xF37F8F83);
  2240. SKYPE_RC4_IV52n (31);
  2241. SKYPE_RC4_IV71n (key[7]);
  2242. }
  2243. key[3] -= rotl32 (key[9], 5);
  2244. key[12] *= rotr32 (key[4], 19);
  2245. if (k == 3)
  2246. {
  2247. SKYPE_RC4_IV28();
  2248. SKYPE_RC4_IV56();
  2249. SKYPE_RC4_IV72n (iv);
  2250. }
  2251. iv -= rotl32 (iv, 18);
  2252. key[19] ^= iv + 0x222E1310;
  2253. if (k == 2)
  2254. {
  2255. SKYPE_RC4_IV38();
  2256. SKYPE_RC4_IV52n (6);
  2257. skype_rc4_iv13 (key, key[18]);
  2258. }
  2259. key[17] ^= iv - 0x7FAB735B;
  2260. if (k == 0)
  2261. {
  2262. SKYPE_RC4_IV3n (0xD2430E50);
  2263. SKYPE_RC4_IV25();
  2264. skype_rc4_iv14 (key, iv);
  2265. }
  2266. key[14] |= key[1] ^ 0x71B103BD;
  2267. iv = rotr32 (iv, 6 * key[16]);
  2268. if (k == 1)
  2269. {
  2270. SKYPE_RC4_IV48();
  2271. SKYPE_RC4_IV60();
  2272. skype_rc4_iv15 (key, key[17]);
  2273. }
  2274. key[0] ^= u32root (key[15]);
  2275. key[14] = rotr32 (key[14], u32cos(key[15]) ? 8 : key[1]);
  2276. if (k == 0)
  2277. {
  2278. SKYPE_RC4_IV56();
  2279. SKYPE_RC4_IV50();
  2280. skype_rc4_iv16 (key, key[9]);
  2281. }
  2282. key[10] -= u32cos(key[13]) ? 0xF83DD71A : key[10];
  2283. return iv;
  2284. }
  2285.  
  2286. u32 skype_rc4_iv18 (u32 * const key, u32 iv)
  2287. {
  2288. u32 k = key[14] % 7;
  2289.  
  2290. iv -= 31 * key[6];
  2291. if (k == 5)
  2292. {
  2293. SKYPE_RC4_IV6();
  2294. SKYPE_RC4_IV7n (0x3DB5CDC8);
  2295. SKYPE_RC4_IV71n (key[0]);
  2296. }
  2297. key[14] ^= key[15] - 0x274BB11;
  2298. if (k == 4)
  2299. {
  2300. SKYPE_RC4_IV11();
  2301. SKYPE_RC4_IV13();
  2302. SKYPE_RC4_IV72n (key[12]);
  2303. }
  2304. iv ^= 8 * key[1];
  2305. if (k == 2)
  2306. {
  2307. SKYPE_RC4_IV47n (0x1D06A87F);
  2308. SKYPE_RC4_IV48();
  2309. skype_rc4_iv13 (key, key[13]);
  2310. }
  2311. key[16] = rotl32 (key[16], u32root (key[15]));
  2312. key[19] *= u32root (key[10]);
  2313. if (k == 3)
  2314. {
  2315. SKYPE_RC4_IV5();
  2316. SKYPE_RC4_IV32();
  2317. skype_rc4_iv14 (key, key[4]);
  2318. }
  2319. iv += key[16] | 0x1DF5D7AD;
  2320. if (k == 0)
  2321. {
  2322. SKYPE_RC4_IV35();
  2323. SKYPE_RC4_IV12();
  2324. skype_rc4_iv15 (key, key[4]);
  2325. }
  2326. iv *= key[2] + 0xC70282A8;
  2327. if (k == 0)
  2328. {
  2329. SKYPE_RC4_IV5();
  2330. SKYPE_RC4_IV54();
  2331. skype_rc4_iv16 (key, key[9]);
  2332. }
  2333. key[6] &= iv - 0x9798A83;
  2334. iv = rotr32 (iv, 2 * key[11]);
  2335. if (k == 1)
  2336. {
  2337. SKYPE_RC4_IV45();
  2338. SKYPE_RC4_IV17();
  2339. skype_rc4_iv17 (key, key[7]);
  2340. }
  2341. key[2] ^= (key[9] < 0x2EEDED9) ? key[9] : key[12];
  2342. return iv;
  2343. }
  2344.  
  2345. u32 skype_rc4_iv19 (u32 * const key, u32 iv)
  2346. {
  2347. u32 k = (key[13] ^ iv ^ key[4]) & 7;
  2348.  
  2349. key[16] *= key[15];
  2350. if (k == 0)
  2351. {
  2352. SKYPE_RC4_IV27();
  2353. SKYPE_RC4_IV40();
  2354. SKYPE_RC4_IV71n (iv);
  2355. }
  2356. key[14] = rotr32 (key[14], 87 * key[11]);
  2357. if (k == 2)
  2358. {
  2359. SKYPE_RC4_IV12();
  2360. SKYPE_RC4_IV68n (0x73492C37);
  2361. SKYPE_RC4_IV72n (key[16]);
  2362. }
  2363. iv &= iv ^ 0xBFEECFFE;
  2364. if (k == 6)
  2365. {
  2366. SKYPE_RC4_IV13();
  2367. SKYPE_RC4_IV68n (0x7FE25F6B);
  2368. skype_rc4_iv13 (key, key[7]);
  2369. }
  2370. iv += u32cos(iv) ? 0xD68DC95 : key[5];
  2371. key[2] ^= u32sin(key[7]) ? 0x2124BD5 : iv;
  2372. if (k == 4)
  2373. {
  2374. SKYPE_RC4_IV21();
  2375. SKYPE_RC4_IV26();
  2376. skype_rc4_iv14 (key, key[5]);
  2377. }
  2378. key[2] ^= (iv < 0xA427B60) ? iv : key[19];
  2379. if (k == 0)
  2380. {
  2381. SKYPE_RC4_IV1();
  2382. SKYPE_RC4_IV66();
  2383. skype_rc4_iv15 (key, iv);
  2384. }
  2385. key[12] -= u32root (iv);
  2386. if (k == 1)
  2387. {
  2388. SKYPE_RC4_IV48();
  2389. SKYPE_RC4_IV65();
  2390. skype_rc4_iv16 (key, key[15]);
  2391. }
  2392. key[16] -= 0x61A83016 | key[4];
  2393. if (k == 3)
  2394. {
  2395. SKYPE_RC4_IV1();
  2396. SKYPE_RC4_IV48();
  2397. skype_rc4_iv17 (key, iv);
  2398. }
  2399. iv *= u32root (iv);
  2400. key[13] *= 0x59F1E662 + key[16];
  2401. if (k == 7)
  2402. {
  2403. SKYPE_RC4_IV26();
  2404. SKYPE_RC4_IV15();
  2405. skype_rc4_iv18 (key, key[19]);
  2406. }
  2407. key[3] ^= 0x699B23 * key[12];
  2408. return iv;
  2409. }
  2410.  
  2411. u32 skype_rc4_iv20 (u32 * const key, u32 iv)
  2412. {
  2413. u32 k = (iv ^ key[7] ^ key[12]) % 9;
  2414.  
  2415. iv = rotr32 (iv, u32root (iv));
  2416. if (k == 8)
  2417. {
  2418. SKYPE_RC4_IV46();
  2419. SKYPE_RC4_IV29n (0x141586A);
  2420. SKYPE_RC4_IV71n (key[15]);
  2421. }
  2422. key[4] += 15 * key[16];
  2423. if (k == 0)
  2424. {
  2425. SKYPE_RC4_IV16n (0x1CB835FD);
  2426. SKYPE_RC4_IV63n (0x835400E0);
  2427. SKYPE_RC4_IV72n (key[16]);
  2428. }
  2429. key[10] ^= rotr32 (key[15], 30);
  2430. if (k == 1)
  2431. {
  2432. SKYPE_RC4_IV13();
  2433. SKYPE_RC4_IV42();
  2434. skype_rc4_iv13 (key, iv);
  2435. }
  2436. key[7] -= u32sin(iv) ? 0x0D93E92C : key[16];
  2437. if (k == 2)
  2438. {
  2439. SKYPE_RC4_IV68n (0x66E0FF5C);
  2440. SKYPE_RC4_IV59();
  2441. skype_rc4_iv14 (key, key[17]);
  2442. }
  2443. key[6] *= rotr32 (key[10], 7);
  2444. if (k == 6)
  2445. {
  2446. SKYPE_RC4_IV15();
  2447. SKYPE_RC4_IV55();
  2448. skype_rc4_iv15 (key, key[14]);
  2449. }
  2450. iv -= 90 * key[16];
  2451. if (k == 4)
  2452. {
  2453. SKYPE_RC4_IV6();
  2454. SKYPE_RC4_IV39n (0x7C7D7E42);
  2455. skype_rc4_iv16 (key, key[4]);
  2456. }
  2457. key[3] -= key[16] & 0xEFF9DB02;
  2458. if (k == 0)
  2459. {
  2460. SKYPE_RC4_IV15();
  2461. SKYPE_RC4_IV66();
  2462. skype_rc4_iv17 (key, key[13]);
  2463. }
  2464. iv += u32cos(key[19]) ? 0x39AEBDF : key[5];
  2465. if (k == 7)
  2466. {
  2467. SKYPE_RC4_IV64();
  2468. SKYPE_RC4_IV59();
  2469. skype_rc4_iv18 (key, key[6]);
  2470. }
  2471. key[13] |= u32root (key[10]);
  2472. if (k == 5)
  2473. {
  2474. SKYPE_RC4_IV25();
  2475. SKYPE_RC4_IV68n (0x54AE62D0);
  2476. skype_rc4_iv19 (key, key[14]);
  2477. }
  2478. iv = rotl32 (iv, 26 * iv);
  2479. key[14] -= u32sin(key[1]) ? 0xB95DC2D3 : key[18];
  2480. return iv;
  2481. }
  2482.  
  2483. u32 skype_rc4_iv21 (u32 * const key, u32 iv)
  2484. {
  2485. u32 k = (key[17] ^ key[16] ^ key[7]) % 10;
  2486.  
  2487. key[15] -= 13 * key[7];
  2488. if (k == 2)
  2489. {
  2490. SKYPE_RC4_IV28();
  2491. SKYPE_RC4_IV54();
  2492. SKYPE_RC4_IV71n (key[14]);
  2493. }
  2494. key[7] += key[5] ^ 0x28CA4358;
  2495. if (k == 1)
  2496. {
  2497. SKYPE_RC4_IV17();
  2498. SKYPE_RC4_IV30n (0xC14393E2);
  2499. SKYPE_RC4_IV72n (key[10]);
  2500. }
  2501. key[10] += iv & 0xE9F1006;
  2502. if (k == 9)
  2503. {
  2504. SKYPE_RC4_IV67n (0x3C50D16);
  2505. SKYPE_RC4_IV2();
  2506. skype_rc4_iv13 (key, iv);
  2507. }
  2508. key[19] *= (key[0] < 0xB71D9592) ? key[0] : key[14];
  2509. if (k == 5)
  2510. {
  2511. SKYPE_RC4_IV16n (0x6481D348);
  2512. SKYPE_RC4_IV54();
  2513. skype_rc4_iv14 (key, iv);
  2514. }
  2515. key[16] += 0x7C476077 - key[0];
  2516. if (k == 4)
  2517. {
  2518. SKYPE_RC4_IV70();
  2519. SKYPE_RC4_IV35();
  2520. skype_rc4_iv15 (key, key[10]);
  2521. }
  2522. iv ^= key[10] << 6;
  2523. if (k == 0)
  2524. {
  2525. SKYPE_RC4_IV25();
  2526. SKYPE_RC4_IV42();
  2527. skype_rc4_iv16 (key, key[4]);
  2528. }
  2529. key[3] += u32sin(key[12]) ? 0x7B0CA6E0 : iv;
  2530. if (k == 6)
  2531. {
  2532. SKYPE_RC4_IV61n (0xFCD29227);
  2533. SKYPE_RC4_IV47n (0x3FFF3F1E);
  2534. skype_rc4_iv17 (key, key[2]);
  2535. }
  2536. iv |= 0x2FF561CA * iv;
  2537. if (k == 8)
  2538. {
  2539. SKYPE_RC4_IV62n (0x5BCC4FBE);
  2540. SKYPE_RC4_IV47n (0x8328D41F);
  2541. skype_rc4_iv18 (key, key[3]);
  2542. }
  2543. key[14] += rotr32 (key[0], 26);
  2544. if (k == 3)
  2545. {
  2546. SKYPE_RC4_IV68n (0x7F1F0A41);
  2547. SKYPE_RC4_IV37();
  2548. skype_rc4_iv19 (key, iv);
  2549. }
  2550. key[14] -= (key[6] < 0x2C23ABF1) ? key[6] : key[19];
  2551. if (k == 7)
  2552. {
  2553. SKYPE_RC4_IV63n (0x3C12C053);
  2554. SKYPE_RC4_IV7n (0x302EE99C);
  2555. skype_rc4_iv20 (key, key[17]);
  2556. }
  2557. key[4] &= 14 * key[11];
  2558. return iv;
  2559. }
  2560.  
  2561. u32 skype_rc4_iv22 (u32 * const key, u32 iv)
  2562. {
  2563. u32 k = (iv ^ key[2] ^ key[6]) % 11;
  2564.  
  2565. key[17] = rotr32 (key[17], iv - 7);
  2566. if (k == 8)
  2567. {
  2568. SKYPE_RC4_IV39n (0x74FA76D5);
  2569. SKYPE_RC4_IV62n (0x6D3C052C);
  2570. SKYPE_RC4_IV71n (key[19]);
  2571. }
  2572. key[16] -= 0xF9263500 & key[8];
  2573. if (k == 0)
  2574. {
  2575. SKYPE_RC4_IV66();
  2576. SKYPE_RC4_IV55();
  2577. SKYPE_RC4_IV72n (key[14]);
  2578. }
  2579. iv += (key[9] ^ 0x32C5F54);
  2580. if (k == 1)
  2581. {
  2582. SKYPE_RC4_IV47n (0x187AA563);
  2583. SKYPE_RC4_IV44();
  2584. skype_rc4_iv13 (key, iv);
  2585. }
  2586. key[15] += (key[4] < 0x763BB14) ? key[4] : iv;
  2587. if (k == 6)
  2588. {
  2589. SKYPE_RC4_IV28();
  2590. SKYPE_RC4_IV63n (0x290286CE);
  2591. skype_rc4_iv14 (key, key[18]);
  2592. }
  2593. key[4] += key[11] + 0x1B2FADB0;
  2594. if (k == 10)
  2595. {
  2596. SKYPE_RC4_IV37();
  2597. SKYPE_RC4_IV26();
  2598. skype_rc4_iv15 (key, key[14]);
  2599. }
  2600. iv &= key[3] & 0x4E081541;
  2601. if (k == 9)
  2602. {
  2603. SKYPE_RC4_IV55();
  2604. SKYPE_RC4_IV3n (0xD89C09D3);
  2605. skype_rc4_iv16 (key, key[14]);
  2606. }
  2607. key[18] ^= (iv < 0x22E75CE0) ? iv : key[3];
  2608. if (k == 4)
  2609. {
  2610. SKYPE_RC4_IV32();
  2611. SKYPE_RC4_IV20n (0x682AB283);
  2612. skype_rc4_iv17 (key, iv);
  2613. }
  2614. iv |= rotl32 (key[14], 102);
  2615. if (k == 3)
  2616. {
  2617. SKYPE_RC4_IV41();
  2618. SKYPE_RC4_IV12();
  2619. skype_rc4_iv18 (key, iv);
  2620. }
  2621. key[3] += rotr32 (iv, 19);
  2622. if (k == 2)
  2623. {
  2624. SKYPE_RC4_IV65();
  2625. SKYPE_RC4_IV7n (0x33822AB7);
  2626. skype_rc4_iv19 (key, iv);
  2627. }
  2628. key[9] ^= 52 * key[7];
  2629. if (k == 5)
  2630. {
  2631. SKYPE_RC4_IV35();
  2632. SKYPE_RC4_IV16n (0xD0D19C61);
  2633. skype_rc4_iv20 (key, key[1]);
  2634. }
  2635. iv *= 0xB1DB36B2 * key[0];
  2636. if (k == 0)
  2637. {
  2638. SKYPE_RC4_IV19();
  2639. SKYPE_RC4_IV58n (0xCE82C1C);
  2640. skype_rc4_iv21 (key, key[17]);
  2641. }
  2642. key[10] *= (key[17] < 0xD066ADA) ? key[17] : iv;
  2643. return iv;
  2644. }
  2645.  
  2646. u32 skype_rc4_iv23 (u32 * const key, u32 iv)
  2647. {
  2648. u32 k = (key[6] ^ iv ^ key[5]) % 12;
  2649.  
  2650. if (k == 2)
  2651. {
  2652. SKYPE_RC4_IV43();
  2653. SKYPE_RC4_IV19();
  2654. SKYPE_RC4_IV71n (key[11]);
  2655. }
  2656. key[17] = rotl32 (key[17], key[5] - 0x2E74D55C);
  2657. if (k == 9)
  2658. {
  2659. SKYPE_RC4_IV49n (0x5A1FF296);
  2660. SKYPE_RC4_IV29n (0x0EC7C0E9);
  2661. SKYPE_RC4_IV72n (key[10]);
  2662. }
  2663. iv = rotl32 (iv, 0x3FCB120B + key[2]);
  2664. if (k == 11)
  2665. {
  2666. SKYPE_RC4_IV61n (0xAF5BAF57);
  2667. SKYPE_RC4_IV14();
  2668. skype_rc4_iv13 (key, iv);
  2669. }
  2670. key[14] |= 0x3FC983D0 + iv;
  2671. if (k == 8)
  2672. {
  2673. SKYPE_RC4_IV62n (0x59806A89);
  2674. SKYPE_RC4_IV38();
  2675. skype_rc4_iv14 (key, key[2]);
  2676. }
  2677. if (k == 10)
  2678. {
  2679. SKYPE_RC4_IV23();
  2680. SKYPE_RC4_IV6();
  2681. skype_rc4_iv15 (key, key[2]);
  2682. }
  2683. key[10] = rotl32 (key[10], u32cos(key[11]) ? 0x3FC983D0 : key[11]);
  2684. if (k == 0)
  2685. {
  2686. SKYPE_RC4_IV62n (0x50F929B8);
  2687. SKYPE_RC4_IV70();
  2688. skype_rc4_iv16 (key, iv);
  2689. }
  2690. key[0] += key[2] + 0x56775D25;
  2691. if (k == 6)
  2692. {
  2693. SKYPE_RC4_IV52n (7);
  2694. SKYPE_RC4_IV41();
  2695. skype_rc4_iv17 (key, iv);
  2696. }
  2697. iv |= 123 * key[9];
  2698. if (k == 1)
  2699. {
  2700. SKYPE_RC4_IV4();
  2701. SKYPE_RC4_IV24();
  2702. skype_rc4_iv18 (key, key[6]);
  2703. }
  2704. if (k == 5)
  2705. {
  2706. SKYPE_RC4_IV3n (0x693CB362);
  2707. SKYPE_RC4_IV38();
  2708. skype_rc4_iv19 (key, key[0]);
  2709. }
  2710. key[8] = rotr32 (key[8], (iv < 0x48821AB) ? iv : key[8]);
  2711. if (k == 0)
  2712. {
  2713. SKYPE_RC4_IV43();
  2714. SKYPE_RC4_IV62n (0x56278C42);
  2715. skype_rc4_iv20 (key, key[10]);
  2716. }
  2717. key[12] ^= 48 * key[18];
  2718. if (k == 3)
  2719. {
  2720. SKYPE_RC4_IV59();
  2721. SKYPE_RC4_IV16n (0xD061FA2F);
  2722. skype_rc4_iv21 (key, key[17]);
  2723. }
  2724. key[18] |= 58 * key[4];
  2725. if (k == 7)
  2726. {
  2727. SKYPE_RC4_IV4();
  2728. SKYPE_RC4_IV70();
  2729. skype_rc4_iv22 (key, key[5]);
  2730. }
  2731. if (k == 4)
  2732. {
  2733. SKYPE_RC4_IV21();
  2734. SKYPE_RC4_IV56();
  2735. SKYPE_RC4_IV71n (key[4]);
  2736. }
  2737. key[5] ^= u32cos(key[8]) ? 0x16925B88 : key[8];
  2738. return iv;
  2739. }
  2740.  
  2741. u32 skype_rc4_iv24 (u32 * const key, u32 iv)
  2742. {
  2743. u32 k = (iv ^ key[8] ^ key[11]) % 13;
  2744.  
  2745. if (k == 7)
  2746. {
  2747. SKYPE_RC4_IV12();
  2748. SKYPE_RC4_IV63n (0x3EB1A4B6);
  2749. SKYPE_RC4_IV72n (iv);
  2750. }
  2751. key[2] += u32sin(key[16]) ? 0xBE51568 : key[17];
  2752. if (k == 0)
  2753. {
  2754. SKYPE_RC4_IV31();
  2755. SKYPE_RC4_IV1();
  2756. skype_rc4_iv13 (key, key[0]);
  2757. }
  2758. iv -= (key[15] < 0x214D38C3) ? key[15] : key[14];
  2759. if (k == 6)
  2760. {
  2761. SKYPE_RC4_IV18n (0xE50F49F3);
  2762. SKYPE_RC4_IV19();
  2763. skype_rc4_iv14 (key, key[9]);
  2764. }
  2765. iv += 0x20F1E8E5 - key[17];
  2766. if (k == 1)
  2767. {
  2768. SKYPE_RC4_IV55();
  2769. SKYPE_RC4_IV16n (0x91B25DAB);
  2770. skype_rc4_iv15 (key, key[19]);
  2771. }
  2772. iv *= 113;
  2773. if (k == 5)
  2774. {
  2775. SKYPE_RC4_IV19();
  2776. SKYPE_RC4_IV40();
  2777. skype_rc4_iv16 (key, key[5]);
  2778. }
  2779. key[4] |= iv - 0x0D896A46;
  2780. if (k == 11)
  2781. {
  2782. SKYPE_RC4_IV63n (0x291937D1);
  2783. SKYPE_RC4_IV70();
  2784. skype_rc4_iv17 (key, key[2]);
  2785. }
  2786. if (k == 10)
  2787. {
  2788. SKYPE_RC4_IV34();
  2789. SKYPE_RC4_IV3n (0x2DE98C73);
  2790. skype_rc4_iv18 (key, key[16]);
  2791. }
  2792. key[19] = rotl32 (key[19], u32cos(key[4]) ? 0x0D896A46 : key[4]);
  2793. if (k == 12)
  2794. {
  2795. SKYPE_RC4_IV26();
  2796. SKYPE_RC4_IV49n (0x054BD742);
  2797. skype_rc4_iv19 (key, key[9]);
  2798. }
  2799. key[5] = rotr32 (key[5], 9 * key[15]);
  2800. if (k == 0)
  2801. {
  2802. SKYPE_RC4_IV2();
  2803. SKYPE_RC4_IV62n (0x57B2250F);
  2804. skype_rc4_iv20 (key, key[12]);
  2805. }
  2806. iv = rotl32 (iv, key[14] + 8);
  2807. if (k == 4)
  2808. {
  2809. SKYPE_RC4_IV44();
  2810. SKYPE_RC4_IV48();
  2811. skype_rc4_iv21 (key, key[1]);
  2812. }
  2813. key[10] ^= key[12] ^ 0x17E47765;
  2814. if (k == 3)
  2815. {
  2816. SKYPE_RC4_IV25();
  2817. SKYPE_RC4_IV37();
  2818. skype_rc4_iv22 (key, iv);
  2819. }
  2820. key[1] ^= 58 * iv;
  2821. if (k == 2)
  2822. {
  2823. SKYPE_RC4_IV50();
  2824. SKYPE_RC4_IV17();
  2825. skype_rc4_iv23 (key, key[16]);
  2826. }
  2827. iv *= 77 * iv;
  2828. if (k == 8)
  2829. {
  2830. SKYPE_RC4_IV45();
  2831. SKYPE_RC4_IV17();
  2832. SKYPE_RC4_IV72n (iv);
  2833. }
  2834. if (k == 9)
  2835. {
  2836. SKYPE_RC4_IV41();
  2837. SKYPE_RC4_IV39n (0x3ED322E1);
  2838. skype_rc4_iv13 (key, key[0]);
  2839. }
  2840. key[3] = rotr32 (key[3], iv * 0xA588A375);
  2841. return iv;
  2842. }
  2843.  
  2844. #define RC4_round(i,j,t,k,RC4) ((t)=RC4[i],(j)=((j)+(t)+(k))&0xFF,RC4[i]=RC4[j],RC4[j]=(u8)(t),RC4[(RC4[i]+(t))&0xFF])
  2845.  
  2846. void RC4_crypt (u8 * buffer, u32 bytes, RC4_context * const rc4, const u32 test)
  2847. {
  2848. u8 t, i = rc4->i, j = rc4->j, z[256], *s;
  2849.  
  2850. if (test) memcpy (s = z, rc4->s, 256); else s = rc4->s;
  2851. for (; bytes; bytes--) i++, *buffer++ ^= RC4_round (i, j, t, 0, s);
  2852. if (!test) rc4->i = i, rc4->j = j;
  2853. }
  2854.  
  2855. void Skype_RC4_Expand_IV (const u32 iv, const void *iv2, RC4_context * const rc4, const u32 flags, const u32 iv2_bytes)
  2856. {
  2857. u32 i, j, key[20];
  2858. u8 t;
  2859.  
  2860. for (i = 0; i < 20; i++) key[i] = iv;
  2861.  
  2862. if (!flags || (flags & 1)) skype_rc4_iva (key, iv);
  2863. // if (flags & 2) skype_rc4_ivb (key, iv); // not included here as it is not in use
  2864. for (i = 0, j = __min (iv2_bytes,80); i < j; i+=4) dword(key,i) ^= dword(iv2,i);
  2865. for (; i < j; i++) byte(key,i) ^= byte(iv2,i);
  2866. // now the standard RC4 init
  2867. for (i = 0, j = 0x03020100; i < 256; i += 4, j += 0x04040404) dword(rc4->s,i) = j;
  2868. for (i = 0, j = 0; i < 256; i++) RC4_round (i, j, t, byte(key,i%80), rc4->s);
  2869. rc4->i = 0, rc4->j = 0;
  2870. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement