2025-06-17 13:34:32 +02:00
---
related-to:
- "[[Codex Encryption Basis]]"
2025-06-30 14:19:35 +02:00
- "[[How to get a pointer to a seq to pass it to a C library]]"
2025-06-17 13:34:32 +02:00
---
2025-06-30 14:19:35 +02:00
As summarized in [[Codex Encryption Basis#^b2e265|the proposal]], we:
- use a freshly generated random master key (at least 256 bits) per dataset (generated and kept on the user's machine)
- derive a new encryption key and also an IV for each block from the master key and the block index
- use for example AES192-CBC
For example, we could have
key = SHA256( MASTER_KEY || block_index ), truncated to 192 bits
IV = SHA256( MASTER_IV || block_index ), truncated to 128 bits
where both `MASTER_KEY` and `MASTER_IV` are 256 bit random numbers, and `||` denotes concatenation.
If storing 512 bits (as opposed to a 256 bit minimum) of key material is a problem, we could derive both by the same key, for example as
key' = SHA256( MASTER_KEY || 0x01 || block_index ), truncated to 192 bits
IV' = SHA256( MASTER_KEY || 0x02 || block_index ), truncated to 128 bits
2025-06-17 13:34:32 +02:00
Some context info:
- [bearssl ](https://bearssl.org/ )
2025-06-30 16:25:33 +02:00
- [bearssl Nim bindings ](https://github.com/status-im/nim-bearssl )
- A nice example of using BearSSL encryption API (Arduino) https://github.com/kakopappa/esp8266-aes-cbc-encryption-decryption/blob/main/esp8266-aes-cbc-encryption-decryption.ino