TROPIC01


článek pro Praktická elektronika – zřejmě 05/2025
(prosím nešířit)

v plánu jsou dva (možná i tři) články – díly bych nečísloval, uvidí se, jak to budeme stíhat, možná to bude ob jedno číslo (je to poměrně dost práce a studování)

díl první:
TROPIC01 – malý velký čip (obecné seznámení a základy)
díl druhý:
TROPIC01 – první jednoduché experimenty (s ESP32 a Micropythonem)
díl třetí:
jak to vyjde – pokud bude zájem a budeme mít relevantní materiál k nějakým „projektům“
– generáror entropie
– zabezpečení PINem
– …



TROPIC01 – malý velký čip

Ing. Jan Čopák

Je to teprve několik týdnů, co náš pražský hackerspace OctopusLAB obdržel první vzorky nového bezpečnostního čipu TROPIC01. Tento inovativní produkt by měl zajistit velmi dobrou ochranu proti nejsofistikovanějším útokům, což z něj činí klíčový prvek pro moderní IoT zařízení, kryptopeněženky či digitální identity. Nabízí navíc i nezvyklou transparentnost, ověřitelnost a mohl by tak zásadním způsobem změnit pravidla hry v oblasti hardwarové bezpečnosti. Vyvíjí ho společnost Tropic Square a co je pro nás také velmi zajímavé, jedná se o českou firmu!

Česká společnost Tropic Square je součástí skupiny SatoshiLabs. Prosazuje se svým inovativním přístupem k hardwarové bezpečnosti. Její čip představuje takřka revoluční posun v oboru, kde tradiční řešení často zakládají bezpečnost na utajení. TROPIC01 je první auditovatelný čip s otevřenou architekturou, což umožňuje nezávislé testování a ověřování jeho bezpečnostních vlastností nejen odborníky, ale i širokou open-source komunitou.

Takto vypadá aktuální návrh TROPIC01. Ono se snadno řekne: „vyrobíme čip“, ale od myšlenky k funkčnímu prototypu to zabralo několik let intenzivní práce. Obvod nabízí (mimo jiné) 238 kB uživatelské paměti pro klíče a data, což je přibližně 4,5× více než u srovnatelných SE (např. NXP SE050C). Na hardwarové úrovni je čip chráněn aktivní kovovou stínicí vrstvou a mnoha prvky ochrany, které ještě zmíníme podrobněji.

Pouzdro QFN32 (4x4mm) ve srovnání s „klasickým“ rozestupem dvou 2.5mm pinů. Takovou součástku si umí připájet jen málokdo (ale jde to).

Co znamená TROPIC? Je to TRuly OPen IC, což je plně otevřený integrovaný obvod. Takřka všechny elektronické čipy byly totiž do této chvíle navrhovány jako „closed hardware“ (uzavřený hardware). Tak označujeme hardwarové systémy, jejichž návrh, architektura a výrobní postupy jsou chráněny jako obchodní tajemství a nejsou volně přístupné veřejnosti či nezávislým vývojářům. Takový hardware nelze snadno modifikovat nebo vylepšovat třetími stranami. Výrobci totiž úzce kontrolují celý životní cyklus produktu – od návrhu přes výrobu až po aktualizace a opravy a nikoho dalšího nenechají pod pokličku ani nakouknout.
Trh elektronických čipů je proto vnímán jako „uzavřená chráněná oblast“. Důvody k tomu jsou docela logické, shrňme si alespoň zásadní z nich: ochrana vysoké vstupní investice a technologické bariéry, udržení dominance několika klíčových hráčů, státní regulace nebo strategický význam, ochrana duševního vlastnictví.

Tento model sice pomáhá firmám udržet si konkurenční výhodu, ale zároveň omezuje otevřenost, spolupráci a potenciál k inovacím ze strany menších subjektů či komunitních projektů. Co však vývojáře z oblasti „počítačové“ bezpečnosti trápilo nejvíce, byla nemožnost důkladného auditu bezpečnostních prvků s nutností důvěřovat netransparentním certifikačním autoritám a k čipům přistupovat jako k „black boxu“ – černé skříňce, které MUSÍME důvěřovat.




Nebudeme zde zacházet do detailů. Základní dokumentace (technický datasheet spolu s API) má totiž dohromady skoro dvě stovky stránek. Proto zde probereme jen to podstatné nebo důležité.

