diff options
| author | Yen Chi Hsuan <yan12125@gmail.com> | 2017-02-28 19:16:55 +0800 | 
|---|---|---|
| committer | Yen Chi Hsuan <yan12125@gmail.com> | 2017-02-28 22:10:31 +0800 | 
| commit | 0a5445ddbeb8d391bbac92e5fe9074c6aa2e1565 (patch) | |
| tree | 61313a7ee99210ff44e2e9627a71ac91d7f2cf4c /youtube_dl/utils.py | |
| parent | f48409c7ac186fa38bbeb2df2b210e37a18eb04b (diff) | |
[utils] Add bytes_to_long() and long_to_bytes()
Used in daisuki.net (#4738)
Both are adapted from public domain PyCrypto:
https://github.com/dlitz/pycrypto/blob/master/lib/Crypto/Util/number.py
Diffstat (limited to 'youtube_dl/utils.py')
| -rw-r--r-- | youtube_dl/utils.py | 51 | 
1 files changed, 51 insertions, 0 deletions
| diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 8bd075eaf..807183f4a 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -3319,6 +3319,57 @@ class PerRequestProxyHandler(compat_urllib_request.ProxyHandler):              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):      '''      Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/ | 
