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