lavu: Rename ycgco color space appropriately
[ffmpeg.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 "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 static void F(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, int i)
307 {
308     uint32_t Xl, Xr;
309     uint32_t y;
310
311     Xl = *xl;
312     Xr = *xr;
313
314     Xl ^= ctx->p[i];
315     y   = ctx->s[0][(Xl >> 24) & 0xFF];
316     y  += ctx->s[1][(Xl >> 16) & 0xFF];
317     y  ^= ctx->s[2][(Xl >>  8) & 0xFF];
318     y  += ctx->s[3][ Xl        & 0xFF];
319     Xr ^= y;
320
321     *xl = Xr;
322     *xr = Xl;
323 }
324
325 AVBlowfish *av_blowfish_alloc(void)
326 {
327     return av_mallocz(sizeof(struct AVBlowfish));
328 }
329
330 av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
331 {
332     uint32_t data, data_l, data_r;
333     int i, j, k;
334
335     memcpy(ctx->s, orig_s, sizeof(orig_s));
336
337     j = 0;
338     for (i = 0; i < AV_BF_ROUNDS + 2; ++i) {
339         data = 0;
340         for (k = 0; k < 4; k++) {
341             data = (data << 8) | key[j];
342             if (++j >= key_len)
343                 j = 0;
344         }
345         ctx->p[i] = orig_p[i] ^ data;
346     }
347
348     data_l = data_r = 0;
349
350     for (i = 0; i < AV_BF_ROUNDS + 2; i += 2) {
351         av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
352         ctx->p[i]     = data_l;
353         ctx->p[i + 1] = data_r;
354     }
355
356     for (i = 0; i < 4; ++i) {
357         for (j = 0; j < 256; j += 2) {
358             av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
359             ctx->s[i][j]     = data_l;
360             ctx->s[i][j + 1] = data_r;
361         }
362     }
363 }
364
365 void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
366                            int decrypt)
367 {
368     uint32_t Xl, Xr;
369     int i;
370
371     Xl = *xl;
372     Xr = *xr;
373
374     if (decrypt) {
375         for (i = AV_BF_ROUNDS + 1; i > 1; --i)
376             F(ctx, &Xl, &Xr, i);
377
378         Xl = Xl ^ ctx->p[1];
379         Xr = Xr ^ ctx->p[0];
380     } else {
381         for (i = 0; i < AV_BF_ROUNDS; ++i)
382             F(ctx, &Xl, &Xr, i);
383
384         Xl = Xl ^ ctx->p[AV_BF_ROUNDS];
385         Xr = Xr ^ ctx->p[AV_BF_ROUNDS + 1];
386     }
387
388     *xl = Xr;
389     *xr = Xl;
390 }
391
392 void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
393                        int count, uint8_t *iv, int decrypt)
394 {
395     uint32_t v0, v1;
396     int i;
397
398     if (decrypt) {
399         while (count--) {
400             v0 = AV_RB32(src);
401             v1 = AV_RB32(src + 4);
402
403             av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
404
405             if (iv) {
406                 v0 ^= AV_RB32(iv);
407                 v1 ^= AV_RB32(iv + 4);
408                 memcpy(iv, src, 8);
409             }
410
411             AV_WB32(dst, v0);
412             AV_WB32(dst + 4, v1);
413
414             src   += 8;
415             dst   += 8;
416         }
417     } else {
418         while (count--) {
419             if (iv) {
420                 for (i = 0; i < 8; i++)
421                     dst[i] = src[i] ^ iv[i];
422                 v0 = AV_RB32(dst);
423                 v1 = AV_RB32(dst + 4);
424             } else {
425                 v0 = AV_RB32(src);
426                 v1 = AV_RB32(src + 4);
427             }
428
429             av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
430
431             AV_WB32(dst, v0);
432             AV_WB32(dst + 4, v1);
433
434             if (iv)
435                 memcpy(iv, dst, 8);
436
437             src   += 8;
438             dst   += 8;
439         }
440     }
441 }