better standard compliance
[rofl0r-kripto.git] / lib / block / blowfish.c
blob1d648e20c8a741b29474f65e564a749bb524ead4
1 /*
2 * Copyright (C) 2013 Gregor Pintar <grpintar@gmail.com>
4 * Permission is granted to deal in this work without any restriction,
5 * including unlimited rights to use, publicly perform, publish,
6 * reproduce, relicence, modify, merge, and/or distribute in any form,
7 * for any purpose, with or without fee, and by any means.
9 * This work is provided "AS IS" and WITHOUT WARRANTY of any kind,
10 * to the utmost extent permitted by applicable law. In no event
11 * shall a licensor, author or contributor be held liable for any
12 * issues arising in any way out of dealing in the work.
15 #include <stdint.h>
16 #include <stdlib.h>
17 #include <string.h>
19 #include <kripto/cast.h>
20 #include <kripto/loadstore.h>
21 #include <kripto/memwipe.h>
22 #include <kripto/block.h>
23 #include <kripto/desc/block.h>
24 #include <kripto/object/block.h>
26 #include <kripto/block/blowfish.h>
28 struct kripto_block
30 struct kripto_block_object obj;
31 unsigned int rounds;
32 size_t size;
33 uint32_t s0[256];
34 uint32_t s1[256];
35 uint32_t s2[256];
36 uint32_t s3[256];
37 uint32_t *p;
40 static const uint32_t pi[1060] =
42 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
43 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
44 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
45 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
46 0x9216D5D9, 0x8979FB1B, 0xD1310BA6, 0x98DFB5AC,
47 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96,
48 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7,
49 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69,
50 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658,
51 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5,
52 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0,
53 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E,
54 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27,
55 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94,
56 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6,
57 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993,
58 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6,
59 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C,
60 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF,
61 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991,
62 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1,
63 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5,
64 0x0F6D6FF3, 0x83F44239, 0x2E0B4482, 0xA4842004,
65 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A,
66 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68,
67 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4,
68 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176,
69 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4,
70 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073,
71 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706,
72 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248,
73 0xDB0FEAD3, 0x49F1C09B, 0x075372C9, 0x80991B7B,
74 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B,
75 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4,
76 0x5E5C9EC2, 0x196A2463, 0x68FB6FAF, 0x3E6C53B5,
77 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C,
78 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD,
79 0x660F2807, 0x192E4BB3, 0xC0CBA857, 0x45C8740F,
80 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A,
81 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC,
82 0x8EA5E9F8, 0xDB3222F8, 0x3C7516DF, 0xFD616B15,
83 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760,
84 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0,
85 0x1A87562E, 0xDF1769DB, 0xD542A8F6, 0x287EFFC3,
86 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8,
87 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8,
88 0x4AFCB56C, 0x2DD1D35B, 0x9A53E479, 0xB6F84565,
89 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33,
90 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01,
91 0xD07E9EFE, 0x2BF11FB4, 0x95DBDA4D, 0xAE909198,
92 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0,
93 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64,
94 0x8888B812, 0x900DF01C, 0x4FAD5EA0, 0x688FC31C,
95 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777,
96 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8,
97 0x18ACF3D6, 0xCE89E299, 0xB4A84FE0, 0xFD13E0B7,
98 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705,
99 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86,
100 0xC75442F5, 0xFB9D35CF, 0xEBCDAF0C, 0x7B3E89A0,
101 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E,
102 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E,
103 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F,
104 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9,
105 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A,
106 0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4,
107 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F,
108 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6,
109 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1,
110 0x08BA4799, 0x6E85076A, 0x4B7A70E9, 0xB5B32944,
111 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D,
112 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF,
113 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29,
114 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65,
115 0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5,
116 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26,
117 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9,
118 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286,
119 0xB79C5305, 0xAA500737, 0x3E07841C, 0x7FDEAE5C,
120 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D,
121 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2,
122 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6,
123 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC,
124 0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E,
125 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F,
126 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908,
127 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79,
128 0x5679B072, 0xBCAF89AF, 0xDE9A771F, 0xD9930810,
129 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124,
130 0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17,
131 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA,
132 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908,
133 0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451,
134 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55,
135 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B,
136 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA,
137 0x9EBABF2C, 0x1E153C6E, 0x86E34570, 0xEAE96FB1,
138 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA,
139 0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825,
140 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78,
141 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D,
142 0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6,
143 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883,
144 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5,
145 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B,
146 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170,
147 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96,
148 0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239,
149 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7,
150 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA,
151 0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3,
152 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099,
153 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77,
154 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6,
155 0x96DEDFA1, 0x7858BA99, 0x57F584A5, 0x1B227263,
156 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054,
157 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA,
158 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3,
159 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA,
160 0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5,
161 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7,
162 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646,
163 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492,
164 0x47848A0B, 0x5692B285, 0x095BBF00, 0xAD19489D,
165 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA,
166 0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41,
167 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460,
168 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E,
169 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2,
170 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484,
171 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD,
172 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8,
173 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A,
174 0xE6E39F2B, 0xDB83ADF7, 0xE93D5A68, 0x948140F7,
175 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7,
176 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A,
177 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546,
178 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF,
179 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785,
180 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941,
181 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4,
182 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900,
183 0x680EC0A4, 0x27A18DEE, 0x4F3FFEA2, 0xE887AD8C,
184 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC,
185 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9,
186 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856,
187 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332,
188 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397,
189 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87,
190 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58,
191 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9,
192 0x5EF47E1C, 0x9029317C, 0xFDF8E802, 0x04272F70,
193 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22,
194 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F,
195 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1,
196 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60,
197 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E,
198 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1,
199 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99,
200 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD,
201 0x647D0862, 0xE7CCF5F0, 0x5449A36F, 0x877D48FA,
202 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74,
203 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8,
204 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37,
205 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3,
206 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C,
207 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24,
208 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979,
209 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B,
210 0x12754CCC, 0x782EF11C, 0x6A124237, 0xB79251E7,
211 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA,
212 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386,
213 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F,
214 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086,
215 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0,
216 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71,
217 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24,
218 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2,
219 0xF474EF38, 0x8789BDC2, 0x5366F9C3, 0xC8B38E74,
220 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84,
221 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770,
222 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0,
223 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09,
224 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C,
225 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF,
226 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE,
227 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA,
228 0xA002B5C4, 0x0DE6D027, 0x9AF88C27, 0x773F8641,
229 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0,
230 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63,
231 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE,
232 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188,
233 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9,
234 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5,
235 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8,
236 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4,
237 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212,
238 0x670EFA8E, 0x406000E0, 0x3A39CE37, 0xD3FAF5CF,
239 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742,
240 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315,
241 0xD62D1C7E, 0xC700C47B, 0xB78C1B6B, 0x21A19045,
242 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79,
243 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D,
244 0xD5730A1D, 0x4CD04DC6, 0x2939BBDB, 0xA9BA4650,
245 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A,
246 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6,
247 0xA51E03AA, 0x9CF2D0A4, 0x83C061BA, 0x9BE96A4D,
248 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1,
249 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA,
250 0x3F046F69, 0x77FA0A59, 0x80E4A915, 0x87B08601,
251 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797,
252 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D,
253 0xD1CF3ED6, 0x7C7D2D28, 0x1F9F25CF, 0xADF2B89B,
254 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6,
255 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC,
256 0xF8D56629, 0x79132E28, 0x785F0191, 0xED756055,
257 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA,
258 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2,
259 0x97271AEC, 0xA93A072A, 0x1B3F6D9B, 0x1E6321F5,
260 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5,
261 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8,
262 0xABCC5167, 0xCCAD925F, 0x4DE81751, 0x3830DC8E,
263 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE,
264 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46,
265 0x48DE5369, 0x6413E680, 0xA2AE0810, 0xDD6DB224,
266 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD,
267 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40,
268 0xCCD2017F, 0x6BB4E3BB, 0xDDA26A7E, 0x3A59FF45,
269 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB,
270 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E,
271 0xAEC2771B, 0xF64E6370, 0x740E0D8D, 0xE75B1357,
272 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC,
273 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D,
274 0x06B89FB4, 0xCE6EA048, 0x6F3F3B82, 0x3520AB82,
275 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC,
276 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B,
277 0x2F32C9B7, 0xA01FBAC9, 0xE01CC87E, 0xBCC7D1F6,
278 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A,
279 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667,
280 0x8DF9317C, 0xE0B12B4F, 0xF79E59B7, 0x43F5BB3A,
281 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A,
282 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB,
283 0xC2A86459, 0x12BAA8D1, 0xB6C1075E, 0xE3056A0C,
284 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B,
285 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF,
286 0xD3A0342B, 0x8971F21E, 0x1B0A7441, 0x4BA3348C,
287 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E,
288 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891,
289 0xCE6279CF, 0xCD3E7E6F, 0x1618B166, 0xFD2C1D05,
290 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623,
291 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5,
292 0x6E163697, 0x88D273CC, 0xDE966292, 0x81B949D0,
293 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A,
294 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00,
295 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222,
296 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3,
297 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76,
298 0x77AFA1C5, 0x20756060, 0x85CBFE4E, 0x8AE88DD8,
299 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C,
300 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0,
301 0x3F09252D, 0xC208E69F, 0xB74E6132, 0xCE77E25B,
302 0x578FDFE3, 0x3AC372E6, 0xB83ACB02, 0x2002397A,
303 0x6EC6FB5B, 0xFFCFD4DD, 0x4CBF5ED1, 0xF43FE582,
304 0x3EF4E823, 0x2D152AF0, 0xE718C970, 0x59BD9820,
305 0x1F4A9D62, 0xE7A529BA, 0x89E1248D, 0x3BF88656,
306 0xC5114D0E, 0xBC4CEE16, 0x034D8A39, 0x20E47882
309 #define F(X) \
311 ((s->s0[(X) >> 24] \
312 + s->s1[(uint8_t)((X) >> 16)]) \
313 ^ s->s2[(uint8_t)((X) >> 8)]) \
314 + s->s3[(uint8_t)(X)] \
317 static void blowfish_encrypt
319 const kripto_block *s,
320 const void *pt,
321 void *ct
324 uint32_t l;
325 uint32_t r;
326 unsigned int i;
328 l = LOAD32B(CU8(pt));
329 r = LOAD32B(CU8(pt) + 4);
331 for(i = 0; i < s->rounds;)
333 l ^= s->p[i++];
334 r ^= F(l);
336 if(i == s->rounds)
338 r ^= s->p[i++];
339 l ^= s->p[i];
341 STORE32B(l, U8(ct));
342 STORE32B(r, U8(ct) + 4);
344 return;
347 r ^= s->p[i++];
348 l ^= F(r);
351 l ^= s->p[i++];
352 r ^= s->p[i];
354 STORE32B(r, U8(ct));
355 STORE32B(l, U8(ct) + 4);
358 static void blowfish_decrypt
360 const kripto_block *s,
361 const void *ct,
362 void *pt
365 uint32_t l;
366 uint32_t r;
367 unsigned int i;
369 l = LOAD32B(CU8(ct));
370 r = LOAD32B(CU8(ct) + 4);
372 for(i = s->rounds + 1; i > 1;)
374 l ^= s->p[i--];
375 r ^= F(l);
377 if(i == 1)
379 r ^= s->p[i--];
380 l ^= s->p[i];
382 STORE32B(l, U8(pt));
383 STORE32B(r, U8(pt) + 4);
385 return;
388 r ^= s->p[i--];
389 l ^= F(r);
392 l ^= s->p[i--];
393 r ^= s->p[i];
395 STORE32B(r, U8(pt));
396 STORE32B(l, U8(pt) + 4);
399 static void blowfish_setup
401 kripto_block *s,
402 const uint8_t *key,
403 unsigned int key_len
406 uint32_t t;
407 uint8_t b[8] = {0, 0, 0, 0, 0, 0, 0, 0};
408 unsigned int i;
409 unsigned int j;
411 /* xor p array with key */
412 for(i = j = 0; i < s->rounds + 2; i++)
414 t = key[j++];
415 if(j == key_len) j = 0;
417 t = (t << 8) | key[j++];
418 if(j == key_len) j = 0;
420 t = (t << 8) | key[j++];
421 if(j == key_len) j = 0;
423 t = (t << 8) | key[j++];
424 if(j == key_len) j = 0;
426 s->p[i] = pi[i] ^ t;
429 /* copy S-Boxes */
430 memcpy(s->s0, pi + i, 1024);
431 memcpy(s->s1, pi + i + 256, 1024);
432 memcpy(s->s2, pi + i + 512, 1024);
433 memcpy(s->s3, pi + i + 768, 1024);
435 /* encrypt p array */
436 for(i = 0; i < s->rounds + 2;)
438 blowfish_encrypt(s, b, b);
439 s->p[i++] = LOAD32B(b);
440 if(i == s->rounds + 2) break;
441 s->p[i++] = LOAD32B(b + 4);
444 /* encrypt S-Box 0 */
445 for(i = 0; i < 256;)
447 blowfish_encrypt(s, b, b);
448 s->s0[i++] = LOAD32B(b);
449 s->s0[i++] = LOAD32B(b + 4);
452 /* encrypt S-Box 1 */
453 for(i = 0; i < 256;)
455 blowfish_encrypt(s, b, b);
456 s->s1[i++] = LOAD32B(b);
457 s->s1[i++] = LOAD32B(b + 4);
460 /* encrypt S-Box 2 */
461 for(i = 0; i < 256;)
463 blowfish_encrypt(s, b, b);
464 s->s2[i++] = LOAD32B(b);
465 s->s2[i++] = LOAD32B(b + 4);
468 /* encrypt S-Box 3 */
469 for(i = 0; i < 256;)
471 blowfish_encrypt(s, b, b);
472 s->s3[i++] = LOAD32B(b);
473 s->s3[i++] = LOAD32B(b + 4);
476 /* wipe temporary values */
477 kripto_memwipe(b, 8);
478 kripto_memwipe(&t, sizeof(uint32_t));
481 static kripto_block *blowfish_create
483 unsigned int r,
484 const void *key,
485 unsigned int key_len
488 kripto_block *s;
490 if(!r) r = 16;
492 s = malloc(sizeof(kripto_block) + ((r + 2) << 2));
493 if(!s) return 0;
495 s->obj.desc = kripto_block_blowfish;
496 s->size = sizeof(kripto_block) + ((r + 2) << 2);
497 s->rounds = r;
498 s->p = (uint32_t *)((uint8_t *)s + sizeof(kripto_block));
500 blowfish_setup(s, key, key_len);
502 return s;
505 static void blowfish_destroy(kripto_block *s)
507 kripto_memwipe(s, s->size);
508 free(s);
511 static kripto_block *blowfish_recreate
513 kripto_block *s,
514 unsigned int r,
515 const void *key,
516 unsigned int key_len
519 if(!r) r = 16;
521 if(sizeof(kripto_block) + ((r + 2) << 2))
523 blowfish_destroy(s);
524 s = blowfish_create(r, key, key_len);
526 else
528 s->rounds = r;
530 blowfish_setup(s, key, key_len);
533 return s;
536 static const kripto_block_desc blowfish =
538 &blowfish_create,
539 &blowfish_recreate,
541 &blowfish_encrypt,
542 &blowfish_decrypt,
543 &blowfish_destroy,
544 8, /* block size */
545 56 /* max key */
548 const kripto_block_desc *const kripto_block_blowfish = &blowfish;