< Summary

Information
Class: Renci.SshNet.Security.Cryptography.Ciphers.BlowfishCipher
Assembly: Renci.SshNet
File(s): \home\appveyor\projects\ssh-net\src\Renci.SshNet\Security\Cryptography\Ciphers\BlowfishCipher.cs
Line coverage
94%
Covered lines: 349
Uncovered lines: 21
Coverable lines: 370
Total lines: 526
Line coverage: 94.3%
Branch coverage
66%
Covered branches: 16
Total branches: 24
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.cctor()100%1100%
.ctor(...)50%684.61%
EncryptBlock(...)75%488.23%
DecryptBlock(...)0%40%
F(...)100%1100%
SetKey(...)100%6100%
ProcessTable(...)100%4100%

File(s)

\home\appveyor\projects\ssh-net\src\Renci.SshNet\Security\Cryptography\Ciphers\BlowfishCipher.cs

#LineLine coverage
 1using System;
 2using Renci.SshNet.Common;
 3
 4namespace Renci.SshNet.Security.Cryptography.Ciphers
 5{
 6    /// <summary>
 7    /// Blowfish cipher implementation.
 8    /// </summary>
 9    public sealed class BlowfishCipher : BlockCipher
 10    {
 11        private const int Rounds = 16;
 12
 13        private const int SboxSk = 256;
 14
 15        private const int PSize = Rounds + 2;
 16
 17        #region Static reference tables
 18
 319        private static readonly uint[] KP =
 320        {
 321            0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
 322            0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
 323            0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
 324            0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
 325            0x9216D5D9, 0x8979FB1B
 326        };
 27
 328        private static readonly uint[] KS0 =
 329        {
 330            0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
 331            0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
 332            0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
 333            0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
 334            0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
 335            0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
 336            0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
 337            0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
 338            0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
 339            0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
 340            0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
 341            0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
 342            0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
 343            0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
 344            0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
 345            0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
 346            0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
 347            0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
 348            0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
 349            0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
 350            0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
 351            0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
 352            0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
 353            0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
 354            0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
 355            0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
 356            0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
 357            0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
 358            0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
 359            0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
 360            0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
 361            0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
 362            0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
 363            0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
 364            0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
 365            0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
 366            0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
 367            0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
 368            0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
 369            0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
 370            0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
 371            0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
 372            0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
 373            0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
 374            0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
 375            0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
 376            0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
 377            0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
 378            0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
 379            0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
 380            0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
 381            0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
 382            0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
 383            0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
 384            0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
 385            0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
 386            0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
 387            0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
 388            0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
 389            0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
 390            0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
 391            0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
 392            0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
 393            0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
 394        };
 95
 396        private static readonly uint[] KS1 =
 397        {
 398            0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
 399            0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
 3100            0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
 3101            0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
 3102            0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
 3103            0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
 3104            0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
 3105            0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
 3106            0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
 3107            0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
 3108            0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
 3109            0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
 3110            0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
 3111            0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
 3112            0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
 3113            0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
 3114            0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
 3115            0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
 3116            0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
 3117            0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
 3118            0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
 3119            0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
 3120            0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
 3121            0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
 3122            0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
 3123            0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
 3124            0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
 3125            0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
 3126            0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
 3127            0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
 3128            0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
 3129            0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
 3130            0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
 3131            0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
 3132            0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
 3133            0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
 3134            0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
 3135            0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
 3136            0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
 3137            0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
 3138            0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
 3139            0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
 3140            0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
 3141            0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
 3142            0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
 3143            0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
 3144            0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
 3145            0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
 3146            0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
 3147            0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
 3148            0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
 3149            0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
 3150            0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
 3151            0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
 3152            0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
 3153            0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
 3154            0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
 3155            0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
 3156            0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
 3157            0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
 3158            0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
 3159            0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
 3160            0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
 3161            0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
 3162        };
 163
 3164        private static readonly uint[] KS2 =
 3165        {
 3166            0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
 3167            0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
 3168            0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
 3169            0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
 3170            0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
 3171            0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
 3172            0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
 3173            0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
 3174            0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
 3175            0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
 3176            0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
 3177            0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
 3178            0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
 3179            0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
 3180            0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
 3181            0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
 3182            0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
 3183            0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
 3184            0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
 3185            0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
 3186            0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
 3187            0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
 3188            0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
 3189            0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
 3190            0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
 3191            0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
 3192            0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
 3193            0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
 3194            0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
 3195            0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
 3196            0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
 3197            0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
 3198            0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
 3199            0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
 3200            0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
 3201            0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
 3202            0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
 3203            0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
 3204            0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
 3205            0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
 3206            0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
 3207            0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
 3208            0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
 3209            0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
 3210            0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
 3211            0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
 3212            0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
 3213            0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
 3214            0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
 3215            0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
 3216            0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
 3217            0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
 3218            0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
 3219            0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
 3220            0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
 3221            0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
 3222            0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
 3223            0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
 3224            0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
 3225            0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
 3226            0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
 3227            0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
 3228            0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
 3229            0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
 3230        };
 231
 3232        private static readonly uint[] KS3 =
 3233        {
 3234            0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
 3235            0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
 3236            0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
 3237            0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
 3238            0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
 3239            0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
 3240            0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
 3241            0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
 3242            0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
 3243            0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
 3244            0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
 3245            0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
 3246            0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
 3247            0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
 3248            0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
 3249            0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
 3250            0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
 3251            0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
 3252            0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
 3253            0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
 3254            0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
 3255            0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
 3256            0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
 3257            0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
 3258            0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
 3259            0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
 3260            0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
 3261            0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
 3262            0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
 3263            0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
 3264            0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
 3265            0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
 3266            0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
 3267            0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
 3268            0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
 3269            0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
 3270            0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
 3271            0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
 3272            0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
 3273            0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
 3274            0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
 3275            0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
 3276            0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
 3277            0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
 3278            0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
 3279            0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
 3280            0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
 3281            0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
 3282            0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
 3283            0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
 3284            0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
 3285            0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
 3286            0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
 3287            0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
 3288            0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
 3289            0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
 3290            0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
 3291            0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
 3292            0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
 3293            0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
 3294            0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
 3295            0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
 3296            0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
 3297            0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
 3298        };
 299
 300        #endregion
 301
 302        /// <summary>
 303        /// The s-boxes.
 304        /// </summary>
 305        private readonly uint[] _s0;
 306        private readonly uint[] _s1;
 307        private readonly uint[] _s2;
 308        private readonly uint[] _s3;
 309
 310        /// <summary>
 311        /// The p-array.
 312        /// </summary>
 313        private readonly uint[] _p;
 314
 315        /// <summary>
 316        /// Initializes a new instance of the <see cref="BlowfishCipher"/> class.
 317        /// </summary>
 318        /// <param name="key">The key.</param>
 319        /// <param name="mode">The mode.</param>
 320        /// <param name="padding">The padding.</param>
 321        /// <exception cref="ArgumentNullException"><paramref name="key"/> is <see langword="null"/>.</exception>
 322        /// <exception cref="ArgumentException">Keysize is not valid for this algorithm.</exception>
 323        public BlowfishCipher(byte[] key, CipherMode mode, CipherPadding padding)
 3324            : base(key, 8, mode, padding)
 3325        {
 3326            var keySize = key.Length * 8;
 327
 3328            if (keySize is < 1 or > 448)
 0329            {
 0330                throw new ArgumentException(string.Format("KeySize '{0}' is not valid for this algorithm.", keySize));
 331            }
 332
 3333            _s0 = new uint[SboxSk];
 3334            _s1 = new uint[SboxSk];
 3335            _s2 = new uint[SboxSk];
 3336            _s3 = new uint[SboxSk];
 3337            _p = new uint[PSize];
 338
 3339            SetKey(key);
 3340        }
 341
 342        /// <summary>
 343        /// Encrypts the specified region of the input byte array and copies the encrypted data to the specified region 
 344        /// </summary>
 345        /// <param name="inputBuffer">The input data to encrypt.</param>
 346        /// <param name="inputOffset">The offset into the input byte array from which to begin using data.</param>
 347        /// <param name="inputCount">The number of bytes in the input byte array to use as data.</param>
 348        /// <param name="outputBuffer">The output to which to write encrypted data.</param>
 349        /// <param name="outputOffset">The offset into the output byte array from which to begin writing data.</param>
 350        /// <returns>
 351        /// The number of bytes encrypted.
 352        /// </returns>
 353        public override int EncryptBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int o
 18354        {
 18355            if (inputCount != BlockSize)
 0356            {
 0357                throw new ArgumentException("inputCount");
 358            }
 359
 18360            var xl = Pack.BigEndianToUInt32(inputBuffer, inputOffset);
 18361            var xr = Pack.BigEndianToUInt32(inputBuffer, inputOffset + 4);
 362
 18363            xl ^= _p[0];
 364
 324365            for (var i = 1; i < Rounds; i += 2)
 144366            {
 144367                xr ^= F(xl) ^ _p[i];
 144368                xl ^= F(xr) ^ _p[i + 1];
 144369            }
 370
 18371            xr ^= _p[Rounds + 1];
 372
 18373            Pack.UInt32ToBigEndian(xr, outputBuffer, outputOffset);
 18374            Pack.UInt32ToBigEndian(xl, outputBuffer, outputOffset + 4);
 375
 18376            return BlockSize;
 18377        }
 378
 379        /// <summary>
 380        /// Decrypts the specified region of the input byte array and copies the decrypted data to the specified region 
 381        /// </summary>
 382        /// <param name="inputBuffer">The input data to decrypt.</param>
 383        /// <param name="inputOffset">The offset into the input byte array from which to begin using data.</param>
 384        /// <param name="inputCount">The number of bytes in the input byte array to use as data.</param>
 385        /// <param name="outputBuffer">The output to which to write decrypted data.</param>
 386        /// <param name="outputOffset">The offset into the output byte array from which to begin writing data.</param>
 387        /// <returns>
 388        /// The number of bytes decrypted.
 389        /// </returns>
 390        public override int DecryptBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int o
 0391        {
 0392            if (inputCount != BlockSize)
 0393            {
 0394                throw new ArgumentException("inputCount");
 395            }
 396
 0397            var xl = Pack.BigEndianToUInt32(inputBuffer, inputOffset);
 0398            var xr = Pack.BigEndianToUInt32(inputBuffer, inputOffset + 4);
 399
 0400            xl ^= _p[Rounds + 1];
 401
 0402            for (var i = Rounds; i > 0; i -= 2)
 0403            {
 0404                xr ^= F(xl) ^ _p[i];
 0405                xl ^= F(xr) ^ _p[i - 1];
 0406            }
 407
 0408            xr ^= _p[0];
 409
 0410            Pack.UInt32ToBigEndian(xr, outputBuffer, outputOffset);
 0411            Pack.UInt32ToBigEndian(xl, outputBuffer, outputOffset + 4);
 412
 0413            return BlockSize;
 0414        }
 415
 416        private uint F(uint x)
 25296417        {
 25296418            return ((_s0[x >> 24] + _s1[(x >> 16) & 0xff]) ^ _s2[(x >> 8) & 0xff]) + _s3[x & 0xff];
 25296419        }
 420
 421        private void SetKey(byte[] key)
 3422        {
 423            /*
 424             * - comments are from _Applied Crypto_, Schneier, p338
 425             * please be careful comparing the two, AC numbers the
 426             * arrays from 1, the enclosed code from 0.
 427             *
 428             * (1)
 429             * Initialise the S-boxes and the P-array, with a fixed string
 430             * This string contains the hexadecimal digits of pi (3.141...)
 431             */
 3432            Buffer.BlockCopy(KS0, 0, _s0, 0, SboxSk * sizeof(uint));
 3433            Buffer.BlockCopy(KS1, 0, _s1, 0, SboxSk * sizeof(uint));
 3434            Buffer.BlockCopy(KS2, 0, _s2, 0, SboxSk * sizeof(uint));
 3435            Buffer.BlockCopy(KS3, 0, _s3, 0, SboxSk * sizeof(uint));
 3436            Buffer.BlockCopy(KP, 0, _p, 0, PSize * sizeof(uint));
 437
 438            /*
 439             * (2)
 440             * Now, XOR P[0] with the first 32 bits of the key, XOR P[1] with the
 441             * second 32-bits of the key, and so on for all bits of the key
 442             * (up to P[17]).  Repeatedly cycle through the key bits until the
 443             * entire P-array has been XOR-ed with the key bits
 444             */
 3445            var keyLength = key.Length;
 3446            var keyIndex = 0;
 447
 114448            for (var i = 0; i < PSize; i++)
 54449            {
 450                // Get the 32 bits of the key, in 4 * 8 bit chunks
 54451                uint data = 0x0000000;
 540452                for (var j = 0; j < 4; j++)
 216453                {
 454                    // create a 32 bit block
 216455                    data = (data << 8) | key[keyIndex++];
 456
 457                    // wrap when we get to the end of the key
 216458                    if (keyIndex >= keyLength)
 12459                    {
 12460                        keyIndex = 0;
 12461                    }
 216462                }
 463
 464                // XOR the newly created 32 bit chunk onto the P-array
 54465                _p[i] ^= data;
 54466            }
 467
 468            /*
 469             * (3)
 470             * Encrypt the all-zero string with the Blowfish algorithm, using
 471             * the subkeys described in (1) and (2)
 472             *
 473             * (4)
 474             * Replace P1 and P2 with the output of step (3)
 475             *
 476             * (5)
 477             * Encrypt the output of step(3) using the Blowfish algorithm,
 478             * with the modified subkeys.
 479             *
 480             * (6)
 481             * Replace P3 and P4 with the output of step (5)
 482             *
 483             * (7)
 484             * Continue the process, replacing all elements of the P-array
 485             * and then all four S-boxes in order, with the output of the
 486             * continuously changing Blowfish algorithm
 487             */
 488
 3489            ProcessTable(0, 0, _p);
 3490            ProcessTable(_p[PSize - 2], _p[PSize - 1], _s0);
 3491            ProcessTable(_s0[SboxSk - 2], _s0[SboxSk - 1], _s1);
 3492            ProcessTable(_s1[SboxSk - 2], _s1[SboxSk - 1], _s2);
 3493            ProcessTable(_s2[SboxSk - 2], _s2[SboxSk - 1], _s3);
 3494        }
 495
 496        /// <summary>
 497        /// apply the encryption cycle to each value pair in the table.
 498        /// </summary>
 499        /// <param name="xl">The xl.</param>
 500        /// <param name="xr">The xr.</param>
 501        /// <param name="table">The table.</param>
 502        private void ProcessTable(uint xl, uint xr, uint[] table)
 15503        {
 15504            var size = table.Length;
 505
 3156506            for (var s = 0; s < size; s += 2)
 1563507            {
 1563508                xl ^= _p[0];
 509
 28134510                for (var i = 1; i < Rounds; i += 2)
 12504511                {
 12504512                    xr ^= F(xl) ^ _p[i];
 12504513                    xl ^= F(xr) ^ _p[i + 1];
 12504514                }
 515
 1563516                xr ^= _p[Rounds + 1];
 517
 1563518                table[s] = xr;
 1563519                table[s + 1] = xl;
 520
 1563521                xr = xl;            // end of cycle swap
 1563522                xl = table[s];
 1563523            }
 15524        }
 525    }
 526}