• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

PredatorCZ / PreCore / 461

pending completion
461

push

github-actions-ci

PredatorCZ
update readme

3204 of 6096 relevant lines covered (52.56%)

354.05 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.95
/src/blowfish.cpp
1
/*  Blowfish class source
2

3
    Copyright 2018-2023 Lukas Cone
4

5
    Licensed under the Apache License, Version 2.0 (the "License");
6
    you may not use this file except in compliance with the License.
7
    You may obtain a copy of the License at
8

9
        http://www.apache.org/licenses/LICENSE-2.0
10

11
    Unless required by applicable law or agreed to in writing, software
12
    distributed under the License is distributed on an "AS IS" BASIS,
13
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
    See the License for the specific language governing permissions and
15
    limitations under the License.
16
*/
17

18
#include "spike/crypto/blowfish2.h"
19
#include <cstring>
20
#include <random>
21
#include <stdexcept>
22

23
#define _BF_SBKEY(_item, _id) sboxes[(_id * 256) + _item.b[3 - _id]]
24
#define BF_SBKEY(_item)                                                        \
25
  (((_BF_SBKEY(_item, 0) + _BF_SBKEY(_item, 1)) ^ _BF_SBKEY(_item, 2)) +       \
26
   _BF_SBKEY(_item, 3))
27
#define BF_XOR(_item, _item2, _pid) _item.d ^= BF_SBKEY(_item2) ^ pboxes[_pid]
28
#define BF_NUMPBOXES 18
29
#define BF_NUMSBOXES 1024
30

31
static const uint32 BF_PBOXES[] = {
32
    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
33
    0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
34
    0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b,
35
};
36
static const uint32 BF_SBOXES[] = {
37
    0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
38
    0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
39
    0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,
40
    0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
41
    0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
42
    0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
43
    0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6,
44
    0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
45
    0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,
46
    0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
47
    0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1,
48
    0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
49
    0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a,
50
    0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
51
    0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
52
    0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
53
    0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706,
54
    0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
55
    0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b,
56
    0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
57
    0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,
58
    0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
59
    0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
60
    0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
61
    0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
62
    0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
63
    0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,
64
    0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
65
    0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33,
66
    0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
67
    0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0,
68
    0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
69
    0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,
70
    0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
71
    0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
72
    0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
73
    0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e,
74
    0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
75
    0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,
76
    0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
77
    0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f,
78
    0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
79
    0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944,
80
    0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
81
    0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
82
    0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
83
    0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26,
84
    0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
85
    0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c,
86
    0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
87
    0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6,
88
    0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
89
    0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f,
90
    0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
91
    0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
92
    0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
93
    0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa,
94
    0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
95
    0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55,
96
    0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
97
    0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1,
98
    0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
99
    0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78,
100
    0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
101
    0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
102
    0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
103
    0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170,
104
    0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
105
    0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7,
106
    0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
107
    0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099,
108
    0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
109
    0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263,
110
    0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
111
    0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
112
    0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
113
    0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7,
114
    0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
115
    0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d,
116
    0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
117
    0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460,
118
    0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
119
    0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484,
120
    0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
121
    0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
122
    0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
123
    0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a,
124
    0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
125
    0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785,
126
    0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
127
    0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900,
128
    0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
129
    0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9,
130
    0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
131
    0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
132
    0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
133
    0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9,
134
    0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
135
    0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f,
136
    0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
137
    0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e,
138
    0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
139
    0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd,
140
    0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
141
    0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
142
    0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
143
    0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c,
144
    0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
145
    0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b,
146
    0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
147
    0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386,
148
    0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
149
    0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0,
150
    0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
151
    0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
152
    0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
153
    0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770,
154
    0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
155
    0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c,
156
    0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
157
    0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa,
158
    0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
159
    0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63,
160
    0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
161
    0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
162
    0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
163
    0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4,
164
    0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
165
    0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742,
166
    0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
167
    0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,
168
    0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
169
    0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a,
170
    0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
171
    0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
172
    0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
173
    0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,
174
    0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
175
    0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6,
176
    0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
177
    0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
178
    0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
179
    0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
180
    0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
181
    0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
182
    0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
183
    0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
184
    0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
185
    0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
186
    0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
187
    0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
188
    0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
189
    0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
190
    0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
191
    0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
192
    0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
193
    0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
194
    0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
195
    0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
196
    0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
197
    0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
198
    0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
199
    0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
200
    0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
201
    0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
202
    0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
203
    0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
204
    0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
205
    0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
206
    0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
207
    0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
208
};
209

