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