using System; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Utilities; using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Crypto.Engines; public class Cast5Engine : IBlockCipher { private const int BLOCK_SIZE = 8; private static readonly uint[] S1 = new uint[256] { 821772500u, 2678128395u, 1810681135u, 1059425402u, 505495343u, 2617265619u, 1610868032u, 3483355465u, 3218386727u, 2294005173u, 3791863952u, 2563806837u, 1852023008u, 365126098u, 3269944861u, 584384398u, 677919599u, 3229601881u, 4280515016u, 2002735330u, 1136869587u, 3744433750u, 2289869850u, 2731719981u, 2714362070u, 879511577u, 1639411079u, 575934255u, 717107937u, 2857637483u, 576097850u, 2731753936u, 1725645000u, 2810460463u, 5111599u, 767152862u, 2543075244u, 1251459544u, 1383482551u, 3052681127u, 3089939183u, 3612463449u, 1878520045u, 1510570527u, 2189125840u, 2431448366u, 582008916u, 3163445557u, 1265446783u, 1354458274u, 3529918736u, 3202711853u, 3073581712u, 3912963487u, 3029263377u, 1275016285u, 4249207360u, 2905708351u, 3304509486u, 1442611557u, 3585198765u, 2712415662u, 2731849581u, 3248163920u, 2283946226u, 208555832u, 2766454743u, 1331405426u, 1447828783u, 3315356441u, 3108627284u, 2957404670u, 2981538698u, 3339933917u, 1669711173u, 286233437u, 1465092821u, 1782121619u, 3862771680u, 710211251u, 980974943u, 1651941557u, 430374111u, 2051154026u, 704238805u, 4128970897u, 3144820574u, 2857402727u, 948965521u, 3333752299u, 2227686284u, 718756367u, 2269778983u, 2731643755u, 718440111u, 2857816721u, 3616097120u, 1113355533u, 2478022182u, 410092745u, 1811985197u, 1944238868u, 2696854588u, 1415722873u, 1682284203u, 1060277122u, 1998114690u, 1503841958u, 82706478u, 2315155686u, 1068173648u, 845149890u, 2167947013u, 1768146376u, 1993038550u, 3566826697u, 3390574031u, 940016341u, 3355073782u, 2328040721u, 904371731u, 1205506512u, 4094660742u, 2816623006u, 825647681u, 85914773u, 2857843460u, 1249926541u, 1417871568u, 3287612u, 3211054559u, 3126306446u, 1975924523u, 1353700161u, 2814456437u, 2438597621u, 1800716203u, 722146342u, 2873936343u, 1151126914u, 4160483941u, 2877670899u, 458611604u, 2866078500u, 3483680063u, 770352098u, 2652916994u, 3367839148u, 3940505011u, 3585973912u, 3809620402u, 718646636u, 2504206814u, 2914927912u, 3631288169u, 2857486607u, 2860018678u, 575749918u, 2857478043u, 718488780u, 2069512688u, 3548183469u, 453416197u, 1106044049u, 3032691430u, 52586708u, 3378514636u, 3459808877u, 3211506028u, 1785789304u, 218356169u, 3571399134u, 3759170522u, 1194783844u, 1523787992u, 3007827094u, 1975193539u, 2555452411u, 1341901877u, 3045838698u, 3776907964u, 3217423946u, 2802510864u, 2889438986u, 1057244207u, 1636348243u, 3761863214u, 1462225785u, 2632663439u, 481089165u, 718503062u, 24497053u, 3332243209u, 3344655856u, 3655024856u, 3960371065u, 1195698900u, 2971415156u, 3710176158u, 2115785917u, 4027663609u, 3525578417u, 2524296189u, 2745972565u, 3564906415u, 1372086093u, 1452307862u, 2780501478u, 1476592880u, 3389271281u, 18495466u, 2378148571u, 901398090u, 891748256u, 3279637769u, 3157290713u, 2560960102u, 1447622437u, 4284372637u, 216884176u, 2086908623u, 1879786977u, 3588903153u, 2242455666u, 2938092967u, 3559082096u, 2810645491u, 758861177u, 1121993112u, 215018983u, 642190776u, 4169236812u, 1196255959u, 2081185372u, 3508738393u, 941322904u, 4124243163u, 2877523539u, 1848581667u, 2205260958u, 3180453958u, 2589345134u, 3694731276u, 550028657u, 2519456284u, 3789985535u, 2973870856u, 2093648313u, 443148163u, 46942275u, 2734146937u, 1117713533u, 1115362972u, 1523183689u, 3717140224u, 1551984063u }; private static readonly uint[] S2 = new uint[256] { 522195092u, 4010518363u, 1776537470u, 960447360u, 4267822970u, 4005896314u, 1435016340u, 1929119313u, 2913464185u, 1310552629u, 3579470798u, 3724818106u, 2579771631u, 1594623892u, 417127293u, 2715217907u, 2696228731u, 1508390405u, 3994398868u, 3925858569u, 3695444102u, 4019471449u, 3129199795u, 3770928635u, 3520741761u, 990456497u, 4187484609u, 2783367035u, 21106139u, 3840405339u, 631373633u, 3783325702u, 532942976u, 396095098u, 3548038825u, 4267192484u, 2564721535u, 2011709262u, 2039648873u, 620404603u, 3776170075u, 2898526339u, 3612357925u, 4159332703u, 1645490516u, 223693667u, 1567101217u, 3362177881u, 1029951347u, 3470931136u, 3570957959u, 1550265121u, 119497089u, 972513919u, 907948164u, 3840628539u, 1613718692u, 3594177948u, 465323573u, 2659255085u, 654439692u, 2575596212u, 2699288441u, 3127702412u, 277098644u, 624404830u, 4100943870u, 2717858591u, 546110314u, 2403699828u, 3655377447u, 1321679412u, 4236791657u, 1045293279u, 4010672264u, 895050893u, 2319792268u, 494945126u, 1914543101u, 2777056443u, 3894764339u, 2219737618u, 311263384u, 4275257268u, 3458730721u, 669096869u, 3584475730u, 3835122877u, 3319158237u, 3949359204u, 2005142349u, 2713102337u, 2228954793u, 3769984788u, 569394103u, 3855636576u, 1425027204u, 108000370u, 2736431443u, 3671869269u, 3043122623u, 1750473702u, 2211081108u, 762237499u, 3972989403u, 2798899386u, 3061857628u, 2943854345u, 867476300u, 964413654u, 1591880597u, 1594774276u, 2179821409u, 552026980u, 3026064248u, 3726140315u, 2283577634u, 3110545105u, 2152310760u, 582474363u, 1582640421u, 1383256631u, 2043843868u, 3322775884u, 1217180674u, 463797851u, 2763038571u, 480777679u, 2718707717u, 2289164131u, 3118346187u, 214354409u, 200212307u, 3810608407u, 3025414197u, 2674075964u, 3997296425u, 1847405948u, 1342460550u, 510035443u, 4080271814u, 815934613u, 833030224u, 1620250387u, 1945732119u, 2703661145u, 3966000196u, 1388869545u, 3456054182u, 2687178561u, 2092620194u, 562037615u, 1356438536u, 3409922145u, 3261847397u, 1688467115u, 2150901366u, 631725691u, 3840332284u, 549916902u, 3455104640u, 394546491u, 837744717u, 2114462948u, 751520235u, 2221554606u, 2415360136u, 3999097078u, 2063029875u, 803036379u, 2702586305u, 821456707u, 3019566164u, 360699898u, 4018502092u, 3511869016u, 3677355358u, 2402471449u, 812317050u, 49299192u, 2570164949u, 3259169295u, 2816732080u, 3331213574u, 3101303564u, 2156015656u, 3705598920u, 3546263921u, 143268808u, 3200304480u, 1638124008u, 3165189453u, 3341807610u, 578956953u, 2193977524u, 3638120073u, 2333881532u, 807278310u, 658237817u, 2969561766u, 1641658566u, 11683945u, 3086995007u, 148645947u, 1138423386u, 4158756760u, 1981396783u, 2401016740u, 3699783584u, 380097457u, 2680394679u, 2803068651u, 3334260286u, 441530178u, 4016580796u, 1375954390u, 761952171u, 891809099u, 2183123478u, 157052462u, 3683840763u, 1592404427u, 341349109u, 2438483839u, 1417898363u, 644327628u, 2233032776u, 2353769706u, 2201510100u, 220455161u, 1815641738u, 182899273u, 2995019788u, 3627381533u, 3702638151u, 2890684138u, 1052606899u, 588164016u, 1681439879u, 4038439418u, 2405343923u, 4229449282u, 167996282u, 1336969661u, 1688053129u, 2739224926u, 1543734051u, 1046297529u, 1138201970u, 2121126012u, 115334942u, 1819067631u, 1902159161u, 1941945968u, 2206692869u, 1159982321u }; private static readonly uint[] S3 = new uint[256] { 2381300288u, 637164959u, 3952098751u, 3893414151u, 1197506559u, 916448331u, 2350892612u, 2932787856u, 3199334847u, 4009478890u, 3905886544u, 1373570990u, 2450425862u, 4037870920u, 3778841987u, 2456817877u, 286293407u, 124026297u, 3001279700u, 1028597854u, 3115296800u, 4208886496u, 2691114635u, 2188540206u, 1430237888u, 1218109995u, 3572471700u, 308166588u, 570424558u, 2187009021u, 2455094765u, 307733056u, 1310360322u, 3135275007u, 1384269543u, 2388071438u, 863238079u, 2359263624u, 2801553128u, 3380786597u, 2831162807u, 1470087780u, 1728663345u, 4072488799u, 1090516929u, 532123132u, 2389430977u, 1132193179u, 2578464191u, 3051079243u, 1670234342u, 1434557849u, 2711078940u, 1241591150u, 3314043432u, 3435360113u, 3091448339u, 1812415473u, 2198440252u, 267246943u, 796911696u, 3619716990u, 38830015u, 1526438404u, 2806502096u, 374413614u, 2943401790u, 1489179520u, 1603809326u, 1920779204u, 168801282u, 260042626u, 2358705581u, 1563175598u, 2397674057u, 1356499128u, 2217211040u, 514611088u, 2037363785u, 2186468373u, 4022173083u, 2792511869u, 2913485016u, 1173701892u, 4200428547u, 3896427269u, 1334932762u, 2455136706u, 602925377u, 2835607854u, 1613172210u, 41346230u, 2499634548u, 2457437618u, 2188827595u, 41386358u, 4172255629u, 1313404830u, 2405527007u, 3801973774u, 2217704835u, 873260488u, 2528884354u, 2478092616u, 4012915883u, 2555359016u, 2006953883u, 2463913485u, 575479328u, 2218240648u, 2099895446u, 660001756u, 2341502190u, 3038761536u, 3888151779u, 3848713377u, 3286851934u, 1022894237u, 1620365795u, 3449594689u, 1551255054u, 15374395u, 3570825345u, 4249311020u, 4151111129u, 3181912732u, 310226346u, 1133119310u, 530038928u, 136043402u, 2476768958u, 3107506709u, 2544909567u, 1036173560u, 2367337196u, 1681395281u, 1758231547u, 3641649032u, 306774401u, 1575354324u, 3716085866u, 1990386196u, 3114533736u, 2455606671u, 1262092282u, 3124342505u, 2768229131u, 4210529083u, 1833535011u, 423410938u, 660763973u, 2187129978u, 1639812000u, 3508421329u, 3467445492u, 310289298u, 272797111u, 2188552562u, 2456863912u, 310240523u, 677093832u, 1013118031u, 901835429u, 3892695601u, 1116285435u, 3036471170u, 1337354835u, 243122523u, 520626091u, 277223598u, 4244441197u, 4194248841u, 1766575121u, 594173102u, 316590669u, 742362309u, 3536858622u, 4176435350u, 3838792410u, 2501204839u, 1229605004u, 3115755532u, 1552908988u, 2312334149u, 979407927u, 3959474601u, 1148277331u, 176638793u, 3614686272u, 2083809052u, 40992502u, 1340822838u, 2731552767u, 3535757508u, 3560899520u, 1354035053u, 122129617u, 7215240u, 2732932949u, 3118912700u, 2718203926u, 2539075635u, 3609230695u, 3725561661u, 1928887091u, 2882293555u, 1988674909u, 2063640240u, 2491088897u, 1459647954u, 4189817080u, 2302804382u, 1113892351u, 2237858528u, 1927010603u, 4002880361u, 1856122846u, 1594404395u, 2944033133u, 3855189863u, 3474975698u, 1643104450u, 4054590833u, 3431086530u, 1730235576u, 2984608721u, 3084664418u, 2131803598u, 4178205752u, 267404349u, 1617849798u, 1616132681u, 1462223176u, 736725533u, 2327058232u, 551665188u, 2945899023u, 1749386277u, 2575514597u, 1611482493u, 674206544u, 2201269090u, 3642560800u, 728599968u, 1680547377u, 2620414464u, 1388111496u, 453204106u, 4156223445u, 1094905244u, 2754698257u, 2201108165u, 3757000246u, 2704524545u, 3922940700u, 3996465027u }; private static readonly uint[] S4 = new uint[256] { 2645754912u, 532081118u, 2814278639u, 3530793624u, 1246723035u, 1689095255u, 2236679235u, 4194438865u, 2116582143u, 3859789411u, 157234593u, 2045505824u, 4245003587u, 1687664561u, 4083425123u, 605965023u, 672431967u, 1336064205u, 3376611392u, 214114848u, 4258466608u, 3232053071u, 489488601u, 605322005u, 3998028058u, 264917351u, 1912574028u, 756637694u, 436560991u, 202637054u, 135989450u, 85393697u, 2152923392u, 3896401662u, 2895836408u, 2145855233u, 3535335007u, 115294817u, 3147733898u, 1922296357u, 3464822751u, 4117858305u, 1037454084u, 2725193275u, 2127856640u, 1417604070u, 1148013728u, 1827919605u, 642362335u, 2929772533u, 909348033u, 1346338451u, 3547799649u, 297154785u, 1917849091u, 4161712827u, 2883604526u, 3968694238u, 1469521537u, 3780077382u, 3375584256u, 1763717519u, 136166297u, 4290970789u, 1295325189u, 2134727907u, 2798151366u, 1566297257u, 3672928234u, 2677174161u, 2672173615u, 965822077u, 2780786062u, 289653839u, 1133871874u, 3491843819u, 35685304u, 1068898316u, 418943774u, 672553190u, 642281022u, 2346158704u, 1954014401u, 3037126780u, 4079815205u, 2030668546u, 3840588673u, 672283427u, 1776201016u, 359975446u, 3750173538u, 555499703u, 2769985273u, 1324923u, 69110472u, 152125443u, 3176785106u, 3822147285u, 1340634837u, 798073664u, 1434183902u, 15393959u, 216384236u, 1303690150u, 3881221631u, 3711134124u, 3960975413u, 106373927u, 2578434224u, 1455997841u, 1801814300u, 1578393881u, 1854262133u, 3188178946u, 3258078583u, 2302670060u, 1539295533u, 3505142565u, 3078625975u, 2372746020u, 549938159u, 3278284284u, 2620926080u, 181285381u, 2865321098u, 3970029511u, 68876850u, 488006234u, 1728155692u, 2608167508u, 836007927u, 2435231793u, 919367643u, 3339422534u, 3655756360u, 1457871481u, 40520939u, 1380155135u, 797931188u, 234455205u, 2255801827u, 3990488299u, 397000196u, 739833055u, 3077865373u, 2871719860u, 4022553888u, 772369276u, 390177364u, 3853951029u, 557662966u, 740064294u, 1640166671u, 1699928825u, 3535942136u, 622006121u, 3625353122u, 68743880u, 1742502u, 219489963u, 1664179233u, 1577743084u, 1236991741u, 410585305u, 2366487942u, 823226535u, 1050371084u, 3426619607u, 3586839478u, 212779912u, 4147118561u, 1819446015u, 1911218849u, 530248558u, 3486241071u, 3252585495u, 2886188651u, 3410272728u, 2342195030u, 20547779u, 2982490058u, 3032363469u, 3631753222u, 312714466u, 1870521650u, 1493008054u, 3491686656u, 615382978u, 4103671749u, 2534517445u, 1932181u, 2196105170u, 278426614u, 6369430u, 3274544417u, 2913018367u, 697336853u, 2143000447u, 2946413531u, 701099306u, 1558357093u, 2805003052u, 3500818408u, 2321334417u, 3567135975u, 216290473u, 3591032198u, 23009561u, 1996984579u, 3735042806u, 2024298078u, 3739440863u, 569400510u, 2339758983u, 3016033873u, 3097871343u, 3639523026u, 3844324983u, 3256173865u, 795471839u, 2951117563u, 4101031090u, 4091603803u, 3603732598u, 971261452u, 534414648u, 428311343u, 3389027175u, 2844869880u, 694888862u, 1227866773u, 2456207019u, 3043454569u, 2614353370u, 3749578031u, 3676663836u, 459166190u, 4132644070u, 1794958188u, 51825668u, 2252611902u, 3084671440u, 2036672799u, 3436641603u, 1099053433u, 2469121526u, 3059204941u, 1323291266u, 2061838604u, 1018778475u, 2233344254u, 2553501054u, 334295216u, 3556750194u, 1065731521u, 183467730u }; private static readonly uint[] S5 = new uint[256] { 2127105028u, 745436345u, 2601412319u, 2788391185u, 3093987327u, 500390133u, 1155374404u, 389092991u, 150729210u, 3891597772u, 3523549952u, 1935325696u, 716645080u, 946045387u, 2901812282u, 1774124410u, 3869435775u, 4039581901u, 3293136918u, 3438657920u, 948246080u, 363898952u, 3867875531u, 1286266623u, 1598556673u, 68334250u, 630723836u, 1104211938u, 1312863373u, 613332731u, 2377784574u, 1101634306u, 441780740u, 3129959883u, 1917973735u, 2510624549u, 3238456535u, 2544211978u, 3308894634u, 1299840618u, 4076074851u, 1756332096u, 3977027158u, 297047435u, 3790297736u, 2265573040u, 3621810518u, 1311375015u, 1667687725u, 47300608u, 3299642885u, 2474112369u, 201668394u, 1468347890u, 576830978u, 3594690761u, 3742605952u, 1958042578u, 1747032512u, 3558991340u, 1408974056u, 3366841779u, 682131401u, 1033214337u, 1545599232u, 4265137049u, 206503691u, 103024618u, 2855227313u, 1337551222u, 2428998917u, 2963842932u, 4015366655u, 3852247746u, 2796956967u, 3865723491u, 3747938335u, 247794022u, 3755824572u, 702416469u, 2434691994u, 397379957u, 851939612u, 2314769512u, 218229120u, 1380406772u, 62274761u, 214451378u, 3170103466u, 2276210409u, 3845813286u, 28563499u, 446592073u, 1693330814u, 3453727194u, 29968656u, 3093872512u, 220656637u, 2470637031u, 77972100u, 1667708854u, 1358280214u, 4064765667u, 2395616961u, 325977563u, 4277240721u, 4220025399u, 3605526484u, 3355147721u, 811859167u, 3069544926u, 3962126810u, 652502677u, 3075892249u, 4132761541u, 3498924215u, 1217549313u, 3250244479u, 3858715919u, 3053989961u, 1538642152u, 2279026266u, 2875879137u, 574252750u, 3324769229u, 2651358713u, 1758150215u, 141295887u, 2719868960u, 3515574750u, 4093007735u, 4194485238u, 1082055363u, 3417560400u, 395511885u, 2966884026u, 179534037u, 3646028556u, 3738688086u, 1092926436u, 2496269142u, 257381841u, 3772900718u, 1636087230u, 1477059743u, 2499234752u, 3811018894u, 2675660129u, 3285975680u, 90732309u, 1684827095u, 1150307763u, 1723134115u, 3237045386u, 1769919919u, 1240018934u, 815675215u, 750138730u, 2239792499u, 1234303040u, 1995484674u, 138143821u, 675421338u, 1145607174u, 1936608440u, 3238603024u, 2345230278u, 2105974004u, 323969391u, 779555213u, 3004902369u, 2861610098u, 1017501463u, 2098600890u, 2628620304u, 2940611490u, 2682542546u, 1171473753u, 3656571411u, 3687208071u, 4091869518u, 393037935u, 159126506u, 1662887367u, 1147106178u, 391545844u, 3452332695u, 1891500680u, 3016609650u, 1851642611u, 546529401u, 1167818917u, 3194020571u, 2848076033u, 3953471836u, 575554290u, 475796850u, 4134673196u, 450035699u, 2351251534u, 844027695u, 1080539133u, 86184846u, 1554234488u, 3692025454u, 1972511363u, 2018339607u, 1491841390u, 1141460869u, 1061690759u, 4244549243u, 2008416118u, 2351104703u, 2868147542u, 1598468138u, 722020353u, 1027143159u, 212344630u, 1387219594u, 1725294528u, 3745187956u, 2500153616u, 458938280u, 4129215917u, 1828119673u, 544571780u, 3503225445u, 2297937496u, 1241802790u, 267843827u, 2694610800u, 1397140384u, 1558801448u, 3782667683u, 1806446719u, 929573330u, 2234912681u, 400817706u, 616011623u, 4121520928u, 3603768725u, 1761550015u, 1968522284u, 4053731006u, 4192232858u, 4005120285u, 872482584u, 3140537016u, 3894607381u, 2287405443u, 1963876937u, 3663887957u, 1584857000u, 2975024454u, 1833426440u, 4025083860u }; private static readonly uint[] S6 = new uint[256] { 4143615901u, 749497569u, 1285769319u, 3795025788u, 2514159847u, 23610292u, 3974978748u, 844452780u, 3214870880u, 3751928557u, 2213566365u, 1676510905u, 448177848u, 3730751033u, 4086298418u, 2307502392u, 871450977u, 3222878141u, 4110862042u, 3831651966u, 2735270553u, 1310974780u, 2043402188u, 1218528103u, 2736035353u, 4274605013u, 2702448458u, 3936360550u, 2693061421u, 162023535u, 2827510090u, 687910808u, 23484817u, 3784910947u, 3371371616u, 779677500u, 3503626546u, 3473927188u, 4157212626u, 3500679282u, 4248902014u, 2466621104u, 3899384794u, 1958663117u, 925738300u, 1283408968u, 3669349440u, 1840910019u, 137959847u, 2679828185u, 1239142320u, 1315376211u, 1547541505u, 1690155329u, 739140458u, 3128809933u, 3933172616u, 3876308834u, 905091803u, 1548541325u, 4040461708u, 3095483362u, 144808038u, 451078856u, 676114313u, 2861728291u, 2469707347u, 993665471u, 373509091u, 2599041286u, 4025009006u, 4170239449u, 2149739950u, 3275793571u, 3749616649u, 2794760199u, 1534877388u, 572371878u, 2590613551u, 1753320020u, 3467782511u, 1405125690u, 4270405205u, 633333386u, 3026356924u, 3475123903u, 632057672u, 2846462855u, 1404951397u, 3882875879u, 3915906424u, 195638627u, 2385783745u, 3902872553u, 1233155085u, 3355999740u, 2380578713u, 2702246304u, 2144565621u, 3663341248u, 3894384975u, 2502479241u, 4248018925u, 3094885567u, 1594115437u, 572884632u, 3385116731u, 767645374u, 1331858858u, 1475698373u, 3793881790u, 3532746431u, 1321687957u, 619889600u, 1121017241u, 3440213920u, 2070816767u, 2833025776u, 1933951238u, 4095615791u, 890643334u, 3874130214u, 859025556u, 360630002u, 925594799u, 1764062180u, 3920222280u, 4078305929u, 979562269u, 2810700344u, 4087740022u, 1949714515u, 546639971u, 1165388173u, 3069891591u, 1495988560u, 922170659u, 1291546247u, 2107952832u, 1813327274u, 3406010024u, 3306028637u, 4241950635u, 153207855u, 2313154747u, 1608695416u, 1150242611u, 1967526857u, 721801357u, 1220138373u, 3691287617u, 3356069787u, 2112743302u, 3281662835u, 1111556101u, 1778980689u, 250857638u, 2298507990u, 673216130u, 2846488510u, 3207751581u, 3562756981u, 3008625920u, 3417367384u, 2198807050u, 529510932u, 3547516680u, 3426503187u, 2364944742u, 102533054u, 2294910856u, 1617093527u, 1204784762u, 3066581635u, 1019391227u, 1069574518u, 1317995090u, 1691889997u, 3661132003u, 510022745u, 3238594800u, 1362108837u, 1817929911u, 2184153760u, 805817662u, 1953603311u, 3699844737u, 120799444u, 2118332377u, 207536705u, 2282301548u, 4120041617u, 145305846u, 2508124933u, 3086745533u, 3261524335u, 1877257368u, 2977164480u, 3160454186u, 2503252186u, 4221677074u, 759945014u, 254147243u, 2767453419u, 3801518371u, 629083197u, 2471014217u, 907280572u, 3900796746u, 940896768u, 2751021123u, 2625262786u, 3161476951u, 3661752313u, 3260732218u, 1425318020u, 2977912069u, 1496677566u, 3988592072u, 2140652971u, 3126511541u, 3069632175u, 977771578u, 1392695845u, 1698528874u, 1411812681u, 1369733098u, 1343739227u, 3620887944u, 1142123638u, 67414216u, 3102056737u, 3088749194u, 1626167401u, 2546293654u, 3941374235u, 697522451u, 33404913u, 143560186u, 2595682037u, 994885535u, 1247667115u, 3859094837u, 2699155541u, 3547024625u, 4114935275u, 2968073508u, 3199963069u, 2732024527u, 1237921620u, 951448369u, 1898488916u, 1211705605u, 2790989240u, 2233243581u, 3598044975u }; private static readonly uint[] S7 = new uint[256] { 2246066201u, 858518887u, 1714274303u, 3485882003u, 713916271u, 2879113490u, 3730835617u, 539548191u, 36158695u, 1298409750u, 419087104u, 1358007170u, 749914897u, 2989680476u, 1261868530u, 2995193822u, 2690628854u, 3443622377u, 3780124940u, 3796824509u, 2976433025u, 4259637129u, 1551479000u, 512490819u, 1296650241u, 951993153u, 2436689437u, 2460458047u, 144139966u, 3136204276u, 310820559u, 3068840729u, 643875328u, 1969602020u, 1680088954u, 2185813161u, 3283332454u, 672358534u, 198762408u, 896343282u, 276269502u, 3014846926u, 84060815u, 197145886u, 376173866u, 3943890818u, 3813173521u, 3545068822u, 1316698879u, 1598252827u, 2633424951u, 1233235075u, 859989710u, 2358460855u, 3503838400u, 3409603720u, 1203513385u, 1193654839u, 2792018475u, 2060853022u, 207403770u, 1144516871u, 3068631394u, 1121114134u, 177607304u, 3785736302u, 326409831u, 1929119770u, 2983279095u, 4183308101u, 3474579288u, 3200513878u, 3228482096u, 119610148u, 1170376745u, 3378393471u, 3163473169u, 951863017u, 3337026068u, 3135789130u, 2907618374u, 1183797387u, 2015970143u, 4045674555u, 2182986399u, 2952138740u, 3928772205u, 384012900u, 2454997643u, 10178499u, 2879818989u, 2596892536u, 111523738u, 2995089006u, 451689641u, 3196290696u, 235406569u, 1441906262u, 3890558523u, 3013735005u, 4158569349u, 1644036924u, 376726067u, 1006849064u, 3664579700u, 2041234796u, 1021632941u, 1374734338u, 2566452058u, 371631263u, 4007144233u, 490221539u, 206551450u, 3140638584u, 1053219195u, 1853335209u, 3412429660u, 3562156231u, 735133835u, 1623211703u, 3104214392u, 2738312436u, 4096837757u, 3366392578u, 3110964274u, 3956598718u, 3196820781u, 2038037254u, 3877786376u, 2339753847u, 300912036u, 3766732888u, 2372630639u, 1516443558u, 4200396704u, 1574567987u, 4069441456u, 4122592016u, 2699739776u, 146372218u, 2748961456u, 2043888151u, 35287437u, 2596680554u, 655490400u, 1132482787u, 110692520u, 1031794116u, 2188192751u, 1324057718u, 1217253157u, 919197030u, 686247489u, 3261139658u, 1028237775u, 3135486431u, 3059715558u, 2460921700u, 986174950u, 2661811465u, 4062904701u, 2752986992u, 3709736643u, 367056889u, 1353824391u, 731860949u, 1650113154u, 1778481506u, 784341916u, 357075625u, 3608602432u, 1074092588u, 2480052770u, 3811426202u, 92751289u, 877911070u, 3600361838u, 1231880047u, 480201094u, 3756190983u, 3094495953u, 434011822u, 87971354u, 363687820u, 1717726236u, 1901380172u, 3926403882u, 2481662265u, 400339184u, 1490350766u, 2661455099u, 1389319756u, 2558787174u, 784598401u, 1983468483u, 30828846u, 3550527752u, 2716276238u, 3841122214u, 1765724805u, 1955612312u, 1277890269u, 1333098070u, 1564029816u, 2704417615u, 1026694237u, 3287671188u, 1260819201u, 3349086767u, 1016692350u, 1582273796u, 1073413053u, 1995943182u, 694588404u, 1025494639u, 3323872702u, 3551898420u, 4146854327u, 453260480u, 1316140391u, 1435673405u, 3038941953u, 3486689407u, 1622062951u, 403978347u, 817677117u, 950059133u, 4246079218u, 3278066075u, 1486738320u, 1417279718u, 481875527u, 2549965225u, 3933690356u, 760697757u, 1452955855u, 3897451437u, 1177426808u, 1702951038u, 4085348628u, 2447005172u, 1084371187u, 3516436277u, 3068336338u, 1073369276u, 1027665953u, 3284188590u, 1230553676u, 1368340146u, 2226246512u, 267243139u, 2274220762u, 4070734279u, 2497715176u, 2423353163u, 2504755875u }; private static readonly uint[] S8 = new uint[256] { 3793104909u, 3151888380u, 2817252029u, 895778965u, 2005530807u, 3871412763u, 237245952u, 86829237u, 296341424u, 3851759377u, 3974600970u, 2475086196u, 709006108u, 1994621201u, 2972577594u, 937287164u, 3734691505u, 168608556u, 3189338153u, 2225080640u, 3139713551u, 3033610191u, 3025041904u, 77524477u, 185966941u, 1208824168u, 2344345178u, 1721625922u, 3354191921u, 1066374631u, 1927223579u, 1971335949u, 2483503697u, 1551748602u, 2881383779u, 2856329572u, 3003241482u, 48746954u, 1398218158u, 2050065058u, 313056748u, 4255789917u, 393167848u, 1912293076u, 940740642u, 3465845460u, 3091687853u, 2522601570u, 2197016661u, 1727764327u, 364383054u, 492521376u, 1291706479u, 3264136376u, 1474851438u, 1685747964u, 2575719748u, 1619776915u, 1814040067u, 970743798u, 1561002147u, 2925768690u, 2123093554u, 1880132620u, 3151188041u, 697884420u, 2550985770u, 2607674513u, 2659114323u, 110200136u, 1489731079u, 997519150u, 1378877361u, 3527870668u, 478029773u, 2766872923u, 1022481122u, 431258168u, 1112503832u, 897933369u, 2635587303u, 669726182u, 3383752315u, 918222264u, 163866573u, 3246985393u, 3776823163u, 114105080u, 1903216136u, 761148244u, 3571337562u, 1690750982u, 3166750252u, 1037045171u, 1888456500u, 2010454850u, 642736655u, 616092351u, 365016990u, 1185228132u, 4174898510u, 1043824992u, 2023083429u, 2241598885u, 3863320456u, 3279669087u, 3674716684u, 108438443u, 2132974366u, 830746235u, 606445527u, 4173263986u, 2204105912u, 1844756978u, 2532684181u, 4245352700u, 2969441100u, 3796921661u, 1335562986u, 4061524517u, 2720232303u, 2679424040u, 634407289u, 885462008u, 3294724487u, 3933892248u, 2094100220u, 339117932u, 4048830727u, 3202280980u, 1458155303u, 2689246273u, 1022871705u, 2464987878u, 3714515309u, 353796843u, 2822958815u, 4256850100u, 4052777845u, 551748367u, 618185374u, 3778635579u, 4020649912u, 1904685140u, 3069366075u, 2670879810u, 3407193292u, 2954511620u, 4058283405u, 2219449317u, 3135758300u, 1120655984u, 3447565834u, 1474845562u, 3577699062u, 550456716u, 3466908712u, 2043752612u, 881257467u, 869518812u, 2005220179u, 938474677u, 3305539448u, 3850417126u, 1315485940u, 3318264702u, 226533026u, 965733244u, 321539988u, 1136104718u, 804158748u, 573969341u, 3708209826u, 937399083u, 3290727049u, 2901666755u, 1461057207u, 4013193437u, 4066861423u, 3242773476u, 2421326174u, 1581322155u, 3028952165u, 786071460u, 3900391652u, 3918438532u, 1485433313u, 4023619836u, 3708277595u, 3678951060u, 953673138u, 1467089153u, 1930354364u, 1533292819u, 2492563023u, 1346121658u, 1685000834u, 1965281866u, 3765933717u, 4190206607u, 2052792609u, 3515332758u, 690371149u, 3125873887u, 2180283551u, 2903598061u, 3933952357u, 436236910u, 289419410u, 14314871u, 1242357089u, 2904507907u, 1616633776u, 2666382180u, 585885352u, 3471299210u, 2699507360u, 1432659641u, 277164553u, 3354103607u, 770115018u, 2303809295u, 3741942315u, 3177781868u, 2853364978u, 2269453327u, 3774259834u, 987383833u, 1290892879u, 225909803u, 1741533526u, 890078084u, 1496906255u, 1111072499u, 916028167u, 243534141u, 1252605537u, 2204162171u, 531204876u, 290011180u, 3916834213u, 102027703u, 237315147u, 209093447u, 1486785922u, 220223953u, 2758195998u, 4175039106u, 82940208u, 3127791296u, 2569425252u, 518464269u, 1353887104u, 3941492737u, 2377294467u, 3935040926u }; internal static readonly int MAX_ROUNDS = 16; internal static readonly int RED_ROUNDS = 12; private int[] _Kr = new int[17]; private uint[] _Km = new uint[17]; private bool _encrypting; private byte[] _workingKey; private int _rounds = MAX_ROUNDS; public virtual string AlgorithmName => "CAST5"; public virtual bool IsPartialBlockOkay => false; public virtual void Init(bool forEncryption, ICipherParameters parameters) { if (!(parameters is KeyParameter)) { throw new ArgumentException("Invalid parameter passed to " + AlgorithmName + " init - " + Platform.GetTypeName(parameters)); } _encrypting = forEncryption; _workingKey = ((KeyParameter)parameters).GetKey(); SetKey(_workingKey); } public virtual int ProcessBlock(byte[] input, int inOff, byte[] output, int outOff) { int blockSize = GetBlockSize(); if (_workingKey == null) { throw new InvalidOperationException(AlgorithmName + " not initialised"); } Check.DataLength(input, inOff, blockSize, "input buffer too short"); Check.OutputLength(output, outOff, blockSize, "output buffer too short"); if (_encrypting) { return EncryptBlock(input, inOff, output, outOff); } return DecryptBlock(input, inOff, output, outOff); } public virtual void Reset() { } public virtual int GetBlockSize() { return 8; } internal virtual void SetKey(byte[] key) { if (key.Length < 11) { _rounds = RED_ROUNDS; } int[] array = new int[16]; int[] array2 = new int[16]; for (int i = 0; i < key.Length; i++) { array2[i] = key[i] & 0xFF; } uint num = IntsTo32bits(array2, 0); uint num2 = IntsTo32bits(array2, 4); uint num3 = IntsTo32bits(array2, 8); uint num4 = IntsTo32bits(array2, 12); uint inData = num ^ S5[array2[13]] ^ S6[array2[15]] ^ S7[array2[12]] ^ S8[array2[14]] ^ S7[array2[8]]; Bits32ToInts(inData, array, 0); uint inData2 = num3 ^ S5[array[0]] ^ S6[array[2]] ^ S7[array[1]] ^ S8[array[3]] ^ S8[array2[10]]; Bits32ToInts(inData2, array, 4); uint inData3 = num4 ^ S5[array[7]] ^ S6[array[6]] ^ S7[array[5]] ^ S8[array[4]] ^ S5[array2[9]]; Bits32ToInts(inData3, array, 8); uint inData4 = num2 ^ S5[array[10]] ^ S6[array[9]] ^ S7[array[11]] ^ S8[array[8]] ^ S6[array2[11]]; Bits32ToInts(inData4, array, 12); _Km[1] = S5[array[8]] ^ S6[array[9]] ^ S7[array[7]] ^ S8[array[6]] ^ S5[array[2]]; _Km[2] = S5[array[10]] ^ S6[array[11]] ^ S7[array[5]] ^ S8[array[4]] ^ S6[array[6]]; _Km[3] = S5[array[12]] ^ S6[array[13]] ^ S7[array[3]] ^ S8[array[2]] ^ S7[array[9]]; _Km[4] = S5[array[14]] ^ S6[array[15]] ^ S7[array[1]] ^ S8[array[0]] ^ S8[array[12]]; inData = IntsTo32bits(array, 0); inData2 = IntsTo32bits(array, 4); inData3 = IntsTo32bits(array, 8); inData4 = IntsTo32bits(array, 12); num = inData3 ^ S5[array[5]] ^ S6[array[7]] ^ S7[array[4]] ^ S8[array[6]] ^ S7[array[0]]; Bits32ToInts(num, array2, 0); num2 = inData ^ S5[array2[0]] ^ S6[array2[2]] ^ S7[array2[1]] ^ S8[array2[3]] ^ S8[array[2]]; Bits32ToInts(num2, array2, 4); num3 = inData2 ^ S5[array2[7]] ^ S6[array2[6]] ^ S7[array2[5]] ^ S8[array2[4]] ^ S5[array[1]]; Bits32ToInts(num3, array2, 8); num4 = inData4 ^ S5[array2[10]] ^ S6[array2[9]] ^ S7[array2[11]] ^ S8[array2[8]] ^ S6[array[3]]; Bits32ToInts(num4, array2, 12); _Km[5] = S5[array2[3]] ^ S6[array2[2]] ^ S7[array2[12]] ^ S8[array2[13]] ^ S5[array2[8]]; _Km[6] = S5[array2[1]] ^ S6[array2[0]] ^ S7[array2[14]] ^ S8[array2[15]] ^ S6[array2[13]]; _Km[7] = S5[array2[7]] ^ S6[array2[6]] ^ S7[array2[8]] ^ S8[array2[9]] ^ S7[array2[3]]; _Km[8] = S5[array2[5]] ^ S6[array2[4]] ^ S7[array2[10]] ^ S8[array2[11]] ^ S8[array2[7]]; num = IntsTo32bits(array2, 0); num2 = IntsTo32bits(array2, 4); num3 = IntsTo32bits(array2, 8); num4 = IntsTo32bits(array2, 12); inData = num ^ S5[array2[13]] ^ S6[array2[15]] ^ S7[array2[12]] ^ S8[array2[14]] ^ S7[array2[8]]; Bits32ToInts(inData, array, 0); inData2 = num3 ^ S5[array[0]] ^ S6[array[2]] ^ S7[array[1]] ^ S8[array[3]] ^ S8[array2[10]]; Bits32ToInts(inData2, array, 4); inData3 = num4 ^ S5[array[7]] ^ S6[array[6]] ^ S7[array[5]] ^ S8[array[4]] ^ S5[array2[9]]; Bits32ToInts(inData3, array, 8); inData4 = num2 ^ S5[array[10]] ^ S6[array[9]] ^ S7[array[11]] ^ S8[array[8]] ^ S6[array2[11]]; Bits32ToInts(inData4, array, 12); _Km[9] = S5[array[3]] ^ S6[array[2]] ^ S7[array[12]] ^ S8[array[13]] ^ S5[array[9]]; _Km[10] = S5[array[1]] ^ S6[array[0]] ^ S7[array[14]] ^ S8[array[15]] ^ S6[array[12]]; _Km[11] = S5[array[7]] ^ S6[array[6]] ^ S7[array[8]] ^ S8[array[9]] ^ S7[array[2]]; _Km[12] = S5[array[5]] ^ S6[array[4]] ^ S7[array[10]] ^ S8[array[11]] ^ S8[array[6]]; inData = IntsTo32bits(array, 0); inData2 = IntsTo32bits(array, 4); inData3 = IntsTo32bits(array, 8); inData4 = IntsTo32bits(array, 12); num = inData3 ^ S5[array[5]] ^ S6[array[7]] ^ S7[array[4]] ^ S8[array[6]] ^ S7[array[0]]; Bits32ToInts(num, array2, 0); num2 = inData ^ S5[array2[0]] ^ S6[array2[2]] ^ S7[array2[1]] ^ S8[array2[3]] ^ S8[array[2]]; Bits32ToInts(num2, array2, 4); num3 = inData2 ^ S5[array2[7]] ^ S6[array2[6]] ^ S7[array2[5]] ^ S8[array2[4]] ^ S5[array[1]]; Bits32ToInts(num3, array2, 8); num4 = inData4 ^ S5[array2[10]] ^ S6[array2[9]] ^ S7[array2[11]] ^ S8[array2[8]] ^ S6[array[3]]; Bits32ToInts(num4, array2, 12); _Km[13] = S5[array2[8]] ^ S6[array2[9]] ^ S7[array2[7]] ^ S8[array2[6]] ^ S5[array2[3]]; _Km[14] = S5[array2[10]] ^ S6[array2[11]] ^ S7[array2[5]] ^ S8[array2[4]] ^ S6[array2[7]]; _Km[15] = S5[array2[12]] ^ S6[array2[13]] ^ S7[array2[3]] ^ S8[array2[2]] ^ S7[array2[8]]; _Km[16] = S5[array2[14]] ^ S6[array2[15]] ^ S7[array2[1]] ^ S8[array2[0]] ^ S8[array2[13]]; num = IntsTo32bits(array2, 0); num2 = IntsTo32bits(array2, 4); num3 = IntsTo32bits(array2, 8); num4 = IntsTo32bits(array2, 12); inData = num ^ S5[array2[13]] ^ S6[array2[15]] ^ S7[array2[12]] ^ S8[array2[14]] ^ S7[array2[8]]; Bits32ToInts(inData, array, 0); inData2 = num3 ^ S5[array[0]] ^ S6[array[2]] ^ S7[array[1]] ^ S8[array[3]] ^ S8[array2[10]]; Bits32ToInts(inData2, array, 4); inData3 = num4 ^ S5[array[7]] ^ S6[array[6]] ^ S7[array[5]] ^ S8[array[4]] ^ S5[array2[9]]; Bits32ToInts(inData3, array, 8); inData4 = num2 ^ S5[array[10]] ^ S6[array[9]] ^ S7[array[11]] ^ S8[array[8]] ^ S6[array2[11]]; Bits32ToInts(inData4, array, 12); _Kr[1] = (int)((S5[array[8]] ^ S6[array[9]] ^ S7[array[7]] ^ S8[array[6]] ^ S5[array[2]]) & 0x1F); _Kr[2] = (int)((S5[array[10]] ^ S6[array[11]] ^ S7[array[5]] ^ S8[array[4]] ^ S6[array[6]]) & 0x1F); _Kr[3] = (int)((S5[array[12]] ^ S6[array[13]] ^ S7[array[3]] ^ S8[array[2]] ^ S7[array[9]]) & 0x1F); _Kr[4] = (int)((S5[array[14]] ^ S6[array[15]] ^ S7[array[1]] ^ S8[array[0]] ^ S8[array[12]]) & 0x1F); inData = IntsTo32bits(array, 0); inData2 = IntsTo32bits(array, 4); inData3 = IntsTo32bits(array, 8); inData4 = IntsTo32bits(array, 12); num = inData3 ^ S5[array[5]] ^ S6[array[7]] ^ S7[array[4]] ^ S8[array[6]] ^ S7[array[0]]; Bits32ToInts(num, array2, 0); num2 = inData ^ S5[array2[0]] ^ S6[array2[2]] ^ S7[array2[1]] ^ S8[array2[3]] ^ S8[array[2]]; Bits32ToInts(num2, array2, 4); num3 = inData2 ^ S5[array2[7]] ^ S6[array2[6]] ^ S7[array2[5]] ^ S8[array2[4]] ^ S5[array[1]]; Bits32ToInts(num3, array2, 8); num4 = inData4 ^ S5[array2[10]] ^ S6[array2[9]] ^ S7[array2[11]] ^ S8[array2[8]] ^ S6[array[3]]; Bits32ToInts(num4, array2, 12); _Kr[5] = (int)((S5[array2[3]] ^ S6[array2[2]] ^ S7[array2[12]] ^ S8[array2[13]] ^ S5[array2[8]]) & 0x1F); _Kr[6] = (int)((S5[array2[1]] ^ S6[array2[0]] ^ S7[array2[14]] ^ S8[array2[15]] ^ S6[array2[13]]) & 0x1F); _Kr[7] = (int)((S5[array2[7]] ^ S6[array2[6]] ^ S7[array2[8]] ^ S8[array2[9]] ^ S7[array2[3]]) & 0x1F); _Kr[8] = (int)((S5[array2[5]] ^ S6[array2[4]] ^ S7[array2[10]] ^ S8[array2[11]] ^ S8[array2[7]]) & 0x1F); num = IntsTo32bits(array2, 0); num2 = IntsTo32bits(array2, 4); num3 = IntsTo32bits(array2, 8); num4 = IntsTo32bits(array2, 12); inData = num ^ S5[array2[13]] ^ S6[array2[15]] ^ S7[array2[12]] ^ S8[array2[14]] ^ S7[array2[8]]; Bits32ToInts(inData, array, 0); inData2 = num3 ^ S5[array[0]] ^ S6[array[2]] ^ S7[array[1]] ^ S8[array[3]] ^ S8[array2[10]]; Bits32ToInts(inData2, array, 4); inData3 = num4 ^ S5[array[7]] ^ S6[array[6]] ^ S7[array[5]] ^ S8[array[4]] ^ S5[array2[9]]; Bits32ToInts(inData3, array, 8); inData4 = num2 ^ S5[array[10]] ^ S6[array[9]] ^ S7[array[11]] ^ S8[array[8]] ^ S6[array2[11]]; Bits32ToInts(inData4, array, 12); _Kr[9] = (int)((S5[array[3]] ^ S6[array[2]] ^ S7[array[12]] ^ S8[array[13]] ^ S5[array[9]]) & 0x1F); _Kr[10] = (int)((S5[array[1]] ^ S6[array[0]] ^ S7[array[14]] ^ S8[array[15]] ^ S6[array[12]]) & 0x1F); _Kr[11] = (int)((S5[array[7]] ^ S6[array[6]] ^ S7[array[8]] ^ S8[array[9]] ^ S7[array[2]]) & 0x1F); _Kr[12] = (int)((S5[array[5]] ^ S6[array[4]] ^ S7[array[10]] ^ S8[array[11]] ^ S8[array[6]]) & 0x1F); inData = IntsTo32bits(array, 0); inData2 = IntsTo32bits(array, 4); inData3 = IntsTo32bits(array, 8); inData4 = IntsTo32bits(array, 12); num = inData3 ^ S5[array[5]] ^ S6[array[7]] ^ S7[array[4]] ^ S8[array[6]] ^ S7[array[0]]; Bits32ToInts(num, array2, 0); num2 = inData ^ S5[array2[0]] ^ S6[array2[2]] ^ S7[array2[1]] ^ S8[array2[3]] ^ S8[array[2]]; Bits32ToInts(num2, array2, 4); num3 = inData2 ^ S5[array2[7]] ^ S6[array2[6]] ^ S7[array2[5]] ^ S8[array2[4]] ^ S5[array[1]]; Bits32ToInts(num3, array2, 8); num4 = inData4 ^ S5[array2[10]] ^ S6[array2[9]] ^ S7[array2[11]] ^ S8[array2[8]] ^ S6[array[3]]; Bits32ToInts(num4, array2, 12); _Kr[13] = (int)((S5[array2[8]] ^ S6[array2[9]] ^ S7[array2[7]] ^ S8[array2[6]] ^ S5[array2[3]]) & 0x1F); _Kr[14] = (int)((S5[array2[10]] ^ S6[array2[11]] ^ S7[array2[5]] ^ S8[array2[4]] ^ S6[array2[7]]) & 0x1F); _Kr[15] = (int)((S5[array2[12]] ^ S6[array2[13]] ^ S7[array2[3]] ^ S8[array2[2]] ^ S7[array2[8]]) & 0x1F); _Kr[16] = (int)((S5[array2[14]] ^ S6[array2[15]] ^ S7[array2[1]] ^ S8[array2[0]] ^ S8[array2[13]]) & 0x1F); } internal virtual int EncryptBlock(byte[] src, int srcIndex, byte[] dst, int dstIndex) { uint l = Pack.BE_To_UInt32(src, srcIndex); uint r = Pack.BE_To_UInt32(src, srcIndex + 4); uint[] array = new uint[2]; CAST_Encipher(l, r, array); Pack.UInt32_To_BE(array[0], dst, dstIndex); Pack.UInt32_To_BE(array[1], dst, dstIndex + 4); return 8; } internal virtual int DecryptBlock(byte[] src, int srcIndex, byte[] dst, int dstIndex) { uint l = Pack.BE_To_UInt32(src, srcIndex); uint r = Pack.BE_To_UInt32(src, srcIndex + 4); uint[] array = new uint[2]; CAST_Decipher(l, r, array); Pack.UInt32_To_BE(array[0], dst, dstIndex); Pack.UInt32_To_BE(array[1], dst, dstIndex + 4); return 8; } internal static uint F1(uint D, uint Kmi, int Kri) { uint num = Kmi + D; num = (num << Kri) | (num >> 32 - Kri); return (S1[(num >> 24) & 0xFF] ^ S2[(num >> 16) & 0xFF]) - S3[(num >> 8) & 0xFF] + S4[num & 0xFF]; } internal static uint F2(uint D, uint Kmi, int Kri) { uint num = Kmi ^ D; num = (num << Kri) | (num >> 32 - Kri); return (S1[(num >> 24) & 0xFF] - S2[(num >> 16) & 0xFF] + S3[(num >> 8) & 0xFF]) ^ S4[num & 0xFF]; } internal static uint F3(uint D, uint Kmi, int Kri) { uint num = Kmi - D; num = (num << Kri) | (num >> 32 - Kri); return ((S1[(num >> 24) & 0xFF] + S2[(num >> 16) & 0xFF]) ^ S3[(num >> 8) & 0xFF]) - S4[num & 0xFF]; } internal void CAST_Encipher(uint L0, uint R0, uint[] result) { uint num = L0; uint num2 = R0; uint num3 = L0; uint num4 = R0; for (int i = 1; i <= _rounds; i++) { num = num3; num2 = num4; num3 = num2; switch (i) { case 1: case 4: case 7: case 10: case 13: case 16: num4 = num ^ F1(num2, _Km[i], _Kr[i]); break; case 2: case 5: case 8: case 11: case 14: num4 = num ^ F2(num2, _Km[i], _Kr[i]); break; case 3: case 6: case 9: case 12: case 15: num4 = num ^ F3(num2, _Km[i], _Kr[i]); break; } } result[0] = num4; result[1] = num3; } internal void CAST_Decipher(uint L16, uint R16, uint[] result) { uint num = L16; uint num2 = R16; uint num3 = L16; uint num4 = R16; for (int num5 = _rounds; num5 > 0; num5--) { num = num3; num2 = num4; num3 = num2; switch (num5) { case 1: case 4: case 7: case 10: case 13: case 16: num4 = num ^ F1(num2, _Km[num5], _Kr[num5]); break; case 2: case 5: case 8: case 11: case 14: num4 = num ^ F2(num2, _Km[num5], _Kr[num5]); break; case 3: case 6: case 9: case 12: case 15: num4 = num ^ F3(num2, _Km[num5], _Kr[num5]); break; } } result[0] = num4; result[1] = num3; } internal static void Bits32ToInts(uint inData, int[] b, int offset) { b[offset + 3] = (int)(inData & 0xFF); b[offset + 2] = (int)((inData >> 8) & 0xFF); b[offset + 1] = (int)((inData >> 16) & 0xFF); b[offset] = (int)((inData >> 24) & 0xFF); } internal static uint IntsTo32bits(int[] b, int i) { return (uint)(((b[i] & 0xFF) << 24) | ((b[i + 1] & 0xFF) << 16) | ((b[i + 2] & 0xFF) << 8) | (b[i + 3] & 0xFF)); } }