3 * Copyright (c) 2012 Samuel Pitoiset
5 * loosely based on Paul Kocher's implementation
7 * This file is part of FFmpeg.
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.
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.
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
26 #include "intreadwrite.h"
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
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 }
296 #define F(Xl, Xr, P) \
297 Xr ^=((( ctx->s[0][ Xl >> 24 ] \
298 + ctx->s[1][(Xl >> 16) & 0xFF])\
299 ^ ctx->s[2][(Xl >> 8) & 0xFF])\
300 + ctx->s[3][ Xl & 0xFF])\
303 av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
305 uint32_t data, data_l, data_r;
308 memcpy(ctx->s, orig_s, sizeof(orig_s));
311 for (i = 0; i < AV_BF_ROUNDS + 2; ++i) {
313 for (k = 0; k < 4; k++) {
314 data = (data << 8) | key[j];
318 ctx->p[i] = orig_p[i] ^ data;
323 for (i = 0; i < AV_BF_ROUNDS + 2; i += 2) {
324 av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
326 ctx->p[i + 1] = data_r;
329 for (i = 0; i < 4; ++i) {
330 for (j = 0; j < 256; j += 2) {
331 av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0);
332 ctx->s[i][j] = data_l;
333 ctx->s[i][j + 1] = data_r;
338 void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
348 Xl ^= ctx->p[AV_BF_ROUNDS + 1];
349 for (i = AV_BF_ROUNDS; i > 0; i-=2) {
350 F(Xl, Xr, ctx->p[i ]);
351 F(Xr, Xl, ctx->p[i-1]);
357 for (i = 1; i < AV_BF_ROUNDS+1; i+=2){
358 F(Xl, Xr, ctx->p[i ]);
359 F(Xr, Xl, ctx->p[i+1]);
362 Xr ^= ctx->p[AV_BF_ROUNDS + 1];
369 void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
370 int count, uint8_t *iv, int decrypt)
378 v1 = AV_RB32(src + 4);
380 av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
384 v1 ^= AV_RB32(iv + 4);
389 AV_WB32(dst + 4, v1);
397 for (i = 0; i < 8; i++)
398 dst[i] = src[i] ^ iv[i];
400 v1 = AV_RB32(dst + 4);
403 v1 = AV_RB32(src + 4);
406 av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
409 AV_WB32(dst + 4, v1);
423 #define NUM_VARIABLE_KEY_TESTS 34
425 /* plaintext bytes -- left halves */
426 static const uint32_t plaintext_l[NUM_VARIABLE_KEY_TESTS] = {
427 0x00000000, 0xFFFFFFFF, 0x10000000, 0x11111111, 0x11111111,
428 0x01234567, 0x00000000, 0x01234567, 0x01A1D6D0, 0x5CD54CA8,
429 0x0248D438, 0x51454B58, 0x42FD4430, 0x059B5E08, 0x0756D8E0,
430 0x762514B8, 0x3BDD1190, 0x26955F68, 0x164D5E40, 0x6B056E18,
431 0x004BD6EF, 0x480D3900, 0x437540C8, 0x072D43A0, 0x02FE5577,
432 0x1D9D5C50, 0x30553228, 0x01234567, 0x01234567, 0x01234567,
433 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
436 /* plaintext bytes -- right halves */
437 static const uint32_t plaintext_r[NUM_VARIABLE_KEY_TESTS] = {
438 0x00000000, 0xFFFFFFFF, 0x00000001, 0x11111111, 0x11111111,
439 0x89ABCDEF, 0x00000000, 0x89ABCDEF, 0x39776742, 0x3DEF57DA,
440 0x06F67172, 0x2DDF440A, 0x59577FA2, 0x51CF143A, 0x774761D2,
441 0x29BF486A, 0x49372802, 0x35AF609A, 0x4F275232, 0x759F5CCA,
442 0x09176062, 0x6EE762F2, 0x698F3CFA, 0x77075292, 0x8117F12A,
443 0x18F728C2, 0x6D6F295A, 0x89ABCDEF, 0x89ABCDEF, 0x89ABCDEF,
444 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
447 /* key bytes for variable key tests */
448 static const uint8_t variable_key[NUM_VARIABLE_KEY_TESTS][8] = {
449 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
450 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
451 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
452 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
453 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
454 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
455 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
456 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
457 { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
458 { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E },
459 { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 },
460 { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E },
461 { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 },
462 { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE },
463 { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 },
464 { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE },
465 { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 },
466 { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F },
467 { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 },
468 { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E },
469 { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 },
470 { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 },
471 { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F },
472 { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 },
473 { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF },
474 { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 },
475 { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF },
476 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
477 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
478 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
479 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
480 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
481 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
482 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
485 /* ciphertext bytes -- left halves */
486 static const uint32_t ciphertext_l[NUM_VARIABLE_KEY_TESTS] = {
487 0x4EF99745, 0x51866FD5, 0x7D856F9A, 0x2466DD87, 0x61F9C380,
488 0x7D0CC630, 0x4EF99745, 0x0ACEAB0F, 0x59C68245, 0xB1B8CC0B,
489 0x1730E577, 0xA25E7856, 0x353882B1, 0x48F4D088, 0x432193B7,
490 0x13F04154, 0x2EEDDA93, 0xD887E039, 0x5F99D04F, 0x4A057A3B,
491 0x452031C1, 0x7555AE39, 0x53C55F9C, 0x7A8E7BFA, 0xCF9C5D7A,
492 0xD1ABB290, 0x55CB3774, 0xFA34EC48, 0xA7907951, 0xC39E072D,
493 0x014933E0, 0xF21E9A77, 0x24594688, 0x6B5C5A9C
496 /* ciphertext bytes -- right halves */
497 static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = {
498 0x6198DD78, 0xB85ECB8A, 0x613063F2, 0x8B963C9D, 0x2281B096,
499 0xAFDA1EC7, 0x6198DD78, 0xC6A0A28D, 0xEB05282B, 0x250F09A0,
500 0x8BEA1DA4, 0xCF2651EB, 0x09CE8F1A, 0x4C379918, 0x8951FC98,
501 0xD69D1AE5, 0xFFD39C79, 0x3C2DA6E3, 0x5B163969, 0x24D3977B,
502 0xE4FADA8E, 0xF59B87BD, 0xB49FC019, 0x937E89A3, 0x4986ADB5,
503 0x658BC778, 0xD13EF201, 0x47B268B2, 0x08EA3CAE, 0x9FAC631D,
504 0xCDAFF6E4, 0xB71C49BC, 0x5754369A, 0x5D9E0A5A
507 /* plaintext bytes */
508 static const uint8_t plaintext[8] = "BLOWFISH";
510 static const uint8_t plaintext2[16] = "BLOWFISHBLOWFISH";
512 /* ciphertext bytes */
513 static const uint8_t ciphertext[8] = {
514 0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03
517 static const uint8_t ciphertext2[16] = {
518 0x53, 0x00, 0x40, 0x06, 0x63, 0xf2, 0x1d, 0x99,
519 0x3b, 0x9b, 0x27, 0x64, 0x46, 0xfd, 0x20, 0xc1,
522 #define IV "blowfish"
524 static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
525 const uint8_t *ref, int len, uint8_t *iv, int dir,
528 av_blowfish_crypt(ctx, dst, src, len, iv, dir);
529 if (memcmp(dst, ref, 8*len)) {
531 printf("%s failed\ngot ", test);
532 for (i = 0; i < 8*len; i++)
533 printf("%02x ", dst[i]);
534 printf("\nexpected ");
535 for (i = 0; i < 8*len; i++)
536 printf("%02x ", ref[i]);
545 uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS];
546 uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS];
547 uint8_t tmp[16], iv[8];
550 av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26);
552 test_blowfish(&ctx, tmp, plaintext, ciphertext, 1, NULL, 0, "encryption");
553 test_blowfish(&ctx, tmp, ciphertext, plaintext, 1, NULL, 1, "decryption");
554 test_blowfish(&ctx, tmp, tmp, ciphertext, 1, NULL, 0, "Inplace encryption");
555 test_blowfish(&ctx, tmp, tmp, plaintext, 1, NULL, 1, "Inplace decryption");
557 test_blowfish(&ctx, tmp, plaintext2, ciphertext2, 2, iv, 0, "CBC encryption");
559 test_blowfish(&ctx, tmp, ciphertext2, plaintext2, 2, iv, 1, "CBC decryption");
561 test_blowfish(&ctx, tmp, tmp, ciphertext2, 2, iv, 0, "Inplace CBC encryption");
563 test_blowfish(&ctx, tmp, tmp, plaintext2, 2, iv, 1, "Inplace CBC decryption");
565 memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS);
566 memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS);
568 for (i = 0; i < NUM_VARIABLE_KEY_TESTS; i++) {
569 av_blowfish_init(&ctx, variable_key[i], 8);
571 av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 0);
572 if (tmptext_l[i] != ciphertext_l[i] || tmptext_r[i] != ciphertext_r[i]) {
573 printf("Test encryption failed.\n");
577 av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 1);
578 if (tmptext_l[i] != plaintext_l[i] || tmptext_r[i] != plaintext_r[i]) {
579 printf("Test decryption failed.\n");
583 printf("Test encryption/decryption success.\n");