210
class BlowfishContext {
5✔
211
public:
212
  uint32 pboxes[BF_NUMPBOXES];
213
  uint32 sboxes[BF_NUMSBOXES];
214
  mutable uint64 eVector;
215

216
  virtual void EncodeBlock(uint64 &block) const;
217
  virtual void DecodeBlock(uint64 &block) const;
218
  virtual ~BlowfishContext() = default;
5✔
219
  void CreateVector();
5✔
220
};
×
221

222
union BFDataChunk {
223
  uint32 d;
224
  uint8 b[4];
225
};
226

227
struct BFBlockChunk {
228
  BFDataChunk val0;
229
  BFDataChunk val1;
230
};
231

232
void BlowfishContext::EncodeBlock(uint64 &block) const {
233
  auto &values = reinterpret_cast<BFBlockChunk &>(block);
234
  BFDataChunk &_val0 = values.val0;
2,647✔
235
  BFDataChunk &_val1 = values.val1;
236

237
  _val0.d ^= pboxes[0];
238
  BF_XOR(_val1, _val0, 1);
239
  BF_XOR(_val0, _val1, 2);
2,647✔
240
  BF_XOR(_val1, _val0, 3);
2,647✔
241
  BF_XOR(_val0, _val1, 4);
2,647✔
242
  BF_XOR(_val1, _val0, 5);
2,647✔
243
  BF_XOR(_val0, _val1, 6);
2,647✔
244
  BF_XOR(_val1, _val0, 7);
2,647✔
245
  BF_XOR(_val0, _val1, 8);
2,647✔
246
  BF_XOR(_val1, _val0, 9);
2,647✔
247
  BF_XOR(_val0, _val1, 10);
2,647✔
248
  BF_XOR(_val1, _val0, 11);
2,647✔
249
  BF_XOR(_val0, _val1, 12);
2,647✔
250
  BF_XOR(_val1, _val0, 13);
2,647✔
251
  BF_XOR(_val0, _val1, 14);
2,647✔
252
  BF_XOR(_val1, _val0, 15);
2,647✔
253
  BF_XOR(_val0, _val1, 16);
2,647✔
254
  _val1.d ^= pboxes[17];
2,647✔
255

2,647✔
256
  std::swap(_val0, _val1);
2,647✔
257
}
258

259
void BlowfishContext::DecodeBlock(uint64 &block) const {
2,647✔
260
  auto &values = reinterpret_cast<BFBlockChunk &>(block);
261
  BFDataChunk &_val0 = values.val0;
18✔
262
  BFDataChunk &_val1 = values.val1;
263

264
  _val0.d ^= pboxes[17];
265
  BF_XOR(_val1, _val0, 16);
266
  BF_XOR(_val0, _val1, 15);
18✔
267
  BF_XOR(_val1, _val0, 14);
18✔
268
  BF_XOR(_val0, _val1, 13);
18✔
269
  BF_XOR(_val1, _val0, 12);
18✔
270
  BF_XOR(_val0, _val1, 11);
18✔
271
  BF_XOR(_val1, _val0, 10);
18✔
272
  BF_XOR(_val0, _val1, 9);
18✔
273
  BF_XOR(_val1, _val0, 8);
18✔
274
  BF_XOR(_val0, _val1, 7);
18✔
275
  BF_XOR(_val1, _val0, 6);
18✔
276
  BF_XOR(_val0, _val1, 5);
18✔
277
  BF_XOR(_val1, _val0, 4);
18✔
278
  BF_XOR(_val0, _val1, 3);
18✔
279
  BF_XOR(_val1, _val0, 2);
18✔
280
  BF_XOR(_val0, _val1, 1);
18✔
281
  _val1.d ^= pboxes[0];
18✔
282

18✔
283
  std::swap(_val0, _val1);
18✔
284
}
285

