High-level Signal encryption/decryption for WhatsApp messages.
Handles the full flow of:
- Fetching prekeys for new recipients
- Creating/using Signal sessions
- Encrypting outgoing messages
- Decrypting incoming messages
Summary
Functions
Decrypts an incoming message.
Decrypts an incoming message without GenServer calls (safe inside Session handlers).
Encrypts a message for a recipient.
Encrypts a message for a recipient (synchronous version - no GenServer calls).
Pads plaintext according to WhatsApp's padding scheme.
Unpads a decrypted message.
Functions
@spec decrypt_from_sender(pid(), String.t(), binary(), atom()) :: {:ok, binary()} | {:error, term()}
Decrypts an incoming message.
@spec decrypt_from_sender_sync( any(), any(), String.t(), binary(), atom() | String.t() ) :: {:ok, binary(), any()} | {:error, term()}
Decrypts an incoming message without GenServer calls (safe inside Session handlers).
@spec encrypt_for_recipient(pid(), String.t(), binary()) :: {:ok, binary(), :prekey | :whisper} | {:error, term()}
Encrypts a message for a recipient.
Will fetch prekeys and create a session if needed. Returns the encrypted payload and whether it's a prekey message.
@spec encrypt_for_recipient_sync(any(), any(), String.t(), binary(), map()) :: {:ok, binary(), :prekey | :whisper, any()} | {:error, term()}
Encrypts a message for a recipient (synchronous version - no GenServer calls).
This avoids deadlock when called from within a GenServer handle_call.
Pads plaintext according to WhatsApp's padding scheme.
WhatsApp uses PKCS7-like padding with random suffix to obscure message length.
Unpads a decrypted message.