Huawei Modem/Router sending encrypted requests

This relates to my Huawei python API here.

I'm adding a dedicated post on this as I expect it may be useful for others.
This took me quite a while to get working and I couldn't find any working solutions online.

This implements the javascript RSA encryption used for encrypting requests to be sent to the modem's underlying API in python.

The javascript code is:

function RSAEncrypt(text) {
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
if(m == null)
return null;
var c = this.doPublic(m);
if(c == null)
return null;
var h = c.toString(16);
if((h.length & 1) == 0)
return h;
else
return "0" + h;
}

The python code I got working is:
import uuid
import hashlib
import hmac
from binascii import hexlify
import math
import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey.RSA import construct

def rsa_encrypt(rsae, rsan, data):
    if (data is None or data == ''): return ''
    N = long(rsan,16)
    E = long(rsae,16)
    b64data = base64.b64encode(data)
    pubkey = construct((N, E))
    cipher = PKCS1_v1_5.new(pubkey)
    blocks = int(math.ceil(len(b64data) / 245.0))
    result = []
    for i in range(blocks):
        block = b64data[i*245:(i+1)*245]
        d = cipher.encrypt(block)
        result.append(d)
    result = hexlify(''.join(result))
    if ((len(result) & 1) == 0):
        return result
    else:
        return '0'+result

RSAE and RSAN tokens are returned by the router on a successful login.
The content type on the encrypted call also needs to be:

headers['Content-type'] = 'application/x-www-form-urlencoded; charset=UTF-8;enc'


Comments

Popular posts from this blog

Experience with Optus 4G wireless broadband

Port Forwarding on Optus 4G B525 router

Huawei B525 Python API