FFmpeg
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 <string.h>
25 
26 #include "attributes.h"
27 #include "intreadwrite.h"
28 #include "mem.h"
29 #include "blowfish.h"
30 
31 static 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 
39 static 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 
306 {
307  return av_mallocz(sizeof(struct AVBlowfish));
308 }
309 
310 av_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 
345 void 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 
376 void 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 }
orig_s
static const uint32_t orig_s[4][256]
Definition: blowfish.c:39
data
const char data[16]
Definition: mxf.c:148
av_cold
#define av_cold
Definition: attributes.h:90
intreadwrite.h
av_blowfish_alloc
AVBlowfish * av_blowfish_alloc(void)
Allocate an AVBlowfish context.
Definition: blowfish.c:305
ctx
AVFormatContext * ctx
Definition: movenc.c:49
key
const char * key
Definition: hwcontext_opencl.c:189
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:415
blowfish.h
av_blowfish_crypt
void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt)
Encrypt or decrypt a buffer using a previously initialized context.
Definition: blowfish.c:376
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
AV_BF_ROUNDS
#define AV_BF_ROUNDS
Definition: blowfish.h:33
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
attributes.h
AVBlowfish
Definition: blowfish.h:35
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
orig_p
static const uint32_t orig_p[AV_BF_ROUNDS+2]
Definition: blowfish.c:31
F
#define F(Xl, Xr, P)
Definition: blowfish.c:298
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
av_blowfish_crypt_ecb
void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, int decrypt)
Encrypt or decrypt a buffer using a previously initialized context.
Definition: blowfish.c:345
mem.h
av_blowfish_init
av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
Initialize an AVBlowfish context.
Definition: blowfish.c:310
src
#define src
Definition: vp8dsp.c:248