-
Notifications
You must be signed in to change notification settings - Fork 0
Installing
BlackBerry OS 7 installs applications over the air: you open a .jad
descriptor in the handset's own browser and it fetches the .jar beside it.
There is no cable, no desktop tool, and no signing step.
Open this on the handset's browser, over plain HTTP:
http://berryssh.cobanov.run/
Tap the install link. That is the whole procedure.
If you would rather host it, or you are building your own:
python3 tools/ota_server.py outIt prints a URL. Open that on the handset over Wi-Fi.
A generic static file server will not work, and the way it fails is the
problem. Read the next section before reaching for python3 -m http.server.
berryssh.jad text/vnd.sun.j2me.app-descriptor
berryssh.jar application/java-archive
Serve the descriptor as anything else — text/plain, or the
application/octet-stream a generic host guesses — and the browser displays
it as text instead of installing it. Nothing says why. It just looks like a
page of key-value pairs.
tools/ota_server.py exists solely to get those two headers right.
An OS 7.1 browser offers TLS 1.0 at best, and its trust store is from 2011. A current CDN refuses TLS 1.0 and 1.1 outright and presents a certificate chained to a root that did not exist when the handset shipped. Neither half can be worked around from the device.
So whatever hostname you serve from must not redirect HTTP to HTTPS. On
Cloudflare that means turning off "Always Use HTTPS" for that hostname. On a
.dev domain it is hopeless regardless — .dev is an HSTS-preloaded TLD.
This applies only to fetching the installer. Once installed, berryssh does its own cryptography and does not use the browser's TLS for anything.
The descriptor states the jar's length. If they disagree by even one byte the
install fails silently. build.sh computes it, so this only bites when the two
files come from different builds — which is easy to do accidentally through a
cache. If you put a CDN in front, serve both no-store; caching a 240-byte
descriptor buys nothing and can serve it beside a jar it does not describe.
The version in the descriptor must increase. Install a build whose version equals the installed one and the device refuses it as already installed, and says nothing about versions when it does.
Saved connections survive upgrades. The stored format is versioned and every older layout is still read.
If you built it yourself and the device says this, the jar was not preverified. See Building from source.