Smart Energy Water SCM API Secrets
Once upon a time I learned about Opower HomeAssistant integration. But my utility does not use Opower, it was using something called “Smart Energy Water”.
Smart Energy Water, or #SEW is a SaaS provider, and they ship the whole thing – the backend, frontend, and the phone apps, the latter under the name SCM, which means Smart Customer Mobile.
So I embarked on a journey to figure out how these phone apps worked and, if successful, get my data out and into homeassistant.
APK
I pulled an APK of my utility from Google Play Store and found that something secret is hidden in a libnative-lib.so binary, under com.sew.scm.gcm.SecureConstant
, under a few methods returning String, and some methods that decrypt these strings using a heavily obfuscated set of routines, which essentially XOR'd (in case of Android APK) the values of gcm_default_sender_id
+ google_app_id
+ Android_App_RatingConstant_File
, all the values from the strings.xml
within the app resources.
One of the decoded tokens contains a key for request encryption. It was ...
PasswordPassword
SCM apps use private APIs. In order to remain private and hard to use the requests are encrypted.
You urlencode the parameters into key=value&key1=value1...
form, then encrypt the resulting string using AES-CBC with PKCS5 Padding (16 bytes variant) using PasswordPassword
as both the key
and IV
.
Then you send {"EncType": "A", "EncQuery": "base64-encoded-encrypted-string"}
, and receive response from one of the .../API/Module/MethodName
endpoints. The response will be JSON with no extra encryption, so it is definitely a deterrent against making requests, not a security feature.
Login
Armed with that knowledge, and some help from exposed API listing on one of the utility websites I found that I need to use ValidateUserLoginMob
call expecting userid
and password
.
However, password
had to be base64-encoded result of applying a secret scheme from that SecurityConstant module above. It is always SHA256
.
So my first https://utility.example.net/API/UserLogin/ValidateUserLogin
was a success, I got LoginToken
and AccountNumber
, which was all we needed to start poking APIs.
Tada!
If your utility uses SEW SCM, i.e. one of these at https://play.google.com/store/apps/developer?id=Smart+Energy+Water, you should be able to get API listing by visiting the web interface, and appending /API/Help. Or, if your utility runs an older version of SCM, replace /portal/
with /portalservice/UserLogin.svc/help
or /portalservice/Usage.svc/help
. You may get the .NET API definitions.