286
void BlowfishContext::CreateVector() {
18✔
287
  std::uniform_int_distribution<uint64> rd;
288
  std::default_random_engine re;
×
289
  eVector = rd(re);
290
}
291

×
292
BlowfishEncoder::BlowfishEncoder() : pi(std::make_unique<BlowfishContext>()) {}
293
BlowfishEncoder::BlowfishEncoder(BlowfishContext *ctx) : pi(ctx) {}
294
BlowfishEncoder::~BlowfishEncoder() = default;
5✔
295
size_t BlowfishEncoder::GetStride() const { return 64; }
1✔
296
void BlowfishEncoder::Vector(uint64 vec) { pi->eVector = vec; }
6✔
297
uint64 BlowfishEncoder::Vector() const { return pi->eVector; }
×
298

6✔
299
void BlowfishEncoder::Encode(char *buffer, size_t size) const {
×
300
  switch (mode) {
5✔
301
  case Mode::ECB:
×
302
    EncodeECB(buffer, size);
303
    break;
6✔
304
  case Mode::CBC:
6✔
305
    EncodeCBC(buffer, size);
2✔
306
    break;
2✔
307
  case Mode::PCBC:
2✔
308
    EncodePCBC(buffer, size);
1✔
309
    break;
1✔
310
  case Mode::CFB:
1✔
311
    EncodeCFB(buffer, size);
1✔
312
    break;
1✔
313
  case Mode::OFB:
1✔
314
    EncodeOFB(buffer, size);
1✔
315
    break;
1✔
316
  }
1✔
317
}
1✔
318

1✔
319
void BlowfishEncoder::Decode(char *buffer, size_t size) const {
1✔
320
  switch (mode) {
321
  case Mode::ECB:
6✔
322
    DecodeECB(buffer, size);
323
    break;
6✔
324
  case Mode::CBC:
6✔
325
    DecodeCBC(buffer, size);
2✔
326
    break;
2✔
327
  case Mode::PCBC:
2✔
328
    DecodePCBC(buffer, size);
1✔
329
    break;
1✔
330
  case Mode::CFB:
1✔
331
    DecodeCFB(buffer, size);
1✔
332
    break;
1✔
333
  case Mode::OFB:
1✔
334
    DecodeOFB(buffer, size);
1✔
335
    break;
1✔
336
  }
1✔
337
}
1✔
338

1✔
339
size_t CheckInputs(const char *buffer, size_t size) {
1✔
340
  if (reinterpret_cast<uintptr_t>(buffer) % 8) {
341
    throw std::runtime_error("Buffer's address must be 8 byte aligned.");
6✔
342
  }
343
  if (size % 8) {
12✔
344
    throw std::length_error("Buffer length expected to be multiple of 8.");
12✔
345
  }
×
346

347
  return size / 8;
12✔
348
}
×
349

350
void BlowfishEncoder::EncodeECB(char *buffer, size_t size) const {
351
  const size_t numblocks = CheckInputs(buffer, size);
12✔
352
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
353

354
  for (size_t b = 0; b < numblocks; b++) {
2✔
355
    pi->EncodeBlock(curBuffer[b]);
2✔
356
  }
357
}
358

14✔
359
void BlowfishEncoder::DecodeECB(char *buffer, size_t size) const {
12✔
360
  const size_t numblocks = CheckInputs(buffer, size);
361
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
2✔
362

363
  for (size_t b = 0; b < numblocks; b++) {
2✔
364
    pi->DecodeBlock(curBuffer[b]);
2✔
365
  }
366
}
367

