Files
SuperVPN/output/Libraries/BouncyCastle.Crypto/Org/BouncyCastle/Crypto/Engines/SeedEngine.cs
2025-10-09 09:57:24 +09:00

283 lines
16 KiB
C#

using System;
using Org.BouncyCastle.Crypto.Parameters;
namespace Org.BouncyCastle.Crypto.Engines;
public class SeedEngine : IBlockCipher
{
private const int BlockSize = 16;
private static readonly uint[] SS0 = new uint[256]
{
696885672u, 92635524u, 382128852u, 331600848u, 340021332u, 487395612u, 747413676u, 621093156u, 491606364u, 54739776u,
403181592u, 504238620u, 289493328u, 1020063996u, 181060296u, 591618912u, 671621160u, 71581764u, 536879136u, 495817116u,
549511392u, 583197408u, 147374280u, 386339604u, 629514660u, 261063564u, 50529024u, 994800504u, 999011256u, 318968592u,
314757840u, 785310444u, 809529456u, 210534540u, 1057960764u, 680042664u, 839004720u, 500027868u, 919007988u, 876900468u,
751624428u, 361075092u, 185271048u, 390550356u, 474763356u, 457921368u, 1032696252u, 16843008u, 604250148u, 470552604u,
860058480u, 411603096u, 268439568u, 214745292u, 851636976u, 432656856u, 738992172u, 667411428u, 843215472u, 58950528u,
462132120u, 297914832u, 109478532u, 164217288u, 541089888u, 272650320u, 595829664u, 734782440u, 218956044u, 914797236u,
512660124u, 256852812u, 931640244u, 441078360u, 113689284u, 944271480u, 646357668u, 302125584u, 797942700u, 365285844u,
557932896u, 63161280u, 881111220u, 21053760u, 306336336u, 1028485500u, 227377548u, 134742024u, 521081628u, 428446104u,
0u, 420024600u, 67371012u, 323179344u, 935850996u, 566354400u, 1036907004u, 910586484u, 789521196u, 654779172u,
813740208u, 193692552u, 235799052u, 730571688u, 578986656u, 776888940u, 327390096u, 223166796u, 692674920u, 1011642492u,
151585032u, 168428040u, 1066382268u, 802153452u, 868479984u, 96846276u, 126321540u, 335810580u, 1053750012u, 608460900u,
516870876u, 772678188u, 189481800u, 436867608u, 101057028u, 553722144u, 726360936u, 642146916u, 33686016u, 902164980u,
310547088u, 176849544u, 202113036u, 864269232u, 1045328508u, 281071824u, 977957496u, 122110788u, 377918100u, 633725412u,
637936164u, 8421504u, 764256684u, 533713884u, 562143648u, 805318704u, 923218740u, 781099692u, 906375732u, 352653588u,
570565152u, 940060728u, 885321972u, 663200676u, 88424772u, 206323788u, 25264512u, 701096424u, 75792516u, 394761108u,
889532724u, 197903304u, 248431308u, 1007431740u, 826372464u, 285282576u, 130532292u, 160006536u, 893743476u, 1003222008u,
449499864u, 952692984u, 344232084u, 424235352u, 42107520u, 80003268u, 1070593020u, 155795784u, 956903736u, 658989924u,
12632256u, 265274316u, 398971860u, 948482232u, 252642060u, 244220556u, 37896768u, 587408160u, 293704080u, 743202924u,
466342872u, 612671652u, 872689716u, 834793968u, 138952776u, 46318272u, 793731948u, 1024274748u, 755835180u, 4210752u,
1049539260u, 1041117756u, 1015853244u, 29475264u, 713728680u, 982168248u, 240009804u, 356864340u, 990589752u, 483184860u,
675831912u, 1062171516u, 478974108u, 415813848u, 172638792u, 373707348u, 927429492u, 545300640u, 768467436u, 105267780u,
897954228u, 722150184u, 625303908u, 986379000u, 600040416u, 965325240u, 830583216u, 529503132u, 508449372u, 969535992u,
650568420u, 847426224u, 822161712u, 717939432u, 760045932u, 525292380u, 616882404u, 817950960u, 231588300u, 143163528u,
369496596u, 973746744u, 407392344u, 348442836u, 574775904u, 688464168u, 117900036u, 855847728u, 684253416u, 453710616u,
84214020u, 961114488u, 276861072u, 709517928u, 705307176u, 445289112u
};
private static readonly uint[] SS1 = new uint[256]
{
943196208u, 3894986976u, 741149985u, 2753988258u, 3423588291u, 3693006546u, 2956166067u, 3090712752u, 2888798115u, 1612726368u,
1410680145u, 3288844227u, 1141130304u, 1815039843u, 1747667811u, 1478183763u, 3221472195u, 1612857954u, 808649523u, 3023406513u,
673777953u, 2686484640u, 3760374498u, 2754054051u, 3490956243u, 2417066385u, 269549841u, 67503618u, 471600144u, 3158084784u,
875955762u, 1208699715u, 3962556387u, 2282260608u, 1814842464u, 2821228704u, 337053459u, 3288646848u, 336987666u, 4097098992u,
3221406402u, 1141196097u, 3760308705u, 3558262482u, 1010765619u, 1010634033u, 2349764226u, 2551744656u, 673712160u, 1276005954u,
4097230578u, 1010699826u, 2753922465u, 4164536817u, 202181889u, 3693072339u, 3625502928u, 673909539u, 1680229986u, 2017086066u,
606537507u, 741281571u, 4029792753u, 1882342002u, 1073889858u, 3558130896u, 1073824065u, 3221274816u, 1882407795u, 1680295779u,
2888600736u, 2282457987u, 4097296371u, 2888666529u, 2147516544u, 471797523u, 3356150466u, 741084192u, 2821360290u, 875824176u,
3490890450u, 134941443u, 3962490594u, 3895052769u, 1545424209u, 2484372624u, 404228112u, 4164471024u, 1410811731u, 2888732322u,
134744064u, 3288712641u, 269681427u, 3423456705u, 2215020162u, 3090778545u, 4232040435u, 2084392305u, 3221340609u, 808517937u,
4097164785u, 2282392194u, 1747602018u, 2956034481u, 3490824657u, 538968096u, 3558328275u, 131586u, 539099682u, 67372032u,
1747470432u, 1882276209u, 67569411u, 3625700307u, 2619182481u, 2551810449u, 1612792161u, 3158216370u, 3827746530u, 1478052177u,
3692940753u, 1343308113u, 2417000592u, 3692874960u, 2551876242u, 2686682019u, 2821426083u, 3490758864u, 2147582337u, 202313475u,
1141327683u, 404359698u, 3760440291u, 3962359008u, 2349698433u, 3158282163u, 2484504210u, 2017151859u, 1545358416u, 2686616226u,
2686550433u, 1612923747u, 539165475u, 1275940161u, 3356018880u, 2619248274u, 2619116688u, 943327794u, 202116096u, 741215778u,
3090844338u, 1814974050u, 2619314067u, 1478117970u, 4029858546u, 2417132178u, 4029924339u, 1208568129u, 2016954480u, 3423390912u,
336921873u, 4164668403u, 1882210416u, 1949648241u, 2084523891u, 875889969u, 269484048u, 197379u, 1680098400u, 1814908257u,
3288778434u, 1949582448u, 3558196689u, 3023340720u, 3895118562u, 134809857u, 1949714034u, 404293905u, 4231974642u, 1073758272u,
269615634u, 3760242912u, 3158150577u, 67437825u, 4164602610u, 65793u, 4029726960u, 673843746u, 1545490002u, 2821294497u,
1410745938u, 1073955651u, 2214954369u, 336856080u, 2282326401u, 2551942035u, 2955968688u, 3827680737u, 1208502336u, 2017020273u,
2484570003u, 4231843056u, 471731730u, 2147648130u, 539033889u, 2349632640u, 404425491u, 1545555795u, 1949779827u, 1410614352u,
2956100274u, 471665937u, 606405921u, 1276071747u, 0u, 1141261890u, 3962424801u, 1477986384u, 1343373906u, 3895184355u,
2084458098u, 3625634514u, 3356084673u, 4231908849u, 808452144u, 2484438417u, 1680164193u, 1010568240u, 3023472306u, 3827614944u,
3090910131u, 2084326512u, 202247682u, 1343242320u, 943262001u, 606471714u, 808583730u, 2214888576u, 1747536225u, 2417197971u,
876021555u, 3827812323u, 606340128u, 2753856672u, 3356216259u, 1343439699u, 134875650u, 2215085955u, 3625568721u, 1275874368u,
2147713923u, 2349830019u, 3423522498u, 943393587u, 1208633922u, 3023538099u
};
private static readonly uint[] SS2 = new uint[256]
{
2712152457u, 2172913029u, 3537114822u, 3553629123u, 1347687492u, 287055117u, 2695638156u, 556016901u, 1364991309u, 1128268611u,
270014472u, 303832590u, 1364201793u, 4043062476u, 3267889866u, 1667244867u, 539502600u, 1078199364u, 538976256u, 2442927501u,
3772784832u, 3806339778u, 3234334920u, 320083719u, 2711889285u, 2206994319u, 50332419u, 1937259339u, 3015195531u, 319820547u,
3536851650u, 3807129294u, 1886400576u, 2156661900u, 859586319u, 2695374984u, 842019330u, 3520863693u, 4076091078u, 1886663748u,
3773574348u, 2442401157u, 50858763u, 1398019911u, 1348213836u, 1398283083u, 2981903757u, 16777473u, 539239428u, 270277644u,
1936732995u, 2425886856u, 269488128u, 3234598092u, 4075827906u, 3520600521u, 539765772u, 3823380423u, 1919955522u, 2206204803u,
2476219275u, 3520074177u, 2189690502u, 3251112393u, 1616912448u, 1347424320u, 2745181059u, 3823643595u, 17566989u, 2998154886u,
2459704974u, 1129058127u, 3014932359u, 1381505610u, 3267626694u, 1886926920u, 2728666758u, 303043074u, 2745970575u, 3520337349u,
1633689921u, 3284140995u, 2964599940u, 1094713665u, 1380979266u, 1903967565u, 2173439373u, 526344u, 320610063u, 2442664329u,
0u, 286791945u, 263172u, 1397756739u, 4092868551u, 3789562305u, 4059839949u, 1920218694u, 590098191u, 589571847u,
2964336768u, 2206731147u, 34344462u, 2745707403u, 2728403586u, 1651256910u, 2475692931u, 1095503181u, 1634216265u, 1887190092u,
17303817u, 34081290u, 3015458703u, 3823906767u, 4092605379u, 3250849221u, 2206467975u, 269751300u, 4076617422u, 1617175620u,
3537641166u, 573320718u, 1128794955u, 303569418u, 33818118u, 555753729u, 1667771211u, 1650730566u, 33554946u, 4059313605u,
2458915458u, 2189953674u, 789516u, 3014669187u, 1920745038u, 3503296704u, 1920481866u, 1128531783u, 2459178630u, 3789825477u,
572794374u, 2155872384u, 2712415629u, 3554418639u, 2711626113u, 808464384u, 859059975u, 2729193102u, 842282502u, 286528773u,
572531202u, 808990728u, 4042536132u, 2745444231u, 1094976837u, 1078725708u, 2172649857u, 3790088649u, 2156135556u, 2475956103u,
825505029u, 3284667339u, 3268153038u, 809253900u, 1903178049u, 286265601u, 3284404167u, 2173176201u, 1903441221u, 4093131723u,
3537377994u, 4042799304u, 2425623684u, 1364728137u, 2189427330u, 3234071748u, 4093394895u, 1095240009u, 825768201u, 1667508039u,
3233808576u, 3284930511u, 3553892295u, 2964863112u, 51121935u, 2190216846u, 1111491138u, 589308675u, 2442137985u, 1617701964u,
3554155467u, 2695111812u, 808727556u, 4059050433u, 1078462536u, 3267363522u, 1668034383u, 826031373u, 556543245u, 1077936192u,
2998681230u, 842808846u, 2965126284u, 3250586049u, 2728929930u, 2998418058u, 1112280654u, 1364464965u, 859323147u, 3504086220u,
1617438792u, 1937522511u, 2426150028u, 3503823048u, 1112017482u, 1381242438u, 1936996167u, 2694848640u, 3790351821u, 1111754310u,
2981377413u, 589835019u, 1633953093u, 4076354250u, 3823117251u, 2981640585u, 2981114241u, 2476482447u, 1381768782u, 4059576777u,
3806602950u, 2997891714u, 825241857u, 3806866122u, 1634479437u, 1398546255u, 3773048004u, 4042272960u, 3251375565u, 2156398728u,
303306246u, 842545674u, 1347950664u, 3503559876u, 1650467394u, 556280073u, 50595591u, 858796803u, 3773311176u, 320346891u,
17040645u, 1903704393u, 2425360512u, 1650993738u, 573057546u, 2459441802u
};
private static readonly uint[] SS3 = new uint[256]
{
137377848u, 3370182696u, 220277805u, 2258805798u, 3485715471u, 3469925406u, 2209591347u, 2293282872u, 2409868335u, 1080057888u,
1162957845u, 3351495687u, 1145062404u, 1331915823u, 1264805931u, 1263753243u, 3284385795u, 1113743394u, 53686323u, 2243015733u,
153167913u, 2158010400u, 3269648418u, 2275648551u, 3285438483u, 2173800465u, 17895441u, 100795398u, 202382364u, 2360392764u,
103953462u, 1262700555u, 3487820847u, 2290124808u, 1281387564u, 2292230184u, 118690839u, 3300967428u, 101848086u, 3304125492u,
3267543042u, 1161905157u, 3252805665u, 3335705622u, 255015999u, 221330493u, 2390920206u, 2291177496u, 136325160u, 1312967694u,
3337810998u, 238173246u, 2241963045u, 3388078137u, 218172429u, 3486768159u, 3369130008u, 186853419u, 1180853286u, 1249015866u,
119743527u, 253963311u, 3253858353u, 1114796082u, 1111638018u, 3302020116u, 1094795265u, 3233857536u, 1131638835u, 1197696039u,
2359340076u, 2340653067u, 3354653751u, 2376182829u, 2155905024u, 252910623u, 3401762826u, 203435052u, 2325915690u, 70267956u,
3268595730u, 184748043u, 3470978094u, 3387025449u, 1297177629u, 2224067604u, 135272472u, 3371235384u, 1196643351u, 2393025582u,
134219784u, 3317810181u, 51580947u, 3452029965u, 2256700422u, 2310125625u, 3488873535u, 1299283005u, 3250700289u, 20000817u,
3320968245u, 2323810314u, 1247963178u, 2175905841u, 3251752977u, 2105376u, 3352548375u, 33685506u, 35790882u, 67109892u,
1214277672u, 1097953329u, 117638151u, 3419658267u, 2375130141u, 2308020249u, 1096900641u, 2394078270u, 3336758310u, 1230067737u,
3453082653u, 1095847953u, 2156957712u, 3436239900u, 2324863002u, 2208538659u, 2342758443u, 3234910224u, 2172747777u, 251857935u,
1195590663u, 168957978u, 3286491171u, 3437292588u, 2374077453u, 2410921023u, 2257753110u, 1265858619u, 1280334876u, 2191695906u,
2174853153u, 1130586147u, 52633635u, 1296124941u, 3368077320u, 2391972894u, 2358287388u, 171063354u, 201329676u, 237120558u,
2326968378u, 1315073070u, 2408815647u, 1246910490u, 3270701106u, 2190643218u, 3287543859u, 1229015049u, 1215330360u, 3435187212u,
85005333u, 3421763643u, 1081110576u, 1165063221u, 1332968511u, 87110709u, 1052688u, 50528259u, 1147167780u, 1298230317u,
3334652934u, 1148220468u, 3318862869u, 2226172980u, 3403868202u, 151062537u, 1181905974u, 152115225u, 3472030782u, 1077952512u,
34738194u, 3235962912u, 2377235517u, 83952645u, 3404920890u, 16842753u, 3237015600u, 170010666u, 1314020382u, 2309072937u,
1179800598u, 1128480771u, 2239857669u, 68162580u, 2306967561u, 2341705755u, 2159063088u, 3319915557u, 1212172296u, 1232173113u,
2274595863u, 3438345276u, 236067870u, 2189590530u, 18948129u, 2357234700u, 185800731u, 1330863135u, 1198748727u, 1146115092u,
2192748594u, 219225117u, 86058021u, 1329810447u, 0u, 1178747910u, 3454135341u, 1213224984u, 1112690706u, 3420710955u,
1316125758u, 3402815514u, 3384920073u, 3455188029u, 3158064u, 2240910357u, 1164010533u, 204487740u, 2259858486u, 3303072804u,
2343811131u, 1282440252u, 235015182u, 1079005200u, 154220601u, 102900774u, 36843570u, 2223014916u, 1231120425u, 2207485971u,
120796215u, 3353601063u, 69215268u, 2225120292u, 3418605579u, 1129533459u, 167905290u, 2273543175u, 3385972761u, 1279282188u,
2206433283u, 2407762959u, 3468872718u, 187906107u, 1245857802u, 2276701239u
};
private static readonly uint[] KC = new uint[16]
{
2654435769u, 1013904243u, 2027808486u, 4055616972u, 3816266649u, 3337566003u, 2380164711u, 465362127u, 930724254u, 1861448508u,
3722897016u, 3150826737u, 2006686179u, 4013372358u, 3731777421u, 3168587547u
};
private int[] wKey;
private bool forEncryption;
public virtual string AlgorithmName => "SEED";
public virtual bool IsPartialBlockOkay => false;
public virtual void Init(bool forEncryption, ICipherParameters parameters)
{
this.forEncryption = forEncryption;
wKey = createWorkingKey(((KeyParameter)parameters).GetKey());
}
public virtual int GetBlockSize()
{
return 16;
}
public virtual int ProcessBlock(byte[] inBuf, int inOff, byte[] outBuf, int outOff)
{
if (wKey == null)
{
throw new InvalidOperationException("SEED engine not initialised");
}
Check.DataLength(inBuf, inOff, 16, "input buffer too short");
Check.OutputLength(outBuf, outOff, 16, "output buffer too short");
long num = bytesToLong(inBuf, inOff);
long num2 = bytesToLong(inBuf, inOff + 8);
if (forEncryption)
{
for (int i = 0; i < 16; i++)
{
long num3 = num2;
num2 = num ^ F(wKey[2 * i], wKey[2 * i + 1], num2);
num = num3;
}
}
else
{
for (int num4 = 15; num4 >= 0; num4--)
{
long num5 = num2;
num2 = num ^ F(wKey[2 * num4], wKey[2 * num4 + 1], num2);
num = num5;
}
}
longToBytes(outBuf, outOff, num2);
longToBytes(outBuf, outOff + 8, num);
return 16;
}
public virtual void Reset()
{
}
private int[] createWorkingKey(byte[] inKey)
{
int[] array = new int[32];
long num = bytesToLong(inKey, 0);
long num2 = bytesToLong(inKey, 8);
int num3 = extractW0(num);
int num4 = extractW1(num);
int num5 = extractW0(num2);
int num6 = extractW1(num2);
for (int i = 0; i < 16; i++)
{
array[2 * i] = G(num3 + num5 - (int)KC[i]);
array[2 * i + 1] = G(num4 - num6 + (int)KC[i]);
if (i % 2 == 0)
{
num = rotateRight8(num);
num3 = extractW0(num);
num4 = extractW1(num);
}
else
{
num2 = rotateLeft8(num2);
num5 = extractW0(num2);
num6 = extractW1(num2);
}
}
return array;
}
private int extractW1(long lVal)
{
return (int)lVal;
}
private int extractW0(long lVal)
{
return (int)(lVal >> 32);
}
private long rotateLeft8(long x)
{
return (x << 8) | (x >>> 56);
}
private long rotateRight8(long x)
{
return (x >>> 8) | (x << 56);
}
private long bytesToLong(byte[] src, int srcOff)
{
long num = 0L;
for (int i = 0; i <= 7; i++)
{
num = (num << 8) + (src[i + srcOff] & 0xFF);
}
return num;
}
private void longToBytes(byte[] dest, int destOff, long value)
{
for (int i = 0; i < 8; i++)
{
dest[i + destOff] = (byte)(value >> (7 - i) * 8);
}
}
private int G(int x)
{
return (int)(SS0[x & 0xFF] ^ SS1[(x >> 8) & 0xFF] ^ SS2[(x >> 16) & 0xFF] ^ SS3[(x >> 24) & 0xFF]);
}
private long F(int ki0, int ki1, long r)
{
int r2 = (int)(r >> 32);
int r3 = (int)r;
int num = phaseCalc2(r2, ki0, r3, ki1);
int num2 = num + phaseCalc1(r2, ki0, r3, ki1);
return ((long)num2 << 32) | (num & 0xFFFFFFFFu);
}
private int phaseCalc1(int r0, int ki0, int r1, int ki1)
{
return G(G(r0 ^ ki0 ^ (r1 ^ ki1)) + (r0 ^ ki0));
}
private int phaseCalc2(int r0, int ki0, int r1, int ki1)
{
return G(phaseCalc1(r0, ki0, r1, ki1) + G(r0 ^ ki0 ^ (r1 ^ ki1)));
}
}