KeyNub ships as one core library with a stable C ABI, with thin bindings layered on top. That matters more than a long language list: the cryptography, the USB transport and the protocol live in one tested place, and a binding is a translation layer rather than a reimplementation. When we fix something, every language gets the fix.
The SDK is Apache-2.0 licensed and readable before you buy. You can evaluate the integration effort without talking to sales, because the protection is the ECC key inside the dongle’s secure element, not secrecy about the protocol.
Supported languages
| Language | How it binds |
|---|---|
| C | the core library and its header directly |
| C++ | RAII wrapper over the C ABI |
| C# / VB.NET / F# | one .NET assembly, KeyNub.LicenseDongle |
| Python | ctypes binding, keynub-licdongle |
| Java | JNA binding |
| Delphi | Pascal unit plus the shared library |
| Visual Basic 6 | COM server — see the VB6 page |
| twinBASIC | the same COM server, 32- or 64-bit |
| VBA (Excel, Access, Word) | Declare PtrSafe module, or COM |
| MATLAB / Simulink | MEX gateway, including MATLAB Coder output |
| LabVIEW | Call Library Function nodes |
| Node.js / Electron | @keynub/licdongle |
| Go, Rust, Ruby, PHP, Lua | FFI bindings shipped with the SDK |
| Fortran, COBOL, Zig, Julia, Nim | ISO-binding / FFI modules shipped with the SDK |
Every binding is built and tested on Windows, Linux and macOS on every change to the SDK, against an in-process software dongle that speaks the real protocol — so the test suite covers the full flow without hardware. Where an environment cannot be automated on a build server (VB6, twinBASIC, MATLAB, LabVIEW) we ship a sample and test the interface it depends on; treat the first run in those IDEs as bring-up.
Where you put the check matters more than which language you use
The most common mistake in dongle integration is asking a yes/no question:
If IsGenuine() Then
unlockEverything()
End If
One patched jump instruction defeats that, in any language. A dongle cannot stop someone editing your binary — so do not give them a single branch to edit. Instead, make the program need something only the dongle can produce:
coefficients = dongle.AppDecrypt(blobShippedWithYourInstaller)
Now the license check is not a gate in front of the feature; it is the feature’s input. Remove the dongle and the code does not run wrong, it has nothing to run on. The SDK documents this pattern for every binding, and the MATLAB and Simulink samples demonstrate it on real plant coefficients.
What a typical integration looks like
- Enumerate and open the dongle (no driver install — it is a HID device)
- Verify it is genuine, against a trust root compiled into your application
- Open an encrypted session
- Read your license record, or decrypt data your application needs
- Ship
Most integrations are a day’s work. If yours is not, tell us what got in the way — that is the kind of bug report we act on.