Skip to the content
PCBKitNew board
2 layers21 × 35 mmTinycrypt key, the printed circuit board in 3D

Tinycrypt key

nakomis/tinycrypt

ATtiny85 + ATECC608A crypto experimentation platform — embedded crypto, U2F hardware key, ESP32 integration

Size
21 × 35 mm
Copper layers
2
Thickness
1.6 mm
Parts
25
Nets
14
Pads
142
Tracks, vias
119, 42
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
30 Apr 2026
Updated
31 Oct 2026

Overview

Tinycrypt key is an open-source printed circuit board by nakomis, from the nakomis/tinycrypt repository on GitHub, published under the CC0-1.0 licence. It is a 2-layer board of 21 × 35 mm with 25 parts on 14 nets, routed with 119 tracks and 42 vias.

It is built around the ESP32-S3-MINI-1-N8, AP2112K-3.3TRG1 and ATECC608B-SSHDA-T, with the USBLC6-2SC6, TS-1187A-B-A-B and WS2812B-2020-V6 among its other parts. Its parts include 8 capacitors, 6 resistors, 4 ICs, 1 diode and 1 connector. It belongs with the ESP32 boards of this library.

Main components

6

README

README.md

tinycrypt — a DIY FIDO2 security key you approve from your Apple Watch

tinycrypt logo

Support

If you find this useful, please consider buying me a coffee:

Donate with PayPal

Table of Contents

Overview

A YubiKey-style FIDO2/WebAuthn USB security key built on an ESP32-S3, where the "touch the key" step happens on your wrist instead: the key sends a push notification to an Apple Watch, you tap Approve, and the watch proves it over Bluetooth before the key signs you in.

The first target is signing into AWS IAM Identity Center with the "Security key" MFA option.

Hardware:

  • ESP32-S3 (target board: Waveshare ESP32-S3-Zero) — native USB, Wi-Fi, BLE
  • Microchip ATECC608 — ECC P-256 secure element (I²C) for key storage, added after the software prototype
  • Apple Watch — user-presence approval

Status: feasibility spikes. Spike A passed: an ESP32-S3 running the SoloKeys solo1 CTAP2 core, with an insecure software key and a BOOT-button presence check, registered and signed into IAM Identity Center from Chrome. The earlier ATtiny85 / U2F experiments live on the spike branch.

How it fits together

tinycrypt architecture

  1. The browser asks the key (USB HID, CTAP2) for a WebAuthn assertion.
  2. The key sends an approval request: AWS IoT Core → SNS → APNs → actionable watch notification (about 2 s).
  3. You tap Approve; the watch connects to the key over BLE and signs a fresh nonce with its Secure Enclave key. The watch must be in Bluetooth range: a remote approval is impossible. On a real watch the Bluetooth exchange takes about 1.4 s after you tap.
  4. The key verifies the watch's signature, then signs the WebAuthn assertion and returns it to the browser.

The firmware is split into a portable CTAP2 core with swappable transport, crypto, presence and notifier back ends, so most of it also runs as a simulator on macOS.

Testing builds can use a software key instead of the ATECC608. That build is deliberately insecure, is for testing only, and must only ever be registered against a read-only test user.

Building and testing

All the firmware lives in embedded/, and the commands below run from there. The CTAP2 core is SoloKeys solo1 (Apache-2.0 OR MIT), pinned as a submodule in embedded/third_party/solo1 under its own licence. Fetch it and the libraries it builds:

bash
cd embedded
git submodule update --init third_party/solo1
git -C third_party/solo1 submodule update --init crypto/cifra crypto/micro-ecc crypto/tiny-AES-c tinycbor
Path (under embedded/)What it is
cmake/solo_sources.cmakeThe core's source list, shared by both builds
port/Portable code: the secure-element interface and solo1's crypto routed through it, presence, the soft element (TINYCRYPT_INSECURE_SOFT_KEY, refused in release builds)
sim/Mac simulator: CTAPHID over UDP, state in a directory
esp32s3/ESP-IDF firmware: TinyUSB FIDO HID, the ATECC608B (or the soft element in NVS), presence, the provisioner
tests/python-fido2 tests against the sim, plus hw_smoke.py for a real key

