blowfish.pp 21 KB

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