1960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
2960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * Blowfish encryption/decryption for mISDN_dsp.
3960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
4960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * Copyright Andreas Eversberg (jolly@eversberg.eu)
5960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
6960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * This software may be used and distributed according to the terms
7960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * of the GNU General Public License, incorporated herein by reference.
8960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
9960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
10960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
11960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#include <linux/mISDNif.h>
12960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#include <linux/mISDNdsp.h>
13960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#include "core.h"
14960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#include "dsp.h"
15960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
16960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
17960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * how to encode a sample stream to 64-bit blocks that will be encryped
18960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
19960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * first of all, data is collected until a block of 9 samples are received.
20960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * of course, a packet may have much more than 9 sample, but is may have
21960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * not excacly the multiple of 9 samples. if there is a rest, the next
22960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * received data will complete the block.
23960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
24960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * the block is then converted to 9 uLAW samples without the least sigificant
25960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * bit. the result is a 7-bit encoded sample.
26960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
27960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * the samples will be reoganised to form 8 bytes of data:
28960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * (5(6) means: encoded sample no. 5, bit 6)
29960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
30960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 0(6) 0(5) 0(4) 0(3) 0(2) 0(1) 0(0) 1(6)
31960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 1(5) 1(4) 1(3) 1(2) 1(1) 1(0) 2(6) 2(5)
32960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 2(4) 2(3) 2(2) 2(1) 2(0) 3(6) 3(5) 3(4)
33960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 3(3) 3(2) 3(1) 3(0) 4(6) 4(5) 4(4) 4(3)
34960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 4(2) 4(1) 4(0) 5(6) 5(5) 5(4) 5(3) 5(2)
35960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 5(1) 5(0) 6(6) 6(5) 6(4) 6(3) 6(2) 6(1)
36960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 6(0) 7(6) 7(5) 7(4) 7(3) 7(2) 7(1) 7(0)
37960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 8(6) 8(5) 8(4) 8(3) 8(2) 8(1) 8(0)
38960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
39960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * the missing bit 0 of the last byte is filled with some
40960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * random noise, to fill all 8 bytes.
41960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
42960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * the 8 bytes will be encrypted using blowfish.
43960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
44960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * the result will be converted into 9 bytes. the bit 7 is used for
45960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * checksumme (CS) for sync (0, 1) and for the last bit:
46960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * (5(6) means: crypted byte 5, bit 6)
47960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
48960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 1    0(7) 0(6) 0(5) 0(4) 0(3) 0(2) 0(1)
49960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 0    0(0) 1(7) 1(6) 1(5) 1(4) 1(3) 1(2)
50960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 0    1(1) 1(0) 2(7) 2(6) 2(5) 2(4) 2(3)
51960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 0    2(2) 2(1) 2(0) 3(7) 3(6) 3(5) 3(4)
52960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 0    3(3) 3(2) 3(1) 3(0) 4(7) 4(6) 4(5)
53960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * CS   4(4) 4(3) 4(2) 4(1) 4(0) 5(7) 5(6)
54960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * CS   5(5) 5(4) 5(3) 5(2) 5(1) 5(0) 6(7)
55960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * CS   6(6) 6(5) 6(4) 6(3) 6(2) 6(1) 6(0)
56960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * 7(0) 7(6) 7(5) 7(4) 7(3) 7(2) 7(1) 7(0)
57960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
58960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * the checksum is used to detect transmission errors and frame drops.
59960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
60960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * synchronisation of received block is done by shifting the upper bit of each
61960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * byte (bit 7) to a shift register. if the rigister has the first five bits
62960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * (10000), this is used to find the sync. only if sync has been found, the
63960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * current block of 9 received bytes are decrypted. before that the check
64960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * sum is calculated. if it is incorrect the block is dropped.
65960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * this will avoid loud noise due to corrupt encrypted data.
66960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *
67960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * if the last block is corrupt, the current decoded block is repeated
68960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * until a valid block has been received.
69960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
70960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
71960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
72960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil *  some blowfish parts are taken from the
73960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * crypto-api for faster implementation
74960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
75960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
76960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilstruct bf_ctx {
77960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 p[18];
78960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 s[1024];
79960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil};
80960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
81960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilstatic const u32 bf_pbox[16 + 2] = {
82960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
83960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
84960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
85960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
86960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9216d5d9, 0x8979fb1b,
87960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil};
88960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
89960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilstatic const u32 bf_sbox[256 * 4] = {
90960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
91960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
92960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
93960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
94960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
95960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
96960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
97960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
98960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
99960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
100960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
101960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
102960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
103960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
104960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
105960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
106960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
107960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
108960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
109960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
110960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
111960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
112960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
113960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
114960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
115960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
116960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
117960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
118960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
119960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
120960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
121960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
122960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
123960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
124960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
125960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
126960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
127960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
128960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
129960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
130960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
131960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
132960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
133960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
134960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
135960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
136960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
137960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
138960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
139960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
140960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
141960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
142960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
143960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
144960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
145960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
146960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
147960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
148960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
149960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
150960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
151960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
152960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
153960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
154960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
155960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
156960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
157960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
158960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
159960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
160960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
161960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
162960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
163960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
164960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
165960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
166960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
167960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
168960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
169960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
170960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
171960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
172960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
173960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
174960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
175960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
176960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
177960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
178960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
179960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
180960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
181960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
182960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
183960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
184960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
185960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
186960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
187960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
188960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
189960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
190960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
191960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
192960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
193960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
194960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
195960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
196960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
197960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
198960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
199960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
200960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
201960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
202960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
203960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
204960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
205960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
206960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
207960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
208960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
209960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
210960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
211960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
212960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
213960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
214960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
215960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
216960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
217960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
218960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
219960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
220960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
221960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
222960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
223960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
224960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
225960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
226960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
227960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
228960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
229960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
230960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
231960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
232960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
233960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
234960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
235960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
236960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
237960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
238960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
239960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
240960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
241960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
242960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
243960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
244960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
245960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
246960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
247960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
248960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
249960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
250960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
251960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
252960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
253960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
254960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
255960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
256960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
257960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
258960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
259960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
260960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
261960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
262960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
263960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
264960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
265960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
266960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
267960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
268960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
269960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
270960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
271960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
272960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
273960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
274960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
275960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
276960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
277960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
278960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
279960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
280960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
281960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
282960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
283960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
284960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
285960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
286960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
287960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
288960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
289960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
290960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
291960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
292960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
293960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
294960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
295960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
296960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
297960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
298960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
299960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
300960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
301960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
302960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
303960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
304960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
305960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
306960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
307960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
308960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
309960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
310960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
311960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
312960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
313960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
314960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
315960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
316960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
317960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
318960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
319960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
320960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
321960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
322960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
323960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
324960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
325960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
326960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
327960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
328960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
329960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
330960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
331960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
332960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
333960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
334960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
335960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
336960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
337960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
338960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
339960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
340960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
341960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
342960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
343960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
344960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
345960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
346960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil};
347960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
348960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
349960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * Round loop unrolling macros, S is a pointer to a S-Box array
350960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * organized in 4 unsigned longs at a row.
351960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
352960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#define GET32_3(x) (((x) & 0xff))
353960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#define GET32_2(x) (((x) >> (8)) & (0xff))
354960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#define GET32_1(x) (((x) >> (16)) & (0xff))
355960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#define GET32_0(x) (((x) >> (24)) & (0xff))
356960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
357475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^	\
358475be4d85a274d0961593db41cf85689db1d583cJoe Perches		  S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
359960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
360960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#define EROUND(a, b, n)  do { b ^= P[n]; a ^= bf_F(b); } while (0)
361960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil#define DROUND(a, b, n)  do { a ^= bf_F(b); b ^= P[n]; } while (0)
362960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
363960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
364960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
365960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * encrypt isdn data frame
366960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * every block with 9 samples is encrypted
367960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
368960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilvoid
369960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keildsp_bf_encrypt(struct dsp *dsp, u8 *data, int len)
370960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil{
371960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	int i = 0, j = dsp->bf_crypt_pos;
372960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 *bf_data_in = dsp->bf_data_in;
373960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 *bf_crypt_out = dsp->bf_crypt_out;
374960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 *P = dsp->bf_p;
375960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 *S = dsp->bf_s;
376960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 yl, yr;
377960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 cs;
378960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 nibble;
379960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
380960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	while (i < len) {
381960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* collect a block of 9 samples */
382960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		if (j < 9) {
383960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			bf_data_in[j] = *data;
384960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			*data++ = bf_crypt_out[j++];
385960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			i++;
386960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			continue;
387960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		}
388960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		j = 0;
389960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* transcode 9 samples xlaw to 8 bytes */
390960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yl = dsp_audio_law2seven[bf_data_in[0]];
391475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[1]];
392475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[2]];
393475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[3]];
394960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		nibble = dsp_audio_law2seven[bf_data_in[4]];
395960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yr = nibble;
396475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 4) | (nibble >> 3);
397475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[5]];
398475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[6]];
399475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[7]];
400475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[8]];
401475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 1) | (bf_data_in[0] & 1);
402960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
403960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* fill unused bit with random noise of audio input */
404960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* encrypt */
405960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
406960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 0);
407960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 1);
408960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 2);
409960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 3);
410960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 4);
411960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 5);
412960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 6);
413960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 7);
414960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 8);
415960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 9);
416960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 10);
417960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 11);
418960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 12);
419960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 13);
420960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yr, yl, 14);
421960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		EROUND(yl, yr, 15);
422960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yl ^= P[16];
423960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yr ^= P[17];
424960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
425960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* calculate 3-bit checksumme */
426475be4d85a274d0961593db41cf85689db1d583cJoe Perches		cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
427475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
428475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
429475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
430475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yr >> 28) ^ (yr >> 31);
431960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
432960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/*
433960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		 * transcode 8 crypted bytes to 9 data bytes with sync
434960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		 * and checksum information
435960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		 */
436475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[0] = (yl >> 25) | 0x80;
437475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[1] = (yl >> 18) & 0x7f;
438475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[2] = (yl >> 11) & 0x7f;
439475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[3] = (yl >> 4) & 0x7f;
440475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[4] = ((yl << 3) & 0x78) | ((yr >> 29) & 0x07);
441475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[5] = ((yr >> 22) & 0x7f) | ((cs << 5) & 0x80);
442475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[6] = ((yr >> 15) & 0x7f) | ((cs << 6) & 0x80);
443475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_crypt_out[7] = ((yr >> 8) & 0x7f) | (cs << 7);
444960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		bf_crypt_out[8] = yr;
445960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	}
446960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
447960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	/* write current count */
448960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_crypt_pos = j;
449960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
450960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil}
451960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
452960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
453960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
454960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * decrypt isdn data frame
455960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * every block with 9 bytes is decrypted
456960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
457960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilvoid
458960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keildsp_bf_decrypt(struct dsp *dsp, u8 *data, int len)
459960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil{
460960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	int i = 0;
461960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 j = dsp->bf_decrypt_in_pos;
462960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 k = dsp->bf_decrypt_out_pos;
463960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 *bf_crypt_inring = dsp->bf_crypt_inring;
464960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 *bf_data_out = dsp->bf_data_out;
465960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u16 sync = dsp->bf_sync;
466960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 *P = dsp->bf_p;
467960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 *S = dsp->bf_s;
468960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 yl, yr;
469960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 nibble;
470960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u8 cs, cs0, cs1, cs2;
471960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
472960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	while (i < len) {
473960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/*
474960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		 * shift upper bit and rotate data to buffer ring
475960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		 * send current decrypted data
476960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		 */
477475be4d85a274d0961593db41cf85689db1d583cJoe Perches		sync = (sync << 1) | ((*data) >> 7);
478960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		bf_crypt_inring[j++ & 15] = *data;
479960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		*data++ = bf_data_out[k++];
480960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		i++;
481960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		if (k == 9)
482960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			k = 0; /* repeat if no sync has been found */
483960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* check if not in sync */
484475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if ((sync & 0x1f0) != 0x100)
485960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			continue;
486960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		j -= 9;
487960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* transcode receive data to 64 bit block of encrypted data */
488960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yl = bf_crypt_inring[j++ & 15];
489475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
490475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
491475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
492960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		nibble = bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
493960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yr = nibble;
494475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yl = (yl << 4) | (nibble >> 3);
495960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		cs2 = bf_crypt_inring[j++ & 15];
496475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 7) | (cs2 & 0x7f);
497960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		cs1 = bf_crypt_inring[j++ & 15];
498475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 7) | (cs1 & 0x7f);
499960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		cs0 = bf_crypt_inring[j++ & 15];
500475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 7) | (cs0 & 0x7f);
501475be4d85a274d0961593db41cf85689db1d583cJoe Perches		yr = (yr << 8) | bf_crypt_inring[j++ & 15];
502960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
503960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* calculate 3-bit checksumme */
504475be4d85a274d0961593db41cf85689db1d583cJoe Perches		cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
505475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
506475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
507475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
508475be4d85a274d0961593db41cf85689db1d583cJoe Perches			^ (yr >> 28) ^ (yr >> 31);
509960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
510960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* check if frame is valid */
511475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if ((cs & 0x7) != (((cs2 >> 5) & 4) | ((cs1 >> 6) & 2) | (cs0 >> 7))) {
512960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			if (dsp_debug & DEBUG_DSP_BLOWFISH)
513960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil				printk(KERN_DEBUG
514475be4d85a274d0961593db41cf85689db1d583cJoe Perches				       "DSP BLOWFISH: received corrupt frame, "
515475be4d85a274d0961593db41cf85689db1d583cJoe Perches				       "checksumme is not correct\n");
516960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			continue;
517960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		}
518960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
519960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* decrypt */
520960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yr ^= P[17];
521960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		yl ^= P[16];
522960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 15);
523960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 14);
524960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 13);
525960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 12);
526960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 11);
527960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 10);
528960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 9);
529960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 8);
530960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 7);
531960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 6);
532960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 5);
533960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 4);
534960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 3);
535960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 2);
536960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yl, yr, 1);
537960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		DROUND(yr, yl, 0);
538960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
539960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		/* transcode 8 crypted bytes to 9 sample bytes */
540475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[0] = dsp_audio_seven2law[(yl >> 25) & 0x7f];
541475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[1] = dsp_audio_seven2law[(yl >> 18) & 0x7f];
542475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[2] = dsp_audio_seven2law[(yl >> 11) & 0x7f];
543475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[3] = dsp_audio_seven2law[(yl >> 4) & 0x7f];
544475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[4] = dsp_audio_seven2law[((yl << 3) & 0x78) |
545475be4d85a274d0961593db41cf85689db1d583cJoe Perches						     ((yr >> 29) & 0x07)];
546475be4d85a274d0961593db41cf85689db1d583cJoe Perches
547475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[5] = dsp_audio_seven2law[(yr >> 22) & 0x7f];
548475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[6] = dsp_audio_seven2law[(yr >> 15) & 0x7f];
549475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[7] = dsp_audio_seven2law[(yr >> 8) & 0x7f];
550475be4d85a274d0961593db41cf85689db1d583cJoe Perches		bf_data_out[8] = dsp_audio_seven2law[(yr >> 1) & 0x7f];
551960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		k = 0; /* start with new decoded frame */
552960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	}
553960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
554960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	/* write current count and sync */
555960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_decrypt_in_pos = j;
556960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_decrypt_out_pos = k;
557960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_sync = sync;
558960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil}
559960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
560960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
561960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/* used to encrypt S and P boxes */
562960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilstatic inline void
563960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilencrypt_block(const u32 *P, const u32 *S, u32 *dst, u32 *src)
564960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil{
565960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 yl = src[0];
566960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 yr = src[1];
567960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
568960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 0);
569960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 1);
570960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 2);
571960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 3);
572960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 4);
573960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 5);
574960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 6);
575960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 7);
576960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 8);
577960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 9);
578960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 10);
579960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 11);
580960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 12);
581960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 13);
582960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yr, yl, 14);
583960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	EROUND(yl, yr, 15);
584960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
585960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	yl ^= P[16];
586960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	yr ^= P[17];
587960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
588960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dst[0] = yr;
589960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dst[1] = yl;
590960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil}
591960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
592960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
593960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * initialize the dsp for encryption and decryption using the same key
594960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * Calculates the blowfish S and P boxes for encryption and decryption.
595960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * The margin of keylen must be 4-56 bytes.
596960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * returns 0 if ok.
597960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
598960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilint
599960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keildsp_bf_init(struct dsp *dsp, const u8 *key, uint keylen)
600960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil{
601960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	short i, j, count;
602960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 data[2], temp;
603960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 *P = (u32 *)dsp->bf_p;
604960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	u32 *S = (u32 *)dsp->bf_s;
605960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
606960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	if (keylen < 4 || keylen > 56)
607960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		return 1;
608960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
609960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	/* Set dsp states */
610960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	i = 0;
611960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	while (i < 9) {
612960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		dsp->bf_crypt_out[i] = 0xff;
613960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		dsp->bf_data_out[i] = dsp_silence;
614960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		i++;
615960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	}
616960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_crypt_pos = 0;
617960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_decrypt_in_pos = 0;
618960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_decrypt_out_pos = 0;
619960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_sync = 0x1ff;
620960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_enable = 1;
621960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
622960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	/* Copy the initialization s-boxes */
623960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	for (i = 0, count = 0; i < 256; i++)
624960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		for (j = 0; j < 4; j++, count++)
625960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			S[count] = bf_sbox[count];
626960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
627960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	/* Set the p-boxes */
628960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	for (i = 0; i < 16 + 2; i++)
629960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		P[i] = bf_pbox[i];
630960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
631960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	/* Actual subkey generation */
632960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	for (j = 0, i = 0; i < 16 + 2; i++) {
633960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		temp = (((u32)key[j] << 24) |
634475be4d85a274d0961593db41cf85689db1d583cJoe Perches			((u32)key[(j + 1) % keylen] << 16) |
635475be4d85a274d0961593db41cf85689db1d583cJoe Perches			((u32)key[(j + 2) % keylen] << 8) |
636475be4d85a274d0961593db41cf85689db1d583cJoe Perches			((u32)key[(j + 3) % keylen]));
637960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
638960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		P[i] = P[i] ^ temp;
639960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		j = (j + 4) % keylen;
640960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	}
641960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
642960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	data[0] = 0x00000000;
643960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	data[1] = 0x00000000;
644960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
645960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	for (i = 0; i < 16 + 2; i += 2) {
646960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		encrypt_block(P, S, data, data);
647960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
648960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		P[i] = data[0];
649960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		P[i + 1] = data[1];
650960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	}
651960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
652960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	for (i = 0; i < 4; i++) {
653960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {
654960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			encrypt_block(P, S, data, data);
655960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
656960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			S[count] = data[0];
657960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil			S[count + 1] = data[1];
658960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil		}
659960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	}
660960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
661960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	return 0;
662960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil}
663960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
664960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil
665960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil/*
666960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil * turn encryption off
667960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil */
668960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keilvoid
669960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keildsp_bf_cleanup(struct dsp *dsp)
670960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil{
671960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil	dsp->bf_enable = 0;
672960366cf8dbb3359afaca30cf7fdbf69a6d6dda7Karsten Keil}
673