Mac sim (needs brew install libsodium):

bash
cmake -S . -B build -DTINYCRYPT_INSECURE_SOFT_KEY=ON && cmake --build build
python3 -m venv tests/.venv && tests/.venv/bin/pip install -r tests/requirements.txt
tests/.venv/bin/python -m pytest tests
build/tinycrypt-sim --presence prompt     # run it by hand; press Enter to approve

ESP32-S3 (ESP-IDF 5.5 in ~/esp/v5.5/esp-idf):

bash
esp32s3/build.sh                                    # build (KEYSTORE=atecc for the ATECC608B; soft by default)
esp32s3/build.sh -p /dev/cu.usbmodemXXXX flash      # flash over the UART port
esp32s3/flash-manual.sh /dev/cu.usbmodemXXXX        # if auto-reset fails: hold BOOT, tap RST, release BOOT first
tests/.venv/bin/python tests/hw_smoke.py            # register + authenticate; press BOOT when asked

The key enumerates on the S3's native USB port (not the UART one) as "tinycrypt INSECURE TEST KEY", USB ID 303a:4004.

ATECC608B (CRYPT-22). Wire a breakout to the dev board: VCC to 3V3, GND, SDA to GPIO38, SCL to GPIO21 (the PCB's pins; change them under esp-cryptoauthlib in esp32s3/build.sh menuconfig). The breakouts have their own pull-ups. A blank chip answers at 0xC0 (8-bit); the M5Stack Trust&GO unit (0x6A) is factory-locked and can't take tinycrypt's configuration. Locking is permanent: do a sacrificial chip first. The provisioner's console is the native USB port (USB-Serial-JTAG), so connect that one; flashing it and the key image straight after needs no BOOT+RST.

bash
KEYSTORE=atecc esp32s3/build.sh provisioner                 # the provisioner image
ESPTOOL_BEFORE=default_reset esp32s3/flash-manual.sh --provisioner /dev/cu.usbmodemXXXX  # else BOOT+RST first
esp32s3/tools/atecc_provision.py /dev/cu.usbmodemXXXX info
esp32s3/tools/atecc_provision.py /dev/cu.usbmodemXXXX lock  # PERMANENT; asks for the serial
esp32s3/tools/atecc_provision.py /dev/cu.usbmodemXXXX csr tinycrypt-sandbox-key-1 /tmp/key-1.csr
infra/scripts/provision-key.sh key-1 --csr /tmp/key-1.csr   # certificate from the chip's own key
KEYSTORE=atecc esp32s3/build.sh && ESPTOOL_BEFORE=default_reset esp32s3/flash-manual.sh /dev/cu.usbmodemXXXX   # the key again

The same steps with the default soft keystore move a key's IoT private key out of prov into its (INSECURE) soft element, with no chip.

Architecture Diagram

docs/architecture/tinycrypt.drawio will be the source for the architecture diagram; the SVG is auto-regenerated on commit by the pre-commit hook in .githooks/pre-commit.

To activate the hook after cloning:

bash
git config core.hooksPath .githooks

Support

If you find this useful, please consider buying me a coffee:

Donate with PayPal

Parts

25
QtyValueFootprintReferences
4100nFC0402C3, C5, C7, C8
310uFC0603C1, C2, C4
210kR0402R2, R3
24k7R0402R4, R5
2M2 holeMountingHole_M2_2.2mm_Pad4.4H1, H2
1ART1ART1
11uFC0402C6
1330RR0402R6
15k1R0402R1
1AP2112K-3.3TRG1SOT-25-5_L2.9-W1.6-P0.95-LS2.8-BLU2
1ATECC608B-SSHDA-TSOIC-8_L4.9-W3.9-P1.27-LS6.0-BLU4
1Debug padsDebugPads_1x5_P2.54TP1
1ESP32-S3-MINI-1-N8BULETM-SMD_ESP32-S3-MINI-1-N8U1
1SM05B-SRSS-G-TBCONN-SMD_SM05B-SRSS-G-TB-LF-SNJ1
1TS-1187A-B-A-BSW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL_H1.5SW1
1USBLC6-2SC6SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BLU3
1WS2812B-2020-V6LED-SMD_4P-L2.2-W2.0-P1.00_WS2815C-2020-4PD1

Questions

How big is the Tinycrypt key PCB?

It measures 21 × 35 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Tinycrypt key use?

25 parts, built around the ESP32-S3-MINI-1-N8, AP2112K-3.3TRG1, ATECC608B-SSHDA-T and USBLC6-2SC6. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Tinycrypt key KiCad files?

From the nakomis/tinycrypt repository on GitHub, at the commit this page was made from: the board is hardware/key-board/out/key/tinycrypt-key.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Tinycrypt key design in my own project?

Its repository publishes it under the CC0-1.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 4 layers38.5 × 29 mmPl60c dmx mini, the printed circuit board in 3D

    Pl60c dmx mini

    tsmiltonAgents/pl60c-dmx-wakeup

    A small ESP32-S3 board that drives the wired DMX512 input of a Neewer PL60C panel light so the light can be ramped up slowly in the morning (sunrise alarm). Rev A, 2026-09-02.

    37 parts
  • 4 layers63 × 85 mmFujiNet O2-Rev0, the printed circuit board in 3D

    FujiNet O2-Rev0

    FujiNetWIFI/fujinet-hardware

    Schematics and design files for FujiNet hardware

    132 parts142
  • 4 layers90 × 60 mmBench psu, the printed circuit board in 3D

    Bench psu

    PaulBichl/VibePCB-bench-psu

    USB-C PD (20 V) powered bench supply, 2 independent channels, 1.6-16.6 V / 3 A each, constant voltage / constant current, designed with VibePCB.

    206 parts1
  • 4 layers76 × 100 mmPower hub, the printed circuit board in 3D

    Power hub

    kartben/hw-testing-rack

    3D-printed, tilted test shelf for 16 dev boards: sliding drawers, per-bay ESP32-S3 running Zephyr (USB/IP, power switching, metering), KiCad PCBs, OpenSCAD parts, BOM and an interactive 3D viewer

    181 parts
  • 4 layers65 × 56 mmSensor HAT, the printed circuit board in 3D

    Sensor HAT

    Eniemooo/Sensor-HAT

    Open-hardware indoor air sensor (CO2, VOC/NOx, T/RH, light, sound): HAT for Raspberry Pi or standalone with Seeed XIAO + ESPHome. KiCad 10.

    112 parts
  • 2 layers53.3 × 68.6 mmArduino uno, the printed circuit board in 3D

    Arduino uno

    Chicken-Fried/Cave-Uno

    Modernized Arduino Uno R3 compatible board powered by Microchip ATmega328PB. Features driverless USB-C, 1.5A sync buck, ideal-diode OR-ing, dual I2C/SPI/UART, and LiDAR topographic artwork.

    85 parts
  • 4 layers92 × 56 mmREIN R1, the printed circuit board in 3D

    REIN R1

    rein-baremetal/REIN_R1_KiCad

    Dual-MCU baremetal embedded development board featuring high-speed QSPI storage, hardware USB hub, and flexible power management. Open for PCB trace routing collaboration

    177 parts2
  • 2 layers45.1 × 20.8 mm2FAK Programmable, the printed circuit board in 3D

    2FAK Programmable

    planmarks/2FAK

    2FAK Programmable USB and 2-Factor Authentication Key

    26 partsApache-2.0