Centrální procesorová jednotka (CPU) obvodu TROPIC01 je postavena na otevřené architektuře RISC-V.
Hlavní funkcí „secure elementu“ není jen generování a ochrana kryptografických klíčů, ale i bezpečné provádění kryptografických operací (např. ECDSA, EdDSA a X25519). Díky plně auditovatelnému designu mají jednotlivci i firmy možnost provádět vlastní testy a ověřovat, zda čip neobsahuje žádné zranitelnosti či zadní vrátka. Transparentnost, kterou Tropic Square prezentuje, zaručuje, že výsledky testů jsou veřejně dostupné a podporují princip „Don’t Trust, Verify“ (nevěř, ale ověřuj).

Velmi zajímavým prvkem čipu je využití PUF (physically unclonable function) – fyzikálně neklonovatelné funkce. Tato technologie využívá přirozené fyzické variace v polovodičových součástkách k vytvoření jedinečného hardwarového otisku. Ten pak může posloužit jako základ pro generování kryptografických klíčů bez nutnosti jejich permanentního uložení. PUF však není přímo dostupný jako samostatný výstup; jeho hodnota je integrována do mechanismu Key and Entropy Distribution Engine, který využívá unikátní otisk čipu například pro šifrování dat. Součástí tohoto mechanismu jsou také dva nezávislé generátory kryptograficky bezpečných náhodných čísel s dobrou entropií – TRNG1 a TRNG2. Zatímco TRNG2 poskytuje náhodná čísla pro šifrovací operace a autentizační protokoly, TRNG1 je primárně využíván interně k podpoře redundantních kontrol a zajištění integrity systému.

Co se týče paměťové architektury, TROPIC01 obsahuje různé typy Non-Volatile Memory (NVM). K dispozici je I-Memory (Irreversible Memory) s pevně zakódovanými výrobními daty (data se zapisují při inicializaci, dále už se nedají měnit), dále R-Memory (Reversible Memory), rozdělená do chráněných oblastí pro uložení klíčů, konfiguračních registrů a uživatelských dat. Velikost jednotlivých oddílů umožňuje uložení několika desítek ECC klíčů, stovek uživatelských slotů či monotónních čítačů. Tato paměť zajišťuje trvalé uchování dat i po odpojení napájení a její obsah je chráněn jak přístupovými právy, tak detekcí pokusů o manipulaci. Veškerá data jsou silně šifrována s využitím jedinečného „otisku“ čipu z PUF a tak ani data, která by mohla být pracně získána pomocí elektronového mikroskopu, by se nedala zneužít.

Tropic01 obsahuje dedikovaný kryptografický engine (Security Hardened Encryption Engine) pro každý úkol. Tato část poskytuje pokročilé kryptografické operace jako je ECDSA, EdDSA nebo X25519 s důrazem na ochranu proti fyzickému i logickému narušení. Modul PIN verifikace je navržen s ohledem na odolnost vůči „brute-force“ útokům, využívá redundantní kódování a je úzce propojen s interním alarmovým systémem čipu. Kryptografické operace probíhají výhradně uvnitř bezpečné oblasti, kde jsou soukromé klíče chráněny nejen softwarově, ale především hardwarově. Výsledný obvod je totiž navržen tak, aby odolal takřka veškerým představitelným fyzickým útokům, k čemuž slouží samostatná bezpečnostní vrstva čipu označovaná jako Physical Security. Fyzická bezpečnost je zde podpořena celou řadou integrovaných senzorů, včetně teplotních senzorů, glitch detektorů, laserových a EM pulzních detektorů, detekce přístupů přes sondy či manipulaci s kovovými vrstvami čipu. Tyto senzory umožňují čipu reagovat na pokusy o fyzickou manipulaci či invazní útoky.


Kerckhoffův princip říká, že bezpečnost kryptografického systému by měla vycházet pouze z tajnosti klíče, nikoli z utajení samotného algoritmu. Jinými slovy, i když by byl algoritmus veřejně znám, systém by měl zůstat bezpečný, pokud klíč zůstane tajný. Tento princip podporuje transparentnost a umožňuje nezávislé ověření bezpečnosti kryptografických metod.

Projekt se řídí Kerckhoffovým principem a proto je kladen zvláštní důraz na ochranu klíčů. Právě privátní klíče by měly být bezpečně uloženy ve speciálně navrženém zabezpečeném čipu, který by měl poskytnout nadstandardně vysokou úroveň ochrany proti neoprávněnému přístupu a dalším bezpečnostním hrozbám.
V době, kdy kyberkriminalita narůstá a regulace se zpřísňují, je nezbytné mít k dispozici dostatečně silné bezpečnostní prvky. Je to právě otevřená architektura TROPIC01, která umožňuje výrobním partnerům a designérům plnou kontrolu nad bezpečností jejich zařízení.


