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  

302  
void blowfish_init(blowfish_ctx& ctx)
302  
void blowfish_init(blowfish_ctx& ctx)
303  
{
303  
{
304  
    std::memcpy(ctx.P, P_init, sizeof(P_init));
304  
    std::memcpy(ctx.P, P_init, sizeof(P_init));
305  
    std::memcpy(ctx.S, S_init, sizeof(S_init));
305  
    std::memcpy(ctx.S, S_init, sizeof(S_init));
306  
}
306  
}
307  

307  

308  
inline std::uint32_t F(blowfish_ctx const& ctx, std::uint32_t x)
308  
inline std::uint32_t F(blowfish_ctx const& ctx, std::uint32_t x)
309  
{
309  
{
310  
    std::uint32_t a = ctx.S[0][(x >> 24) & 0xFF];
310  
    std::uint32_t a = ctx.S[0][(x >> 24) & 0xFF];
311  
    std::uint32_t b = ctx.S[1][(x >> 16) & 0xFF];
311  
    std::uint32_t b = ctx.S[1][(x >> 16) & 0xFF];
312  
    std::uint32_t c = ctx.S[2][(x >> 8) & 0xFF];
312  
    std::uint32_t c = ctx.S[2][(x >> 8) & 0xFF];
313  
    std::uint32_t d = ctx.S[3][x & 0xFF];
313  
    std::uint32_t d = ctx.S[3][x & 0xFF];
314  
    return ((a + b) ^ c) + d;
314  
    return ((a + b) ^ c) + d;
315  
}
315  
}
316  

316  

317  
void blowfish_encrypt(
317  
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  
{
322  
    for (int i = 0; i < 16; i += 2)
322  
    for (int i = 0; i < 16; i += 2)
323  
    {
323  
    {
324  
        L ^= ctx.P[i];
324  
        L ^= ctx.P[i];
325  
        R ^= F(ctx, L);
325  
        R ^= F(ctx, L);
326  
        R ^= ctx.P[i + 1];
326  
        R ^= ctx.P[i + 1];
327  
        L ^= F(ctx, R);
327  
        L ^= F(ctx, R);
328  
    }
328  
    }
329  
    L ^= ctx.P[16];
329  
    L ^= ctx.P[16];
330  
    R ^= ctx.P[17];
330  
    R ^= ctx.P[17];
331  
    std::swap(L, R);
331  
    std::swap(L, R);
332  
}
332  
}
333  

333  

334  
void blowfish_expand_key(
334  
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  
{
339  
    std::size_t j = 0;
339  
    std::size_t j = 0;
340  

340  

341  
    // XOR key into P-array
341  
    // XOR key into P-array
342  
    for (int i = 0; i < 18; ++i)
342  
    for (int i = 0; i < 18; ++i)
343  
    {
343  
    {
344  
        std::uint32_t data = 0;
344  
        std::uint32_t data = 0;
345  
        for (int k = 0; k < 4; ++k)
345  
        for (int k = 0; k < 4; ++k)
346  
        {
346  
        {
347  
            data = (data << 8) | key[j];
347  
            data = (data << 8) | key[j];
348  
            j = (j + 1) % key_len;
348  
            j = (j + 1) % key_len;
349  
        }
349  
        }
350  
        ctx.P[i] ^= data;
350  
        ctx.P[i] ^= data;
351  
    }
351  
    }
352  

352  

353  
    // Encrypt all zeros, replace P and S
353  
    // Encrypt all zeros, replace P and S
354  
    std::uint32_t L = 0, R = 0;
354  
    std::uint32_t L = 0, R = 0;
355  

355  

356  
    for (int i = 0; i < 18; i += 2)
356  
    for (int i = 0; i < 18; i += 2)
357  
    {
357  
    {
358  
        blowfish_encrypt(ctx, L, R);
358  
        blowfish_encrypt(ctx, L, R);
359  
        ctx.P[i] = L;
359  
        ctx.P[i] = L;
360  
        ctx.P[i + 1] = R;
360  
        ctx.P[i + 1] = R;
361  
    }
361  
    }
362  

362  

363  
    for (int i = 0; i < 4; ++i)
363  
    for (int i = 0; i < 4; ++i)
364  
    {
364  
    {
365  
        for (int k = 0; k < 256; k += 2)
365  
        for (int k = 0; k < 256; k += 2)
366  
        {
366  
        {
367  
            blowfish_encrypt(ctx, L, R);
367  
            blowfish_encrypt(ctx, L, R);
368  
            ctx.S[i][k] = L;
368  
            ctx.S[i][k] = L;
369  
            ctx.S[i][k + 1] = R;
369  
            ctx.S[i][k + 1] = R;
370  
        }
370  
        }
371  
    }
371  
    }
372  
}
372  
}
373  

