summaryrefslogtreecommitdiffstats
path: root/samloader/auth.py
blob: 5b6a1d599ba2e60bec3a77b1a9b072f67ce07a34 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2020 nlscc

# FUS authentication functions (decrypting nonce, calculating auth token)

from Cryptodome.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