brintos

brintos / linux-shallow public Read only

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