summaryrefslogtreecommitdiffabout
path: root/pwmanager/pwmanager/blowfish.cpp
Unidiff
Diffstat (limited to 'pwmanager/pwmanager/blowfish.cpp') (more/less context) (show whitespace changes)
-rw-r--r--pwmanager/pwmanager/blowfish.cpp579
1 files changed, 579 insertions, 0 deletions
diff --git a/pwmanager/pwmanager/blowfish.cpp b/pwmanager/pwmanager/blowfish.cpp
new file mode 100644
index 0000000..2ca58ce
--- a/dev/null
+++ b/pwmanager/pwmanager/blowfish.cpp
@@ -0,0 +1,579 @@
1/* 2003.05.02: Derived from libgcrypt-1.1.12 by Michael Buesch */
2
3/* blowfish.c - Blowfish encryption
4 *Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc.
5 *
6 * This file is part of Libgcrypt.
7 *
8 * Libgcrypt is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU Lesser general Public License as
10 * published by the Free Software Foundation; either version 2.1 of
11 * the License, or (at your option) any later version.
12 *
13 * Libgcrypt is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
21 *
22 * For a description of the algorithm, see:
23 * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
24 * ISBN 0-471-11709-9. Pages 336 ff.
25 */
26
27/* Test values:
28 * key "abcdefghijklmnopqrstuvwxyz";
29 * plain "BLOWFISH"
30 * cipher 32 4E D0 FE F4 13 A2 03
31 *
32 */
33
34/***************************************************************************
35 * copyright (C) 2004 by Ulf Schenk
36 * This file is originaly based on version 1.0.1 of pwmanager
37 * and was modified to run on embedded devices that run microkde
38 *
39 * $Id$
40 **************************************************************************/
41
42
43#include <string.h>
44#include <stdlib.h>
45
46#include "blowfish.h"
47#include "globalstuff.h"
48
49
50/* precomputed S boxes */
51static const uint32_t ks0[256] = {
52 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96,
53 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
54 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658,
55 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
56 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E,
57 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
58 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6,
59 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
60 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C,
61 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
62 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1,
63 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
64 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A,
65 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
66 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176,
67 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
68 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706,
69 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
70 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B,
71 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
72 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C,
73 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
74 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A,
75 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
76 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760,
77 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
78 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8,
79 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
80 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33,
81 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
82 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0,
83 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
84 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777,
85 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
86 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705,
87 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
88 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E,
89 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
90 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9,
91 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
92 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F,
93 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
94 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
95};
96
97static const uint32_t ks1[256] = {
98 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D,
99 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
100 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65,
101 0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
102 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9,
103 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
104 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D,
105 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
106 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC,
107 0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
108 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908,
109 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
110 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124,
111 0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
112 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908,
113 0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
114 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B,
115 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
116 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA,
117 0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
118 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D,
119 0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
120 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5,
121 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
122 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96,
123 0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
124 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA,
125 0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
126 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77,
127 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
128 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054,
129 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
130 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA,
131 0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
132 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646,
133 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
134 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA,
135 0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
136 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E,
137 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
138 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD,
139 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
140 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
141};
142
143static const uint32_t ks2[256] = {
144 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7,
145 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
146 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF,
147 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
148 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4,
149 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
150 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC,
151 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
152 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332,
153 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
154 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58,
155 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
156 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22,
157 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
158 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60,
159 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
160 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99,
161 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
162 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74,
163 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
164 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3,
165 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
166 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979,
167 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
168 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA,
169 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
170 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086,
171 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
172 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24,
173 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
174 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84,
175 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
176 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09,
177 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
178 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE,
179 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
180 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0,
181 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
182 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188,
183 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
184 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8,
185 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
186 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
187};
188
189static const uint32_t ks3[256] = {
190 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742,
191 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
192 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79,
193 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
194 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A,
195 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
196 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1,
197 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
198 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797,
199 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
200 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6,
201 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
202 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA,
203 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
204 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5,
205 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
206 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE,
207 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
208 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD,
209 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
210 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB,
211 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
212 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC,
213 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
214 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC,
215 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
216 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A,
217 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
218 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A,
219 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
220 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B,
221 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
222 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E,
223 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
224 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623,
225 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
226 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A,
227 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
228 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3,
229 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
230 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C,
231 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
232 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
233};
234
235static const uint32_t ps[BLOWFISH_ROUNDS + 2] = {
236 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0,
237 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
238 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B
239};
240
241void Blowfish::burn_stack(int bytes)
242{
243 char buf[64];
244
245 memset(buf, 0, sizeof buf);
246 bytes -= sizeof buf;
247 if (bytes > 0)
248 burn_stack(bytes);
249}
250
251void Blowfish::do_encrypt(uint32_t * ret_xl, uint32_t * ret_xr)
252{
253#if BLOWFISH_ROUNDS == 16
254 uint32_t xl, xr, *s0, *s1, *s2, *s3, *p;
255
256 xl = *ret_xl;
257 xr = *ret_xr;
258 p = bc.p;
259 s0 = bc.s0;
260 s1 = bc.s1;
261 s2 = bc.s2;
262 s3 = bc.s3;
263
264 R(xl, xr, 0, p, s0, s1, s2, s3);
265 R(xr, xl, 1, p, s0, s1, s2, s3);
266 R(xl, xr, 2, p, s0, s1, s2, s3);
267 R(xr, xl, 3, p, s0, s1, s2, s3);
268 R(xl, xr, 4, p, s0, s1, s2, s3);
269 R(xr, xl, 5, p, s0, s1, s2, s3);
270 R(xl, xr, 6, p, s0, s1, s2, s3);
271 R(xr, xl, 7, p, s0, s1, s2, s3);
272 R(xl, xr, 8, p, s0, s1, s2, s3);
273 R(xr, xl, 9, p, s0, s1, s2, s3);
274 R(xl, xr, 10, p, s0, s1, s2, s3);
275 R(xr, xl, 11, p, s0, s1, s2, s3);
276 R(xl, xr, 12, p, s0, s1, s2, s3);
277 R(xr, xl, 13, p, s0, s1, s2, s3);
278 R(xl, xr, 14, p, s0, s1, s2, s3);
279 R(xr, xl, 15, p, s0, s1, s2, s3);
280
281 xl ^= p[BLOWFISH_ROUNDS];
282 xr ^= p[BLOWFISH_ROUNDS + 1];
283
284 *ret_xl = xr;
285 *ret_xr = xl;
286
287#else
288 uint32_t xl, xr, temp, *p;
289 int i;
290
291 xl = *ret_xl;
292 xr = *ret_xr;
293 p = bc.p;
294
295 for (i = 0; i < BLOWFISH_ROUNDS; i++) {
296 xl ^= p[i];
297 xr ^= function_F(xl);
298 temp = xl;
299 xl = xr;
300 xr = temp;
301 }
302 temp = xl;
303 xl = xr;
304 xr = temp;
305
306 xr ^= p[BLOWFISH_ROUNDS];
307 xl ^= p[BLOWFISH_ROUNDS + 1];
308
309 *ret_xl = xl;
310 *ret_xr = xr;
311#endif
312}
313
314void Blowfish::do_decrypt(uint32_t * ret_xl, uint32_t * ret_xr)
315{
316#if BLOWFISH_ROUNDS == 16
317 uint32_t xl, xr, *s0, *s1, *s2, *s3, *p;
318
319 xl = *ret_xl;
320 xr = *ret_xr;
321 p = bc.p;
322 s0 = bc.s0;
323 s1 = bc.s1;
324 s2 = bc.s2;
325 s3 = bc.s3;
326
327 R(xl, xr, 17, p, s0, s1, s2, s3);
328 R(xr, xl, 16, p, s0, s1, s2, s3);
329 R(xl, xr, 15, p, s0, s1, s2, s3);
330 R(xr, xl, 14, p, s0, s1, s2, s3);
331 R(xl, xr, 13, p, s0, s1, s2, s3);
332 R(xr, xl, 12, p, s0, s1, s2, s3);
333 R(xl, xr, 11, p, s0, s1, s2, s3);
334 R(xr, xl, 10, p, s0, s1, s2, s3);
335 R(xl, xr, 9, p, s0, s1, s2, s3);
336 R(xr, xl, 8, p, s0, s1, s2, s3);
337 R(xl, xr, 7, p, s0, s1, s2, s3);
338 R(xr, xl, 6, p, s0, s1, s2, s3);
339 R(xl, xr, 5, p, s0, s1, s2, s3);
340 R(xr, xl, 4, p, s0, s1, s2, s3);
341 R(xl, xr, 3, p, s0, s1, s2, s3);
342 R(xr, xl, 2, p, s0, s1, s2, s3);
343
344 xl ^= p[1];
345 xr ^= p[0];
346
347 *ret_xl = xr;
348 *ret_xr = xl;
349
350#else
351 uint32_t xl, xr, temp, *p;
352 int i;
353
354 xl = *ret_xl;
355 xr = *ret_xr;
356 p = bc.p;
357
358 for (i = BLOWFISH_ROUNDS + 1; i > 1; i--) {
359 xl ^= p[i];
360 xr ^= function_F(xl);
361 temp = xl;
362 xl = xr;
363 xr = temp;
364 }
365
366 temp = xl;
367 xl = xr;
368 xr = temp;
369
370 xr ^= p[1];
371 xl ^= p[0];
372
373 *ret_xl = xl;
374 *ret_xr = xr;
375#endif
376}
377
378void Blowfish::do_encrypt_block(byte * outbuf, byte * inbuf)
379{
380 uint32_t d1, d2;
381
382 d1 = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3];
383 d2 = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7];
384 do_encrypt(&d1, &d2);
385 outbuf[0] = (d1 >> 24) & 0xff;
386 outbuf[1] = (d1 >> 16) & 0xff;
387 outbuf[2] = (d1 >> 8) & 0xff;
388 outbuf[3] = d1 & 0xff;
389 outbuf[4] = (d2 >> 24) & 0xff;
390 outbuf[5] = (d2 >> 16) & 0xff;
391 outbuf[6] = (d2 >> 8) & 0xff;
392 outbuf[7] = d2 & 0xff;
393}
394
395void Blowfish::encrypt_block(byte * outbuf, byte * inbuf)
396{
397 do_encrypt_block(outbuf, inbuf);
398 burn_stack(64);
399}
400
401void Blowfish::do_decrypt_block(byte * outbuf, byte * inbuf)
402{
403 uint32_t d1, d2;
404
405 d1 = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3];
406 d2 = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7];
407 do_decrypt(&d1, &d2);
408 outbuf[0] = (d1 >> 24) & 0xff;
409 outbuf[1] = (d1 >> 16) & 0xff;
410 outbuf[2] = (d1 >> 8) & 0xff;
411 outbuf[3] = d1 & 0xff;
412 outbuf[4] = (d2 >> 24) & 0xff;
413 outbuf[5] = (d2 >> 16) & 0xff;
414 outbuf[6] = (d2 >> 8) & 0xff;
415 outbuf[7] = d2 & 0xff;
416}
417
418void Blowfish::decrypt_block(byte * outbuf, byte * inbuf)
419{
420 do_decrypt_block(outbuf, inbuf);
421 burn_stack(64);
422}
423
424bool Blowfish::selfTest()
425{
426 byte plain1[] = "BLOWFISH";
427 byte key1[] = "abcdefghijklmnopqrstuvwxyz";
428 byte cipher1[] = "\x32\x4E\xD0\xFE\xF4\x13\xA2\x03";
429 byte plain2[] = "\xFE\xDC\xBA\x98\x76\x54\x32\x10";
430 byte key2[] = "\x41\x79\x6E\xA0\x52\x61\x6E\xE4";
431 byte cipher2[] = "\xE1\x13\xF4\x10\x2C\xFC\xCE\x43";
432 byte buffer[8];
433
434 Blowfish blowfish;
435
436 blowfish.bf_setkey(key1, array_size(key1) - 1);
437 blowfish.bf_encrypt(buffer, plain1, array_size(plain1) - 1);
438 if (unlikely(memcmp(buffer, cipher1, array_size(cipher1) - 1)))
439 return false;
440
441 blowfish.bf_decrypt(buffer, buffer, array_size(buffer));
442 if (unlikely(memcmp(buffer, plain1, array_size(plain1) - 1)))
443 return false;
444
445 blowfish.bf_setkey(key2, array_size(key2) - 1);
446 blowfish.bf_encrypt(buffer, plain2, array_size(plain2) - 1);
447 if (unlikely(memcmp(buffer, cipher2, array_size(cipher2) - 1)))
448 return false;
449
450 blowfish.bf_decrypt(buffer, buffer, array_size(buffer));
451 if (unlikely(memcmp(buffer, plain2, array_size(plain2) - 1)))
452 return false;
453
454 return true;
455}
456
457int Blowfish::do_bf_setkey(byte * key, unsigned int keylen)
458{
459 int i, j;
460 uint32_t data, datal, datar;
461
462 for (i = 0; i < BLOWFISH_ROUNDS + 2; ++i)
463 bc.p[i] = ps[i];
464 for (i = 0; i < 256; ++i) {
465 bc.s0[i] = ks0[i];
466 bc.s1[i] = ks1[i];
467 bc.s2[i] = ks2[i];
468 bc.s3[i] = ks3[i];
469 }
470
471 for (i = j = 0; i < BLOWFISH_ROUNDS + 2; ++i) {
472#ifdef BIG_ENDIAN_HOST
473 ((byte *) & data)[0] = key[j];
474 ((byte *) & data)[1] = key[(j + 1) % keylen];
475 ((byte *) & data)[2] = key[(j + 2) % keylen];
476 ((byte *) & data)[3] = key[(j + 3) % keylen];
477#else
478 ((byte *) & data)[3] = key[j];
479 ((byte *) & data)[2] = key[(j + 1) % keylen];
480 ((byte *) & data)[1] = key[(j + 2) % keylen];
481 ((byte *) & data)[0] = key[(j + 3) % keylen];
482#endif
483 bc.p[i] ^= data;
484 j = (j + 4) % keylen;
485 }
486
487 datal = datar = 0;
488 for (i = 0; i < BLOWFISH_ROUNDS + 2; i += 2) {
489 do_encrypt(&datal, &datar);
490 bc.p[i] = datal;
491 bc.p[i + 1] = datar;
492 }
493 for (i = 0; i < 256; i += 2) {
494 do_encrypt(&datal, &datar);
495 bc.s0[i] = datal;
496 bc.s0[i + 1] = datar;
497 }
498 for (i = 0; i < 256; i += 2) {
499 do_encrypt(&datal, &datar);
500 bc.s1[i] = datal;
501 bc.s1[i + 1] = datar;
502 }
503 for (i = 0; i < 256; i += 2) {
504 do_encrypt(&datal, &datar);
505 bc.s2[i] = datal;
506 bc.s2[i + 1] = datar;
507 }
508 for (i = 0; i < 256; i += 2) {
509 do_encrypt(&datal, &datar);
510 bc.s3[i] = datal;
511 bc.s3[i + 1] = datar;
512 }
513
514 /* Check for weak key. A weak key is a key in which a value in */
515 /* the P-array (here c) occurs more than once per table. */
516 for (i = 0; i < 255; ++i) {
517 for (j = i + 1; j < 256; ++j) {
518 if ((bc.s0[i] == bc.s0[j]) || (bc.s1[i] == bc.s1[j]) ||
519 (bc.s2[i] == bc.s2[j]) || (bc.s3[i] == bc.s3[j]))
520 return 1;
521 }
522 }
523
524 return 0;
525}
526
527int Blowfish::bf_setkey(byte * key, unsigned int keylen)
528{
529 int rc = do_bf_setkey(key, keylen);
530 burn_stack(64);
531 return rc;
532}
533
534int Blowfish::bf_encrypt(byte * outbuf, byte * inbuf, unsigned int inbuf_len)
535{
536 if (unlikely(inbuf_len % 8))
537 return 1;
538
539 unsigned int i = 0;
540 while (i < inbuf_len) {
541 encrypt_block(outbuf + i, inbuf + i);
542 i += 8;
543 }
544 return 0;
545}
546
547int Blowfish::bf_decrypt(byte * outbuf, byte * inbuf, unsigned int inbuf_len)
548{
549 if (unlikely(inbuf_len % 8))
550 return 1;
551
552 unsigned int i = 0;
553 while (i < inbuf_len) {
554 decrypt_block(outbuf + i, inbuf + i);
555 i += 8;
556 }
557 return 0;
558}
559
560void Blowfish::padNull(string *buf)
561{
562 buf->append(1, (char)0x01);
563 string::size_type append_null = 8 - (buf->length() % 8);
564 buf->append(append_null, (char)0x00);
565}
566
567bool Blowfish::unpadNull(string *buf)
568{
569 if (unlikely(buf->size() % 8))
570 return false;
571 string::size_type pos = buf->length() - 1;
572 while ((*buf)[pos] != (char)0x01) {
573 if (unlikely(pos == 0))
574 return false;
575 --pos;
576 }
577 buf->erase(pos, buf->length() - pos);
578 return true;
579}