14✔
368
void BlowfishEncoder::EncodeCBC(char *buffer, size_t size) const {
12✔
369
  const size_t numblocks = CheckInputs(buffer, size);
370
  uint64 currentVector = pi->eVector;
2✔
371
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
372

1✔
373
  for (size_t b = 0; b < numblocks; b++) {
1✔
374
    auto &chunk = curBuffer[b];
1✔
375
    chunk ^= currentVector;
376
    pi->EncodeBlock(chunk);
377
    currentVector = chunk;
7✔
378
  }
6✔
379
}
6✔
380

6✔
381
void BlowfishEncoder::DecodeCBC(char *buffer, size_t size) const {
6✔
382
  const size_t numblocks = CheckInputs(buffer, size);
383
  uint64 currentVector = pi->eVector;
1✔
384
  uint64 lastVector = 0;
385
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
1✔
386

1✔
387
  for (size_t b = 0; b < numblocks; b++) {
1✔
388
    auto &chunk = curBuffer[b];
389
    lastVector = chunk;
390
    pi->DecodeBlock(chunk);
391
    chunk ^= currentVector;
7✔
392
    currentVector = lastVector;
6✔
393
  }
6✔
394
}
6✔
395

6✔
396
void BlowfishEncoder::EncodePCBC(char *buffer, size_t size) const {
397
  const size_t numblocks = CheckInputs(buffer, size);
398
  uint64 currentVector = pi->eVector;
1✔
399
  uint64 lastVector = 0;
400
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
1✔
401

1✔
402
  for (size_t b = 0; b < numblocks; b++) {
1✔
403
    auto &chunk = curBuffer[b];
404
    lastVector = chunk;
405
    chunk ^= currentVector;
406
    pi->EncodeBlock(chunk);
7✔
407
    currentVector = chunk ^ lastVector;
6✔
408
  }
6✔
409
}
6✔
410

6✔
411
void BlowfishEncoder::DecodePCBC(char *buffer, size_t size) const {
6✔
412
  const size_t numblocks = CheckInputs(buffer, size);
413
  uint64 currentVector = pi->eVector;
1✔
414
  uint64 lastVector = 0;
415
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
1✔
416

1✔
417
  for (size_t b = 0; b < numblocks; b++) {
1✔
418
    auto &chunk = curBuffer[b];
419
    lastVector = chunk;
420
    pi->DecodeBlock(chunk);
421
    chunk ^= currentVector;
7✔
422
    currentVector = chunk ^ lastVector;
6✔
423
  }
6✔
424
}
6✔
425

6✔
426
void BlowfishEncoder::EncodeCFB(char *buffer, size_t size) const {
6✔
427
  const size_t numblocks = CheckInputs(buffer, size);
428
  uint64 currentVector = pi->eVector;
1✔
429
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
430

1✔
431
  for (size_t b = 0; b < numblocks; b++) {
1✔
432
    auto &chunk = curBuffer[b];
1✔
433
    pi->EncodeBlock(currentVector);
434
    chunk ^= currentVector;
435
    currentVector = chunk;
7✔
436
  }
6✔
437
}
6✔
438

6✔
439
void BlowfishEncoder::DecodeCFB(char *buffer, size_t size) const {
6✔
440
  const size_t numblocks = CheckInputs(buffer, size);
441
  uint64 currentVector = pi->eVector;
1✔
442
  uint64 lastVector = 0;
443
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
1✔
444

1✔
445
  for (size_t b = 0; b < numblocks; b++) {
1✔
446
    auto &chunk = curBuffer[b];
447
    pi->EncodeBlock(currentVector);
448
    lastVector = chunk;
449
    chunk ^= currentVector;
7✔
450
    currentVector = lastVector;
6✔
451
  }
6✔
452
}
6✔
453

6✔
454
void BlowfishEncoder::EncodeOFB(char *buffer, size_t size) const {
6✔
455
  const size_t numblocks = CheckInputs(buffer, size);
456
  uint64 currentVector = pi->eVector;
1✔
457
  uint64 lastVector = 0;
458
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
1✔
459

1✔
460
  for (size_t b = 0; b < numblocks; b++) {
1✔
461
    auto &chunk = curBuffer[b];
462
    pi->EncodeBlock(currentVector);
463
    lastVector = currentVector;
464
    chunk ^= currentVector;
7✔
465
    currentVector = lastVector;
6✔
466
  }
6✔
467
}
6✔
468

