synacrypt.pas 122 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411
  1. {==============================================================================|
  2. | Project : Ararat Synapse | 001.001.000 |
  3. |==============================================================================|
  4. | Content: Encryption support |
  5. |==============================================================================|
  6. | Copyright (c)2007-2011, Lukas Gebauer |
  7. | All rights reserved. |
  8. | |
  9. | Redistribution and use in source and binary forms, with or without |
  10. | modification, are permitted provided that the following conditions are met: |
  11. | |
  12. | Redistributions of source code must retain the above copyright notice, this |
  13. | list of conditions and the following disclaimer. |
  14. | |
  15. | Redistributions in binary form must reproduce the above copyright notice, |
  16. | this list of conditions and the following disclaimer in the documentation |
  17. | and/or other materials provided with the distribution. |
  18. | |
  19. | Neither the name of Lukas Gebauer nor the names of its contributors may |
  20. | be used to endorse or promote products derived from this software without |
  21. | specific prior written permission. |
  22. | |
  23. | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
  24. | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
  25. | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
  26. | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR |
  27. | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
  28. | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
  29. | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
  30. | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
  31. | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
  32. | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
  33. | DAMAGE. |
  34. |==============================================================================|
  35. | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
  36. | Portions created by Lukas Gebauer are Copyright (c)2007-2011. |
  37. | All Rights Reserved. |
  38. | Based on work of David Barton and Eric Young |
  39. |==============================================================================|
  40. | Contributor(s): |
  41. |==============================================================================|
  42. | History: see HISTORY.HTM from distribution package |
  43. | (Found at URL: http://www.ararat.cz/synapse/) |
  44. |==============================================================================}
  45. {:@abstract(Encryption support)
  46. Implemented are DES and 3DES encryption/decryption by ECB, CBC, CFB-8bit,
  47. CFB-block, OFB and CTR methods.
  48. }
  49. {$IFDEF FPC}
  50. {$MODE DELPHI}
  51. {$ENDIF}
  52. {$Q-}
  53. {$R-}
  54. {$H+}
  55. {$IFDEF UNICODE}
  56. {$WARN IMPLICIT_STRING_CAST OFF}
  57. {$WARN IMPLICIT_STRING_CAST_LOSS OFF}
  58. {$ENDIF}
  59. unit synacrypt;
  60. interface
  61. uses
  62. SysUtils, Classes, synautil, synafpc;
  63. type
  64. {:@abstract(Implementation of common routines block ciphers (dafault size is 64-bits))
  65. Do not use this class directly, use descendants only!}
  66. TSynaBlockCipher= class(TObject)
  67. protected
  68. procedure InitKey(Key: AnsiString); virtual;
  69. function GetSize: byte; virtual;
  70. private
  71. IV, CV: AnsiString;
  72. procedure IncCounter;
  73. public
  74. {:Sets the IV to Value and performs a reset}
  75. procedure SetIV(const Value: AnsiString); virtual;
  76. {:Returns the current chaining information, not the actual IV}
  77. function GetIV: AnsiString; virtual;
  78. {:Reset any stored chaining information}
  79. procedure Reset; virtual;
  80. {:Encrypt a 64-bit block of data using the ECB method of encryption}
  81. function EncryptECB(const InData: AnsiString): AnsiString; virtual;
  82. {:Decrypt a 64-bit block of data using the ECB method of decryption}
  83. function DecryptECB(const InData: AnsiString): AnsiString; virtual;
  84. {:Encrypt data using the CBC method of encryption}
  85. function EncryptCBC(const Indata: AnsiString): AnsiString; virtual;
  86. {:Decrypt data using the CBC method of decryption}
  87. function DecryptCBC(const Indata: AnsiString): AnsiString; virtual;
  88. {:Encrypt data using the CFB (8 bit) method of encryption}
  89. function EncryptCFB8bit(const Indata: AnsiString): AnsiString; virtual;
  90. {:Decrypt data using the CFB (8 bit) method of decryption}
  91. function DecryptCFB8bit(const Indata: AnsiString): AnsiString; virtual;
  92. {:Encrypt data using the CFB (block) method of encryption}
  93. function EncryptCFBblock(const Indata: AnsiString): AnsiString; virtual;
  94. {:Decrypt data using the CFB (block) method of decryption}
  95. function DecryptCFBblock(const Indata: AnsiString): AnsiString; virtual;
  96. {:Encrypt data using the OFB method of encryption}
  97. function EncryptOFB(const Indata: AnsiString): AnsiString; virtual;
  98. {:Decrypt data using the OFB method of decryption}
  99. function DecryptOFB(const Indata: AnsiString): AnsiString; virtual;
  100. {:Encrypt data using the CTR method of encryption}
  101. function EncryptCTR(const Indata: AnsiString): AnsiString; virtual;
  102. {:Decrypt data using the CTR method of decryption}
  103. function DecryptCTR(const Indata: AnsiString): AnsiString; virtual;
  104. {:Create a encryptor/decryptor instance and initialize it by the Key.}
  105. constructor Create(Key: AnsiString);
  106. end;
  107. {:@abstract(Datatype for holding one DES key data)
  108. This data type is used internally.}
  109. TDesKeyData = array[0..31] of integer;
  110. {:@abstract(Implementation of common routines for DES encryption)
  111. Do not use this class directly, use descendants only!}
  112. TSynaCustomDes = class(TSynaBlockcipher)
  113. protected
  114. procedure DoInit(KeyB: AnsiString; var KeyData: TDesKeyData);
  115. function EncryptBlock(const InData: AnsiString; var KeyData: TDesKeyData): AnsiString;
  116. function DecryptBlock(const InData: AnsiString; var KeyData: TDesKeyData): AnsiString;
  117. end;
  118. {:@abstract(Implementation of DES encryption)}
  119. TSynaDes= class(TSynaCustomDes)
  120. protected
  121. KeyData: TDesKeyData;
  122. procedure InitKey(Key: AnsiString); override;
  123. public
  124. {:Encrypt a 64-bit block of data using the ECB method of encryption}
  125. function EncryptECB(const InData: AnsiString): AnsiString; override;
  126. {:Decrypt a 64-bit block of data using the ECB method of decryption}
  127. function DecryptECB(const InData: AnsiString): AnsiString; override;
  128. end;
  129. {:@abstract(Implementation of 3DES encryption)}
  130. TSyna3Des= class(TSynaCustomDes)
  131. protected
  132. KeyData: array[0..2] of TDesKeyData;
  133. procedure InitKey(Key: AnsiString); override;
  134. public
  135. {:Encrypt a 64-bit block of data using the ECB method of encryption}
  136. function EncryptECB(const InData: AnsiString): AnsiString; override;
  137. {:Decrypt a 64-bit block of data using the ECB method of decryption}
  138. function DecryptECB(const InData: AnsiString): AnsiString; override;
  139. end;
  140. const
  141. BC = 4;
  142. MAXROUNDS = 14;
  143. type
  144. {:@abstract(Implementation of AES encryption)}
  145. TSynaAes= class(TSynaBlockcipher)
  146. protected
  147. numrounds: FixedUInt;
  148. rk, drk: array[0..MAXROUNDS,0..7] of FixedUInt;
  149. procedure InitKey(Key: AnsiString); override;
  150. function GetSize: byte; override;
  151. public
  152. {:Encrypt a 128-bit block of data using the ECB method of encryption}
  153. function EncryptECB(const InData: AnsiString): AnsiString; override;
  154. {:Decrypt a 128-bit block of data using the ECB method of decryption}
  155. function DecryptECB(const InData: AnsiString): AnsiString; override;
  156. end;
  157. {:Call internal test of all DES encryptions. Returns @true if all is OK.}
  158. function TestDes: boolean;
  159. {:Call internal test of all 3DES encryptions. Returns @true if all is OK.}
  160. function Test3Des: boolean;
  161. {:Call internal test of all AES encryptions. Returns @true if all is OK.}
  162. function TestAes: boolean;
  163. {==============================================================================}
  164. implementation
  165. //DES consts
  166. const
  167. shifts2: array[0..15]of byte=
  168. (0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0);
  169. des_skb: array[0..7,0..63]of integer=(
  170. (
  171. (* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 *)
  172. integer($00000000),integer($00000010),integer($20000000),integer($20000010),
  173. integer($00010000),integer($00010010),integer($20010000),integer($20010010),
  174. integer($00000800),integer($00000810),integer($20000800),integer($20000810),
  175. integer($00010800),integer($00010810),integer($20010800),integer($20010810),
  176. integer($00000020),integer($00000030),integer($20000020),integer($20000030),
  177. integer($00010020),integer($00010030),integer($20010020),integer($20010030),
  178. integer($00000820),integer($00000830),integer($20000820),integer($20000830),
  179. integer($00010820),integer($00010830),integer($20010820),integer($20010830),
  180. integer($00080000),integer($00080010),integer($20080000),integer($20080010),
  181. integer($00090000),integer($00090010),integer($20090000),integer($20090010),
  182. integer($00080800),integer($00080810),integer($20080800),integer($20080810),
  183. integer($00090800),integer($00090810),integer($20090800),integer($20090810),
  184. integer($00080020),integer($00080030),integer($20080020),integer($20080030),
  185. integer($00090020),integer($00090030),integer($20090020),integer($20090030),
  186. integer($00080820),integer($00080830),integer($20080820),integer($20080830),
  187. integer($00090820),integer($00090830),integer($20090820),integer($20090830)
  188. ),(
  189. (* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 *)
  190. integer($00000000),integer($02000000),integer($00002000),integer($02002000),
  191. integer($00200000),integer($02200000),integer($00202000),integer($02202000),
  192. integer($00000004),integer($02000004),integer($00002004),integer($02002004),
  193. integer($00200004),integer($02200004),integer($00202004),integer($02202004),
  194. integer($00000400),integer($02000400),integer($00002400),integer($02002400),
  195. integer($00200400),integer($02200400),integer($00202400),integer($02202400),
  196. integer($00000404),integer($02000404),integer($00002404),integer($02002404),
  197. integer($00200404),integer($02200404),integer($00202404),integer($02202404),
  198. integer($10000000),integer($12000000),integer($10002000),integer($12002000),
  199. integer($10200000),integer($12200000),integer($10202000),integer($12202000),
  200. integer($10000004),integer($12000004),integer($10002004),integer($12002004),
  201. integer($10200004),integer($12200004),integer($10202004),integer($12202004),
  202. integer($10000400),integer($12000400),integer($10002400),integer($12002400),
  203. integer($10200400),integer($12200400),integer($10202400),integer($12202400),
  204. integer($10000404),integer($12000404),integer($10002404),integer($12002404),
  205. integer($10200404),integer($12200404),integer($10202404),integer($12202404)
  206. ),(
  207. (* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 *)
  208. integer($00000000),integer($00000001),integer($00040000),integer($00040001),
  209. integer($01000000),integer($01000001),integer($01040000),integer($01040001),
  210. integer($00000002),integer($00000003),integer($00040002),integer($00040003),
  211. integer($01000002),integer($01000003),integer($01040002),integer($01040003),
  212. integer($00000200),integer($00000201),integer($00040200),integer($00040201),
  213. integer($01000200),integer($01000201),integer($01040200),integer($01040201),
  214. integer($00000202),integer($00000203),integer($00040202),integer($00040203),
  215. integer($01000202),integer($01000203),integer($01040202),integer($01040203),
  216. integer($08000000),integer($08000001),integer($08040000),integer($08040001),
  217. integer($09000000),integer($09000001),integer($09040000),integer($09040001),
  218. integer($08000002),integer($08000003),integer($08040002),integer($08040003),
  219. integer($09000002),integer($09000003),integer($09040002),integer($09040003),
  220. integer($08000200),integer($08000201),integer($08040200),integer($08040201),
  221. integer($09000200),integer($09000201),integer($09040200),integer($09040201),
  222. integer($08000202),integer($08000203),integer($08040202),integer($08040203),
  223. integer($09000202),integer($09000203),integer($09040202),integer($09040203)
  224. ),(
  225. (* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 *)
  226. integer($00000000),integer($00100000),integer($00000100),integer($00100100),
  227. integer($00000008),integer($00100008),integer($00000108),integer($00100108),
  228. integer($00001000),integer($00101000),integer($00001100),integer($00101100),
  229. integer($00001008),integer($00101008),integer($00001108),integer($00101108),
  230. integer($04000000),integer($04100000),integer($04000100),integer($04100100),
  231. integer($04000008),integer($04100008),integer($04000108),integer($04100108),
  232. integer($04001000),integer($04101000),integer($04001100),integer($04101100),
  233. integer($04001008),integer($04101008),integer($04001108),integer($04101108),
  234. integer($00020000),integer($00120000),integer($00020100),integer($00120100),
  235. integer($00020008),integer($00120008),integer($00020108),integer($00120108),
  236. integer($00021000),integer($00121000),integer($00021100),integer($00121100),
  237. integer($00021008),integer($00121008),integer($00021108),integer($00121108),
  238. integer($04020000),integer($04120000),integer($04020100),integer($04120100),
  239. integer($04020008),integer($04120008),integer($04020108),integer($04120108),
  240. integer($04021000),integer($04121000),integer($04021100),integer($04121100),
  241. integer($04021008),integer($04121008),integer($04021108),integer($04121108)
  242. ),(
  243. (* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 *)
  244. integer($00000000),integer($10000000),integer($00010000),integer($10010000),
  245. integer($00000004),integer($10000004),integer($00010004),integer($10010004),
  246. integer($20000000),integer($30000000),integer($20010000),integer($30010000),
  247. integer($20000004),integer($30000004),integer($20010004),integer($30010004),
  248. integer($00100000),integer($10100000),integer($00110000),integer($10110000),
  249. integer($00100004),integer($10100004),integer($00110004),integer($10110004),
  250. integer($20100000),integer($30100000),integer($20110000),integer($30110000),
  251. integer($20100004),integer($30100004),integer($20110004),integer($30110004),
  252. integer($00001000),integer($10001000),integer($00011000),integer($10011000),
  253. integer($00001004),integer($10001004),integer($00011004),integer($10011004),
  254. integer($20001000),integer($30001000),integer($20011000),integer($30011000),
  255. integer($20001004),integer($30001004),integer($20011004),integer($30011004),
  256. integer($00101000),integer($10101000),integer($00111000),integer($10111000),
  257. integer($00101004),integer($10101004),integer($00111004),integer($10111004),
  258. integer($20101000),integer($30101000),integer($20111000),integer($30111000),
  259. integer($20101004),integer($30101004),integer($20111004),integer($30111004)
  260. ),(
  261. (* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 *)
  262. integer($00000000),integer($08000000),integer($00000008),integer($08000008),
  263. integer($00000400),integer($08000400),integer($00000408),integer($08000408),
  264. integer($00020000),integer($08020000),integer($00020008),integer($08020008),
  265. integer($00020400),integer($08020400),integer($00020408),integer($08020408),
  266. integer($00000001),integer($08000001),integer($00000009),integer($08000009),
  267. integer($00000401),integer($08000401),integer($00000409),integer($08000409),
  268. integer($00020001),integer($08020001),integer($00020009),integer($08020009),
  269. integer($00020401),integer($08020401),integer($00020409),integer($08020409),
  270. integer($02000000),integer($0A000000),integer($02000008),integer($0A000008),
  271. integer($02000400),integer($0A000400),integer($02000408),integer($0A000408),
  272. integer($02020000),integer($0A020000),integer($02020008),integer($0A020008),
  273. integer($02020400),integer($0A020400),integer($02020408),integer($0A020408),
  274. integer($02000001),integer($0A000001),integer($02000009),integer($0A000009),
  275. integer($02000401),integer($0A000401),integer($02000409),integer($0A000409),
  276. integer($02020001),integer($0A020001),integer($02020009),integer($0A020009),
  277. integer($02020401),integer($0A020401),integer($02020409),integer($0A020409)
  278. ),(
  279. (* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 *)
  280. integer($00000000),integer($00000100),integer($00080000),integer($00080100),
  281. integer($01000000),integer($01000100),integer($01080000),integer($01080100),
  282. integer($00000010),integer($00000110),integer($00080010),integer($00080110),
  283. integer($01000010),integer($01000110),integer($01080010),integer($01080110),
  284. integer($00200000),integer($00200100),integer($00280000),integer($00280100),
  285. integer($01200000),integer($01200100),integer($01280000),integer($01280100),
  286. integer($00200010),integer($00200110),integer($00280010),integer($00280110),
  287. integer($01200010),integer($01200110),integer($01280010),integer($01280110),
  288. integer($00000200),integer($00000300),integer($00080200),integer($00080300),
  289. integer($01000200),integer($01000300),integer($01080200),integer($01080300),
  290. integer($00000210),integer($00000310),integer($00080210),integer($00080310),
  291. integer($01000210),integer($01000310),integer($01080210),integer($01080310),
  292. integer($00200200),integer($00200300),integer($00280200),integer($00280300),
  293. integer($01200200),integer($01200300),integer($01280200),integer($01280300),
  294. integer($00200210),integer($00200310),integer($00280210),integer($00280310),
  295. integer($01200210),integer($01200310),integer($01280210),integer($01280310)
  296. ),(
  297. (* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 *)
  298. integer($00000000),integer($04000000),integer($00040000),integer($04040000),
  299. integer($00000002),integer($04000002),integer($00040002),integer($04040002),
  300. integer($00002000),integer($04002000),integer($00042000),integer($04042000),
  301. integer($00002002),integer($04002002),integer($00042002),integer($04042002),
  302. integer($00000020),integer($04000020),integer($00040020),integer($04040020),
  303. integer($00000022),integer($04000022),integer($00040022),integer($04040022),
  304. integer($00002020),integer($04002020),integer($00042020),integer($04042020),
  305. integer($00002022),integer($04002022),integer($00042022),integer($04042022),
  306. integer($00000800),integer($04000800),integer($00040800),integer($04040800),
  307. integer($00000802),integer($04000802),integer($00040802),integer($04040802),
  308. integer($00002800),integer($04002800),integer($00042800),integer($04042800),
  309. integer($00002802),integer($04002802),integer($00042802),integer($04042802),
  310. integer($00000820),integer($04000820),integer($00040820),integer($04040820),
  311. integer($00000822),integer($04000822),integer($00040822),integer($04040822),
  312. integer($00002820),integer($04002820),integer($00042820),integer($04042820),
  313. integer($00002822),integer($04002822),integer($00042822),integer($04042822)
  314. ));
  315. des_sptrans: array[0..7,0..63] of integer=(
  316. (
  317. (* nibble 0 *)
  318. integer($02080800), integer($00080000), integer($02000002), integer($02080802),
  319. integer($02000000), integer($00080802), integer($00080002), integer($02000002),
  320. integer($00080802), integer($02080800), integer($02080000), integer($00000802),
  321. integer($02000802), integer($02000000), integer($00000000), integer($00080002),
  322. integer($00080000), integer($00000002), integer($02000800), integer($00080800),
  323. integer($02080802), integer($02080000), integer($00000802), integer($02000800),
  324. integer($00000002), integer($00000800), integer($00080800), integer($02080002),
  325. integer($00000800), integer($02000802), integer($02080002), integer($00000000),
  326. integer($00000000), integer($02080802), integer($02000800), integer($00080002),
  327. integer($02080800), integer($00080000), integer($00000802), integer($02000800),
  328. integer($02080002), integer($00000800), integer($00080800), integer($02000002),
  329. integer($00080802), integer($00000002), integer($02000002), integer($02080000),
  330. integer($02080802), integer($00080800), integer($02080000), integer($02000802),
  331. integer($02000000), integer($00000802), integer($00080002), integer($00000000),
  332. integer($00080000), integer($02000000), integer($02000802), integer($02080800),
  333. integer($00000002), integer($02080002), integer($00000800), integer($00080802)
  334. ),(
  335. (* nibble 1 *)
  336. integer($40108010), integer($00000000), integer($00108000), integer($40100000),
  337. integer($40000010), integer($00008010), integer($40008000), integer($00108000),
  338. integer($00008000), integer($40100010), integer($00000010), integer($40008000),
  339. integer($00100010), integer($40108000), integer($40100000), integer($00000010),
  340. integer($00100000), integer($40008010), integer($40100010), integer($00008000),
  341. integer($00108010), integer($40000000), integer($00000000), integer($00100010),
  342. integer($40008010), integer($00108010), integer($40108000), integer($40000010),
  343. integer($40000000), integer($00100000), integer($00008010), integer($40108010),
  344. integer($00100010), integer($40108000), integer($40008000), integer($00108010),
  345. integer($40108010), integer($00100010), integer($40000010), integer($00000000),
  346. integer($40000000), integer($00008010), integer($00100000), integer($40100010),
  347. integer($00008000), integer($40000000), integer($00108010), integer($40008010),
  348. integer($40108000), integer($00008000), integer($00000000), integer($40000010),
  349. integer($00000010), integer($40108010), integer($00108000), integer($40100000),
  350. integer($40100010), integer($00100000), integer($00008010), integer($40008000),
  351. integer($40008010), integer($00000010), integer($40100000), integer($00108000)
  352. ),(
  353. (* nibble 2 *)
  354. integer($04000001), integer($04040100), integer($00000100), integer($04000101),
  355. integer($00040001), integer($04000000), integer($04000101), integer($00040100),
  356. integer($04000100), integer($00040000), integer($04040000), integer($00000001),
  357. integer($04040101), integer($00000101), integer($00000001), integer($04040001),
  358. integer($00000000), integer($00040001), integer($04040100), integer($00000100),
  359. integer($00000101), integer($04040101), integer($00040000), integer($04000001),
  360. integer($04040001), integer($04000100), integer($00040101), integer($04040000),
  361. integer($00040100), integer($00000000), integer($04000000), integer($00040101),
  362. integer($04040100), integer($00000100), integer($00000001), integer($00040000),
  363. integer($00000101), integer($00040001), integer($04040000), integer($04000101),
  364. integer($00000000), integer($04040100), integer($00040100), integer($04040001),
  365. integer($00040001), integer($04000000), integer($04040101), integer($00000001),
  366. integer($00040101), integer($04000001), integer($04000000), integer($04040101),
  367. integer($00040000), integer($04000100), integer($04000101), integer($00040100),
  368. integer($04000100), integer($00000000), integer($04040001), integer($00000101),
  369. integer($04000001), integer($00040101), integer($00000100), integer($04040000)
  370. ),(
  371. (* nibble 3 *)
  372. integer($00401008), integer($10001000), integer($00000008), integer($10401008),
  373. integer($00000000), integer($10400000), integer($10001008), integer($00400008),
  374. integer($10401000), integer($10000008), integer($10000000), integer($00001008),
  375. integer($10000008), integer($00401008), integer($00400000), integer($10000000),
  376. integer($10400008), integer($00401000), integer($00001000), integer($00000008),
  377. integer($00401000), integer($10001008), integer($10400000), integer($00001000),
  378. integer($00001008), integer($00000000), integer($00400008), integer($10401000),
  379. integer($10001000), integer($10400008), integer($10401008), integer($00400000),
  380. integer($10400008), integer($00001008), integer($00400000), integer($10000008),
  381. integer($00401000), integer($10001000), integer($00000008), integer($10400000),
  382. integer($10001008), integer($00000000), integer($00001000), integer($00400008),
  383. integer($00000000), integer($10400008), integer($10401000), integer($00001000),
  384. integer($10000000), integer($10401008), integer($00401008), integer($00400000),
  385. integer($10401008), integer($00000008), integer($10001000), integer($00401008),
  386. integer($00400008), integer($00401000), integer($10400000), integer($10001008),
  387. integer($00001008), integer($10000000), integer($10000008), integer($10401000)
  388. ),(
  389. (* nibble 4 *)
  390. integer($08000000), integer($00010000), integer($00000400), integer($08010420),
  391. integer($08010020), integer($08000400), integer($00010420), integer($08010000),
  392. integer($00010000), integer($00000020), integer($08000020), integer($00010400),
  393. integer($08000420), integer($08010020), integer($08010400), integer($00000000),
  394. integer($00010400), integer($08000000), integer($00010020), integer($00000420),
  395. integer($08000400), integer($00010420), integer($00000000), integer($08000020),
  396. integer($00000020), integer($08000420), integer($08010420), integer($00010020),
  397. integer($08010000), integer($00000400), integer($00000420), integer($08010400),
  398. integer($08010400), integer($08000420), integer($00010020), integer($08010000),
  399. integer($00010000), integer($00000020), integer($08000020), integer($08000400),
  400. integer($08000000), integer($00010400), integer($08010420), integer($00000000),
  401. integer($00010420), integer($08000000), integer($00000400), integer($00010020),
  402. integer($08000420), integer($00000400), integer($00000000), integer($08010420),
  403. integer($08010020), integer($08010400), integer($00000420), integer($00010000),
  404. integer($00010400), integer($08010020), integer($08000400), integer($00000420),
  405. integer($00000020), integer($00010420), integer($08010000), integer($08000020)
  406. ),(
  407. (* nibble 5 *)
  408. integer($80000040), integer($00200040), integer($00000000), integer($80202000),
  409. integer($00200040), integer($00002000), integer($80002040), integer($00200000),
  410. integer($00002040), integer($80202040), integer($00202000), integer($80000000),
  411. integer($80002000), integer($80000040), integer($80200000), integer($00202040),
  412. integer($00200000), integer($80002040), integer($80200040), integer($00000000),
  413. integer($00002000), integer($00000040), integer($80202000), integer($80200040),
  414. integer($80202040), integer($80200000), integer($80000000), integer($00002040),
  415. integer($00000040), integer($00202000), integer($00202040), integer($80002000),
  416. integer($00002040), integer($80000000), integer($80002000), integer($00202040),
  417. integer($80202000), integer($00200040), integer($00000000), integer($80002000),
  418. integer($80000000), integer($00002000), integer($80200040), integer($00200000),
  419. integer($00200040), integer($80202040), integer($00202000), integer($00000040),
  420. integer($80202040), integer($00202000), integer($00200000), integer($80002040),
  421. integer($80000040), integer($80200000), integer($00202040), integer($00000000),
  422. integer($00002000), integer($80000040), integer($80002040), integer($80202000),
  423. integer($80200000), integer($00002040), integer($00000040), integer($80200040)
  424. ),(
  425. (* nibble 6 *)
  426. integer($00004000), integer($00000200), integer($01000200), integer($01000004),
  427. integer($01004204), integer($00004004), integer($00004200), integer($00000000),
  428. integer($01000000), integer($01000204), integer($00000204), integer($01004000),
  429. integer($00000004), integer($01004200), integer($01004000), integer($00000204),
  430. integer($01000204), integer($00004000), integer($00004004), integer($01004204),
  431. integer($00000000), integer($01000200), integer($01000004), integer($00004200),
  432. integer($01004004), integer($00004204), integer($01004200), integer($00000004),
  433. integer($00004204), integer($01004004), integer($00000200), integer($01000000),
  434. integer($00004204), integer($01004000), integer($01004004), integer($00000204),
  435. integer($00004000), integer($00000200), integer($01000000), integer($01004004),
  436. integer($01000204), integer($00004204), integer($00004200), integer($00000000),
  437. integer($00000200), integer($01000004), integer($00000004), integer($01000200),
  438. integer($00000000), integer($01000204), integer($01000200), integer($00004200),
  439. integer($00000204), integer($00004000), integer($01004204), integer($01000000),
  440. integer($01004200), integer($00000004), integer($00004004), integer($01004204),
  441. integer($01000004), integer($01004200), integer($01004000), integer($00004004)
  442. ),(
  443. (* nibble 7 *)
  444. integer($20800080), integer($20820000), integer($00020080), integer($00000000),
  445. integer($20020000), integer($00800080), integer($20800000), integer($20820080),
  446. integer($00000080), integer($20000000), integer($00820000), integer($00020080),
  447. integer($00820080), integer($20020080), integer($20000080), integer($20800000),
  448. integer($00020000), integer($00820080), integer($00800080), integer($20020000),
  449. integer($20820080), integer($20000080), integer($00000000), integer($00820000),
  450. integer($20000000), integer($00800000), integer($20020080), integer($20800080),
  451. integer($00800000), integer($00020000), integer($20820000), integer($00000080),
  452. integer($00800000), integer($00020000), integer($20000080), integer($20820080),
  453. integer($00020080), integer($20000000), integer($00000000), integer($00820000),
  454. integer($20800080), integer($20020080), integer($20020000), integer($00800080),
  455. integer($20820000), integer($00000080), integer($00800080), integer($20020000),
  456. integer($20820080), integer($00800000), integer($20800000), integer($20000080),
  457. integer($00820000), integer($00020080), integer($20020080), integer($20800000),
  458. integer($00000080), integer($20820000), integer($00820080), integer($00000000),
  459. integer($20000000), integer($20800080), integer($00020000), integer($00820080)
  460. ));
  461. //AES consts
  462. const
  463. MAXBC= 8;
  464. MAXKC= 8;
  465. S: array[0..255] of byte= (
  466. 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118,
  467. 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
  468. 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21,
  469. 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117,
  470. 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132,
  471. 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207,
  472. 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168,
  473. 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210,
  474. 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115,
  475. 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219,
  476. 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121,
  477. 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8,
  478. 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138,
  479. 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158,
  480. 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
  481. 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22);
  482. T1: array[0..255,0..3] of byte= (
  483. ($c6,$63,$63,$a5), ($f8,$7c,$7c,$84), ($ee,$77,$77,$99), ($f6,$7b,$7b,$8d),
  484. ($ff,$f2,$f2,$0d), ($d6,$6b,$6b,$bd), ($de,$6f,$6f,$b1), ($91,$c5,$c5,$54),
  485. ($60,$30,$30,$50), ($02,$01,$01,$03), ($ce,$67,$67,$a9), ($56,$2b,$2b,$7d),
  486. ($e7,$fe,$fe,$19), ($b5,$d7,$d7,$62), ($4d,$ab,$ab,$e6), ($ec,$76,$76,$9a),
  487. ($8f,$ca,$ca,$45), ($1f,$82,$82,$9d), ($89,$c9,$c9,$40), ($fa,$7d,$7d,$87),
  488. ($ef,$fa,$fa,$15), ($b2,$59,$59,$eb), ($8e,$47,$47,$c9), ($fb,$f0,$f0,$0b),
  489. ($41,$ad,$ad,$ec), ($b3,$d4,$d4,$67), ($5f,$a2,$a2,$fd), ($45,$af,$af,$ea),
  490. ($23,$9c,$9c,$bf), ($53,$a4,$a4,$f7), ($e4,$72,$72,$96), ($9b,$c0,$c0,$5b),
  491. ($75,$b7,$b7,$c2), ($e1,$fd,$fd,$1c), ($3d,$93,$93,$ae), ($4c,$26,$26,$6a),
  492. ($6c,$36,$36,$5a), ($7e,$3f,$3f,$41), ($f5,$f7,$f7,$02), ($83,$cc,$cc,$4f),
  493. ($68,$34,$34,$5c), ($51,$a5,$a5,$f4), ($d1,$e5,$e5,$34), ($f9,$f1,$f1,$08),
  494. ($e2,$71,$71,$93), ($ab,$d8,$d8,$73), ($62,$31,$31,$53), ($2a,$15,$15,$3f),
  495. ($08,$04,$04,$0c), ($95,$c7,$c7,$52), ($46,$23,$23,$65), ($9d,$c3,$c3,$5e),
  496. ($30,$18,$18,$28), ($37,$96,$96,$a1), ($0a,$05,$05,$0f), ($2f,$9a,$9a,$b5),
  497. ($0e,$07,$07,$09), ($24,$12,$12,$36), ($1b,$80,$80,$9b), ($df,$e2,$e2,$3d),
  498. ($cd,$eb,$eb,$26), ($4e,$27,$27,$69), ($7f,$b2,$b2,$cd), ($ea,$75,$75,$9f),
  499. ($12,$09,$09,$1b), ($1d,$83,$83,$9e), ($58,$2c,$2c,$74), ($34,$1a,$1a,$2e),
  500. ($36,$1b,$1b,$2d), ($dc,$6e,$6e,$b2), ($b4,$5a,$5a,$ee), ($5b,$a0,$a0,$fb),
  501. ($a4,$52,$52,$f6), ($76,$3b,$3b,$4d), ($b7,$d6,$d6,$61), ($7d,$b3,$b3,$ce),
  502. ($52,$29,$29,$7b), ($dd,$e3,$e3,$3e), ($5e,$2f,$2f,$71), ($13,$84,$84,$97),
  503. ($a6,$53,$53,$f5), ($b9,$d1,$d1,$68), ($00,$00,$00,$00), ($c1,$ed,$ed,$2c),
  504. ($40,$20,$20,$60), ($e3,$fc,$fc,$1f), ($79,$b1,$b1,$c8), ($b6,$5b,$5b,$ed),
  505. ($d4,$6a,$6a,$be), ($8d,$cb,$cb,$46), ($67,$be,$be,$d9), ($72,$39,$39,$4b),
  506. ($94,$4a,$4a,$de), ($98,$4c,$4c,$d4), ($b0,$58,$58,$e8), ($85,$cf,$cf,$4a),
  507. ($bb,$d0,$d0,$6b), ($c5,$ef,$ef,$2a), ($4f,$aa,$aa,$e5), ($ed,$fb,$fb,$16),
  508. ($86,$43,$43,$c5), ($9a,$4d,$4d,$d7), ($66,$33,$33,$55), ($11,$85,$85,$94),
  509. ($8a,$45,$45,$cf), ($e9,$f9,$f9,$10), ($04,$02,$02,$06), ($fe,$7f,$7f,$81),
  510. ($a0,$50,$50,$f0), ($78,$3c,$3c,$44), ($25,$9f,$9f,$ba), ($4b,$a8,$a8,$e3),
  511. ($a2,$51,$51,$f3), ($5d,$a3,$a3,$fe), ($80,$40,$40,$c0), ($05,$8f,$8f,$8a),
  512. ($3f,$92,$92,$ad), ($21,$9d,$9d,$bc), ($70,$38,$38,$48), ($f1,$f5,$f5,$04),
  513. ($63,$bc,$bc,$df), ($77,$b6,$b6,$c1), ($af,$da,$da,$75), ($42,$21,$21,$63),
  514. ($20,$10,$10,$30), ($e5,$ff,$ff,$1a), ($fd,$f3,$f3,$0e), ($bf,$d2,$d2,$6d),
  515. ($81,$cd,$cd,$4c), ($18,$0c,$0c,$14), ($26,$13,$13,$35), ($c3,$ec,$ec,$2f),
  516. ($be,$5f,$5f,$e1), ($35,$97,$97,$a2), ($88,$44,$44,$cc), ($2e,$17,$17,$39),
  517. ($93,$c4,$c4,$57), ($55,$a7,$a7,$f2), ($fc,$7e,$7e,$82), ($7a,$3d,$3d,$47),
  518. ($c8,$64,$64,$ac), ($ba,$5d,$5d,$e7), ($32,$19,$19,$2b), ($e6,$73,$73,$95),
  519. ($c0,$60,$60,$a0), ($19,$81,$81,$98), ($9e,$4f,$4f,$d1), ($a3,$dc,$dc,$7f),
  520. ($44,$22,$22,$66), ($54,$2a,$2a,$7e), ($3b,$90,$90,$ab), ($0b,$88,$88,$83),
  521. ($8c,$46,$46,$ca), ($c7,$ee,$ee,$29), ($6b,$b8,$b8,$d3), ($28,$14,$14,$3c),
  522. ($a7,$de,$de,$79), ($bc,$5e,$5e,$e2), ($16,$0b,$0b,$1d), ($ad,$db,$db,$76),
  523. ($db,$e0,$e0,$3b), ($64,$32,$32,$56), ($74,$3a,$3a,$4e), ($14,$0a,$0a,$1e),
  524. ($92,$49,$49,$db), ($0c,$06,$06,$0a), ($48,$24,$24,$6c), ($b8,$5c,$5c,$e4),
  525. ($9f,$c2,$c2,$5d), ($bd,$d3,$d3,$6e), ($43,$ac,$ac,$ef), ($c4,$62,$62,$a6),
  526. ($39,$91,$91,$a8), ($31,$95,$95,$a4), ($d3,$e4,$e4,$37), ($f2,$79,$79,$8b),
  527. ($d5,$e7,$e7,$32), ($8b,$c8,$c8,$43), ($6e,$37,$37,$59), ($da,$6d,$6d,$b7),
  528. ($01,$8d,$8d,$8c), ($b1,$d5,$d5,$64), ($9c,$4e,$4e,$d2), ($49,$a9,$a9,$e0),
  529. ($d8,$6c,$6c,$b4), ($ac,$56,$56,$fa), ($f3,$f4,$f4,$07), ($cf,$ea,$ea,$25),
  530. ($ca,$65,$65,$af), ($f4,$7a,$7a,$8e), ($47,$ae,$ae,$e9), ($10,$08,$08,$18),
  531. ($6f,$ba,$ba,$d5), ($f0,$78,$78,$88), ($4a,$25,$25,$6f), ($5c,$2e,$2e,$72),
  532. ($38,$1c,$1c,$24), ($57,$a6,$a6,$f1), ($73,$b4,$b4,$c7), ($97,$c6,$c6,$51),
  533. ($cb,$e8,$e8,$23), ($a1,$dd,$dd,$7c), ($e8,$74,$74,$9c), ($3e,$1f,$1f,$21),
  534. ($96,$4b,$4b,$dd), ($61,$bd,$bd,$dc), ($0d,$8b,$8b,$86), ($0f,$8a,$8a,$85),
  535. ($e0,$70,$70,$90), ($7c,$3e,$3e,$42), ($71,$b5,$b5,$c4), ($cc,$66,$66,$aa),
  536. ($90,$48,$48,$d8), ($06,$03,$03,$05), ($f7,$f6,$f6,$01), ($1c,$0e,$0e,$12),
  537. ($c2,$61,$61,$a3), ($6a,$35,$35,$5f), ($ae,$57,$57,$f9), ($69,$b9,$b9,$d0),
  538. ($17,$86,$86,$91), ($99,$c1,$c1,$58), ($3a,$1d,$1d,$27), ($27,$9e,$9e,$b9),
  539. ($d9,$e1,$e1,$38), ($eb,$f8,$f8,$13), ($2b,$98,$98,$b3), ($22,$11,$11,$33),
  540. ($d2,$69,$69,$bb), ($a9,$d9,$d9,$70), ($07,$8e,$8e,$89), ($33,$94,$94,$a7),
  541. ($2d,$9b,$9b,$b6), ($3c,$1e,$1e,$22), ($15,$87,$87,$92), ($c9,$e9,$e9,$20),
  542. ($87,$ce,$ce,$49), ($aa,$55,$55,$ff), ($50,$28,$28,$78), ($a5,$df,$df,$7a),
  543. ($03,$8c,$8c,$8f), ($59,$a1,$a1,$f8), ($09,$89,$89,$80), ($1a,$0d,$0d,$17),
  544. ($65,$bf,$bf,$da), ($d7,$e6,$e6,$31), ($84,$42,$42,$c6), ($d0,$68,$68,$b8),
  545. ($82,$41,$41,$c3), ($29,$99,$99,$b0), ($5a,$2d,$2d,$77), ($1e,$0f,$0f,$11),
  546. ($7b,$b0,$b0,$cb), ($a8,$54,$54,$fc), ($6d,$bb,$bb,$d6), ($2c,$16,$16,$3a));
  547. T2: array[0..255,0..3] of byte= (
  548. ($a5,$c6,$63,$63), ($84,$f8,$7c,$7c), ($99,$ee,$77,$77), ($8d,$f6,$7b,$7b),
  549. ($0d,$ff,$f2,$f2), ($bd,$d6,$6b,$6b), ($b1,$de,$6f,$6f), ($54,$91,$c5,$c5),
  550. ($50,$60,$30,$30), ($03,$02,$01,$01), ($a9,$ce,$67,$67), ($7d,$56,$2b,$2b),
  551. ($19,$e7,$fe,$fe), ($62,$b5,$d7,$d7), ($e6,$4d,$ab,$ab), ($9a,$ec,$76,$76),
  552. ($45,$8f,$ca,$ca), ($9d,$1f,$82,$82), ($40,$89,$c9,$c9), ($87,$fa,$7d,$7d),
  553. ($15,$ef,$fa,$fa), ($eb,$b2,$59,$59), ($c9,$8e,$47,$47), ($0b,$fb,$f0,$f0),
  554. ($ec,$41,$ad,$ad), ($67,$b3,$d4,$d4), ($fd,$5f,$a2,$a2), ($ea,$45,$af,$af),
  555. ($bf,$23,$9c,$9c), ($f7,$53,$a4,$a4), ($96,$e4,$72,$72), ($5b,$9b,$c0,$c0),
  556. ($c2,$75,$b7,$b7), ($1c,$e1,$fd,$fd), ($ae,$3d,$93,$93), ($6a,$4c,$26,$26),
  557. ($5a,$6c,$36,$36), ($41,$7e,$3f,$3f), ($02,$f5,$f7,$f7), ($4f,$83,$cc,$cc),
  558. ($5c,$68,$34,$34), ($f4,$51,$a5,$a5), ($34,$d1,$e5,$e5), ($08,$f9,$f1,$f1),
  559. ($93,$e2,$71,$71), ($73,$ab,$d8,$d8), ($53,$62,$31,$31), ($3f,$2a,$15,$15),
  560. ($0c,$08,$04,$04), ($52,$95,$c7,$c7), ($65,$46,$23,$23), ($5e,$9d,$c3,$c3),
  561. ($28,$30,$18,$18), ($a1,$37,$96,$96), ($0f,$0a,$05,$05), ($b5,$2f,$9a,$9a),
  562. ($09,$0e,$07,$07), ($36,$24,$12,$12), ($9b,$1b,$80,$80), ($3d,$df,$e2,$e2),
  563. ($26,$cd,$eb,$eb), ($69,$4e,$27,$27), ($cd,$7f,$b2,$b2), ($9f,$ea,$75,$75),
  564. ($1b,$12,$09,$09), ($9e,$1d,$83,$83), ($74,$58,$2c,$2c), ($2e,$34,$1a,$1a),
  565. ($2d,$36,$1b,$1b), ($b2,$dc,$6e,$6e), ($ee,$b4,$5a,$5a), ($fb,$5b,$a0,$a0),
  566. ($f6,$a4,$52,$52), ($4d,$76,$3b,$3b), ($61,$b7,$d6,$d6), ($ce,$7d,$b3,$b3),
  567. ($7b,$52,$29,$29), ($3e,$dd,$e3,$e3), ($71,$5e,$2f,$2f), ($97,$13,$84,$84),
  568. ($f5,$a6,$53,$53), ($68,$b9,$d1,$d1), ($00,$00,$00,$00), ($2c,$c1,$ed,$ed),
  569. ($60,$40,$20,$20), ($1f,$e3,$fc,$fc), ($c8,$79,$b1,$b1), ($ed,$b6,$5b,$5b),
  570. ($be,$d4,$6a,$6a), ($46,$8d,$cb,$cb), ($d9,$67,$be,$be), ($4b,$72,$39,$39),
  571. ($de,$94,$4a,$4a), ($d4,$98,$4c,$4c), ($e8,$b0,$58,$58), ($4a,$85,$cf,$cf),
  572. ($6b,$bb,$d0,$d0), ($2a,$c5,$ef,$ef), ($e5,$4f,$aa,$aa), ($16,$ed,$fb,$fb),
  573. ($c5,$86,$43,$43), ($d7,$9a,$4d,$4d), ($55,$66,$33,$33), ($94,$11,$85,$85),
  574. ($cf,$8a,$45,$45), ($10,$e9,$f9,$f9), ($06,$04,$02,$02), ($81,$fe,$7f,$7f),
  575. ($f0,$a0,$50,$50), ($44,$78,$3c,$3c), ($ba,$25,$9f,$9f), ($e3,$4b,$a8,$a8),
  576. ($f3,$a2,$51,$51), ($fe,$5d,$a3,$a3), ($c0,$80,$40,$40), ($8a,$05,$8f,$8f),
  577. ($ad,$3f,$92,$92), ($bc,$21,$9d,$9d), ($48,$70,$38,$38), ($04,$f1,$f5,$f5),
  578. ($df,$63,$bc,$bc), ($c1,$77,$b6,$b6), ($75,$af,$da,$da), ($63,$42,$21,$21),
  579. ($30,$20,$10,$10), ($1a,$e5,$ff,$ff), ($0e,$fd,$f3,$f3), ($6d,$bf,$d2,$d2),
  580. ($4c,$81,$cd,$cd), ($14,$18,$0c,$0c), ($35,$26,$13,$13), ($2f,$c3,$ec,$ec),
  581. ($e1,$be,$5f,$5f), ($a2,$35,$97,$97), ($cc,$88,$44,$44), ($39,$2e,$17,$17),
  582. ($57,$93,$c4,$c4), ($f2,$55,$a7,$a7), ($82,$fc,$7e,$7e), ($47,$7a,$3d,$3d),
  583. ($ac,$c8,$64,$64), ($e7,$ba,$5d,$5d), ($2b,$32,$19,$19), ($95,$e6,$73,$73),
  584. ($a0,$c0,$60,$60), ($98,$19,$81,$81), ($d1,$9e,$4f,$4f), ($7f,$a3,$dc,$dc),
  585. ($66,$44,$22,$22), ($7e,$54,$2a,$2a), ($ab,$3b,$90,$90), ($83,$0b,$88,$88),
  586. ($ca,$8c,$46,$46), ($29,$c7,$ee,$ee), ($d3,$6b,$b8,$b8), ($3c,$28,$14,$14),
  587. ($79,$a7,$de,$de), ($e2,$bc,$5e,$5e), ($1d,$16,$0b,$0b), ($76,$ad,$db,$db),
  588. ($3b,$db,$e0,$e0), ($56,$64,$32,$32), ($4e,$74,$3a,$3a), ($1e,$14,$0a,$0a),
  589. ($db,$92,$49,$49), ($0a,$0c,$06,$06), ($6c,$48,$24,$24), ($e4,$b8,$5c,$5c),
  590. ($5d,$9f,$c2,$c2), ($6e,$bd,$d3,$d3), ($ef,$43,$ac,$ac), ($a6,$c4,$62,$62),
  591. ($a8,$39,$91,$91), ($a4,$31,$95,$95), ($37,$d3,$e4,$e4), ($8b,$f2,$79,$79),
  592. ($32,$d5,$e7,$e7), ($43,$8b,$c8,$c8), ($59,$6e,$37,$37), ($b7,$da,$6d,$6d),
  593. ($8c,$01,$8d,$8d), ($64,$b1,$d5,$d5), ($d2,$9c,$4e,$4e), ($e0,$49,$a9,$a9),
  594. ($b4,$d8,$6c,$6c), ($fa,$ac,$56,$56), ($07,$f3,$f4,$f4), ($25,$cf,$ea,$ea),
  595. ($af,$ca,$65,$65), ($8e,$f4,$7a,$7a), ($e9,$47,$ae,$ae), ($18,$10,$08,$08),
  596. ($d5,$6f,$ba,$ba), ($88,$f0,$78,$78), ($6f,$4a,$25,$25), ($72,$5c,$2e,$2e),
  597. ($24,$38,$1c,$1c), ($f1,$57,$a6,$a6), ($c7,$73,$b4,$b4), ($51,$97,$c6,$c6),
  598. ($23,$cb,$e8,$e8), ($7c,$a1,$dd,$dd), ($9c,$e8,$74,$74), ($21,$3e,$1f,$1f),
  599. ($dd,$96,$4b,$4b), ($dc,$61,$bd,$bd), ($86,$0d,$8b,$8b), ($85,$0f,$8a,$8a),
  600. ($90,$e0,$70,$70), ($42,$7c,$3e,$3e), ($c4,$71,$b5,$b5), ($aa,$cc,$66,$66),
  601. ($d8,$90,$48,$48), ($05,$06,$03,$03), ($01,$f7,$f6,$f6), ($12,$1c,$0e,$0e),
  602. ($a3,$c2,$61,$61), ($5f,$6a,$35,$35), ($f9,$ae,$57,$57), ($d0,$69,$b9,$b9),
  603. ($91,$17,$86,$86), ($58,$99,$c1,$c1), ($27,$3a,$1d,$1d), ($b9,$27,$9e,$9e),
  604. ($38,$d9,$e1,$e1), ($13,$eb,$f8,$f8), ($b3,$2b,$98,$98), ($33,$22,$11,$11),
  605. ($bb,$d2,$69,$69), ($70,$a9,$d9,$d9), ($89,$07,$8e,$8e), ($a7,$33,$94,$94),
  606. ($b6,$2d,$9b,$9b), ($22,$3c,$1e,$1e), ($92,$15,$87,$87), ($20,$c9,$e9,$e9),
  607. ($49,$87,$ce,$ce), ($ff,$aa,$55,$55), ($78,$50,$28,$28), ($7a,$a5,$df,$df),
  608. ($8f,$03,$8c,$8c), ($f8,$59,$a1,$a1), ($80,$09,$89,$89), ($17,$1a,$0d,$0d),
  609. ($da,$65,$bf,$bf), ($31,$d7,$e6,$e6), ($c6,$84,$42,$42), ($b8,$d0,$68,$68),
  610. ($c3,$82,$41,$41), ($b0,$29,$99,$99), ($77,$5a,$2d,$2d), ($11,$1e,$0f,$0f),
  611. ($cb,$7b,$b0,$b0), ($fc,$a8,$54,$54), ($d6,$6d,$bb,$bb), ($3a,$2c,$16,$16));
  612. T3: array[0..255,0..3] of byte= (
  613. ($63,$a5,$c6,$63), ($7c,$84,$f8,$7c), ($77,$99,$ee,$77), ($7b,$8d,$f6,$7b),
  614. ($f2,$0d,$ff,$f2), ($6b,$bd,$d6,$6b), ($6f,$b1,$de,$6f), ($c5,$54,$91,$c5),
  615. ($30,$50,$60,$30), ($01,$03,$02,$01), ($67,$a9,$ce,$67), ($2b,$7d,$56,$2b),
  616. ($fe,$19,$e7,$fe), ($d7,$62,$b5,$d7), ($ab,$e6,$4d,$ab), ($76,$9a,$ec,$76),
  617. ($ca,$45,$8f,$ca), ($82,$9d,$1f,$82), ($c9,$40,$89,$c9), ($7d,$87,$fa,$7d),
  618. ($fa,$15,$ef,$fa), ($59,$eb,$b2,$59), ($47,$c9,$8e,$47), ($f0,$0b,$fb,$f0),
  619. ($ad,$ec,$41,$ad), ($d4,$67,$b3,$d4), ($a2,$fd,$5f,$a2), ($af,$ea,$45,$af),
  620. ($9c,$bf,$23,$9c), ($a4,$f7,$53,$a4), ($72,$96,$e4,$72), ($c0,$5b,$9b,$c0),
  621. ($b7,$c2,$75,$b7), ($fd,$1c,$e1,$fd), ($93,$ae,$3d,$93), ($26,$6a,$4c,$26),
  622. ($36,$5a,$6c,$36), ($3f,$41,$7e,$3f), ($f7,$02,$f5,$f7), ($cc,$4f,$83,$cc),
  623. ($34,$5c,$68,$34), ($a5,$f4,$51,$a5), ($e5,$34,$d1,$e5), ($f1,$08,$f9,$f1),
  624. ($71,$93,$e2,$71), ($d8,$73,$ab,$d8), ($31,$53,$62,$31), ($15,$3f,$2a,$15),
  625. ($04,$0c,$08,$04), ($c7,$52,$95,$c7), ($23,$65,$46,$23), ($c3,$5e,$9d,$c3),
  626. ($18,$28,$30,$18), ($96,$a1,$37,$96), ($05,$0f,$0a,$05), ($9a,$b5,$2f,$9a),
  627. ($07,$09,$0e,$07), ($12,$36,$24,$12), ($80,$9b,$1b,$80), ($e2,$3d,$df,$e2),
  628. ($eb,$26,$cd,$eb), ($27,$69,$4e,$27), ($b2,$cd,$7f,$b2), ($75,$9f,$ea,$75),
  629. ($09,$1b,$12,$09), ($83,$9e,$1d,$83), ($2c,$74,$58,$2c), ($1a,$2e,$34,$1a),
  630. ($1b,$2d,$36,$1b), ($6e,$b2,$dc,$6e), ($5a,$ee,$b4,$5a), ($a0,$fb,$5b,$a0),
  631. ($52,$f6,$a4,$52), ($3b,$4d,$76,$3b), ($d6,$61,$b7,$d6), ($b3,$ce,$7d,$b3),
  632. ($29,$7b,$52,$29), ($e3,$3e,$dd,$e3), ($2f,$71,$5e,$2f), ($84,$97,$13,$84),
  633. ($53,$f5,$a6,$53), ($d1,$68,$b9,$d1), ($00,$00,$00,$00), ($ed,$2c,$c1,$ed),
  634. ($20,$60,$40,$20), ($fc,$1f,$e3,$fc), ($b1,$c8,$79,$b1), ($5b,$ed,$b6,$5b),
  635. ($6a,$be,$d4,$6a), ($cb,$46,$8d,$cb), ($be,$d9,$67,$be), ($39,$4b,$72,$39),
  636. ($4a,$de,$94,$4a), ($4c,$d4,$98,$4c), ($58,$e8,$b0,$58), ($cf,$4a,$85,$cf),
  637. ($d0,$6b,$bb,$d0), ($ef,$2a,$c5,$ef), ($aa,$e5,$4f,$aa), ($fb,$16,$ed,$fb),
  638. ($43,$c5,$86,$43), ($4d,$d7,$9a,$4d), ($33,$55,$66,$33), ($85,$94,$11,$85),
  639. ($45,$cf,$8a,$45), ($f9,$10,$e9,$f9), ($02,$06,$04,$02), ($7f,$81,$fe,$7f),
  640. ($50,$f0,$a0,$50), ($3c,$44,$78,$3c), ($9f,$ba,$25,$9f), ($a8,$e3,$4b,$a8),
  641. ($51,$f3,$a2,$51), ($a3,$fe,$5d,$a3), ($40,$c0,$80,$40), ($8f,$8a,$05,$8f),
  642. ($92,$ad,$3f,$92), ($9d,$bc,$21,$9d), ($38,$48,$70,$38), ($f5,$04,$f1,$f5),
  643. ($bc,$df,$63,$bc), ($b6,$c1,$77,$b6), ($da,$75,$af,$da), ($21,$63,$42,$21),
  644. ($10,$30,$20,$10), ($ff,$1a,$e5,$ff), ($f3,$0e,$fd,$f3), ($d2,$6d,$bf,$d2),
  645. ($cd,$4c,$81,$cd), ($0c,$14,$18,$0c), ($13,$35,$26,$13), ($ec,$2f,$c3,$ec),
  646. ($5f,$e1,$be,$5f), ($97,$a2,$35,$97), ($44,$cc,$88,$44), ($17,$39,$2e,$17),
  647. ($c4,$57,$93,$c4), ($a7,$f2,$55,$a7), ($7e,$82,$fc,$7e), ($3d,$47,$7a,$3d),
  648. ($64,$ac,$c8,$64), ($5d,$e7,$ba,$5d), ($19,$2b,$32,$19), ($73,$95,$e6,$73),
  649. ($60,$a0,$c0,$60), ($81,$98,$19,$81), ($4f,$d1,$9e,$4f), ($dc,$7f,$a3,$dc),
  650. ($22,$66,$44,$22), ($2a,$7e,$54,$2a), ($90,$ab,$3b,$90), ($88,$83,$0b,$88),
  651. ($46,$ca,$8c,$46), ($ee,$29,$c7,$ee), ($b8,$d3,$6b,$b8), ($14,$3c,$28,$14),
  652. ($de,$79,$a7,$de), ($5e,$e2,$bc,$5e), ($0b,$1d,$16,$0b), ($db,$76,$ad,$db),
  653. ($e0,$3b,$db,$e0), ($32,$56,$64,$32), ($3a,$4e,$74,$3a), ($0a,$1e,$14,$0a),
  654. ($49,$db,$92,$49), ($06,$0a,$0c,$06), ($24,$6c,$48,$24), ($5c,$e4,$b8,$5c),
  655. ($c2,$5d,$9f,$c2), ($d3,$6e,$bd,$d3), ($ac,$ef,$43,$ac), ($62,$a6,$c4,$62),
  656. ($91,$a8,$39,$91), ($95,$a4,$31,$95), ($e4,$37,$d3,$e4), ($79,$8b,$f2,$79),
  657. ($e7,$32,$d5,$e7), ($c8,$43,$8b,$c8), ($37,$59,$6e,$37), ($6d,$b7,$da,$6d),
  658. ($8d,$8c,$01,$8d), ($d5,$64,$b1,$d5), ($4e,$d2,$9c,$4e), ($a9,$e0,$49,$a9),
  659. ($6c,$b4,$d8,$6c), ($56,$fa,$ac,$56), ($f4,$07,$f3,$f4), ($ea,$25,$cf,$ea),
  660. ($65,$af,$ca,$65), ($7a,$8e,$f4,$7a), ($ae,$e9,$47,$ae), ($08,$18,$10,$08),
  661. ($ba,$d5,$6f,$ba), ($78,$88,$f0,$78), ($25,$6f,$4a,$25), ($2e,$72,$5c,$2e),
  662. ($1c,$24,$38,$1c), ($a6,$f1,$57,$a6), ($b4,$c7,$73,$b4), ($c6,$51,$97,$c6),
  663. ($e8,$23,$cb,$e8), ($dd,$7c,$a1,$dd), ($74,$9c,$e8,$74), ($1f,$21,$3e,$1f),
  664. ($4b,$dd,$96,$4b), ($bd,$dc,$61,$bd), ($8b,$86,$0d,$8b), ($8a,$85,$0f,$8a),
  665. ($70,$90,$e0,$70), ($3e,$42,$7c,$3e), ($b5,$c4,$71,$b5), ($66,$aa,$cc,$66),
  666. ($48,$d8,$90,$48), ($03,$05,$06,$03), ($f6,$01,$f7,$f6), ($0e,$12,$1c,$0e),
  667. ($61,$a3,$c2,$61), ($35,$5f,$6a,$35), ($57,$f9,$ae,$57), ($b9,$d0,$69,$b9),
  668. ($86,$91,$17,$86), ($c1,$58,$99,$c1), ($1d,$27,$3a,$1d), ($9e,$b9,$27,$9e),
  669. ($e1,$38,$d9,$e1), ($f8,$13,$eb,$f8), ($98,$b3,$2b,$98), ($11,$33,$22,$11),
  670. ($69,$bb,$d2,$69), ($d9,$70,$a9,$d9), ($8e,$89,$07,$8e), ($94,$a7,$33,$94),
  671. ($9b,$b6,$2d,$9b), ($1e,$22,$3c,$1e), ($87,$92,$15,$87), ($e9,$20,$c9,$e9),
  672. ($ce,$49,$87,$ce), ($55,$ff,$aa,$55), ($28,$78,$50,$28), ($df,$7a,$a5,$df),
  673. ($8c,$8f,$03,$8c), ($a1,$f8,$59,$a1), ($89,$80,$09,$89), ($0d,$17,$1a,$0d),
  674. ($bf,$da,$65,$bf), ($e6,$31,$d7,$e6), ($42,$c6,$84,$42), ($68,$b8,$d0,$68),
  675. ($41,$c3,$82,$41), ($99,$b0,$29,$99), ($2d,$77,$5a,$2d), ($0f,$11,$1e,$0f),
  676. ($b0,$cb,$7b,$b0), ($54,$fc,$a8,$54), ($bb,$d6,$6d,$bb), ($16,$3a,$2c,$16));
  677. T4: array[0..255,0..3] of byte= (
  678. ($63,$63,$a5,$c6), ($7c,$7c,$84,$f8), ($77,$77,$99,$ee), ($7b,$7b,$8d,$f6),
  679. ($f2,$f2,$0d,$ff), ($6b,$6b,$bd,$d6), ($6f,$6f,$b1,$de), ($c5,$c5,$54,$91),
  680. ($30,$30,$50,$60), ($01,$01,$03,$02), ($67,$67,$a9,$ce), ($2b,$2b,$7d,$56),
  681. ($fe,$fe,$19,$e7), ($d7,$d7,$62,$b5), ($ab,$ab,$e6,$4d), ($76,$76,$9a,$ec),
  682. ($ca,$ca,$45,$8f), ($82,$82,$9d,$1f), ($c9,$c9,$40,$89), ($7d,$7d,$87,$fa),
  683. ($fa,$fa,$15,$ef), ($59,$59,$eb,$b2), ($47,$47,$c9,$8e), ($f0,$f0,$0b,$fb),
  684. ($ad,$ad,$ec,$41), ($d4,$d4,$67,$b3), ($a2,$a2,$fd,$5f), ($af,$af,$ea,$45),
  685. ($9c,$9c,$bf,$23), ($a4,$a4,$f7,$53), ($72,$72,$96,$e4), ($c0,$c0,$5b,$9b),
  686. ($b7,$b7,$c2,$75), ($fd,$fd,$1c,$e1), ($93,$93,$ae,$3d), ($26,$26,$6a,$4c),
  687. ($36,$36,$5a,$6c), ($3f,$3f,$41,$7e), ($f7,$f7,$02,$f5), ($cc,$cc,$4f,$83),
  688. ($34,$34,$5c,$68), ($a5,$a5,$f4,$51), ($e5,$e5,$34,$d1), ($f1,$f1,$08,$f9),
  689. ($71,$71,$93,$e2), ($d8,$d8,$73,$ab), ($31,$31,$53,$62), ($15,$15,$3f,$2a),
  690. ($04,$04,$0c,$08), ($c7,$c7,$52,$95), ($23,$23,$65,$46), ($c3,$c3,$5e,$9d),
  691. ($18,$18,$28,$30), ($96,$96,$a1,$37), ($05,$05,$0f,$0a), ($9a,$9a,$b5,$2f),
  692. ($07,$07,$09,$0e), ($12,$12,$36,$24), ($80,$80,$9b,$1b), ($e2,$e2,$3d,$df),
  693. ($eb,$eb,$26,$cd), ($27,$27,$69,$4e), ($b2,$b2,$cd,$7f), ($75,$75,$9f,$ea),
  694. ($09,$09,$1b,$12), ($83,$83,$9e,$1d), ($2c,$2c,$74,$58), ($1a,$1a,$2e,$34),
  695. ($1b,$1b,$2d,$36), ($6e,$6e,$b2,$dc), ($5a,$5a,$ee,$b4), ($a0,$a0,$fb,$5b),
  696. ($52,$52,$f6,$a4), ($3b,$3b,$4d,$76), ($d6,$d6,$61,$b7), ($b3,$b3,$ce,$7d),
  697. ($29,$29,$7b,$52), ($e3,$e3,$3e,$dd), ($2f,$2f,$71,$5e), ($84,$84,$97,$13),
  698. ($53,$53,$f5,$a6), ($d1,$d1,$68,$b9), ($00,$00,$00,$00), ($ed,$ed,$2c,$c1),
  699. ($20,$20,$60,$40), ($fc,$fc,$1f,$e3), ($b1,$b1,$c8,$79), ($5b,$5b,$ed,$b6),
  700. ($6a,$6a,$be,$d4), ($cb,$cb,$46,$8d), ($be,$be,$d9,$67), ($39,$39,$4b,$72),
  701. ($4a,$4a,$de,$94), ($4c,$4c,$d4,$98), ($58,$58,$e8,$b0), ($cf,$cf,$4a,$85),
  702. ($d0,$d0,$6b,$bb), ($ef,$ef,$2a,$c5), ($aa,$aa,$e5,$4f), ($fb,$fb,$16,$ed),
  703. ($43,$43,$c5,$86), ($4d,$4d,$d7,$9a), ($33,$33,$55,$66), ($85,$85,$94,$11),
  704. ($45,$45,$cf,$8a), ($f9,$f9,$10,$e9), ($02,$02,$06,$04), ($7f,$7f,$81,$fe),
  705. ($50,$50,$f0,$a0), ($3c,$3c,$44,$78), ($9f,$9f,$ba,$25), ($a8,$a8,$e3,$4b),
  706. ($51,$51,$f3,$a2), ($a3,$a3,$fe,$5d), ($40,$40,$c0,$80), ($8f,$8f,$8a,$05),
  707. ($92,$92,$ad,$3f), ($9d,$9d,$bc,$21), ($38,$38,$48,$70), ($f5,$f5,$04,$f1),
  708. ($bc,$bc,$df,$63), ($b6,$b6,$c1,$77), ($da,$da,$75,$af), ($21,$21,$63,$42),
  709. ($10,$10,$30,$20), ($ff,$ff,$1a,$e5), ($f3,$f3,$0e,$fd), ($d2,$d2,$6d,$bf),
  710. ($cd,$cd,$4c,$81), ($0c,$0c,$14,$18), ($13,$13,$35,$26), ($ec,$ec,$2f,$c3),
  711. ($5f,$5f,$e1,$be), ($97,$97,$a2,$35), ($44,$44,$cc,$88), ($17,$17,$39,$2e),
  712. ($c4,$c4,$57,$93), ($a7,$a7,$f2,$55), ($7e,$7e,$82,$fc), ($3d,$3d,$47,$7a),
  713. ($64,$64,$ac,$c8), ($5d,$5d,$e7,$ba), ($19,$19,$2b,$32), ($73,$73,$95,$e6),
  714. ($60,$60,$a0,$c0), ($81,$81,$98,$19), ($4f,$4f,$d1,$9e), ($dc,$dc,$7f,$a3),
  715. ($22,$22,$66,$44), ($2a,$2a,$7e,$54), ($90,$90,$ab,$3b), ($88,$88,$83,$0b),
  716. ($46,$46,$ca,$8c), ($ee,$ee,$29,$c7), ($b8,$b8,$d3,$6b), ($14,$14,$3c,$28),
  717. ($de,$de,$79,$a7), ($5e,$5e,$e2,$bc), ($0b,$0b,$1d,$16), ($db,$db,$76,$ad),
  718. ($e0,$e0,$3b,$db), ($32,$32,$56,$64), ($3a,$3a,$4e,$74), ($0a,$0a,$1e,$14),
  719. ($49,$49,$db,$92), ($06,$06,$0a,$0c), ($24,$24,$6c,$48), ($5c,$5c,$e4,$b8),
  720. ($c2,$c2,$5d,$9f), ($d3,$d3,$6e,$bd), ($ac,$ac,$ef,$43), ($62,$62,$a6,$c4),
  721. ($91,$91,$a8,$39), ($95,$95,$a4,$31), ($e4,$e4,$37,$d3), ($79,$79,$8b,$f2),
  722. ($e7,$e7,$32,$d5), ($c8,$c8,$43,$8b), ($37,$37,$59,$6e), ($6d,$6d,$b7,$da),
  723. ($8d,$8d,$8c,$01), ($d5,$d5,$64,$b1), ($4e,$4e,$d2,$9c), ($a9,$a9,$e0,$49),
  724. ($6c,$6c,$b4,$d8), ($56,$56,$fa,$ac), ($f4,$f4,$07,$f3), ($ea,$ea,$25,$cf),
  725. ($65,$65,$af,$ca), ($7a,$7a,$8e,$f4), ($ae,$ae,$e9,$47), ($08,$08,$18,$10),
  726. ($ba,$ba,$d5,$6f), ($78,$78,$88,$f0), ($25,$25,$6f,$4a), ($2e,$2e,$72,$5c),
  727. ($1c,$1c,$24,$38), ($a6,$a6,$f1,$57), ($b4,$b4,$c7,$73), ($c6,$c6,$51,$97),
  728. ($e8,$e8,$23,$cb), ($dd,$dd,$7c,$a1), ($74,$74,$9c,$e8), ($1f,$1f,$21,$3e),
  729. ($4b,$4b,$dd,$96), ($bd,$bd,$dc,$61), ($8b,$8b,$86,$0d), ($8a,$8a,$85,$0f),
  730. ($70,$70,$90,$e0), ($3e,$3e,$42,$7c), ($b5,$b5,$c4,$71), ($66,$66,$aa,$cc),
  731. ($48,$48,$d8,$90), ($03,$03,$05,$06), ($f6,$f6,$01,$f7), ($0e,$0e,$12,$1c),
  732. ($61,$61,$a3,$c2), ($35,$35,$5f,$6a), ($57,$57,$f9,$ae), ($b9,$b9,$d0,$69),
  733. ($86,$86,$91,$17), ($c1,$c1,$58,$99), ($1d,$1d,$27,$3a), ($9e,$9e,$b9,$27),
  734. ($e1,$e1,$38,$d9), ($f8,$f8,$13,$eb), ($98,$98,$b3,$2b), ($11,$11,$33,$22),
  735. ($69,$69,$bb,$d2), ($d9,$d9,$70,$a9), ($8e,$8e,$89,$07), ($94,$94,$a7,$33),
  736. ($9b,$9b,$b6,$2d), ($1e,$1e,$22,$3c), ($87,$87,$92,$15), ($e9,$e9,$20,$c9),
  737. ($ce,$ce,$49,$87), ($55,$55,$ff,$aa), ($28,$28,$78,$50), ($df,$df,$7a,$a5),
  738. ($8c,$8c,$8f,$03), ($a1,$a1,$f8,$59), ($89,$89,$80,$09), ($0d,$0d,$17,$1a),
  739. ($bf,$bf,$da,$65), ($e6,$e6,$31,$d7), ($42,$42,$c6,$84), ($68,$68,$b8,$d0),
  740. ($41,$41,$c3,$82), ($99,$99,$b0,$29), ($2d,$2d,$77,$5a), ($0f,$0f,$11,$1e),
  741. ($b0,$b0,$cb,$7b), ($54,$54,$fc,$a8), ($bb,$bb,$d6,$6d), ($16,$16,$3a,$2c));
  742. T5: array[0..255,0..3] of byte= (
  743. ($51,$f4,$a7,$50), ($7e,$41,$65,$53), ($1a,$17,$a4,$c3), ($3a,$27,$5e,$96),
  744. ($3b,$ab,$6b,$cb), ($1f,$9d,$45,$f1), ($ac,$fa,$58,$ab), ($4b,$e3,$03,$93),
  745. ($20,$30,$fa,$55), ($ad,$76,$6d,$f6), ($88,$cc,$76,$91), ($f5,$02,$4c,$25),
  746. ($4f,$e5,$d7,$fc), ($c5,$2a,$cb,$d7), ($26,$35,$44,$80), ($b5,$62,$a3,$8f),
  747. ($de,$b1,$5a,$49), ($25,$ba,$1b,$67), ($45,$ea,$0e,$98), ($5d,$fe,$c0,$e1),
  748. ($c3,$2f,$75,$02), ($81,$4c,$f0,$12), ($8d,$46,$97,$a3), ($6b,$d3,$f9,$c6),
  749. ($03,$8f,$5f,$e7), ($15,$92,$9c,$95), ($bf,$6d,$7a,$eb), ($95,$52,$59,$da),
  750. ($d4,$be,$83,$2d), ($58,$74,$21,$d3), ($49,$e0,$69,$29), ($8e,$c9,$c8,$44),
  751. ($75,$c2,$89,$6a), ($f4,$8e,$79,$78), ($99,$58,$3e,$6b), ($27,$b9,$71,$dd),
  752. ($be,$e1,$4f,$b6), ($f0,$88,$ad,$17), ($c9,$20,$ac,$66), ($7d,$ce,$3a,$b4),
  753. ($63,$df,$4a,$18), ($e5,$1a,$31,$82), ($97,$51,$33,$60), ($62,$53,$7f,$45),
  754. ($b1,$64,$77,$e0), ($bb,$6b,$ae,$84), ($fe,$81,$a0,$1c), ($f9,$08,$2b,$94),
  755. ($70,$48,$68,$58), ($8f,$45,$fd,$19), ($94,$de,$6c,$87), ($52,$7b,$f8,$b7),
  756. ($ab,$73,$d3,$23), ($72,$4b,$02,$e2), ($e3,$1f,$8f,$57), ($66,$55,$ab,$2a),
  757. ($b2,$eb,$28,$07), ($2f,$b5,$c2,$03), ($86,$c5,$7b,$9a), ($d3,$37,$08,$a5),
  758. ($30,$28,$87,$f2), ($23,$bf,$a5,$b2), ($02,$03,$6a,$ba), ($ed,$16,$82,$5c),
  759. ($8a,$cf,$1c,$2b), ($a7,$79,$b4,$92), ($f3,$07,$f2,$f0), ($4e,$69,$e2,$a1),
  760. ($65,$da,$f4,$cd), ($06,$05,$be,$d5), ($d1,$34,$62,$1f), ($c4,$a6,$fe,$8a),
  761. ($34,$2e,$53,$9d), ($a2,$f3,$55,$a0), ($05,$8a,$e1,$32), ($a4,$f6,$eb,$75),
  762. ($0b,$83,$ec,$39), ($40,$60,$ef,$aa), ($5e,$71,$9f,$06), ($bd,$6e,$10,$51),
  763. ($3e,$21,$8a,$f9), ($96,$dd,$06,$3d), ($dd,$3e,$05,$ae), ($4d,$e6,$bd,$46),
  764. ($91,$54,$8d,$b5), ($71,$c4,$5d,$05), ($04,$06,$d4,$6f), ($60,$50,$15,$ff),
  765. ($19,$98,$fb,$24), ($d6,$bd,$e9,$97), ($89,$40,$43,$cc), ($67,$d9,$9e,$77),
  766. ($b0,$e8,$42,$bd), ($07,$89,$8b,$88), ($e7,$19,$5b,$38), ($79,$c8,$ee,$db),
  767. ($a1,$7c,$0a,$47), ($7c,$42,$0f,$e9), ($f8,$84,$1e,$c9), ($00,$00,$00,$00),
  768. ($09,$80,$86,$83), ($32,$2b,$ed,$48), ($1e,$11,$70,$ac), ($6c,$5a,$72,$4e),
  769. ($fd,$0e,$ff,$fb), ($0f,$85,$38,$56), ($3d,$ae,$d5,$1e), ($36,$2d,$39,$27),
  770. ($0a,$0f,$d9,$64), ($68,$5c,$a6,$21), ($9b,$5b,$54,$d1), ($24,$36,$2e,$3a),
  771. ($0c,$0a,$67,$b1), ($93,$57,$e7,$0f), ($b4,$ee,$96,$d2), ($1b,$9b,$91,$9e),
  772. ($80,$c0,$c5,$4f), ($61,$dc,$20,$a2), ($5a,$77,$4b,$69), ($1c,$12,$1a,$16),
  773. ($e2,$93,$ba,$0a), ($c0,$a0,$2a,$e5), ($3c,$22,$e0,$43), ($12,$1b,$17,$1d),
  774. ($0e,$09,$0d,$0b), ($f2,$8b,$c7,$ad), ($2d,$b6,$a8,$b9), ($14,$1e,$a9,$c8),
  775. ($57,$f1,$19,$85), ($af,$75,$07,$4c), ($ee,$99,$dd,$bb), ($a3,$7f,$60,$fd),
  776. ($f7,$01,$26,$9f), ($5c,$72,$f5,$bc), ($44,$66,$3b,$c5), ($5b,$fb,$7e,$34),
  777. ($8b,$43,$29,$76), ($cb,$23,$c6,$dc), ($b6,$ed,$fc,$68), ($b8,$e4,$f1,$63),
  778. ($d7,$31,$dc,$ca), ($42,$63,$85,$10), ($13,$97,$22,$40), ($84,$c6,$11,$20),
  779. ($85,$4a,$24,$7d), ($d2,$bb,$3d,$f8), ($ae,$f9,$32,$11), ($c7,$29,$a1,$6d),
  780. ($1d,$9e,$2f,$4b), ($dc,$b2,$30,$f3), ($0d,$86,$52,$ec), ($77,$c1,$e3,$d0),
  781. ($2b,$b3,$16,$6c), ($a9,$70,$b9,$99), ($11,$94,$48,$fa), ($47,$e9,$64,$22),
  782. ($a8,$fc,$8c,$c4), ($a0,$f0,$3f,$1a), ($56,$7d,$2c,$d8), ($22,$33,$90,$ef),
  783. ($87,$49,$4e,$c7), ($d9,$38,$d1,$c1), ($8c,$ca,$a2,$fe), ($98,$d4,$0b,$36),
  784. ($a6,$f5,$81,$cf), ($a5,$7a,$de,$28), ($da,$b7,$8e,$26), ($3f,$ad,$bf,$a4),
  785. ($2c,$3a,$9d,$e4), ($50,$78,$92,$0d), ($6a,$5f,$cc,$9b), ($54,$7e,$46,$62),
  786. ($f6,$8d,$13,$c2), ($90,$d8,$b8,$e8), ($2e,$39,$f7,$5e), ($82,$c3,$af,$f5),
  787. ($9f,$5d,$80,$be), ($69,$d0,$93,$7c), ($6f,$d5,$2d,$a9), ($cf,$25,$12,$b3),
  788. ($c8,$ac,$99,$3b), ($10,$18,$7d,$a7), ($e8,$9c,$63,$6e), ($db,$3b,$bb,$7b),
  789. ($cd,$26,$78,$09), ($6e,$59,$18,$f4), ($ec,$9a,$b7,$01), ($83,$4f,$9a,$a8),
  790. ($e6,$95,$6e,$65), ($aa,$ff,$e6,$7e), ($21,$bc,$cf,$08), ($ef,$15,$e8,$e6),
  791. ($ba,$e7,$9b,$d9), ($4a,$6f,$36,$ce), ($ea,$9f,$09,$d4), ($29,$b0,$7c,$d6),
  792. ($31,$a4,$b2,$af), ($2a,$3f,$23,$31), ($c6,$a5,$94,$30), ($35,$a2,$66,$c0),
  793. ($74,$4e,$bc,$37), ($fc,$82,$ca,$a6), ($e0,$90,$d0,$b0), ($33,$a7,$d8,$15),
  794. ($f1,$04,$98,$4a), ($41,$ec,$da,$f7), ($7f,$cd,$50,$0e), ($17,$91,$f6,$2f),
  795. ($76,$4d,$d6,$8d), ($43,$ef,$b0,$4d), ($cc,$aa,$4d,$54), ($e4,$96,$04,$df),
  796. ($9e,$d1,$b5,$e3), ($4c,$6a,$88,$1b), ($c1,$2c,$1f,$b8), ($46,$65,$51,$7f),
  797. ($9d,$5e,$ea,$04), ($01,$8c,$35,$5d), ($fa,$87,$74,$73), ($fb,$0b,$41,$2e),
  798. ($b3,$67,$1d,$5a), ($92,$db,$d2,$52), ($e9,$10,$56,$33), ($6d,$d6,$47,$13),
  799. ($9a,$d7,$61,$8c), ($37,$a1,$0c,$7a), ($59,$f8,$14,$8e), ($eb,$13,$3c,$89),
  800. ($ce,$a9,$27,$ee), ($b7,$61,$c9,$35), ($e1,$1c,$e5,$ed), ($7a,$47,$b1,$3c),
  801. ($9c,$d2,$df,$59), ($55,$f2,$73,$3f), ($18,$14,$ce,$79), ($73,$c7,$37,$bf),
  802. ($53,$f7,$cd,$ea), ($5f,$fd,$aa,$5b), ($df,$3d,$6f,$14), ($78,$44,$db,$86),
  803. ($ca,$af,$f3,$81), ($b9,$68,$c4,$3e), ($38,$24,$34,$2c), ($c2,$a3,$40,$5f),
  804. ($16,$1d,$c3,$72), ($bc,$e2,$25,$0c), ($28,$3c,$49,$8b), ($ff,$0d,$95,$41),
  805. ($39,$a8,$01,$71), ($08,$0c,$b3,$de), ($d8,$b4,$e4,$9c), ($64,$56,$c1,$90),
  806. ($7b,$cb,$84,$61), ($d5,$32,$b6,$70), ($48,$6c,$5c,$74), ($d0,$b8,$57,$42));
  807. T6: array[0..255,0..3] of byte= (
  808. ($50,$51,$f4,$a7), ($53,$7e,$41,$65), ($c3,$1a,$17,$a4), ($96,$3a,$27,$5e),
  809. ($cb,$3b,$ab,$6b), ($f1,$1f,$9d,$45), ($ab,$ac,$fa,$58), ($93,$4b,$e3,$03),
  810. ($55,$20,$30,$fa), ($f6,$ad,$76,$6d), ($91,$88,$cc,$76), ($25,$f5,$02,$4c),
  811. ($fc,$4f,$e5,$d7), ($d7,$c5,$2a,$cb), ($80,$26,$35,$44), ($8f,$b5,$62,$a3),
  812. ($49,$de,$b1,$5a), ($67,$25,$ba,$1b), ($98,$45,$ea,$0e), ($e1,$5d,$fe,$c0),
  813. ($02,$c3,$2f,$75), ($12,$81,$4c,$f0), ($a3,$8d,$46,$97), ($c6,$6b,$d3,$f9),
  814. ($e7,$03,$8f,$5f), ($95,$15,$92,$9c), ($eb,$bf,$6d,$7a), ($da,$95,$52,$59),
  815. ($2d,$d4,$be,$83), ($d3,$58,$74,$21), ($29,$49,$e0,$69), ($44,$8e,$c9,$c8),
  816. ($6a,$75,$c2,$89), ($78,$f4,$8e,$79), ($6b,$99,$58,$3e), ($dd,$27,$b9,$71),
  817. ($b6,$be,$e1,$4f), ($17,$f0,$88,$ad), ($66,$c9,$20,$ac), ($b4,$7d,$ce,$3a),
  818. ($18,$63,$df,$4a), ($82,$e5,$1a,$31), ($60,$97,$51,$33), ($45,$62,$53,$7f),
  819. ($e0,$b1,$64,$77), ($84,$bb,$6b,$ae), ($1c,$fe,$81,$a0), ($94,$f9,$08,$2b),
  820. ($58,$70,$48,$68), ($19,$8f,$45,$fd), ($87,$94,$de,$6c), ($b7,$52,$7b,$f8),
  821. ($23,$ab,$73,$d3), ($e2,$72,$4b,$02), ($57,$e3,$1f,$8f), ($2a,$66,$55,$ab),
  822. ($07,$b2,$eb,$28), ($03,$2f,$b5,$c2), ($9a,$86,$c5,$7b), ($a5,$d3,$37,$08),
  823. ($f2,$30,$28,$87), ($b2,$23,$bf,$a5), ($ba,$02,$03,$6a), ($5c,$ed,$16,$82),
  824. ($2b,$8a,$cf,$1c), ($92,$a7,$79,$b4), ($f0,$f3,$07,$f2), ($a1,$4e,$69,$e2),
  825. ($cd,$65,$da,$f4), ($d5,$06,$05,$be), ($1f,$d1,$34,$62), ($8a,$c4,$a6,$fe),
  826. ($9d,$34,$2e,$53), ($a0,$a2,$f3,$55), ($32,$05,$8a,$e1), ($75,$a4,$f6,$eb),
  827. ($39,$0b,$83,$ec), ($aa,$40,$60,$ef), ($06,$5e,$71,$9f), ($51,$bd,$6e,$10),
  828. ($f9,$3e,$21,$8a), ($3d,$96,$dd,$06), ($ae,$dd,$3e,$05), ($46,$4d,$e6,$bd),
  829. ($b5,$91,$54,$8d), ($05,$71,$c4,$5d), ($6f,$04,$06,$d4), ($ff,$60,$50,$15),
  830. ($24,$19,$98,$fb), ($97,$d6,$bd,$e9), ($cc,$89,$40,$43), ($77,$67,$d9,$9e),
  831. ($bd,$b0,$e8,$42), ($88,$07,$89,$8b), ($38,$e7,$19,$5b), ($db,$79,$c8,$ee),
  832. ($47,$a1,$7c,$0a), ($e9,$7c,$42,$0f), ($c9,$f8,$84,$1e), ($00,$00,$00,$00),
  833. ($83,$09,$80,$86), ($48,$32,$2b,$ed), ($ac,$1e,$11,$70), ($4e,$6c,$5a,$72),
  834. ($fb,$fd,$0e,$ff), ($56,$0f,$85,$38), ($1e,$3d,$ae,$d5), ($27,$36,$2d,$39),
  835. ($64,$0a,$0f,$d9), ($21,$68,$5c,$a6), ($d1,$9b,$5b,$54), ($3a,$24,$36,$2e),
  836. ($b1,$0c,$0a,$67), ($0f,$93,$57,$e7), ($d2,$b4,$ee,$96), ($9e,$1b,$9b,$91),
  837. ($4f,$80,$c0,$c5), ($a2,$61,$dc,$20), ($69,$5a,$77,$4b), ($16,$1c,$12,$1a),
  838. ($0a,$e2,$93,$ba), ($e5,$c0,$a0,$2a), ($43,$3c,$22,$e0), ($1d,$12,$1b,$17),
  839. ($0b,$0e,$09,$0d), ($ad,$f2,$8b,$c7), ($b9,$2d,$b6,$a8), ($c8,$14,$1e,$a9),
  840. ($85,$57,$f1,$19), ($4c,$af,$75,$07), ($bb,$ee,$99,$dd), ($fd,$a3,$7f,$60),
  841. ($9f,$f7,$01,$26), ($bc,$5c,$72,$f5), ($c5,$44,$66,$3b), ($34,$5b,$fb,$7e),
  842. ($76,$8b,$43,$29), ($dc,$cb,$23,$c6), ($68,$b6,$ed,$fc), ($63,$b8,$e4,$f1),
  843. ($ca,$d7,$31,$dc), ($10,$42,$63,$85), ($40,$13,$97,$22), ($20,$84,$c6,$11),
  844. ($7d,$85,$4a,$24), ($f8,$d2,$bb,$3d), ($11,$ae,$f9,$32), ($6d,$c7,$29,$a1),
  845. ($4b,$1d,$9e,$2f), ($f3,$dc,$b2,$30), ($ec,$0d,$86,$52), ($d0,$77,$c1,$e3),
  846. ($6c,$2b,$b3,$16), ($99,$a9,$70,$b9), ($fa,$11,$94,$48), ($22,$47,$e9,$64),
  847. ($c4,$a8,$fc,$8c), ($1a,$a0,$f0,$3f), ($d8,$56,$7d,$2c), ($ef,$22,$33,$90),
  848. ($c7,$87,$49,$4e), ($c1,$d9,$38,$d1), ($fe,$8c,$ca,$a2), ($36,$98,$d4,$0b),
  849. ($cf,$a6,$f5,$81), ($28,$a5,$7a,$de), ($26,$da,$b7,$8e), ($a4,$3f,$ad,$bf),
  850. ($e4,$2c,$3a,$9d), ($0d,$50,$78,$92), ($9b,$6a,$5f,$cc), ($62,$54,$7e,$46),
  851. ($c2,$f6,$8d,$13), ($e8,$90,$d8,$b8), ($5e,$2e,$39,$f7), ($f5,$82,$c3,$af),
  852. ($be,$9f,$5d,$80), ($7c,$69,$d0,$93), ($a9,$6f,$d5,$2d), ($b3,$cf,$25,$12),
  853. ($3b,$c8,$ac,$99), ($a7,$10,$18,$7d), ($6e,$e8,$9c,$63), ($7b,$db,$3b,$bb),
  854. ($09,$cd,$26,$78), ($f4,$6e,$59,$18), ($01,$ec,$9a,$b7), ($a8,$83,$4f,$9a),
  855. ($65,$e6,$95,$6e), ($7e,$aa,$ff,$e6), ($08,$21,$bc,$cf), ($e6,$ef,$15,$e8),
  856. ($d9,$ba,$e7,$9b), ($ce,$4a,$6f,$36), ($d4,$ea,$9f,$09), ($d6,$29,$b0,$7c),
  857. ($af,$31,$a4,$b2), ($31,$2a,$3f,$23), ($30,$c6,$a5,$94), ($c0,$35,$a2,$66),
  858. ($37,$74,$4e,$bc), ($a6,$fc,$82,$ca), ($b0,$e0,$90,$d0), ($15,$33,$a7,$d8),
  859. ($4a,$f1,$04,$98), ($f7,$41,$ec,$da), ($0e,$7f,$cd,$50), ($2f,$17,$91,$f6),
  860. ($8d,$76,$4d,$d6), ($4d,$43,$ef,$b0), ($54,$cc,$aa,$4d), ($df,$e4,$96,$04),
  861. ($e3,$9e,$d1,$b5), ($1b,$4c,$6a,$88), ($b8,$c1,$2c,$1f), ($7f,$46,$65,$51),
  862. ($04,$9d,$5e,$ea), ($5d,$01,$8c,$35), ($73,$fa,$87,$74), ($2e,$fb,$0b,$41),
  863. ($5a,$b3,$67,$1d), ($52,$92,$db,$d2), ($33,$e9,$10,$56), ($13,$6d,$d6,$47),
  864. ($8c,$9a,$d7,$61), ($7a,$37,$a1,$0c), ($8e,$59,$f8,$14), ($89,$eb,$13,$3c),
  865. ($ee,$ce,$a9,$27), ($35,$b7,$61,$c9), ($ed,$e1,$1c,$e5), ($3c,$7a,$47,$b1),
  866. ($59,$9c,$d2,$df), ($3f,$55,$f2,$73), ($79,$18,$14,$ce), ($bf,$73,$c7,$37),
  867. ($ea,$53,$f7,$cd), ($5b,$5f,$fd,$aa), ($14,$df,$3d,$6f), ($86,$78,$44,$db),
  868. ($81,$ca,$af,$f3), ($3e,$b9,$68,$c4), ($2c,$38,$24,$34), ($5f,$c2,$a3,$40),
  869. ($72,$16,$1d,$c3), ($0c,$bc,$e2,$25), ($8b,$28,$3c,$49), ($41,$ff,$0d,$95),
  870. ($71,$39,$a8,$01), ($de,$08,$0c,$b3), ($9c,$d8,$b4,$e4), ($90,$64,$56,$c1),
  871. ($61,$7b,$cb,$84), ($70,$d5,$32,$b6), ($74,$48,$6c,$5c), ($42,$d0,$b8,$57));
  872. T7: array[0..255,0..3] of byte= (
  873. ($a7,$50,$51,$f4), ($65,$53,$7e,$41), ($a4,$c3,$1a,$17), ($5e,$96,$3a,$27),
  874. ($6b,$cb,$3b,$ab), ($45,$f1,$1f,$9d), ($58,$ab,$ac,$fa), ($03,$93,$4b,$e3),
  875. ($fa,$55,$20,$30), ($6d,$f6,$ad,$76), ($76,$91,$88,$cc), ($4c,$25,$f5,$02),
  876. ($d7,$fc,$4f,$e5), ($cb,$d7,$c5,$2a), ($44,$80,$26,$35), ($a3,$8f,$b5,$62),
  877. ($5a,$49,$de,$b1), ($1b,$67,$25,$ba), ($0e,$98,$45,$ea), ($c0,$e1,$5d,$fe),
  878. ($75,$02,$c3,$2f), ($f0,$12,$81,$4c), ($97,$a3,$8d,$46), ($f9,$c6,$6b,$d3),
  879. ($5f,$e7,$03,$8f), ($9c,$95,$15,$92), ($7a,$eb,$bf,$6d), ($59,$da,$95,$52),
  880. ($83,$2d,$d4,$be), ($21,$d3,$58,$74), ($69,$29,$49,$e0), ($c8,$44,$8e,$c9),
  881. ($89,$6a,$75,$c2), ($79,$78,$f4,$8e), ($3e,$6b,$99,$58), ($71,$dd,$27,$b9),
  882. ($4f,$b6,$be,$e1), ($ad,$17,$f0,$88), ($ac,$66,$c9,$20), ($3a,$b4,$7d,$ce),
  883. ($4a,$18,$63,$df), ($31,$82,$e5,$1a), ($33,$60,$97,$51), ($7f,$45,$62,$53),
  884. ($77,$e0,$b1,$64), ($ae,$84,$bb,$6b), ($a0,$1c,$fe,$81), ($2b,$94,$f9,$08),
  885. ($68,$58,$70,$48), ($fd,$19,$8f,$45), ($6c,$87,$94,$de), ($f8,$b7,$52,$7b),
  886. ($d3,$23,$ab,$73), ($02,$e2,$72,$4b), ($8f,$57,$e3,$1f), ($ab,$2a,$66,$55),
  887. ($28,$07,$b2,$eb), ($c2,$03,$2f,$b5), ($7b,$9a,$86,$c5), ($08,$a5,$d3,$37),
  888. ($87,$f2,$30,$28), ($a5,$b2,$23,$bf), ($6a,$ba,$02,$03), ($82,$5c,$ed,$16),
  889. ($1c,$2b,$8a,$cf), ($b4,$92,$a7,$79), ($f2,$f0,$f3,$07), ($e2,$a1,$4e,$69),
  890. ($f4,$cd,$65,$da), ($be,$d5,$06,$05), ($62,$1f,$d1,$34), ($fe,$8a,$c4,$a6),
  891. ($53,$9d,$34,$2e), ($55,$a0,$a2,$f3), ($e1,$32,$05,$8a), ($eb,$75,$a4,$f6),
  892. ($ec,$39,$0b,$83), ($ef,$aa,$40,$60), ($9f,$06,$5e,$71), ($10,$51,$bd,$6e),
  893. ($8a,$f9,$3e,$21), ($06,$3d,$96,$dd), ($05,$ae,$dd,$3e), ($bd,$46,$4d,$e6),
  894. ($8d,$b5,$91,$54), ($5d,$05,$71,$c4), ($d4,$6f,$04,$06), ($15,$ff,$60,$50),
  895. ($fb,$24,$19,$98), ($e9,$97,$d6,$bd), ($43,$cc,$89,$40), ($9e,$77,$67,$d9),
  896. ($42,$bd,$b0,$e8), ($8b,$88,$07,$89), ($5b,$38,$e7,$19), ($ee,$db,$79,$c8),
  897. ($0a,$47,$a1,$7c), ($0f,$e9,$7c,$42), ($1e,$c9,$f8,$84), ($00,$00,$00,$00),
  898. ($86,$83,$09,$80), ($ed,$48,$32,$2b), ($70,$ac,$1e,$11), ($72,$4e,$6c,$5a),
  899. ($ff,$fb,$fd,$0e), ($38,$56,$0f,$85), ($d5,$1e,$3d,$ae), ($39,$27,$36,$2d),
  900. ($d9,$64,$0a,$0f), ($a6,$21,$68,$5c), ($54,$d1,$9b,$5b), ($2e,$3a,$24,$36),
  901. ($67,$b1,$0c,$0a), ($e7,$0f,$93,$57), ($96,$d2,$b4,$ee), ($91,$9e,$1b,$9b),
  902. ($c5,$4f,$80,$c0), ($20,$a2,$61,$dc), ($4b,$69,$5a,$77), ($1a,$16,$1c,$12),
  903. ($ba,$0a,$e2,$93), ($2a,$e5,$c0,$a0), ($e0,$43,$3c,$22), ($17,$1d,$12,$1b),
  904. ($0d,$0b,$0e,$09), ($c7,$ad,$f2,$8b), ($a8,$b9,$2d,$b6), ($a9,$c8,$14,$1e),
  905. ($19,$85,$57,$f1), ($07,$4c,$af,$75), ($dd,$bb,$ee,$99), ($60,$fd,$a3,$7f),
  906. ($26,$9f,$f7,$01), ($f5,$bc,$5c,$72), ($3b,$c5,$44,$66), ($7e,$34,$5b,$fb),
  907. ($29,$76,$8b,$43), ($c6,$dc,$cb,$23), ($fc,$68,$b6,$ed), ($f1,$63,$b8,$e4),
  908. ($dc,$ca,$d7,$31), ($85,$10,$42,$63), ($22,$40,$13,$97), ($11,$20,$84,$c6),
  909. ($24,$7d,$85,$4a), ($3d,$f8,$d2,$bb), ($32,$11,$ae,$f9), ($a1,$6d,$c7,$29),
  910. ($2f,$4b,$1d,$9e), ($30,$f3,$dc,$b2), ($52,$ec,$0d,$86), ($e3,$d0,$77,$c1),
  911. ($16,$6c,$2b,$b3), ($b9,$99,$a9,$70), ($48,$fa,$11,$94), ($64,$22,$47,$e9),
  912. ($8c,$c4,$a8,$fc), ($3f,$1a,$a0,$f0), ($2c,$d8,$56,$7d), ($90,$ef,$22,$33),
  913. ($4e,$c7,$87,$49), ($d1,$c1,$d9,$38), ($a2,$fe,$8c,$ca), ($0b,$36,$98,$d4),
  914. ($81,$cf,$a6,$f5), ($de,$28,$a5,$7a), ($8e,$26,$da,$b7), ($bf,$a4,$3f,$ad),
  915. ($9d,$e4,$2c,$3a), ($92,$0d,$50,$78), ($cc,$9b,$6a,$5f), ($46,$62,$54,$7e),
  916. ($13,$c2,$f6,$8d), ($b8,$e8,$90,$d8), ($f7,$5e,$2e,$39), ($af,$f5,$82,$c3),
  917. ($80,$be,$9f,$5d), ($93,$7c,$69,$d0), ($2d,$a9,$6f,$d5), ($12,$b3,$cf,$25),
  918. ($99,$3b,$c8,$ac), ($7d,$a7,$10,$18), ($63,$6e,$e8,$9c), ($bb,$7b,$db,$3b),
  919. ($78,$09,$cd,$26), ($18,$f4,$6e,$59), ($b7,$01,$ec,$9a), ($9a,$a8,$83,$4f),
  920. ($6e,$65,$e6,$95), ($e6,$7e,$aa,$ff), ($cf,$08,$21,$bc), ($e8,$e6,$ef,$15),
  921. ($9b,$d9,$ba,$e7), ($36,$ce,$4a,$6f), ($09,$d4,$ea,$9f), ($7c,$d6,$29,$b0),
  922. ($b2,$af,$31,$a4), ($23,$31,$2a,$3f), ($94,$30,$c6,$a5), ($66,$c0,$35,$a2),
  923. ($bc,$37,$74,$4e), ($ca,$a6,$fc,$82), ($d0,$b0,$e0,$90), ($d8,$15,$33,$a7),
  924. ($98,$4a,$f1,$04), ($da,$f7,$41,$ec), ($50,$0e,$7f,$cd), ($f6,$2f,$17,$91),
  925. ($d6,$8d,$76,$4d), ($b0,$4d,$43,$ef), ($4d,$54,$cc,$aa), ($04,$df,$e4,$96),
  926. ($b5,$e3,$9e,$d1), ($88,$1b,$4c,$6a), ($1f,$b8,$c1,$2c), ($51,$7f,$46,$65),
  927. ($ea,$04,$9d,$5e), ($35,$5d,$01,$8c), ($74,$73,$fa,$87), ($41,$2e,$fb,$0b),
  928. ($1d,$5a,$b3,$67), ($d2,$52,$92,$db), ($56,$33,$e9,$10), ($47,$13,$6d,$d6),
  929. ($61,$8c,$9a,$d7), ($0c,$7a,$37,$a1), ($14,$8e,$59,$f8), ($3c,$89,$eb,$13),
  930. ($27,$ee,$ce,$a9), ($c9,$35,$b7,$61), ($e5,$ed,$e1,$1c), ($b1,$3c,$7a,$47),
  931. ($df,$59,$9c,$d2), ($73,$3f,$55,$f2), ($ce,$79,$18,$14), ($37,$bf,$73,$c7),
  932. ($cd,$ea,$53,$f7), ($aa,$5b,$5f,$fd), ($6f,$14,$df,$3d), ($db,$86,$78,$44),
  933. ($f3,$81,$ca,$af), ($c4,$3e,$b9,$68), ($34,$2c,$38,$24), ($40,$5f,$c2,$a3),
  934. ($c3,$72,$16,$1d), ($25,$0c,$bc,$e2), ($49,$8b,$28,$3c), ($95,$41,$ff,$0d),
  935. ($01,$71,$39,$a8), ($b3,$de,$08,$0c), ($e4,$9c,$d8,$b4), ($c1,$90,$64,$56),
  936. ($84,$61,$7b,$cb), ($b6,$70,$d5,$32), ($5c,$74,$48,$6c), ($57,$42,$d0,$b8));
  937. T8: array[0..255,0..3] of byte= (
  938. ($f4,$a7,$50,$51), ($41,$65,$53,$7e), ($17,$a4,$c3,$1a), ($27,$5e,$96,$3a),
  939. ($ab,$6b,$cb,$3b), ($9d,$45,$f1,$1f), ($fa,$58,$ab,$ac), ($e3,$03,$93,$4b),
  940. ($30,$fa,$55,$20), ($76,$6d,$f6,$ad), ($cc,$76,$91,$88), ($02,$4c,$25,$f5),
  941. ($e5,$d7,$fc,$4f), ($2a,$cb,$d7,$c5), ($35,$44,$80,$26), ($62,$a3,$8f,$b5),
  942. ($b1,$5a,$49,$de), ($ba,$1b,$67,$25), ($ea,$0e,$98,$45), ($fe,$c0,$e1,$5d),
  943. ($2f,$75,$02,$c3), ($4c,$f0,$12,$81), ($46,$97,$a3,$8d), ($d3,$f9,$c6,$6b),
  944. ($8f,$5f,$e7,$03), ($92,$9c,$95,$15), ($6d,$7a,$eb,$bf), ($52,$59,$da,$95),
  945. ($be,$83,$2d,$d4), ($74,$21,$d3,$58), ($e0,$69,$29,$49), ($c9,$c8,$44,$8e),
  946. ($c2,$89,$6a,$75), ($8e,$79,$78,$f4), ($58,$3e,$6b,$99), ($b9,$71,$dd,$27),
  947. ($e1,$4f,$b6,$be), ($88,$ad,$17,$f0), ($20,$ac,$66,$c9), ($ce,$3a,$b4,$7d),
  948. ($df,$4a,$18,$63), ($1a,$31,$82,$e5), ($51,$33,$60,$97), ($53,$7f,$45,$62),
  949. ($64,$77,$e0,$b1), ($6b,$ae,$84,$bb), ($81,$a0,$1c,$fe), ($08,$2b,$94,$f9),
  950. ($48,$68,$58,$70), ($45,$fd,$19,$8f), ($de,$6c,$87,$94), ($7b,$f8,$b7,$52),
  951. ($73,$d3,$23,$ab), ($4b,$02,$e2,$72), ($1f,$8f,$57,$e3), ($55,$ab,$2a,$66),
  952. ($eb,$28,$07,$b2), ($b5,$c2,$03,$2f), ($c5,$7b,$9a,$86), ($37,$08,$a5,$d3),
  953. ($28,$87,$f2,$30), ($bf,$a5,$b2,$23), ($03,$6a,$ba,$02), ($16,$82,$5c,$ed),
  954. ($cf,$1c,$2b,$8a), ($79,$b4,$92,$a7), ($07,$f2,$f0,$f3), ($69,$e2,$a1,$4e),
  955. ($da,$f4,$cd,$65), ($05,$be,$d5,$06), ($34,$62,$1f,$d1), ($a6,$fe,$8a,$c4),
  956. ($2e,$53,$9d,$34), ($f3,$55,$a0,$a2), ($8a,$e1,$32,$05), ($f6,$eb,$75,$a4),
  957. ($83,$ec,$39,$0b), ($60,$ef,$aa,$40), ($71,$9f,$06,$5e), ($6e,$10,$51,$bd),
  958. ($21,$8a,$f9,$3e), ($dd,$06,$3d,$96), ($3e,$05,$ae,$dd), ($e6,$bd,$46,$4d),
  959. ($54,$8d,$b5,$91), ($c4,$5d,$05,$71), ($06,$d4,$6f,$04), ($50,$15,$ff,$60),
  960. ($98,$fb,$24,$19), ($bd,$e9,$97,$d6), ($40,$43,$cc,$89), ($d9,$9e,$77,$67),
  961. ($e8,$42,$bd,$b0), ($89,$8b,$88,$07), ($19,$5b,$38,$e7), ($c8,$ee,$db,$79),
  962. ($7c,$0a,$47,$a1), ($42,$0f,$e9,$7c), ($84,$1e,$c9,$f8), ($00,$00,$00,$00),
  963. ($80,$86,$83,$09), ($2b,$ed,$48,$32), ($11,$70,$ac,$1e), ($5a,$72,$4e,$6c),
  964. ($0e,$ff,$fb,$fd), ($85,$38,$56,$0f), ($ae,$d5,$1e,$3d), ($2d,$39,$27,$36),
  965. ($0f,$d9,$64,$0a), ($5c,$a6,$21,$68), ($5b,$54,$d1,$9b), ($36,$2e,$3a,$24),
  966. ($0a,$67,$b1,$0c), ($57,$e7,$0f,$93), ($ee,$96,$d2,$b4), ($9b,$91,$9e,$1b),
  967. ($c0,$c5,$4f,$80), ($dc,$20,$a2,$61), ($77,$4b,$69,$5a), ($12,$1a,$16,$1c),
  968. ($93,$ba,$0a,$e2), ($a0,$2a,$e5,$c0), ($22,$e0,$43,$3c), ($1b,$17,$1d,$12),
  969. ($09,$0d,$0b,$0e), ($8b,$c7,$ad,$f2), ($b6,$a8,$b9,$2d), ($1e,$a9,$c8,$14),
  970. ($f1,$19,$85,$57), ($75,$07,$4c,$af), ($99,$dd,$bb,$ee), ($7f,$60,$fd,$a3),
  971. ($01,$26,$9f,$f7), ($72,$f5,$bc,$5c), ($66,$3b,$c5,$44), ($fb,$7e,$34,$5b),
  972. ($43,$29,$76,$8b), ($23,$c6,$dc,$cb), ($ed,$fc,$68,$b6), ($e4,$f1,$63,$b8),
  973. ($31,$dc,$ca,$d7), ($63,$85,$10,$42), ($97,$22,$40,$13), ($c6,$11,$20,$84),
  974. ($4a,$24,$7d,$85), ($bb,$3d,$f8,$d2), ($f9,$32,$11,$ae), ($29,$a1,$6d,$c7),
  975. ($9e,$2f,$4b,$1d), ($b2,$30,$f3,$dc), ($86,$52,$ec,$0d), ($c1,$e3,$d0,$77),
  976. ($b3,$16,$6c,$2b), ($70,$b9,$99,$a9), ($94,$48,$fa,$11), ($e9,$64,$22,$47),
  977. ($fc,$8c,$c4,$a8), ($f0,$3f,$1a,$a0), ($7d,$2c,$d8,$56), ($33,$90,$ef,$22),
  978. ($49,$4e,$c7,$87), ($38,$d1,$c1,$d9), ($ca,$a2,$fe,$8c), ($d4,$0b,$36,$98),
  979. ($f5,$81,$cf,$a6), ($7a,$de,$28,$a5), ($b7,$8e,$26,$da), ($ad,$bf,$a4,$3f),
  980. ($3a,$9d,$e4,$2c), ($78,$92,$0d,$50), ($5f,$cc,$9b,$6a), ($7e,$46,$62,$54),
  981. ($8d,$13,$c2,$f6), ($d8,$b8,$e8,$90), ($39,$f7,$5e,$2e), ($c3,$af,$f5,$82),
  982. ($5d,$80,$be,$9f), ($d0,$93,$7c,$69), ($d5,$2d,$a9,$6f), ($25,$12,$b3,$cf),
  983. ($ac,$99,$3b,$c8), ($18,$7d,$a7,$10), ($9c,$63,$6e,$e8), ($3b,$bb,$7b,$db),
  984. ($26,$78,$09,$cd), ($59,$18,$f4,$6e), ($9a,$b7,$01,$ec), ($4f,$9a,$a8,$83),
  985. ($95,$6e,$65,$e6), ($ff,$e6,$7e,$aa), ($bc,$cf,$08,$21), ($15,$e8,$e6,$ef),
  986. ($e7,$9b,$d9,$ba), ($6f,$36,$ce,$4a), ($9f,$09,$d4,$ea), ($b0,$7c,$d6,$29),
  987. ($a4,$b2,$af,$31), ($3f,$23,$31,$2a), ($a5,$94,$30,$c6), ($a2,$66,$c0,$35),
  988. ($4e,$bc,$37,$74), ($82,$ca,$a6,$fc), ($90,$d0,$b0,$e0), ($a7,$d8,$15,$33),
  989. ($04,$98,$4a,$f1), ($ec,$da,$f7,$41), ($cd,$50,$0e,$7f), ($91,$f6,$2f,$17),
  990. ($4d,$d6,$8d,$76), ($ef,$b0,$4d,$43), ($aa,$4d,$54,$cc), ($96,$04,$df,$e4),
  991. ($d1,$b5,$e3,$9e), ($6a,$88,$1b,$4c), ($2c,$1f,$b8,$c1), ($65,$51,$7f,$46),
  992. ($5e,$ea,$04,$9d), ($8c,$35,$5d,$01), ($87,$74,$73,$fa), ($0b,$41,$2e,$fb),
  993. ($67,$1d,$5a,$b3), ($db,$d2,$52,$92), ($10,$56,$33,$e9), ($d6,$47,$13,$6d),
  994. ($d7,$61,$8c,$9a), ($a1,$0c,$7a,$37), ($f8,$14,$8e,$59), ($13,$3c,$89,$eb),
  995. ($a9,$27,$ee,$ce), ($61,$c9,$35,$b7), ($1c,$e5,$ed,$e1), ($47,$b1,$3c,$7a),
  996. ($d2,$df,$59,$9c), ($f2,$73,$3f,$55), ($14,$ce,$79,$18), ($c7,$37,$bf,$73),
  997. ($f7,$cd,$ea,$53), ($fd,$aa,$5b,$5f), ($3d,$6f,$14,$df), ($44,$db,$86,$78),
  998. ($af,$f3,$81,$ca), ($68,$c4,$3e,$b9), ($24,$34,$2c,$38), ($a3,$40,$5f,$c2),
  999. ($1d,$c3,$72,$16), ($e2,$25,$0c,$bc), ($3c,$49,$8b,$28), ($0d,$95,$41,$ff),
  1000. ($a8,$01,$71,$39), ($0c,$b3,$de,$08), ($b4,$e4,$9c,$d8), ($56,$c1,$90,$64),
  1001. ($cb,$84,$61,$7b), ($32,$b6,$70,$d5), ($6c,$5c,$74,$48), ($b8,$57,$42,$d0));
  1002. S5: array[0..255] of byte= (
  1003. $52,$09,$6a,$d5,
  1004. $30,$36,$a5,$38,
  1005. $bf,$40,$a3,$9e,
  1006. $81,$f3,$d7,$fb,
  1007. $7c,$e3,$39,$82,
  1008. $9b,$2f,$ff,$87,
  1009. $34,$8e,$43,$44,
  1010. $c4,$de,$e9,$cb,
  1011. $54,$7b,$94,$32,
  1012. $a6,$c2,$23,$3d,
  1013. $ee,$4c,$95,$0b,
  1014. $42,$fa,$c3,$4e,
  1015. $08,$2e,$a1,$66,
  1016. $28,$d9,$24,$b2,
  1017. $76,$5b,$a2,$49,
  1018. $6d,$8b,$d1,$25,
  1019. $72,$f8,$f6,$64,
  1020. $86,$68,$98,$16,
  1021. $d4,$a4,$5c,$cc,
  1022. $5d,$65,$b6,$92,
  1023. $6c,$70,$48,$50,
  1024. $fd,$ed,$b9,$da,
  1025. $5e,$15,$46,$57,
  1026. $a7,$8d,$9d,$84,
  1027. $90,$d8,$ab,$00,
  1028. $8c,$bc,$d3,$0a,
  1029. $f7,$e4,$58,$05,
  1030. $b8,$b3,$45,$06,
  1031. $d0,$2c,$1e,$8f,
  1032. $ca,$3f,$0f,$02,
  1033. $c1,$af,$bd,$03,
  1034. $01,$13,$8a,$6b,
  1035. $3a,$91,$11,$41,
  1036. $4f,$67,$dc,$ea,
  1037. $97,$f2,$cf,$ce,
  1038. $f0,$b4,$e6,$73,
  1039. $96,$ac,$74,$22,
  1040. $e7,$ad,$35,$85,
  1041. $e2,$f9,$37,$e8,
  1042. $1c,$75,$df,$6e,
  1043. $47,$f1,$1a,$71,
  1044. $1d,$29,$c5,$89,
  1045. $6f,$b7,$62,$0e,
  1046. $aa,$18,$be,$1b,
  1047. $fc,$56,$3e,$4b,
  1048. $c6,$d2,$79,$20,
  1049. $9a,$db,$c0,$fe,
  1050. $78,$cd,$5a,$f4,
  1051. $1f,$dd,$a8,$33,
  1052. $88,$07,$c7,$31,
  1053. $b1,$12,$10,$59,
  1054. $27,$80,$ec,$5f,
  1055. $60,$51,$7f,$a9,
  1056. $19,$b5,$4a,$0d,
  1057. $2d,$e5,$7a,$9f,
  1058. $93,$c9,$9c,$ef,
  1059. $a0,$e0,$3b,$4d,
  1060. $ae,$2a,$f5,$b0,
  1061. $c8,$eb,$bb,$3c,
  1062. $83,$53,$99,$61,
  1063. $17,$2b,$04,$7e,
  1064. $ba,$77,$d6,$26,
  1065. $e1,$69,$14,$63,
  1066. $55,$21,$0c,$7d);
  1067. U1: array[0..255,0..3] of byte= (
  1068. ($00,$00,$00,$00), ($0e,$09,$0d,$0b), ($1c,$12,$1a,$16), ($12,$1b,$17,$1d),
  1069. ($38,$24,$34,$2c), ($36,$2d,$39,$27), ($24,$36,$2e,$3a), ($2a,$3f,$23,$31),
  1070. ($70,$48,$68,$58), ($7e,$41,$65,$53), ($6c,$5a,$72,$4e), ($62,$53,$7f,$45),
  1071. ($48,$6c,$5c,$74), ($46,$65,$51,$7f), ($54,$7e,$46,$62), ($5a,$77,$4b,$69),
  1072. ($e0,$90,$d0,$b0), ($ee,$99,$dd,$bb), ($fc,$82,$ca,$a6), ($f2,$8b,$c7,$ad),
  1073. ($d8,$b4,$e4,$9c), ($d6,$bd,$e9,$97), ($c4,$a6,$fe,$8a), ($ca,$af,$f3,$81),
  1074. ($90,$d8,$b8,$e8), ($9e,$d1,$b5,$e3), ($8c,$ca,$a2,$fe), ($82,$c3,$af,$f5),
  1075. ($a8,$fc,$8c,$c4), ($a6,$f5,$81,$cf), ($b4,$ee,$96,$d2), ($ba,$e7,$9b,$d9),
  1076. ($db,$3b,$bb,$7b), ($d5,$32,$b6,$70), ($c7,$29,$a1,$6d), ($c9,$20,$ac,$66),
  1077. ($e3,$1f,$8f,$57), ($ed,$16,$82,$5c), ($ff,$0d,$95,$41), ($f1,$04,$98,$4a),
  1078. ($ab,$73,$d3,$23), ($a5,$7a,$de,$28), ($b7,$61,$c9,$35), ($b9,$68,$c4,$3e),
  1079. ($93,$57,$e7,$0f), ($9d,$5e,$ea,$04), ($8f,$45,$fd,$19), ($81,$4c,$f0,$12),
  1080. ($3b,$ab,$6b,$cb), ($35,$a2,$66,$c0), ($27,$b9,$71,$dd), ($29,$b0,$7c,$d6),
  1081. ($03,$8f,$5f,$e7), ($0d,$86,$52,$ec), ($1f,$9d,$45,$f1), ($11,$94,$48,$fa),
  1082. ($4b,$e3,$03,$93), ($45,$ea,$0e,$98), ($57,$f1,$19,$85), ($59,$f8,$14,$8e),
  1083. ($73,$c7,$37,$bf), ($7d,$ce,$3a,$b4), ($6f,$d5,$2d,$a9), ($61,$dc,$20,$a2),
  1084. ($ad,$76,$6d,$f6), ($a3,$7f,$60,$fd), ($b1,$64,$77,$e0), ($bf,$6d,$7a,$eb),
  1085. ($95,$52,$59,$da), ($9b,$5b,$54,$d1), ($89,$40,$43,$cc), ($87,$49,$4e,$c7),
  1086. ($dd,$3e,$05,$ae), ($d3,$37,$08,$a5), ($c1,$2c,$1f,$b8), ($cf,$25,$12,$b3),
  1087. ($e5,$1a,$31,$82), ($eb,$13,$3c,$89), ($f9,$08,$2b,$94), ($f7,$01,$26,$9f),
  1088. ($4d,$e6,$bd,$46), ($43,$ef,$b0,$4d), ($51,$f4,$a7,$50), ($5f,$fd,$aa,$5b),
  1089. ($75,$c2,$89,$6a), ($7b,$cb,$84,$61), ($69,$d0,$93,$7c), ($67,$d9,$9e,$77),
  1090. ($3d,$ae,$d5,$1e), ($33,$a7,$d8,$15), ($21,$bc,$cf,$08), ($2f,$b5,$c2,$03),
  1091. ($05,$8a,$e1,$32), ($0b,$83,$ec,$39), ($19,$98,$fb,$24), ($17,$91,$f6,$2f),
  1092. ($76,$4d,$d6,$8d), ($78,$44,$db,$86), ($6a,$5f,$cc,$9b), ($64,$56,$c1,$90),
  1093. ($4e,$69,$e2,$a1), ($40,$60,$ef,$aa), ($52,$7b,$f8,$b7), ($5c,$72,$f5,$bc),
  1094. ($06,$05,$be,$d5), ($08,$0c,$b3,$de), ($1a,$17,$a4,$c3), ($14,$1e,$a9,$c8),
  1095. ($3e,$21,$8a,$f9), ($30,$28,$87,$f2), ($22,$33,$90,$ef), ($2c,$3a,$9d,$e4),
  1096. ($96,$dd,$06,$3d), ($98,$d4,$0b,$36), ($8a,$cf,$1c,$2b), ($84,$c6,$11,$20),
  1097. ($ae,$f9,$32,$11), ($a0,$f0,$3f,$1a), ($b2,$eb,$28,$07), ($bc,$e2,$25,$0c),
  1098. ($e6,$95,$6e,$65), ($e8,$9c,$63,$6e), ($fa,$87,$74,$73), ($f4,$8e,$79,$78),
  1099. ($de,$b1,$5a,$49), ($d0,$b8,$57,$42), ($c2,$a3,$40,$5f), ($cc,$aa,$4d,$54),
  1100. ($41,$ec,$da,$f7), ($4f,$e5,$d7,$fc), ($5d,$fe,$c0,$e1), ($53,$f7,$cd,$ea),
  1101. ($79,$c8,$ee,$db), ($77,$c1,$e3,$d0), ($65,$da,$f4,$cd), ($6b,$d3,$f9,$c6),
  1102. ($31,$a4,$b2,$af), ($3f,$ad,$bf,$a4), ($2d,$b6,$a8,$b9), ($23,$bf,$a5,$b2),
  1103. ($09,$80,$86,$83), ($07,$89,$8b,$88), ($15,$92,$9c,$95), ($1b,$9b,$91,$9e),
  1104. ($a1,$7c,$0a,$47), ($af,$75,$07,$4c), ($bd,$6e,$10,$51), ($b3,$67,$1d,$5a),
  1105. ($99,$58,$3e,$6b), ($97,$51,$33,$60), ($85,$4a,$24,$7d), ($8b,$43,$29,$76),
  1106. ($d1,$34,$62,$1f), ($df,$3d,$6f,$14), ($cd,$26,$78,$09), ($c3,$2f,$75,$02),
  1107. ($e9,$10,$56,$33), ($e7,$19,$5b,$38), ($f5,$02,$4c,$25), ($fb,$0b,$41,$2e),
  1108. ($9a,$d7,$61,$8c), ($94,$de,$6c,$87), ($86,$c5,$7b,$9a), ($88,$cc,$76,$91),
  1109. ($a2,$f3,$55,$a0), ($ac,$fa,$58,$ab), ($be,$e1,$4f,$b6), ($b0,$e8,$42,$bd),
  1110. ($ea,$9f,$09,$d4), ($e4,$96,$04,$df), ($f6,$8d,$13,$c2), ($f8,$84,$1e,$c9),
  1111. ($d2,$bb,$3d,$f8), ($dc,$b2,$30,$f3), ($ce,$a9,$27,$ee), ($c0,$a0,$2a,$e5),
  1112. ($7a,$47,$b1,$3c), ($74,$4e,$bc,$37), ($66,$55,$ab,$2a), ($68,$5c,$a6,$21),
  1113. ($42,$63,$85,$10), ($4c,$6a,$88,$1b), ($5e,$71,$9f,$06), ($50,$78,$92,$0d),
  1114. ($0a,$0f,$d9,$64), ($04,$06,$d4,$6f), ($16,$1d,$c3,$72), ($18,$14,$ce,$79),
  1115. ($32,$2b,$ed,$48), ($3c,$22,$e0,$43), ($2e,$39,$f7,$5e), ($20,$30,$fa,$55),
  1116. ($ec,$9a,$b7,$01), ($e2,$93,$ba,$0a), ($f0,$88,$ad,$17), ($fe,$81,$a0,$1c),
  1117. ($d4,$be,$83,$2d), ($da,$b7,$8e,$26), ($c8,$ac,$99,$3b), ($c6,$a5,$94,$30),
  1118. ($9c,$d2,$df,$59), ($92,$db,$d2,$52), ($80,$c0,$c5,$4f), ($8e,$c9,$c8,$44),
  1119. ($a4,$f6,$eb,$75), ($aa,$ff,$e6,$7e), ($b8,$e4,$f1,$63), ($b6,$ed,$fc,$68),
  1120. ($0c,$0a,$67,$b1), ($02,$03,$6a,$ba), ($10,$18,$7d,$a7), ($1e,$11,$70,$ac),
  1121. ($34,$2e,$53,$9d), ($3a,$27,$5e,$96), ($28,$3c,$49,$8b), ($26,$35,$44,$80),
  1122. ($7c,$42,$0f,$e9), ($72,$4b,$02,$e2), ($60,$50,$15,$ff), ($6e,$59,$18,$f4),
  1123. ($44,$66,$3b,$c5), ($4a,$6f,$36,$ce), ($58,$74,$21,$d3), ($56,$7d,$2c,$d8),
  1124. ($37,$a1,$0c,$7a), ($39,$a8,$01,$71), ($2b,$b3,$16,$6c), ($25,$ba,$1b,$67),
  1125. ($0f,$85,$38,$56), ($01,$8c,$35,$5d), ($13,$97,$22,$40), ($1d,$9e,$2f,$4b),
  1126. ($47,$e9,$64,$22), ($49,$e0,$69,$29), ($5b,$fb,$7e,$34), ($55,$f2,$73,$3f),
  1127. ($7f,$cd,$50,$0e), ($71,$c4,$5d,$05), ($63,$df,$4a,$18), ($6d,$d6,$47,$13),
  1128. ($d7,$31,$dc,$ca), ($d9,$38,$d1,$c1), ($cb,$23,$c6,$dc), ($c5,$2a,$cb,$d7),
  1129. ($ef,$15,$e8,$e6), ($e1,$1c,$e5,$ed), ($f3,$07,$f2,$f0), ($fd,$0e,$ff,$fb),
  1130. ($a7,$79,$b4,$92), ($a9,$70,$b9,$99), ($bb,$6b,$ae,$84), ($b5,$62,$a3,$8f),
  1131. ($9f,$5d,$80,$be), ($91,$54,$8d,$b5), ($83,$4f,$9a,$a8), ($8d,$46,$97,$a3));
  1132. U2: array[0..255,0..3] of byte= (
  1133. ($00,$00,$00,$00), ($0b,$0e,$09,$0d), ($16,$1c,$12,$1a), ($1d,$12,$1b,$17),
  1134. ($2c,$38,$24,$34), ($27,$36,$2d,$39), ($3a,$24,$36,$2e), ($31,$2a,$3f,$23),
  1135. ($58,$70,$48,$68), ($53,$7e,$41,$65), ($4e,$6c,$5a,$72), ($45,$62,$53,$7f),
  1136. ($74,$48,$6c,$5c), ($7f,$46,$65,$51), ($62,$54,$7e,$46), ($69,$5a,$77,$4b),
  1137. ($b0,$e0,$90,$d0), ($bb,$ee,$99,$dd), ($a6,$fc,$82,$ca), ($ad,$f2,$8b,$c7),
  1138. ($9c,$d8,$b4,$e4), ($97,$d6,$bd,$e9), ($8a,$c4,$a6,$fe), ($81,$ca,$af,$f3),
  1139. ($e8,$90,$d8,$b8), ($e3,$9e,$d1,$b5), ($fe,$8c,$ca,$a2), ($f5,$82,$c3,$af),
  1140. ($c4,$a8,$fc,$8c), ($cf,$a6,$f5,$81), ($d2,$b4,$ee,$96), ($d9,$ba,$e7,$9b),
  1141. ($7b,$db,$3b,$bb), ($70,$d5,$32,$b6), ($6d,$c7,$29,$a1), ($66,$c9,$20,$ac),
  1142. ($57,$e3,$1f,$8f), ($5c,$ed,$16,$82), ($41,$ff,$0d,$95), ($4a,$f1,$04,$98),
  1143. ($23,$ab,$73,$d3), ($28,$a5,$7a,$de), ($35,$b7,$61,$c9), ($3e,$b9,$68,$c4),
  1144. ($0f,$93,$57,$e7), ($04,$9d,$5e,$ea), ($19,$8f,$45,$fd), ($12,$81,$4c,$f0),
  1145. ($cb,$3b,$ab,$6b), ($c0,$35,$a2,$66), ($dd,$27,$b9,$71), ($d6,$29,$b0,$7c),
  1146. ($e7,$03,$8f,$5f), ($ec,$0d,$86,$52), ($f1,$1f,$9d,$45), ($fa,$11,$94,$48),
  1147. ($93,$4b,$e3,$03), ($98,$45,$ea,$0e), ($85,$57,$f1,$19), ($8e,$59,$f8,$14),
  1148. ($bf,$73,$c7,$37), ($b4,$7d,$ce,$3a), ($a9,$6f,$d5,$2d), ($a2,$61,$dc,$20),
  1149. ($f6,$ad,$76,$6d), ($fd,$a3,$7f,$60), ($e0,$b1,$64,$77), ($eb,$bf,$6d,$7a),
  1150. ($da,$95,$52,$59), ($d1,$9b,$5b,$54), ($cc,$89,$40,$43), ($c7,$87,$49,$4e),
  1151. ($ae,$dd,$3e,$05), ($a5,$d3,$37,$08), ($b8,$c1,$2c,$1f), ($b3,$cf,$25,$12),
  1152. ($82,$e5,$1a,$31), ($89,$eb,$13,$3c), ($94,$f9,$08,$2b), ($9f,$f7,$01,$26),
  1153. ($46,$4d,$e6,$bd), ($4d,$43,$ef,$b0), ($50,$51,$f4,$a7), ($5b,$5f,$fd,$aa),
  1154. ($6a,$75,$c2,$89), ($61,$7b,$cb,$84), ($7c,$69,$d0,$93), ($77,$67,$d9,$9e),
  1155. ($1e,$3d,$ae,$d5), ($15,$33,$a7,$d8), ($08,$21,$bc,$cf), ($03,$2f,$b5,$c2),
  1156. ($32,$05,$8a,$e1), ($39,$0b,$83,$ec), ($24,$19,$98,$fb), ($2f,$17,$91,$f6),
  1157. ($8d,$76,$4d,$d6), ($86,$78,$44,$db), ($9b,$6a,$5f,$cc), ($90,$64,$56,$c1),
  1158. ($a1,$4e,$69,$e2), ($aa,$40,$60,$ef), ($b7,$52,$7b,$f8), ($bc,$5c,$72,$f5),
  1159. ($d5,$06,$05,$be), ($de,$08,$0c,$b3), ($c3,$1a,$17,$a4), ($c8,$14,$1e,$a9),
  1160. ($f9,$3e,$21,$8a), ($f2,$30,$28,$87), ($ef,$22,$33,$90), ($e4,$2c,$3a,$9d),
  1161. ($3d,$96,$dd,$06), ($36,$98,$d4,$0b), ($2b,$8a,$cf,$1c), ($20,$84,$c6,$11),
  1162. ($11,$ae,$f9,$32), ($1a,$a0,$f0,$3f), ($07,$b2,$eb,$28), ($0c,$bc,$e2,$25),
  1163. ($65,$e6,$95,$6e), ($6e,$e8,$9c,$63), ($73,$fa,$87,$74), ($78,$f4,$8e,$79),
  1164. ($49,$de,$b1,$5a), ($42,$d0,$b8,$57), ($5f,$c2,$a3,$40), ($54,$cc,$aa,$4d),
  1165. ($f7,$41,$ec,$da), ($fc,$4f,$e5,$d7), ($e1,$5d,$fe,$c0), ($ea,$53,$f7,$cd),
  1166. ($db,$79,$c8,$ee), ($d0,$77,$c1,$e3), ($cd,$65,$da,$f4), ($c6,$6b,$d3,$f9),
  1167. ($af,$31,$a4,$b2), ($a4,$3f,$ad,$bf), ($b9,$2d,$b6,$a8), ($b2,$23,$bf,$a5),
  1168. ($83,$09,$80,$86), ($88,$07,$89,$8b), ($95,$15,$92,$9c), ($9e,$1b,$9b,$91),
  1169. ($47,$a1,$7c,$0a), ($4c,$af,$75,$07), ($51,$bd,$6e,$10), ($5a,$b3,$67,$1d),
  1170. ($6b,$99,$58,$3e), ($60,$97,$51,$33), ($7d,$85,$4a,$24), ($76,$8b,$43,$29),
  1171. ($1f,$d1,$34,$62), ($14,$df,$3d,$6f), ($09,$cd,$26,$78), ($02,$c3,$2f,$75),
  1172. ($33,$e9,$10,$56), ($38,$e7,$19,$5b), ($25,$f5,$02,$4c), ($2e,$fb,$0b,$41),
  1173. ($8c,$9a,$d7,$61), ($87,$94,$de,$6c), ($9a,$86,$c5,$7b), ($91,$88,$cc,$76),
  1174. ($a0,$a2,$f3,$55), ($ab,$ac,$fa,$58), ($b6,$be,$e1,$4f), ($bd,$b0,$e8,$42),
  1175. ($d4,$ea,$9f,$09), ($df,$e4,$96,$04), ($c2,$f6,$8d,$13), ($c9,$f8,$84,$1e),
  1176. ($f8,$d2,$bb,$3d), ($f3,$dc,$b2,$30), ($ee,$ce,$a9,$27), ($e5,$c0,$a0,$2a),
  1177. ($3c,$7a,$47,$b1), ($37,$74,$4e,$bc), ($2a,$66,$55,$ab), ($21,$68,$5c,$a6),
  1178. ($10,$42,$63,$85), ($1b,$4c,$6a,$88), ($06,$5e,$71,$9f), ($0d,$50,$78,$92),
  1179. ($64,$0a,$0f,$d9), ($6f,$04,$06,$d4), ($72,$16,$1d,$c3), ($79,$18,$14,$ce),
  1180. ($48,$32,$2b,$ed), ($43,$3c,$22,$e0), ($5e,$2e,$39,$f7), ($55,$20,$30,$fa),
  1181. ($01,$ec,$9a,$b7), ($0a,$e2,$93,$ba), ($17,$f0,$88,$ad), ($1c,$fe,$81,$a0),
  1182. ($2d,$d4,$be,$83), ($26,$da,$b7,$8e), ($3b,$c8,$ac,$99), ($30,$c6,$a5,$94),
  1183. ($59,$9c,$d2,$df), ($52,$92,$db,$d2), ($4f,$80,$c0,$c5), ($44,$8e,$c9,$c8),
  1184. ($75,$a4,$f6,$eb), ($7e,$aa,$ff,$e6), ($63,$b8,$e4,$f1), ($68,$b6,$ed,$fc),
  1185. ($b1,$0c,$0a,$67), ($ba,$02,$03,$6a), ($a7,$10,$18,$7d), ($ac,$1e,$11,$70),
  1186. ($9d,$34,$2e,$53), ($96,$3a,$27,$5e), ($8b,$28,$3c,$49), ($80,$26,$35,$44),
  1187. ($e9,$7c,$42,$0f), ($e2,$72,$4b,$02), ($ff,$60,$50,$15), ($f4,$6e,$59,$18),
  1188. ($c5,$44,$66,$3b), ($ce,$4a,$6f,$36), ($d3,$58,$74,$21), ($d8,$56,$7d,$2c),
  1189. ($7a,$37,$a1,$0c), ($71,$39,$a8,$01), ($6c,$2b,$b3,$16), ($67,$25,$ba,$1b),
  1190. ($56,$0f,$85,$38), ($5d,$01,$8c,$35), ($40,$13,$97,$22), ($4b,$1d,$9e,$2f),
  1191. ($22,$47,$e9,$64), ($29,$49,$e0,$69), ($34,$5b,$fb,$7e), ($3f,$55,$f2,$73),
  1192. ($0e,$7f,$cd,$50), ($05,$71,$c4,$5d), ($18,$63,$df,$4a), ($13,$6d,$d6,$47),
  1193. ($ca,$d7,$31,$dc), ($c1,$d9,$38,$d1), ($dc,$cb,$23,$c6), ($d7,$c5,$2a,$cb),
  1194. ($e6,$ef,$15,$e8), ($ed,$e1,$1c,$e5), ($f0,$f3,$07,$f2), ($fb,$fd,$0e,$ff),
  1195. ($92,$a7,$79,$b4), ($99,$a9,$70,$b9), ($84,$bb,$6b,$ae), ($8f,$b5,$62,$a3),
  1196. ($be,$9f,$5d,$80), ($b5,$91,$54,$8d), ($a8,$83,$4f,$9a), ($a3,$8d,$46,$97));
  1197. U3: array[0..255,0..3] of byte= (
  1198. ($00,$00,$00,$00), ($0d,$0b,$0e,$09), ($1a,$16,$1c,$12), ($17,$1d,$12,$1b),
  1199. ($34,$2c,$38,$24), ($39,$27,$36,$2d), ($2e,$3a,$24,$36), ($23,$31,$2a,$3f),
  1200. ($68,$58,$70,$48), ($65,$53,$7e,$41), ($72,$4e,$6c,$5a), ($7f,$45,$62,$53),
  1201. ($5c,$74,$48,$6c), ($51,$7f,$46,$65), ($46,$62,$54,$7e), ($4b,$69,$5a,$77),
  1202. ($d0,$b0,$e0,$90), ($dd,$bb,$ee,$99), ($ca,$a6,$fc,$82), ($c7,$ad,$f2,$8b),
  1203. ($e4,$9c,$d8,$b4), ($e9,$97,$d6,$bd), ($fe,$8a,$c4,$a6), ($f3,$81,$ca,$af),
  1204. ($b8,$e8,$90,$d8), ($b5,$e3,$9e,$d1), ($a2,$fe,$8c,$ca), ($af,$f5,$82,$c3),
  1205. ($8c,$c4,$a8,$fc), ($81,$cf,$a6,$f5), ($96,$d2,$b4,$ee), ($9b,$d9,$ba,$e7),
  1206. ($bb,$7b,$db,$3b), ($b6,$70,$d5,$32), ($a1,$6d,$c7,$29), ($ac,$66,$c9,$20),
  1207. ($8f,$57,$e3,$1f), ($82,$5c,$ed,$16), ($95,$41,$ff,$0d), ($98,$4a,$f1,$04),
  1208. ($d3,$23,$ab,$73), ($de,$28,$a5,$7a), ($c9,$35,$b7,$61), ($c4,$3e,$b9,$68),
  1209. ($e7,$0f,$93,$57), ($ea,$04,$9d,$5e), ($fd,$19,$8f,$45), ($f0,$12,$81,$4c),
  1210. ($6b,$cb,$3b,$ab), ($66,$c0,$35,$a2), ($71,$dd,$27,$b9), ($7c,$d6,$29,$b0),
  1211. ($5f,$e7,$03,$8f), ($52,$ec,$0d,$86), ($45,$f1,$1f,$9d), ($48,$fa,$11,$94),
  1212. ($03,$93,$4b,$e3), ($0e,$98,$45,$ea), ($19,$85,$57,$f1), ($14,$8e,$59,$f8),
  1213. ($37,$bf,$73,$c7), ($3a,$b4,$7d,$ce), ($2d,$a9,$6f,$d5), ($20,$a2,$61,$dc),
  1214. ($6d,$f6,$ad,$76), ($60,$fd,$a3,$7f), ($77,$e0,$b1,$64), ($7a,$eb,$bf,$6d),
  1215. ($59,$da,$95,$52), ($54,$d1,$9b,$5b), ($43,$cc,$89,$40), ($4e,$c7,$87,$49),
  1216. ($05,$ae,$dd,$3e), ($08,$a5,$d3,$37), ($1f,$b8,$c1,$2c), ($12,$b3,$cf,$25),
  1217. ($31,$82,$e5,$1a), ($3c,$89,$eb,$13), ($2b,$94,$f9,$08), ($26,$9f,$f7,$01),
  1218. ($bd,$46,$4d,$e6), ($b0,$4d,$43,$ef), ($a7,$50,$51,$f4), ($aa,$5b,$5f,$fd),
  1219. ($89,$6a,$75,$c2), ($84,$61,$7b,$cb), ($93,$7c,$69,$d0), ($9e,$77,$67,$d9),
  1220. ($d5,$1e,$3d,$ae), ($d8,$15,$33,$a7), ($cf,$08,$21,$bc), ($c2,$03,$2f,$b5),
  1221. ($e1,$32,$05,$8a), ($ec,$39,$0b,$83), ($fb,$24,$19,$98), ($f6,$2f,$17,$91),
  1222. ($d6,$8d,$76,$4d), ($db,$86,$78,$44), ($cc,$9b,$6a,$5f), ($c1,$90,$64,$56),
  1223. ($e2,$a1,$4e,$69), ($ef,$aa,$40,$60), ($f8,$b7,$52,$7b), ($f5,$bc,$5c,$72),
  1224. ($be,$d5,$06,$05), ($b3,$de,$08,$0c), ($a4,$c3,$1a,$17), ($a9,$c8,$14,$1e),
  1225. ($8a,$f9,$3e,$21), ($87,$f2,$30,$28), ($90,$ef,$22,$33), ($9d,$e4,$2c,$3a),
  1226. ($06,$3d,$96,$dd), ($0b,$36,$98,$d4), ($1c,$2b,$8a,$cf), ($11,$20,$84,$c6),
  1227. ($32,$11,$ae,$f9), ($3f,$1a,$a0,$f0), ($28,$07,$b2,$eb), ($25,$0c,$bc,$e2),
  1228. ($6e,$65,$e6,$95), ($63,$6e,$e8,$9c), ($74,$73,$fa,$87), ($79,$78,$f4,$8e),
  1229. ($5a,$49,$de,$b1), ($57,$42,$d0,$b8), ($40,$5f,$c2,$a3), ($4d,$54,$cc,$aa),
  1230. ($da,$f7,$41,$ec), ($d7,$fc,$4f,$e5), ($c0,$e1,$5d,$fe), ($cd,$ea,$53,$f7),
  1231. ($ee,$db,$79,$c8), ($e3,$d0,$77,$c1), ($f4,$cd,$65,$da), ($f9,$c6,$6b,$d3),
  1232. ($b2,$af,$31,$a4), ($bf,$a4,$3f,$ad), ($a8,$b9,$2d,$b6), ($a5,$b2,$23,$bf),
  1233. ($86,$83,$09,$80), ($8b,$88,$07,$89), ($9c,$95,$15,$92), ($91,$9e,$1b,$9b),
  1234. ($0a,$47,$a1,$7c), ($07,$4c,$af,$75), ($10,$51,$bd,$6e), ($1d,$5a,$b3,$67),
  1235. ($3e,$6b,$99,$58), ($33,$60,$97,$51), ($24,$7d,$85,$4a), ($29,$76,$8b,$43),
  1236. ($62,$1f,$d1,$34), ($6f,$14,$df,$3d), ($78,$09,$cd,$26), ($75,$02,$c3,$2f),
  1237. ($56,$33,$e9,$10), ($5b,$38,$e7,$19), ($4c,$25,$f5,$02), ($41,$2e,$fb,$0b),
  1238. ($61,$8c,$9a,$d7), ($6c,$87,$94,$de), ($7b,$9a,$86,$c5), ($76,$91,$88,$cc),
  1239. ($55,$a0,$a2,$f3), ($58,$ab,$ac,$fa), ($4f,$b6,$be,$e1), ($42,$bd,$b0,$e8),
  1240. ($09,$d4,$ea,$9f), ($04,$df,$e4,$96), ($13,$c2,$f6,$8d), ($1e,$c9,$f8,$84),
  1241. ($3d,$f8,$d2,$bb), ($30,$f3,$dc,$b2), ($27,$ee,$ce,$a9), ($2a,$e5,$c0,$a0),
  1242. ($b1,$3c,$7a,$47), ($bc,$37,$74,$4e), ($ab,$2a,$66,$55), ($a6,$21,$68,$5c),
  1243. ($85,$10,$42,$63), ($88,$1b,$4c,$6a), ($9f,$06,$5e,$71), ($92,$0d,$50,$78),
  1244. ($d9,$64,$0a,$0f), ($d4,$6f,$04,$06), ($c3,$72,$16,$1d), ($ce,$79,$18,$14),
  1245. ($ed,$48,$32,$2b), ($e0,$43,$3c,$22), ($f7,$5e,$2e,$39), ($fa,$55,$20,$30),
  1246. ($b7,$01,$ec,$9a), ($ba,$0a,$e2,$93), ($ad,$17,$f0,$88), ($a0,$1c,$fe,$81),
  1247. ($83,$2d,$d4,$be), ($8e,$26,$da,$b7), ($99,$3b,$c8,$ac), ($94,$30,$c6,$a5),
  1248. ($df,$59,$9c,$d2), ($d2,$52,$92,$db), ($c5,$4f,$80,$c0), ($c8,$44,$8e,$c9),
  1249. ($eb,$75,$a4,$f6), ($e6,$7e,$aa,$ff), ($f1,$63,$b8,$e4), ($fc,$68,$b6,$ed),
  1250. ($67,$b1,$0c,$0a), ($6a,$ba,$02,$03), ($7d,$a7,$10,$18), ($70,$ac,$1e,$11),
  1251. ($53,$9d,$34,$2e), ($5e,$96,$3a,$27), ($49,$8b,$28,$3c), ($44,$80,$26,$35),
  1252. ($0f,$e9,$7c,$42), ($02,$e2,$72,$4b), ($15,$ff,$60,$50), ($18,$f4,$6e,$59),
  1253. ($3b,$c5,$44,$66), ($36,$ce,$4a,$6f), ($21,$d3,$58,$74), ($2c,$d8,$56,$7d),
  1254. ($0c,$7a,$37,$a1), ($01,$71,$39,$a8), ($16,$6c,$2b,$b3), ($1b,$67,$25,$ba),
  1255. ($38,$56,$0f,$85), ($35,$5d,$01,$8c), ($22,$40,$13,$97), ($2f,$4b,$1d,$9e),
  1256. ($64,$22,$47,$e9), ($69,$29,$49,$e0), ($7e,$34,$5b,$fb), ($73,$3f,$55,$f2),
  1257. ($50,$0e,$7f,$cd), ($5d,$05,$71,$c4), ($4a,$18,$63,$df), ($47,$13,$6d,$d6),
  1258. ($dc,$ca,$d7,$31), ($d1,$c1,$d9,$38), ($c6,$dc,$cb,$23), ($cb,$d7,$c5,$2a),
  1259. ($e8,$e6,$ef,$15), ($e5,$ed,$e1,$1c), ($f2,$f0,$f3,$07), ($ff,$fb,$fd,$0e),
  1260. ($b4,$92,$a7,$79), ($b9,$99,$a9,$70), ($ae,$84,$bb,$6b), ($a3,$8f,$b5,$62),
  1261. ($80,$be,$9f,$5d), ($8d,$b5,$91,$54), ($9a,$a8,$83,$4f), ($97,$a3,$8d,$46));
  1262. U4: array[0..255,0..3] of byte= (
  1263. ($00,$00,$00,$00), ($09,$0d,$0b,$0e), ($12,$1a,$16,$1c), ($1b,$17,$1d,$12),
  1264. ($24,$34,$2c,$38), ($2d,$39,$27,$36), ($36,$2e,$3a,$24), ($3f,$23,$31,$2a),
  1265. ($48,$68,$58,$70), ($41,$65,$53,$7e), ($5a,$72,$4e,$6c), ($53,$7f,$45,$62),
  1266. ($6c,$5c,$74,$48), ($65,$51,$7f,$46), ($7e,$46,$62,$54), ($77,$4b,$69,$5a),
  1267. ($90,$d0,$b0,$e0), ($99,$dd,$bb,$ee), ($82,$ca,$a6,$fc), ($8b,$c7,$ad,$f2),
  1268. ($b4,$e4,$9c,$d8), ($bd,$e9,$97,$d6), ($a6,$fe,$8a,$c4), ($af,$f3,$81,$ca),
  1269. ($d8,$b8,$e8,$90), ($d1,$b5,$e3,$9e), ($ca,$a2,$fe,$8c), ($c3,$af,$f5,$82),
  1270. ($fc,$8c,$c4,$a8), ($f5,$81,$cf,$a6), ($ee,$96,$d2,$b4), ($e7,$9b,$d9,$ba),
  1271. ($3b,$bb,$7b,$db), ($32,$b6,$70,$d5), ($29,$a1,$6d,$c7), ($20,$ac,$66,$c9),
  1272. ($1f,$8f,$57,$e3), ($16,$82,$5c,$ed), ($0d,$95,$41,$ff), ($04,$98,$4a,$f1),
  1273. ($73,$d3,$23,$ab), ($7a,$de,$28,$a5), ($61,$c9,$35,$b7), ($68,$c4,$3e,$b9),
  1274. ($57,$e7,$0f,$93), ($5e,$ea,$04,$9d), ($45,$fd,$19,$8f), ($4c,$f0,$12,$81),
  1275. ($ab,$6b,$cb,$3b), ($a2,$66,$c0,$35), ($b9,$71,$dd,$27), ($b0,$7c,$d6,$29),
  1276. ($8f,$5f,$e7,$03), ($86,$52,$ec,$0d), ($9d,$45,$f1,$1f), ($94,$48,$fa,$11),
  1277. ($e3,$03,$93,$4b), ($ea,$0e,$98,$45), ($f1,$19,$85,$57), ($f8,$14,$8e,$59),
  1278. ($c7,$37,$bf,$73), ($ce,$3a,$b4,$7d), ($d5,$2d,$a9,$6f), ($dc,$20,$a2,$61),
  1279. ($76,$6d,$f6,$ad), ($7f,$60,$fd,$a3), ($64,$77,$e0,$b1), ($6d,$7a,$eb,$bf),
  1280. ($52,$59,$da,$95), ($5b,$54,$d1,$9b), ($40,$43,$cc,$89), ($49,$4e,$c7,$87),
  1281. ($3e,$05,$ae,$dd), ($37,$08,$a5,$d3), ($2c,$1f,$b8,$c1), ($25,$12,$b3,$cf),
  1282. ($1a,$31,$82,$e5), ($13,$3c,$89,$eb), ($08,$2b,$94,$f9), ($01,$26,$9f,$f7),
  1283. ($e6,$bd,$46,$4d), ($ef,$b0,$4d,$43), ($f4,$a7,$50,$51), ($fd,$aa,$5b,$5f),
  1284. ($c2,$89,$6a,$75), ($cb,$84,$61,$7b), ($d0,$93,$7c,$69), ($d9,$9e,$77,$67),
  1285. ($ae,$d5,$1e,$3d), ($a7,$d8,$15,$33), ($bc,$cf,$08,$21), ($b5,$c2,$03,$2f),
  1286. ($8a,$e1,$32,$05), ($83,$ec,$39,$0b), ($98,$fb,$24,$19), ($91,$f6,$2f,$17),
  1287. ($4d,$d6,$8d,$76), ($44,$db,$86,$78), ($5f,$cc,$9b,$6a), ($56,$c1,$90,$64),
  1288. ($69,$e2,$a1,$4e), ($60,$ef,$aa,$40), ($7b,$f8,$b7,$52), ($72,$f5,$bc,$5c),
  1289. ($05,$be,$d5,$06), ($0c,$b3,$de,$08), ($17,$a4,$c3,$1a), ($1e,$a9,$c8,$14),
  1290. ($21,$8a,$f9,$3e), ($28,$87,$f2,$30), ($33,$90,$ef,$22), ($3a,$9d,$e4,$2c),
  1291. ($dd,$06,$3d,$96), ($d4,$0b,$36,$98), ($cf,$1c,$2b,$8a), ($c6,$11,$20,$84),
  1292. ($f9,$32,$11,$ae), ($f0,$3f,$1a,$a0), ($eb,$28,$07,$b2), ($e2,$25,$0c,$bc),
  1293. ($95,$6e,$65,$e6), ($9c,$63,$6e,$e8), ($87,$74,$73,$fa), ($8e,$79,$78,$f4),
  1294. ($b1,$5a,$49,$de), ($b8,$57,$42,$d0), ($a3,$40,$5f,$c2), ($aa,$4d,$54,$cc),
  1295. ($ec,$da,$f7,$41), ($e5,$d7,$fc,$4f), ($fe,$c0,$e1,$5d), ($f7,$cd,$ea,$53),
  1296. ($c8,$ee,$db,$79), ($c1,$e3,$d0,$77), ($da,$f4,$cd,$65), ($d3,$f9,$c6,$6b),
  1297. ($a4,$b2,$af,$31), ($ad,$bf,$a4,$3f), ($b6,$a8,$b9,$2d), ($bf,$a5,$b2,$23),
  1298. ($80,$86,$83,$09), ($89,$8b,$88,$07), ($92,$9c,$95,$15), ($9b,$91,$9e,$1b),
  1299. ($7c,$0a,$47,$a1), ($75,$07,$4c,$af), ($6e,$10,$51,$bd), ($67,$1d,$5a,$b3),
  1300. ($58,$3e,$6b,$99), ($51,$33,$60,$97), ($4a,$24,$7d,$85), ($43,$29,$76,$8b),
  1301. ($34,$62,$1f,$d1), ($3d,$6f,$14,$df), ($26,$78,$09,$cd), ($2f,$75,$02,$c3),
  1302. ($10,$56,$33,$e9), ($19,$5b,$38,$e7), ($02,$4c,$25,$f5), ($0b,$41,$2e,$fb),
  1303. ($d7,$61,$8c,$9a), ($de,$6c,$87,$94), ($c5,$7b,$9a,$86), ($cc,$76,$91,$88),
  1304. ($f3,$55,$a0,$a2), ($fa,$58,$ab,$ac), ($e1,$4f,$b6,$be), ($e8,$42,$bd,$b0),
  1305. ($9f,$09,$d4,$ea), ($96,$04,$df,$e4), ($8d,$13,$c2,$f6), ($84,$1e,$c9,$f8),
  1306. ($bb,$3d,$f8,$d2), ($b2,$30,$f3,$dc), ($a9,$27,$ee,$ce), ($a0,$2a,$e5,$c0),
  1307. ($47,$b1,$3c,$7a), ($4e,$bc,$37,$74), ($55,$ab,$2a,$66), ($5c,$a6,$21,$68),
  1308. ($63,$85,$10,$42), ($6a,$88,$1b,$4c), ($71,$9f,$06,$5e), ($78,$92,$0d,$50),
  1309. ($0f,$d9,$64,$0a), ($06,$d4,$6f,$04), ($1d,$c3,$72,$16), ($14,$ce,$79,$18),
  1310. ($2b,$ed,$48,$32), ($22,$e0,$43,$3c), ($39,$f7,$5e,$2e), ($30,$fa,$55,$20),
  1311. ($9a,$b7,$01,$ec), ($93,$ba,$0a,$e2), ($88,$ad,$17,$f0), ($81,$a0,$1c,$fe),
  1312. ($be,$83,$2d,$d4), ($b7,$8e,$26,$da), ($ac,$99,$3b,$c8), ($a5,$94,$30,$c6),
  1313. ($d2,$df,$59,$9c), ($db,$d2,$52,$92), ($c0,$c5,$4f,$80), ($c9,$c8,$44,$8e),
  1314. ($f6,$eb,$75,$a4), ($ff,$e6,$7e,$aa), ($e4,$f1,$63,$b8), ($ed,$fc,$68,$b6),
  1315. ($0a,$67,$b1,$0c), ($03,$6a,$ba,$02), ($18,$7d,$a7,$10), ($11,$70,$ac,$1e),
  1316. ($2e,$53,$9d,$34), ($27,$5e,$96,$3a), ($3c,$49,$8b,$28), ($35,$44,$80,$26),
  1317. ($42,$0f,$e9,$7c), ($4b,$02,$e2,$72), ($50,$15,$ff,$60), ($59,$18,$f4,$6e),
  1318. ($66,$3b,$c5,$44), ($6f,$36,$ce,$4a), ($74,$21,$d3,$58), ($7d,$2c,$d8,$56),
  1319. ($a1,$0c,$7a,$37), ($a8,$01,$71,$39), ($b3,$16,$6c,$2b), ($ba,$1b,$67,$25),
  1320. ($85,$38,$56,$0f), ($8c,$35,$5d,$01), ($97,$22,$40,$13), ($9e,$2f,$4b,$1d),
  1321. ($e9,$64,$22,$47), ($e0,$69,$29,$49), ($fb,$7e,$34,$5b), ($f2,$73,$3f,$55),
  1322. ($cd,$50,$0e,$7f), ($c4,$5d,$05,$71), ($df,$4a,$18,$63), ($d6,$47,$13,$6d),
  1323. ($31,$dc,$ca,$d7), ($38,$d1,$c1,$d9), ($23,$c6,$dc,$cb), ($2a,$cb,$d7,$c5),
  1324. ($15,$e8,$e6,$ef), ($1c,$e5,$ed,$e1), ($07,$f2,$f0,$f3), ($0e,$ff,$fb,$fd),
  1325. ($79,$b4,$92,$a7), ($70,$b9,$99,$a9), ($6b,$ae,$84,$bb), ($62,$a3,$8f,$b5),
  1326. ($5d,$80,$be,$9f), ($54,$8d,$b5,$91), ($4f,$9a,$a8,$83), ($46,$97,$a3,$8d));
  1327. rcon: array[0..29] of cardinal= (
  1328. $01, $02, $04, $08, $10, $20, $40, $80, $1b, $36, $6c, $d8, $ab, $4d, $9a,
  1329. $2f, $5e, $bc, $63, $c6, $97, $35, $6a, $d4, $b3, $7d, $fa, $ef, $c5, $91);
  1330. {==============================================================================}
  1331. type
  1332. PDWord = ^FixedUInt;
  1333. procedure hperm_op(var a, t: integer; n, m: integer);
  1334. begin
  1335. t:= ((a shl (16 - n)) xor a) and m;
  1336. a:= a xor t xor (t shr (16 - n));
  1337. end;
  1338. procedure perm_op(var a, b, t: integer; n, m: integer);
  1339. begin
  1340. t:= ((a shr n) xor b) and m;
  1341. b:= b xor t;
  1342. a:= a xor (t shl n);
  1343. end;
  1344. {==============================================================================}
  1345. function TSynaBlockCipher.GetSize: byte;
  1346. begin
  1347. Result := 8;
  1348. end;
  1349. procedure TSynaBlockCipher.IncCounter;
  1350. var
  1351. i: integer;
  1352. begin
  1353. Inc(CV[GetSize]);
  1354. i:= GetSize -1;
  1355. while (i> 0) and (CV[i + 1] = #0) do
  1356. begin
  1357. Inc(CV[i]);
  1358. Dec(i);
  1359. end;
  1360. end;
  1361. procedure TSynaBlockCipher.Reset;
  1362. begin
  1363. CV := IV;
  1364. end;
  1365. procedure TSynaBlockCipher.InitKey(Key: AnsiString);
  1366. begin
  1367. end;
  1368. procedure TSynaBlockCipher.SetIV(const Value: AnsiString);
  1369. begin
  1370. IV := PadString(Value, GetSize, #0);
  1371. Reset;
  1372. end;
  1373. function TSynaBlockCipher.GetIV: AnsiString;
  1374. begin
  1375. Result := CV;
  1376. end;
  1377. function TSynaBlockCipher.EncryptECB(const InData: AnsiString): AnsiString;
  1378. begin
  1379. Result := InData;
  1380. end;
  1381. function TSynaBlockCipher.DecryptECB(const InData: AnsiString): AnsiString;
  1382. begin
  1383. Result := InData;
  1384. end;
  1385. function TSynaBlockCipher.EncryptCBC(const Indata: AnsiString): AnsiString;
  1386. var
  1387. i: integer;
  1388. s: ansistring;
  1389. l: integer;
  1390. bs: byte;
  1391. begin
  1392. Result := '';
  1393. l := Length(InData);
  1394. bs := GetSize;
  1395. for i:= 1 to (l div bs) do
  1396. begin
  1397. s := copy(Indata, (i - 1) * bs + 1, bs);
  1398. s := XorString(s, CV);
  1399. s := EncryptECB(s);
  1400. CV := s;
  1401. Result := Result + s;
  1402. end;
  1403. if (l mod bs)<> 0 then
  1404. begin
  1405. CV := EncryptECB(CV);
  1406. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1407. s := XorString(s, CV);
  1408. Result := Result + s;
  1409. end;
  1410. end;
  1411. function TSynaBlockCipher.DecryptCBC(const Indata: AnsiString): AnsiString;
  1412. var
  1413. i: integer;
  1414. s, temp: ansistring;
  1415. l: integer;
  1416. bs: byte;
  1417. begin
  1418. Result := '';
  1419. l := Length(InData);
  1420. bs := GetSize;
  1421. for i:= 1 to (l div bs) do
  1422. begin
  1423. s := copy(Indata, (i - 1) * bs + 1, bs);
  1424. temp := s;
  1425. s := DecryptECB(s);
  1426. s := XorString(s, CV);
  1427. Result := Result + s;
  1428. CV := Temp;
  1429. end;
  1430. if (l mod bs)<> 0 then
  1431. begin
  1432. CV := EncryptECB(CV);
  1433. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1434. s := XorString(s, CV);
  1435. Result := Result + s;
  1436. end;
  1437. end;
  1438. function TSynaBlockCipher.EncryptCFB8bit(const Indata: AnsiString): AnsiString;
  1439. var
  1440. i: integer;
  1441. Temp: AnsiString;
  1442. c: AnsiChar;
  1443. begin
  1444. Result := '';
  1445. for i:= 1 to Length(Indata) do
  1446. begin
  1447. Temp := EncryptECB(CV);
  1448. c := AnsiChar(ord(InData[i]) xor ord(temp[1]));
  1449. Result := Result + c;
  1450. Delete(CV, 1, 1);
  1451. CV := CV + c;
  1452. end;
  1453. end;
  1454. function TSynaBlockCipher.DecryptCFB8bit(const Indata: AnsiString): AnsiString;
  1455. var
  1456. i: integer;
  1457. Temp: AnsiString;
  1458. c: AnsiChar;
  1459. begin
  1460. Result := '';
  1461. for i:= 1 to length(Indata) do
  1462. begin
  1463. c:= Indata[i];
  1464. Temp := EncryptECB(CV);
  1465. Result := Result + AnsiChar(ord(InData[i]) xor ord(temp[1]));
  1466. Delete(CV, 1, 1);
  1467. CV := CV + c;
  1468. end;
  1469. end;
  1470. function TSynaBlockCipher.EncryptCFBblock(const Indata: AnsiString): AnsiString;
  1471. var
  1472. i: integer;
  1473. s: AnsiString;
  1474. l: integer;
  1475. bs: byte;
  1476. begin
  1477. Result := '';
  1478. l := Length(InData);
  1479. bs := GetSize;
  1480. for i:= 1 to (l div bs) do
  1481. begin
  1482. CV := EncryptECB(CV);
  1483. s := copy(Indata, (i - 1) * bs + 1, bs);
  1484. s := XorString(s, CV);
  1485. Result := Result + s;
  1486. CV := s;
  1487. end;
  1488. if (l mod bs)<> 0 then
  1489. begin
  1490. CV := EncryptECB(CV);
  1491. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1492. s := XorString(s, CV);
  1493. Result := Result + s;
  1494. end;
  1495. end;
  1496. function TSynaBlockCipher.DecryptCFBblock(const Indata: AnsiString): AnsiString;
  1497. var
  1498. i: integer;
  1499. S, Temp: AnsiString;
  1500. l: integer;
  1501. bs: byte;
  1502. begin
  1503. Result := '';
  1504. l := Length(InData);
  1505. bs := GetSize;
  1506. for i:= 1 to (l div bs) do
  1507. begin
  1508. s := copy(Indata, (i - 1) * bs + 1, bs);
  1509. Temp := s;
  1510. CV := EncryptECB(CV);
  1511. s := XorString(s, CV);
  1512. Result := result + s;
  1513. CV := temp;
  1514. end;
  1515. if (l mod bs)<> 0 then
  1516. begin
  1517. CV := EncryptECB(CV);
  1518. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1519. s := XorString(s, CV);
  1520. Result := Result + s;
  1521. end;
  1522. end;
  1523. function TSynaBlockCipher.EncryptOFB(const Indata: AnsiString): AnsiString;
  1524. var
  1525. i: integer;
  1526. s: AnsiString;
  1527. l: integer;
  1528. bs: byte;
  1529. begin
  1530. Result := '';
  1531. l := Length(InData);
  1532. bs := GetSize;
  1533. for i:= 1 to (l div bs) do
  1534. begin
  1535. CV := EncryptECB(CV);
  1536. s := copy(Indata, (i - 1) * bs + 1, bs);
  1537. s := XorString(s, CV);
  1538. Result := Result + s;
  1539. end;
  1540. if (l mod bs)<> 0 then
  1541. begin
  1542. CV := EncryptECB(CV);
  1543. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1544. s := XorString(s, CV);
  1545. Result := Result + s;
  1546. end;
  1547. end;
  1548. function TSynaBlockCipher.DecryptOFB(const Indata: AnsiString): AnsiString;
  1549. var
  1550. i: integer;
  1551. s: AnsiString;
  1552. l: integer;
  1553. bs: byte;
  1554. begin
  1555. Result := '';
  1556. l := Length(InData);
  1557. bs := GetSize;
  1558. for i:= 1 to (l div bs) do
  1559. begin
  1560. Cv := EncryptECB(CV);
  1561. s := copy(Indata, (i - 1) * bs + 1, bs);
  1562. s := XorString(s, CV);
  1563. Result := Result + s;
  1564. end;
  1565. if (l mod bs)<> 0 then
  1566. begin
  1567. CV := EncryptECB(CV);
  1568. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1569. s := XorString(s, CV);
  1570. Result := Result + s;
  1571. end;
  1572. end;
  1573. function TSynaBlockCipher.EncryptCTR(const Indata: AnsiString): AnsiString;
  1574. var
  1575. temp: AnsiString;
  1576. i: integer;
  1577. s: AnsiString;
  1578. l: integer;
  1579. bs: byte;
  1580. begin
  1581. Result := '';
  1582. l := Length(InData);
  1583. bs := GetSize;
  1584. for i:= 1 to (l div bs) do
  1585. begin
  1586. temp := EncryptECB(CV);
  1587. IncCounter;
  1588. s := copy(Indata, (i - 1) * bs + 1, bs);
  1589. s := XorString(s, temp);
  1590. Result := Result + s;
  1591. end;
  1592. if (l mod bs)<> 0 then
  1593. begin
  1594. temp := EncryptECB(CV);
  1595. IncCounter;
  1596. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1597. s := XorString(s, temp);
  1598. Result := Result + s;
  1599. end;
  1600. end;
  1601. function TSynaBlockCipher.DecryptCTR(const Indata: AnsiString): AnsiString;
  1602. var
  1603. temp: AnsiString;
  1604. s: AnsiString;
  1605. i: integer;
  1606. l: integer;
  1607. bs: byte;
  1608. begin
  1609. Result := '';
  1610. l := Length(InData);
  1611. bs := GetSize;
  1612. for i:= 1 to (l div bs) do
  1613. begin
  1614. temp := EncryptECB(CV);
  1615. IncCounter;
  1616. s := copy(Indata, (i - 1) * bs + 1, bs);
  1617. s := XorString(s, temp);
  1618. Result := Result + s;
  1619. end;
  1620. if (l mod bs)<> 0 then
  1621. begin
  1622. temp := EncryptECB(CV);
  1623. IncCounter;
  1624. s := copy(Indata, (l div bs) * bs + 1, l mod bs);
  1625. s := XorString(s, temp);
  1626. Result := Result + s;
  1627. end;
  1628. end;
  1629. constructor TSynaBlockCipher.Create(Key: AnsiString);
  1630. begin
  1631. inherited Create;
  1632. InitKey(Key);
  1633. IV := StringOfChar(#0, GetSize);
  1634. IV := EncryptECB(IV);
  1635. Reset;
  1636. end;
  1637. {==============================================================================}
  1638. procedure TSynaCustomDes.DoInit(KeyB: AnsiString; var KeyData: TDesKeyData);
  1639. var
  1640. c, d, t, s, t2, i: integer;
  1641. begin
  1642. KeyB := PadString(KeyB, 8, #0);
  1643. c:= ord(KeyB[1]) or (ord(KeyB[2]) shl 8) or (ord(KeyB[3]) shl 16) or (ord(KeyB[4]) shl 24);
  1644. d:= ord(KeyB[5]) or (ord(KeyB[6]) shl 8) or (ord(KeyB[7]) shl 16) or (ord(KeyB[8]) shl 24);
  1645. perm_op(d,c,t,4,integer($0f0f0f0f));
  1646. hperm_op(c,t,integer(-2),integer($cccc0000));
  1647. hperm_op(d,t,integer(-2),integer($cccc0000));
  1648. perm_op(d,c,t,1,integer($55555555));
  1649. perm_op(c,d,t,8,integer($00ff00ff));
  1650. perm_op(d,c,t,1,integer($55555555));
  1651. d:= ((d and $ff) shl 16) or (d and $ff00) or ((d and $ff0000) shr 16) or
  1652. ((c and integer($f0000000)) shr 4);
  1653. c:= c and $fffffff;
  1654. for i:= 0 to 15 do
  1655. begin
  1656. if shifts2[i]<> 0 then
  1657. begin
  1658. c:= ((c shr 2) or (c shl 26));
  1659. d:= ((d shr 2) or (d shl 26));
  1660. end
  1661. else
  1662. begin
  1663. c:= ((c shr 1) or (c shl 27));
  1664. d:= ((d shr 1) or (d shl 27));
  1665. end;
  1666. c:= c and $fffffff;
  1667. d:= d and $fffffff;
  1668. s:= des_skb[0,c and $3f] or
  1669. des_skb[1,((c shr 6) and $03) or ((c shr 7) and $3c)] or
  1670. des_skb[2,((c shr 13) and $0f) or ((c shr 14) and $30)] or
  1671. des_skb[3,((c shr 20) and $01) or ((c shr 21) and $06) or ((c shr 22) and $38)];
  1672. t:= des_skb[4,d and $3f] or
  1673. des_skb[5,((d shr 7) and $03) or ((d shr 8) and $3c)] or
  1674. des_skb[6, (d shr 15) and $3f ] or
  1675. des_skb[7,((d shr 21) and $0f) or ((d shr 22) and $30)];
  1676. t2:= ((t shl 16) or (s and $ffff));
  1677. KeyData[(i shl 1)]:= ((t2 shl 2) or (t2 shr 30));
  1678. t2:= ((s shr 16) or (t and integer($ffff0000)));
  1679. KeyData[(i shl 1)+1]:= ((t2 shl 6) or (t2 shr 26));
  1680. end;
  1681. end;
  1682. function TSynaCustomDes.EncryptBlock(const InData: AnsiString; var KeyData: TDesKeyData): AnsiString;
  1683. var
  1684. l, r, t, u: integer;
  1685. i: longint;
  1686. begin
  1687. r := Swapbytes(DecodeLongint(Indata, 1));
  1688. l := swapbytes(DecodeLongint(Indata, 5));
  1689. t:= ((l shr 4) xor r) and $0f0f0f0f;
  1690. r:= r xor t;
  1691. l:= l xor (t shl 4);
  1692. t:= ((r shr 16) xor l) and $0000ffff;
  1693. l:= l xor t;
  1694. r:= r xor (t shl 16);
  1695. t:= ((l shr 2) xor r) and $33333333;
  1696. r:= r xor t;
  1697. l:= l xor (t shl 2);
  1698. t:= ((r shr 8) xor l) and $00ff00ff;
  1699. l:= l xor t;
  1700. r:= r xor (t shl 8);
  1701. t:= ((l shr 1) xor r) and $55555555;
  1702. r:= r xor t;
  1703. l:= l xor (t shl 1);
  1704. r:= (r shr 29) or (r shl 3);
  1705. l:= (l shr 29) or (l shl 3);
  1706. i:= 0;
  1707. while i< 32 do
  1708. begin
  1709. u:= r xor KeyData[i ];
  1710. t:= r xor KeyData[i+1];
  1711. t:= (t shr 4) or (t shl 28);
  1712. l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
  1713. des_SPtrans[2,(u shr 10) and $3f] xor
  1714. des_SPtrans[4,(u shr 18) and $3f] xor
  1715. des_SPtrans[6,(u shr 26) and $3f] xor
  1716. des_SPtrans[1,(t shr 2) and $3f] xor
  1717. des_SPtrans[3,(t shr 10) and $3f] xor
  1718. des_SPtrans[5,(t shr 18) and $3f] xor
  1719. des_SPtrans[7,(t shr 26) and $3f];
  1720. u:= l xor KeyData[i+2];
  1721. t:= l xor KeyData[i+3];
  1722. t:= (t shr 4) or (t shl 28);
  1723. r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
  1724. des_SPtrans[2,(u shr 10) and $3f] xor
  1725. des_SPtrans[4,(u shr 18) and $3f] xor
  1726. des_SPtrans[6,(u shr 26) and $3f] xor
  1727. des_SPtrans[1,(t shr 2) and $3f] xor
  1728. des_SPtrans[3,(t shr 10) and $3f] xor
  1729. des_SPtrans[5,(t shr 18) and $3f] xor
  1730. des_SPtrans[7,(t shr 26) and $3f];
  1731. u:= r xor KeyData[i+4];
  1732. t:= r xor KeyData[i+5];
  1733. t:= (t shr 4) or (t shl 28);
  1734. l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
  1735. des_SPtrans[2,(u shr 10) and $3f] xor
  1736. des_SPtrans[4,(u shr 18) and $3f] xor
  1737. des_SPtrans[6,(u shr 26) and $3f] xor
  1738. des_SPtrans[1,(t shr 2) and $3f] xor
  1739. des_SPtrans[3,(t shr 10) and $3f] xor
  1740. des_SPtrans[5,(t shr 18) and $3f] xor
  1741. des_SPtrans[7,(t shr 26) and $3f];
  1742. u:= l xor KeyData[i+6];
  1743. t:= l xor KeyData[i+7];
  1744. t:= (t shr 4) or (t shl 28);
  1745. r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
  1746. des_SPtrans[2,(u shr 10) and $3f] xor
  1747. des_SPtrans[4,(u shr 18) and $3f] xor
  1748. des_SPtrans[6,(u shr 26) and $3f] xor
  1749. des_SPtrans[1,(t shr 2) and $3f] xor
  1750. des_SPtrans[3,(t shr 10) and $3f] xor
  1751. des_SPtrans[5,(t shr 18) and $3f] xor
  1752. des_SPtrans[7,(t shr 26) and $3f];
  1753. Inc(i,8);
  1754. end;
  1755. r:= (r shr 3) or (r shl 29);
  1756. l:= (l shr 3) or (l shl 29);
  1757. t:= ((r shr 1) xor l) and $55555555;
  1758. l:= l xor t;
  1759. r:= r xor (t shl 1);
  1760. t:= ((l shr 8) xor r) and $00ff00ff;
  1761. r:= r xor t;
  1762. l:= l xor (t shl 8);
  1763. t:= ((r shr 2) xor l) and $33333333;
  1764. l:= l xor t;
  1765. r:= r xor (t shl 2);
  1766. t:= ((l shr 16) xor r) and $0000ffff;
  1767. r:= r xor t;
  1768. l:= l xor (t shl 16);
  1769. t:= ((r shr 4) xor l) and $0f0f0f0f;
  1770. l:= l xor t;
  1771. r:= r xor (t shl 4);
  1772. Result := CodeLongInt(Swapbytes(l)) + CodeLongInt(Swapbytes(r));
  1773. end;
  1774. function TSynaCustomDes.DecryptBlock(const InData: AnsiString; var KeyData: TDesKeyData): AnsiString;
  1775. var
  1776. l, r, t, u: integer;
  1777. i: longint;
  1778. begin
  1779. r := Swapbytes(DecodeLongint(Indata, 1));
  1780. l := Swapbytes(DecodeLongint(Indata, 5));
  1781. t:= ((l shr 4) xor r) and $0f0f0f0f;
  1782. r:= r xor t;
  1783. l:= l xor (t shl 4);
  1784. t:= ((r shr 16) xor l) and $0000ffff;
  1785. l:= l xor t;
  1786. r:= r xor (t shl 16);
  1787. t:= ((l shr 2) xor r) and $33333333;
  1788. r:= r xor t;
  1789. l:= l xor (t shl 2);
  1790. t:= ((r shr 8) xor l) and $00ff00ff;
  1791. l:= l xor t;
  1792. r:= r xor (t shl 8);
  1793. t:= ((l shr 1) xor r) and $55555555;
  1794. r:= r xor t;
  1795. l:= l xor (t shl 1);
  1796. r:= (r shr 29) or (r shl 3);
  1797. l:= (l shr 29) or (l shl 3);
  1798. i:= 30;
  1799. while i> 0 do
  1800. begin
  1801. u:= r xor KeyData[i ];
  1802. t:= r xor KeyData[i+1];
  1803. t:= (t shr 4) or (t shl 28);
  1804. l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
  1805. des_SPtrans[2,(u shr 10) and $3f] xor
  1806. des_SPtrans[4,(u shr 18) and $3f] xor
  1807. des_SPtrans[6,(u shr 26) and $3f] xor
  1808. des_SPtrans[1,(t shr 2) and $3f] xor
  1809. des_SPtrans[3,(t shr 10) and $3f] xor
  1810. des_SPtrans[5,(t shr 18) and $3f] xor
  1811. des_SPtrans[7,(t shr 26) and $3f];
  1812. u:= l xor KeyData[i-2];
  1813. t:= l xor KeyData[i-1];
  1814. t:= (t shr 4) or (t shl 28);
  1815. r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
  1816. des_SPtrans[2,(u shr 10) and $3f] xor
  1817. des_SPtrans[4,(u shr 18) and $3f] xor
  1818. des_SPtrans[6,(u shr 26) and $3f] xor
  1819. des_SPtrans[1,(t shr 2) and $3f] xor
  1820. des_SPtrans[3,(t shr 10) and $3f] xor
  1821. des_SPtrans[5,(t shr 18) and $3f] xor
  1822. des_SPtrans[7,(t shr 26) and $3f];
  1823. u:= r xor KeyData[i-4];
  1824. t:= r xor KeyData[i-3];
  1825. t:= (t shr 4) or (t shl 28);
  1826. l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
  1827. des_SPtrans[2,(u shr 10) and $3f] xor
  1828. des_SPtrans[4,(u shr 18) and $3f] xor
  1829. des_SPtrans[6,(u shr 26) and $3f] xor
  1830. des_SPtrans[1,(t shr 2) and $3f] xor
  1831. des_SPtrans[3,(t shr 10) and $3f] xor
  1832. des_SPtrans[5,(t shr 18) and $3f] xor
  1833. des_SPtrans[7,(t shr 26) and $3f];
  1834. u:= l xor KeyData[i-6];
  1835. t:= l xor KeyData[i-5];
  1836. t:= (t shr 4) or (t shl 28);
  1837. r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
  1838. des_SPtrans[2,(u shr 10) and $3f] xor
  1839. des_SPtrans[4,(u shr 18) and $3f] xor
  1840. des_SPtrans[6,(u shr 26) and $3f] xor
  1841. des_SPtrans[1,(t shr 2) and $3f] xor
  1842. des_SPtrans[3,(t shr 10) and $3f] xor
  1843. des_SPtrans[5,(t shr 18) and $3f] xor
  1844. des_SPtrans[7,(t shr 26) and $3f];
  1845. Dec(i,8);
  1846. end;
  1847. r:= (r shr 3) or (r shl 29);
  1848. l:= (l shr 3) or (l shl 29);
  1849. t:= ((r shr 1) xor l) and $55555555;
  1850. l:= l xor t;
  1851. r:= r xor (t shl 1);
  1852. t:= ((l shr 8) xor r) and $00ff00ff;
  1853. r:= r xor t;
  1854. l:= l xor (t shl 8);
  1855. t:= ((r shr 2) xor l) and $33333333;
  1856. l:= l xor t;
  1857. r:= r xor (t shl 2);
  1858. t:= ((l shr 16) xor r) and $0000ffff;
  1859. r:= r xor t;
  1860. l:= l xor (t shl 16);
  1861. t:= ((r shr 4) xor l) and $0f0f0f0f;
  1862. l:= l xor t;
  1863. r:= r xor (t shl 4);
  1864. Result := CodeLongInt(Swapbytes(l)) + CodeLongInt(Swapbytes(r));
  1865. end;
  1866. {==============================================================================}
  1867. procedure TSynaDes.InitKey(Key: AnsiString);
  1868. begin
  1869. Key := PadString(Key, 8, #0);
  1870. DoInit(Key,KeyData);
  1871. end;
  1872. function TSynaDes.EncryptECB(const InData: AnsiString): AnsiString;
  1873. begin
  1874. Result := EncryptBlock(InData,KeyData);
  1875. end;
  1876. function TSynaDes.DecryptECB(const InData: AnsiString): AnsiString;
  1877. begin
  1878. Result := DecryptBlock(Indata,KeyData);
  1879. end;
  1880. {==============================================================================}
  1881. procedure TSyna3Des.InitKey(Key: AnsiString);
  1882. var
  1883. Size: integer;
  1884. n: integer;
  1885. begin
  1886. Size := length(Key);
  1887. key := PadString(key, 3 * 8, #0);
  1888. DoInit(Copy(key, 1, 8),KeyData[0]);
  1889. DoInit(Copy(key, 9, 8),KeyData[1]);
  1890. if Size > 16 then
  1891. DoInit(Copy(key, 17, 8),KeyData[2])
  1892. else
  1893. for n := 0 to high(KeyData[0]) do
  1894. KeyData[2][n] := Keydata[0][n];
  1895. end;
  1896. function TSyna3Des.EncryptECB(const InData: AnsiString): AnsiString;
  1897. begin
  1898. Result := EncryptBlock(Indata,KeyData[0]);
  1899. Result := DecryptBlock(Result,KeyData[1]);
  1900. Result := EncryptBlock(Result,KeyData[2]);
  1901. end;
  1902. function TSyna3Des.DecryptECB(const InData: AnsiString): AnsiString;
  1903. begin
  1904. Result := DecryptBlock(InData,KeyData[2]);
  1905. Result := EncryptBlock(Result,KeyData[1]);
  1906. Result := DecryptBlock(Result,KeyData[0]);
  1907. end;
  1908. {==============================================================================}
  1909. procedure InvMixColumn(a: PByteArray; BC: byte);
  1910. var
  1911. j: FixedUInt;
  1912. begin
  1913. for j:= 0 to (BC-1) do
  1914. PDWord(@(a^[j*4]))^:= PDWord(@U1[a^[j*4+0]])^
  1915. xor PDWord(@U2[a^[j*4+1]])^
  1916. xor PDWord(@U3[a^[j*4+2]])^
  1917. xor PDWord(@U4[a^[j*4+3]])^;
  1918. end;
  1919. {==============================================================================}
  1920. function TSynaAes.GetSize: byte;
  1921. begin
  1922. Result := 16;
  1923. end;
  1924. procedure TSynaAes.InitKey(Key: AnsiString);
  1925. var
  1926. Size: integer;
  1927. KC, ROUNDS, j, r, t, rconpointer: FixedUInt;
  1928. tk: array[0..MAXKC-1,0..3] of byte;
  1929. begin
  1930. FillChar(tk,Sizeof(tk),0);
  1931. //key must have at least 128 bits and max 256 bits
  1932. if length(key) < 16 then
  1933. key := PadString(key, 16, #0);
  1934. if length(key) > 32 then
  1935. delete(key, 33, maxint);
  1936. Size := length(Key);
  1937. Move(PAnsiChar(Key)^, tk, Size);
  1938. if Size<= 16 then
  1939. begin
  1940. KC:= 4;
  1941. Rounds:= 10;
  1942. end
  1943. else if Size<= 24 then
  1944. begin
  1945. KC:= 6;
  1946. Rounds:= 12;
  1947. end
  1948. else
  1949. begin
  1950. KC:= 8;
  1951. Rounds:= 14;
  1952. end;
  1953. numrounds:= rounds;
  1954. r:= 0;
  1955. t:= 0;
  1956. j:= 0;
  1957. while (j< KC) and (r< (rounds+1)) do
  1958. begin
  1959. while (j< KC) and (t< BC) do
  1960. begin
  1961. rk[r,t]:= PDWord(@tk[j])^;
  1962. Inc(j);
  1963. Inc(t);
  1964. end;
  1965. if t= BC then
  1966. begin
  1967. t:= 0;
  1968. Inc(r);
  1969. end;
  1970. end;
  1971. rconpointer:= 0;
  1972. while (r< (rounds+1)) do
  1973. begin
  1974. tk[0,0]:= tk[0,0] xor S[tk[KC-1,1]];
  1975. tk[0,1]:= tk[0,1] xor S[tk[KC-1,2]];
  1976. tk[0,2]:= tk[0,2] xor S[tk[KC-1,3]];
  1977. tk[0,3]:= tk[0,3] xor S[tk[KC-1,0]];
  1978. tk[0,0]:= tk[0,0] xor rcon[rconpointer];
  1979. Inc(rconpointer);
  1980. if KC<> 8 then
  1981. begin
  1982. for j:= 1 to (KC-1) do
  1983. PDWord(@tk[j])^:= PDWord(@tk[j])^ xor PDWord(@tk[j-1])^;
  1984. end
  1985. else
  1986. begin
  1987. for j:= 1 to ((KC div 2)-1) do
  1988. PDWord(@tk[j])^:= PDWord(@tk[j])^ xor PDWord(@tk[j-1])^;
  1989. tk[KC div 2,0]:= tk[KC div 2,0] xor S[tk[KC div 2 - 1,0]];
  1990. tk[KC div 2,1]:= tk[KC div 2,1] xor S[tk[KC div 2 - 1,1]];
  1991. tk[KC div 2,2]:= tk[KC div 2,2] xor S[tk[KC div 2 - 1,2]];
  1992. tk[KC div 2,3]:= tk[KC div 2,3] xor S[tk[KC div 2 - 1,3]];
  1993. for j:= ((KC div 2) + 1) to (KC-1) do
  1994. PDWord(@tk[j])^:= PDWord(@tk[j])^ xor PDWord(@tk[j-1])^;
  1995. end;
  1996. j:= 0;
  1997. while (j< KC) and (r< (rounds+1)) do
  1998. begin
  1999. while (j< KC) and (t< BC) do
  2000. begin
  2001. rk[r,t]:= PDWord(@tk[j])^;
  2002. Inc(j);
  2003. Inc(t);
  2004. end;
  2005. if t= BC then
  2006. begin
  2007. Inc(r);
  2008. t:= 0;
  2009. end;
  2010. end;
  2011. end;
  2012. Move(rk,drk,Sizeof(rk));
  2013. for r:= 1 to (numrounds-1) do
  2014. InvMixColumn(@drk[r],BC);
  2015. end;
  2016. function TSynaAes.EncryptECB(const InData: AnsiString): AnsiString;
  2017. var
  2018. r: FixedUInt;
  2019. tempb: array[0..MAXBC-1,0..3] of byte;
  2020. a: array[0..MAXBC,0..3] of byte;
  2021. p: pointer;
  2022. begin
  2023. p := @a[0,0];
  2024. move(pointer(InData)^, p^, 16);
  2025. for r:= 0 to (numrounds-2) do
  2026. begin
  2027. PDWord(@tempb[0])^:= PDWord(@a[0])^ xor rk[r,0];
  2028. PDWord(@tempb[1])^:= PDWord(@a[1])^ xor rk[r,1];
  2029. PDWord(@tempb[2])^:= PDWord(@a[2])^ xor rk[r,2];
  2030. PDWord(@tempb[3])^:= PDWord(@a[3])^ xor rk[r,3];
  2031. PDWord(@a[0])^:= PDWord(@T1[tempb[0,0]])^ xor
  2032. PDWord(@T2[tempb[1,1]])^ xor
  2033. PDWord(@T3[tempb[2,2]])^ xor
  2034. PDWord(@T4[tempb[3,3]])^;
  2035. PDWord(@a[1])^:= PDWord(@T1[tempb[1,0]])^ xor
  2036. PDWord(@T2[tempb[2,1]])^ xor
  2037. PDWord(@T3[tempb[3,2]])^ xor
  2038. PDWord(@T4[tempb[0,3]])^;
  2039. PDWord(@a[2])^:= PDWord(@T1[tempb[2,0]])^ xor
  2040. PDWord(@T2[tempb[3,1]])^ xor
  2041. PDWord(@T3[tempb[0,2]])^ xor
  2042. PDWord(@T4[tempb[1,3]])^;
  2043. PDWord(@a[3])^:= PDWord(@T1[tempb[3,0]])^ xor
  2044. PDWord(@T2[tempb[0,1]])^ xor
  2045. PDWord(@T3[tempb[1,2]])^ xor
  2046. PDWord(@T4[tempb[2,3]])^;
  2047. end;
  2048. PDWord(@tempb[0])^:= PDWord(@a[0])^ xor rk[numrounds-1,0];
  2049. PDWord(@tempb[1])^:= PDWord(@a[1])^ xor rk[numrounds-1,1];
  2050. PDWord(@tempb[2])^:= PDWord(@a[2])^ xor rk[numrounds-1,2];
  2051. PDWord(@tempb[3])^:= PDWord(@a[3])^ xor rk[numrounds-1,3];
  2052. a[0,0]:= T1[tempb[0,0],1];
  2053. a[0,1]:= T1[tempb[1,1],1];
  2054. a[0,2]:= T1[tempb[2,2],1];
  2055. a[0,3]:= T1[tempb[3,3],1];
  2056. a[1,0]:= T1[tempb[1,0],1];
  2057. a[1,1]:= T1[tempb[2,1],1];
  2058. a[1,2]:= T1[tempb[3,2],1];
  2059. a[1,3]:= T1[tempb[0,3],1];
  2060. a[2,0]:= T1[tempb[2,0],1];
  2061. a[2,1]:= T1[tempb[3,1],1];
  2062. a[2,2]:= T1[tempb[0,2],1];
  2063. a[2,3]:= T1[tempb[1,3],1];
  2064. a[3,0]:= T1[tempb[3,0],1];
  2065. a[3,1]:= T1[tempb[0,1],1];
  2066. a[3,2]:= T1[tempb[1,2],1];
  2067. a[3,3]:= T1[tempb[2,3],1];
  2068. PDWord(@a[0])^:= PDWord(@a[0])^ xor rk[numrounds,0];
  2069. PDWord(@a[1])^:= PDWord(@a[1])^ xor rk[numrounds,1];
  2070. PDWord(@a[2])^:= PDWord(@a[2])^ xor rk[numrounds,2];
  2071. PDWord(@a[3])^:= PDWord(@a[3])^ xor rk[numrounds,3];
  2072. Result := StringOfChar(#0, 16);
  2073. move(p^, pointer(Result)^, 16);
  2074. end;
  2075. function TSynaAes.DecryptECB(const InData: AnsiString): AnsiString;
  2076. var
  2077. r: FixedUInt;
  2078. tempb: array[0..MAXBC-1,0..3] of byte;
  2079. a: array[0..MAXBC,0..3] of byte;
  2080. p: pointer;
  2081. begin
  2082. p := @a[0,0];
  2083. move(pointer(InData)^, p^, 16);
  2084. for r:= NumRounds downto 2 do
  2085. begin
  2086. PDWord(@tempb[0])^:= PDWord(@a[0])^ xor drk[r,0];
  2087. PDWord(@tempb[1])^:= PDWord(@a[1])^ xor drk[r,1];
  2088. PDWord(@tempb[2])^:= PDWord(@a[2])^ xor drk[r,2];
  2089. PDWord(@tempb[3])^:= PDWord(@a[3])^ xor drk[r,3];
  2090. PDWord(@a[0])^:= PDWord(@T5[tempb[0,0]])^ xor
  2091. PDWord(@T6[tempb[3,1]])^ xor
  2092. PDWord(@T7[tempb[2,2]])^ xor
  2093. PDWord(@T8[tempb[1,3]])^;
  2094. PDWord(@a[1])^:= PDWord(@T5[tempb[1,0]])^ xor
  2095. PDWord(@T6[tempb[0,1]])^ xor
  2096. PDWord(@T7[tempb[3,2]])^ xor
  2097. PDWord(@T8[tempb[2,3]])^;
  2098. PDWord(@a[2])^:= PDWord(@T5[tempb[2,0]])^ xor
  2099. PDWord(@T6[tempb[1,1]])^ xor
  2100. PDWord(@T7[tempb[0,2]])^ xor
  2101. PDWord(@T8[tempb[3,3]])^;
  2102. PDWord(@a[3])^:= PDWord(@T5[tempb[3,0]])^ xor
  2103. PDWord(@T6[tempb[2,1]])^ xor
  2104. PDWord(@T7[tempb[1,2]])^ xor
  2105. PDWord(@T8[tempb[0,3]])^;
  2106. end;
  2107. PDWord(@tempb[0])^:= PDWord(@a[0])^ xor drk[1,0];
  2108. PDWord(@tempb[1])^:= PDWord(@a[1])^ xor drk[1,1];
  2109. PDWord(@tempb[2])^:= PDWord(@a[2])^ xor drk[1,2];
  2110. PDWord(@tempb[3])^:= PDWord(@a[3])^ xor drk[1,3];
  2111. a[0,0]:= S5[tempb[0,0]];
  2112. a[0,1]:= S5[tempb[3,1]];
  2113. a[0,2]:= S5[tempb[2,2]];
  2114. a[0,3]:= S5[tempb[1,3]];
  2115. a[1,0]:= S5[tempb[1,0]];
  2116. a[1,1]:= S5[tempb[0,1]];
  2117. a[1,2]:= S5[tempb[3,2]];
  2118. a[1,3]:= S5[tempb[2,3]];
  2119. a[2,0]:= S5[tempb[2,0]];
  2120. a[2,1]:= S5[tempb[1,1]];
  2121. a[2,2]:= S5[tempb[0,2]];
  2122. a[2,3]:= S5[tempb[3,3]];
  2123. a[3,0]:= S5[tempb[3,0]];
  2124. a[3,1]:= S5[tempb[2,1]];
  2125. a[3,2]:= S5[tempb[1,2]];
  2126. a[3,3]:= S5[tempb[0,3]];
  2127. PDWord(@a[0])^:= PDWord(@a[0])^ xor drk[0,0];
  2128. PDWord(@a[1])^:= PDWord(@a[1])^ xor drk[0,1];
  2129. PDWord(@a[2])^:= PDWord(@a[2])^ xor drk[0,2];
  2130. PDWord(@a[3])^:= PDWord(@a[3])^ xor drk[0,3];
  2131. Result := StringOfChar(#0, 16);
  2132. move(p^, pointer(Result)^, 16);
  2133. end;
  2134. {==============================================================================}
  2135. function TestDes: boolean;
  2136. var
  2137. des: TSynaDes;
  2138. s, t: string;
  2139. const
  2140. key = '01234567';
  2141. data1= '01234567';
  2142. data2= '0123456789abcdefghij';
  2143. begin
  2144. //ECB
  2145. des := TSynaDes.Create(key);
  2146. try
  2147. s := des.EncryptECB(data1);
  2148. t := strtohex(s);
  2149. result := t = 'c50ad028c6da9800';
  2150. s := des.DecryptECB(s);
  2151. result := result and (data1 = s);
  2152. finally
  2153. des.free;
  2154. end;
  2155. //CBC
  2156. des := TSynaDes.Create(key);
  2157. try
  2158. s := des.EncryptCBC(data2);
  2159. t := strtohex(s);
  2160. result := result and (t = 'eec50f6353115ad6dee90a22ed1b6a88a0926e35');
  2161. des.Reset;
  2162. s := des.DecryptCBC(s);
  2163. result := result and (data2 = s);
  2164. finally
  2165. des.free;
  2166. end;
  2167. //CFB-8bit
  2168. des := TSynaDes.Create(key);
  2169. try
  2170. s := des.EncryptCFB8bit(data2);
  2171. t := strtohex(s);
  2172. result := result and (t = 'eb6aa12c2f0ff634b4dfb6da6cb2af8f9c5c1452');
  2173. des.Reset;
  2174. s := des.DecryptCFB8bit(s);
  2175. result := result and (data2 = s);
  2176. finally
  2177. des.free;
  2178. end;
  2179. //CFB-block
  2180. des := TSynaDes.Create(key);
  2181. try
  2182. s := des.EncryptCFBblock(data2);
  2183. t := strtohex(s);
  2184. result := result and (t = 'ebdbbaa7f9286cdec28605e07f9b7f3be1053257');
  2185. des.Reset;
  2186. s := des.DecryptCFBblock(s);
  2187. result := result and (data2 = s);
  2188. finally
  2189. des.free;
  2190. end;
  2191. //OFB
  2192. des := TSynaDes.Create(key);
  2193. try
  2194. s := des.EncryptOFB(data2);
  2195. t := strtohex(s);
  2196. result := result and (t = 'ebdbbaa7f9286cdee0b8b3798c4c34baac87dbdc');
  2197. des.Reset;
  2198. s := des.DecryptOFB(s);
  2199. result := result and (data2 = s);
  2200. finally
  2201. des.free;
  2202. end;
  2203. //CTR
  2204. des := TSynaDes.Create(key);
  2205. try
  2206. s := des.EncryptCTR(data2);
  2207. t := strtohex(s);
  2208. result := result and (t = 'ebdbbaa7f9286cde0dd20b45f3afd9aa1b91b87e');
  2209. des.Reset;
  2210. s := des.DecryptCTR(s);
  2211. result := result and (data2 = s);
  2212. finally
  2213. des.free;
  2214. end;
  2215. end;
  2216. function Test3Des: boolean;
  2217. var
  2218. des: TSyna3Des;
  2219. s, t: string;
  2220. const
  2221. key = '0123456789abcdefghijklmn';
  2222. data1= '01234567';
  2223. data2= '0123456789abcdefghij';
  2224. begin
  2225. //ECB
  2226. des := TSyna3Des.Create(key);
  2227. try
  2228. s := des.EncryptECB(data1);
  2229. t := strtohex(s);
  2230. result := t = 'e0dee91008dc460c';
  2231. s := des.DecryptECB(s);
  2232. result := result and (data1 = s);
  2233. finally
  2234. des.free;
  2235. end;
  2236. //CBC
  2237. des := TSyna3Des.Create(key);
  2238. try
  2239. s := des.EncryptCBC(data2);
  2240. t := strtohex(s);
  2241. result := result and (t = 'ee844a2a4f49c01b91a1599b8eba29128c1ad87a');
  2242. des.Reset;
  2243. s := des.DecryptCBC(s);
  2244. result := result and (data2 = s);
  2245. finally
  2246. des.free;
  2247. end;
  2248. //CFB-8bit
  2249. des := TSyna3Des.Create(key);
  2250. try
  2251. s := des.EncryptCFB8bit(data2);
  2252. t := strtohex(s);
  2253. result := result and (t = '935bbf5210c32cfa1faf61f91e8dc02dfa0ff1e8');
  2254. des.Reset;
  2255. s := des.DecryptCFB8bit(s);
  2256. result := result and (data2 = s);
  2257. finally
  2258. des.free;
  2259. end;
  2260. //CFB-block
  2261. des := TSyna3Des.Create(key);
  2262. try
  2263. s := des.EncryptCFBblock(data2);
  2264. t := strtohex(s);
  2265. result := result and (t = '93754e3d54828fbf4bd81f1739419e8d2cfe1671');
  2266. des.Reset;
  2267. s := des.DecryptCFBblock(s);
  2268. result := result and (data2 = s);
  2269. finally
  2270. des.free;
  2271. end;
  2272. //OFB
  2273. des := TSyna3Des.Create(key);
  2274. try
  2275. s := des.EncryptOFB(data2);
  2276. t := strtohex(s);
  2277. result := result and (t = '93754e3d54828fbf04ef0a5efc926ebdf2d95f20');
  2278. des.Reset;
  2279. s := des.DecryptOFB(s);
  2280. result := result and (data2 = s);
  2281. finally
  2282. des.free;
  2283. end;
  2284. //CTR
  2285. des := TSyna3Des.Create(key);
  2286. try
  2287. s := des.EncryptCTR(data2);
  2288. t := strtohex(s);
  2289. result := result and (t = '93754e3d54828fbf1c51a121d2c93f989e70b3ad');
  2290. des.Reset;
  2291. s := des.DecryptCTR(s);
  2292. result := result and (data2 = s);
  2293. finally
  2294. des.free;
  2295. end;
  2296. end;
  2297. function TestAes: boolean;
  2298. var
  2299. aes: TSynaAes;
  2300. s, t: string;
  2301. const
  2302. key1 = #$00#$01#$02#$03#$05#$06#$07#$08#$0A#$0B#$0C#$0D#$0F#$10#$11#$12;
  2303. data1= #$50#$68#$12#$A4#$5F#$08#$C8#$89#$B9#$7F#$59#$80#$03#$8B#$83#$59;
  2304. key2 = #$A0#$A1#$A2#$A3#$A5#$A6#$A7#$A8#$AA#$AB#$AC#$AD#$AF#$B0#$B1#$B2#$B4#$B5#$B6#$B7#$B9#$BA#$BB#$BC;
  2305. data2= #$4F#$1C#$76#$9D#$1E#$5B#$05#$52#$C7#$EC#$A8#$4D#$EA#$26#$A5#$49;
  2306. key3 = #$00#$01#$02#$03#$05#$06#$07#$08#$0A#$0B#$0C#$0D#$0F#$10#$11#$12#$14#$15#$16#$17#$19#$1A#$1B#$1C#$1E#$1F#$20#$21#$23#$24#$25#$26;
  2307. data3= #$5E#$25#$CA#$78#$F0#$DE#$55#$80#$25#$24#$D3#$8D#$A3#$FE#$44#$56;
  2308. begin
  2309. //ECB
  2310. aes := TSynaAes.Create(key1);
  2311. try
  2312. t := aes.EncryptECB(data1);
  2313. result := t = #$D8#$F5#$32#$53#$82#$89#$EF#$7D#$06#$B5#$06#$A4#$FD#$5B#$E9#$C9;
  2314. s := aes.DecryptECB(t);
  2315. result := result and (data1 = s);
  2316. finally
  2317. aes.free;
  2318. end;
  2319. aes := TSynaAes.Create(key2);
  2320. try
  2321. t := aes.EncryptECB(data2);
  2322. result := result and (t = #$F3#$84#$72#$10#$D5#$39#$1E#$23#$60#$60#$8E#$5A#$CB#$56#$05#$81);
  2323. s := aes.DecryptECB(t);
  2324. result := result and (data2 = s);
  2325. finally
  2326. aes.free;
  2327. end;
  2328. aes := TSynaAes.Create(key3);
  2329. try
  2330. t := aes.EncryptECB(data3);
  2331. result := result and (t = #$E8#$B7#$2B#$4E#$8B#$E2#$43#$43#$8C#$9F#$FF#$1F#$0E#$20#$58#$72);
  2332. s := aes.DecryptECB(t);
  2333. result := result and (data3 = s);
  2334. finally
  2335. aes.free;
  2336. end;
  2337. end;
  2338. {==============================================================================}
  2339. end.