Čip TROPIC01 se připojuje ke zákaznickému systému prostřednictvím sběrnice SPI, která umožňuje spolehlivou výměnu dat díky použití ochranných kódů. Důležitá komunikace totiž probíhá po šifrované lince, což zaručuje vysokou úroveň bezpečnosti a ochranu před neoprávněným přístupem.
(Datové L2 rámce a „Secure Session“ L3 používají NOISE KK1_25519_AESGCM_SHA256 handshake protokol zajišťující oboustrannou autentizaci a perfektní forward secrecy.)

Pro první experimenty jsme měli zapůjčený modul se speciální patici, do které se dají čipy snadno vložit.


A ještě tu mám jednu novinku, o které jsem se dozvěděl až v průběhu psaní článku: TROPIC01 získal první místo v prestižní kategorii Embedded Award for Safety and Security na Embedded World 2025 v Norimberku, čímž potvrzuje svojí důležitou pozici na trhu bezpečnostních prvků. Vývojáři tak budou moci konečně obdržet řešení odpovídající nárokům moderní digitální éry.

Pokračování příště…



díl druhý:

TROPIC01 – základní jednoduché experimenty

Ing. Jan Čopák

Přestože obvod cílí na profesionální použití a je tak určen pokročilejším vývojářům, v tomto díle se pokusíme ukázat, že to nemusí být nepřekonatelná překážka.
Pro připojení k ESP32 pomocí sběrnice SPI nám stačí propojit několik drátků a spuštění základního pokusu v MicroPythonu je také snadné, protože zabere jen několik řádků kódu.




V předchozím článku (v čísle 5) jste se mohli dozvědět, že TROPIC01 je auditovatelný čip s otevřenou architekturou. Snahou vývojářů z české firmy Tropicsquare je, co nejvíce (v mezích možností patentů a dalších dohod se třetími strami) zpřístupnit informace o hardware. Co je však zdokumentováno zcela podrobně je „firmware“ obvodu, na rozdíl od běžných soudobých secure elementů, které mívají často řadu funkcí nezdokumentovanou a pak hrozí, že se někdo (v horším případě s nekalými úmysly) „prolomí“ pomocí těchto nezdokumentovaných funkcí do případné zranitelnosti čipu a ohrozí tak milióny zařízení, které na obvod spoléhají.

Tentokrát si už bez dalšího většího zdržování ukážeme několik elementárních principů, jak s čipem pracovat a nastíníme, co od něj můžete očekávat.
V OctopusLABu vytváříme soubor knihoven v Micropythonu: github.com/petrkr/pytropicsquare
Vycházeli jsme z dostupné dokumentace a ukázek (napsaných v C pro STM) na stránkách výrobce:
github.com/tropicsquare/libtropic

Obr. 1 – připojení pomocí SPI

Na obrázku 1 je schéma, jak připojíme TROPIC01 k ESP32. Využíváme pouze SPI komunikace, všechny ostatní PINy jsou pro inicializaci, testování a specializované vývojáře. V běžné produkci budou tyto vstupy „uzamčeny“ (například přepálením vnitřních pojistek) a tak zvenku nedostupné.

Obr. 2 – vývojové moduly

Pro TROPIC01 postupně vzniká celá řada vývojových modulů. My jsme většinou používali „Secure Tropic Click“ (zelený – na obrázku 2 vlevo). V době psaní článku už testujeme i vlastní modul (modrý, na obrázku 2 vpravo). Tato destička se připojuje přímo na OCTOBUS (sběrnici pro vývojové moduly od OctopusLAB, která má I2C, SPI a další čtyři uživatelsky volitelné datové linky).

Pro zásadní zjednodušení je vytvářena další nadřazený soubor modulů, který vývojářům umožní soustředit se na jejich projekt, aniž by museli pronikat do rozsáhlých hlubin základních knihoven:
github.com/octopusengine/tropic01_examples
Tento repozitář obsahuje srozumitelná vysvětlení, příklady a testy pro bezpečnostní prvek TROPIC01. Naším cílem je snížit vstupní bariéru pro pochopení fungování tohoto čipu a umožnit tak rychlý začátek experimentů. Díky zjednodušeným ukázkám a detailním návodům se vývojářům podaří rychle se seznámit s funkcemi TROPIC01 a efektivně jej integrovat do svých systémů, což usnadňuje práci s touto moderní technologií.

