unrolled.py 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. """passlib.crypto._blowfish.unrolled - unrolled loop implementation of bcrypt,
  2. autogenerated by _gen_files.py
  3. currently this override the encipher() and expand() methods
  4. with optimized versions, and leaves the other base.py methods alone.
  5. """
  6. #=============================================================================
  7. # imports
  8. #=============================================================================
  9. # pkg
  10. from passlib.crypto._blowfish.base import BlowfishEngine as _BlowfishEngine
  11. # local
  12. __all__ = [
  13. "BlowfishEngine",
  14. ]
  15. #=============================================================================
  16. #
  17. #=============================================================================
  18. class BlowfishEngine(_BlowfishEngine):
  19. def encipher(self, l, r):
  20. """blowfish encipher a single 64-bit block encoded as two 32-bit ints"""
  21. (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
  22. p10, p11, p12, p13, p14, p15, p16, p17) = self.P
  23. S0, S1, S2, S3 = self.S
  24. l ^= p0
  25. # Feistel substitution on left word (round 0)
  26. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  27. S3[l & 0xff]) & 0xffffffff) ^ p1
  28. # Feistel substitution on right word (round 1)
  29. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  30. S3[r & 0xff]) & 0xffffffff) ^ p2
  31. # Feistel substitution on left word (round 2)
  32. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  33. S3[l & 0xff]) & 0xffffffff) ^ p3
  34. # Feistel substitution on right word (round 3)
  35. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  36. S3[r & 0xff]) & 0xffffffff) ^ p4
  37. # Feistel substitution on left word (round 4)
  38. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  39. S3[l & 0xff]) & 0xffffffff) ^ p5
  40. # Feistel substitution on right word (round 5)
  41. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  42. S3[r & 0xff]) & 0xffffffff) ^ p6
  43. # Feistel substitution on left word (round 6)
  44. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  45. S3[l & 0xff]) & 0xffffffff) ^ p7
  46. # Feistel substitution on right word (round 7)
  47. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  48. S3[r & 0xff]) & 0xffffffff) ^ p8
  49. # Feistel substitution on left word (round 8)
  50. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  51. S3[l & 0xff]) & 0xffffffff) ^ p9
  52. # Feistel substitution on right word (round 9)
  53. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  54. S3[r & 0xff]) & 0xffffffff) ^ p10
  55. # Feistel substitution on left word (round 10)
  56. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  57. S3[l & 0xff]) & 0xffffffff) ^ p11
  58. # Feistel substitution on right word (round 11)
  59. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  60. S3[r & 0xff]) & 0xffffffff) ^ p12
  61. # Feistel substitution on left word (round 12)
  62. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  63. S3[l & 0xff]) & 0xffffffff) ^ p13
  64. # Feistel substitution on right word (round 13)
  65. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  66. S3[r & 0xff]) & 0xffffffff) ^ p14
  67. # Feistel substitution on left word (round 14)
  68. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  69. S3[l & 0xff]) & 0xffffffff) ^ p15
  70. # Feistel substitution on right word (round 15)
  71. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  72. S3[r & 0xff]) & 0xffffffff) ^ p16
  73. return r ^ p17, l
  74. def expand(self, key_words):
  75. """unrolled version of blowfish key expansion"""
  76. ##assert len(key_words) >= 18, "size of key_words must be >= 18"
  77. P, S = self.P, self.S
  78. S0, S1, S2, S3 = S
  79. #=============================================================
  80. # integrate key
  81. #=============================================================
  82. p0 = P[0] ^ key_words[0]
  83. p1 = P[1] ^ key_words[1]
  84. p2 = P[2] ^ key_words[2]
  85. p3 = P[3] ^ key_words[3]
  86. p4 = P[4] ^ key_words[4]
  87. p5 = P[5] ^ key_words[5]
  88. p6 = P[6] ^ key_words[6]
  89. p7 = P[7] ^ key_words[7]
  90. p8 = P[8] ^ key_words[8]
  91. p9 = P[9] ^ key_words[9]
  92. p10 = P[10] ^ key_words[10]
  93. p11 = P[11] ^ key_words[11]
  94. p12 = P[12] ^ key_words[12]
  95. p13 = P[13] ^ key_words[13]
  96. p14 = P[14] ^ key_words[14]
  97. p15 = P[15] ^ key_words[15]
  98. p16 = P[16] ^ key_words[16]
  99. p17 = P[17] ^ key_words[17]
  100. #=============================================================
  101. # update P
  102. #=============================================================
  103. #------------------------------------------------
  104. # update P[0] and P[1]
  105. #------------------------------------------------
  106. l, r = p0, 0
  107. # Feistel substitution on left word (round 0)
  108. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  109. S3[l & 0xff]) & 0xffffffff) ^ p1
  110. # Feistel substitution on right word (round 1)
  111. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  112. S3[r & 0xff]) & 0xffffffff) ^ p2
  113. # Feistel substitution on left word (round 2)
  114. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  115. S3[l & 0xff]) & 0xffffffff) ^ p3
  116. # Feistel substitution on right word (round 3)
  117. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  118. S3[r & 0xff]) & 0xffffffff) ^ p4
  119. # Feistel substitution on left word (round 4)
  120. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  121. S3[l & 0xff]) & 0xffffffff) ^ p5
  122. # Feistel substitution on right word (round 5)
  123. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  124. S3[r & 0xff]) & 0xffffffff) ^ p6
  125. # Feistel substitution on left word (round 6)
  126. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  127. S3[l & 0xff]) & 0xffffffff) ^ p7
  128. # Feistel substitution on right word (round 7)
  129. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  130. S3[r & 0xff]) & 0xffffffff) ^ p8
  131. # Feistel substitution on left word (round 8)
  132. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  133. S3[l & 0xff]) & 0xffffffff) ^ p9
  134. # Feistel substitution on right word (round 9)
  135. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  136. S3[r & 0xff]) & 0xffffffff) ^ p10
  137. # Feistel substitution on left word (round 10)
  138. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  139. S3[l & 0xff]) & 0xffffffff) ^ p11
  140. # Feistel substitution on right word (round 11)
  141. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  142. S3[r & 0xff]) & 0xffffffff) ^ p12
  143. # Feistel substitution on left word (round 12)
  144. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  145. S3[l & 0xff]) & 0xffffffff) ^ p13
  146. # Feistel substitution on right word (round 13)
  147. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  148. S3[r & 0xff]) & 0xffffffff) ^ p14
  149. # Feistel substitution on left word (round 14)
  150. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  151. S3[l & 0xff]) & 0xffffffff) ^ p15
  152. # Feistel substitution on right word (round 15)
  153. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  154. S3[r & 0xff]) & 0xffffffff) ^ p16
  155. p0, p1 = l, r = r ^ p17, l
  156. #------------------------------------------------
  157. # update P[2] and P[3]
  158. #------------------------------------------------
  159. l ^= p0
  160. # Feistel substitution on left word (round 0)
  161. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  162. S3[l & 0xff]) & 0xffffffff) ^ p1
  163. # Feistel substitution on right word (round 1)
  164. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  165. S3[r & 0xff]) & 0xffffffff) ^ p2
  166. # Feistel substitution on left word (round 2)
  167. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  168. S3[l & 0xff]) & 0xffffffff) ^ p3
  169. # Feistel substitution on right word (round 3)
  170. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  171. S3[r & 0xff]) & 0xffffffff) ^ p4
  172. # Feistel substitution on left word (round 4)
  173. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  174. S3[l & 0xff]) & 0xffffffff) ^ p5
  175. # Feistel substitution on right word (round 5)
  176. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  177. S3[r & 0xff]) & 0xffffffff) ^ p6
  178. # Feistel substitution on left word (round 6)
  179. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  180. S3[l & 0xff]) & 0xffffffff) ^ p7
  181. # Feistel substitution on right word (round 7)
  182. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  183. S3[r & 0xff]) & 0xffffffff) ^ p8
  184. # Feistel substitution on left word (round 8)
  185. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  186. S3[l & 0xff]) & 0xffffffff) ^ p9
  187. # Feistel substitution on right word (round 9)
  188. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  189. S3[r & 0xff]) & 0xffffffff) ^ p10
  190. # Feistel substitution on left word (round 10)
  191. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  192. S3[l & 0xff]) & 0xffffffff) ^ p11
  193. # Feistel substitution on right word (round 11)
  194. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  195. S3[r & 0xff]) & 0xffffffff) ^ p12
  196. # Feistel substitution on left word (round 12)
  197. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  198. S3[l & 0xff]) & 0xffffffff) ^ p13
  199. # Feistel substitution on right word (round 13)
  200. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  201. S3[r & 0xff]) & 0xffffffff) ^ p14
  202. # Feistel substitution on left word (round 14)
  203. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  204. S3[l & 0xff]) & 0xffffffff) ^ p15
  205. # Feistel substitution on right word (round 15)
  206. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  207. S3[r & 0xff]) & 0xffffffff) ^ p16
  208. p2, p3 = l, r = r ^ p17, l
  209. #------------------------------------------------
  210. # update P[4] and P[5]
  211. #------------------------------------------------
  212. l ^= p0
  213. # Feistel substitution on left word (round 0)
  214. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  215. S3[l & 0xff]) & 0xffffffff) ^ p1
  216. # Feistel substitution on right word (round 1)
  217. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  218. S3[r & 0xff]) & 0xffffffff) ^ p2
  219. # Feistel substitution on left word (round 2)
  220. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  221. S3[l & 0xff]) & 0xffffffff) ^ p3
  222. # Feistel substitution on right word (round 3)
  223. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  224. S3[r & 0xff]) & 0xffffffff) ^ p4
  225. # Feistel substitution on left word (round 4)
  226. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  227. S3[l & 0xff]) & 0xffffffff) ^ p5
  228. # Feistel substitution on right word (round 5)
  229. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  230. S3[r & 0xff]) & 0xffffffff) ^ p6
  231. # Feistel substitution on left word (round 6)
  232. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  233. S3[l & 0xff]) & 0xffffffff) ^ p7
  234. # Feistel substitution on right word (round 7)
  235. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  236. S3[r & 0xff]) & 0xffffffff) ^ p8
  237. # Feistel substitution on left word (round 8)
  238. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  239. S3[l & 0xff]) & 0xffffffff) ^ p9
  240. # Feistel substitution on right word (round 9)
  241. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  242. S3[r & 0xff]) & 0xffffffff) ^ p10
  243. # Feistel substitution on left word (round 10)
  244. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  245. S3[l & 0xff]) & 0xffffffff) ^ p11
  246. # Feistel substitution on right word (round 11)
  247. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  248. S3[r & 0xff]) & 0xffffffff) ^ p12
  249. # Feistel substitution on left word (round 12)
  250. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  251. S3[l & 0xff]) & 0xffffffff) ^ p13
  252. # Feistel substitution on right word (round 13)
  253. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  254. S3[r & 0xff]) & 0xffffffff) ^ p14
  255. # Feistel substitution on left word (round 14)
  256. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  257. S3[l & 0xff]) & 0xffffffff) ^ p15
  258. # Feistel substitution on right word (round 15)
  259. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  260. S3[r & 0xff]) & 0xffffffff) ^ p16
  261. p4, p5 = l, r = r ^ p17, l
  262. #------------------------------------------------
  263. # update P[6] and P[7]
  264. #------------------------------------------------
  265. l ^= p0
  266. # Feistel substitution on left word (round 0)
  267. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  268. S3[l & 0xff]) & 0xffffffff) ^ p1
  269. # Feistel substitution on right word (round 1)
  270. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  271. S3[r & 0xff]) & 0xffffffff) ^ p2
  272. # Feistel substitution on left word (round 2)
  273. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  274. S3[l & 0xff]) & 0xffffffff) ^ p3
  275. # Feistel substitution on right word (round 3)
  276. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  277. S3[r & 0xff]) & 0xffffffff) ^ p4
  278. # Feistel substitution on left word (round 4)
  279. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  280. S3[l & 0xff]) & 0xffffffff) ^ p5
  281. # Feistel substitution on right word (round 5)
  282. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  283. S3[r & 0xff]) & 0xffffffff) ^ p6
  284. # Feistel substitution on left word (round 6)
  285. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  286. S3[l & 0xff]) & 0xffffffff) ^ p7
  287. # Feistel substitution on right word (round 7)
  288. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  289. S3[r & 0xff]) & 0xffffffff) ^ p8
  290. # Feistel substitution on left word (round 8)
  291. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  292. S3[l & 0xff]) & 0xffffffff) ^ p9
  293. # Feistel substitution on right word (round 9)
  294. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  295. S3[r & 0xff]) & 0xffffffff) ^ p10
  296. # Feistel substitution on left word (round 10)
  297. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  298. S3[l & 0xff]) & 0xffffffff) ^ p11
  299. # Feistel substitution on right word (round 11)
  300. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  301. S3[r & 0xff]) & 0xffffffff) ^ p12
  302. # Feistel substitution on left word (round 12)
  303. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  304. S3[l & 0xff]) & 0xffffffff) ^ p13
  305. # Feistel substitution on right word (round 13)
  306. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  307. S3[r & 0xff]) & 0xffffffff) ^ p14
  308. # Feistel substitution on left word (round 14)
  309. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  310. S3[l & 0xff]) & 0xffffffff) ^ p15
  311. # Feistel substitution on right word (round 15)
  312. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  313. S3[r & 0xff]) & 0xffffffff) ^ p16
  314. p6, p7 = l, r = r ^ p17, l
  315. #------------------------------------------------
  316. # update P[8] and P[9]
  317. #------------------------------------------------
  318. l ^= p0
  319. # Feistel substitution on left word (round 0)
  320. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  321. S3[l & 0xff]) & 0xffffffff) ^ p1
  322. # Feistel substitution on right word (round 1)
  323. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  324. S3[r & 0xff]) & 0xffffffff) ^ p2
  325. # Feistel substitution on left word (round 2)
  326. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  327. S3[l & 0xff]) & 0xffffffff) ^ p3
  328. # Feistel substitution on right word (round 3)
  329. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  330. S3[r & 0xff]) & 0xffffffff) ^ p4
  331. # Feistel substitution on left word (round 4)
  332. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  333. S3[l & 0xff]) & 0xffffffff) ^ p5
  334. # Feistel substitution on right word (round 5)
  335. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  336. S3[r & 0xff]) & 0xffffffff) ^ p6
  337. # Feistel substitution on left word (round 6)
  338. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  339. S3[l & 0xff]) & 0xffffffff) ^ p7
  340. # Feistel substitution on right word (round 7)
  341. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  342. S3[r & 0xff]) & 0xffffffff) ^ p8
  343. # Feistel substitution on left word (round 8)
  344. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  345. S3[l & 0xff]) & 0xffffffff) ^ p9
  346. # Feistel substitution on right word (round 9)
  347. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  348. S3[r & 0xff]) & 0xffffffff) ^ p10
  349. # Feistel substitution on left word (round 10)
  350. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  351. S3[l & 0xff]) & 0xffffffff) ^ p11
  352. # Feistel substitution on right word (round 11)
  353. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  354. S3[r & 0xff]) & 0xffffffff) ^ p12
  355. # Feistel substitution on left word (round 12)
  356. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  357. S3[l & 0xff]) & 0xffffffff) ^ p13
  358. # Feistel substitution on right word (round 13)
  359. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  360. S3[r & 0xff]) & 0xffffffff) ^ p14
  361. # Feistel substitution on left word (round 14)
  362. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  363. S3[l & 0xff]) & 0xffffffff) ^ p15
  364. # Feistel substitution on right word (round 15)
  365. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  366. S3[r & 0xff]) & 0xffffffff) ^ p16
  367. p8, p9 = l, r = r ^ p17, l
  368. #------------------------------------------------
  369. # update P[10] and P[11]
  370. #------------------------------------------------
  371. l ^= p0
  372. # Feistel substitution on left word (round 0)
  373. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  374. S3[l & 0xff]) & 0xffffffff) ^ p1
  375. # Feistel substitution on right word (round 1)
  376. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  377. S3[r & 0xff]) & 0xffffffff) ^ p2
  378. # Feistel substitution on left word (round 2)
  379. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  380. S3[l & 0xff]) & 0xffffffff) ^ p3
  381. # Feistel substitution on right word (round 3)
  382. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  383. S3[r & 0xff]) & 0xffffffff) ^ p4
  384. # Feistel substitution on left word (round 4)
  385. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  386. S3[l & 0xff]) & 0xffffffff) ^ p5
  387. # Feistel substitution on right word (round 5)
  388. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  389. S3[r & 0xff]) & 0xffffffff) ^ p6
  390. # Feistel substitution on left word (round 6)
  391. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  392. S3[l & 0xff]) & 0xffffffff) ^ p7
  393. # Feistel substitution on right word (round 7)
  394. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  395. S3[r & 0xff]) & 0xffffffff) ^ p8
  396. # Feistel substitution on left word (round 8)
  397. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  398. S3[l & 0xff]) & 0xffffffff) ^ p9
  399. # Feistel substitution on right word (round 9)
  400. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  401. S3[r & 0xff]) & 0xffffffff) ^ p10
  402. # Feistel substitution on left word (round 10)
  403. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  404. S3[l & 0xff]) & 0xffffffff) ^ p11
  405. # Feistel substitution on right word (round 11)
  406. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  407. S3[r & 0xff]) & 0xffffffff) ^ p12
  408. # Feistel substitution on left word (round 12)
  409. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  410. S3[l & 0xff]) & 0xffffffff) ^ p13
  411. # Feistel substitution on right word (round 13)
  412. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  413. S3[r & 0xff]) & 0xffffffff) ^ p14
  414. # Feistel substitution on left word (round 14)
  415. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  416. S3[l & 0xff]) & 0xffffffff) ^ p15
  417. # Feistel substitution on right word (round 15)
  418. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  419. S3[r & 0xff]) & 0xffffffff) ^ p16
  420. p10, p11 = l, r = r ^ p17, l
  421. #------------------------------------------------
  422. # update P[12] and P[13]
  423. #------------------------------------------------
  424. l ^= p0
  425. # Feistel substitution on left word (round 0)
  426. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  427. S3[l & 0xff]) & 0xffffffff) ^ p1
  428. # Feistel substitution on right word (round 1)
  429. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  430. S3[r & 0xff]) & 0xffffffff) ^ p2
  431. # Feistel substitution on left word (round 2)
  432. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  433. S3[l & 0xff]) & 0xffffffff) ^ p3
  434. # Feistel substitution on right word (round 3)
  435. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  436. S3[r & 0xff]) & 0xffffffff) ^ p4
  437. # Feistel substitution on left word (round 4)
  438. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  439. S3[l & 0xff]) & 0xffffffff) ^ p5
  440. # Feistel substitution on right word (round 5)
  441. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  442. S3[r & 0xff]) & 0xffffffff) ^ p6
  443. # Feistel substitution on left word (round 6)
  444. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  445. S3[l & 0xff]) & 0xffffffff) ^ p7
  446. # Feistel substitution on right word (round 7)
  447. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  448. S3[r & 0xff]) & 0xffffffff) ^ p8
  449. # Feistel substitution on left word (round 8)
  450. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  451. S3[l & 0xff]) & 0xffffffff) ^ p9
  452. # Feistel substitution on right word (round 9)
  453. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  454. S3[r & 0xff]) & 0xffffffff) ^ p10
  455. # Feistel substitution on left word (round 10)
  456. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  457. S3[l & 0xff]) & 0xffffffff) ^ p11
  458. # Feistel substitution on right word (round 11)
  459. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  460. S3[r & 0xff]) & 0xffffffff) ^ p12
  461. # Feistel substitution on left word (round 12)
  462. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  463. S3[l & 0xff]) & 0xffffffff) ^ p13
  464. # Feistel substitution on right word (round 13)
  465. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  466. S3[r & 0xff]) & 0xffffffff) ^ p14
  467. # Feistel substitution on left word (round 14)
  468. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  469. S3[l & 0xff]) & 0xffffffff) ^ p15
  470. # Feistel substitution on right word (round 15)
  471. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  472. S3[r & 0xff]) & 0xffffffff) ^ p16
  473. p12, p13 = l, r = r ^ p17, l
  474. #------------------------------------------------
  475. # update P[14] and P[15]
  476. #------------------------------------------------
  477. l ^= p0
  478. # Feistel substitution on left word (round 0)
  479. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  480. S3[l & 0xff]) & 0xffffffff) ^ p1
  481. # Feistel substitution on right word (round 1)
  482. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  483. S3[r & 0xff]) & 0xffffffff) ^ p2
  484. # Feistel substitution on left word (round 2)
  485. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  486. S3[l & 0xff]) & 0xffffffff) ^ p3
  487. # Feistel substitution on right word (round 3)
  488. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  489. S3[r & 0xff]) & 0xffffffff) ^ p4
  490. # Feistel substitution on left word (round 4)
  491. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  492. S3[l & 0xff]) & 0xffffffff) ^ p5
  493. # Feistel substitution on right word (round 5)
  494. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  495. S3[r & 0xff]) & 0xffffffff) ^ p6
  496. # Feistel substitution on left word (round 6)
  497. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  498. S3[l & 0xff]) & 0xffffffff) ^ p7
  499. # Feistel substitution on right word (round 7)
  500. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  501. S3[r & 0xff]) & 0xffffffff) ^ p8
  502. # Feistel substitution on left word (round 8)
  503. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  504. S3[l & 0xff]) & 0xffffffff) ^ p9
  505. # Feistel substitution on right word (round 9)
  506. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  507. S3[r & 0xff]) & 0xffffffff) ^ p10
  508. # Feistel substitution on left word (round 10)
  509. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  510. S3[l & 0xff]) & 0xffffffff) ^ p11
  511. # Feistel substitution on right word (round 11)
  512. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  513. S3[r & 0xff]) & 0xffffffff) ^ p12
  514. # Feistel substitution on left word (round 12)
  515. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  516. S3[l & 0xff]) & 0xffffffff) ^ p13
  517. # Feistel substitution on right word (round 13)
  518. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  519. S3[r & 0xff]) & 0xffffffff) ^ p14
  520. # Feistel substitution on left word (round 14)
  521. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  522. S3[l & 0xff]) & 0xffffffff) ^ p15
  523. # Feistel substitution on right word (round 15)
  524. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  525. S3[r & 0xff]) & 0xffffffff) ^ p16
  526. p14, p15 = l, r = r ^ p17, l
  527. #------------------------------------------------
  528. # update P[16] and P[17]
  529. #------------------------------------------------
  530. l ^= p0
  531. # Feistel substitution on left word (round 0)
  532. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  533. S3[l & 0xff]) & 0xffffffff) ^ p1
  534. # Feistel substitution on right word (round 1)
  535. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  536. S3[r & 0xff]) & 0xffffffff) ^ p2
  537. # Feistel substitution on left word (round 2)
  538. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  539. S3[l & 0xff]) & 0xffffffff) ^ p3
  540. # Feistel substitution on right word (round 3)
  541. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  542. S3[r & 0xff]) & 0xffffffff) ^ p4
  543. # Feistel substitution on left word (round 4)
  544. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  545. S3[l & 0xff]) & 0xffffffff) ^ p5
  546. # Feistel substitution on right word (round 5)
  547. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  548. S3[r & 0xff]) & 0xffffffff) ^ p6
  549. # Feistel substitution on left word (round 6)
  550. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  551. S3[l & 0xff]) & 0xffffffff) ^ p7
  552. # Feistel substitution on right word (round 7)
  553. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  554. S3[r & 0xff]) & 0xffffffff) ^ p8
  555. # Feistel substitution on left word (round 8)
  556. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  557. S3[l & 0xff]) & 0xffffffff) ^ p9
  558. # Feistel substitution on right word (round 9)
  559. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  560. S3[r & 0xff]) & 0xffffffff) ^ p10
  561. # Feistel substitution on left word (round 10)
  562. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  563. S3[l & 0xff]) & 0xffffffff) ^ p11
  564. # Feistel substitution on right word (round 11)
  565. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  566. S3[r & 0xff]) & 0xffffffff) ^ p12
  567. # Feistel substitution on left word (round 12)
  568. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  569. S3[l & 0xff]) & 0xffffffff) ^ p13
  570. # Feistel substitution on right word (round 13)
  571. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  572. S3[r & 0xff]) & 0xffffffff) ^ p14
  573. # Feistel substitution on left word (round 14)
  574. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  575. S3[l & 0xff]) & 0xffffffff) ^ p15
  576. # Feistel substitution on right word (round 15)
  577. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  578. S3[r & 0xff]) & 0xffffffff) ^ p16
  579. p16, p17 = l, r = r ^ p17, l
  580. #------------------------------------------------
  581. # save changes to original P array
  582. #------------------------------------------------
  583. P[:] = (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
  584. p10, p11, p12, p13, p14, p15, p16, p17)
  585. #=============================================================
  586. # update S
  587. #=============================================================
  588. for box in S:
  589. j = 0
  590. while j < 256:
  591. l ^= p0
  592. # Feistel substitution on left word (round 0)
  593. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  594. S3[l & 0xff]) & 0xffffffff) ^ p1
  595. # Feistel substitution on right word (round 1)
  596. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  597. S3[r & 0xff]) & 0xffffffff) ^ p2
  598. # Feistel substitution on left word (round 2)
  599. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  600. S3[l & 0xff]) & 0xffffffff) ^ p3
  601. # Feistel substitution on right word (round 3)
  602. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  603. S3[r & 0xff]) & 0xffffffff) ^ p4
  604. # Feistel substitution on left word (round 4)
  605. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  606. S3[l & 0xff]) & 0xffffffff) ^ p5
  607. # Feistel substitution on right word (round 5)
  608. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  609. S3[r & 0xff]) & 0xffffffff) ^ p6
  610. # Feistel substitution on left word (round 6)
  611. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  612. S3[l & 0xff]) & 0xffffffff) ^ p7
  613. # Feistel substitution on right word (round 7)
  614. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  615. S3[r & 0xff]) & 0xffffffff) ^ p8
  616. # Feistel substitution on left word (round 8)
  617. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  618. S3[l & 0xff]) & 0xffffffff) ^ p9
  619. # Feistel substitution on right word (round 9)
  620. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  621. S3[r & 0xff]) & 0xffffffff) ^ p10
  622. # Feistel substitution on left word (round 10)
  623. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  624. S3[l & 0xff]) & 0xffffffff) ^ p11
  625. # Feistel substitution on right word (round 11)
  626. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  627. S3[r & 0xff]) & 0xffffffff) ^ p12
  628. # Feistel substitution on left word (round 12)
  629. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  630. S3[l & 0xff]) & 0xffffffff) ^ p13
  631. # Feistel substitution on right word (round 13)
  632. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  633. S3[r & 0xff]) & 0xffffffff) ^ p14
  634. # Feistel substitution on left word (round 14)
  635. r ^= ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
  636. S3[l & 0xff]) & 0xffffffff) ^ p15
  637. # Feistel substitution on right word (round 15)
  638. l ^= ((((S0[r >> 24] + S1[(r >> 16) & 0xff]) ^ S2[(r >> 8) & 0xff]) +
  639. S3[r & 0xff]) & 0xffffffff) ^ p16
  640. box[j], box[j+1] = l, r = r ^ p17, l
  641. j += 2
  642. #===================================================================
  643. # eoc
  644. #===================================================================
  645. #=============================================================================
  646. # eof
  647. #=============================================================================