Fixed envelope overhead per page: nonce (12) + tag (16) = 28.
Plaintext expands by exactly this many bytes. This is the value
the page-0 key_check slot (reddb_file) is sized against:
PAGED_ENCRYPTION_KEY_CHECK_BLOB_SIZE = 32 (plaintext) + 28.
Decrypt an envelope produced by encrypt_page. page_id MUST
match the value passed at encrypt time — a mismatch surfaces as
PageEnvelopeError::KeyMismatch (the GCM tag check failing),
which is the correct signal: an attacker swapping pages is
functionally indistinguishable from a wrong key.
Parse a 32-byte AES key from a string — accepts hex (64 chars) or
unpadded/padded standard base64 (43 or 44 chars). Tolerates
leading/trailing whitespace including newlines.