0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/mISDNif.h>
0012 #include <linux/mISDNdsp.h>
0013 #include "core.h"
0014 #include "dsp.h"
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 struct bf_ctx {
0077 u32 p[18];
0078 u32 s[1024];
0079 };
0080
0081 static const u32 bf_pbox[16 + 2] = {
0082 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
0083 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
0084 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
0085 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
0086 0x9216d5d9, 0x8979fb1b,
0087 };
0088
0089 static const u32 bf_sbox[256 * 4] = {
0090 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
0091 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
0092 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
0093 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
0094 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
0095 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
0096 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
0097 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
0098 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
0099 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
0100 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
0101 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
0102 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
0103 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
0104 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
0105 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
0106 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
0107 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
0108 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
0109 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
0110 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
0111 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
0112 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
0113 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
0114 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
0115 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
0116 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
0117 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
0118 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
0119 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
0120 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
0121 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
0122 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
0123 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
0124 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
0125 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
0126 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
0127 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
0128 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
0129 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
0130 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
0131 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
0132 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
0133 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
0134 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
0135 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
0136 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
0137 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
0138 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
0139 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
0140 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
0141 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
0142 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
0143 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
0144 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
0145 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
0146 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
0147 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
0148 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
0149 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
0150 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
0151 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
0152 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
0153 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
0154 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
0155 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
0156 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
0157 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
0158 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
0159 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
0160 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
0161 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
0162 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
0163 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
0164 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
0165 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
0166 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
0167 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
0168 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
0169 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
0170 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
0171 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
0172 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
0173 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
0174 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
0175 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
0176 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
0177 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
0178 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
0179 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
0180 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
0181 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
0182 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
0183 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
0184 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
0185 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
0186 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
0187 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
0188 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
0189 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
0190 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
0191 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
0192 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
0193 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
0194 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
0195 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
0196 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
0197 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
0198 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
0199 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
0200 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
0201 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
0202 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
0203 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
0204 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
0205 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
0206 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
0207 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
0208 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
0209 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
0210 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
0211 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
0212 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
0213 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
0214 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
0215 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
0216 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
0217 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
0218 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
0219 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
0220 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
0221 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
0222 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
0223 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
0224 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
0225 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
0226 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
0227 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
0228 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
0229 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
0230 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
0231 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
0232 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
0233 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
0234 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
0235 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
0236 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
0237 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
0238 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
0239 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
0240 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
0241 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
0242 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
0243 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
0244 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
0245 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
0246 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
0247 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
0248 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
0249 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
0250 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
0251 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
0252 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
0253 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
0254 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
0255 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
0256 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
0257 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
0258 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
0259 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
0260 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
0261 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
0262 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
0263 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
0264 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
0265 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
0266 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
0267 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
0268 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
0269 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
0270 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
0271 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
0272 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
0273 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
0274 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
0275 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
0276 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
0277 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
0278 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
0279 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
0280 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
0281 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
0282 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
0283 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
0284 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
0285 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
0286 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
0287 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
0288 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
0289 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
0290 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
0291 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
0292 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
0293 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
0294 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
0295 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
0296 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
0297 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
0298 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
0299 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
0300 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
0301 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
0302 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
0303 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
0304 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
0305 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
0306 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
0307 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
0308 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
0309 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
0310 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
0311 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
0312 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
0313 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
0314 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
0315 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
0316 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
0317 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
0318 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
0319 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
0320 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
0321 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
0322 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
0323 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
0324 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
0325 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
0326 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
0327 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
0328 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
0329 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
0330 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
0331 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
0332 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
0333 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
0334 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
0335 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
0336 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
0337 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
0338 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
0339 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
0340 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
0341 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
0342 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
0343 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
0344 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
0345 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
0346 };
0347
0348
0349
0350
0351
0352 #define GET32_3(x) (((x) & 0xff))
0353 #define GET32_2(x) (((x) >> (8)) & (0xff))
0354 #define GET32_1(x) (((x) >> (16)) & (0xff))
0355 #define GET32_0(x) (((x) >> (24)) & (0xff))
0356
0357 #define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \
0358 S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
0359
0360 #define EROUND(a, b, n) do { b ^= P[n]; a ^= bf_F(b); } while (0)
0361 #define DROUND(a, b, n) do { a ^= bf_F(b); b ^= P[n]; } while (0)
0362
0363
0364
0365
0366
0367
0368 void
0369 dsp_bf_encrypt(struct dsp *dsp, u8 *data, int len)
0370 {
0371 int i = 0, j = dsp->bf_crypt_pos;
0372 u8 *bf_data_in = dsp->bf_data_in;
0373 u8 *bf_crypt_out = dsp->bf_crypt_out;
0374 u32 *P = dsp->bf_p;
0375 u32 *S = dsp->bf_s;
0376 u32 yl, yr;
0377 u32 cs;
0378 u8 nibble;
0379
0380 while (i < len) {
0381
0382 if (j < 9) {
0383 bf_data_in[j] = *data;
0384 *data++ = bf_crypt_out[j++];
0385 i++;
0386 continue;
0387 }
0388 j = 0;
0389
0390 yl = dsp_audio_law2seven[bf_data_in[0]];
0391 yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[1]];
0392 yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[2]];
0393 yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[3]];
0394 nibble = dsp_audio_law2seven[bf_data_in[4]];
0395 yr = nibble;
0396 yl = (yl << 4) | (nibble >> 3);
0397 yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[5]];
0398 yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[6]];
0399 yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[7]];
0400 yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[8]];
0401 yr = (yr << 1) | (bf_data_in[0] & 1);
0402
0403
0404
0405
0406 EROUND(yr, yl, 0);
0407 EROUND(yl, yr, 1);
0408 EROUND(yr, yl, 2);
0409 EROUND(yl, yr, 3);
0410 EROUND(yr, yl, 4);
0411 EROUND(yl, yr, 5);
0412 EROUND(yr, yl, 6);
0413 EROUND(yl, yr, 7);
0414 EROUND(yr, yl, 8);
0415 EROUND(yl, yr, 9);
0416 EROUND(yr, yl, 10);
0417 EROUND(yl, yr, 11);
0418 EROUND(yr, yl, 12);
0419 EROUND(yl, yr, 13);
0420 EROUND(yr, yl, 14);
0421 EROUND(yl, yr, 15);
0422 yl ^= P[16];
0423 yr ^= P[17];
0424
0425
0426 cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
0427 ^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
0428 ^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
0429 ^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
0430 ^ (yr >> 28) ^ (yr >> 31);
0431
0432
0433
0434
0435
0436 bf_crypt_out[0] = (yl >> 25) | 0x80;
0437 bf_crypt_out[1] = (yl >> 18) & 0x7f;
0438 bf_crypt_out[2] = (yl >> 11) & 0x7f;
0439 bf_crypt_out[3] = (yl >> 4) & 0x7f;
0440 bf_crypt_out[4] = ((yl << 3) & 0x78) | ((yr >> 29) & 0x07);
0441 bf_crypt_out[5] = ((yr >> 22) & 0x7f) | ((cs << 5) & 0x80);
0442 bf_crypt_out[6] = ((yr >> 15) & 0x7f) | ((cs << 6) & 0x80);
0443 bf_crypt_out[7] = ((yr >> 8) & 0x7f) | (cs << 7);
0444 bf_crypt_out[8] = yr;
0445 }
0446
0447
0448 dsp->bf_crypt_pos = j;
0449
0450 }
0451
0452
0453
0454
0455
0456
0457 void
0458 dsp_bf_decrypt(struct dsp *dsp, u8 *data, int len)
0459 {
0460 int i = 0;
0461 u8 j = dsp->bf_decrypt_in_pos;
0462 u8 k = dsp->bf_decrypt_out_pos;
0463 u8 *bf_crypt_inring = dsp->bf_crypt_inring;
0464 u8 *bf_data_out = dsp->bf_data_out;
0465 u16 sync = dsp->bf_sync;
0466 u32 *P = dsp->bf_p;
0467 u32 *S = dsp->bf_s;
0468 u32 yl, yr;
0469 u8 nibble;
0470 u8 cs, cs0, cs1, cs2;
0471
0472 while (i < len) {
0473
0474
0475
0476
0477 sync = (sync << 1) | ((*data) >> 7);
0478 bf_crypt_inring[j++ & 15] = *data;
0479 *data++ = bf_data_out[k++];
0480 i++;
0481 if (k == 9)
0482 k = 0;
0483
0484 if ((sync & 0x1f0) != 0x100)
0485 continue;
0486 j -= 9;
0487
0488 yl = bf_crypt_inring[j++ & 15];
0489 yl = (yl << 7) | bf_crypt_inring[j++ & 15];
0490 yl = (yl << 7) | bf_crypt_inring[j++ & 15];
0491 yl = (yl << 7) | bf_crypt_inring[j++ & 15];
0492 nibble = bf_crypt_inring[j++ & 15];
0493 yr = nibble;
0494 yl = (yl << 4) | (nibble >> 3);
0495 cs2 = bf_crypt_inring[j++ & 15];
0496 yr = (yr << 7) | (cs2 & 0x7f);
0497 cs1 = bf_crypt_inring[j++ & 15];
0498 yr = (yr << 7) | (cs1 & 0x7f);
0499 cs0 = bf_crypt_inring[j++ & 15];
0500 yr = (yr << 7) | (cs0 & 0x7f);
0501 yr = (yr << 8) | bf_crypt_inring[j++ & 15];
0502
0503
0504 cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
0505 ^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
0506 ^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
0507 ^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
0508 ^ (yr >> 28) ^ (yr >> 31);
0509
0510
0511 if ((cs & 0x7) != (((cs2 >> 5) & 4) | ((cs1 >> 6) & 2) | (cs0 >> 7))) {
0512 if (dsp_debug & DEBUG_DSP_BLOWFISH)
0513 printk(KERN_DEBUG
0514 "DSP BLOWFISH: received corrupt frame, "
0515 "checksumme is not correct\n");
0516 continue;
0517 }
0518
0519
0520 yr ^= P[17];
0521 yl ^= P[16];
0522 DROUND(yl, yr, 15);
0523 DROUND(yr, yl, 14);
0524 DROUND(yl, yr, 13);
0525 DROUND(yr, yl, 12);
0526 DROUND(yl, yr, 11);
0527 DROUND(yr, yl, 10);
0528 DROUND(yl, yr, 9);
0529 DROUND(yr, yl, 8);
0530 DROUND(yl, yr, 7);
0531 DROUND(yr, yl, 6);
0532 DROUND(yl, yr, 5);
0533 DROUND(yr, yl, 4);
0534 DROUND(yl, yr, 3);
0535 DROUND(yr, yl, 2);
0536 DROUND(yl, yr, 1);
0537 DROUND(yr, yl, 0);
0538
0539
0540 bf_data_out[0] = dsp_audio_seven2law[(yl >> 25) & 0x7f];
0541 bf_data_out[1] = dsp_audio_seven2law[(yl >> 18) & 0x7f];
0542 bf_data_out[2] = dsp_audio_seven2law[(yl >> 11) & 0x7f];
0543 bf_data_out[3] = dsp_audio_seven2law[(yl >> 4) & 0x7f];
0544 bf_data_out[4] = dsp_audio_seven2law[((yl << 3) & 0x78) |
0545 ((yr >> 29) & 0x07)];
0546
0547 bf_data_out[5] = dsp_audio_seven2law[(yr >> 22) & 0x7f];
0548 bf_data_out[6] = dsp_audio_seven2law[(yr >> 15) & 0x7f];
0549 bf_data_out[7] = dsp_audio_seven2law[(yr >> 8) & 0x7f];
0550 bf_data_out[8] = dsp_audio_seven2law[(yr >> 1) & 0x7f];
0551 k = 0;
0552 }
0553
0554
0555 dsp->bf_decrypt_in_pos = j;
0556 dsp->bf_decrypt_out_pos = k;
0557 dsp->bf_sync = sync;
0558 }
0559
0560
0561
0562 static inline void
0563 encrypt_block(const u32 *P, const u32 *S, u32 *dst, u32 *src)
0564 {
0565 u32 yl = src[0];
0566 u32 yr = src[1];
0567
0568 EROUND(yr, yl, 0);
0569 EROUND(yl, yr, 1);
0570 EROUND(yr, yl, 2);
0571 EROUND(yl, yr, 3);
0572 EROUND(yr, yl, 4);
0573 EROUND(yl, yr, 5);
0574 EROUND(yr, yl, 6);
0575 EROUND(yl, yr, 7);
0576 EROUND(yr, yl, 8);
0577 EROUND(yl, yr, 9);
0578 EROUND(yr, yl, 10);
0579 EROUND(yl, yr, 11);
0580 EROUND(yr, yl, 12);
0581 EROUND(yl, yr, 13);
0582 EROUND(yr, yl, 14);
0583 EROUND(yl, yr, 15);
0584
0585 yl ^= P[16];
0586 yr ^= P[17];
0587
0588 dst[0] = yr;
0589 dst[1] = yl;
0590 }
0591
0592
0593
0594
0595
0596
0597
0598 int
0599 dsp_bf_init(struct dsp *dsp, const u8 *key, uint keylen)
0600 {
0601 short i, j, count;
0602 u32 data[2], temp;
0603 u32 *P = (u32 *)dsp->bf_p;
0604 u32 *S = (u32 *)dsp->bf_s;
0605
0606 if (keylen < 4 || keylen > 56)
0607 return 1;
0608
0609
0610 i = 0;
0611 while (i < 9) {
0612 dsp->bf_crypt_out[i] = 0xff;
0613 dsp->bf_data_out[i] = dsp_silence;
0614 i++;
0615 }
0616 dsp->bf_crypt_pos = 0;
0617 dsp->bf_decrypt_in_pos = 0;
0618 dsp->bf_decrypt_out_pos = 0;
0619 dsp->bf_sync = 0x1ff;
0620 dsp->bf_enable = 1;
0621
0622
0623 for (i = 0, count = 0; i < 256; i++)
0624 for (j = 0; j < 4; j++, count++)
0625 S[count] = bf_sbox[count];
0626
0627
0628 for (i = 0; i < 16 + 2; i++)
0629 P[i] = bf_pbox[i];
0630
0631
0632 for (j = 0, i = 0; i < 16 + 2; i++) {
0633 temp = (((u32)key[j] << 24) |
0634 ((u32)key[(j + 1) % keylen] << 16) |
0635 ((u32)key[(j + 2) % keylen] << 8) |
0636 ((u32)key[(j + 3) % keylen]));
0637
0638 P[i] = P[i] ^ temp;
0639 j = (j + 4) % keylen;
0640 }
0641
0642 data[0] = 0x00000000;
0643 data[1] = 0x00000000;
0644
0645 for (i = 0; i < 16 + 2; i += 2) {
0646 encrypt_block(P, S, data, data);
0647
0648 P[i] = data[0];
0649 P[i + 1] = data[1];
0650 }
0651
0652 for (i = 0; i < 4; i++) {
0653 for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {
0654 encrypt_block(P, S, data, data);
0655
0656 S[count] = data[0];
0657 S[count + 1] = data[1];
0658 }
0659 }
0660
0661 return 0;
0662 }
0663
0664
0665
0666
0667
0668 void
0669 dsp_bf_cleanup(struct dsp *dsp)
0670 {
0671 dsp->bf_enable = 0;
0672 }