373  

374  
void blowfish_expand_key_salt(
374  
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  
{
381  
    std::size_t j = 0;
381  
    std::size_t j = 0;
382  

382  

383  
    // XOR key into P-array
383  
    // XOR key into P-array
384  
    for (int i = 0; i < 18; ++i)
384  
    for (int i = 0; i < 18; ++i)
385  
    {
385  
    {
386  
        std::uint32_t data = 0;
386  
        std::uint32_t data = 0;
387  
        for (int k = 0; k < 4; ++k)
387  
        for (int k = 0; k < 4; ++k)
388  
        {
388  
        {
389  
            data = (data << 8) | key[j];
389  
            data = (data << 8) | key[j];
390  
            j = (j + 1) % key_len;
390  
            j = (j + 1) % key_len;
391  
        }
391  
        }
392  
        ctx.P[i] ^= data;
392  
        ctx.P[i] ^= data;
393  
    }
393  
    }
394  

394  

395  
    // Encrypt with salt XOR
395  
    // Encrypt with salt XOR
396  
    std::uint32_t L = 0, R = 0;
396  
    std::uint32_t L = 0, R = 0;
397  
    j = 0;
397  
    j = 0;
398  

398  

399  
    for (int i = 0; i < 18; i += 2)
399  
    for (int i = 0; i < 18; i += 2)
400  
    {
400  
    {
401  
        // XOR salt into L and R
401  
        // XOR salt into L and R
402  
        L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
402  
        L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
403  
             (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
403  
             (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
404  
             (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
404  
             (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
405  
             static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
405  
             static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
406  
        j = (j + 4) % salt_len;
406  
        j = (j + 4) % salt_len;
407  

407  

408  
        R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
408  
        R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
409  
             (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
409  
             (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
410  
             (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
410  
             (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
411  
             static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
411  
             static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
412  
        j = (j + 4) % salt_len;
412  
        j = (j + 4) % salt_len;
413  

413  

414  
        blowfish_encrypt(ctx, L, R);
414  
        blowfish_encrypt(ctx, L, R);
415  
        ctx.P[i] = L;
415  
        ctx.P[i] = L;
416  
        ctx.P[i + 1] = R;
416  
        ctx.P[i + 1] = R;
417  
    }
417  
    }
418  

418  

419  
    for (int i = 0; i < 4; ++i)
419  
    for (int i = 0; i < 4; ++i)
420  
    {
420  
    {
421  
        for (int k = 0; k < 256; k += 2)
421  
        for (int k = 0; k < 256; k += 2)
422  
        {
422  
        {
423  
            L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
423  
            L ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
424  
                 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
424  
                 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
425  
                 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
425  
                 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
426  
                 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
426  
                 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
427  
            j = (j + 4) % salt_len;
427  
            j = (j + 4) % salt_len;
428  

428  

429  
            R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
429  
            R ^= (static_cast<std::uint32_t>(salt[(j + 0) % salt_len]) << 24) |
430  
                 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
430  
                 (static_cast<std::uint32_t>(salt[(j + 1) % salt_len]) << 16) |
431  
                 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
431  
                 (static_cast<std::uint32_t>(salt[(j + 2) % salt_len]) << 8) |
432  
                 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
432  
                 static_cast<std::uint32_t>(salt[(j + 3) % salt_len]);
433  
            j = (j + 4) % salt_len;
433  
            j = (j + 4) % salt_len;
434  

434  

435  
            blowfish_encrypt(ctx, L, R);
435  
            blowfish_encrypt(ctx, L, R);
436  
            ctx.S[i][k] = L;
436  
            ctx.S[i][k] = L;
437  
            ctx.S[i][k + 1] = R;
437  
            ctx.S[i][k + 1] = R;
438  
        }
438  
        }
439  
    }
439  
    }
440  
}
440  
}
441  

441  

442  
void blowfish_encrypt_ecb(
442  
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  
{
447  
    for (std::size_t i = 0; i < len; i += 8)
447  
    for (std::size_t i = 0; i < len; i += 8)
448  
    {
448  
    {
449  
        std::uint32_t L =
449  
        std::uint32_t L =
450  
            (static_cast<std::uint32_t>(data[i]) << 24) |
450  
            (static_cast<std::uint32_t>(data[i]) << 24) |
451  
            (static_cast<std::uint32_t>(data[i + 1]) << 16) |
451  
            (static_cast<std::uint32_t>(data[i + 1]) << 16) |
452  
            (static_cast<std::uint32_t>(data[i + 2]) << 8) |
452  
            (static_cast<std::uint32_t>(data[i + 2]) << 8) |
453  
            static_cast<std::uint32_t>(data[i + 3]);
453  
            static_cast<std::uint32_t>(data[i + 3]);
454  

454  

455  
        std::uint32_t R =
455  
        std::uint32_t R =
456  
            (static_cast<std::uint32_t>(data[i + 4]) << 24) |
456  
            (static_cast<std::uint32_t>(data[i + 4]) << 24) |
457  
            (static_cast<std::uint32_t>(data[i + 5]) << 16) |
457  
            (static_cast<std::uint32_t>(data[i + 5]) << 16) |
458  
            (static_cast<std::uint32_t>(data[i + 6]) << 8) |
458  
            (static_cast<std::uint32_t>(data[i + 6]) << 8) |
459  
            static_cast<std::uint32_t>(data[i + 7]);
459  
            static_cast<std::uint32_t>(data[i + 7]);
460  

460  

461  
        blowfish_encrypt(ctx, L, R);
461  
        blowfish_encrypt(ctx, L, R);
462  

462  

463  
        data[i] = static_cast<std::uint8_t>(L >> 24);
463  
        data[i] = static_cast<std::uint8_t>(L >> 24);
464  
        data[i + 1] = static_cast<std::uint8_t>(L >> 16);
464  
        data[i + 1] = static_cast<std::uint8_t>(L >> 16);
465  
        data[i + 2] = static_cast<std::uint8_t>(L >> 8);
465  
        data[i + 2] = static_cast<std::uint8_t>(L >> 8);
466  
        data[i + 3] = static_cast<std::uint8_t>(L);
466  
        data[i + 3] = static_cast<std::uint8_t>(L);
467  
        data[i + 4] = static_cast<std::uint8_t>(R >> 24);
467  
        data[i + 4] = static_cast<std::uint8_t>(R >> 24);
468  
        data[i + 5] = static_cast<std::uint8_t>(R >> 16);
468  
        data[i + 5] = static_cast<std::uint8_t>(R >> 16);
469  
        data[i + 6] = static_cast<std::uint8_t>(R >> 8);
469  
        data[i + 6] = static_cast<std::uint8_t>(R >> 8);
470  
        data[i + 7] = static_cast<std::uint8_t>(R);
470  
        data[i + 7] = static_cast<std::uint8_t>(R);
471  
    }
471  
    }
472  
}
472  
}
473  

473  

474  
} // detail
474  
} // detail
475  
} // bcrypt
475  
} // bcrypt
476  
} // http
476  
} // http
477  
} // boost
477  
} // boost