|
|
@ -3319,6 +3319,57 @@ class PerRequestProxyHandler(compat_urllib_request.ProxyHandler):
|
|
|
|
self, req, proxy, type)
|
|
|
|
self, req, proxy, type)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Both long_to_bytes and bytes_to_long are adapted from PyCrypto, which is
|
|
|
|
|
|
|
|
# released into Public Domain
|
|
|
|
|
|
|
|
# https://github.com/dlitz/pycrypto/blob/master/lib/Crypto/Util/number.py#L387
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def long_to_bytes(n, blocksize=0):
|
|
|
|
|
|
|
|
"""long_to_bytes(n:long, blocksize:int) : string
|
|
|
|
|
|
|
|
Convert a long integer to a byte string.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If optional blocksize is given and greater than zero, pad the front of the
|
|
|
|
|
|
|
|
byte string with binary zeros so that the length is a multiple of
|
|
|
|
|
|
|
|
blocksize.
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
# after much testing, this algorithm was deemed to be the fastest
|
|
|
|
|
|
|
|
s = b''
|
|
|
|
|
|
|
|
n = int(n)
|
|
|
|
|
|
|
|
while n > 0:
|
|
|
|
|
|
|
|
s = compat_struct_pack('>I', n & 0xffffffff) + s
|
|
|
|
|
|
|
|
n = n >> 32
|
|
|
|
|
|
|
|
# strip off leading zeros
|
|
|
|
|
|
|
|
for i in range(len(s)):
|
|
|
|
|
|
|
|
if s[i] != b'\000'[0]:
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
# only happens when n == 0
|
|
|
|
|
|
|
|
s = b'\000'
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
|
|
|
|
s = s[i:]
|
|
|
|
|
|
|
|
# add back some pad bytes. this could be done more efficiently w.r.t. the
|
|
|
|
|
|
|
|
# de-padding being done above, but sigh...
|
|
|
|
|
|
|
|
if blocksize > 0 and len(s) % blocksize:
|
|
|
|
|
|
|
|
s = (blocksize - len(s) % blocksize) * b'\000' + s
|
|
|
|
|
|
|
|
return s
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def bytes_to_long(s):
|
|
|
|
|
|
|
|
"""bytes_to_long(string) : long
|
|
|
|
|
|
|
|
Convert a byte string to a long integer.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is (essentially) the inverse of long_to_bytes().
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
acc = 0
|
|
|
|
|
|
|
|
length = len(s)
|
|
|
|
|
|
|
|
if length % 4:
|
|
|
|
|
|
|
|
extra = (4 - length % 4)
|
|
|
|
|
|
|
|
s = b'\000' * extra + s
|
|
|
|
|
|
|
|
length = length + extra
|
|
|
|
|
|
|
|
for i in range(0, length, 4):
|
|
|
|
|
|
|
|
acc = (acc << 32) + compat_struct_unpack('>I', s[i:i + 4])[0]
|
|
|
|
|
|
|
|
return acc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ohdave_rsa_encrypt(data, exponent, modulus):
|
|
|
|
def ohdave_rsa_encrypt(data, exponent, modulus):
|
|
|
|
'''
|
|
|
|
'''
|
|
|
|
Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/
|
|
|
|
Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/
|
|
|
|