summaryrefslogtreecommitdiff
path: root/libs/libaxolotl/src/session_cipher.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libaxolotl/src/session_cipher.h')
-rw-r--r--libs/libaxolotl/src/session_cipher.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/libs/libaxolotl/src/session_cipher.h b/libs/libaxolotl/src/session_cipher.h
new file mode 100644
index 0000000000..9e4e61b6cf
--- /dev/null
+++ b/libs/libaxolotl/src/session_cipher.h
@@ -0,0 +1,156 @@
+#ifndef SESSION_CIPHER_H
+#define SESSION_CIPHER_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include "axolotl_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * The main entry point for Axolotl encrypt/decrypt operations.
+ *
+ * Once a session has been established with session_builder,
+ * this class can be used for all encrypt/decrypt operations within
+ * that session.
+ */
+
+/**
+ * Construct a session cipher for encrypt/decrypt operations on a session.
+ * In order to use session_cipher, a session must have already been created
+ * and stored using session_builder.
+ *
+ * The store and global contexts must remain valid for the lifetime of the
+ * session cipher.
+ *
+ * When finished, free the returned instance by calling session_cipher_free().
+ *
+ * @param cipher set to a freshly allocated session cipher instance
+ * @param store the axolotl_store_context to store all state information in
+ * @param remote_address the remote address that messages will be encrypted to or decrypted from.
+ * @param global_context the global library context
+ * @return 0 on success, or negative on failure
+ */
+int session_cipher_create(session_cipher **cipher,
+ axolotl_store_context *store, const axolotl_address *remote_address,
+ axolotl_context *global_context);
+
+/**
+ * Set the optional user data pointer for the session cipher.
+ *
+ * This is to give callback functions a way of accessing app specific
+ * context information for this cipher.
+ */
+void session_cipher_set_user_data(session_cipher *cipher, void *user_data);
+
+/**
+ * Get the optional user data pointer for the session cipher.
+ *
+ * This is to give callback functions a way of accessing app specific
+ * context information for this cipher.
+ */
+void *session_cipher_get_user_data(session_cipher *cipher);
+
+/**
+ * Set the callback function that is called during the decrypt process.
+ *
+ * The callback function is called from within
+ * session_cipher_decrypt_pre_key_whisper_message() and
+ * session_cipher_decrypt_whisper_message() after decryption is complete
+ * but before the updated session state has been committed to the session
+ * store. If the callback function returns a negative value, then the
+ * decrypt function will immediately fail with an error.
+ *
+ * This a callback allows some implementations to store the committed plaintext
+ * to their local message store first, in case they are concerned with a crash
+ * or write error happening between the time the session state is updated but
+ * before they're able to successfully store the plaintext to disk.
+ *
+ * @param callback the callback function to set
+ * @param user_data user data pointer provided to the callback
+ */
+void session_cipher_set_decryption_callback(session_cipher *cipher,
+ int (*callback)(session_cipher *cipher, axolotl_buffer *plaintext, void *decrypt_context));
+
+/**
+ * Encrypt a message.
+ *
+ * @param padded_message The plaintext message bytes, optionally padded to a constant multiple.
+ * @param padded_message_len The length of the data pointed to by padded_message
+ * @param encrypted_message Set to a ciphertext message encrypted to the recipient+device tuple.
+ *
+ * @return AX_SUCCESS on success, negative on error
+ */
+int session_cipher_encrypt(session_cipher *cipher,
+ const uint8_t *padded_message, size_t padded_message_len,
+ ciphertext_message **encrypted_message);
+
+/**
+ * Decrypt a message.
+ *
+ * @param ciphertext The pre_key_whisper_message to decrypt.
+ * @param decrypt_context Optional context pointer associated with the
+ * ciphertext, which is passed to the decryption callback function
+ * @param plaintext Set to a newly allocated buffer containing the plaintext.
+ *
+ * @retval AX_SUCCESS Success
+ * @retval AX_ERR_INVALID_MESSAGE if the input is not valid ciphertext.
+ * @retval AX_ERR_DUPLICATE_MESSAGE if the input is a message that has already been received.
+ * @retval AX_ERR_LEGACY_MESSAGE if the input is a message formatted by a protocol version that
+ * is no longer supported.
+ * @retval AX_ERR_INVALID_KEY_ID when there is no local pre_key_record
+ * that corresponds to the pre key ID in the message.
+ * @retval AX_ERR_INVALID_KEY when the message is formatted incorrectly.
+ * @retval AX_ERR_UNTRUSTED_IDENTITY when the identity key of the sender is untrusted.
+ */
+int session_cipher_decrypt_pre_key_whisper_message(session_cipher *cipher,
+ pre_key_whisper_message *ciphertext, void *decrypt_context,
+ axolotl_buffer **plaintext);
+
+/**
+ * Decrypt a message.
+ *
+ * @param ciphertext The whisper_message to decrypt.
+ * @param decrypt_context Optional context pointer associated with the
+ * ciphertext, which is passed to the decryption callback function
+ * @param plaintext Set to a newly allocated buffer containing the plaintext.
+ *
+ * @retval AX_SUCCESS Success
+ * @retval AX_ERR_INVALID_MESSAGE if the input is not valid ciphertext.
+ * @retval AX_ERR_DUPLICATE_MESSAGE if the input is a message that has already been received.
+ * @retval AX_ERR_LEGACY_MESSAGE if the input is a message formatted by a protocol version that
+ * is no longer supported.
+ * @retval AX_ERR_NO_SESSION if there is no established session for this contact.
+ */
+int session_cipher_decrypt_whisper_message(session_cipher *cipher,
+ whisper_message *ciphertext, void *decrypt_context,
+ axolotl_buffer **plaintext);
+
+/**
+ * Gets the remote registration ID for this session cipher.
+ *
+ * @param remote_id Set to the value of the remote registration ID
+ *
+ * @return AX_SUCCESS on success, negative on error
+ */
+int session_cipher_get_remote_registration_id(session_cipher *cipher, uint32_t *remote_id);
+
+/**
+ * Gets the version of the session associated with this session cipher.
+ *
+ * @param version Set to the value of the session version
+ *
+ * @retval AX_SUCCESS Success
+ * @retval AX_ERR_NO_SESSION if no session could be found
+ */
+int session_cipher_get_session_version(session_cipher *cipher, uint32_t *version);
+
+void session_cipher_free(session_cipher *cipher);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SESSION_CIPHER_H */