00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "common.h"
00023 #include "intreadwrite.h"
00024 #include "bswap.h"
00025 #include "des.h"
00026 #include "rc4.h"
00027 #include "asfcrypt.h"
00028
00034 static uint32_t inverse(uint32_t v) {
00035
00036
00037 uint32_t inverse = v * v * v;
00038
00039
00040 inverse *= 2 - v * inverse;
00041 inverse *= 2 - v * inverse;
00042 inverse *= 2 - v * inverse;
00043 return inverse;
00044 }
00045
00052 static void multiswap_init(const uint8_t keybuf[48], uint32_t keys[12]) {
00053 int i;
00054 for (i = 0; i < 12; i++)
00055 keys[i] = AV_RL32(keybuf + (i << 2)) | 1;
00056 }
00057
00063 static void multiswap_invert_keys(uint32_t keys[12]) {
00064 int i;
00065 for (i = 0; i < 5; i++)
00066 keys[i] = inverse(keys[i]);
00067 for (i = 6; i < 11; i++)
00068 keys[i] = inverse(keys[i]);
00069 }
00070
00071 static uint32_t multiswap_step(const uint32_t keys[12], uint32_t v) {
00072 int i;
00073 v *= keys[0];
00074 for (i = 1; i < 5; i++) {
00075 v = (v >> 16) | (v << 16);
00076 v *= keys[i];
00077 }
00078 v += keys[5];
00079 return v;
00080 }
00081
00082 static uint32_t multiswap_inv_step(const uint32_t keys[12], uint32_t v) {
00083 int i;
00084 v -= keys[5];
00085 for (i = 4; i > 0; i--) {
00086 v *= keys[i];
00087 v = (v >> 16) | (v << 16);
00088 }
00089 v *= keys[0];
00090 return v;
00091 }
00092
00101 static uint64_t multiswap_enc(const uint32_t keys[12], uint64_t key, uint64_t data) {
00102 uint32_t a = data;
00103 uint32_t b = data >> 32;
00104 uint32_t c;
00105 uint32_t tmp;
00106 a += key;
00107 tmp = multiswap_step(keys , a);
00108 b += tmp;
00109 c = (key >> 32) + tmp;
00110 tmp = multiswap_step(keys + 6, b);
00111 c += tmp;
00112 return ((uint64_t)c << 32) | tmp;
00113 }
00114
00123 static uint64_t multiswap_dec(const uint32_t keys[12], uint64_t key, uint64_t data) {
00124 uint32_t a;
00125 uint32_t b;
00126 uint32_t c = data >> 32;
00127 uint32_t tmp = data;
00128 c -= tmp;
00129 b = multiswap_inv_step(keys + 6, tmp);
00130 tmp = c - (key >> 32);
00131 b -= tmp;
00132 a = multiswap_inv_step(keys , tmp);
00133 a -= key;
00134 return ((uint64_t)b << 32) | a;
00135 }
00136
00137 void ff_asfcrypt_dec(const uint8_t key[20], uint8_t *data, int len) {
00138 int num_qwords = len >> 3;
00139 uint64_t *qwords = (uint64_t *)data;
00140 uint64_t rc4buff[8];
00141 uint64_t packetkey;
00142 uint32_t ms_keys[12];
00143 uint64_t ms_state;
00144 int i;
00145 if (len < 16) {
00146 for (i = 0; i < len; i++)
00147 data[i] ^= key[i];
00148 return;
00149 }
00150
00151 memset(rc4buff, 0, sizeof(rc4buff));
00152 ff_rc4_enc(key, 12, (uint8_t *)rc4buff, sizeof(rc4buff));
00153 multiswap_init((uint8_t *)rc4buff, ms_keys);
00154
00155 packetkey = qwords[num_qwords - 1];
00156 packetkey ^= rc4buff[7];
00157 packetkey = be2me_64(packetkey);
00158 packetkey = ff_des_encdec(packetkey, AV_RB64(key + 12), 1);
00159 packetkey = be2me_64(packetkey);
00160 packetkey ^= rc4buff[6];
00161
00162 ff_rc4_enc((uint8_t *)&packetkey, 8, data, len);
00163
00164 ms_state = 0;
00165 for (i = 0; i < num_qwords - 1; i++, qwords++)
00166 ms_state = multiswap_enc(ms_keys, ms_state, AV_RL64(qwords));
00167 multiswap_invert_keys(ms_keys);
00168 packetkey = (packetkey << 32) | (packetkey >> 32);
00169 packetkey = le2me_64(packetkey);
00170 packetkey = multiswap_dec(ms_keys, ms_state, packetkey);
00171 AV_WL64(qwords, packetkey);
00172 }