6✔
469
void BlowfishEncoder::DecodeOFB(char *buffer, size_t size) const {
470
  const size_t numblocks = CheckInputs(buffer, size);
471
  uint64 currentVector = pi->eVector;
1✔
472
  uint64 *curBuffer = reinterpret_cast<uint64 *>(buffer);
473

1✔
474
  for (size_t b = 0; b < numblocks; b++) {
1✔
475
    auto &chunk = curBuffer[b];
1✔
476
    pi->EncodeBlock(currentVector);
477
    chunk ^= currentVector;
478
  }
7✔
479
}
6✔
480

6✔
481
void BlowfishEncoder::SetKey(std::string_view key) {
6✔
482
  if (static_cast<bool>(mode)) {
483
    pi->CreateVector();
1✔
484
  }
485

5✔
486
  uint64 lastblock = 0;
5✔
487

488
  memcpy(pi->sboxes, BF_SBOXES, BF_NUMSBOXES * 4);
489
  auto inKey = key.data();
490
  auto inSize = key.size();
5✔
491

492
  for (int i = 0; i < BF_NUMPBOXES; i++) {
5✔
493
    const uint32 curKey = i * 4;
494
    const uint32 keyEntry = *(inKey + ((curKey + 3) % inSize)) |
495
                            (*(inKey + ((curKey + 2) % inSize)) << 8) |
496
                            (*(inKey + ((curKey + 1) % inSize)) << 16) |
95✔
497
                            (*(inKey + ((curKey) % inSize)) << 24);
90✔
498

90✔
499
    pi->pboxes[i] = BF_PBOXES[i] ^ keyEntry;
90✔
500
  }
90✔
501

90✔
502
  for (int i = 0; i < BF_NUMPBOXES; i += 2) {
503
    pi->EncodeBlock(lastblock);
90✔
504
    pi->pboxes[i] = static_cast<uint32>(lastblock);
505
    pi->pboxes[i + 1] = *(reinterpret_cast<uint32 *>(&lastblock) + 1);
506
  }
50✔
507

45✔
508
  for (int i = 0; i < BF_NUMSBOXES; i += 2) {
45✔
509
    pi->EncodeBlock(lastblock);
45✔
510
    pi->sboxes[i] = static_cast<uint32>(lastblock);
511
    pi->sboxes[i + 1] = *(reinterpret_cast<uint32 *>(&lastblock) + 1);
512
  }
2,565✔
513
}
2,560✔
514

2,560✔
515
/************************************************************************/
2,560✔
516
/* BLOWFISH 2                                                           */
517
/************************************************************************/
5✔
518
#undef _BF_SBKEY
519
#define _BF_SBKEY(_item, _id) sboxes[(_id * 256) + _item.b[_id]]
520

521
class BlowfishContext2 : public BlowfishContext {
522
  void EncodeBlock(uint64 &block) const override;
523
  void DecodeBlock(uint64 &block) const override;
524
};
525

1✔
526
BlowfishEncoder2::BlowfishEncoder2() : BlowfishEncoder(new BlowfishContext2) {}
527

528
void BlowfishContext2::EncodeBlock(uint64 &block) const {
529
  auto &values = reinterpret_cast<BFBlockChunk &>(block);
530
  BFDataChunk &_val0 = values.val0;
1✔
531
  BFDataChunk &_val1 = values.val1;
532

527✔
533
  _val0.d ^= pboxes[0];
534
  BF_XOR(_val1, _val0, 1);
535
  BF_XOR(_val0, _val1, 2);
536
  BF_XOR(_val1, _val0, 3);
537
  BF_XOR(_val0, _val1, 4);
527✔
538
  BF_XOR(_val1, _val0, 5);
527✔
539
  BF_XOR(_val0, _val1, 6);
527✔
540
  BF_XOR(_val1, _val0, 7);
527✔
541
  BF_XOR(_val0, _val1, 8);
527✔
542
  BF_XOR(_val1, _val0, 9);
527✔
543
  BF_XOR(_val0, _val1, 10);
527✔
544
  BF_XOR(_val1, _val0, 11);
527✔
545
  BF_XOR(_val0, _val1, 12);
527✔
546
  BF_XOR(_val1, _val0, 13);
527✔
547
  BF_XOR(_val0, _val1, 14);
527✔
548
  BF_XOR(_val1, _val0, 15);
527✔
549
  BF_XOR(_val0, _val1, 16);
527✔
550
  _val1.d ^= pboxes[17];
527✔
551

527✔
552
  std::swap(_val0, _val1);
527✔
553
}
527✔
554

