diff options
Diffstat (limited to 'samloader/auth.py')
-rw-r--r-- | samloader/auth.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/samloader/auth.py b/samloader/auth.py new file mode 100644 index 0000000..d2c6257 --- /dev/null +++ b/samloader/auth.py @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2020 Nayil Mukhametshin + +# FUS authentication functions (decrypting nonce, calculating auth token) + +from Crypto.Cipher import AES +import base64 +import requests + +KEY_1 = "hqzdurufm2c8mf6bsjezu1qgveouv7c7" +KEY_2 = "w13r4cvf4hctaujv" + +unpad = lambda d: d[:-d[-1]] +pad = lambda d: d + bytes([16 - (len(d) % 16)]) * (16 - (len(d) % 16)) + +def aes_encrypt(inp, key): + cipher = AES.new(key, AES.MODE_CBC, key[:16]) + return cipher.encrypt(pad(inp)) + +def aes_decrypt(inp, key): + cipher = AES.new(key, AES.MODE_CBC, key[:16]) + return unpad(cipher.decrypt(inp)) + +def getfkey(inp): + key = "" + for i in range(16): + key += KEY_1[inp[i]] + key += KEY_2 + return key.encode() + +def getauth(nonce): + keydata = [ord(c) % 16 for c in nonce] + fkey = getfkey(keydata) + return base64.b64encode(aes_encrypt(nonce.encode(), fkey)).decode() + +def decryptnonce(inp): + nonce = aes_decrypt(base64.b64decode(inp), KEY_1.encode()).decode() + return nonce |