libsignal-protocol-c  master
signal_protocol.h
1 #ifndef SIGNAL_PROTOCOL_H
2 #define SIGNAL_PROTOCOL_H
3 
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdint.h>
7 
8 #include "ratchet.h"
9 #include "curve.h"
10 #include "session_record.h"
11 #include "session_pre_key.h"
12 #include "sender_key_record.h"
13 #include "signal_protocol_types.h"
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 #define SG_SUCCESS 0
20 
21 /* Standard error codes with values that match errno.h equivalents */
22 #define SG_ERR_NOMEM -12 /* Not enough space */
23 #define SG_ERR_INVAL -22 /* Invalid argument */
24 
25 /* Custom error codes for error conditions specific to the library */
26 #define SG_ERR_UNKNOWN -1000
27 #define SG_ERR_DUPLICATE_MESSAGE -1001
28 #define SG_ERR_INVALID_KEY -1002
29 #define SG_ERR_INVALID_KEY_ID -1003
30 #define SG_ERR_INVALID_MAC -1004
31 #define SG_ERR_INVALID_MESSAGE -1005
32 #define SG_ERR_INVALID_VERSION -1006
33 #define SG_ERR_LEGACY_MESSAGE -1007
34 #define SG_ERR_NO_SESSION -1008
35 #define SG_ERR_STALE_KEY_EXCHANGE -1009
36 #define SG_ERR_UNTRUSTED_IDENTITY -1010
37 #define SG_ERR_VRF_SIG_VERIF_FAILED -1011
38 #define SG_ERR_INVALID_PROTO_BUF -1100
39 #define SG_ERR_FP_VERSION_MISMATCH -1200
40 #define SG_ERR_FP_IDENT_MISMATCH -1201
41 
42 /*
43  * Minimum negative error code value that this library may use.
44  * When implementing library callback functions, using values
45  * less than this constant will ensure that application-specific
46  * errors can be distinguished from library errors.
47  */
48 #define SG_ERR_MINIMUM -9999
49 
50 /* Log levels */
51 #define SG_LOG_ERROR 0
52 #define SG_LOG_WARNING 1
53 #define SG_LOG_NOTICE 2
54 #define SG_LOG_INFO 3
55 #define SG_LOG_DEBUG 4
56 
57 /* Mode settings for the crypto callbacks */
58 #define SG_CIPHER_AES_CTR_NOPADDING 1
59 #define SG_CIPHER_AES_CBC_PKCS5 2
60 
61 void signal_type_ref(signal_type_base *instance);
62 void signal_type_unref(signal_type_base *instance);
63 
64 #ifdef DEBUG_REFCOUNT
65 int signal_type_ref_count(signal_type_base *instance);
66 #define SIGNAL_REF(instance) do { \
67  signal_type_ref((signal_type_base *)instance); \
68  fprintf(stderr, "REF: " #instance " = %d\n", signal_type_ref_count((signal_type_base *)instance)); \
69  } while (0)
70 #define SIGNAL_UNREF(instance) do { \
71  fprintf(stderr, "UNREF: " #instance " = %d\n", signal_type_ref_count((signal_type_base *)instance)); \
72  signal_type_unref((signal_type_base *)instance); \
73  instance = 0; \
74  } while(0)
75 #else
76 #define SIGNAL_REF(instance) signal_type_ref((signal_type_base *)instance)
77 #define SIGNAL_UNREF(instance) do { signal_type_unref((signal_type_base *)instance); instance = 0; } while(0)
78 #endif
79 
86 signal_buffer *signal_buffer_alloc(size_t len);
87 
95 signal_buffer *signal_buffer_create(const uint8_t *data, size_t len);
96 
103 signal_buffer *signal_buffer_copy(const signal_buffer *buffer);
104 
112 signal_buffer *signal_buffer_n_copy(const signal_buffer *buffer, size_t n);
113 
125 signal_buffer *signal_buffer_append(signal_buffer *buffer, const uint8_t *data, size_t len);
126 
134 uint8_t *signal_buffer_data(signal_buffer *buffer);
135 
143 const uint8_t *signal_buffer_const_data(const signal_buffer *buffer);
144 
151 size_t signal_buffer_len(const signal_buffer *buffer);
152 
160 int signal_buffer_compare(signal_buffer *buffer1, signal_buffer *buffer2);
161 
167 void signal_buffer_free(signal_buffer *buffer);
168 
176 void signal_buffer_bzero_free(signal_buffer *buffer);
177 
183 signal_buffer_list *signal_buffer_list_alloc(void);
184 
191 signal_buffer_list *signal_buffer_list_copy(const signal_buffer_list *list);
192 
202 int signal_buffer_list_push_back(signal_buffer_list *list, signal_buffer *buffer);
203 
210 unsigned int signal_buffer_list_size(signal_buffer_list *list);
211 
219 signal_buffer *signal_buffer_list_at(signal_buffer_list *list, unsigned int index);
220 
226 void signal_buffer_list_free(signal_buffer_list *list);
227 
235 void signal_buffer_list_bzero_free(signal_buffer_list *list);
236 
242 signal_int_list *signal_int_list_alloc(void);
243 
251 int signal_int_list_push_back(signal_int_list *list, int value);
252 
259 unsigned int signal_int_list_size(signal_int_list *list);
260 
268 int signal_int_list_at(signal_int_list *list, unsigned int index);
269 
274 void signal_int_list_free(signal_int_list *list);
275 
276 typedef struct signal_crypto_provider {
285  int (*random_func)(uint8_t *data, size_t len, void *user_data);
286 
296  int (*hmac_sha256_init_func)(void **hmac_context, const uint8_t *key, size_t key_len, void *user_data);
297 
307  int (*hmac_sha256_update_func)(void *hmac_context, const uint8_t *data, size_t data_len, void *user_data);
308 
318  int (*hmac_sha256_final_func)(void *hmac_context, signal_buffer **output, void *user_data);
319 
327  void (*hmac_sha256_cleanup_func)(void *hmac_context, void *user_data);
328 
336  int (*sha512_digest_init_func)(void **digest_context, void *user_data);
337 
347  int (*sha512_digest_update_func)(void *digest_context, const uint8_t *data, size_t data_len, void *user_data);
348 
358  int (*sha512_digest_final_func)(void *digest_context, signal_buffer **output, void *user_data);
359 
367  void (*sha512_digest_cleanup_func)(void *digest_context, void *user_data);
368 
382  int (*encrypt_func)(signal_buffer **output,
383  int cipher,
384  const uint8_t *key, size_t key_len,
385  const uint8_t *iv, size_t iv_len,
386  const uint8_t *plaintext, size_t plaintext_len,
387  void *user_data);
388 
402  int (*decrypt_func)(signal_buffer **output,
403  int cipher,
404  const uint8_t *key, size_t key_len,
405  const uint8_t *iv, size_t iv_len,
406  const uint8_t *ciphertext, size_t ciphertext_len,
407  void *user_data);
408 
410  void *user_data;
412 
428  int (*load_session_func)(signal_buffer **record, signal_buffer **user_record, const signal_protocol_address *address, void *user_data);
429 
438  int (*get_sub_device_sessions_func)(signal_int_list **sessions, const char *name, size_t name_len, void *user_data);
439 
454  int (*store_session_func)(const signal_protocol_address *address, uint8_t *record, size_t record_len, uint8_t *user_record, size_t user_record_len, void *user_data);
455 
463  int (*contains_session_func)(const signal_protocol_address *address, void *user_data);
464 
471  int (*delete_session_func)(const signal_protocol_address *address, void *user_data);
472 
480  int (*delete_all_sessions_func)(const char *name, size_t name_len, void *user_data);
481 
486  void (*destroy_func)(void *user_data);
487 
489  void *user_data;
491 
503  int (*load_pre_key)(signal_buffer **record, uint32_t pre_key_id, void *user_data);
504 
513  int (*store_pre_key)(uint32_t pre_key_id, uint8_t *record, size_t record_len, void *user_data);
514 
522  int (*contains_pre_key)(uint32_t pre_key_id, void *user_data);
523 
530  int (*remove_pre_key)(uint32_t pre_key_id, void *user_data);
531 
536  void (*destroy_func)(void *user_data);
537 
539  void *user_data;
541 
553  int (*load_signed_pre_key)(signal_buffer **record, uint32_t signed_pre_key_id, void *user_data);
554 
563  int (*store_signed_pre_key)(uint32_t signed_pre_key_id, uint8_t *record, size_t record_len, void *user_data);
564 
572  int (*contains_signed_pre_key)(uint32_t signed_pre_key_id, void *user_data);
573 
580  int (*remove_signed_pre_key)(uint32_t signed_pre_key_id, void *user_data);
581 
586  void (*destroy_func)(void *user_data);
587 
589  void *user_data;
591 
604  int (*get_identity_key_pair)(signal_buffer **public_data, signal_buffer **private_data, void *user_data);
605 
616  int (*get_local_registration_id)(void *user_data, uint32_t *registration_id);
617 
631  int (*save_identity)(const signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *user_data);
632 
649  int (*is_trusted_identity)(const signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *user_data);
650 
655  void (*destroy_func)(void *user_data);
656 
658  void *user_data;
660 
675  int (*store_sender_key)(const signal_protocol_sender_key_name *sender_key_name, uint8_t *record, size_t record_len, uint8_t *user_record, size_t user_record_len, void *user_data);
676 
691  int (*load_sender_key)(signal_buffer **record, signal_buffer **user_record, const signal_protocol_sender_key_name *sender_key_name, void *user_data);
692 
697  void (*destroy_func)(void *user_data);
698 
700  void *user_data;
702 
706 int signal_context_create(signal_context **context, void *user_data);
707 
716 int signal_context_set_crypto_provider(signal_context *context, const signal_crypto_provider *crypto_provider);
717 
728 int signal_context_set_locking_functions(signal_context *context,
729  void (*lock)(void *user_data), void (*unlock)(void *user_data));
730 
736 int signal_context_set_log_function(signal_context *context,
737  void (*log)(int level, const char *message, size_t len, void *user_data));
738 
739 void signal_context_destroy(signal_context *context);
740 
744 int signal_protocol_store_context_create(signal_protocol_store_context **context, signal_context *global_context);
745 
746 int signal_protocol_store_context_set_session_store(signal_protocol_store_context *context, const signal_protocol_session_store *store);
747 int signal_protocol_store_context_set_pre_key_store(signal_protocol_store_context *context, const signal_protocol_pre_key_store *store);
748 int signal_protocol_store_context_set_signed_pre_key_store(signal_protocol_store_context *context, const signal_protocol_signed_pre_key_store *store);
749 int signal_protocol_store_context_set_identity_key_store(signal_protocol_store_context *context, const signal_protocol_identity_key_store *store);
750 int signal_protocol_store_context_set_sender_key_store(signal_protocol_store_context *context, const signal_protocol_sender_key_store *store);
751 
752 void signal_protocol_store_context_destroy(signal_protocol_store_context *context);
753 
754 /*
755  * Interface to the session store.
756  * These functions will use the callbacks in the provided
757  * signal_protocol_store_context instance and operate in terms of higher level
758  * library data structures.
759  */
760 
761 int signal_protocol_session_load_session(signal_protocol_store_context *context, session_record **record, const signal_protocol_address *address);
762 int signal_protocol_session_get_sub_device_sessions(signal_protocol_store_context *context, signal_int_list **sessions, const char *name, size_t name_len);
763 int signal_protocol_session_store_session(signal_protocol_store_context *context, const signal_protocol_address *address, session_record *record);
764 int signal_protocol_session_contains_session(signal_protocol_store_context *context, const signal_protocol_address *address);
765 int signal_protocol_session_delete_session(signal_protocol_store_context *context, const signal_protocol_address *address);
766 int signal_protocol_session_delete_all_sessions(signal_protocol_store_context *context, const char *name, size_t name_len);
767 
768 
769 /*
770  * Interface to the pre-key store.
771  * These functions will use the callbacks in the provided
772  * signal_protocol_store_context instance and operate in terms of higher level
773  * library data structures.
774  */
775 
776 int signal_protocol_pre_key_load_key(signal_protocol_store_context *context, session_pre_key **pre_key, uint32_t pre_key_id);
777 int signal_protocol_pre_key_store_key(signal_protocol_store_context *context, session_pre_key *pre_key);
778 int signal_protocol_pre_key_contains_key(signal_protocol_store_context *context, uint32_t pre_key_id);
779 int signal_protocol_pre_key_remove_key(signal_protocol_store_context *context, uint32_t pre_key_id);
780 
781 
782 /*
783  * Interface to the signed pre-key store.
784  * These functions will use the callbacks in the provided
785  * signal_protocol_store_context instance and operate in terms of higher level
786  * library data structures.
787  */
788 
789 int signal_protocol_signed_pre_key_load_key(signal_protocol_store_context *context, session_signed_pre_key **pre_key, uint32_t signed_pre_key_id);
790 int signal_protocol_signed_pre_key_store_key(signal_protocol_store_context *context, session_signed_pre_key *pre_key);
791 int signal_protocol_signed_pre_key_contains_key(signal_protocol_store_context *context, uint32_t signed_pre_key_id);
792 int signal_protocol_signed_pre_key_remove_key(signal_protocol_store_context *context, uint32_t signed_pre_key_id);
793 
794 
795 /*
796  * Interface to the identity key store.
797  * These functions will use the callbacks in the provided
798  * signal_protocol_store_context instance and operate in terms of higher level
799  * library data structures.
800  */
801 
802 int signal_protocol_identity_get_key_pair(signal_protocol_store_context *context, ratchet_identity_key_pair **key_pair);
803 int signal_protocol_identity_get_local_registration_id(signal_protocol_store_context *context, uint32_t *registration_id);
804 int signal_protocol_identity_save_identity(signal_protocol_store_context *context, const signal_protocol_address *address, ec_public_key *identity_key);
805 int signal_protocol_identity_is_trusted_identity(signal_protocol_store_context *context, const signal_protocol_address *address, ec_public_key *identity_key);
806 
807 
808 /*
809  * Interface to the sender key store.
810  * These functions will use the callbacks in the provided
811  * signal_protocol_store_context instance and operate in terms of higher level
812  * library data structures.
813  */
814 
815 int signal_protocol_sender_key_store_key(signal_protocol_store_context *context, const signal_protocol_sender_key_name *sender_key_name, sender_key_record *record);
816 int signal_protocol_sender_key_load_key(signal_protocol_store_context *context, sender_key_record **record, const signal_protocol_sender_key_name *sender_key_name);
817 
818 #ifdef __cplusplus
819 }
820 #endif
821 
822 #endif /* SIGNAL_PROTOCOL_H */
void * user_data
Definition: signal_protocol.h:489
int(* hmac_sha256_final_func)(void *hmac_context, signal_buffer **output, void *user_data)
Definition: signal_protocol.h:318
Definition: signal_protocol.c:324
int(* sha512_digest_init_func)(void **digest_context, void *user_data)
Definition: signal_protocol.h:336
int(* sha512_digest_update_func)(void *digest_context, const uint8_t *data, size_t data_len, void *user_data)
Definition: signal_protocol.h:347
Definition: signal_protocol.c:25
int(* hmac_sha256_update_func)(void *hmac_context, const uint8_t *data, size_t data_len, void *user_data)
Definition: signal_protocol.h:307
void * user_data
Definition: signal_protocol.h:410
Definition: curve.c:19
void(* hmac_sha256_cleanup_func)(void *hmac_context, void *user_data)
Definition: signal_protocol.h:327
Definition: signal_protocol_internal.h:8
Definition: signal_protocol.h:661
Definition: signal_protocol.h:592
Definition: session_record.c:20
void * user_data
Definition: signal_protocol.h:539
Definition: signal_protocol_types.h:48
Definition: signal_protocol_internal.h:23
Definition: signal_protocol_internal.h:18
int(* hmac_sha256_init_func)(void **hmac_context, const uint8_t *key, size_t key_len, void *user_data)
Definition: signal_protocol.h:296
Definition: session_pre_key.c:17
Definition: signal_protocol.h:413
void * user_data
Definition: signal_protocol.h:589
Definition: signal_protocol.h:492
Definition: signal_protocol_types.h:39
Definition: signal_protocol.c:194
Definition: signal_protocol.h:276
int(* encrypt_func)(signal_buffer **output, int cipher, const uint8_t *key, size_t key_len, const uint8_t *iv, size_t iv_len, const uint8_t *plaintext, size_t plaintext_len, void *user_data)
Definition: signal_protocol.h:382
int(* decrypt_func)(signal_buffer **output, int cipher, const uint8_t *key, size_t key_len, const uint8_t *iv, size_t iv_len, const uint8_t *ciphertext, size_t ciphertext_len, void *user_data)
Definition: signal_protocol.h:402
Definition: session_pre_key.c:11
void * user_data
Definition: signal_protocol.h:658
void * user_data
Definition: signal_protocol.h:700
int(* sha512_digest_final_func)(void *digest_context, signal_buffer **output, void *user_data)
Definition: signal_protocol.h:358
int(* random_func)(uint8_t *data, size_t len, void *user_data)
Definition: signal_protocol.h:285
void(* sha512_digest_cleanup_func)(void *digest_context, void *user_data)
Definition: signal_protocol.h:367
Definition: sender_key_record.c:18
Definition: signal_protocol.h:542
Definition: ratchet.c:38