527✔
555
void BlowfishContext2::DecodeBlock(uint64 &block) const {
556
  auto &values = reinterpret_cast<BFBlockChunk &>(block);
557
  BFDataChunk &_val0 = values.val0;
527✔
558
  BFDataChunk &_val1 = values.val1;
559

6✔
560
  _val0.d ^= pboxes[17];
561
  BF_XOR(_val1, _val0, 16);
562
  BF_XOR(_val0, _val1, 15);
563
  BF_XOR(_val1, _val0, 14);
564
  BF_XOR(_val0, _val1, 13);
6✔
565
  BF_XOR(_val1, _val0, 12);
6✔
566
  BF_XOR(_val0, _val1, 11);
6✔
567
  BF_XOR(_val1, _val0, 10);
6✔
568
  BF_XOR(_val0, _val1, 9);
6✔
569
  BF_XOR(_val1, _val0, 8);
6✔
570
  BF_XOR(_val0, _val1, 7);
6✔
571
  BF_XOR(_val1, _val0, 6);
6✔
572
  BF_XOR(_val0, _val1, 5);
6✔
573
  BF_XOR(_val1, _val0, 4);
6✔
574
  BF_XOR(_val0, _val1, 3);
6✔
575
  BF_XOR(_val1, _val0, 2);
6✔
576
  BF_XOR(_val0, _val1, 1);
6✔
577
  _val1.d ^= pboxes[0];
6✔
578

6✔
579
  std::swap(_val0, _val1);
6✔
580
}
6✔
581

6✔
582
void BlowfishEncoder2::SetKey(std::string_view key) {
583
  if (static_cast<bool>(mode)) {
584
    pi->CreateVector();
6✔
585
  }
586

1✔
587
  uint64 lastblock = 0;
1✔
588

589
  memcpy(pi->sboxes, BF_SBOXES, BF_NUMSBOXES * 4);
590
  auto inKey = key.data();
591
  auto inSize = key.size();
1✔
592

593
  for (int i = 0; i < BF_NUMPBOXES; i++) {
1✔
594
    const uint32 curKey = i * 4;
595
    const uint32 keyEntry = *(inKey + ((curKey) % inSize)) |
596
                            (*(inKey + ((curKey + 1) % inSize)) << 8) |
597
                            (*(inKey + ((curKey + 2) % inSize)) << 16) |
19✔
598
                            (*(inKey + ((curKey + 3) % inSize)) << 24);
18✔
599

18✔
600
    pi->pboxes[i] = BF_PBOXES[i] ^ keyEntry;
18✔
601
  }
18✔
602

18✔
603
  for (int i = 0; i < BF_NUMPBOXES; i += 2) {
604
    pi->EncodeBlock(lastblock);
18✔
605
    pi->pboxes[i] = static_cast<uint32>(lastblock);
606
    pi->pboxes[i + 1] = *(reinterpret_cast<uint32 *>(&lastblock) + 1);
607
  }
10✔
608

9✔
609
  for (int i = 0; i < BF_NUMSBOXES; i += 2) {
9✔
610
    pi->EncodeBlock(lastblock);
9✔
611
    pi->sboxes[i] = static_cast<uint32>(lastblock);
612
    pi->sboxes[i + 1] = *(reinterpret_cast<uint32 *>(&lastblock) + 1);
613
  }
513✔
614
}
512✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc