summary refs log tree commit diff
diff options
context:
space:
mode:
authorYen Chi Hsuan <yan12125@gmail.com>2016-02-17 06:01:44 +0800
committerYen Chi Hsuan <yan12125@gmail.com>2016-02-20 19:54:58 +0800
commit5bc880b9887c9689fef171683eae279adbbfc186 (patch)
treec5f19e816b4f1ebd8116262b62f24007f554ac52
parent958759f44b3e7c37509394568d9764e2794f713a (diff)
downloadyoutube-dl-5bc880b9887c9689fef171683eae279adbbfc186.tar.gz
youtube-dl-5bc880b9887c9689fef171683eae279adbbfc186.tar.xz
youtube-dl-5bc880b9887c9689fef171683eae279adbbfc186.zip
[utils] Add OHDave's RSA encryption function
-rw-r--r--test/test_utils.py8
-rw-r--r--youtube_dl/utils.py18
2 files changed, 26 insertions, 0 deletions
diff --git a/test/test_utils.py b/test/test_utils.py
index a1e416dd5..e6887be9f 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -35,6 +35,7 @@ from youtube_dl.utils import (
     is_html,
     js_to_json,
     limit_length,
+    ohdave_rsa_encrypt,
     OnDemandPagedList,
     orderedSet,
     parse_duration,
@@ -792,6 +793,13 @@ The first line
                 {'nocheckcertificate': False}, '--check-certificate', 'nocheckcertificate', 'false', 'true', '='),
             ['--check-certificate=true'])
 
+    def test_ohdave_rsa_encrypt(self):
+        N = 0xab86b6371b5318aaa1d3c9e612a9f1264f372323c8c0f19875b5fc3b3fd3afcc1e5bec527aa94bfa85bffc157e4245aebda05389a5357b75115ac94f074aefcd
+        e = 65537
+
+        self.assertEqual(
+            ohdave_rsa_encrypt(b'aa111222', e, N),
+            '726664bd9a23fd0c70f9f1b84aab5e3905ce1e45a584e9cbcf9bcc7510338fc1986d6c599ff990d923aa43c51c0d9013cd572e13bc58f4ae48f2ed8c0b0ba881')
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py
index 672ce05ea..7ce661b09 100644
--- a/youtube_dl/utils.py
+++ b/youtube_dl/utils.py
@@ -4,6 +4,7 @@
 from __future__ import unicode_literals
 
 import base64
+import binascii
 import calendar
 import codecs
 import contextlib
@@ -2582,3 +2583,20 @@ class PerRequestProxyHandler(compat_urllib_request.ProxyHandler):
             return None  # No Proxy
         return compat_urllib_request.ProxyHandler.proxy_open(
             self, req, proxy, type)
+
+
+def ohdave_rsa_encrypt(data, exponent, modulus):
+    '''
+    Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/
+
+    Input:
+        data: data to encrypt, bytes-like object
+        exponent, modulus: parameter e and N of RSA algorithm, both integer
+    Output: hex string of encrypted data
+
+    Limitation: supports one block encryption only
+    '''
+
+    payload = int(binascii.hexlify(data[::-1]), 16)
+    encrypted = pow(payload, exponent, modulus)
+    return '%x' % encrypted