des.c 39 KB

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