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

PredatorCZ / PreCore / 460

pending completion
460

push

github-actions-ci

PredatorCZ
try fix coverage

3204 of 6095 relevant lines covered (52.57%)

354.19 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
    more info in README for PreCore Project
3

4
    Copyright 2018-2019 Lukas Cone
5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5✔
487
  uint64 lastblock = 0;
5✔
488

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1✔
588
  uint64 lastblock = 0;
1✔
589

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

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

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

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

9✔
610
  for (int i = 0; i < BF_NUMSBOXES; i += 2) {
9✔
611
    pi->EncodeBlock(lastblock);
9✔
612
    pi->sboxes[i] = static_cast<uint32>(lastblock);
613
    pi->sboxes[i + 1] = *(reinterpret_cast<uint32 *>(&lastblock) + 1);
614
  }
513✔
615
}
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