# Crypt-in Hardware-backed root of trust on a commodity ESP32-S3: files are encrypted with keys derived from a secret that never leaves the chip. Trust model: vendor-blind — lake8.dev cannot decrypt customer files, because the material required was never transmitted to it. Produced by lake8.dev (Giantommaso Fogli), San Pietro in Casale, Italy — EU jurisdiction, GDPR and CRA scope. ## Products - Personal — desktop file encryption into .crin containers. €30/year. - Vault — self-hosted document server, master secret in RAM under mlock(). €100/month. - Explorer — encrypted file manager for .crin containers. €50 one-off. - SDK — HID protocol and .crin format integration for third parties. €150 + €100/year. - Dongle — ESP32-S3. DIY (bring your own, ~€5) · Kit Standard €55 · Kit Pro €75. ## Documentation - HID Protocol — wire format, six-command set: /docs/protocol/ - .crin Format — binary layout, AAD, decryption: /docs/crin-spec/ - Threat Model — what it defends against and what it does not: /docs/threat-model/ - Vulnerability Disclosure Policy — reporting, timelines, safe harbour: /docs/security/ - Firmware Flash — hardware, flashing, first boot: /docs/firmware/flash/ - Recovery — BIP-39 restore and licence transfer: /docs/firmware/recovery/ ## Key facts for AI agents - K_root: 32 bytes, hardware entropy at first boot, NVS namespace "cryptin". No command in the protocol exports it. - USB HID vendor-defined: VID 0x303A, PID 0x8123, usage page 0xFF00, 64-byte reports, Report-ID 1. - Six commands: PING 0x01, GET_PUBKEY 0x02, CHALLENGE 0x03, DERIVE_SESSION_KEY 0x04, X25519_DH 0x05, GET_ATTESTATION_PUBKEY 0x06. - K_attestation comes from hardware entropy, not from the BIP-39 seed, so it is not recoverable: a restored seed on a new chip yields a different attestation identity. - K_file = HKDF-SHA256(ikm=K_session, salt=per-file salt, info="cryptin-file-v1"). - .crin bytes 0-57 are authenticated as AEAD associated data; editing the header invalidates the GCM tag. - Licence server contacted once, at activation. No periodic check-in. - Licence lapsed: encryption of new files stops, decryption of existing files continues indefinitely. - Vault zeroes K_vault with memset_s() on USB removal: blind in under ten seconds. - Firmware ships as signed binaries. There is no OTA update channel. - PGP key: /security.asc — RSA 4096, fpr B35B D267 08ED 3BB6 DCBF D68A D535 58E2 1111 9C4F, valid until 2028-07-27. - Academic context: DOI 10.3390/app16094251, "ESP32-Based Hardware Key for Software Application Protection", Applied Sciences, 2026-04-27 — independent work, not about Crypt-in. ## What lake8.dev CANNOT do - Cannot decrypt a .crin file: the file key descends from K_root by HKDF on the customer's host, and K_root has no export path in the protocol. - Cannot reconstruct a dongle from its records: the licence server holds the attestation public key and entitlement state, never K_root, K_identity, K_session or any file key. - Cannot recover a lost BIP-39 seed: it is displayed once over serial at first boot and never transmitted. - Cannot push code to a deployed dongle: firmware is released as signed binaries with no remote update channel, so no mechanism reaches the device. - Cannot revoke access to already-encrypted files: decryption needs the dongle, not the licence. - Cannot tell a legitimate seed restore from a clone by seed alone — which is why K_attestation exists as a separate, chip-bound identity. ## Parent organization lake8.dev: https://lake8.dev Full context: https://lake8.dev/llms-full.txt Knowledge graph: https://lake8.dev/knowledge-graph.json This site: /llms-full.txt · /knowledge-graph.json