Human-readable recovery keys for private key backup.
A recovery key is a 64-character string encoded with a custom base32 alphabet (no I/O/0/1 to avoid confusion), formatted as 13 hyphen-separated groups:
ABCDE-FGHJK-LMNPQ-RSTUV-WXYZ2-34567-89ABC-DEFGH-JKLMN-PQRST-UVWXY-Z2345-6789The recovery key encodes a 32-byte secret which can encrypt/decrypt the user's private key as a backup mechanism.
Usage
# Generate a recovery key for the user to write down
{:ok, recovery_key, secret} = MetamorphicCrypto.Recovery.generate()
# Encrypt the user's private key for recovery backup
{:ok, backup} = MetamorphicCrypto.Recovery.encrypt_private_key(private_key, secret)
# Later, restore from backup using the recovery key
{:ok, restored_secret} = MetamorphicCrypto.Recovery.key_to_secret(recovery_key)
{:ok, private_key} = MetamorphicCrypto.Recovery.decrypt_private_key(backup, restored_secret)
Summary
Functions
Decrypt a private key from a recovery backup.
Encrypt a private key (base64) with the recovery secret for backup storage.
Generate a new recovery key.
Re-derive the 32-byte secret from a human-readable recovery key.
Functions
@spec decrypt_private_key( ciphertext_b64 :: String.t(), recovery_secret_b64 :: String.t() ) :: {:ok, String.t()} | {:error, String.t()}
Decrypt a private key from a recovery backup.
Returns {:ok, private_key_b64} or {:error, reason}.
Example
{:ok, private_key} = MetamorphicCrypto.Recovery.decrypt_private_key(backup, secret)
@spec encrypt_private_key( private_key_b64 :: String.t(), recovery_secret_b64 :: String.t() ) :: {:ok, String.t()} | {:error, String.t()}
Encrypt a private key (base64) with the recovery secret for backup storage.
Returns {:ok, ciphertext_b64} or {:error, reason}.
Example
{:ok, backup} = MetamorphicCrypto.Recovery.encrypt_private_key(private_key_b64, secret)
Generate a new recovery key.
Returns {:ok, recovery_key, recovery_secret_b64} where:
recovery_keyis the human-readable string to show the userrecovery_secret_b64is the 32-byte secret (base64) used for encryption
Example
{:ok, recovery_key, secret} = MetamorphicCrypto.Recovery.generate()
# recovery_key => "ABCDE-FGHJK-LMNPQ-..."
Re-derive the 32-byte secret from a human-readable recovery key.
Case-insensitive. Hyphens are stripped automatically.
Returns {:ok, secret_b64} or {:error, reason}.
Example
{:ok, secret} = MetamorphicCrypto.Recovery.key_to_secret("ABCDE-FGHJK-...")