100.00% Lines (101/101) 100.00% Functions (6/6)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com) 2   // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
3   // 3   //
4   // Distributed under the Boost Software License, Version 1.0. (See accompanying 4   // Distributed under the Boost Software License, Version 1.0. (See accompanying
5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6   // 6   //
7   // Official repository: https://github.com/cppalliance/http 7   // Official repository: https://github.com/cppalliance/http
8   // 8   //
9   // Based on the OpenBSD implementation by Niels Provos. 9   // Based on the OpenBSD implementation by Niels Provos.
10   // 10   //
11   11  
12   #include "blowfish.hpp" 12   #include "blowfish.hpp"
13   #include <cstring> 13   #include <cstring>
14   #include <utility> 14   #include <utility>
15   15  
16   namespace boost { 16   namespace boost {
17   namespace http { 17   namespace http {
18   namespace bcrypt { 18   namespace bcrypt {
19   namespace detail { 19   namespace detail {
20   20  
21   namespace { 21   namespace {
22   22  
23   // Initial P-array (first 18 32-bit values of the fractional part of pi) 23   // Initial P-array (first 18 32-bit values of the fractional part of pi)
24   constexpr std::uint32_t P_init[18] = { 24   constexpr std::uint32_t P_init[18] = {
25   0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 25   0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
26   0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 26   0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
27   0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 27   0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
28   0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 28   0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
29   0x9216d5d9, 0x8979fb1b 29   0x9216d5d9, 0x8979fb1b
30   }; 30   };
31   31  
32   // Initial S-boxes (more fractional bits of pi) 32   // Initial S-boxes (more fractional bits of pi)
33   constexpr std::uint32_t S_init[4][256] = { 33   constexpr std::uint32_t S_init[4][256] = {
34   { 34   {
35   0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 35   0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
36   0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 36   0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
37   0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 37   0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
38   0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 38   0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
39   0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 39   0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
40   0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 40   0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
41   0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 41   0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
42   0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 42   0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
43   0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 43   0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
44   0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 44   0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
45   0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 45   0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
46   0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 46   0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
47   0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 47   0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
48   0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 48   0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
49   0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 49   0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
50   0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 50   0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
51   0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 51   0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
52   0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 52   0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
53   0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 53   0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
54   0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 54   0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
55   0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 55   0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
56   0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 56   0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
57   0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 57   0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
58   0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 58   0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
59   0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 59   0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
60   0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 60   0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
61   0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 61   0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
62   0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 62   0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
63   0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 63   0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
64   0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 64   0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
65   0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 65   0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
66   0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 66   0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
67   0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 67   0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
68   0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 68   0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
69   0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 69   0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
70   0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 70   0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
71   0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 71   0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
72   0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 72   0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
73   0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 73   0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
74   0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 74   0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
75   0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 75   0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
76   0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 76   0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
77   0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 77   0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
78   0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 78   0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
79   0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 79   0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
80   0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 80   0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
81   0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 81   0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
82   0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 82   0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
83   0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 83   0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
84   0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 84   0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
85   0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 85   0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
86   0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 86   0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
87   0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 87   0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
88   0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 88   0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
89   0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 89   0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
90   0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 90   0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
91   0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 91   0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
92   0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 92   0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
93   0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 93   0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
94   0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 94   0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
95   0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 95   0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
96   0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 96   0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
97   0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 97   0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
98   0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a 98   0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
99   }, 99   },
100   { 100   {
101   0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 101   0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
102   0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 102   0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
103   0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 103   0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
104   0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 104   0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
105   0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 105   0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
106   0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 106   0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
107   0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 107   0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
108   0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 108   0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
109   0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 109   0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
110   0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 110   0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
111   0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 111   0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
112   0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 112   0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
113   0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 113   0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
114   0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 114   0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
115   0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 115   0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
116   0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 116   0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
117   0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 117   0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
118   0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 118   0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
119   0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 119   0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
120   0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 120   0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
121   0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 121   0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
122   0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 122   0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
123   0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 123   0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
124   0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 124   0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
125   0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 125   0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
126   0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 126   0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
127   0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 127   0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
128   0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 128   0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
129   0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 129   0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
130   0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 130   0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
131   0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 131   0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
132   0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 132   0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
133   0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 133   0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
134   0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 134   0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
135   0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 135   0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
136   0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 136   0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
137   0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 137   0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
138   0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 138   0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
139   0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 139   0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
140   0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 140   0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
141   0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 141   0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
142   0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 142   0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
143   0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 143   0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
144   0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 144   0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
145   0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 145   0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
146   0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 146   0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
147   0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 147   0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
148   0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 148   0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
149   0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 149   0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
150   0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 150   0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
151   0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 151   0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
152   0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 152   0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
153   0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 153   0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
154   0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 154   0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
155   0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 155   0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
156   0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 156   0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
157   0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 157   0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
158   0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 158   0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
159   0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 159   0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
160   0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 160   0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
161   0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 161   0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
162   0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 162   0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
163   0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 163   0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
164   0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 164   0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
165   }, 165   },
166   { 166   {
167   0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 167   0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
168   0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 168   0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
169   0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 169   0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
170   0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 170   0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
171   0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 171   0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
172   0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 172   0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
173   0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 173   0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
174   0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 174   0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
175   0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 175   0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
176   0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 176   0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
177   0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 177   0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
178   0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 178   0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
179   0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 179   0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
180   0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 180   0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
181   0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 181   0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
182   0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 182   0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
183   0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 183   0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
184   0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 184   0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
185   0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 185   0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
186   0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 186   0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
187   0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 187   0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
188   0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 188   0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
189   0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 189   0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
190   0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 190   0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
191   0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 191   0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
192   0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 192   0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
193   0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 193   0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
194   0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 194   0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
195   0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 195   0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
196   0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 196   0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
197   0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 197   0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
198   0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 198   0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
199   0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 199   0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
200   0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 200   0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
201   0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 201   0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
202   0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 202   0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
203   0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 203   0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
204   0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 204   0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
205   0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 205   0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
206   0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 206   0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
207   0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 207   0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
208   0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 208   0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
209   0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 209   0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
210   0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 210   0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
211   0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 211   0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
212   0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 212   0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
213   0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 213   0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
214   0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 214   0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
215   0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 215   0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
216   0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 216   0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
217   0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 217   0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
218   0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 218   0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
219   0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 219   0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
220   0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 220   0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
221   0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 221   0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
222   0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 222   0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
223   0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 223   0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
224   0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 224   0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
225   0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 225   0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
226   0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 226   0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
227   0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 227   0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
228   0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 228   0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
229   0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 229   0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
230   0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 230   0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
231   }, 231   },
232   { 232   {
233   0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 233   0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
234   0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 234   0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
235   0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 235   0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
236   0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 236   0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
237   0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 237   0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
238   0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 238   0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
239   0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 239   0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
240   0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 240   0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
241   0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 241   0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
242   0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 242   0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
243   0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 243   0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
244   0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 244   0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
245   0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 245   0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
246   0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 246   0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
247   0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 247   0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
248   0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 248   0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
249   0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 249   0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
250   0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 250   0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
251   0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 251   0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
252   0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 252   0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
253   0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 253   0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
254   0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 254   0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
255   0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 255   0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
256   0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 256   0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
257   0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 257   0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
258   0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 258   0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
259   0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 259   0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
260   0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 260   0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
261   0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 261   0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
262   0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 262   0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
263   0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 263   0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
264   0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 264   0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
265   0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 265   0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
266   0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 266   0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
267   0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 267   0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
268   0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 268   0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
269   0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 269   0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
270   0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 270   0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
271   0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 271   0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
272   0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 272   0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
273   0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 273   0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
274   0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 274   0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
275   0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 275   0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
276   0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 276   0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
277   0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 277   0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
278   0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 278   0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
279   0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 279   0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
280   0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 280   0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
281   0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 281   0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
282   0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 282   0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
283   0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 283   0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
284   0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 284   0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
285   0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 285   0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
286   0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 286   0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
287   0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 287   0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
288   0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 288   0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
289   0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 289   0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
290   0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 290   0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
291   0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 291   0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
292   0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 292   0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
293   0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 293   0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
294   0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 294   0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
295   0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 295   0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
296   0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 296   0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
297   } 297   }
298   }; 298   };
299   299  
300   } // namespace 300   } // namespace
301   301  
HITCBC 302   28 void blowfish_init(blowfish_ctx& ctx) 302   28 void blowfish_init(blowfish_ctx& ctx)
303   { 303   {
HITCBC 304   28 std::memcpy(ctx.P, P_init, sizeof(P_init)); 304   28 std::memcpy(ctx.P, P_init, sizeof(P_init));
HITCBC 305   28 std::memcpy(ctx.S, S_init, sizeof(S_init)); 305   28 std::memcpy(ctx.S, S_init, sizeof(S_init));
HITCBC 306   28 } 306   28 }
307   307  
HITCBC 308   9122240 inline std::uint32_t F(blowfish_ctx const& ctx, std::uint32_t x) 308   9122240 inline std::uint32_t F(blowfish_ctx const& ctx, std::uint32_t x)
309   { 309   {
HITCBC 310   9122240 std::uint32_t a = ctx.S[0][(x >> 24) & 0xFF]; 310   9122240 std::uint32_t a = ctx.S[0][(x >> 24) & 0xFF];
HITCBC 311   9122240 std::uint32_t b = ctx.S[1][(x >> 16) & 0xFF]; 311   9122240 std::uint32_t b = ctx.S[1][(x >> 16) & 0xFF];
HITCBC 312   9122240 std::uint32_t c = ctx.S[2][(x >> 8) & 0xFF]; 312   9122240 std::uint32_t c = ctx.S[2][(x >> 8) & 0xFF];
HITCBC 313   9122240 std::uint32_t d = ctx.S[3][x & 0xFF]; 313   9122240 std::uint32_t d = ctx.S[3][x & 0xFF];
HITCBC 314   9122240 return ((a + b) ^ c) + d; 314   9122240 return ((a + b) ^ c) + d;
315   } 315   }
316   316  
HITCBC 317   570140 void blowfish_encrypt( 317   570140 void blowfish_encrypt(
318   blowfish_ctx const& ctx, 318   blowfish_ctx const& ctx,
319   std::uint32_t& L, 319   std::uint32_t& L,
320   std::uint32_t& R) 320   std::uint32_t& R)
321   { 321   {
HITCBC 322   5131260 for (int i = 0; i < 16; i += 2) 322   5131260 for (int i = 0; i < 16; i += 2)
323   { 323   {
HITCBC 324   4561120 L ^= ctx.P[i]; 324   4561120 L ^= ctx.P[i];
HITCBC 325   4561120 R ^= F(ctx, L); 325   4561120 R ^= F(ctx, L);
HITCBC 326   4561120 R ^= ctx.P[i + 1]; 326   4561120 R ^= ctx.P[i + 1];
HITCBC 327   4561120 L ^= F(ctx, R); 327   4561120 L ^= F(ctx, R);
328   } 328   }
HITCBC 329   570140 L ^= ctx.P[16]; 329   570140 L ^= ctx.P[16];
HITCBC 330   570140 R ^= ctx.P[17]; 330   570140 R ^= ctx.P[17];
HITCBC 331   570140 std::swap(L, R); 331   570140 std::swap(L, R);
HITCBC 332   570140 } 332   570140 }
333   333  
HITCBC 334   1056 void blowfish_expand_key( 334   1056 void blowfish_expand_key(
335   blowfish_ctx& ctx, 335   blowfish_ctx& ctx,
336   std::uint8_t const* key, 336   std::uint8_t const* key,
337   std::size_t key_len) 337   std::size_t key_len)
338   { 338   {
HITCBC 339   1056 std::size_t j = 0; 339   1056 std::size_t j = 0;
340   340  
341   // XOR key into P-array 341   // XOR key into P-array
HITCBC 342   20064 for (int i = 0; i < 18; ++i) 342   20064 for (int i = 0; i < 18; ++i)
343   { 343   {
HITCBC 344   19008 std::uint32_t data = 0; 344   19008 std::uint32_t data = 0;
HITCBC 345   95040 for (int k = 0; k < 4; ++k) 345   95040 for (int k = 0; k < 4; ++k)
346   { 346   {
HITCBC 347   76032 data = (data << 8) | key[j]; 347   76032 data = (data << 8) | key[j];
HITCBC 348   76032 j = (j + 1) % key_len; 348   76032 j = (j + 1) % key_len;
349   } 349   }
HITCBC 350   19008 ctx.P[i] ^= data; 350   19008 ctx.P[i] ^= data;
351   } 351   }
352   352  
353   // Encrypt all zeros, replace P and S 353   // Encrypt all zeros, replace P and S
HITCBC 354   1056 std::uint32_t L = 0, R = 0; 354   1056 std::uint32_t L = 0, R = 0;
355   355  
HITCBC 356   10560 for (int i = 0; i < 18; i += 2) 356   10560 for (int i = 0; i < 18; i += 2)
357   { 357   {
HITCBC 358   9504 blowfish_encrypt(ctx, L, R); 358   9504 blowfish_encrypt(ctx, L, R);
HITCBC 359   9504 ctx.P[i] = L; 359   9504 ctx.P[i] = L;
HITCBC 360   9504 ctx.P[i + 1] = R; 360   9504 ctx.P[i + 1] = R;
361   } 361   }
362   362  
HITCBC 363   5280 for (int i = 0; i < 4; ++i) 363   5280 for (int i = 0; i < 4; ++i)
364   { 364   {
HITCBC 365   544896 for (int k = 0; k < 256; k += 2) 365   544896 for (int k = 0; k < 256; k += 2)
366   { 366   {
HITCBC 367   540672 blowfish_encrypt(ctx, L, R); 367   540672 blowfish_encrypt(ctx, L, R);
HITCBC 368   540672 ctx.S[i][k] = L; 368   540672 ctx.S[i][k] = L;
HITCBC 369   540672 ctx.S[i][k + 1] = R; 369   540672 ctx.S[i][k + 1] = R;
370   } 370   }
371   } 371   }
HITCBC 372   1056 } 372   1056 }
373   373  
HITCBC 374   28 void blowfish_expand_key_salt( 374   28 void blowfish_expand_key_salt(
375   blowfish_ctx& ctx, 375   blowfish_ctx& ctx,
376   std::uint8_t const* key, 376   std::uint8_t const* key,
377   std::size_t key_len, 377   std::size_t key_len,
378   std::uint8_t const* salt, 378   std::uint8_t const* salt,
379   std::size_t salt_len) 379   std::size_t salt_len)
380   { 380   {
HITCBC 381   28 std::size_t j = 0; 381   28 std::size_t j = 0;
382   382  
383   // XOR key into P-array 383   // XOR key into P-array
HITCBC 384   532 for (int i = 0; i < 18; ++i) 384   532 for (int i = 0; i < 18; ++i)
385   { 385   {
HITCBC 386   504 std::uint32_t data = 0; 386   504 std::uint32_t data = 0;
HITCBC 387   2520 for (int k = 0; k < 4; ++k) 387   2520 for (int k = 0; k < 4; ++k)
388   { 388   {
HITCBC 389   2016 data = (data << 8) | key[j]; 389   2016 data = (data << 8) | key[j];
HITCBC 390   2016 j = (j + 1) % key_len; 390   2016 j = (j + 1) % key_len;
391   } 391   }
HITCBC 392   504 ctx.P[i] ^= data; 392   504 ctx.P[i] ^= data;
393   } 393   }
394   394  
395   // Encrypt with salt XOR 395   // Encrypt with salt XOR
HITCBC 396   28 std::uint32_t L = 0, R = 0; 396   28 std::uint32_t L = 0, R = 0;
HITCBC 397   28 j = 0; 397   28 j = 0;
398   398  
HITCBC 399   280 for (int i = 0; i < 18; i += 2) 399   280 for (int i = 0; i < 18; i += 2)
400   { 400   {
401   // XOR salt into L and R 401   // XOR salt into L and R
HITCBC 402   252 L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) | 402   252 L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
HITCBC 403   252 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) | 403   252 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
HITCBC 404   252 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) | 404   252 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
HITCBC 405   252 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]); 405   252 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
HITCBC 406   252 j = (j + 4) % salt_len; 406   252 j = (j + 4) % salt_len;
407   407  
HITCBC 408   252 R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) | 408   252 R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
HITCBC 409   252 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) | 409   252 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
HITCBC 410   252 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) | 410   252 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
HITCBC 411   252 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]); 411   252 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
HITCBC 412   252 j = (j + 4) % salt_len; 412   252 j = (j + 4) % salt_len;
413   413  
HITCBC 414   252 blowfish_encrypt(ctx, L, R); 414   252 blowfish_encrypt(ctx, L, R);
HITCBC 415   252 ctx.P[i] = L; 415   252 ctx.P[i] = L;
HITCBC 416   252 ctx.P[i + 1] = R; 416   252 ctx.P[i + 1] = R;
417   } 417   }
418   418  
HITCBC 419   140 for (int i = 0; i < 4; ++i) 419   140 for (int i = 0; i < 4; ++i)
420   { 420   {
HITCBC 421   14448 for (int k = 0; k < 256; k += 2) 421   14448 for (int k = 0; k < 256; k += 2)
422   { 422   {
HITCBC 423   14336 L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) | 423   14336 L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
HITCBC 424   14336 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) | 424   14336 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
HITCBC 425   14336 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) | 425   14336 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
HITCBC 426   14336 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]); 426   14336 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
HITCBC 427   14336 j = (j + 4) % salt_len; 427   14336 j = (j + 4) % salt_len;
428   428  
HITCBC 429   14336 R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) | 429   14336 R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
HITCBC 430   14336 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) | 430   14336 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
HITCBC 431   14336 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) | 431   14336 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
HITCBC 432   14336 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]); 432   14336 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
HITCBC 433   14336 j = (j + 4) % salt_len; 433   14336 j = (j + 4) % salt_len;
434   434  
HITCBC 435   14336 blowfish_encrypt(ctx, L, R); 435   14336 blowfish_encrypt(ctx, L, R);
HITCBC 436   14336 ctx.S[i][k] = L; 436   14336 ctx.S[i][k] = L;
HITCBC 437   14336 ctx.S[i][k + 1] = R; 437   14336 ctx.S[i][k + 1] = R;
438   } 438   }
439   } 439   }
HITCBC 440   28 } 440   28 }
441   441  
HITCBC 442   1792 void blowfish_encrypt_ecb( 442   1792 void blowfish_encrypt_ecb(
443   blowfish_ctx const& ctx, 443   blowfish_ctx const& ctx,
444   std::uint8_t* data, 444   std::uint8_t* data,
445   std::size_t len) 445   std::size_t len)
446   { 446   {
HITCBC 447   7168 for (std::size_t i = 0; i < len; i += 8) 447   7168 for (std::size_t i = 0; i < len; i += 8)
448   { 448   {
HITCBC 449   5376 std::uint32_t L = 449   5376 std::uint32_t L =
HITCBC 450   5376 (static_cast<std::uint32_t>(data[i]) << 24) | 450   5376 (static_cast<std::uint32_t>(data[i]) << 24) |
HITCBC 451   5376 (static_cast<std::uint32_t>(data[i + 1]) << 16) | 451   5376 (static_cast<std::uint32_t>(data[i + 1]) << 16) |
HITCBC 452   5376 (static_cast<std::uint32_t>(data[i + 2]) << 8) | 452   5376 (static_cast<std::uint32_t>(data[i + 2]) << 8) |
HITCBC 453   5376 static_cast<std::uint32_t>(data[i + 3]); 453   5376 static_cast<std::uint32_t>(data[i + 3]);
454   454  
HITCBC 455   5376 std::uint32_t R = 455   5376 std::uint32_t R =
HITCBC 456   5376 (static_cast<std::uint32_t>(data[i + 4]) << 24) | 456   5376 (static_cast<std::uint32_t>(data[i + 4]) << 24) |
HITCBC 457   5376 (static_cast<std::uint32_t>(data[i + 5]) << 16) | 457   5376 (static_cast<std::uint32_t>(data[i + 5]) << 16) |
HITCBC 458   5376 (static_cast<std::uint32_t>(data[i + 6]) << 8) | 458   5376 (static_cast<std::uint32_t>(data[i + 6]) << 8) |
HITCBC 459   5376 static_cast<std::uint32_t>(data[i + 7]); 459   5376 static_cast<std::uint32_t>(data[i + 7]);
460   460  
HITCBC 461   5376 blowfish_encrypt(ctx, L, R); 461   5376 blowfish_encrypt(ctx, L, R);
462   462  
HITCBC 463   5376 data[i] = static_cast<std::uint8_t>(L >> 24); 463   5376 data[i] = static_cast<std::uint8_t>(L >> 24);
HITCBC 464   5376 data[i + 1] = static_cast<std::uint8_t>(L >> 16); 464   5376 data[i + 1] = static_cast<std::uint8_t>(L >> 16);
HITCBC 465   5376 data[i + 2] = static_cast<std::uint8_t>(L >> 8); 465   5376 data[i + 2] = static_cast<std::uint8_t>(L >> 8);
HITCBC 466   5376 data[i + 3] = static_cast<std::uint8_t>(L); 466   5376 data[i + 3] = static_cast<std::uint8_t>(L);
HITCBC 467   5376 data[i + 4] = static_cast<std::uint8_t>(R >> 24); 467   5376 data[i + 4] = static_cast<std::uint8_t>(R >> 24);
HITCBC 468   5376 data[i + 5] = static_cast<std::uint8_t>(R >> 16); 468   5376 data[i + 5] = static_cast<std::uint8_t>(R >> 16);
HITCBC 469   5376 data[i + 6] = static_cast<std::uint8_t>(R >> 8); 469   5376 data[i + 6] = static_cast<std::uint8_t>(R >> 8);
HITCBC 470   5376 data[i + 7] = static_cast<std::uint8_t>(R); 470   5376 data[i + 7] = static_cast<std::uint8_t>(R);
471   } 471   }
HITCBC 472   1792 } 472   1792 }
473   473  
474   } // detail 474   } // detail
475   } // bcrypt 475   } // bcrypt
476   } // http 476   } // http
477   } // boost 477   } // boost