Skip to content

2.0Tools

Seal

Seal encrypts a message or a file to an ML-KEM public key, in the browser, in an envelope any compatible implementation can open.

The construction

  • ML-KEM (FIPS 203) encapsulates a fresh 32-byte secret to the recipient's public key.
  • HKDF-SHA-256 derives a one-time AES-256-GCM key from that secret, a random 16-byte salt and the label "kibora/seal/v1".
  • AES-256-GCM encrypts the content with a random 12-byte nonce. The entire header is authenticated as associated data.

Envelope format, version 1

layout
offset  bytes  field
0       4      magic "KBSL"
4       1      version = 0x01
5       1      suite: 1 ML-KEM-512, 2 ML-KEM-768, 3 ML-KEM-1024
6       8      key id = first 8 bytes of SHA-256(recipient public key)
14      16     HKDF salt
30      12     AES-GCM nonce
42      n      ML-KEM ciphertext (768 / 1088 / 1568)
42+n    rest   AES-256-GCM ciphertext with 16-byte tag

plaintext = u16 name length | name (UTF-8) | u8 kind (0 text, 1 file) | content

Text form

For chats and email the envelope is base64 between the lines -----BEGIN KIBORA SEAL----- and -----END KIBORA SEAL-----. Files can be saved as .kbseal instead. The browser limit is 25 MB.

Finding a recipient

Paste a public key, use one made in Key Forge, or look up an address in the Lattice Book. A key from the book is only as trustworthy as the account that published it: if you can, confirm the first characters of the key with the person over another channel.