A simple Python-based project for managing TP-Link WRxxxN series routers using `requests`. This script handles token generation and allows control of TP-Link WRxxxN routers directly from Python scripts
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

201 lines
6.5 KiB

import base64
import ctypes
import urllib.parse
def _32bit(number):
return ctypes.c_int(number).value
def _zero_fill_right_shift(val, n):
val = _32bit(val)
n = _32bit(n)
return _32bit(val >> n) if val >= 0 else _32bit((val + 0x100000000) >> n)
def hex_md5(a):
return binl2hex(core_md5(str2binl(a), len(a) * 8))
def core_md5(p, k):
p = p + [0] * 1000
p[k >> 5] |= 128 << ((k) % 32)
p[(_zero_fill_right_shift(k + 64, 9) << 4) + 14] = k
plen = ((_zero_fill_right_shift(k + 64, 9) << 4) + 14) + 1
o = 1732584193
n = -271733879
m = -1732584194
l = 271733878
for g in range(0, plen, 16):
j = o
h = n
f = m
e = l
o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936)
l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586)
m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819)
n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330)
o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897)
l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426)
m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341)
n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983)
o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416)
l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417)
m = md5_ff(m, l, o, n, p[g + 10], 17, -42063)
n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162)
o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682)
l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101)
m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290)
n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329)
o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510)
l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632)
m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713)
n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302)
o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691)
l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083)
m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335)
n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848)
o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438)
l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690)
m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961)
n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501)
o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467)
l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784)
m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473)
n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734)
o = md5_hh(o, n, m, l, p[g + 5], 4, -378558)
l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463)
m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562)
n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556)
o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060)
l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353)
m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632)
n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640)
o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174)
l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222)
m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979)
n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189)
o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487)
l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835)
m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520)
n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651)
o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844)
l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415)
m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905)
n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055)
o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571)
l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606)
m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523)
n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799)
o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359)
l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744)
m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380)
n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649)
o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070)
l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379)
m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259)
n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551)
o = safe_add(o, j)
n = safe_add(n, h)
m = safe_add(m, f)
l = safe_add(l, e)
return [o, n, m, l]
def md5_cmn(h, e, d, c, g, f):
h = _32bit(h)
e = _32bit(e)
d = _32bit(d)
c = _32bit(c)
g = _32bit(g)
f = _32bit(f)
return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)
def md5_ff(g, f, k, j, e, i, h):
g = _32bit(g)
f = _32bit(f)
k = _32bit(k)
j = _32bit(j)
e = _32bit(e)
i = _32bit(i)
h = _32bit(h)
return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)
def md5_gg(g, f, k, j, e, i, h):
g = _32bit(g)
f = _32bit(f)
k = _32bit(k)
j = _32bit(j)
e = _32bit(e)
i = _32bit(i)
h = _32bit(h)
return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)
def md5_hh(g, f, k, j, e, i, h):
g = _32bit(g)
f = _32bit(f)
k = _32bit(k)
j = _32bit(j)
e = _32bit(e)
i = _32bit(i)
h = _32bit(h)
return md5_cmn(f ^ k ^ j, g, f, e, i, h)
def md5_ii(g, f, k, j, e, i, h):
g = _32bit(g)
f = _32bit(f)
k = _32bit(k)
j = _32bit(j)
e = _32bit(e)
i = _32bit(i)
h = _32bit(h)
return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)
def safe_add(a, d):
a = _32bit(a)
d = _32bit(d)
c = _32bit(_32bit(a & 65535) + _32bit(d & 65535))
b = _32bit(_32bit(a >> 16) + _32bit(d >> 16) + _32bit(c >> 16))
return _32bit(_32bit(b << 16) | _32bit(c & 65535))
def bit_rol(a, b):
return _32bit(_32bit(a << b) | _32bit(_zero_fill_right_shift(a, 32 - b)))
def str2binl(d):
c = [None] * 1000
a = (1 << 8) - 1
for b in range(0, len(d) * 8, 8):
if c[b >> 5] == None:
c[b >> 5] = 0
c[b >> 5] |= (ord(d[int(b / 8)]) & a) << (b % 32)
return [s for s in c if s != None]
def binl2hex(c):
b = "0123456789abcdef"
d = ""
for a in range(0, len(c) * 4):
d += (
b[int(((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15))]
+ b[int(((c[a >> 2] >> ((a % 4) * 8)) & 15))]
)
return d
def Base64Encoding(s):
return base64.b64encode(s.encode("UTF-8")).decode("UTF-8")
def get_cookie(username, password):
password = hex_md5(password)
auth = "Basic " + Base64Encoding(username + ":" + password)
cookie = "Authorization=" + urllib.parse.quote(auth)
return cookie