Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/isdn/mISDN/dsp_blowfish.c
15111 views
1
/*
2
* Blowfish encryption/decryption for mISDN_dsp.
3
*
4
* Copyright Andreas Eversberg ([email protected])
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
}
673
674