public void Initialize_BuildTheCorrectHashForPAndSWithSecretAndAD()
        {
            var subject = new Argon2iCore(128);

            subject.DegreeOfParallelism = 4;
            subject.Iterations          = 5;
            subject.MemorySize          = 128;
            subject.Secret         = Encoding.UTF8.GetBytes("In1ti@lS3cr3T 1234");
            subject.AssociatedData = new byte[] { 0x4b, 0x53, 0x7c, 0xa5, 0xe0, 0x2b, 0xe4, 0x06, 0xce, 0x9e, 0x9e, 0xa3, 0x27, 0x9c, 0x6e, 0x26 };
            subject.Salt           = new byte[] {
                0xf7, 0x19, 0x2b, 0xa7, 0xff, 0xb8, 0xca, 0xdc, 0x67, 0x51, 0xed, 0xa0, 0x08, 0x1d, 0x9d, 0x95,
                0x0b, 0x10, 0xe4, 0x32, 0x23, 0xef, 0x30, 0x07, 0x39, 0xc6, 0xbc, 0xad, 0x36, 0xda, 0x08, 0xeb,
                0x03, 0x3b, 0xab, 0x98, 0x32, 0x06, 0x7d, 0x39, 0x6f, 0x81, 0x72, 0x24, 0xff, 0x58, 0x41, 0xe6,
                0x33, 0x5d, 0xf7, 0xe7, 0x56, 0xf7, 0xaf, 0x32, 0xfa, 0xd8, 0x72, 0x78, 0xac, 0x63, 0xda, 0xd1
            };

            var expected = new byte[] {
                0x54, 0xaa, 0x5a, 0x9a, 0x69, 0x7f, 0x69, 0xdf, 0xd2, 0xf1, 0xdb, 0x33, 0xb8, 0xf4, 0xa3, 0xa5,
                0x82, 0x5e, 0x34, 0x5a, 0x0a, 0xb0, 0xe8, 0x5c, 0x84, 0x31, 0x09, 0x80, 0xd8, 0x71, 0xab, 0xad,
                0x85, 0x14, 0x88, 0x2a, 0xfd, 0x69, 0x85, 0x1b, 0x54, 0x6c, 0x37, 0x99, 0xba, 0x87, 0x95, 0x81,
                0xb3, 0x6e, 0x44, 0xf3, 0x13, 0xf9, 0x1d, 0xe3, 0x26, 0xed, 0xb6, 0x39, 0xf0, 0x21, 0xf8, 0x7f
            };

            var actual = subject.Initialize(Encoding.UTF8.GetBytes("P@ssw0rd!$"));

            Assert.Equal(expected, actual);
        }
        public void Initialize_BuildTheCorrectHashForWeirdSizes()
        {
            var subject = new Argon2iCore(47);

            subject.DegreeOfParallelism = 7;
            subject.Iterations          = 7;
            subject.MemorySize          = 1024;
            subject.Salt = new byte[] {
                0xf7, 0x19, 0x2b, 0xa7, 0xff, 0xb8, 0xca, 0xdc, 0x67, 0x51, 0xed, 0xa0, 0x08, 0x1d, 0x9d, 0x95,
                0x0b, 0x10, 0xe4, 0x32, 0x23, 0xef, 0x30, 0x07, 0x39, 0xc6, 0xbc, 0xad, 0x36, 0xda, 0x08, 0xeb,
                0x03, 0x3b, 0xab, 0x98, 0x32, 0x06, 0x7d, 0x39, 0x6f, 0x81, 0x72, 0x24, 0xff, 0x58, 0x41, 0xe6,
                0x33, 0x5d, 0xf7, 0xe7, 0x56, 0xf7, 0xaf, 0x32, 0xfa, 0xd8, 0x72, 0x78, 0xac, 0x63, 0xda, 0xd1
            };

            var expected = new byte[] {
                0x18, 0xac, 0xca, 0x56, 0x86, 0x20, 0xb3, 0x75, 0xf9, 0x90, 0x24, 0x72, 0x4a, 0x50, 0xa5, 0xff,
                0x39, 0xee, 0x34, 0x70, 0x8f, 0xdc, 0xfa, 0xfb, 0xbb, 0x59, 0xbe, 0xd5, 0xca, 0x78, 0x6f, 0x95,
                0xca, 0xd8, 0x3a, 0x8c, 0x9d, 0x2b, 0xd1, 0x5e, 0x73, 0xea, 0xb4, 0x73, 0xc5, 0x4d, 0xfb, 0x07,
                0x34, 0xb8, 0x08, 0x2c, 0xdd, 0xec, 0x9f, 0x5f, 0xe2, 0x48, 0xd1, 0x38, 0x93, 0x12, 0xfd, 0x6f
            };

            var actual = subject.Initialize(Encoding.UTF8.GetBytes("#S3cr3t+Ke4$"));

            Assert.Equal(expected, actual);
        }
        public void Initialize_BuildTheCorrectHashForPAndSWithSecret()
        {
            var subject = new Argon2iCore(128);

            subject.DegreeOfParallelism = 4;
            subject.Iterations          = 5;
            subject.MemorySize          = 128;
            subject.Secret = Encoding.UTF8.GetBytes("In1ti@lS3cr3T 1234");
            subject.Salt   = new byte[] {
                0xf7, 0x19, 0x2b, 0xa7, 0xff, 0xb8, 0xca, 0xdc, 0x67, 0x51, 0xed, 0xa0, 0x08, 0x1d, 0x9d, 0x95,
                0x0b, 0x10, 0xe4, 0x32, 0x23, 0xef, 0x30, 0x07, 0x39, 0xc6, 0xbc, 0xad, 0x36, 0xda, 0x08, 0xeb,
                0x03, 0x3b, 0xab, 0x98, 0x32, 0x06, 0x7d, 0x39, 0x6f, 0x81, 0x72, 0x24, 0xff, 0x58, 0x41, 0xe6,
                0x33, 0x5d, 0xf7, 0xe7, 0x56, 0xf7, 0xaf, 0x32, 0xfa, 0xd8, 0x72, 0x78, 0xac, 0x63, 0xda, 0xd1
            };

            var expected = new byte[] {
                0xb7, 0x33, 0x03, 0xff, 0x3f, 0xe7, 0x16, 0x46, 0x03, 0x15, 0x8e, 0xf5, 0x17, 0xe4, 0x79, 0xd2,
                0x7f, 0xf6, 0x73, 0xbf, 0x01, 0x5f, 0xfa, 0xe6, 0x72, 0x13, 0x33, 0xb4, 0xff, 0x4f, 0xa3, 0x60,
                0x4b, 0x53, 0x7c, 0xa5, 0xe0, 0x2b, 0xe4, 0x06, 0xce, 0x9e, 0x9e, 0xa3, 0x27, 0x9c, 0x6e, 0x26,
                0x39, 0x11, 0xa3, 0x36, 0xa8, 0x4d, 0xdd, 0xaf, 0x33, 0x9d, 0xe2, 0xd1, 0x77, 0x99, 0x08, 0x30
            };

            var actual = subject.Initialize(Encoding.UTF8.GetBytes("P@ssw0rd!$"));

            Assert.Equal(expected, actual);
        }
        public async void Hash_HashesAnArgon2iThingWithSalt()
        {
            var subject = new Argon2iCore(128);

            subject.DegreeOfParallelism = 2;
            subject.Iterations          = 5;
            subject.MemorySize          = 16;
            subject.Salt = new byte[] {
                0xf7, 0x19, 0x2b, 0xa7, 0xff, 0xb8, 0xca, 0xdc, 0x67, 0x51, 0xed, 0xa0, 0x08, 0x1d, 0x9d, 0x95,
                0x0b, 0x10, 0xe4, 0x32, 0x23, 0xef, 0x30, 0x07, 0x39, 0xc6, 0xbc, 0xad, 0x36, 0xda, 0x08, 0xeb,
                0x03, 0x3b, 0xab, 0x98, 0x32, 0x06, 0x7d, 0x39, 0x6f, 0x81, 0x72, 0x24, 0xff, 0x58, 0x41, 0xe6,
                0x33, 0x5d, 0xf7, 0xe7, 0x56, 0xf7, 0xaf, 0x32, 0xfa, 0xd8, 0x72, 0x78, 0xac, 0x63, 0xda, 0xd1
            };

            var expected = new byte[] {
                0x59, 0xc2, 0x50, 0x75, 0x1a, 0x9d, 0xe4, 0x5f, 0x71, 0x0d, 0xc3, 0x1f, 0xe5, 0xfe, 0xc0, 0x51,
                0xfc, 0x73, 0x94, 0x8a, 0x27, 0xda, 0x14, 0x26, 0xed, 0x9f, 0xe4, 0x68, 0x9c, 0xe3, 0x30, 0x92,
                0x2f, 0x6b, 0xbf, 0x62, 0x45, 0x31, 0xa1, 0x86, 0xf1, 0xe7, 0xd5, 0x83, 0xb7, 0x5a, 0x12, 0x57,
                0x01, 0xf0, 0x2a, 0x5e, 0xca, 0x1e, 0x39, 0x14, 0xba, 0xc2, 0x85, 0x31, 0xb0, 0x0b, 0xc1, 0xa0,
                0x3a, 0xef, 0x1c, 0xc5, 0xd6, 0x05, 0xe8, 0x3c, 0x7a, 0xd8, 0x1e, 0xff, 0xab, 0x36, 0xc0, 0x82,
                0x66, 0xe3, 0x96, 0xe4, 0xdf, 0x87, 0x0a, 0x0e, 0x80, 0xbf, 0x1b, 0xc4, 0x90, 0x9e, 0x75, 0x25,
                0xa5, 0x67, 0xba, 0xd8, 0x50, 0x4d, 0xa9, 0x38, 0x4c, 0xa1, 0x65, 0x4b, 0x7c, 0x18, 0x8a, 0xcc,
                0x65, 0x4b, 0xca, 0x04, 0x0f, 0x6e, 0xe5, 0xf7, 0xa2, 0x70, 0x2a, 0x84, 0x4b, 0x3e, 0x2f, 0xcd
            };

            var actual = await subject.Hash(Encoding.UTF8.GetBytes("P@ssw0rd!$")).ConfigureAwait(false);

            Assert.Equal(expected, actual);
        }
        public void Initialize_BuildTheCorrectHashForJustPAndS()
        {
            var subject = new Argon2iCore(128);

            subject.DegreeOfParallelism = 4;
            subject.Iterations          = 5;
            subject.MemorySize          = 128;
            subject.Salt = new byte[] {
                0xf7, 0x19, 0x2b, 0xa7, 0xff, 0xb8, 0xca, 0xdc, 0x67, 0x51, 0xed, 0xa0, 0x08, 0x1d, 0x9d, 0x95,
                0x0b, 0x10, 0xe4, 0x32, 0x23, 0xef, 0x30, 0x07, 0x39, 0xc6, 0xbc, 0xad, 0x36, 0xda, 0x08, 0xeb,
                0x03, 0x3b, 0xab, 0x98, 0x32, 0x06, 0x7d, 0x39, 0x6f, 0x81, 0x72, 0x24, 0xff, 0x58, 0x41, 0xe6,
                0x33, 0x5d, 0xf7, 0xe7, 0x56, 0xf7, 0xaf, 0x32, 0xfa, 0xd8, 0x72, 0x78, 0xac, 0x63, 0xda, 0xd1
            };

            var expected = new byte[] {
                0x12, 0xcb, 0x36, 0xfa, 0x63, 0x8e, 0xcf, 0xee, 0xb8, 0x55, 0x0e, 0xbb, 0x73, 0xfb, 0x01, 0x81,
                0x95, 0xfb, 0x6f, 0x64, 0xd9, 0xb8, 0x84, 0x27, 0x67, 0xd1, 0xb3, 0xe1, 0xc8, 0xbb, 0x16, 0x24,
                0xa8, 0x5e, 0x27, 0xa5, 0x63, 0x13, 0x51, 0x0f, 0x25, 0x4b, 0x82, 0xc9, 0x9a, 0x00, 0xdb, 0xe1,
                0x7a, 0xe0, 0xfc, 0x7f, 0x6e, 0x7a, 0x41, 0x14, 0x17, 0x9a, 0xb8, 0xe2, 0x79, 0x5c, 0x85, 0x55
            };

            var actual = subject.Initialize(Encoding.UTF8.GetBytes("P@ssw0rd!$"));

            Assert.Equal(expected, actual);
        }
        public async void InitializeLanes_BuildsInitialLanesCorrectly()
        {
            var subject = new Argon2iCore(128);

            subject.DegreeOfParallelism = 2;
            subject.Iterations          = 5;
            subject.MemorySize          = 16;
            subject.Salt = new byte[] {
                0x69, 0xf8, 0xf7, 0x5e, 0x68, 0x9d, 0x10, 0xe8, 0x75, 0xf2, 0x94, 0x2f, 0xa5, 0xb0, 0x6e, 0x36,
                0x9b, 0x89, 0x24, 0x43, 0x6e, 0xad, 0x8c, 0x81, 0xc5, 0x3a, 0x84, 0xfe, 0x05, 0xc6, 0x1e, 0x90,
                0x63, 0x62, 0x58, 0xcd, 0x11, 0xae, 0x3f, 0x68, 0xd0, 0x9e, 0xd2, 0x52, 0x0c, 0xc3, 0xe5, 0xc3,
                0xb3, 0x88, 0x52, 0x97, 0x56, 0x7d, 0xcd, 0xd9, 0x0e, 0x67, 0x7d, 0x09, 0x08, 0x0c, 0x2b, 0x9a
            };

            var expected00 = new ulong[] {
                0x3127bfce73a8a49eUL, 0x8bf2093ec0fbfd28UL, 0x6e2ddbd012c3a096UL, 0x5fafb594148598e3UL,
                0x3dfb96e1781a7cf8UL, 0x34621adcefc2dbe8UL, 0x536d87ad2f720554UL, 0x01c0598be369df21UL,
                0x6f253038b6c8a9fcUL, 0x0d97673913c22c43UL, 0x5319ca244e7cfe7aUL, 0x372d3b32bcf26addUL,
                0x808fff65f30da51cUL, 0xf073157457548aacUL, 0xe835687ca32841c3UL, 0x019b5399bf5fc2a3UL,
                0x1eee11941369cdcbUL, 0x110c6a3b6febf9f8UL, 0xd862629e96fb4aaeUL, 0xe074c69bac3d0626UL,
                0x8c651c06368f64daUL, 0xa7ab521b32874a6bUL, 0xe5e9d2990cd8a260UL, 0xb5554374c8604559UL,
                0x0533d04f5519815cUL, 0x9fc667b4f970df73UL, 0x16b518e93b487893UL, 0x70bbb2e89d60456cUL,
                0x682e159206bf2625UL, 0x721a95082ab1726cUL, 0xb128cd7d096b07d9UL, 0x83eebb0eadef156fUL,
                0x620f410459bb585bUL, 0x83b989248dd35244UL, 0xfe684b77e63583ccUL, 0x486009c0c1d932a3UL,
                0x740b7daf2455f62fUL, 0xf34558a4f2e319dfUL, 0x678579bcd61c0e35UL, 0x37ef3a1c5a696967UL,
                0x5ae6eae58262a759UL, 0x5bd4e3035fb25fa6UL, 0xb59cf8db51cc1160UL, 0xa22e44bc7d74712cUL,
                0x419ff488a9b76124UL, 0xc9374af699de145bUL, 0x2ef3398697f2951cUL, 0x3e21fa5ccfe9d976UL,
                0xd669b7e4254be2c5UL, 0x49eb4ad0242d0b48UL, 0x4d9da909b6c17010UL, 0x4da74c64475b6076UL,
                0x91418a11dba98ec0UL, 0x7839c2034c11738fUL, 0xce094fa88651abc7UL, 0xc2bfa72bc3ed4106UL,
                0x70bc0e0182c12657UL, 0x99ed30b3d28144edUL, 0xc3841311ca44c887UL, 0xd618c52b4d152a23UL,
                0x27f6a8e3b7fcd9deUL, 0x0db0fec6c0fbee23UL, 0x1d5f7a446d8a3a01UL, 0x7317ac34ab2272caUL,
                0x5382c607fa4a31e2UL, 0x20f5acbdd8471f20UL, 0xce2abc9c8ef060ecUL, 0xa084e26c3fd09721UL,
                0x0729cb77ea17d73fUL, 0xcdf67832b7869cd2UL, 0xe627f0f3ff161c9dUL, 0x9d62be6099439727UL,
                0x567d2e47ec7879a3UL, 0x739d4d043e8ea74dUL, 0xa166e7f41fc71196UL, 0x9df8862e2a6c7cc9UL,
                0x4b24832ebdeeab8aUL, 0x0da19d0f6e7d9101UL, 0xed156ed715447ec5UL, 0x705937e7d1a82fb0UL,
                0xbc0d5da2ceb4534eUL, 0x7f0fdd6ef1918b35UL, 0xd50b0d3250b33e52UL, 0xecc0378743f69182UL,
                0x5fdaa5fc5c286142UL, 0xe743a8a515c8f007UL, 0x1850b288ba12cdfaUL, 0x421059d8f29dc871UL,
                0xc8e77a502c579e4eUL, 0xe17e813763e011a8UL, 0x915716dab8b8a1ceUL, 0xdf136d321a9050d4UL,
                0x19b8f5d7a9e1b3c8UL, 0x50ca78026b5545ebUL, 0xe1ff70c89c43d4feUL, 0xe3a42a6e522b822eUL,
                0x58d40ffce6667b98UL, 0x33a7a1bc326aea10UL, 0xbc7b0100222ca1a9UL, 0xfe127449c94a001cUL,
                0xca2b369322a6c661UL, 0x2f33453bc62ad471UL, 0x2e2d2e0695b4627fUL, 0x46e4144c6b298126UL,
                0xe550c799900e5ecfUL, 0x432215ef7bd56d5fUL, 0x9276b83c49e28d98UL, 0x12f3bf8112853699UL,
                0x07797c71f568ca1dUL, 0x58d7d2e4e141a40fUL, 0xc62e0ffb2efb90ccUL, 0x31c6f62dc7795c64UL,
                0x9d7106c4a1efe709UL, 0xb0e1c169e638def6UL, 0x3ff4f4416bbec88dUL, 0xf2a7cc5e158c8bd9UL,
                0x460beec0f388db3fUL, 0x102b3ee7f709e102UL, 0xe9f24dcb49beebaeUL, 0xd9267f914e205fc9UL,
                0xbafd5f9429b9c6d8UL, 0x7a479f3d848193c8UL, 0x5b59288f408c0f95UL, 0xa43fd470a4324b24UL,
                0x26ed98390047473dUL, 0xf5864cd386a3df6dUL, 0x948c57d223d6b63eUL, 0x352bd5900a0c78dcUL
            };

            var expected01 = new ulong[] {
                0x6ecb0e82c305a8b1UL, 0xd5e15e619ba7e908UL, 0x3949135e482d28b2UL, 0x0f2d53536b0629c8UL,
                0x9423174fa5da006aUL, 0xcdef4ec1f741b2f1UL, 0x11a500b5a6ba5ad6UL, 0xfc3c73f2182a3207UL,
                0x0d419066868d04e2UL, 0xf41df430ca1deb4cUL, 0xc0fac627fccac8e4UL, 0x0a993ba4ba02a02aUL,
                0xea6e6d507437d83eUL, 0x838ce720da09dca0UL, 0xf677a31e45f40e54UL, 0xd91c251f03fd1105UL,
                0xf3a3622074a74c92UL, 0x144a2eb6be533f7eUL, 0x9301f4ff7e79257cUL, 0x403ac4e52d43a088UL,
                0x9396db10f7720e84UL, 0x064136e50719e913UL, 0x9191a3316f114275UL, 0xd00a7041da54bae4UL,
                0x97eafb749c47519eUL, 0x49768687e276b647UL, 0xc185cd914f360c49UL, 0xaaaf3fcd95d1a1aaUL,
                0x1c6c00a3863af67fUL, 0xcb22d9ce096f2f21UL, 0x82aff4b1aa5edeacUL, 0xb27c058e0dbf7836UL,
                0x4a1462a63808c840UL, 0x11ae09fd0f6c1d7dUL, 0x0829afffb9193ee7UL, 0x963deb4d9517b139UL,
                0x01b11722d6c3cd8dUL, 0x7e489873dbef1da0UL, 0xf86c9ab02dff9d27UL, 0xd1c97ed9b54ff878UL,
                0x062994f814364255UL, 0x71c1fcc33f73df0eUL, 0xad7158fe1d9a0f26UL, 0x5b91a7e9b619248eUL,
                0xf9a21e5b8351c85eUL, 0xef7947068318c098UL, 0xd38ce63b06b6444cUL, 0x803f186462142580UL,
                0x2155286d1d5a7e52UL, 0xbbb187ec23d4b084UL, 0x3ed8172fb113ff50UL, 0xa93c8feb842f5cacUL,
                0xf268ee76c1c47032UL, 0x9dd60023a7f787b2UL, 0x023a6130fdb79d7eUL, 0xf3b4e3ff56cd10d4UL,
                0x5125a9c1e864063cUL, 0x440904150dc5d202UL, 0xcaf7297bb99e2245UL, 0x470437bfef84d66cUL,
                0x69e6721bb2251e8aUL, 0x26a7fc3100835cf9UL, 0x9c1b901a2bc1b19eUL, 0xf3b9ccf4b55e1a15UL,
                0xd53ca80df854908cUL, 0xe19913464caed8c1UL, 0x45eebb56d4767743UL, 0x89e05fb09b9b595aUL,
                0xe7ac307534734e13UL, 0xb902f5dbbd0198f9UL, 0xf48a8a8209196226UL, 0xb52813700e5f1478UL,
                0x6e99bfe86d98fb7bUL, 0xb3ef90b39b03e1e8UL, 0x1a4b5da515554573UL, 0x149b9b52d158b9e4UL,
                0xe8200623809c9cadUL, 0xff5817fc6d6087b7UL, 0x45a92883c1d0aae8UL, 0xcdcbafef103d241cUL,
                0x3035af3dc9f144f5UL, 0x84a6b50f01926074UL, 0x218e6c77f06a8afdUL, 0x62065de09c07ea85UL,
                0xa3b15c4a54a051f9UL, 0x71e03c12514102feUL, 0xb0b64366f9cfa367UL, 0x93c7e3ce298533b7UL,
                0xa867eeec462e15d2UL, 0x91bf55b5006ae340UL, 0x9c0b386daaad9d4aUL, 0x220efd735f58b41cUL,
                0xfe00a7de37c7d5e4UL, 0x0d485cb52f73adf1UL, 0x018e5414e448f06cUL, 0xa2ddcad262041b64UL,
                0x8f97379373521a27UL, 0xd837bf5ad5c0c25dUL, 0xc219c62d50660416UL, 0xfd1a59deac35edbdUL,
                0x51f9f0663c9a9f0dUL, 0x6878bc402ef55cf1UL, 0x86d7acc833beb55eUL, 0xdaba7e48d54e7f0eUL,
                0x689006186f9603b4UL, 0xf39f59ee5f11b637UL, 0x3225cce538f311efUL, 0xc7890b2221558d5fUL,
                0xe1aa16084fb7d68eUL, 0xd948d9d9d178b24fUL, 0xa3743146fe9aa8a5UL, 0x612eb05f997d94eeUL,
                0x4292f28db8996e96UL, 0x9948828e81f87bf8UL, 0x502e5e0f0b45d668UL, 0xb453f860bd5b4462UL,
                0x6ab5a117f1a8fcceUL, 0x9acc5b7fc54179c2UL, 0x5b21e508c5d9393bUL, 0x5656d57d0ed1b2d7UL,
                0xdfe138ee684ead02UL, 0x9c837d027f385239UL, 0xd74f0589cbeb0b98UL, 0x595093e3daa4e698UL,
                0x82511c12d74ca499UL, 0xb9738260cd43826bUL, 0x08eada4f93816301UL, 0x450c9e92591775fcUL
            };

            var expected10 = new ulong[] {
                0x4064ab7401a367caUL, 0xd6efc13fdbe1a6dbUL, 0x791a942f8e183ed2UL, 0x1201685e055ae4f9UL,
                0x9bce6806914174a3UL, 0xa2525312462cc956UL, 0x168ad5e6356239b7UL, 0x8fd19d11c1a20997UL,
                0x3a29d386c25b7b41UL, 0xfdfd4e820b93d84aUL, 0x9ffb414431f180deUL, 0x2ab43fea0e59dc3bUL,
                0xd9f939886e95aa3cUL, 0x2ce29da0009c5f38UL, 0x7a17603155147f45UL, 0xd6409e4d993f354cUL,
                0xf7c292775ff7b6f1UL, 0xcba283e99c3ed928UL, 0x482ef73f88eef9dbUL, 0x47a430ec00fcabc8UL,
                0x75dbcd077a20060aUL, 0x0fc5200fed7b7bc7UL, 0x46102c34bee65c8aUL, 0xf6a08bcb5ad74d68UL,
                0xd712bdf08d4f2478UL, 0xc7892ec5681a0ab0UL, 0x1a0a0630f4cc9fb9UL, 0x48815436bef7c4b6UL,
                0xa1cf9d4dd990a76fUL, 0xa56c2f8e839c2746UL, 0xd84ddf240c3f2b13UL, 0x7d9f21fe54adbdd2UL,
                0x031aff3c6f358f1bUL, 0xd3905d6c86296eccUL, 0xf40b0c27fc91b9eaUL, 0x5a24b5e2d2901ba0UL,
                0x7683449d4bc847bbUL, 0xc54dd281a3331482UL, 0x8f6f8b5eb73ac077UL, 0xb99ec55de9c532a0UL,
                0xaedee0c7e55059e2UL, 0x2f9377a41ed485c5UL, 0x72eafb538ce583e8UL, 0xb5eb93c6165b8646UL,
                0x3ff0af70673c327fUL, 0x6d502fc8fa40ca57UL, 0x95704e86a52e87ebUL, 0x712710607c339b1bUL,
                0x4566ccfacebc3617UL, 0xce14cd117bd7f7dcUL, 0xd5b93e54d1aa8edbUL, 0xfb553e8168ebdca5UL,
                0x0b0df7a642918c4aUL, 0xf50b1c338bf67d97UL, 0x8e7ce5186eaab38fUL, 0x5dcc06af0cf93ec3UL,
                0x1b855433540288aeUL, 0xdfd1af20dfa87f78UL, 0x1464f39c3785d0bfUL, 0xa2e03e5fe551d9e6UL,
                0xc99e8ff5a184f47dUL, 0xc3d8d3499413d699UL, 0x3dc5450867069861UL, 0x94a6226df3f12313UL,
                0x3a69a11f65bafb67UL, 0x9a94a4b9d83052f5UL, 0xf20772e21f991c71UL, 0xadeb3fe1a1ccdea2UL,
                0x6ad761dc5abe2a3aUL, 0xb880c1f9941726cdUL, 0xcd18ae74c66653eaUL, 0xfd9649c87ac6a3e3UL,
                0x1d714aac1332fc78UL, 0xe0ee41d8707e48a0UL, 0x641e9effe4ea00a5UL, 0x17b5cfb868dc453aUL,
                0x8d1e8f293280a696UL, 0xaee633ab32395cb8UL, 0xdfa3de545ff4528fUL, 0xfab54c8b5670c2fdUL,
                0xf461d9ff88f74c93UL, 0x3b208c41f684c266UL, 0x578efa62fc110f78UL, 0xe64b0339d174d8fbUL,
                0x8cb8a33be3020ffaUL, 0x6f66ca2d33ef34bbUL, 0x6194d0f714651ed1UL, 0x95e12f904fe7dda0UL,
                0x91ef1fba242c29bcUL, 0x18176705d7283327UL, 0x7098d6ad81900c2eUL, 0x0580d1a8599fb21aUL,
                0x84015d1bced4928aUL, 0xe46b6e4139e0977aUL, 0x257f0a22ec11bc1dUL, 0xf5e77f203820003cUL,
                0xb44e275b35122504UL, 0xce539392f7cb6811UL, 0xc17004461d88d904UL, 0xaf297010d0164476UL,
                0x2a5aac33a5f94629UL, 0xec6e36a8c1ca866dUL, 0xf52df2b470d42a86UL, 0xf051a672800eef43UL,
                0x7723121ac94338e5UL, 0x3af80606c98faf7fUL, 0x8188bd55cd1c720bUL, 0x2170721a4d22531fUL,
                0xb3c84442774bd366UL, 0xf6da1fd02d87d577UL, 0x2f691c91dc7bb727UL, 0xfe2d97b8992db9dcUL,
                0x21728d8b2174002bUL, 0xf8eecef0ce2b3edaUL, 0xb0a1ba60d4946faaUL, 0x52cdcf8cc003eb62UL,
                0xc7ef8697e7c26ab3UL, 0x6c20031b94e16920UL, 0xfa828735ed3cb8faUL, 0x296aefde709e6f60UL,
                0xac2a9cf3d2e660cbUL, 0x078f7026fcc3facaUL, 0x220e8822b80b65e0UL, 0xac648f3472b75d22UL,
                0xa12c577eb7633db3UL, 0x05d93c9c97fdee11UL, 0xd1e71104fd4ae8e0UL, 0x0d3a54142ccbec2eUL
            };

            var expected11 = new ulong[] {
                0x0d5455fb29afdb26UL, 0x665b4aafc468cce3UL, 0x2497c4907ba41570UL, 0x67883c5259bd80ebUL,
                0x18c2b8eac7e0aafcUL, 0x1c6aee5c0a117fb9UL, 0x6adbbb9258fe3f3cUL, 0x7f42d49115f2d634UL,
                0x873ecd17b6a0f313UL, 0xca035bf63dae9f91UL, 0xe86cd53af10ace54UL, 0x1e7230e3fb5d3e2fUL,
                0x2077d1cdaedff2faUL, 0x102a0c29393308d0UL, 0xadae96c5c319f8cdUL, 0x3efbbd2ceaa694d3UL,
                0xf90e7e77ee374716UL, 0x1a1389e16ee4f939UL, 0x413ddbcc102483ccUL, 0x5c73d57e9e7004feUL,
                0xcecb86a979e1397fUL, 0xb908ae9f6ffdf374UL, 0xc13b87d96b5f719dUL, 0x86f08b6503879e95UL,
                0x2fbdcb1cd4478120UL, 0x309fedcb1ad4dac7UL, 0xff247a8590cd7d06UL, 0xfb473c30a2e8c7cdUL,
                0xf1d4f539d390d328UL, 0xbe4dfb38213213d0UL, 0x982a24ff77b3c0d2UL, 0xfecafa7b23f48875UL,
                0xe8f19aa11703b398UL, 0x9e722bd401a61813UL, 0x41946bfeab21d25bUL, 0x49b3d1d4c01db24fUL,
                0x4486ca528c7cbc82UL, 0xa55781c5f787ca3aUL, 0x4efa0d3e9383637dUL, 0x2c4ecd72302d444aUL,
                0xb8b92f75e4c83363UL, 0x37d55d033d712e49UL, 0x7229bc73b695ebbeUL, 0x4be0daf4f5b04a4fUL,
                0xac8718efefcfebbdUL, 0x09536b7ad0c6d87eUL, 0x2d5c064b115d73cbUL, 0xeda4f1ca9446361aUL,
                0xf69f4afb12a4b8e1UL, 0x0ae04cbbf18a594bUL, 0xfeb4a9c7938d55eaUL, 0x62864daf547d0089UL,
                0x964f33f96aea10e8UL, 0x041261ada2203a4dUL, 0xaa1d648492c362b5UL, 0xd9e909a61dff9859UL,
                0x4003017994045585UL, 0x729cfbb22af630c7UL, 0xd165175002bc805eUL, 0x035e7ebbb2131851UL,
                0xa86aecfc9a9b2adaUL, 0xa5becf9df02bd95cUL, 0x98d7d4e6d42bcf2cUL, 0xc2d4732f12f69191UL,
                0x2a5b2c75ac464a87UL, 0xca6b0d4e8c1a1e36UL, 0x5f47747f88d012aeUL, 0xe5cb06e47ec52a18UL,
                0xc10484d36ffb9009UL, 0xbb867ad3547cd9f6UL, 0x5e31b5d31def1ca1UL, 0x9e6ccd313604b382UL,
                0x96d7b7a48a608728UL, 0x5b56c0a31cf8c59aUL, 0xf00df56d57682e80UL, 0xda0d7259c356ae4aUL,
                0xed479fe50bbe5412UL, 0xa5c77f5549e9e6fcUL, 0x1164e76c428eb388UL, 0x178237111cbb14bdUL,
                0x0a58c78ae91af8b6UL, 0x2d50a9920193838aUL, 0xc1556b371364fca7UL, 0x5da67f7a6bb836d0UL,
                0xe41c25ffe2a32e58UL, 0xd6948ef3d8b5d544UL, 0x90ca547c7ad047c4UL, 0x2d2c1ba47159d370UL,
                0xe7f44b48651760ebUL, 0xddaed69e7d4a1fa8UL, 0x1bcd924d1bc68f05UL, 0x74d50c178408ab0bUL,
                0xc4df4db85b5d7285UL, 0x14926f0fecc3bf36UL, 0x2c796b006e41e92dUL, 0xaecdc2d1ce26491dUL,
                0x2606173c65f273deUL, 0x3b65d6d4e6847d28UL, 0x907720f7772ed470UL, 0x256fa14a354c1304UL,
                0x0be4aad94c7dffceUL, 0xa042440bb9f7557eUL, 0xc0cd069c4cef85d4UL, 0xc07c8601b20d5647UL,
                0x2e6c906d4880dd27UL, 0x736b8c75e5765acfUL, 0xc9468e4cd9cfc7a5UL, 0xc9881c5ac58c8193UL,
                0x9ce1d1a8573663bfUL, 0x5d97131ce7db872eUL, 0x858abc0cff42cbe6UL, 0x8966c871421606d7UL,
                0x5b45a2d33827f1e9UL, 0xb3058993bdaf35bfUL, 0x14115152887d0319UL, 0x2a504362a04c472bUL,
                0x70f4c117d593cc79UL, 0xb19768bfef91cff6UL, 0x8a310a753d2e6877UL, 0x001c29be4afea7aeUL,
                0x231054402f69f427UL, 0xe01258eebe5f8ed8UL, 0x571c28935e68ebe4UL, 0x60f3148b1d546b2dUL,
                0x1d87c04eb73098c2UL, 0xea0d944662c15303UL, 0x24f79172017ffaa1UL, 0x4d855aad955058daUL
            };

            var actual = await subject.InitializeLanes(Encoding.UTF8.GetBytes("P@ssw0rd!$")).ConfigureAwait(false);

            Assert.Equal(expected00, actual[0][0]);
            Assert.Equal(expected01, actual[0][1]);
            Assert.Equal(expected10, actual[1][0]);
            Assert.Equal(expected11, actual[1][1]);
        }