blowfish.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {
  11. Unit implementing simple blowfish algorithm
  12. }
  13. {$ifdef fpc}
  14. {$mode objfpc}
  15. {$h+}
  16. {$inline on}
  17. {$endif}
  18. unit BlowFish;
  19. interface
  20. uses SysUtils,Classes;
  21. Const
  22. BFRounds = 16; { 16 blowfish rounds }
  23. Type
  24. PBlowFishKey = ^TBlowFishKey;
  25. TBlowFishKey = array[0..55] of Byte;
  26. TBFBlock = array[0..1] of LongInt; { BlowFish }
  27. type
  28. TBlowFish = Class(TObject)
  29. Private
  30. PBox : array[0..(BFRounds+1)] of LongInt;
  31. SBox : array[0..3, 0..255] of LongInt;
  32. Function F(x : Cardinal) : Cardinal;{$ifdef fpc}inline;{$endif}
  33. Public
  34. Constructor Create(Key : TBlowFishKey; KeySize : Integer);
  35. Procedure Encrypt(var Block : TBFBlock);
  36. Procedure Decrypt(var Block : TBFBlock);
  37. end;
  38. Type
  39. EBlowFishError = Class(EStreamError);
  40. { TBlowFishStream }
  41. TBlowFishStream = Class(TOwnerStream)
  42. Private
  43. FBF : TBlowFish;
  44. FData : TBFBlock;
  45. FBufpos : Byte;
  46. FPos : Int64;
  47. protected
  48. function GetPosition: Int64; override;
  49. procedure InvalidSeek; override;
  50. Public
  51. Constructor Create(AKey : TBlowFishKey; AKeySize : Byte; Dest: TStream); overload; virtual;
  52. Constructor Create(Const KeyPhrase : String; Dest: TStream); overload;
  53. Destructor Destroy; override;
  54. Property BlowFish : TBlowFish Read FBF;
  55. end;
  56. TBlowFishEncryptStream = Class(TBlowFishStream)
  57. public
  58. Destructor Destroy; override;
  59. function Write(const Buffer; Count: Longint): Longint; override;
  60. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
  61. procedure Flush;
  62. end;
  63. TBlowFishDeCryptStream = Class(TBlowFishStream)
  64. private
  65. FSourcePos0: Int64;
  66. public
  67. Constructor Create(AKey : TBlowFishKey; AKeySize : Byte; Dest: TStream); override;
  68. function Read(var Buffer; Count: Longint): Longint; override;
  69. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
  70. end;
  71. Implementation
  72. ResourceString
  73. SNoSeekAllowed = 'Seek not allowed on encryption streams';
  74. SErrEmptyPassPhraseNotAllowed = 'Empty passphrase is not allowed in constructor';
  75. { Blowfish lookup tables }
  76. const
  77. bf_P: array[0..(BFRounds + 1)] of DWord = (
  78. $243F6A88, $85A308D3, $13198A2E, $03707344,
  79. $A4093822, $299F31D0, $082EFA98, $EC4E6C89,
  80. $452821E6, $38D01377, $BE5466CF, $34E90C6C,
  81. $C0AC29B7, $C97C50DD, $3F84D5B5, $B5470917,
  82. $9216D5D9, $8979FB1B);
  83. const
  84. bf_S: array[0..3, 0..255] of DWord =
  85. (
  86. ( $D1310BA6, $98DFB5AC, $2FFD72DB, $D01ADFB7,
  87. $B8E1AFED, $6A267E96, $BA7C9045, $F12C7F99,
  88. $24A19947, $B3916CF7, $0801F2E2, $858EFC16,
  89. $636920D8, $71574E69, $A458FEA3, $F4933D7E,
  90. $0D95748F, $728EB658, $718BCD58, $82154AEE,
  91. $7B54A41D, $C25A59B5, $9C30D539, $2AF26013,
  92. $C5D1B023, $286085F0, $CA417918, $B8DB38EF,
  93. $8E79DCB0, $603A180E, $6C9E0E8B, $B01E8A3E,
  94. $D71577C1, $BD314B27, $78AF2FDA, $55605C60,
  95. $E65525F3, $AA55AB94, $57489862, $63E81440,
  96. $55CA396A, $2AAB10B6, $B4CC5C34, $1141E8CE,
  97. $A15486AF, $7C72E993, $B3EE1411, $636FBC2A,
  98. $2BA9C55D, $741831F6, $CE5C3E16, $9B87931E,
  99. $AFD6BA33, $6C24CF5C, $7A325381, $28958677,
  100. $3B8F4898, $6B4BB9AF, $C4BFE81B, $66282193,
  101. $61D809CC, $FB21A991, $487CAC60, $5DEC8032,
  102. $EF845D5D, $E98575B1, $DC262302, $EB651B88,
  103. $23893E81, $D396ACC5, $0F6D6FF3, $83F44239,
  104. $2E0B4482, $A4842004, $69C8F04A, $9E1F9B5E,
  105. $21C66842, $F6E96C9A, $670C9C61, $ABD388F0,
  106. $6A51A0D2, $D8542F68, $960FA728, $AB5133A3,
  107. $6EEF0B6C, $137A3BE4, $BA3BF050, $7EFB2A98,
  108. $A1F1651D, $39AF0176, $66CA593E, $82430E88,
  109. $8CEE8619, $456F9FB4, $7D84A5C3, $3B8B5EBE,
  110. $E06F75D8, $85C12073, $401A449F, $56C16AA6,
  111. $4ED3AA62, $363F7706, $1BFEDF72, $429B023D,
  112. $37D0D724, $D00A1248, $DB0FEAD3, $49F1C09B,
  113. $075372C9, $80991B7B, $25D479D8, $F6E8DEF7,
  114. $E3FE501A, $B6794C3B, $976CE0BD, $04C006BA,
  115. $C1A94FB6, $409F60C4, $5E5C9EC2, $196A2463,
  116. $68FB6FAF, $3E6C53B5, $1339B2EB, $3B52EC6F,
  117. $6DFC511F, $9B30952C, $CC814544, $AF5EBD09,
  118. $BEE3D004, $DE334AFD, $660F2807, $192E4BB3,
  119. $C0CBA857, $45C8740F, $D20B5F39, $B9D3FBDB,
  120. $5579C0BD, $1A60320A, $D6A100C6, $402C7279,
  121. $679F25FE, $FB1FA3CC, $8EA5E9F8, $DB3222F8,
  122. $3C7516DF, $FD616B15, $2F501EC8, $AD0552AB,
  123. $323DB5FA, $FD238760, $53317B48, $3E00DF82,
  124. $9E5C57BB, $CA6F8CA0, $1A87562E, $DF1769DB,
  125. $D542A8F6, $287EFFC3, $AC6732C6, $8C4F5573,
  126. $695B27B0, $BBCA58C8, $E1FFA35D, $B8F011A0,
  127. $10FA3D98, $FD2183B8, $4AFCB56C, $2DD1D35B,
  128. $9A53E479, $B6F84565, $D28E49BC, $4BFB9790,
  129. $E1DDF2DA, $A4CB7E33, $62FB1341, $CEE4C6E8,
  130. $EF20CADA, $36774C01, $D07E9EFE, $2BF11FB4,
  131. $95DBDA4D, $AE909198, $EAAD8E71, $6B93D5A0,
  132. $D08ED1D0, $AFC725E0, $8E3C5B2F, $8E7594B7,
  133. $8FF6E2FB, $F2122B64, $8888B812, $900DF01C,
  134. $4FAD5EA0, $688FC31C, $D1CFF191, $B3A8C1AD,
  135. $2F2F2218, $BE0E1777, $EA752DFE, $8B021FA1,
  136. $E5A0CC0F, $B56F74E8, $18ACF3D6, $CE89E299,
  137. $B4A84FE0, $FD13E0B7, $7CC43B81, $D2ADA8D9,
  138. $165FA266, $80957705, $93CC7314, $211A1477,
  139. $E6AD2065, $77B5FA86, $C75442F5, $FB9D35CF,
  140. $EBCDAF0C, $7B3E89A0, $D6411BD3, $AE1E7E49,
  141. $00250E2D, $2071B35E, $226800BB, $57B8E0AF,
  142. $2464369B, $F009B91E, $5563911D, $59DFA6AA,
  143. $78C14389, $D95A537F, $207D5BA2, $02E5B9C5,
  144. $83260376, $6295CFA9, $11C81968, $4E734A41,
  145. $B3472DCA, $7B14A94A, $1B510052, $9A532915,
  146. $D60F573F, $BC9BC6E4, $2B60A476, $81E67400,
  147. $08BA6FB5, $571BE91F, $F296EC6B, $2A0DD915,
  148. $B6636521, $E7B9F9B6, $FF34052E, $C5855664,
  149. $53B02D5D, $A99F8FA1, $08BA4799, $6E85076A),
  150. {SECOND 256}
  151. ($4B7A70E9, $B5B32944, $DB75092E, $C4192623,
  152. $AD6EA6B0, $49A7DF7D, $9CEE60B8, $8FEDB266,
  153. $ECAA8C71, $699A17FF, $5664526C, $C2B19EE1,
  154. $193602A5, $75094C29, $A0591340, $E4183A3E,
  155. $3F54989A, $5B429D65, $6B8FE4D6, $99F73FD6,
  156. $A1D29C07, $EFE830F5, $4D2D38E6, $F0255DC1,
  157. $4CDD2086, $8470EB26, $6382E9C6, $021ECC5E,
  158. $09686B3F, $3EBAEFC9, $3C971814, $6B6A70A1,
  159. $687F3584, $52A0E286, $B79C5305, $AA500737,
  160. $3E07841C, $7FDEAE5C, $8E7D44EC, $5716F2B8,
  161. $B03ADA37, $F0500C0D, $F01C1F04, $0200B3FF,
  162. $AE0CF51A, $3CB574B2, $25837A58, $DC0921BD,
  163. $D19113F9, $7CA92FF6, $94324773, $22F54701,
  164. $3AE5E581, $37C2DADC, $C8B57634, $9AF3DDA7,
  165. $A9446146, $0FD0030E, $ECC8C73E, $A4751E41,
  166. $E238CD99, $3BEA0E2F, $3280BBA1, $183EB331,
  167. $4E548B38, $4F6DB908, $6F420D03, $F60A04BF,
  168. $2CB81290, $24977C79, $5679B072, $BCAF89AF,
  169. $DE9A771F, $D9930810, $B38BAE12, $DCCF3F2E,
  170. $5512721F, $2E6B7124, $501ADDE6, $9F84CD87,
  171. $7A584718, $7408DA17, $BC9F9ABC, $E94B7D8C,
  172. $EC7AEC3A, $DB851DFA, $63094366, $C464C3D2,
  173. $EF1C1847, $3215D908, $DD433B37, $24C2BA16,
  174. $12A14D43, $2A65C451, $50940002, $133AE4DD,
  175. $71DFF89E, $10314E55, $81AC77D6, $5F11199B,
  176. $043556F1, $D7A3C76B, $3C11183B, $5924A509,
  177. $F28FE6ED, $97F1FBFA, $9EBABF2C, $1E153C6E,
  178. $86E34570, $EAE96FB1, $860E5E0A, $5A3E2AB3,
  179. $771FE71C, $4E3D06FA, $2965DCB9, $99E71D0F,
  180. $803E89D6, $5266C825, $2E4CC978, $9C10B36A,
  181. $C6150EBA, $94E2EA78, $A5FC3C53, $1E0A2DF4,
  182. $F2F74EA7, $361D2B3D, $1939260F, $19C27960,
  183. $5223A708, $F71312B6, $EBADFE6E, $EAC31F66,
  184. $E3BC4595, $A67BC883, $B17F37D1, $018CFF28,
  185. $C332DDEF, $BE6C5AA5, $65582185, $68AB9802,
  186. $EECEA50F, $DB2F953B, $2AEF7DAD, $5B6E2F84,
  187. $1521B628, $29076170, $ECDD4775, $619F1510,
  188. $13CCA830, $EB61BD96, $0334FE1E, $AA0363CF,
  189. $B5735C90, $4C70A239, $D59E9E0B, $CBAADE14,
  190. $EECC86BC, $60622CA7, $9CAB5CAB, $B2F3846E,
  191. $648B1EAF, $19BDF0CA, $A02369B9, $655ABB50,
  192. $40685A32, $3C2AB4B3, $319EE9D5, $C021B8F7,
  193. $9B540B19, $875FA099, $95F7997E, $623D7DA8,
  194. $F837889A, $97E32D77, $11ED935F, $16681281,
  195. $0E358829, $C7E61FD6, $96DEDFA1, $7858BA99,
  196. $57F584A5, $1B227263, $9B83C3FF, $1AC24696,
  197. $CDB30AEB, $532E3054, $8FD948E4, $6DBC3128,
  198. $58EBF2EF, $34C6FFEA, $FE28ED61, $EE7C3C73,
  199. $5D4A14D9, $E864B7E3, $42105D14, $203E13E0,
  200. $45EEE2B6, $A3AAABEA, $DB6C4F15, $FACB4FD0,
  201. $C742F442, $EF6ABBB5, $654F3B1D, $41CD2105,
  202. $D81E799E, $86854DC7, $E44B476A, $3D816250,
  203. $CF62A1F2, $5B8D2646, $FC8883A0, $C1C7B6A3,
  204. $7F1524C3, $69CB7492, $47848A0B, $5692B285,
  205. $095BBF00, $AD19489D, $1462B174, $23820E00,
  206. $58428D2A, $0C55F5EA, $1DADF43E, $233F7061,
  207. $3372F092, $8D937E41, $D65FECF1, $6C223BDB,
  208. $7CDE3759, $CBEE7460, $4085F2A7, $CE77326E,
  209. $A6078084, $19F8509E, $E8EFD855, $61D99735,
  210. $A969A7AA, $C50C06C2, $5A04ABFC, $800BCADC,
  211. $9E447A2E, $C3453484, $FDD56705, $0E1E9EC9,
  212. $DB73DBD3, $105588CD, $675FDA79, $E3674340,
  213. $C5C43465, $713E38D8, $3D28F89E, $F16DFF20,
  214. $153E21E7, $8FB03D4A, $E6E39F2B, $DB83ADF7),
  215. {THIRD 256}
  216. ($E93D5A68, $948140F7, $F64C261C, $94692934,
  217. $411520F7, $7602D4F7, $BCF46B2E, $D4A20068,
  218. $D4082471, $3320F46A, $43B7D4B7, $500061AF,
  219. $1E39F62E, $97244546, $14214F74, $BF8B8840,
  220. $4D95FC1D, $96B591AF, $70F4DDD3, $66A02F45,
  221. $BFBC09EC, $03BD9785, $7FAC6DD0, $31CB8504,
  222. $96EB27B3, $55FD3941, $DA2547E6, $ABCA0A9A,
  223. $28507825, $530429F4, $0A2C86DA, $E9B66DFB,
  224. $68DC1462, $D7486900, $680EC0A4, $27A18DEE,
  225. $4F3FFEA2, $E887AD8C, $B58CE006, $7AF4D6B6,
  226. $AACE1E7C, $D3375FEC, $CE78A399, $406B2A42,
  227. $20FE9E35, $D9F385B9, $EE39D7AB, $3B124E8B,
  228. $1DC9FAF7, $4B6D1856, $26A36631, $EAE397B2,
  229. $3A6EFA74, $DD5B4332, $6841E7F7, $CA7820FB,
  230. $FB0AF54E, $D8FEB397, $454056AC, $BA489527,
  231. $55533A3A, $20838D87, $FE6BA9B7, $D096954B,
  232. $55A867BC, $A1159A58, $CCA92963, $99E1DB33,
  233. $A62A4A56, $3F3125F9, $5EF47E1C, $9029317C,
  234. $FDF8E802, $04272F70, $80BB155C, $05282CE3,
  235. $95C11548, $E4C66D22, $48C1133F, $C70F86DC,
  236. $07F9C9EE, $41041F0F, $404779A4, $5D886E17,
  237. $325F51EB, $D59BC0D1, $F2BCC18F, $41113564,
  238. $257B7834, $602A9C60, $DFF8E8A3, $1F636C1B,
  239. $0E12B4C2, $02E1329E, $AF664FD1, $CAD18115,
  240. $6B2395E0, $333E92E1, $3B240B62, $EEBEB922,
  241. $85B2A20E, $E6BA0D99, $DE720C8C, $2DA2F728,
  242. $D0127845, $95B794FD, $647D0862, $E7CCF5F0,
  243. $5449A36F, $877D48FA, $C39DFD27, $F33E8D1E,
  244. $0A476341, $992EFF74, $3A6F6EAB, $F4F8FD37,
  245. $A812DC60, $A1EBDDF8, $991BE14C, $DB6E6B0D,
  246. $C67B5510, $6D672C37, $2765D43B, $DCD0E804,
  247. $F1290DC7, $CC00FFA3, $B5390F92, $690FED0B,
  248. $667B9FFB, $CEDB7D9C, $A091CF0B, $D9155EA3,
  249. $BB132F88, $515BAD24, $7B9479BF, $763BD6EB,
  250. $37392EB3, $CC115979, $8026E297, $F42E312D,
  251. $6842ADA7, $C66A2B3B, $12754CCC, $782EF11C,
  252. $6A124237, $B79251E7, $06A1BBE6, $4BFB6350,
  253. $1A6B1018, $11CAEDFA, $3D25BDD8, $E2E1C3C9,
  254. $44421659, $0A121386, $D90CEC6E, $D5ABEA2A,
  255. $64AF674E, $DA86A85F, $BEBFE988, $64E4C3FE,
  256. $9DBC8057, $F0F7C086, $60787BF8, $6003604D,
  257. $D1FD8346, $F6381FB0, $7745AE04, $D736FCCC,
  258. $83426B33, $F01EAB71, $B0804187, $3C005E5F,
  259. $77A057BE, $BDE8AE24, $55464299, $BF582E61,
  260. $4E58F48F, $F2DDFDA2, $F474EF38, $8789BDC2,
  261. $5366F9C3, $C8B38E74, $B475F255, $46FCD9B9,
  262. $7AEB2661, $8B1DDF84, $846A0E79, $915F95E2,
  263. $466E598E, $20B45770, $8CD55591, $C902DE4C,
  264. $B90BACE1, $BB8205D0, $11A86248, $7574A99E,
  265. $B77F19B6, $E0A9DC09, $662D09A1, $C4324633,
  266. $E85A1F02, $09F0BE8C, $4A99A025, $1D6EFE10,
  267. $1AB93D1D, $0BA5A4DF, $A186F20F, $2868F169,
  268. $DCB7DA83, $573906FE, $A1E2CE9B, $4FCD7F52,
  269. $50115E01, $A70683FA, $A002B5C4, $0DE6D027,
  270. $9AF88C27, $773F8641, $C3604C06, $61A806B5,
  271. $F0177A28, $C0F586E0, $006058AA, $30DC7D62,
  272. $11E69ED7, $2338EA63, $53C2DD94, $C2C21634,
  273. $BBCBEE56, $90BCB6DE, $EBFC7DA1, $CE591D76,
  274. $6F05E409, $4B7C0188, $39720A3D, $7C927C24,
  275. $86E3725F, $724D9DB9, $1AC15BB4, $D39EB8FC,
  276. $ED545578, $08FCA5B5, $D83D7CD3, $4DAD0FC4,
  277. $1E50EF5E, $B161E6F8, $A28514D9, $6C51133C,
  278. $6FD5C7E7, $56E14EC4, $362ABFCE, $DDC6C837,
  279. $D79A3234, $92638212, $670EFA8E, $406000E0),
  280. {FOURTH 256}
  281. ($3A39CE37, $D3FAF5CF, $ABC27737, $5AC52D1B,
  282. $5CB0679E, $4FA33742, $D3822740, $99BC9BBE,
  283. $D5118E9D, $BF0F7315, $D62D1C7E, $C700C47B,
  284. $B78C1B6B, $21A19045, $B26EB1BE, $6A366EB4,
  285. $5748AB2F, $BC946E79, $C6A376D2, $6549C2C8,
  286. $530FF8EE, $468DDE7D, $D5730A1D, $4CD04DC6,
  287. $2939BBDB, $A9BA4650, $AC9526E8, $BE5EE304,
  288. $A1FAD5F0, $6A2D519A, $63EF8CE2, $9A86EE22,
  289. $C089C2B8, $43242EF6, $A51E03AA, $9CF2D0A4,
  290. $83C061BA, $9BE96A4D, $8FE51550, $BA645BD6,
  291. $2826A2F9, $A73A3AE1, $4BA99586, $EF5562E9,
  292. $C72FEFD3, $F752F7DA, $3F046F69, $77FA0A59,
  293. $80E4A915, $87B08601, $9B09E6AD, $3B3EE593,
  294. $E990FD5A, $9E34D797, $2CF0B7D9, $022B8B51,
  295. $96D5AC3A, $017DA67D, $D1CF3ED6, $7C7D2D28,
  296. $1F9F25CF, $ADF2B89B, $5AD6B472, $5A88F54C,
  297. $E029AC71, $E019A5E6, $47B0ACFD, $ED93FA9B,
  298. $E8D3C48D, $283B57CC, $F8D56629, $79132E28,
  299. $785F0191, $ED756055, $F7960E44, $E3D35E8C,
  300. $15056DD4, $88F46DBA, $03A16125, $0564F0BD,
  301. $C3EB9E15, $3C9057A2, $97271AEC, $A93A072A,
  302. $1B3F6D9B, $1E6321F5, $F59C66FB, $26DCF319,
  303. $7533D928, $B155FDF5, $03563482, $8ABA3CBB,
  304. $28517711, $C20AD9F8, $ABCC5167, $CCAD925F,
  305. $4DE81751, $3830DC8E, $379D5862, $9320F991,
  306. $EA7A90C2, $FB3E7BCE, $5121CE64, $774FBE32,
  307. $A8B6E37E, $C3293D46, $48DE5369, $6413E680,
  308. $A2AE0810, $DD6DB224, $69852DFD, $09072166,
  309. $B39A460A, $6445C0DD, $586CDECF, $1C20C8AE,
  310. $5BBEF7DD, $1B588D40, $CCD2017F, $6BB4E3BB,
  311. $DDA26A7E, $3A59FF45, $3E350A44, $BCB4CDD5,
  312. $72EACEA8, $FA6484BB, $8D6612AE, $BF3C6F47,
  313. $D29BE463, $542F5D9E, $AEC2771B, $F64E6370,
  314. $740E0D8D, $E75B1357, $F8721671, $AF537D5D,
  315. $4040CB08, $4EB4E2CC, $34D2466A, $0115AF84,
  316. $E1B00428, $95983A1D, $06B89FB4, $CE6EA048,
  317. $6F3F3B82, $3520AB82, $011A1D4B, $277227F8,
  318. $611560B1, $E7933FDC, $BB3A792B, $344525BD,
  319. $A08839E1, $51CE794B, $2F32C9B7, $A01FBAC9,
  320. $E01CC87E, $BCC7D1F6, $CF0111C3, $A1E8AAC7,
  321. $1A908749, $D44FBD9A, $D0DADECB, $D50ADA38,
  322. $0339C32A, $C6913667, $8DF9317C, $E0B12B4F,
  323. $F79E59B7, $43F5BB3A, $F2D519FF, $27D9459C,
  324. $BF97222C, $15E6FC2A, $0F91FC71, $9B941525,
  325. $FAE59361, $CEB69CEB, $C2A86459, $12BAA8D1,
  326. $B6C1075E, $E3056A0C, $10D25065, $CB03A442,
  327. $E0EC6E0E, $1698DB3B, $4C98A0BE, $3278E964,
  328. $9F1F9532, $E0D392DF, $D3A0342B, $8971F21E,
  329. $1B0A7441, $4BA3348C, $C5BE7120, $C37632D8,
  330. $DF359F8D, $9B992F2E, $E60B6F47, $0FE3F11D,
  331. $E54CDA54, $1EDAD891, $CE6279CF, $CD3E7E6F,
  332. $1618B166, $FD2C1D05, $848FD2C5, $F6FB2299,
  333. $F523F357, $A6327623, $93A83531, $56CCCD02,
  334. $ACF08162, $5A75EBB5, $6E163697, $88D273CC,
  335. $DE966292, $81B949D0, $4C50901B, $71C65614,
  336. $E6C6C7BD, $327A140A, $45E1D006, $C3F27B9A,
  337. $C9AA53FD, $62A80F00, $BB25BFE2, $35BDD2F6,
  338. $71126905, $B2040222, $B6CBCF7C, $CD769C2B,
  339. $53113EC0, $1640E3D3, $38ABBD60, $2547ADF0,
  340. $BA38209C, $F746CE76, $77AFA1C5, $20756060,
  341. $85CBFE4E, $8AE88DD8, $7AAAF9B0, $4CF9AA7E,
  342. $1948C25C, $02FB8A8C, $01C36AE4, $D6EBE1F9,
  343. $90D4F869, $A65CDEA0, $3F09252D, $C208E69F,
  344. $B74E6132, $CE77E25B, $578FDFE3, $3AC372E6)
  345. );
  346. Constructor TBlowFish.Create(Key : TBlowFishKey; KeySize : Integer);
  347. var
  348. I : Integer;
  349. J : Integer;
  350. K : Integer;
  351. Data : Cardinal;
  352. Block : TBFBlock;
  353. begin
  354. Move(bf_P, PBox, SizeOf(PBox));
  355. Move(bf_S, SBox, SizeOf(SBox));
  356. { update PArray with the key bits }
  357. J := 0;
  358. for I := 0 to (BFRounds+1) do begin
  359. Data := 0;
  360. for K := 0 to 3 do begin
  361. Data := (Data shl 8) or Key[J];
  362. Inc(J);
  363. if J >= KeySize then
  364. J := 0;
  365. end;
  366. PBox[I] := PBox[I] xor Data;
  367. end;
  368. { Encrypt all-zero block}
  369. Block[0] := 0;
  370. Block[1] := 0;
  371. I := 0;
  372. repeat
  373. Encrypt(Block);
  374. PBox[I] := Block[0];
  375. PBox[I+1] := Block[1];
  376. Inc(I, 2);
  377. until I > BFRounds+1;
  378. { Now continue with rest }
  379. for J := 0 to 3 do begin
  380. I := 0;
  381. repeat
  382. Encrypt(Block);
  383. SBox[J, I] := Block[0];
  384. SBox[J, I+1] := Block[1];
  385. Inc(I, 2);
  386. until I > 255;
  387. end;
  388. end;
  389. Function TBlowFish.F(x : Cardinal) : Cardinal;{$ifdef fpc}inline;{$endif}
  390. var
  391. a, b, c, d : Byte;
  392. y : cardinal;
  393. begin
  394. d:=x and $FF;
  395. x:=x shr 8;
  396. c:=x and $FF;
  397. x:=x shr 8;
  398. b:=x and $FF;
  399. x:=x shr 8;
  400. a:= x and $FF;
  401. Result:=Sbox[0][a]+Sbox[1][b];
  402. Result:=Result xor Sbox[2][c];
  403. Result:=Result + Sbox[3][d];
  404. end;
  405. procedure TBlowFish.Encrypt(var Block : TBFBlock);
  406. var
  407. I : Integer;
  408. xl,xr,temp : Cardinal;
  409. begin
  410. Xl:= block[0];
  411. Xr:= block[1];
  412. for i:=0 to 15 do
  413. begin
  414. Xl:=Xl xor Pbox[i];
  415. Xr:= F(Xl) xor Xr;
  416. temp:= Xl;
  417. Xl:= Xr;
  418. Xr := temp;
  419. end;
  420. temp := Xl;
  421. Xl := Xr;
  422. Xr := temp;
  423. Xr := Xr xor Pbox[16];
  424. Xl := Xl xor Pbox[17];
  425. Block[0]:=Xl;
  426. Block[1]:=Xr;
  427. end;
  428. procedure TBlowFish.Decrypt(var Block : TBFBlock);
  429. var
  430. I : Integer;
  431. xl,xr,temp : Cardinal;
  432. begin
  433. Xl:= block[0];
  434. Xr:= block[1];
  435. for i:=17 downto 2 do
  436. begin
  437. Xl := Xl xor PBox[i];
  438. Xr := F(Xl) xor Xr;
  439. temp := Xl;
  440. Xl := Xr;
  441. Xr := temp;
  442. end;
  443. temp := Xl;
  444. Xl := Xr;
  445. Xr := temp;
  446. Xr := Xr xor Pbox[1];
  447. Xl := Xl xor Pbox[0];
  448. Block[0]:=Xl;
  449. Block[1]:=Xr;
  450. end;
  451. { ---------------------------------------------------------------------
  452. TBlowFishStream
  453. ---------------------------------------------------------------------}
  454. function TBlowFishStream.GetPosition: Int64;
  455. begin
  456. Result:=FPos;
  457. end;
  458. procedure TBlowFishStream.InvalidSeek;
  459. begin
  460. raise EBlowFishError.Create(SNoSeekAllowed);
  461. end;
  462. Constructor TBlowFishStream.Create(AKey : TBlowFishkey; AKeySize : Byte; Dest: TStream);
  463. begin
  464. inherited Create(Dest);
  465. FBF:=TBlowFish.Create(AKey,AKeySize);
  466. FBufPos:=0;
  467. FPos:=0;
  468. end;
  469. constructor TBlowFishStream.Create(const KeyPhrase: String; Dest: TStream);
  470. Var
  471. KLen : Integer;
  472. K : TBlowFishKey;
  473. begin
  474. If (KeyPhrase='') then
  475. Raise EBlowFishError.Create(SErrEmptyPassPhraseNotAllowed);
  476. KLen:=Length(KeyPhrase);
  477. If KLen>56 then
  478. KLen:=56;
  479. Move(KeyPhrase[1],K,Klen);
  480. Create(K,KLen,Dest);
  481. end;
  482. Destructor TBlowFishStream.Destroy;
  483. begin
  484. FreeAndNil(FBF);
  485. Inherited;
  486. end;
  487. { ---------------------------------------------------------------------
  488. TBlowFishEncryptStream
  489. ---------------------------------------------------------------------}
  490. Destructor TBlowFishEncryptStream.Destroy;
  491. begin
  492. Flush;
  493. Inherited Destroy;
  494. end;
  495. Procedure TBlowFishEncryptStream.Flush;
  496. begin
  497. If FBufPos>0 then
  498. begin
  499. // Fill with nulls
  500. FillChar(PChar(@FData)[FBufPos],SizeOf(FData)-FBufPos,#0);
  501. FBF.EnCrypt(FData);
  502. Source.Write(FData,SizeOf(FData));
  503. FBufPos := 0;
  504. end;
  505. end;
  506. function TBlowFishEncryptStream.Write(const Buffer; Count: Longint): Longint;
  507. Var
  508. mvsize : Longint;
  509. begin
  510. Result:=0;
  511. While Count>0 do
  512. begin
  513. MVsize:=Count;
  514. If Mvsize>SizeOf(Fdata)-FBufPos then
  515. mvsize:=SizeOf(FData)-FBufPos;
  516. Move(PChar(@Buffer)[Result],PChar(@FData)[FBufPos],MVSize);
  517. If FBufPos+mvSize=Sizeof(FData) then
  518. begin
  519. // Empty buffer.
  520. FBF.Encrypt(FData);
  521. // this will raise an exception if needed.
  522. Source.Writebuffer(FData,SizeOf(FData));
  523. FBufPos:=0;
  524. end
  525. else
  526. inc(FBufPos,mvsize);
  527. Dec(Count,MvSize);
  528. Inc(Result,mvSize);
  529. end;
  530. Inc(FPos,Result);
  531. end;
  532. function TBlowFishEncryptStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
  533. begin
  534. if (Offset = 0) and (Origin = soCurrent) then
  535. Result := FPos
  536. else
  537. InvalidSeek;
  538. end;
  539. { ---------------------------------------------------------------------
  540. TBlowFishDecryptStream
  541. ---------------------------------------------------------------------}
  542. constructor TBlowFishDeCryptStream.Create(AKey: TBlowFishKey; AKeySize: Byte;
  543. Dest: TStream);
  544. begin
  545. inherited Create(AKey, AKeySize, Dest);
  546. FSourcePos0 := Source.Position;
  547. end;
  548. function TBlowFishDeCryptStream.Read(var Buffer; Count: Longint): Longint;
  549. Var
  550. mvsize : Longint;
  551. begin
  552. Result:=0;
  553. While Count>0 do
  554. begin
  555. // Empty existing buffer.
  556. If (FBufPos>0) then
  557. begin
  558. mvSize:=FBufPos;
  559. If MvSize>count then
  560. mvsize:=Count;
  561. Move(PChar(@FData)[0],PChar(@Buffer)[Result],MVSize);
  562. If ((Sizeof(FData)-MvSize)>0) then
  563. Move(PChar(@FData)[mvSize],PChar(@FData)[0],Sizeof(FData)-MvSize);
  564. Dec(Count,mvsize);
  565. Inc(Result,mvsize);
  566. FBufPos:=FBufPos-MvSize;
  567. end;
  568. // Fill buffer again if needed.
  569. If (Count>0) then
  570. Begin
  571. mvsize:=Source.Read(FData,SizeOf(FData));
  572. If mvsize>0 then
  573. begin
  574. If MvSize<SizeOf(FData) Then
  575. // Fill with nulls
  576. FillChar(PChar(@FData)[mvsize],SizeOf(FData)-mvsize,#0);
  577. FBF.Decrypt(FData);
  578. FBufPos:=SizeOf(FData);
  579. end
  580. else
  581. Count:=0; // No more data available from stream; st
  582. end;
  583. end;
  584. Inc(FPos,Result);
  585. end;
  586. function TBlowFishDeCryptStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
  587. begin
  588. if (Offset=0) and (Origin=soBeginning) then
  589. begin // support seek to beginning
  590. FBufPos:=0;
  591. FPos:=0;
  592. Source.Position := FSourcePos0;
  593. end else
  594. FakeSeekForward(Offset,TSeekOrigin(Origin),FPos);
  595. Result:=FPos;
  596. end;
  597. end.