Obr 3. – navázání zabezpečené komunikace na L3

Jak navázat základní komunikaci s čipem? Obrázek 3 je zde spíše pro ilustraci, o jak komplexní proces jde a náš „zapouzdřený“ kód to zjednoduší na import knihovny s instancí ts (která už v sobě zahrnuje i připojení pomocí SPI) spolu s parametry klíčů a pak už jen zavoláme metodu start_secure_session.

from esp32_lib import ts
ts.start_secure_session(...)

přesněji tedy:

from upy_esp32_tropic01.tropic_upy_lib import ts, sh0priv, sh0pub
ts.start_secure_session(pkey_index_0, bytes(sh0priv), bytes(sh0pub))


Ukázka práce s pamětí

O paměti si ještě řekneme více, zatím jen jednoduchý test, jak uložit a přečíst nějaká data.
Pro inicializaci se musí použít ts.mem_data_erase(1) – smaže obsah na pozici 1
uložení: ts.mem_data_write(data, 1)
a pro čtení: data = ts.mem_data_read(1)
Detailnější fragment finálního kódu je níže, celý program je v githubu jako upy_esp32_tropic01/upyesp_02data.py.

...
print_head("upy_02data | read data | ",True)
print("Starting secure session...\n")
ts.start_secure_session(pkey_index_0, bytes(sh0priv), bytes(sh0pub))

print("[ test memory data ]")

hex_key = '0c1e24e5917779d297e14d45f14e1a1a' # andreas
byte_array_key = bytes.fromhex(hex_key)
# ts.mem_data_erase(1) # first init
ts.mem_data_write(byte_array_key, 1)
# if Err:: constant/cmd_result/:
# TropicSquareError: Command failed with result: 0x10 == CMD_RESULT_MEM_WRITE_FAIL
# ---> First, it is necessary to perform mem_data_erase(mem_index)
"""
data0 = ts.mem_data_read(0) # slot0
print(" data0:",data0) # empty
data1 = ts.mem_data_read(1)
print(" data1:",data1) # andreas

"""
MPY: soft reboot
--------------------------------------------------
Lib. TropicSquareMicroPython | version: 0.0.1
upy_02data | read data |
--------------------------------------------------
Starting secure session...
[ test memory data ]
data0: b''
data1: b'\x0c\x1e$\xe5\x91wy\xd2\x97\xe1ME\xf1N\x1a\x1a'
"""

Monotónní čítače

Čip TROPIC0116 monotónních čítačů (mcounter), indexovaných od 0 do 15 (​tropic01_user_api).
Monotónní čítače jsou důležité pro zajištění neměnnosti a bezpečnosti, typicky ve scénářích, kde je potřeba počítat nebo omezovat počet operací. V projektech s TROPIC01 mohou sloužit pro:

  1. Zajištění nezfalšovatelné sekvence událostí – např. proti přehrání starších zpráv nebo rollbacku.
  2. Počítání omezeného množství operací – např. počet podpisů nebo přístupů k citlivým datům.
  3. Zajištění jednorázových operací – jako „self-destruct“ po několika pokusech.
...
print_head("upy_03mcounter | Monotonic Counter",True)
print("Starting secure session...\n")
ts.start_secure_session(pkey_index_0, bytes(sh0priv), bytes(sh0pub))

print("ts.mcounter_init()",ts.mcounter_init(3,123))
print(ts.mcounter_get(3))
print("ts.mcounter_update()", ts.mcounter_update(3))
print(ts.mcounter_get(3))
"""
MPY: soft reboot
--------------------------------------------------
Lib. TropicSquareMicroPython | version: 0.0.1
upy_03mcounter | Monotonic Counter
--------------------------------------------------
Starting secure session...

