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