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