6bdedf4f86
Remove redundant timer state. This fixes a bug where the timer misses a clock cycle every time the prescaler counter reaches 1. This means if one uses a large prescaler, like 18E6, it is barely noticeable, but if one have a low prescaler and a high timer value it becomes significant. This also yields the running_* registers redundant, which are removed. Add clarity to the readme. Update the timer to default to values of one, for prescaler and timer count. |
||
---|---|---|
.github/workflows | ||
contrib | ||
doc | ||
hw | ||
LICENSES | ||
.editorconfig | ||
.gitattributes | ||
.gitignore | ||
README.md |
Tillitis TKey
The TK1 PCB, also known as TKey.
Introduction
The Tillitis TKey is an open source, open hardware FPGA-based USB security token using DICE-like unconditional measured boot that can run generic applications while still guaranteeing the security of its cryptographic assets.
With the right application, the TKey can be used for:
- authentication,
- cryptographic signing,
- encryption,
- root of trust,
- and more: it's a general computer!
If you want to know more about Tillitis and the TKey, visit:
- Main web: https://tillitis.se/
- Shop: https://shop.tillitis.se/
- Developer Handbook: https://dev.tillitis.se/
- Officially supported apps: https://tillitis.se/download/
- Other known apps: https://dev.tillitis.se/projects/
All of the TKey software, firmware, FPGA Verilog code, schematics and PCB design files are open source, just like all trustworthy security software and hardware should be.
Licensing
See LICENSES for more information about the projects' licenses.
Repositories
This repository contains the FPGA design, the source of the firmware/bootloader, and the source of the USB controller firmware.
Specific documentation regarding implementation is kept close to the code/design in README files, typically in the same directory.
Note that development is ongoing. To avoid unexpected changes of derived key material, please use a tagged release. Read the Release Notes to keep up to date with changes and new releases.
The TKey PCB KiCad design files are kept in a separate repository:
https://github.com/tillitis/tk1-pcba
The TP1 (TKey programmer 1) PCB design files and the firmware sources are kept in:
https://github.com/tillitis/tp1
Note that the TP1 is only used for provisioning the FPGA bitstream into flash or the FPGA configuration memory. It's not necessary if you just want to develop apps for the TKey.
Measured boot
The key behind guaranteeing security even as a general computer is the unconditional measured boot. This means that we have a small, unchangeable, trusted firmware in ROM that creates a unique identity before starting the application. This identity is used as a seed for all later cryptographic keys.
We call this identity the Compound Device Identity (CDI). The CDI is a cryptographic mix of:
- the Unique Device Secret (UDS), a hardware secret, unique per device, something the user has,
- the hash digest of the TKey device application that has been loaded, the integrity of the application, and,
- an optional User Supplied Secret (USS), something the user knows.
CDI is computed using the BLAKE2s hash function:
CDI = BLAKE2s(UDS, BLAKE2s(application loaded in RAM), USS)
When firmware is about to start the device application it changes the TKey to a less permissive hardware mode, application mode. In application mode the UDS and the User Supplied Secret are no longer available, but the device application can use the CDI as a seed to deterministically generate any cryptographic keys it needs.
- If the wrong application has been loaded, or the original application has been tampered with, the generated keys will be different.
- If the USS is not the same, the generated keys will be different.
- If the same USS and device application is used on a different TKey, the generated keys will be different.
The TKey unconditional measured boot is inspired by, but not exactly the same as part of TCG DICE.