|
@ -1185,8 +1185,8 @@ class auth_aes128_sha1(auth_base): |
|
|
max_client = 64 |
|
|
max_client = 64 |
|
|
self.server_info.data.set_max_client(max_client) |
|
|
self.server_info.data.set_max_client(max_client) |
|
|
|
|
|
|
|
|
def rnd_data_len(self, buf_size): |
|
|
def rnd_data_len(self, buf_size, full_buf_size): |
|
|
if buf_size > 1300 or self.last_rnd_len > 1300: |
|
|
if buf_size > 1300 or self.last_rnd_len > 1300 or full_buf_size > 1492: |
|
|
return 0 |
|
|
return 0 |
|
|
if buf_size > 1100: |
|
|
if buf_size > 1100: |
|
|
return common.ord(os.urandom(1)[0]) % 128 |
|
|
return common.ord(os.urandom(1)[0]) % 128 |
|
@ -1196,17 +1196,16 @@ class auth_aes128_sha1(auth_base): |
|
|
else: |
|
|
else: |
|
|
return struct.unpack('>H', os.urandom(2))[0] % 1024 |
|
|
return struct.unpack('>H', os.urandom(2))[0] % 1024 |
|
|
|
|
|
|
|
|
def rnd_data(self, buf_size): |
|
|
def rnd_data(self, buf_size, full_buf_size): |
|
|
data_len = self.rnd_data_len(buf_size) |
|
|
data_len = self.rnd_data_len(buf_size, full_buf_size) |
|
|
self.last_rnd_len = data_len |
|
|
|
|
|
|
|
|
|
|
|
if data_len < 128: |
|
|
if data_len < 128: |
|
|
return common.chr(data_len + 1) + os.urandom(data_len) |
|
|
return common.chr(data_len + 1) + os.urandom(data_len) |
|
|
|
|
|
|
|
|
return common.chr(255) + struct.pack('<H', data_len + 1) + os.urandom(data_len - 2) |
|
|
return common.chr(255) + struct.pack('<H', data_len + 1) + os.urandom(data_len - 2) |
|
|
|
|
|
|
|
|
def pack_data(self, buf): |
|
|
def pack_data(self, buf, full_buf_size): |
|
|
data = self.rnd_data(len(buf)) + buf |
|
|
data = self.rnd_data(len(buf), full_buf_size) + buf |
|
|
data_len = len(data) + 8 |
|
|
data_len = len(data) + 8 |
|
|
mac_key = self.user_key + struct.pack('<I', self.pack_id) |
|
|
mac_key = self.user_key + struct.pack('<I', self.pack_id) |
|
|
mac = hmac.new(mac_key, struct.pack('<H', data_len), self.hashfunc).digest()[:2] |
|
|
mac = hmac.new(mac_key, struct.pack('<H', data_len), self.hashfunc).digest()[:2] |
|
@ -1260,7 +1259,7 @@ class auth_aes128_sha1(auth_base): |
|
|
|
|
|
|
|
|
def client_pre_encrypt(self, buf): |
|
|
def client_pre_encrypt(self, buf): |
|
|
ret = b'' |
|
|
ret = b'' |
|
|
self.last_rnd_len = 0 |
|
|
ogn_data_len = len(buf) |
|
|
if not self.has_sent_header: |
|
|
if not self.has_sent_header: |
|
|
head_size = self.get_head_size(buf, 30) |
|
|
head_size = self.get_head_size(buf, 30) |
|
|
datalen = min(len(buf), random.randint(0, 31) + head_size) |
|
|
datalen = min(len(buf), random.randint(0, 31) + head_size) |
|
@ -1268,9 +1267,10 @@ class auth_aes128_sha1(auth_base): |
|
|
buf = buf[datalen:] |
|
|
buf = buf[datalen:] |
|
|
self.has_sent_header = True |
|
|
self.has_sent_header = True |
|
|
while len(buf) > self.unit_len: |
|
|
while len(buf) > self.unit_len: |
|
|
ret += self.pack_data(buf[:self.unit_len]) |
|
|
ret += self.pack_data(buf[:self.unit_len], ogn_data_len) |
|
|
buf = buf[self.unit_len:] |
|
|
buf = buf[self.unit_len:] |
|
|
ret += self.pack_data(buf) |
|
|
ret += self.pack_data(buf, ogn_data_len) |
|
|
|
|
|
self.last_rnd_len = ogn_data_len |
|
|
return ret |
|
|
return ret |
|
|
|
|
|
|
|
|
def client_post_decrypt(self, buf): |
|
|
def client_post_decrypt(self, buf): |
|
@ -1311,11 +1311,12 @@ class auth_aes128_sha1(auth_base): |
|
|
if self.raw_trans: |
|
|
if self.raw_trans: |
|
|
return buf |
|
|
return buf |
|
|
ret = b'' |
|
|
ret = b'' |
|
|
self.last_rnd_len = 0 |
|
|
ogn_data_len = len(buf) |
|
|
while len(buf) > self.unit_len: |
|
|
while len(buf) > self.unit_len: |
|
|
ret += self.pack_data(buf[:self.unit_len]) |
|
|
ret += self.pack_data(buf[:self.unit_len], ogn_data_len) |
|
|
buf = buf[self.unit_len:] |
|
|
buf = buf[self.unit_len:] |
|
|
ret += self.pack_data(buf) |
|
|
ret += self.pack_data(buf, ogn_data_len) |
|
|
|
|
|
self.last_rnd_len = ogn_data_len |
|
|
return ret |
|
|
return ret |
|
|
|
|
|
|
|
|
def server_post_decrypt(self, buf): |
|
|
def server_post_decrypt(self, buf): |
|
|