Security model
BitTool Signer is an offline software signer for iPhone and Android. It derives keys and signs on the device, and talks to the outside world only through QR codes. This section explains how it does that and where its protection ends, so you can describe it accurately to your users.
Both apps run the same JavaScript signing engine, so requests are decoded, matched and signed the same way on both. They differ where they rely on the operating system: the iOS Keychain or the Android Keystore, JavaScriptCore or QuickJS. These pages describe the iPhone app and say where Android differs.
The design in one paragraph
Private keys exist only inside BitTool Signer, in memory, for the moment a signature is made. At rest, each wallet's recovery phrase is encrypted twice: once with a key derived from the wallet password, once with a device key that never leaves the phone (kept in the iOS Keychain, or generated inside the Android Keystore). The app has no networking code. Requests arrive as QR codes, are decoded and checked by a bundled JavaScript engine running in an isolated runtime (JavaScriptCore on iPhone, QuickJS on Android), and every signature needs the wallet password again.
What it protects against
| Threat | Protection |
|---|---|
| Malware or a compromised account on your online phone or computer | The keys are on a different, offline device. The online wallet only ever holds public keys. |
| A tampered request (wrong recipient, amount, network, signer) | The signer decodes the exact bytes it signs and shows them; it checks the signer key, network and structure before it signs. See Before signing. |
| Theft of the signer phone | The vault needs the wallet password and the device key, which the operating system releases only when the phone has a passcode or screen lock. Password guesses are slowed down. |
| A copy of the app's files | The vault is encrypted and bound to a device key that never leaves the phone and is excluded from backups. |
| A weak random number generator | New phrases use the operating system's cryptographically secure generator, and the engine's crypto.getRandomValues and Math.random are both rewired to it. See Seed generation. |
What it does not claim
These limits are written into the app's own documentation, and integrations should not overstate them either:
- It is not a hardware wallet. Signing happens in the app's memory, protected by the operating system, not inside a secure element. A jailbroken, rooted or otherwise compromised operating system can observe secrets while they are in use.
- It does not make a phone air-gapped. Keep the signer phone in airplane mode with Wi-Fi and Bluetooth off, and never install other apps on it. The app shows this advice; it cannot enforce it.
- Offline review has limits. The signer cannot know current balances, a token's real behavior, whether a contract is malicious, a blockhash's freshness or on-chain multisig membership. It shows what the bytes say and labels what it cannot verify.
- No independent audit yet. Both apps are open source and each has had two AI-assisted security reviews. None found a Critical or High issue, but the Android reviews found Medium issues that are still open, three of them in the shared engine, and neither app has been audited by an independent security firm.
Security reviews
Version 1.0.0 was reviewed twice on each platform before release, all reviews AI-assisted. The iPhone reviews (Opus 5 and GPT-6 Astra) found one Low issue each and rebuilt the shipped engine byte for byte from source. The Android reviews (Opus 5.5 and GPT-6 Astra) found Medium issues: Solana and Bitcoin summaries that can understate a request, and the way the release signing key was kept. The reports are published in full, with every finding and its status: Security reviews.
Where the code is
| Area | Source |
|---|---|
| Randomness, vault encryption, Keychain | BitToolSigner/Core/VaultCrypto.swift, WalletVault.swift |
| BIP39 seed derivation | BitToolSigner/Core/BIP39Seed.swift |
| JavaScriptCore sandbox | BitToolSigner/Core/SigningEngine.swift |
| QR protocols | engine/protocols.js |
| Matching requests to wallets | engine/src/resolver.js |
| Per-chain parsing and signing | engine/src/{bitcoin,evm,tron,solana}.js |
Repositories: github.com/bitbill/bittool-signer-ios for iPhone and github.com/bitbill/bittool-signer-android for Android. The Android app has the same engine/ folder; its Kotlin code is in app/, core/ and feature/, and the QuickJS host in core/engine/src/main/cpp/.