des.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. /*
  2. * Cryptographic API.
  3. *
  4. * DES & Triple DES EDE Cipher Algorithms.
  5. *
  6. * Originally released as descore by Dana L. How <how@isl.stanford.edu>.
  7. * Modified by Raimar Falke <rf13@inf.tu-dresden.de> for the Linux-Kernel.
  8. * Derived from Cryptoapi and Nettle implementations, adapted for in-place
  9. * scatterlist interface. Changed LGPL to GPL per section 3 of the LGPL.
  10. *
  11. * Copyright (c) 1992 Dana L. How.
  12. * Copyright (c) Raimar Falke <rf13@inf.tu-dresden.de>
  13. * Copyright (c) Gisle Sælensminde <gisle@ii.uib.no>
  14. * Copyright (C) 2001 Niels Möller.
  15. * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  16. *
  17. * This program is free software; you can redistribute it and/or modify
  18. * it under the terms of the GNU General Public License as published by
  19. * the Free Software Foundation; either version 2 of the License, or
  20. * (at your option) any later version.
  21. *
  22. */
  23. #include <linux/init.h>
  24. #include <linux/module.h>
  25. #include <linux/mm.h>
  26. #include <linux/errno.h>
  27. #include <asm/scatterlist.h>
  28. #include <linux/crypto.h>
  29. #define DES_KEY_SIZE 8
  30. #define DES_EXPKEY_WORDS 32
  31. #define DES_BLOCK_SIZE 8
  32. #define DES3_EDE_KEY_SIZE (3 * DES_KEY_SIZE)
  33. #define DES3_EDE_EXPKEY_WORDS (3 * DES_EXPKEY_WORDS)
  34. #define DES3_EDE_BLOCK_SIZE DES_BLOCK_SIZE
  35. #define ROR(d,c,o) ((d) = (d) >> (c) | (d) << (o))
  36. struct des_ctx {
  37. u32 expkey[DES_EXPKEY_WORDS];
  38. };
  39. struct des3_ede_ctx {
  40. u32 expkey[DES3_EDE_EXPKEY_WORDS];
  41. };
  42. static const u32 des_keymap[] = {
  43. 0x02080008, 0x02082000, 0x00002008, 0x00000000,
  44. 0x02002000, 0x00080008, 0x02080000, 0x02082008,
  45. 0x00000008, 0x02000000, 0x00082000, 0x00002008,
  46. 0x00082008, 0x02002008, 0x02000008, 0x02080000,
  47. 0x00002000, 0x00082008, 0x00080008, 0x02002000,
  48. 0x02082008, 0x02000008, 0x00000000, 0x00082000,
  49. 0x02000000, 0x00080000, 0x02002008, 0x02080008,
  50. 0x00080000, 0x00002000, 0x02082000, 0x00000008,
  51. 0x00080000, 0x00002000, 0x02000008, 0x02082008,
  52. 0x00002008, 0x02000000, 0x00000000, 0x00082000,
  53. 0x02080008, 0x02002008, 0x02002000, 0x00080008,
  54. 0x02082000, 0x00000008, 0x00080008, 0x02002000,
  55. 0x02082008, 0x00080000, 0x02080000, 0x02000008,
  56. 0x00082000, 0x00002008, 0x02002008, 0x02080000,
  57. 0x00000008, 0x02082000, 0x00082008, 0x00000000,
  58. 0x02000000, 0x02080008, 0x00002000, 0x00082008,
  59. 0x08000004, 0x00020004, 0x00000000, 0x08020200,
  60. 0x00020004, 0x00000200, 0x08000204, 0x00020000,
  61. 0x00000204, 0x08020204, 0x00020200, 0x08000000,
  62. 0x08000200, 0x08000004, 0x08020000, 0x00020204,
  63. 0x00020000, 0x08000204, 0x08020004, 0x00000000,
  64. 0x00000200, 0x00000004, 0x08020200, 0x08020004,
  65. 0x08020204, 0x08020000, 0x08000000, 0x00000204,
  66. 0x00000004, 0x00020200, 0x00020204, 0x08000200,
  67. 0x00000204, 0x08000000, 0x08000200, 0x00020204,
  68. 0x08020200, 0x00020004, 0x00000000, 0x08000200,
  69. 0x08000000, 0x00000200, 0x08020004, 0x00020000,
  70. 0x00020004, 0x08020204, 0x00020200, 0x00000004,
  71. 0x08020204, 0x00020200, 0x00020000, 0x08000204,
  72. 0x08000004, 0x08020000, 0x00020204, 0x00000000,
  73. 0x00000200, 0x08000004, 0x08000204, 0x08020200,
  74. 0x08020000, 0x00000204, 0x00000004, 0x08020004,
  75. 0x80040100, 0x01000100, 0x80000000, 0x81040100,
  76. 0x00000000, 0x01040000, 0x81000100, 0x80040000,
  77. 0x01040100, 0x81000000, 0x01000000, 0x80000100,
  78. 0x81000000, 0x80040100, 0x00040000, 0x01000000,
  79. 0x81040000, 0x00040100, 0x00000100, 0x80000000,
  80. 0x00040100, 0x81000100, 0x01040000, 0x00000100,
  81. 0x80000100, 0x00000000, 0x80040000, 0x01040100,
  82. 0x01000100, 0x81040000, 0x81040100, 0x00040000,
  83. 0x81040000, 0x80000100, 0x00040000, 0x81000000,
  84. 0x00040100, 0x01000100, 0x80000000, 0x01040000,
  85. 0x81000100, 0x00000000, 0x00000100, 0x80040000,
  86. 0x00000000, 0x81040000, 0x01040100, 0x00000100,
  87. 0x01000000, 0x81040100, 0x80040100, 0x00040000,
  88. 0x81040100, 0x80000000, 0x01000100, 0x80040100,
  89. 0x80040000, 0x00040100, 0x01040000, 0x81000100,
  90. 0x80000100, 0x01000000, 0x81000000, 0x01040100,
  91. 0x04010801, 0x00000000, 0x00010800, 0x04010000,
  92. 0x04000001, 0x00000801, 0x04000800, 0x00010800,
  93. 0x00000800, 0x04010001, 0x00000001, 0x04000800,
  94. 0x00010001, 0x04010800, 0x04010000, 0x00000001,
  95. 0x00010000, 0x04000801, 0x04010001, 0x00000800,
  96. 0x00010801, 0x04000000, 0x00000000, 0x00010001,
  97. 0x04000801, 0x00010801, 0x04010800, 0x04000001,
  98. 0x04000000, 0x00010000, 0x00000801, 0x04010801,
  99. 0x00010001, 0x04010800, 0x04000800, 0x00010801,
  100. 0x04010801, 0x00010001, 0x04000001, 0x00000000,
  101. 0x04000000, 0x00000801, 0x00010000, 0x04010001,
  102. 0x00000800, 0x04000000, 0x00010801, 0x04000801,
  103. 0x04010800, 0x00000800, 0x00000000, 0x04000001,
  104. 0x00000001, 0x04010801, 0x00010800, 0x04010000,
  105. 0x04010001, 0x00010000, 0x00000801, 0x04000800,
  106. 0x04000801, 0x00000001, 0x04010000, 0x00010800,
  107. 0x00000400, 0x00000020, 0x00100020, 0x40100000,
  108. 0x40100420, 0x40000400, 0x00000420, 0x00000000,
  109. 0x00100000, 0x40100020, 0x40000020, 0x00100400,
  110. 0x40000000, 0x00100420, 0x00100400, 0x40000020,
  111. 0x40100020, 0x00000400, 0x40000400, 0x40100420,
  112. 0x00000000, 0x00100020, 0x40100000, 0x00000420,
  113. 0x40100400, 0x40000420, 0x00100420, 0x40000000,
  114. 0x40000420, 0x40100400, 0x00000020, 0x00100000,
  115. 0x40000420, 0x00100400, 0x40100400, 0x40000020,
  116. 0x00000400, 0x00000020, 0x00100000, 0x40100400,
  117. 0x40100020, 0x40000420, 0x00000420, 0x00000000,
  118. 0x00000020, 0x40100000, 0x40000000, 0x00100020,
  119. 0x00000000, 0x40100020, 0x00100020, 0x00000420,
  120. 0x40000020, 0x00000400, 0x40100420, 0x00100000,
  121. 0x00100420, 0x40000000, 0x40000400, 0x40100420,
  122. 0x40100000, 0x00100420, 0x00100400, 0x40000400,
  123. 0x00800000, 0x00001000, 0x00000040, 0x00801042,
  124. 0x00801002, 0x00800040, 0x00001042, 0x00801000,
  125. 0x00001000, 0x00000002, 0x00800002, 0x00001040,
  126. 0x00800042, 0x00801002, 0x00801040, 0x00000000,
  127. 0x00001040, 0x00800000, 0x00001002, 0x00000042,
  128. 0x00800040, 0x00001042, 0x00000000, 0x00800002,
  129. 0x00000002, 0x00800042, 0x00801042, 0x00001002,
  130. 0x00801000, 0x00000040, 0x00000042, 0x00801040,
  131. 0x00801040, 0x00800042, 0x00001002, 0x00801000,
  132. 0x00001000, 0x00000002, 0x00800002, 0x00800040,
  133. 0x00800000, 0x00001040, 0x00801042, 0x00000000,
  134. 0x00001042, 0x00800000, 0x00000040, 0x00001002,
  135. 0x00800042, 0x00000040, 0x00000000, 0x00801042,
  136. 0x00801002, 0x00801040, 0x00000042, 0x00001000,
  137. 0x00001040, 0x00801002, 0x00800040, 0x00000042,
  138. 0x00000002, 0x00001042, 0x00801000, 0x00800002,
  139. 0x10400000, 0x00404010, 0x00000010, 0x10400010,
  140. 0x10004000, 0x00400000, 0x10400010, 0x00004010,
  141. 0x00400010, 0x00004000, 0x00404000, 0x10000000,
  142. 0x10404010, 0x10000010, 0x10000000, 0x10404000,
  143. 0x00000000, 0x10004000, 0x00404010, 0x00000010,
  144. 0x10000010, 0x10404010, 0x00004000, 0x10400000,
  145. 0x10404000, 0x00400010, 0x10004010, 0x00404000,
  146. 0x00004010, 0x00000000, 0x00400000, 0x10004010,
  147. 0x00404010, 0x00000010, 0x10000000, 0x00004000,
  148. 0x10000010, 0x10004000, 0x00404000, 0x10400010,
  149. 0x00000000, 0x00404010, 0x00004010, 0x10404000,
  150. 0x10004000, 0x00400000, 0x10404010, 0x10000000,
  151. 0x10004010, 0x10400000, 0x00400000, 0x10404010,
  152. 0x00004000, 0x00400010, 0x10400010, 0x00004010,
  153. 0x00400010, 0x00000000, 0x10404000, 0x10000010,
  154. 0x10400000, 0x10004010, 0x00000010, 0x00404000,
  155. 0x00208080, 0x00008000, 0x20200000, 0x20208080,
  156. 0x00200000, 0x20008080, 0x20008000, 0x20200000,
  157. 0x20008080, 0x00208080, 0x00208000, 0x20000080,
  158. 0x20200080, 0x00200000, 0x00000000, 0x20008000,
  159. 0x00008000, 0x20000000, 0x00200080, 0x00008080,
  160. 0x20208080, 0x00208000, 0x20000080, 0x00200080,
  161. 0x20000000, 0x00000080, 0x00008080, 0x20208000,
  162. 0x00000080, 0x20200080, 0x20208000, 0x00000000,
  163. 0x00000000, 0x20208080, 0x00200080, 0x20008000,
  164. 0x00208080, 0x00008000, 0x20000080, 0x00200080,
  165. 0x20208000, 0x00000080, 0x00008080, 0x20200000,
  166. 0x20008080, 0x20000000, 0x20200000, 0x00208000,
  167. 0x20208080, 0x00008080, 0x00208000, 0x20200080,
  168. 0x00200000, 0x20000080, 0x20008000, 0x00000000,
  169. 0x00008000, 0x00200000, 0x20200080, 0x00208080,
  170. 0x20000000, 0x20208000, 0x00000080, 0x20008080,
  171. };
  172. static const u8 rotors[] = {
  173. 34, 13, 5, 46, 47, 18, 32, 41, 11, 53, 33, 20,
  174. 14, 36, 30, 24, 49, 2, 15, 37, 42, 50, 0, 21,
  175. 38, 48, 6, 26, 39, 4, 52, 25, 12, 27, 31, 40,
  176. 1, 17, 28, 29, 23, 51, 35, 7, 3, 22, 9, 43,
  177. 41, 20, 12, 53, 54, 25, 39, 48, 18, 31, 40, 27,
  178. 21, 43, 37, 0, 1, 9, 22, 44, 49, 2, 7, 28,
  179. 45, 55, 13, 33, 46, 11, 6, 32, 19, 34, 38, 47,
  180. 8, 24, 35, 36, 30, 3, 42, 14, 10, 29, 16, 50,
  181. 55, 34, 26, 38, 11, 39, 53, 5, 32, 45, 54, 41,
  182. 35, 2, 51, 14, 15, 23, 36, 3, 8, 16, 21, 42,
  183. 6, 12, 27, 47, 31, 25, 20, 46, 33, 48, 52, 4,
  184. 22, 7, 49, 50, 44, 17, 1, 28, 24, 43, 30, 9,
  185. 12, 48, 40, 52, 25, 53, 38, 19, 46, 6, 11, 55,
  186. 49, 16, 10, 28, 29, 37, 50, 17, 22, 30, 35, 1,
  187. 20, 26, 41, 4, 45, 39, 34, 31, 47, 5, 13, 18,
  188. 36, 21, 8, 9, 3, 0, 15, 42, 7, 2, 44, 23,
  189. 26, 5, 54, 13, 39, 38, 52, 33, 31, 20, 25, 12,
  190. 8, 30, 24, 42, 43, 51, 9, 0, 36, 44, 49, 15,
  191. 34, 40, 55, 18, 6, 53, 48, 45, 4, 19, 27, 32,
  192. 50, 35, 22, 23, 17, 14, 29, 1, 21, 16, 3, 37,
  193. 40, 19, 11, 27, 53, 52, 13, 47, 45, 34, 39, 26,
  194. 22, 44, 7, 1, 2, 10, 23, 14, 50, 3, 8, 29,
  195. 48, 54, 12, 32, 20, 38, 5, 6, 18, 33, 41, 46,
  196. 9, 49, 36, 37, 0, 28, 43, 15, 35, 30, 17, 51,
  197. 54, 33, 25, 41, 38, 13, 27, 4, 6, 48, 53, 40,
  198. 36, 3, 21, 15, 16, 24, 37, 28, 9, 17, 22, 43,
  199. 5, 11, 26, 46, 34, 52, 19, 20, 32, 47, 55, 31,
  200. 23, 8, 50, 51, 14, 42, 2, 29, 49, 44, 0, 10,
  201. 11, 47, 39, 55, 52, 27, 41, 18, 20, 5, 38, 54,
  202. 50, 17, 35, 29, 30, 7, 51, 42, 23, 0, 36, 2,
  203. 19, 25, 40, 31, 48, 13, 33, 34, 46, 4, 12, 45,
  204. 37, 22, 9, 10, 28, 1, 16, 43, 8, 3, 14, 24,
  205. 18, 54, 46, 5, 6, 34, 48, 25, 27, 12, 45, 4,
  206. 2, 24, 42, 36, 37, 14, 3, 49, 30, 7, 43, 9,
  207. 26, 32, 47, 38, 55, 20, 40, 41, 53, 11, 19, 52,
  208. 44, 29, 16, 17, 35, 8, 23, 50, 15, 10, 21, 0,
  209. 32, 11, 31, 19, 20, 48, 5, 39, 41, 26, 6, 18,
  210. 16, 7, 1, 50, 51, 28, 17, 8, 44, 21, 2, 23,
  211. 40, 46, 4, 52, 12, 34, 54, 55, 38, 25, 33, 13,
  212. 3, 43, 30, 0, 49, 22, 37, 9, 29, 24, 35, 14,
  213. 46, 25, 45, 33, 34, 5, 19, 53, 55, 40, 20, 32,
  214. 30, 21, 15, 9, 10, 42, 0, 22, 3, 35, 16, 37,
  215. 54, 31, 18, 13, 26, 48, 11, 12, 52, 39, 47, 27,
  216. 17, 2, 44, 14, 8, 36, 51, 23, 43, 7, 49, 28,
  217. 31, 39, 6, 47, 48, 19, 33, 38, 12, 54, 34, 46,
  218. 44, 35, 29, 23, 24, 1, 14, 36, 17, 49, 30, 51,
  219. 11, 45, 32, 27, 40, 5, 25, 26, 13, 53, 4, 41,
  220. 0, 16, 3, 28, 22, 50, 10, 37, 2, 21, 8, 42,
  221. 45, 53, 20, 4, 5, 33, 47, 52, 26, 11, 48, 31,
  222. 3, 49, 43, 37, 7, 15, 28, 50, 0, 8, 44, 10,
  223. 25, 6, 46, 41, 54, 19, 39, 40, 27, 38, 18, 55,
  224. 14, 30, 17, 42, 36, 9, 24, 51, 16, 35, 22, 1,
  225. 6, 38, 34, 18, 19, 47, 4, 13, 40, 25, 5, 45,
  226. 17, 8, 2, 51, 21, 29, 42, 9, 14, 22, 3, 24,
  227. 39, 20, 31, 55, 11, 33, 53, 54, 41, 52, 32, 12,
  228. 28, 44, 0, 1, 50, 23, 7, 10, 30, 49, 36, 15,
  229. 20, 52, 48, 32, 33, 4, 18, 27, 54, 39, 19, 6,
  230. 0, 22, 16, 10, 35, 43, 1, 23, 28, 36, 17, 7,
  231. 53, 34, 45, 12, 25, 47, 38, 11, 55, 13, 46, 26,
  232. 42, 3, 14, 15, 9, 37, 21, 24, 44, 8, 50, 29,
  233. 27, 6, 55, 39, 40, 11, 25, 34, 4, 46, 26, 13,
  234. 7, 29, 23, 17, 42, 50, 8, 30, 35, 43, 24, 14,
  235. 31, 41, 52, 19, 32, 54, 45, 18, 5, 20, 53, 33,
  236. 49, 10, 21, 22, 16, 44, 28, 0, 51, 15, 2, 36,
  237. };
  238. static const u8 parity[] = {
  239. 8,1,0,8,0,8,8,0,0,8,8,0,8,0,2,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,3,
  240. 0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
  241. 0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
  242. 8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
  243. 0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
  244. 8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
  245. 8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
  246. 4,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,5,0,8,0,8,8,0,0,8,8,0,8,0,6,8,
  247. };
  248. static void des_small_fips_encrypt(u32 *expkey, u8 *dst, const u8 *src)
  249. {
  250. u32 x, y, z;
  251. x = src[7];
  252. x <<= 8;
  253. x |= src[6];
  254. x <<= 8;
  255. x |= src[5];
  256. x <<= 8;
  257. x |= src[4];
  258. y = src[3];
  259. y <<= 8;
  260. y |= src[2];
  261. y <<= 8;
  262. y |= src[1];
  263. y <<= 8;
  264. y |= src[0];
  265. z = ((x >> 004) ^ y) & 0x0F0F0F0FL;
  266. x ^= z << 004;
  267. y ^= z;
  268. z = ((y >> 020) ^ x) & 0x0000FFFFL;
  269. y ^= z << 020;
  270. x ^= z;
  271. z = ((x >> 002) ^ y) & 0x33333333L;
  272. x ^= z << 002;
  273. y ^= z;
  274. z = ((y >> 010) ^ x) & 0x00FF00FFL;
  275. y ^= z << 010;
  276. x ^= z;
  277. x = x >> 1 | x << 31;
  278. z = (x ^ y) & 0x55555555L;
  279. y ^= z;
  280. x ^= z;
  281. y = y >> 1 | y << 31;
  282. z = expkey[0];
  283. z ^= y;
  284. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  285. z >>= 8;
  286. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  287. z >>= 8;
  288. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  289. z >>= 8;
  290. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  291. z = expkey[1];
  292. z ^= y;
  293. z = z << 4 | z >> 28;
  294. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  295. z >>= 8;
  296. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  297. z >>= 8;
  298. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  299. z >>= 8;
  300. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  301. z = expkey[2];
  302. z ^= x;
  303. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  304. z >>= 8;
  305. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  306. z >>= 8;
  307. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  308. z >>= 8;
  309. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  310. z = expkey[3];
  311. z ^= x;
  312. z = z << 4 | z >> 28;
  313. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  314. z >>= 8;
  315. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  316. z >>= 8;
  317. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  318. z >>= 8;
  319. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  320. z = expkey[4];
  321. z ^= y;
  322. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  323. z >>= 8;
  324. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  325. z >>= 8;
  326. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  327. z >>= 8;
  328. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  329. z = expkey[5];
  330. z ^= y;
  331. z = z << 4 | z >> 28;
  332. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  333. z >>= 8;
  334. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  335. z >>= 8;
  336. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  337. z >>= 8;
  338. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  339. z = expkey[6];
  340. z ^= x;
  341. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  342. z >>= 8;
  343. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  344. z >>= 8;
  345. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  346. z >>= 8;
  347. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  348. z = expkey[7];
  349. z ^= x;
  350. z = z << 4 | z >> 28;
  351. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  352. z >>= 8;
  353. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  354. z >>= 8;
  355. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  356. z >>= 8;
  357. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  358. z = expkey[8];
  359. z ^= y;
  360. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  361. z >>= 8;
  362. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  363. z >>= 8;
  364. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  365. z >>= 8;
  366. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  367. z = expkey[9];
  368. z ^= y;
  369. z = z << 4 | z >> 28;
  370. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  371. z >>= 8;
  372. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  373. z >>= 8;
  374. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  375. z >>= 8;
  376. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  377. z = expkey[10];
  378. z ^= x;
  379. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  380. z >>= 8;
  381. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  382. z >>= 8;
  383. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  384. z >>= 8;
  385. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  386. z = expkey[11];
  387. z ^= x;
  388. z = z << 4 | z >> 28;
  389. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  390. z >>= 8;
  391. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  392. z >>= 8;
  393. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  394. z >>= 8;
  395. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  396. z = expkey[12];
  397. z ^= y;
  398. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  399. z >>= 8;
  400. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  401. z >>= 8;
  402. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  403. z >>= 8;
  404. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  405. z = expkey[13];
  406. z ^= y;
  407. z = z << 4 | z >> 28;
  408. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  409. z >>= 8;
  410. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  411. z >>= 8;
  412. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  413. z >>= 8;
  414. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  415. z = expkey[14];
  416. z ^= x;
  417. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  418. z >>= 8;
  419. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  420. z >>= 8;
  421. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  422. z >>= 8;
  423. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  424. z = expkey[15];
  425. z ^= x;
  426. z = z << 4 | z >> 28;
  427. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  428. z >>= 8;
  429. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  430. z >>= 8;
  431. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  432. z >>= 8;
  433. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  434. z = expkey[16];
  435. z ^= y;
  436. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  437. z >>= 8;
  438. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  439. z >>= 8;
  440. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  441. z >>= 8;
  442. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  443. z = expkey[17];
  444. z ^= y;
  445. z = z << 4 | z >> 28;
  446. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  447. z >>= 8;
  448. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  449. z >>= 8;
  450. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  451. z >>= 8;
  452. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  453. z = expkey[18];
  454. z ^= x;
  455. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  456. z >>= 8;
  457. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  458. z >>= 8;
  459. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  460. z >>= 8;
  461. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  462. z = expkey[19];
  463. z ^= x;
  464. z = z << 4 | z >> 28;
  465. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  466. z >>= 8;
  467. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  468. z >>= 8;
  469. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  470. z >>= 8;
  471. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  472. z = expkey[20];
  473. z ^= y;
  474. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  475. z >>= 8;
  476. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  477. z >>= 8;
  478. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  479. z >>= 8;
  480. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  481. z = expkey[21];
  482. z ^= y;
  483. z = z << 4 | z >> 28;
  484. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  485. z >>= 8;
  486. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  487. z >>= 8;
  488. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  489. z >>= 8;
  490. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  491. z = expkey[22];
  492. z ^= x;
  493. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  494. z >>= 8;
  495. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  496. z >>= 8;
  497. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  498. z >>= 8;
  499. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  500. z = expkey[23];
  501. z ^= x;
  502. z = z << 4 | z >> 28;
  503. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  504. z >>= 8;
  505. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  506. z >>= 8;
  507. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  508. z >>= 8;
  509. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  510. z = expkey[24];
  511. z ^= y;
  512. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  513. z >>= 8;
  514. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  515. z >>= 8;
  516. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  517. z >>= 8;
  518. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  519. z = expkey[25];
  520. z ^= y;
  521. z = z << 4 | z >> 28;
  522. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  523. z >>= 8;
  524. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  525. z >>= 8;
  526. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  527. z >>= 8;
  528. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  529. z = expkey[26];
  530. z ^= x;
  531. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  532. z >>= 8;
  533. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  534. z >>= 8;
  535. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  536. z >>= 8;
  537. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  538. z = expkey[27];
  539. z ^= x;
  540. z = z << 4 | z >> 28;
  541. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  542. z >>= 8;
  543. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  544. z >>= 8;
  545. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  546. z >>= 8;
  547. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  548. z = expkey[28];
  549. z ^= y;
  550. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  551. z >>= 8;
  552. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  553. z >>= 8;
  554. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  555. z >>= 8;
  556. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  557. z = expkey[29];
  558. z ^= y;
  559. z = z << 4 | z >> 28;
  560. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  561. z >>= 8;
  562. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  563. z >>= 8;
  564. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  565. z >>= 8;
  566. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  567. z = expkey[30];
  568. z ^= x;
  569. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  570. z >>= 8;
  571. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  572. z >>= 8;
  573. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  574. z >>= 8;
  575. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  576. z = expkey[31];
  577. z ^= x;
  578. z = z << 4 | z >> 28;
  579. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  580. z >>= 8;
  581. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  582. z >>= 8;
  583. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  584. z >>= 8;
  585. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  586. x = x << 1 | x >> 31;
  587. z = (x ^ y) & 0x55555555L;
  588. y ^= z;
  589. x ^= z;
  590. y = y << 1 | y >> 31;
  591. z = ((x >> 010) ^ y) & 0x00FF00FFL;
  592. x ^= z << 010;
  593. y ^= z;
  594. z = ((y >> 002) ^ x) & 0x33333333L;
  595. y ^= z << 002;
  596. x ^= z;
  597. z = ((x >> 020) ^ y) & 0x0000FFFFL;
  598. x ^= z << 020;
  599. y ^= z;
  600. z = ((y >> 004) ^ x) & 0x0F0F0F0FL;
  601. y ^= z << 004;
  602. x ^= z;
  603. dst[0] = x;
  604. x >>= 8;
  605. dst[1] = x;
  606. x >>= 8;
  607. dst[2] = x;
  608. x >>= 8;
  609. dst[3] = x;
  610. dst[4] = y;
  611. y >>= 8;
  612. dst[5] = y;
  613. y >>= 8;
  614. dst[6] = y;
  615. y >>= 8;
  616. dst[7] = y;
  617. }
  618. static void des_small_fips_decrypt(u32 *expkey, u8 *dst, const u8 *src)
  619. {
  620. u32 x, y, z;
  621. x = src[7];
  622. x <<= 8;
  623. x |= src[6];
  624. x <<= 8;
  625. x |= src[5];
  626. x <<= 8;
  627. x |= src[4];
  628. y = src[3];
  629. y <<= 8;
  630. y |= src[2];
  631. y <<= 8;
  632. y |= src[1];
  633. y <<= 8;
  634. y |= src[0];
  635. z = ((x >> 004) ^ y) & 0x0F0F0F0FL;
  636. x ^= z << 004;
  637. y ^= z;
  638. z = ((y >> 020) ^ x) & 0x0000FFFFL;
  639. y ^= z << 020;
  640. x ^= z;
  641. z = ((x >> 002) ^ y) & 0x33333333L;
  642. x ^= z << 002;
  643. y ^= z;
  644. z = ((y >> 010) ^ x) & 0x00FF00FFL;
  645. y ^= z << 010;
  646. x ^= z;
  647. x = x >> 1 | x << 31;
  648. z = (x ^ y) & 0x55555555L;
  649. y ^= z;
  650. x ^= z;
  651. y = y >> 1 | y << 31;
  652. z = expkey[31];
  653. z ^= y;
  654. z = z << 4 | z >> 28;
  655. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  656. z >>= 8;
  657. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  658. z >>= 8;
  659. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  660. z >>= 8;
  661. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  662. z = expkey[30];
  663. z ^= y;
  664. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  665. z >>= 8;
  666. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  667. z >>= 8;
  668. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  669. z >>= 8;
  670. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  671. z = expkey[29];
  672. z ^= x;
  673. z = z << 4 | z >> 28;
  674. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  675. z >>= 8;
  676. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  677. z >>= 8;
  678. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  679. z >>= 8;
  680. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  681. z = expkey[28];
  682. z ^= x;
  683. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  684. z >>= 8;
  685. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  686. z >>= 8;
  687. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  688. z >>= 8;
  689. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  690. z = expkey[27];
  691. z ^= y;
  692. z = z << 4 | z >> 28;
  693. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  694. z >>= 8;
  695. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  696. z >>= 8;
  697. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  698. z >>= 8;
  699. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  700. z = expkey[26];
  701. z ^= y;
  702. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  703. z >>= 8;
  704. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  705. z >>= 8;
  706. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  707. z >>= 8;
  708. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  709. z = expkey[25];
  710. z ^= x;
  711. z = z << 4 | z >> 28;
  712. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  713. z >>= 8;
  714. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  715. z >>= 8;
  716. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  717. z >>= 8;
  718. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  719. z = expkey[24];
  720. z ^= x;
  721. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  722. z >>= 8;
  723. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  724. z >>= 8;
  725. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  726. z >>= 8;
  727. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  728. z = expkey[23];
  729. z ^= y;
  730. z = z << 4 | z >> 28;
  731. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  732. z >>= 8;
  733. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  734. z >>= 8;
  735. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  736. z >>= 8;
  737. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  738. z = expkey[22];
  739. z ^= y;
  740. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  741. z >>= 8;
  742. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  743. z >>= 8;
  744. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  745. z >>= 8;
  746. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  747. z = expkey[21];
  748. z ^= x;
  749. z = z << 4 | z >> 28;
  750. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  751. z >>= 8;
  752. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  753. z >>= 8;
  754. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  755. z >>= 8;
  756. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  757. z = expkey[20];
  758. z ^= x;
  759. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  760. z >>= 8;
  761. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  762. z >>= 8;
  763. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  764. z >>= 8;
  765. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  766. z = expkey[19];
  767. z ^= y;
  768. z = z << 4 | z >> 28;
  769. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  770. z >>= 8;
  771. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  772. z >>= 8;
  773. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  774. z >>= 8;
  775. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  776. z = expkey[18];
  777. z ^= y;
  778. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  779. z >>= 8;
  780. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  781. z >>= 8;
  782. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  783. z >>= 8;
  784. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  785. z = expkey[17];
  786. z ^= x;
  787. z = z << 4 | z >> 28;
  788. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  789. z >>= 8;
  790. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  791. z >>= 8;
  792. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  793. z >>= 8;
  794. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  795. z = expkey[16];
  796. z ^= x;
  797. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  798. z >>= 8;
  799. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  800. z >>= 8;
  801. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  802. z >>= 8;
  803. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  804. z = expkey[15];
  805. z ^= y;
  806. z = z << 4 | z >> 28;
  807. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  808. z >>= 8;
  809. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  810. z >>= 8;
  811. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  812. z >>= 8;
  813. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  814. z = expkey[14];
  815. z ^= y;
  816. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  817. z >>= 8;
  818. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  819. z >>= 8;
  820. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  821. z >>= 8;
  822. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  823. z = expkey[13];
  824. z ^= x;
  825. z = z << 4 | z >> 28;
  826. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  827. z >>= 8;
  828. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  829. z >>= 8;
  830. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  831. z >>= 8;
  832. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  833. z = expkey[12];
  834. z ^= x;
  835. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  836. z >>= 8;
  837. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  838. z >>= 8;
  839. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  840. z >>= 8;
  841. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  842. z = expkey[11];
  843. z ^= y;
  844. z = z << 4 | z >> 28;
  845. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  846. z >>= 8;
  847. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  848. z >>= 8;
  849. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  850. z >>= 8;
  851. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  852. z = expkey[10];
  853. z ^= y;
  854. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  855. z >>= 8;
  856. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  857. z >>= 8;
  858. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  859. z >>= 8;
  860. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  861. z = expkey[9];
  862. z ^= x;
  863. z = z << 4 | z >> 28;
  864. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  865. z >>= 8;
  866. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  867. z >>= 8;
  868. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  869. z >>= 8;
  870. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  871. z = expkey[8];
  872. z ^= x;
  873. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  874. z >>= 8;
  875. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  876. z >>= 8;
  877. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  878. z >>= 8;
  879. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  880. z = expkey[7];
  881. z ^= y;
  882. z = z << 4 | z >> 28;
  883. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  884. z >>= 8;
  885. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  886. z >>= 8;
  887. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  888. z >>= 8;
  889. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  890. z = expkey[6];
  891. z ^= y;
  892. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  893. z >>= 8;
  894. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  895. z >>= 8;
  896. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  897. z >>= 8;
  898. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  899. z = expkey[5];
  900. z ^= x;
  901. z = z << 4 | z >> 28;
  902. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  903. z >>= 8;
  904. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  905. z >>= 8;
  906. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  907. z >>= 8;
  908. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  909. z = expkey[4];
  910. z ^= x;
  911. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  912. z >>= 8;
  913. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  914. z >>= 8;
  915. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  916. z >>= 8;
  917. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  918. z = expkey[3];
  919. z ^= y;
  920. z = z << 4 | z >> 28;
  921. x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  922. z >>= 8;
  923. x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  924. z >>= 8;
  925. x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  926. z >>= 8;
  927. x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  928. z = expkey[2];
  929. z ^= y;
  930. x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  931. z >>= 8;
  932. x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  933. z >>= 8;
  934. x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  935. z >>= 8;
  936. x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  937. z = expkey[1];
  938. z ^= x;
  939. z = z << 4 | z >> 28;
  940. y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
  941. z >>= 8;
  942. y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
  943. z >>= 8;
  944. y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
  945. z >>= 8;
  946. y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
  947. z = expkey[0];
  948. z ^= x;
  949. y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
  950. z >>= 8;
  951. y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
  952. z >>= 8;
  953. y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
  954. z >>= 8;
  955. y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
  956. x = x << 1 | x >> 31;
  957. z = (x ^ y) & 0x55555555L;
  958. y ^= z;
  959. x ^= z;
  960. y = y << 1 | y >> 31;
  961. z = ((x >> 010) ^ y) & 0x00FF00FFL;
  962. x ^= z << 010;
  963. y ^= z;
  964. z = ((y >> 002) ^ x) & 0x33333333L;
  965. y ^= z << 002;
  966. x ^= z;
  967. z = ((x >> 020) ^ y) & 0x0000FFFFL;
  968. x ^= z << 020;
  969. y ^= z;
  970. z = ((y >> 004) ^ x) & 0x0F0F0F0FL;
  971. y ^= z << 004;
  972. x ^= z;
  973. dst[0] = x;
  974. x >>= 8;
  975. dst[1] = x;
  976. x >>= 8;
  977. dst[2] = x;
  978. x >>= 8;
  979. dst[3] = x;
  980. dst[4] = y;
  981. y >>= 8;
  982. dst[5] = y;
  983. y >>= 8;
  984. dst[6] = y;
  985. y >>= 8;
  986. dst[7] = y;
  987. }
  988. /*
  989. * RFC2451: Weak key checks SHOULD be performed.
  990. */
  991. static int setkey(u32 *expkey, const u8 *key, unsigned int keylen, u32 *flags)
  992. {
  993. const u8 *k;
  994. u8 *b0, *b1;
  995. u32 n, w;
  996. u8 bits0[56], bits1[56];
  997. n = parity[key[0]]; n <<= 4;
  998. n |= parity[key[1]]; n <<= 4;
  999. n |= parity[key[2]]; n <<= 4;
  1000. n |= parity[key[3]]; n <<= 4;
  1001. n |= parity[key[4]]; n <<= 4;
  1002. n |= parity[key[5]]; n <<= 4;
  1003. n |= parity[key[6]]; n <<= 4;
  1004. n |= parity[key[7]];
  1005. w = 0x88888888L;
  1006. if ((*flags & CRYPTO_TFM_REQ_WEAK_KEY)
  1007. && !((n - (w >> 3)) & w)) { /* 1 in 10^10 keys passes this test */
  1008. if (n < 0x41415151) {
  1009. if (n < 0x31312121) {
  1010. if (n < 0x14141515) {
  1011. /* 01 01 01 01 01 01 01 01 */
  1012. if (n == 0x11111111) goto weak;
  1013. /* 01 1F 01 1F 01 0E 01 0E */
  1014. if (n == 0x13131212) goto weak;
  1015. } else {
  1016. /* 01 E0 01 E0 01 F1 01 F1 */
  1017. if (n == 0x14141515) goto weak;
  1018. /* 01 FE 01 FE 01 FE 01 FE */
  1019. if (n == 0x16161616) goto weak;
  1020. }
  1021. } else {
  1022. if (n < 0x34342525) {
  1023. /* 1F 01 1F 01 0E 01 0E 01 */
  1024. if (n == 0x31312121) goto weak;
  1025. /* 1F 1F 1F 1F 0E 0E 0E 0E (?) */
  1026. if (n == 0x33332222) goto weak;
  1027. } else {
  1028. /* 1F E0 1F E0 0E F1 0E F1 */
  1029. if (n == 0x34342525) goto weak;
  1030. /* 1F FE 1F FE 0E FE 0E FE */
  1031. if (n == 0x36362626) goto weak;
  1032. }
  1033. }
  1034. } else {
  1035. if (n < 0x61616161) {
  1036. if (n < 0x44445555) {
  1037. /* E0 01 E0 01 F1 01 F1 01 */
  1038. if (n == 0x41415151) goto weak;
  1039. /* E0 1F E0 1F F1 0E F1 0E */
  1040. if (n == 0x43435252) goto weak;
  1041. } else {
  1042. /* E0 E0 E0 E0 F1 F1 F1 F1 (?) */
  1043. if (n == 0x44445555) goto weak;
  1044. /* E0 FE E0 FE F1 FE F1 FE */
  1045. if (n == 0x46465656) goto weak;
  1046. }
  1047. } else {
  1048. if (n < 0x64646565) {
  1049. /* FE 01 FE 01 FE 01 FE 01 */
  1050. if (n == 0x61616161) goto weak;
  1051. /* FE 1F FE 1F FE 0E FE 0E */
  1052. if (n == 0x63636262) goto weak;
  1053. } else {
  1054. /* FE E0 FE E0 FE F1 FE F1 */
  1055. if (n == 0x64646565) goto weak;
  1056. /* FE FE FE FE FE FE FE FE */
  1057. if (n == 0x66666666) goto weak;
  1058. }
  1059. }
  1060. }
  1061. goto not_weak;
  1062. weak:
  1063. *flags |= CRYPTO_TFM_RES_WEAK_KEY;
  1064. return -EINVAL;
  1065. }
  1066. not_weak:
  1067. /* explode the bits */
  1068. n = 56;
  1069. b0 = bits0;
  1070. b1 = bits1;
  1071. do {
  1072. w = (256 | *key++) << 2;
  1073. do {
  1074. --n;
  1075. b1[n] = 8 & w;
  1076. w >>= 1;
  1077. b0[n] = 4 & w;
  1078. } while ( w >= 16 );
  1079. } while ( n );
  1080. /* put the bits in the correct places */
  1081. n = 16;
  1082. k = rotors;
  1083. do {
  1084. w = (b1[k[ 0 ]] | b0[k[ 1 ]]) << 4;
  1085. w |= (b1[k[ 2 ]] | b0[k[ 3 ]]) << 2;
  1086. w |= b1[k[ 4 ]] | b0[k[ 5 ]];
  1087. w <<= 8;
  1088. w |= (b1[k[ 6 ]] | b0[k[ 7 ]]) << 4;
  1089. w |= (b1[k[ 8 ]] | b0[k[ 9 ]]) << 2;
  1090. w |= b1[k[10 ]] | b0[k[11 ]];
  1091. w <<= 8;
  1092. w |= (b1[k[12 ]] | b0[k[13 ]]) << 4;
  1093. w |= (b1[k[14 ]] | b0[k[15 ]]) << 2;
  1094. w |= b1[k[16 ]] | b0[k[17 ]];
  1095. w <<= 8;
  1096. w |= (b1[k[18 ]] | b0[k[19 ]]) << 4;
  1097. w |= (b1[k[20 ]] | b0[k[21 ]]) << 2;
  1098. w |= b1[k[22 ]] | b0[k[23 ]];
  1099. expkey[0] = w;
  1100. w = (b1[k[ 0+24]] | b0[k[ 1+24]]) << 4;
  1101. w |= (b1[k[ 2+24]] | b0[k[ 3+24]]) << 2;
  1102. w |= b1[k[ 4+24]] | b0[k[ 5+24]];
  1103. w <<= 8;
  1104. w |= (b1[k[ 6+24]] | b0[k[ 7+24]]) << 4;
  1105. w |= (b1[k[ 8+24]] | b0[k[ 9+24]]) << 2;
  1106. w |= b1[k[10+24]] | b0[k[11+24]];
  1107. w <<= 8;
  1108. w |= (b1[k[12+24]] | b0[k[13+24]]) << 4;
  1109. w |= (b1[k[14+24]] | b0[k[15+24]]) << 2;
  1110. w |= b1[k[16+24]] | b0[k[17+24]];
  1111. w <<= 8;
  1112. w |= (b1[k[18+24]] | b0[k[19+24]]) << 4;
  1113. w |= (b1[k[20+24]] | b0[k[21+24]]) << 2;
  1114. w |= b1[k[22+24]] | b0[k[23+24]];
  1115. ROR(w, 4, 28); /* could be eliminated */
  1116. expkey[1] = w;
  1117. k += 48;
  1118. expkey += 2;
  1119. } while (--n);
  1120. return 0;
  1121. }
  1122. static int des_setkey(void *ctx, const u8 *key, unsigned int keylen, u32 *flags)
  1123. {
  1124. return setkey(((struct des_ctx *)ctx)->expkey, key, keylen, flags);
  1125. }
  1126. static void des_encrypt(void *ctx, u8 *dst, const u8 *src)
  1127. {
  1128. des_small_fips_encrypt(((struct des_ctx *)ctx)->expkey, dst, src);
  1129. }
  1130. static void des_decrypt(void *ctx, u8 *dst, const u8 *src)
  1131. {
  1132. des_small_fips_decrypt(((struct des_ctx *)ctx)->expkey, dst, src);
  1133. }
  1134. /*
  1135. * RFC2451:
  1136. *
  1137. * For DES-EDE3, there is no known need to reject weak or
  1138. * complementation keys. Any weakness is obviated by the use of
  1139. * multiple keys.
  1140. *
  1141. * However, if the first two or last two independent 64-bit keys are
  1142. * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
  1143. * same as DES. Implementers MUST reject keys that exhibit this
  1144. * property.
  1145. *
  1146. */
  1147. static int des3_ede_setkey(void *ctx, const u8 *key,
  1148. unsigned int keylen, u32 *flags)
  1149. {
  1150. unsigned int i, off;
  1151. struct des3_ede_ctx *dctx = ctx;
  1152. if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
  1153. memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
  1154. DES_KEY_SIZE))) {
  1155. *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
  1156. return -EINVAL;
  1157. }
  1158. for (i = 0, off = 0; i < 3; i++, off += DES_EXPKEY_WORDS,
  1159. key += DES_KEY_SIZE) {
  1160. int ret = setkey(&dctx->expkey[off], key, DES_KEY_SIZE, flags);
  1161. if (ret < 0)
  1162. return ret;
  1163. }
  1164. return 0;
  1165. }
  1166. static void des3_ede_encrypt(void *ctx, u8 *dst, const u8 *src)
  1167. {
  1168. struct des3_ede_ctx *dctx = ctx;
  1169. des_small_fips_encrypt(dctx->expkey, dst, src);
  1170. des_small_fips_decrypt(&dctx->expkey[DES_EXPKEY_WORDS], dst, dst);
  1171. des_small_fips_encrypt(&dctx->expkey[DES_EXPKEY_WORDS * 2], dst, dst);
  1172. }
  1173. static void des3_ede_decrypt(void *ctx, u8 *dst, const u8 *src)
  1174. {
  1175. struct des3_ede_ctx *dctx = ctx;
  1176. des_small_fips_decrypt(&dctx->expkey[DES_EXPKEY_WORDS * 2], dst, src);
  1177. des_small_fips_encrypt(&dctx->expkey[DES_EXPKEY_WORDS], dst, dst);
  1178. des_small_fips_decrypt(dctx->expkey, dst, dst);
  1179. }
  1180. static struct crypto_alg des_alg = {
  1181. .cra_name = "des",
  1182. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  1183. .cra_blocksize = DES_BLOCK_SIZE,
  1184. .cra_ctxsize = sizeof(struct des_ctx),
  1185. .cra_module = THIS_MODULE,
  1186. .cra_list = LIST_HEAD_INIT(des_alg.cra_list),
  1187. .cra_u = { .cipher = {
  1188. .cia_min_keysize = DES_KEY_SIZE,
  1189. .cia_max_keysize = DES_KEY_SIZE,
  1190. .cia_setkey = des_setkey,
  1191. .cia_encrypt = des_encrypt,
  1192. .cia_decrypt = des_decrypt } }
  1193. };
  1194. static struct crypto_alg des3_ede_alg = {
  1195. .cra_name = "des3_ede",
  1196. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  1197. .cra_blocksize = DES3_EDE_BLOCK_SIZE,
  1198. .cra_ctxsize = sizeof(struct des3_ede_ctx),
  1199. .cra_module = THIS_MODULE,
  1200. .cra_list = LIST_HEAD_INIT(des3_ede_alg.cra_list),
  1201. .cra_u = { .cipher = {
  1202. .cia_min_keysize = DES3_EDE_KEY_SIZE,
  1203. .cia_max_keysize = DES3_EDE_KEY_SIZE,
  1204. .cia_setkey = des3_ede_setkey,
  1205. .cia_encrypt = des3_ede_encrypt,
  1206. .cia_decrypt = des3_ede_decrypt } }
  1207. };
  1208. MODULE_ALIAS("des3_ede");
  1209. static int __init init(void)
  1210. {
  1211. int ret = 0;
  1212. ret = crypto_register_alg(&des_alg);
  1213. if (ret < 0)
  1214. goto out;
  1215. ret = crypto_register_alg(&des3_ede_alg);
  1216. if (ret < 0)
  1217. crypto_unregister_alg(&des_alg);
  1218. out:
  1219. return ret;
  1220. }
  1221. static void __exit fini(void)
  1222. {
  1223. crypto_unregister_alg(&des3_ede_alg);
  1224. crypto_unregister_alg(&des_alg);
  1225. }
  1226. module_init(init);
  1227. module_exit(fini);
  1228. MODULE_LICENSE("GPL");
  1229. MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");