xref: /linux/drivers/isdn/mISDN/dsp_blowfish.c (revision 955abe0a1b41de5ba61fe4cd614ebc123084d499)
1 /*
2  * Blowfish encryption/decryption for mISDN_dsp.
3  *
4  * Copyright Andreas Eversberg (jolly@eversberg.eu)
5  *
6  * This software may be used and distributed according to the terms
7  * of the GNU General Public License, incorporated herein by reference.
8  *
9  */
10 
11 #include <linux/mISDNif.h>
12 #include <linux/mISDNdsp.h>
13 #include "core.h"
14 #include "dsp.h"
15 
16 /*
17  * how to encode a sample stream to 64-bit blocks that will be encryped
18  *
19  * first of all, data is collected until a block of 9 samples are received.
20  * of course, a packet may have much more than 9 sample, but is may have
21  * not excacly the multiple of 9 samples. if there is a rest, the next
22  * received data will complete the block.
23  *
24  * the block is then converted to 9 uLAW samples without the least sigificant
25  * bit. the result is a 7-bit encoded sample.
26  *
27  * the samples will be reoganised to form 8 bytes of data:
28  * (5(6) means: encoded sample no. 5, bit 6)
29  *
30  * 0(6) 0(5) 0(4) 0(3) 0(2) 0(1) 0(0) 1(6)
31  * 1(5) 1(4) 1(3) 1(2) 1(1) 1(0) 2(6) 2(5)
32  * 2(4) 2(3) 2(2) 2(1) 2(0) 3(6) 3(5) 3(4)
33  * 3(3) 3(2) 3(1) 3(0) 4(6) 4(5) 4(4) 4(3)
34  * 4(2) 4(1) 4(0) 5(6) 5(5) 5(4) 5(3) 5(2)
35  * 5(1) 5(0) 6(6) 6(5) 6(4) 6(3) 6(2) 6(1)
36  * 6(0) 7(6) 7(5) 7(4) 7(3) 7(2) 7(1) 7(0)
37  * 8(6) 8(5) 8(4) 8(3) 8(2) 8(1) 8(0)
38  *
39  * the missing bit 0 of the last byte is filled with some
40  * random noise, to fill all 8 bytes.
41  *
42  * the 8 bytes will be encrypted using blowfish.
43  *
44  * the result will be converted into 9 bytes. the bit 7 is used for
45  * checksumme (CS) for sync (0, 1) and for the last bit:
46  * (5(6) means: crypted byte 5, bit 6)
47  *
48  * 1    0(7) 0(6) 0(5) 0(4) 0(3) 0(2) 0(1)
49  * 0    0(0) 1(7) 1(6) 1(5) 1(4) 1(3) 1(2)
50  * 0    1(1) 1(0) 2(7) 2(6) 2(5) 2(4) 2(3)
51  * 0    2(2) 2(1) 2(0) 3(7) 3(6) 3(5) 3(4)
52  * 0    3(3) 3(2) 3(1) 3(0) 4(7) 4(6) 4(5)
53  * CS   4(4) 4(3) 4(2) 4(1) 4(0) 5(7) 5(6)
54  * CS   5(5) 5(4) 5(3) 5(2) 5(1) 5(0) 6(7)
55  * CS   6(6) 6(5) 6(4) 6(3) 6(2) 6(1) 6(0)
56  * 7(0) 7(6) 7(5) 7(4) 7(3) 7(2) 7(1) 7(0)
57  *
58  * the checksum is used to detect transmission errors and frame drops.
59  *
60  * synchronisation of received block is done by shifting the upper bit of each
61  * byte (bit 7) to a shift register. if the rigister has the first five bits
62  * (10000), this is used to find the sync. only if sync has been found, the
63  * current block of 9 received bytes are decrypted. before that the check
64  * sum is calculated. if it is incorrect the block is dropped.
65  * this will avoid loud noise due to corrupt encrypted data.
66  *
67  * if the last block is corrupt, the current decoded block is repeated
68  * until a valid block has been received.
69  */
70 
71 /*
72  *  some blowfish parts are taken from the
73  * crypto-api for faster implementation
74  */
75 
76 static const u32 bf_pbox[16 + 2] = {
77 	0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
78 	0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
79 	0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
80 	0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
81 	0x9216d5d9, 0x8979fb1b,
82 };
83 
84 static const u32 bf_sbox[256 * 4] = {
85 	0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
86 	0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
87 	0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
88 	0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
89 	0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
90 	0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
91 	0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
92 	0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
93 	0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
94 	0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
95 	0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
96 	0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
97 	0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
98 	0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
99 	0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
100 	0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
101 	0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
102 	0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
103 	0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
104 	0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
105 	0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
106 	0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
107 	0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
108 	0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
109 	0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
110 	0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
111 	0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
112 	0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
113 	0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
114 	0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
115 	0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
116 	0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
117 	0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
118 	0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
119 	0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
120 	0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
121 	0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
122 	0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
123 	0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
124 	0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
125 	0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
126 	0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
127 	0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
128 	0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
129 	0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
130 	0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
131 	0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
132 	0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
133 	0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
134 	0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
135 	0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
136 	0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
137 	0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
138 	0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
139 	0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
140 	0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
141 	0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
142 	0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
143 	0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
144 	0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
145 	0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
146 	0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
147 	0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
148 	0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
149 	0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
150 	0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
151 	0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
152 	0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
153 	0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
154 	0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
155 	0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
156 	0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
157 	0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
158 	0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
159 	0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
160 	0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
161 	0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
162 	0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
163 	0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
164 	0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
165 	0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
166 	0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
167 	0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
168 	0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
169 	0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
170 	0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
171 	0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
172 	0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
173 	0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
174 	0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
175 	0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
176 	0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
177 	0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
178 	0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
179 	0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
180 	0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
181 	0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
182 	0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
183 	0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
184 	0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
185 	0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
186 	0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
187 	0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
188 	0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
189 	0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
190 	0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
191 	0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
192 	0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
193 	0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
194 	0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
195 	0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
196 	0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
197 	0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
198 	0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
199 	0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
200 	0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
201 	0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
202 	0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
203 	0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
204 	0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
205 	0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
206 	0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
207 	0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
208 	0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
209 	0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
210 	0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
211 	0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
212 	0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
213 	0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
214 	0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
215 	0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
216 	0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
217 	0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
218 	0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
219 	0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
220 	0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
221 	0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
222 	0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
223 	0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
224 	0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
225 	0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
226 	0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
227 	0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
228 	0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
229 	0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
230 	0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
231 	0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
232 	0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
233 	0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
234 	0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
235 	0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
236 	0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
237 	0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
238 	0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
239 	0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
240 	0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
241 	0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
242 	0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
243 	0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
244 	0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
245 	0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
246 	0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
247 	0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
248 	0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
249 	0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
250 	0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
251 	0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
252 	0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
253 	0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
254 	0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
255 	0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
256 	0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
257 	0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
258 	0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
259 	0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
260 	0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
261 	0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
262 	0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
263 	0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
264 	0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
265 	0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
266 	0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
267 	0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
268 	0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
269 	0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
270 	0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
271 	0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
272 	0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
273 	0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
274 	0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
275 	0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
276 	0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
277 	0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
278 	0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
279 	0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
280 	0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
281 	0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
282 	0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
283 	0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
284 	0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
285 	0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
286 	0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
287 	0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
288 	0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
289 	0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
290 	0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
291 	0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
292 	0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
293 	0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
294 	0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
295 	0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
296 	0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
297 	0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
298 	0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
299 	0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
300 	0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
301 	0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
302 	0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
303 	0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
304 	0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
305 	0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
306 	0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
307 	0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
308 	0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
309 	0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
310 	0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
311 	0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
312 	0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
313 	0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
314 	0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
315 	0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
316 	0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
317 	0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
318 	0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
319 	0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
320 	0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
321 	0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
322 	0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
323 	0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
324 	0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
325 	0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
326 	0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
327 	0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
328 	0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
329 	0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
330 	0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
331 	0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
332 	0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
333 	0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
334 	0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
335 	0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
336 	0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
337 	0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
338 	0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
339 	0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
340 	0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
341 };
342 
343 /*
344  * Round loop unrolling macros, S is a pointer to a S-Box array
345  * organized in 4 unsigned longs at a row.
346  */
347 #define GET32_3(x) (((x) & 0xff))
348 #define GET32_2(x) (((x) >> (8)) & (0xff))
349 #define GET32_1(x) (((x) >> (16)) & (0xff))
350 #define GET32_0(x) (((x) >> (24)) & (0xff))
351 
352 #define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^	\
353 		  S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
354 
355 #define EROUND(a, b, n)  do { b ^= P[n]; a ^= bf_F(b); } while (0)
356 #define DROUND(a, b, n)  do { a ^= bf_F(b); b ^= P[n]; } while (0)
357 
358 
359 /*
360  * encrypt isdn data frame
361  * every block with 9 samples is encrypted
362  */
363 void
364 dsp_bf_encrypt(struct dsp *dsp, u8 *data, int len)
365 {
366 	int i = 0, j = dsp->bf_crypt_pos;
367 	u8 *bf_data_in = dsp->bf_data_in;
368 	u8 *bf_crypt_out = dsp->bf_crypt_out;
369 	u32 *P = dsp->bf_p;
370 	u32 *S = dsp->bf_s;
371 	u32 yl, yr;
372 	u32 cs;
373 	u8 nibble;
374 
375 	while (i < len) {
376 		/* collect a block of 9 samples */
377 		if (j < 9) {
378 			bf_data_in[j] = *data;
379 			*data++ = bf_crypt_out[j++];
380 			i++;
381 			continue;
382 		}
383 		j = 0;
384 		/* transcode 9 samples xlaw to 8 bytes */
385 		yl = dsp_audio_law2seven[bf_data_in[0]];
386 		yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[1]];
387 		yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[2]];
388 		yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[3]];
389 		nibble = dsp_audio_law2seven[bf_data_in[4]];
390 		yr = nibble;
391 		yl = (yl << 4) | (nibble >> 3);
392 		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[5]];
393 		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[6]];
394 		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[7]];
395 		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[8]];
396 		yr = (yr << 1) | (bf_data_in[0] & 1);
397 
398 		/* fill unused bit with random noise of audio input */
399 		/* encrypt */
400 
401 		EROUND(yr, yl, 0);
402 		EROUND(yl, yr, 1);
403 		EROUND(yr, yl, 2);
404 		EROUND(yl, yr, 3);
405 		EROUND(yr, yl, 4);
406 		EROUND(yl, yr, 5);
407 		EROUND(yr, yl, 6);
408 		EROUND(yl, yr, 7);
409 		EROUND(yr, yl, 8);
410 		EROUND(yl, yr, 9);
411 		EROUND(yr, yl, 10);
412 		EROUND(yl, yr, 11);
413 		EROUND(yr, yl, 12);
414 		EROUND(yl, yr, 13);
415 		EROUND(yr, yl, 14);
416 		EROUND(yl, yr, 15);
417 		yl ^= P[16];
418 		yr ^= P[17];
419 
420 		/* calculate 3-bit checksumme */
421 		cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
422 			^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
423 			^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
424 			^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
425 			^ (yr >> 28) ^ (yr >> 31);
426 
427 		/*
428 		 * transcode 8 crypted bytes to 9 data bytes with sync
429 		 * and checksum information
430 		 */
431 		bf_crypt_out[0] = (yl >> 25) | 0x80;
432 		bf_crypt_out[1] = (yl >> 18) & 0x7f;
433 		bf_crypt_out[2] = (yl >> 11) & 0x7f;
434 		bf_crypt_out[3] = (yl >> 4) & 0x7f;
435 		bf_crypt_out[4] = ((yl << 3) & 0x78) | ((yr >> 29) & 0x07);
436 		bf_crypt_out[5] = ((yr >> 22) & 0x7f) | ((cs << 5) & 0x80);
437 		bf_crypt_out[6] = ((yr >> 15) & 0x7f) | ((cs << 6) & 0x80);
438 		bf_crypt_out[7] = ((yr >> 8) & 0x7f) | (cs << 7);
439 		bf_crypt_out[8] = yr;
440 	}
441 
442 	/* write current count */
443 	dsp->bf_crypt_pos = j;
444 
445 }
446 
447 
448 /*
449  * decrypt isdn data frame
450  * every block with 9 bytes is decrypted
451  */
452 void
453 dsp_bf_decrypt(struct dsp *dsp, u8 *data, int len)
454 {
455 	int i = 0;
456 	u8 j = dsp->bf_decrypt_in_pos;
457 	u8 k = dsp->bf_decrypt_out_pos;
458 	u8 *bf_crypt_inring = dsp->bf_crypt_inring;
459 	u8 *bf_data_out = dsp->bf_data_out;
460 	u16 sync = dsp->bf_sync;
461 	u32 *P = dsp->bf_p;
462 	u32 *S = dsp->bf_s;
463 	u32 yl, yr;
464 	u8 nibble;
465 	u8 cs, cs0, cs1, cs2;
466 
467 	while (i < len) {
468 		/*
469 		 * shift upper bit and rotate data to buffer ring
470 		 * send current decrypted data
471 		 */
472 		sync = (sync << 1) | ((*data) >> 7);
473 		bf_crypt_inring[j++ & 15] = *data;
474 		*data++ = bf_data_out[k++];
475 		i++;
476 		if (k == 9)
477 			k = 0; /* repeat if no sync has been found */
478 		/* check if not in sync */
479 		if ((sync & 0x1f0) != 0x100)
480 			continue;
481 		j -= 9;
482 		/* transcode receive data to 64 bit block of encrypted data */
483 		yl = bf_crypt_inring[j++ & 15];
484 		yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
485 		yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
486 		yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
487 		nibble = bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
488 		yr = nibble;
489 		yl = (yl << 4) | (nibble >> 3);
490 		cs2 = bf_crypt_inring[j++ & 15];
491 		yr = (yr << 7) | (cs2 & 0x7f);
492 		cs1 = bf_crypt_inring[j++ & 15];
493 		yr = (yr << 7) | (cs1 & 0x7f);
494 		cs0 = bf_crypt_inring[j++ & 15];
495 		yr = (yr << 7) | (cs0 & 0x7f);
496 		yr = (yr << 8) | bf_crypt_inring[j++ & 15];
497 
498 		/* calculate 3-bit checksumme */
499 		cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
500 			^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
501 			^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
502 			^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
503 			^ (yr >> 28) ^ (yr >> 31);
504 
505 		/* check if frame is valid */
506 		if ((cs & 0x7) != (((cs2 >> 5) & 4) | ((cs1 >> 6) & 2) | (cs0 >> 7))) {
507 			if (dsp_debug & DEBUG_DSP_BLOWFISH)
508 				printk(KERN_DEBUG
509 				       "DSP BLOWFISH: received corrupt frame, "
510 				       "checksumme is not correct\n");
511 			continue;
512 		}
513 
514 		/* decrypt */
515 		yr ^= P[17];
516 		yl ^= P[16];
517 		DROUND(yl, yr, 15);
518 		DROUND(yr, yl, 14);
519 		DROUND(yl, yr, 13);
520 		DROUND(yr, yl, 12);
521 		DROUND(yl, yr, 11);
522 		DROUND(yr, yl, 10);
523 		DROUND(yl, yr, 9);
524 		DROUND(yr, yl, 8);
525 		DROUND(yl, yr, 7);
526 		DROUND(yr, yl, 6);
527 		DROUND(yl, yr, 5);
528 		DROUND(yr, yl, 4);
529 		DROUND(yl, yr, 3);
530 		DROUND(yr, yl, 2);
531 		DROUND(yl, yr, 1);
532 		DROUND(yr, yl, 0);
533 
534 		/* transcode 8 crypted bytes to 9 sample bytes */
535 		bf_data_out[0] = dsp_audio_seven2law[(yl >> 25) & 0x7f];
536 		bf_data_out[1] = dsp_audio_seven2law[(yl >> 18) & 0x7f];
537 		bf_data_out[2] = dsp_audio_seven2law[(yl >> 11) & 0x7f];
538 		bf_data_out[3] = dsp_audio_seven2law[(yl >> 4) & 0x7f];
539 		bf_data_out[4] = dsp_audio_seven2law[((yl << 3) & 0x78) |
540 						     ((yr >> 29) & 0x07)];
541 
542 		bf_data_out[5] = dsp_audio_seven2law[(yr >> 22) & 0x7f];
543 		bf_data_out[6] = dsp_audio_seven2law[(yr >> 15) & 0x7f];
544 		bf_data_out[7] = dsp_audio_seven2law[(yr >> 8) & 0x7f];
545 		bf_data_out[8] = dsp_audio_seven2law[(yr >> 1) & 0x7f];
546 		k = 0; /* start with new decoded frame */
547 	}
548 
549 	/* write current count and sync */
550 	dsp->bf_decrypt_in_pos = j;
551 	dsp->bf_decrypt_out_pos = k;
552 	dsp->bf_sync = sync;
553 }
554 
555 
556 /* used to encrypt S and P boxes */
557 static inline void
558 encrypt_block(const u32 *P, const u32 *S, u32 *dst, u32 *src)
559 {
560 	u32 yl = src[0];
561 	u32 yr = src[1];
562 
563 	EROUND(yr, yl, 0);
564 	EROUND(yl, yr, 1);
565 	EROUND(yr, yl, 2);
566 	EROUND(yl, yr, 3);
567 	EROUND(yr, yl, 4);
568 	EROUND(yl, yr, 5);
569 	EROUND(yr, yl, 6);
570 	EROUND(yl, yr, 7);
571 	EROUND(yr, yl, 8);
572 	EROUND(yl, yr, 9);
573 	EROUND(yr, yl, 10);
574 	EROUND(yl, yr, 11);
575 	EROUND(yr, yl, 12);
576 	EROUND(yl, yr, 13);
577 	EROUND(yr, yl, 14);
578 	EROUND(yl, yr, 15);
579 
580 	yl ^= P[16];
581 	yr ^= P[17];
582 
583 	dst[0] = yr;
584 	dst[1] = yl;
585 }
586 
587 /*
588  * initialize the dsp for encryption and decryption using the same key
589  * Calculates the blowfish S and P boxes for encryption and decryption.
590  * The margin of keylen must be 4-56 bytes.
591  * returns 0 if ok.
592  */
593 int
594 dsp_bf_init(struct dsp *dsp, const u8 *key, uint keylen)
595 {
596 	short i, j, count;
597 	u32 data[2], temp;
598 	u32 *P = (u32 *)dsp->bf_p;
599 	u32 *S = (u32 *)dsp->bf_s;
600 
601 	if (keylen < 4 || keylen > 56)
602 		return 1;
603 
604 	/* Set dsp states */
605 	i = 0;
606 	while (i < 9) {
607 		dsp->bf_crypt_out[i] = 0xff;
608 		dsp->bf_data_out[i] = dsp_silence;
609 		i++;
610 	}
611 	dsp->bf_crypt_pos = 0;
612 	dsp->bf_decrypt_in_pos = 0;
613 	dsp->bf_decrypt_out_pos = 0;
614 	dsp->bf_sync = 0x1ff;
615 	dsp->bf_enable = 1;
616 
617 	/* Copy the initialization s-boxes */
618 	for (i = 0, count = 0; i < 256; i++)
619 		for (j = 0; j < 4; j++, count++)
620 			S[count] = bf_sbox[count];
621 
622 	/* Set the p-boxes */
623 	for (i = 0; i < 16 + 2; i++)
624 		P[i] = bf_pbox[i];
625 
626 	/* Actual subkey generation */
627 	for (j = 0, i = 0; i < 16 + 2; i++) {
628 		temp = (((u32)key[j] << 24) |
629 			((u32)key[(j + 1) % keylen] << 16) |
630 			((u32)key[(j + 2) % keylen] << 8) |
631 			((u32)key[(j + 3) % keylen]));
632 
633 		P[i] = P[i] ^ temp;
634 		j = (j + 4) % keylen;
635 	}
636 
637 	data[0] = 0x00000000;
638 	data[1] = 0x00000000;
639 
640 	for (i = 0; i < 16 + 2; i += 2) {
641 		encrypt_block(P, S, data, data);
642 
643 		P[i] = data[0];
644 		P[i + 1] = data[1];
645 	}
646 
647 	for (i = 0; i < 4; i++) {
648 		for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {
649 			encrypt_block(P, S, data, data);
650 
651 			S[count] = data[0];
652 			S[count + 1] = data[1];
653 		}
654 	}
655 
656 	return 0;
657 }
658 
659 
660 /*
661  * turn encryption off
662  */
663 void
664 dsp_bf_cleanup(struct dsp *dsp)
665 {
666 	dsp->bf_enable = 0;
667 }
668