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