Onomondo SoftSIM for Nordic nRF91 Series
August 25, 2026 · View on GitHub
The Onomondo SoftSIM is an Open Source C based UICC implementation, allowing new and innovative cellular device designs to see the light of day in the ever-growing landscape of IoT!
To integrate this awesome new SoftSIM UICC form factor, we have partnered with Nordic Semiconductor to develop and distribute a new SoftSIM modem interface that supports APDU exchange between the modem and the application processor. For more details and an in-depth explanation, refer to Nordic Semiconductor's documentation.
This README is the quick path to a running sample. The full documentation — the design, every interface and configuration option, and how to adapt the SoftSIM to your own product or platform — lives in docs/.
Quick start
-
Initialize a workspace.
west init -m https://github.com/onomondo/nrf-softsim.git git -C modules/lib/onomondo-softsim submodule update --init west updateThe
git submodulestep is required:west updatedoes not initialize the manifest repository's own submodules, and without itlib/onomondo-uiccstays empty and the CMake configure step fails. To add the module to an existing application instead, see docs/integration.md. -
Build and flash the sample.
cd modules/lib/onomondo-softsim/samples/softsim_external_profile west build --sysbuild -b nrf9151dk/nrf9151/ns west flash -
Fetch a profile. Profiles are delivered through Onomondo's API, wrapped by the onomondo-softsim-cli. Generate an API key at app.onomondo.com/api-keys, then:
./softsim fetch --api-key <your_api_key> -n 1 # download 1 encrypted profile into ./profiles ./softsim next --key=<path to your private key> # decrypt and print the next unused profilesoftsim nextguarantees a fresh profile on every call. -
Provision the device. The flashed sample prompts on the UART (115200 baud):
Transfer SoftSIM profile using serial COM port, terminate by newline character. Paste thesoftsim nextoutput and press return. The device provisions, reboots and attaches:<inf> softsim_sample: Profile received: <n> characters in total ... <inf> softsim_sample: LTE connected!Other delivery transports are covered in docs/provisioning.md.
That's it — at a glance, this is what you have just built and provisioned:
┌─────────────────────────────────────────────────────┐
│ Application (your Zephyr software) ├───────┐
└──────────────────────────┬──────────────────────────┘ │
│ │
│ lte_lc_connect() / AT+CFUN=1 │ SoftSIM profile
│ │ (onomondo-softsim-cli)
┌──────────────────────────▼──────────────────────────┐ │
LTE ~~~))) │ nRF91 modem │ │
└────────────┬─────────────────────────▲──────────────┘ │
│ │ │
│ INIT · APDU · │ ATR · response │
│ RESET · DEINIT │ APDU + SW │
│ │ │
┌────────────▼─────────────────────────┴──────────────┐ │
│ nrf-softsim (this repo) │◄──────┘
│ modem glue · work queue · provisioning │ nrf_softsim_provision()
├─────────────────────────────────────────────────────┤
│ onomondo-uicc — the SIM core │
├──────────────────────────┬──────────────────────────┤
│ Storage port │ Crypto port │
│ Zephyr NVS + RAM cache │ PSA Crypto in TF-M │
└──────────────────────────┴──────────────────────────┘
License
The Onomondo nrf-softsim repository is provided under:
- SPDX-License-Identifier: GPL-3.0-only
This repository is licensed under the terms of the GNU General Public License version 3 only, as provided in: