Drop pointless directory name prefixes from #includes in the current dir
[libav.git] / libavutil / blowfish.c
1 /*
2 * Blowfish algorithm
3 * Copyright (c) 2012 Samuel Pitoiset
4 *
5 * loosely based on Paul Kocher's implementation
6 *
7 * This file is part of Libav.
8 *
9 * Libav is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * Libav is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with Libav; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 #include "avutil.h"
25 #include "common.h"
26 #include "intreadwrite.h"
27 #include "blowfish.h"
28
29 static const uint32_t orig_p[AV_BF_ROUNDS + 2] = {
30 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
31 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
32 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
33 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
34 0x9216D5D9, 0x8979FB1B
35 };
36
37 static const uint32_t orig_s[4][256] = {
38 { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
39 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
40 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
41 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
42 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
43 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
44 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
45 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
46 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
47 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
48 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
49 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
50 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
51 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
52 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
53 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
54 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
55 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
56 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
57 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
58 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
59 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
60 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
61 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
62 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
63 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
64 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
65 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
66 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
67 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
68 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
69 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
70 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
71 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
72 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
73 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
74 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
75 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
76 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
77 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
78 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
79 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
80 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
81 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
82 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
83 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
84 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
85 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
86 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
87 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
88 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
89 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
90 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
91 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
92 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
93 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
94 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
95 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
96 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
97 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
98 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
99 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
100 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
101 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A },
102 { 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
103 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
104 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
105 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
106 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
107 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
108 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
109 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
110 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
111 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
112 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
113 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
114 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
115 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
116 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
117 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
118 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
119 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
120 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
121 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
122 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
123 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
124 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
125 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
126 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
127 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
128 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
129 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
130 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
131 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
132 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
133 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
134 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
135 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
136 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
137 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
138 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
139 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
140 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
141 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
142 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
143 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
144 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
145 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
146 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
147 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
148 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
149 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
150 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
151 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
152 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
153 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
154 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
155 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
156 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
157 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
158 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
159 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
160 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
161 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
162 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
163 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
164 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
165 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 },
166 { 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
167 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
168 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
169 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
170 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
171 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
172 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
173 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
174 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
175 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
176 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
177 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
178 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
179 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
180 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
181 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
182 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
183 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
184 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
185 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
186 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
187 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
188 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
189 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
190 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
191 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
192 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
193 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
194 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
195 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
196 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
197 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
198 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
199 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
200 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
201 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
202 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
203 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
204 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
205 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
206 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
207 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
208 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
209 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
210 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
211 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
212 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
213 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
214 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
215 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
216 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
217 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
218 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
219 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
220 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
221 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
222 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
223 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
224 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
225 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
226 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
227 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
228 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
229 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 },
230 { 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
231 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
232 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
233 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
234 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
235 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
236 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
237 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
238 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
239 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
240 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
241 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
242 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
243 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
244 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
245 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
246 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
247 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
248 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
249 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
250 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
251 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
252 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
253 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
254 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
255 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
256 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
257 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
258 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
259 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
260 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
261 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
262 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
263 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
264 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
265 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
266 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
267 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
268 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
269 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
270 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
271 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
272 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
273 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
274 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
275 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
276 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
277 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
278 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
279 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
280 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
281 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
282 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
283 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
284 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
285 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
286 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
287 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
288 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
289 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
290 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
291 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
292 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
293 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }
294 };
295
296 static void F(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, int i)
297 {
298 uint32_t Xl, Xr;
299 uint32_t y;
300
301 Xl = *xl;
302 Xr = *xr;
303
304 Xl ^= ctx->p[i];
305 y = ctx->s[0][(Xl >> 24) & 0xFF];
306 y += ctx->s[1][(Xl >> 16) & 0xFF];
307 y ^= ctx->s[2][(Xl >> 8) & 0xFF];
308 y += ctx->s[3][ Xl & 0xFF];
309 Xr ^= y;
310
311 *xl = Xr;
312 *xr = Xl;
313 }
314
315 av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
316 {
317 uint32_t data, data_l, data_r;
318 int i, j, k;
319
320 memcpy(ctx->s, orig_s, sizeof(orig_s));
321
322 j = 0;
323 for (i = 0; i < AV_BF_ROUNDS + 2; ++i) {
324 data = 0;
325 for (k = 0; k < 4; k++) {
326 data = (data << 8) | key[j];
327 if (++j >= key_len)
328 j = 0;
329 }
330 ctx->p[i] = orig_p[i] ^ data;
331 }
332
333 data_l = data_r = 0;
334
335 for (i = 0; i < AV_BF_ROUNDS + 2; i += 2) {
336 av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
337 ctx->p[i] = data_l;
338 ctx->p[i + 1] = data_r;
339 }
340
341 for (i = 0; i < 4; ++i) {
342 for (j = 0; j < 256; j += 2) {
343 av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
344 ctx->s[i][j] = data_l;
345 ctx->s[i][j + 1] = data_r;
346 }
347 }
348 }
349
350 void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
351 int decrypt)
352 {
353 uint32_t Xl, Xr;
354 int i;
355
356 Xl = *xl;
357 Xr = *xr;
358
359 if (decrypt) {
360 for (i = AV_BF_ROUNDS + 1; i > 1; --i)
361 F(ctx, &Xl, &Xr, i);
362
363 Xl = Xl ^ ctx->p[1];
364 Xr = Xr ^ ctx->p[0];
365 } else {
366 for (i = 0; i < AV_BF_ROUNDS; ++i)
367 F(ctx, &Xl, &Xr, i);
368
369 Xl = Xl ^ ctx->p[AV_BF_ROUNDS];
370 Xr = Xr ^ ctx->p[AV_BF_ROUNDS + 1];
371 }
372
373 *xl = Xr;
374 *xr = Xl;
375 }
376
377 void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
378 int count, uint8_t *iv, int decrypt)
379 {
380 uint32_t v0, v1;
381 int i;
382
383 if (decrypt) {
384 while (count--) {
385 v0 = AV_RB32(src);
386 v1 = AV_RB32(src + 4);
387
388 av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
389
390 if (iv) {
391 v0 ^= AV_RB32(iv);
392 v1 ^= AV_RB32(iv + 4);
393 memcpy(iv, src, 8);
394 }
395
396 AV_WB32(dst, v0);
397 AV_WB32(dst + 4, v1);
398
399 src += 8;
400 dst += 8;
401 }
402 } else {
403 while (count--) {
404 if (iv) {
405 for (i = 0; i < 8; i++)
406 dst[i] = src[i] ^ iv[i];
407 v0 = AV_RB32(dst);
408 v1 = AV_RB32(dst + 4);
409 } else {
410 v0 = AV_RB32(src);
411 v1 = AV_RB32(src + 4);
412 }
413
414 av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
415
416 AV_WB32(dst, v0);
417 AV_WB32(dst + 4, v1);
418
419 if (iv)
420 memcpy(iv, dst, 8);
421
422 src += 8;
423 dst += 8;
424 }
425 }
426 }
427
428 #ifdef TEST
429 #include <stdio.h>
430
431 #define NUM_VARIABLE_KEY_TESTS 34
432
433 /* plaintext bytes -- left halves */
434 static const uint32_t plaintext_l[NUM_VARIABLE_KEY_TESTS] = {
435 0x00000000, 0xFFFFFFFF, 0x10000000, 0x11111111, 0x11111111,
436 0x01234567, 0x00000000, 0x01234567, 0x01A1D6D0, 0x5CD54CA8,
437 0x0248D438, 0x51454B58, 0x42FD4430, 0x059B5E08, 0x0756D8E0,
438 0x762514B8, 0x3BDD1190, 0x26955F68, 0x164D5E40, 0x6B056E18,
439 0x004BD6EF, 0x480D3900, 0x437540C8, 0x072D43A0, 0x02FE5577,
440 0x1D9D5C50, 0x30553228, 0x01234567, 0x01234567, 0x01234567,
441 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
442 };
443
444 /* plaintext bytes -- right halves */
445 static const uint32_t plaintext_r[NUM_VARIABLE_KEY_TESTS] = {
446 0x00000000, 0xFFFFFFFF, 0x00000001, 0x11111111, 0x11111111,
447 0x89ABCDEF, 0x00000000, 0x89ABCDEF, 0x39776742, 0x3DEF57DA,
448 0x06F67172, 0x2DDF440A, 0x59577FA2, 0x51CF143A, 0x774761D2,
449 0x29BF486A, 0x49372802, 0x35AF609A, 0x4F275232, 0x759F5CCA,
450 0x09176062, 0x6EE762F2, 0x698F3CFA, 0x77075292, 0x8117F12A,
451 0x18F728C2, 0x6D6F295A, 0x89ABCDEF, 0x89ABCDEF, 0x89ABCDEF,
452 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
453 };
454
455 /* key bytes for variable key tests */
456 static const uint8_t variable_key[NUM_VARIABLE_KEY_TESTS][8] = {
457 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
458 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
459 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
460 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
461 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
462 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
463 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
464 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
465 { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
466 { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E },
467 { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 },
468 { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E },
469 { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 },
470 { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE },
471 { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 },
472 { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE },
473 { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 },
474 { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F },
475 { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 },
476 { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E },
477 { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 },
478 { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 },
479 { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F },
480 { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 },
481 { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF },
482 { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 },
483 { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF },
484 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
485 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
486 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
487 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
488 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
489 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
490 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
491 };
492
493 /* ciphertext bytes -- left halves */
494 static const uint32_t ciphertext_l[NUM_VARIABLE_KEY_TESTS] = {
495 0x4EF99745, 0x51866FD5, 0x7D856F9A, 0x2466DD87, 0x61F9C380,
496 0x7D0CC630, 0x4EF99745, 0x0ACEAB0F, 0x59C68245, 0xB1B8CC0B,
497 0x1730E577, 0xA25E7856, 0x353882B1, 0x48F4D088, 0x432193B7,
498 0x13F04154, 0x2EEDDA93, 0xD887E039, 0x5F99D04F, 0x4A057A3B,
499 0x452031C1, 0x7555AE39, 0x53C55F9C, 0x7A8E7BFA, 0xCF9C5D7A,
500 0xD1ABB290, 0x55CB3774, 0xFA34EC48, 0xA7907951, 0xC39E072D,
501 0x014933E0, 0xF21E9A77, 0x24594688, 0x6B5C5A9C
502 };
503
504 /* ciphertext bytes -- right halves */
505 static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = {
506 0x6198DD78, 0xB85ECB8A, 0x613063F2, 0x8B963C9D, 0x2281B096,
507 0xAFDA1EC7, 0x6198DD78, 0xC6A0A28D, 0xEB05282B, 0x250F09A0,
508 0x8BEA1DA4, 0xCF2651EB, 0x09CE8F1A, 0x4C379918, 0x8951FC98,
509 0xD69D1AE5, 0xFFD39C79, 0x3C2DA6E3, 0x5B163969, 0x24D3977B,
510 0xE4FADA8E, 0xF59B87BD, 0xB49FC019, 0x937E89A3, 0x4986ADB5,
511 0x658BC778, 0xD13EF201, 0x47B268B2, 0x08EA3CAE, 0x9FAC631D,
512 0xCDAFF6E4, 0xB71C49BC, 0x5754369A, 0x5D9E0A5A
513 };
514
515 /* plaintext bytes */
516 static const uint8_t plaintext[8] = "BLOWFISH";
517
518 static const uint8_t plaintext2[16] = "BLOWFISHBLOWFISH";
519
520 /* ciphertext bytes */
521 static const uint8_t ciphertext[8] = {
522 0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03
523 };
524
525 static const uint8_t ciphertext2[16] = {
526 0x53, 0x00, 0x40, 0x06, 0x63, 0xf2, 0x1d, 0x99,
527 0x3b, 0x9b, 0x27, 0x64, 0x46, 0xfd, 0x20, 0xc1,
528 };
529
530 #define IV "blowfish"
531
532 static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
533 const uint8_t *ref, int len, uint8_t *iv, int dir,
534 const char *test)
535 {
536 av_blowfish_crypt(ctx, dst, src, len, iv, dir);
537 if (memcmp(dst, ref, 8*len)) {
538 int i;
539 printf("%s failed\ngot ", test);
540 for (i = 0; i < 8*len; i++)
541 printf("%02x ", dst[i]);
542 printf("\nexpected ");
543 for (i = 0; i < 8*len; i++)
544 printf("%02x ", ref[i]);
545 printf("\n");
546 exit(1);
547 }
548 }
549
550 int main(void)
551 {
552 AVBlowfish ctx;
553 uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS];
554 uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS];
555 uint8_t tmp[16], iv[8];
556 int i;
557
558 av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26);
559
560 test_blowfish(&ctx, tmp, plaintext, ciphertext, 1, NULL, 0, "encryption");
561 test_blowfish(&ctx, tmp, ciphertext, plaintext, 1, NULL, 1, "decryption");
562 test_blowfish(&ctx, tmp, tmp, ciphertext, 1, NULL, 0, "Inplace encryption");
563 test_blowfish(&ctx, tmp, tmp, plaintext, 1, NULL, 1, "Inplace decryption");
564 memcpy(iv, IV, 8);
565 test_blowfish(&ctx, tmp, plaintext2, ciphertext2, 2, iv, 0, "CBC encryption");
566 memcpy(iv, IV, 8);
567 test_blowfish(&ctx, tmp, ciphertext2, plaintext2, 2, iv, 1, "CBC decryption");
568 memcpy(iv, IV, 8);
569 test_blowfish(&ctx, tmp, tmp, ciphertext2, 2, iv, 0, "Inplace CBC encryption");
570 memcpy(iv, IV, 8);
571 test_blowfish(&ctx, tmp, tmp, plaintext2, 2, iv, 1, "Inplace CBC decryption");
572
573 memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS);
574 memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS);
575
576 for (i = 0; i < NUM_VARIABLE_KEY_TESTS; i++) {
577 av_blowfish_init(&ctx, variable_key[i], 8);
578
579 av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 0);
580 if (tmptext_l[i] != ciphertext_l[i] || tmptext_r[i] != ciphertext_r[i]) {
581 printf("Test encryption failed.\n");
582 return 1;
583 }
584
585 av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 1);
586 if (tmptext_l[i] != plaintext_l[i] || tmptext_r[i] != plaintext_r[i]) {
587 printf("Test decryption failed.\n");
588 return 1;
589 }
590 }
591 printf("Test encryption/decryption success.\n");
592
593 return 0;
594 }
595
596 #endif