Skip to content

canokeys/canokey-core

Folders and files

NameName
Last commit message
Last commit date

Latest commit

049465e · Mar 25, 2025
Mar 25, 2025
Mar 25, 2025
Mar 10, 2025
May 21, 2020
Mar 19, 2022
Nov 10, 2021
Dec 15, 2024
Dec 14, 2024
Mar 3, 2025
Mar 9, 2025
Dec 20, 2024
Feb 21, 2025
Feb 3, 2024
Aug 31, 2022
Feb 19, 2025
Sep 1, 2019
May 19, 2020
Mar 25, 2025
Jun 21, 2020
Feb 21, 2025
Oct 19, 2023
Jun 28, 2020
Dec 17, 2024
Feb 2, 2024
Feb 2, 2024
Nov 5, 2021

Repository files navigation

Canokey Core

Tests Coverage Apache License 2.0 FOSSA Status

Introduction

Core implementations of an open-source secure key, with supports of:

  • U2F / FIDO2 with ed25519 and HMAC-secret
  • OpenPGP Card V3.4, Supported Algorithm List
  • PIV (NIST SP 800-73-4)
  • HOTP / TOTP
  • NDEF

The USB mode contains 3 different interfaces:

  • Interface 0: U2F / FIDO2, which is an HID interface
  • Interface 1: PIV/OpenPGP/OATH Card, which is a CCID interface
  • Interface 2: WebUSB, which is not a standard interface
  • Interface 3: Keyboard

The WebUSB interface is used to configure the key via a web-based interface.

Protocol

Please refer to the documentation.

Porting

Use Canokey-STM32 as an example.

  1. You need to implement these functions in device.h:

    • void device_delay(int ms);
    • uint32_t device_get_tick(void);
    • int device_spinlock_lock(volatile uint32_t *lock, uint32_t blocking);
    • void device_spinlock_unlock(volatile uint32_t *lock);
    • int device_atomic_compare_and_swap(volatile uint32_t *var, uint32_t expect, uint32_t update);
    • void led_on(void);
    • void led_off(void);
    • void device_set_timeout(void (*callback)(void), uint16_t timeout);
      • A hardware timer with IRQ is required

If you need NFC, you also need to implement the following functions for FM11NC08:

  • void fm_csn_low(void);
  • void fm_csn_high(void);
  • void spi_transmit(uint8_t *buf, uint8_t len);
  • void spi_receive(uint8_t *buf, uint8_t len);

or the following functions if you use FM11NT08:

  • void fm_csn_low(void);
  • void fm_csn_high(void);
  • void i2c_start(void);
  • void i2c_stop(void);
  • void scl_delay(void);
  • uint8_t i2c_read_ack(void);
  • void i2c_send_ack(void);
  • void i2c_send_nack(void);
  • bool i2c_write_byte(uint8_t data);
  • uint8_t i2c_read_byte(void);
  1. You should also provide a random32 and a optional random_buffer function in rand.h.

  2. You need to configure the littlefs properly.

  3. You need to configure the mbed-tls according to its documentation or provide the algorithms on your own by overwriting the weak symbols.

    Or instead, you may implement the cryptography algorithms by yourself.

  4. You should call the device_loop or nfc_loop in the main loop, and the device_update_led in a periodic interrupt.

  5. You should call the set_touch_result to report touch sensing result, and set_nfc_state to report NFC state.

Fuzz testing

Install honggfuzz from source first, then enable fuzz tests:

cd build
cmake .. -DENABLE_FUZZING=ON -DENABLE_TESTS=ON -DCMAKE_C_COMPILER=hfuzz-clang -DCMAKE_BUILD_TYPE=Debug

Then, run fuzzing tests:

./fuzzer/run-fuzzer.sh honggfuzz ${id}

License

FOSSA Status