FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
blowfish.c
Go to the documentation of this file.
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 FFmpeg.
8  *
9  * FFmpeg 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  * FFmpeg 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 FFmpeg; 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 #define F(Xl, Xr, P) \
297  Xr ^=((( ctx->s[0][ Xl >> 24 ] \
298  + ctx->s[1][(Xl >> 16) & 0xFF])\
299  ^ ctx->s[2][(Xl >> 8) & 0xFF])\
300  + ctx->s[3][ Xl & 0xFF])\
301  ^ P;
302 
303 av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
304 {
305  uint32_t data, data_l, data_r;
306  int i, j, k;
307 
308  memcpy(ctx->s, orig_s, sizeof(orig_s));
309 
310  j = 0;
311  for (i = 0; i < AV_BF_ROUNDS + 2; ++i) {
312  data = 0;
313  for (k = 0; k < 4; k++) {
314  data = (data << 8) | key[j];
315  if (++j >= key_len)
316  j = 0;
317  }
318  ctx->p[i] = orig_p[i] ^ data;
319  }
320 
321  data_l = data_r = 0;
322 
323  for (i = 0; i < AV_BF_ROUNDS + 2; i += 2) {
324  av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
325  ctx->p[i] = data_l;
326  ctx->p[i + 1] = data_r;
327  }
328 
329  for (i = 0; i < 4; ++i) {
330  for (j = 0; j < 256; j += 2) {
331  av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
332  ctx->s[i][j] = data_l;
333  ctx->s[i][j + 1] = data_r;
334  }
335  }
336 }
337 
338 void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
339  int decrypt)
340 {
341  uint32_t Xl, Xr;
342  int i;
343 
344  Xl = *xl;
345  Xr = *xr;
346 
347  if (decrypt) {
348  Xl ^= ctx->p[AV_BF_ROUNDS + 1];
349  for (i = AV_BF_ROUNDS; i > 0; i-=2) {
350  F(Xl, Xr, ctx->p[i ]);
351  F(Xr, Xl, ctx->p[i-1]);
352  }
353 
354  Xr ^= ctx->p[0];
355  } else {
356  Xl ^= ctx->p[0];
357  for (i = 1; i < AV_BF_ROUNDS+1; i+=2){
358  F(Xl, Xr, ctx->p[i ]);
359  F(Xr, Xl, ctx->p[i+1]);
360  }
361 
362  Xr ^= ctx->p[AV_BF_ROUNDS + 1];
363  }
364 
365  *xl = Xr;
366  *xr = Xl;
367 }
368 
370  int count, uint8_t *iv, int decrypt)
371 {
372  uint32_t v0, v1;
373  int i;
374 
375  if (decrypt) {
376  while (count--) {
377  v0 = AV_RB32(src);
378  v1 = AV_RB32(src + 4);
379 
380  av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
381 
382  if (iv) {
383  v0 ^= AV_RB32(iv);
384  v1 ^= AV_RB32(iv + 4);
385  memcpy(iv, src, 8);
386  }
387 
388  AV_WB32(dst, v0);
389  AV_WB32(dst + 4, v1);
390 
391  src += 8;
392  dst += 8;
393  }
394  } else {
395  while (count--) {
396  if (iv) {
397  for (i = 0; i < 8; i++)
398  dst[i] = src[i] ^ iv[i];
399  v0 = AV_RB32(dst);
400  v1 = AV_RB32(dst + 4);
401  } else {
402  v0 = AV_RB32(src);
403  v1 = AV_RB32(src + 4);
404  }
405 
406  av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
407 
408  AV_WB32(dst, v0);
409  AV_WB32(dst + 4, v1);
410 
411  if (iv)
412  memcpy(iv, dst, 8);
413 
414  src += 8;
415  dst += 8;
416  }
417  }
418 }
419 
420 #ifdef TEST
421 #include <stdio.h>
422 
423 #define NUM_VARIABLE_KEY_TESTS 34
424 
425 /* plaintext bytes -- left halves */
426 static const uint32_t plaintext_l[NUM_VARIABLE_KEY_TESTS] = {
427  0x00000000, 0xFFFFFFFF, 0x10000000, 0x11111111, 0x11111111,
428  0x01234567, 0x00000000, 0x01234567, 0x01A1D6D0, 0x5CD54CA8,
429  0x0248D438, 0x51454B58, 0x42FD4430, 0x059B5E08, 0x0756D8E0,
430  0x762514B8, 0x3BDD1190, 0x26955F68, 0x164D5E40, 0x6B056E18,
431  0x004BD6EF, 0x480D3900, 0x437540C8, 0x072D43A0, 0x02FE5577,
432  0x1D9D5C50, 0x30553228, 0x01234567, 0x01234567, 0x01234567,
433  0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
434 };
435 
436 /* plaintext bytes -- right halves */
437 static const uint32_t plaintext_r[NUM_VARIABLE_KEY_TESTS] = {
438  0x00000000, 0xFFFFFFFF, 0x00000001, 0x11111111, 0x11111111,
439  0x89ABCDEF, 0x00000000, 0x89ABCDEF, 0x39776742, 0x3DEF57DA,
440  0x06F67172, 0x2DDF440A, 0x59577FA2, 0x51CF143A, 0x774761D2,
441  0x29BF486A, 0x49372802, 0x35AF609A, 0x4F275232, 0x759F5CCA,
442  0x09176062, 0x6EE762F2, 0x698F3CFA, 0x77075292, 0x8117F12A,
443  0x18F728C2, 0x6D6F295A, 0x89ABCDEF, 0x89ABCDEF, 0x89ABCDEF,
444  0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
445 };
446 
447 /* key bytes for variable key tests */
448 static const uint8_t variable_key[NUM_VARIABLE_KEY_TESTS][8] = {
449  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
450  { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
451  { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
452  { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
453  { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
454  { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
455  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
456  { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
457  { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
458  { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E },
459  { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 },
460  { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E },
461  { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 },
462  { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE },
463  { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 },
464  { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE },
465  { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 },
466  { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F },
467  { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 },
468  { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E },
469  { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 },
470  { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 },
471  { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F },
472  { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 },
473  { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF },
474  { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 },
475  { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF },
476  { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
477  { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
478  { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
479  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
480  { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
481  { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
482  { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
483 };
484 
485 /* ciphertext bytes -- left halves */
486 static const uint32_t ciphertext_l[NUM_VARIABLE_KEY_TESTS] = {
487  0x4EF99745, 0x51866FD5, 0x7D856F9A, 0x2466DD87, 0x61F9C380,
488  0x7D0CC630, 0x4EF99745, 0x0ACEAB0F, 0x59C68245, 0xB1B8CC0B,
489  0x1730E577, 0xA25E7856, 0x353882B1, 0x48F4D088, 0x432193B7,
490  0x13F04154, 0x2EEDDA93, 0xD887E039, 0x5F99D04F, 0x4A057A3B,
491  0x452031C1, 0x7555AE39, 0x53C55F9C, 0x7A8E7BFA, 0xCF9C5D7A,
492  0xD1ABB290, 0x55CB3774, 0xFA34EC48, 0xA7907951, 0xC39E072D,
493  0x014933E0, 0xF21E9A77, 0x24594688, 0x6B5C5A9C
494 };
495 
496 /* ciphertext bytes -- right halves */
497 static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = {
498  0x6198DD78, 0xB85ECB8A, 0x613063F2, 0x8B963C9D, 0x2281B096,
499  0xAFDA1EC7, 0x6198DD78, 0xC6A0A28D, 0xEB05282B, 0x250F09A0,
500  0x8BEA1DA4, 0xCF2651EB, 0x09CE8F1A, 0x4C379918, 0x8951FC98,
501  0xD69D1AE5, 0xFFD39C79, 0x3C2DA6E3, 0x5B163969, 0x24D3977B,
502  0xE4FADA8E, 0xF59B87BD, 0xB49FC019, 0x937E89A3, 0x4986ADB5,
503  0x658BC778, 0xD13EF201, 0x47B268B2, 0x08EA3CAE, 0x9FAC631D,
504  0xCDAFF6E4, 0xB71C49BC, 0x5754369A, 0x5D9E0A5A
505 };
506 
507 /* plaintext bytes */
508 static const uint8_t plaintext[8] = "BLOWFISH";
509 
510 static const uint8_t plaintext2[16] = "BLOWFISHBLOWFISH";
511 
512 /* ciphertext bytes */
513 static const uint8_t ciphertext[8] = {
514  0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03
515 };
516 
517 static const uint8_t ciphertext2[16] = {
518  0x53, 0x00, 0x40, 0x06, 0x63, 0xf2, 0x1d, 0x99,
519  0x3b, 0x9b, 0x27, 0x64, 0x46, 0xfd, 0x20, 0xc1,
520 };
521 
522 #define IV "blowfish"
523 
524 static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
525  const uint8_t *ref, int len, uint8_t *iv, int dir,
526  const char *test)
527 {
528  av_blowfish_crypt(ctx, dst, src, len, iv, dir);
529  if (memcmp(dst, ref, 8*len)) {
530  int i;
531  printf("%s failed\ngot ", test);
532  for (i = 0; i < 8*len; i++)
533  printf("%02x ", dst[i]);
534  printf("\nexpected ");
535  for (i = 0; i < 8*len; i++)
536  printf("%02x ", ref[i]);
537  printf("\n");
538  exit(1);
539  }
540 }
541 
542 int main(void)
543 {
544  AVBlowfish ctx;
545  uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS];
546  uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS];
547  uint8_t tmp[16], iv[8];
548  int i;
549 
550  av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26);
551 
552  test_blowfish(&ctx, tmp, plaintext, ciphertext, 1, NULL, 0, "encryption");
553  test_blowfish(&ctx, tmp, ciphertext, plaintext, 1, NULL, 1, "decryption");
554  test_blowfish(&ctx, tmp, tmp, ciphertext, 1, NULL, 0, "Inplace encryption");
555  test_blowfish(&ctx, tmp, tmp, plaintext, 1, NULL, 1, "Inplace decryption");
556  memcpy(iv, IV, 8);
557  test_blowfish(&ctx, tmp, plaintext2, ciphertext2, 2, iv, 0, "CBC encryption");
558  memcpy(iv, IV, 8);
559  test_blowfish(&ctx, tmp, ciphertext2, plaintext2, 2, iv, 1, "CBC decryption");
560  memcpy(iv, IV, 8);
561  test_blowfish(&ctx, tmp, tmp, ciphertext2, 2, iv, 0, "Inplace CBC encryption");
562  memcpy(iv, IV, 8);
563  test_blowfish(&ctx, tmp, tmp, plaintext2, 2, iv, 1, "Inplace CBC decryption");
564 
565  memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS);
566  memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS);
567 
568  for (i = 0; i < NUM_VARIABLE_KEY_TESTS; i++) {
569  av_blowfish_init(&ctx, variable_key[i], 8);
570 
571  av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 0);
572  if (tmptext_l[i] != ciphertext_l[i] || tmptext_r[i] != ciphertext_r[i]) {
573  printf("Test encryption failed.\n");
574  return 1;
575  }
576 
577  av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 1);
578  if (tmptext_l[i] != plaintext_l[i] || tmptext_r[i] != plaintext_r[i]) {
579  printf("Test decryption failed.\n");
580  return 1;
581  }
582  }
583  printf("Test encryption/decryption success.\n");
584 
585  return 0;
586 }
587 
588 #endif