ts.mcounter_init() True
123
ts.mcounter_update() True
122
"""

V ukázce inicializujeme mcounter(3) hodnotou 123: ts.mcounter_init(3,123)
po ts.mcounter_update(3) nám ts.mcounter_get(3) vrací hodnotu o 1 vyšší.
Celý program je opět na githubu jako upy_esp32_tropic01/upyesp_03mcounter.py.


Digitální podpisy

Asymetrické klíče uložené a chráněné uvnitř čipu TROPIC01 mohou být využity pro digitální podepisování zpráv, ověření integrity firmware, bezpečné přihlašování zařízení nebo šifrování citlivých dat. Díky tomu, že privátní klíč nikdy neopouští čip a operace (např. podpis hashe) se provádí uvnitř něj, zajišťuje TROPIC01 ochranu před odcizením klíče i při fyzickém napadení zařízení. Takové řešení je ideální pro IoT, embedded systémy, platební terminály nebo hardwarové peněženky.


Asymetrická kryptografie využívá dvojici klíčů: soukromý klíč (private key), který je tajný a nikdy neopouští zařízení, a veřejný klíč (public key), který je určen ke sdílení. Tyto klíče jsou matematicky propojené, ale z veřejného klíče nelze prakticky získat klíč soukromý. Nejčastějšími aplikacemi jsou digitální podpisy (kdy se podepisuje zpráva soukromým klíčem a ověřuje veřejným), šifrování a autentizace. Bezpečnost vychází z obtížnosti určitých matematických operací – např. výpočet diskrétního logaritmu nebo eliptických bodů.

Obrázek ilustruje princip operací nad eliptickou křivkou, jak se používají v kryptografii. Pevně zvolený výchozí bod G je na grafu označen největším kolečkem s číslem 1. Soukromý klíč k udává, kolikrát se tento bod G opakovaně přičte sám k sobě (“skoky”), čímž vzniká bod k × G. Veřejný klíč je pak souřadnice výsledného bodu P=(x, y) na křivce. Barevné čáry ukazují postup jednotlivých sčítání (skoků). Díky obtížnosti tzv. eliptické diskrétní logaritmické úlohy nelze z pozice výsledného bodu P zpětně určit, kolikrát (pro jaké k) se bod G přičítal – přesně tak, jak z veřejného klíče (souřadnic bodu) nelze dopočítat odpovídající soukromý klíč.
Privátní klíče jsou zpravidla velmi velká čísla. Při generování se dá využít pro skok i dvojnásobek, proto generování klíče je velmi rychlé.

TROPIC01 využívá eliptické křivky (ECC – Elliptic Curve Cryptography), které poskytují vysokou úroveň bezpečnosti při relativně malých velikostech klíčů. Podporuje dvě konkrétní křivky:

  • P256 (0x01) – standardizovaná NIST křivka používaná v algoritmu ECDSA. Veřejný klíč má 64 bajtů (32 bajtů pro souřadnice X a Y). Hodí se tam, kde je potřeba kompatibilita s běžnými kryptosystémy.
  • Ed25519 (0x02) – modernější křivka navržená pro vyšší výkon, bezpečnost a jednoduchost, používaná v algoritmu EdDSA. Její veřejný klíč má pouze 32 bajtů. Díky deterministickému podepisování a nižší chybovosti je vhodná např. pro embedded systémy nebo firmware podpisy.

...
...
def print_ecc_key(slot):
print("[Slot]", slot)
try:
ecc_tuple = ts.ecc_key_read(slot)
except Exception as e:
# If an error occurs (e.g., key not present), print the error message.
print("Error reading ECC key from slot", slot, ":", e)
print("Generating new ECC key in slot", slot)
try:
# Generate a new ECC key in the given slot using P256
ts.ecc_key_generate(slot, 1) # (curve value 1).
except Exception as gen_err:
print("Error generating ECC key in slot", slot, ":", gen_err)
return

try:
# Try reading the key again after generation.
ecc_tuple = ts.ecc_key_read(slot)
except Exception as e2:
print("Error reading ECC key after generation from slot", slot, ":", e2)
return

# Print the tuple returned from ecc_key_read.
# The third element of the tuple contains the public ECC key.
ecc_key = ecc_tuple[2]
print("ecc_key:", ecc_key.hex())
# ================================
message = b"abc"
sha256 = uhashlib.sha256()
sha256.update(message)
hashed_message = sha256.digest() # 32 byte
print("hashed_message:",hashed_message.hex())

print_ecc_key(1)
rs = ts.ecdsa_sign(1, hashed_message) # slot: int, hash: bytes
print("R:",rs[0].hex())
print("S:",rs[1].hex())

"""
...
pkey_index_0: 0
Exception: Response status is not OK (status: 0x7f)
hashed_message: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
--------------------------------
[Slot] 1
ecc_key: 90cf272a6b284f33f20a5e3506b0ebf29b5259db4323f9e21036961eba98e09c678ab1db7ea681f07a09b5e09072c4d4f97003da6937da695440ed43aefa52f9
R: 4cc9f47d24b6cb2d8edc82b71a62a0e0e354fa9027805385cd4e73778ecbf757
S: be798b2122cd9313055e245a81ed80f5060ba83903c7ff31b090de3a4a07f99d
...
"""

Digitální podpis v ECDSA funguje tak, že se ze zprávy vypočítá hash, který se podepíše pomocí tajného klíče, čímž vzniknou dvě hodnoty: R (náhodné číslo) a S (výsledek výpočtu). Tyto hodnoty spolu se zprávou odešlete příjemci, který pomocí veřejného klíče ověří, zda podpis odpovídá zprávě. Každý podpis je unikátní, protože při podpisu se pokaždé generuje jiné R – to zabraňuje zpětnému odhalení tajného klíče. Díky tomu si příjemce může být jistý, že zpráva pochází od vás a nebyla změněna.

V ukázce je stěžejní metoda ts.ecdsa_sign(slot_klíče,hash_msg) a vytvořili jsme si i pomocnou funkci pro výpis informace o stavu klíče v daném slotu print_ecc_key(slot) – můžeme mít totiž k dispozici mnoho různých klíčů. Celý program je zase na Githubu v ukázkách: upy_esp32_tropic01/upyesp_05sign.py.

TROPIC01 se díky otevřené dokumentaci i jednoduchým MicroPython knihovnám stává dostupným nástrojem i pro vývojáře, kteří s bezpečnostními elementy teprve začínají. Stačí základní propojení přes SPI a základní otestovaného programu, abyste navázali zabezpečenou komunikaci, pracovali s interní pamětí, monotónními čítači či digitálně podepisovali data přímo na čipu. Díky připraveným ukázkám a přehledným vysvětlením, které najdete v repozitářích TropicSquare i OctopusLAB, snadno překlenete vstupní bariéru a rychle otestujete možnosti TROPIC01 ve vlastních projektech. V dalším díle se podíváme hlouběji na jiné funkce, optimalizaci výkonu a integraci čipu do reálných aplikací – takže ať už se věnujete IoT, embedded systémům nebo hardwarovým peněženkám, TROPIC01 vám otevře dveře k bezpečnému a auditovatelnému řešení.

pokračování příště


Třetí (závěrečný) díl začíná zde



TROPIC01 – dokončení a soutěž


V této kapitole nahlédneme pod pokličku knihovny, kterou používáme při vývoji aplikací s bezpečnostním čipem od Tropic Square na platformě ESP32. Zaměříme se na tajemný pojem entropie – vysvětlíme její důležitost, použití a na jednoduchém projektu si ukážeme jak s ní pracovat.
A do třetice tu máme soutěž o vývojové moduly s TROPIC01.


Tak jdeme na to. Zaměřme se nejdříve na tři klíčové oblasti, které je dobré vědět ještě předtím, než začnete psát vlastní firmware (v minulých dílech jsme je brali jako samozřejmost):

1) Inicializace sběrnice SPI

Bezdrátové čipy ESP32 mají na různých vývojových deskách odlišně vyvedené piny SPI. Soubor tropic01_upy_lib.py proto obsahuje jednotné rozhraní, které usnadňuje konfiguraci – stačí upravit čísla pinů podle konkrétního hardwaru.
Pro nás zde bylo důležité nastavit SPI: sck=Pin(18), miso=Pin(19), mosi=Pin(23), cs = Pin(5). Tak, jak to máme na vývojové desce s ESP32.

2) Přednastavené párovací klíče a certifikát

Každý čip TROPIC01 už od výrobce přichází s párovacím klíčem (private + public) uloženým v chráněných „slotech“ v interní paměti. V ukázkovém kódu používáme základní sadu: sh0priv + sh0pub. (Jedná se o pár klíčů pro asymetrickou kryptografii, pro nás to pro zjednodušení může být pouze „klíč“.)

Tento klíč slouží pro první „navázání důvěry“ mezi čipem a zákaznickým systémem. Můžete ho nahradit vlastním párem, nebo jej po úvodním spárování přepsat uživatelským (klientským) klíčem. My jsme zatím byli opatrnější, protože při nesprávné manipulaci bychom si mohli přístup k secure elementu uzamknout nadobro (což je vlastnost, nikoli chyba).

Bezpečnostní doporučení:
Výrobní klíče nikdy nesdílejte veřejně a po otestování je co nejdříve nahraďte klíči generovanými přímo na cílovém zařízení.

3) Inicializace objektu TropicSquareMicroPython

Jakmile máte připravené piny a klíče, přistoupíme k inicializaci a vytvoříme hlavní instanci třídy TropicSquareMicroPython:

ts = TropicSquareMicroPython(spi, cs)
  • Konstruktor automaticky provede základní diagnostiku čipu (verze firmwaru, stav slotů).
  • Otestuje tak, zda je čip správně připájen a spolehlivě komunikuje na dané rychlosti SPI.
  • Připraví interní frontu pro asynchronní operace, takže funkce už můžete volat z hlavní smyčky bez dalšího čekání.
# tropic01_upy_lib.py

from tropicsquare.ports.micropython import TropicSquareMicroPython
from tropicsquare import __version__
from machine import SPI, Pin

...

# Default factory pairing keys
pkey_index_0 = 0x00 # Slot 0
sh0priv = [0xd0, ..., 0x2e, 0x71, 0x6b]
sh0pub = [0xe7, ..., 0xd3, 0x8d, 0x54]

# SPI Initialization
spi = SPI(1, baudrate=1000000, polarity=0, phase=0, sck=Pin(18), //
miso=Pin(19), mosi=Pin(23))
cs = Pin(5, mode=Pin.OUT, value=1)

# Initialize TropicSquare
ts = TropicSquareMicroPython(spi, cs)


Generování náhodných čísel (entropie)

Tento jednoduchý projekt využívá čip TROPIC01 k získání hardwarové entropie, kterou vizualizujeme na OLED displeji jako náhodný shluk bodů – svítící pixel představuje bit „1 “, zhasnutý „0 “. Takto můžeme na první pohled ověřit, že generátor pracuje správně a částečně i to, že data nejsou deterministická. (Pro lepší vizuální ověření je vykreslení ve velkém rozlišení, kde by v případě nízké entropie mohly být patrny „nezdravé“ opakující se paterny v rozložení šumu).
Kvalitní entropie je základem kryptografie: umožňuje bezpečně vytvářet privátní klíče, inicializační vektory i jednorázové přístupové tokeny a chrání tak systémy před útoky založenými na předvídatelnosti.

Jak TROPIC01 generuje hardwarovou entropii?

Čip TROPIC01 obsahuje tři nezávislé bloky TRNG (True Random Number Generator): TRNG0, TRNG1 a TRNG2.

  • TRNG2 je určený pro aplikace uživatele – jeho výstup lze získat příkazem Random_Value_Get, který vrací až 255 bajtů skutečně náhodných dat na jeden dotaz.
  • TRNG0 a TRNG1 jsou zdrojem pro interní kryptografické jednotky (např. generátor klíčů) a běží i v režimu start‑up. Pokud kterýkoli z nich detekuje nedostatečnou entropii, může podle nastavení registru CFG_SENSORS vyvolat Alarm Mode – nebo být dočasně umlčen bitem PTRNG0_TEST_DIS / PTRNG1_TEST_DIS.
  • Při každém restartu provádí bootloader PTRNG self‑test (lze vypnout bitem RNGTEST_DISCFG_START_UP) – neúspěch opět blokuje spuštění a chrání systém před slabou entropií.

Fyzikální princip

Každý TRNG využívá soustavu „prstencových“ oscilátorů a metastabilních latchů, jejichž šum je digitalizován a prochází kondicionačním SHA‑256 blokem. Díky tomu je výstup nepředvídatelný i při běžných rušivých vlivech (teplota, napětí, EMI). Entropie je dále hlídána – pokud klesne pod prahovou hodnotu, aktivuje se alarm.

Porovnání s pseudonáhodnými generátory (PRNG)

Na rozdíl od softwarových pseudonáhodných generátorů (PRNG), jako je například Mersenne Twister nebo volání random() v C, čerpá hardwarový TRNG v čipu TROPIC01 náhodnost z fyzikálního šumu uvnitř čipu. Díky tomu je neopakovatelný – při každém spuštění produkuje jinou sekvenci bitů. PRNG se naproti tomu po nastavení stejného seedu chová deterministicky a vygeneruje vždy totožný výstup.

Hardwarová entropie TRNG je proto ideální pro kryptografická použití, jako je tvorba privátních klíčů, inicializačních vektorů či jednorázových nonce. Softwareový PRNG je sice o několik řádů rychlejší (typicky nanosekundy na bajt oproti mikrosekundám při SW generování), ale bez dostatečně náhodného seedu je jeho výstup snadno předvídatelný a pro bezpečnostní účely nevhodný. TRNG navíc žádný externí seed nepotřebuje, zatímco PRNG se bez něj neobejde – právě slabší entropie seedu by se mohla stát místem útoku.

V praxi se proto TRNG používá k „seedování“ bezpečných pseudonáhodných generátorů (CSPRNG) nebo přímo k vytváření klíčů a nonce pro kryptografické protokoly. Bez kvalitní entropie jsou i nejlepší algoritmy snadno napadnutelné.

V následující částí se nachází fragment kódu, který jsme použili pro vykreslení „náhodného šumu“.
OLED diplej máme připojen k ESP32 přes rozhraní I2C. Nic dalšího kromě secure elementu TROPIC01 už není potřeba.
Celý program najdete na github.com/octopusengine/tropic01_examples/blob/main/oled_entropy.py
Stěžejní funkce pro TROPIC je ts.get_random(n), která vrací n Bytů.
Funkce shannon_entropy(s) průběžně propočítává výslednou entropii.

...
def shannon_entropy(s):
freq = {}
for c in s:
if c in freq:
freq[c] += 1
else:
freq[c] = 1
entropy = 0.0
length = float(len(s))
for count in freq.values():
p = count / length
entropy -= p * math.log(p, 2)
return entropy

def entropy():
rnd32 = ts.get_random(16) # 16*2=32
print(rnd32.hex(), len(str(rnd32.hex())))

hex_str = rnd32.hex()
ent_per_char = shannon_entropy(hex_str)
total_entropy = ent_per_char * len(hex_str)
print("Shannonova entropie na znak:", ent_per_char, "bitů")
print("Celková entropie:", total_entropy, "bitů")

print("[ RND ]")
for y in range(1,63):
rnd32 = ts.get_random(8) # 16*2=32
print(rnd32)
print(y, rnd32.hex())
draw_point(oled,str(rnd32.hex()),y)
...



Informační nebo též shannonovská entropie je střední hodnota množství informace připadající na jeden symbol generovaný stochastickým zdrojem dat.
cs.wikipedia.org/wiki/Informa%C4%8Dn%C3%AD_entropie(wiki.cz)

Míra informační entropie přiřazená ke každé možné datové hodnotě je záporným logaritmem pravděpodobnostní funkce dané hodnoty:

Dva triviální příklady

🎲 Příklad 1: Házíme 5ti kostkami
Každá kostka má 6 možností (1 až 6) a všechny mají stejnou pravděpodobnost 1/6.
Takže entropie jedné kostky je:

to znamená, že každá kostka nese asi 2,6 bitu informace.
Když hodíme 5 kostkami, celková entropie je: 5×2.585≈12.925 bitů
To znamená, že když někomu chceme popsat výsledek hodu 5 kostkami, potřebujeme asi 13 bitů informace.

🪙 Příklad 2: Házíme 8mi mincemi
Každá mince má jen 2 možnosti: hlava nebo orel. Každá má pravděpodobnost 1/2,
takže entropie jedné mince je:

Celková entropie 8 mincí je:
8×1=8 bitů
Na zapsání výsledků 8 mincí potřebujeme přesně 8 bitů.


Entropie měří nepředvídatelnost nebo množství informace.

  • Více možností znamená vyšší entropie.
  • Rovnoměrné rozložení pravděpodobností vede k maximální entropii.
  • V praxi to znamená, že čím víc možností a čím jsou „rovnoměrnější“, tím víc informací musíme přenést, abychom popsali výsledek. Dostatečně velká míra entropie je velmi důležitá při generování privátních klíčů.


Na obrázku vidíte jednoduchou vývojovou sestavu pro experimentování s PINem.
PIN je zkratka pro Personal Identification Number – osobní identifikační číslo. Je to krátká, obvykle 4- až 6místná tajná číselná kombinace, jejíž účel asi vysvětlovat nemusíme. PIN zadáváte pro základní ověření své identity (např. k platební kartě, mobilu nebo internetovému bankovnictví).
K ESP32 jsme připojili I2C LCD čtyřřádkový displej a k IC2 osmibitovému expandéru PCF8574 je napojena maticová klávesnice 4×4 znaků (což postačí na číselný PIN i na základní řídící příkazy).


Soutěž

Popište nám, do jakého projektu by se vám čip mohl hodit, sedm nejzajímavějších námětů získá testovací modul.
Modrá destička PCB s napájeným čipem TROPIC01, kterou můžete hned připojit ke svému ESP32, STM nebo Raspberry PI.


Napište do konce prázdnin na mail:
agamapoint@protonmail.com

Vyhodnocení soutěže https://www.octopuslab.cz/soutez-tropic01/







soutěž:
případné poznámky…
kontakty
pravidla…

Dokumentace:
https://github.com/tropicsquare/tropic01/tree/main/doc
github.com/octopusengine/tropic01_examples | | github.com/tropicsquare