Skip to content
Mert Cobanov edited this page Jul 29, 2026 · 4 revisions

berryssh

An SSH client for BlackBerry OS 7.x, written as a plain MIDP 2.0 / CLDC 1.1 MIDlet. It speaks curve25519-sha256, ssh-ed25519 and chacha20-poly1305@openssh.com — the algorithms a current OpenSSH offers by default — so a handset from 2011 can reach a modern server without that server being weakened to meet it.

It needs no BlackBerry code signature. That is not a convenience, it is the reason the project exists in this shape: signing was a runtime check inside the device VM, every signature had to come from BlackBerry's signing authority, and that authority is gone. Code that touches no protected API needs no signature — so berryssh touches none. No RIM APIs, no BlackBerry SDK, nothing to apply for.

Start here

Installing Getting it onto a handset, over the air
Your first connection Making a connection and understanding what it asks you
Reaching remote servers The bridge: how to reach machines that are not on your local network
How it works The design, and why it is the way it is
Building from source Toolchain, tests, and the traps
Troubleshooting Mostly a list of failures that produce no error message

What works

Key exchange, host key verification, password and Ed25519 public key authentication, channels, pty-req, a shell, VT320 emulation with scrollback, saved connections, and SSH carried over a WebSocket for networks whose only entrance speaks HTTP.

Verified against OpenSSH 9.2p1 and against macOS's own sshd: 228 offline vectors plus 39 tests that run against a real server. The keyboard mapping is the one thing still open, because it needs measurements only the hardware can give.

Hardware this was built for

A BlackBerry Bold 9790 — 480×360 screen, hardware QWERTY. Anything running BlackBerry OS 7.x with MIDP 2.0 and CLDC 1.1 should work; nothing in the code is specific to the 9790 except the font atlas sizes, which are chosen for a 480×360 screen.

Licence and source

GPL-2.0-or-later. Source at github.com/cobanov/berryssh.

Clone this wiki locally