1 #ifndef RATCHET_H 2 #define RATCHET_H 3 4 #include <stdint.h> 5 #include <stddef.h> 6 #include "signal_protocol_types.h" 7 8 #ifdef __cplusplus 9 extern "C" { 10 #endif 11 12 int ratchet_chain_key_create(ratchet_chain_key **chain_key, hkdf_context *kdf, 13 const uint8_t *key, size_t key_len, uint32_t index, 14 signal_context *global_context); 15 int ratchet_chain_key_get_key(const ratchet_chain_key *chain_key, signal_buffer **buffer); 16 uint32_t ratchet_chain_key_get_index(const ratchet_chain_key *chain_key); 17 int ratchet_chain_key_get_message_keys(ratchet_chain_key *chain_key, ratchet_message_keys *message_keys); 18 int ratchet_chain_key_create_next(const ratchet_chain_key *chain_key, ratchet_chain_key **next_chain_key); 19 void ratchet_chain_key_destroy(signal_type_base *type); 20 21 int ratchet_root_key_create(ratchet_root_key **root_key, hkdf_context *kdf, 22 const uint8_t *key, size_t key_len, 23 signal_context *global_context); 24 int ratchet_root_key_create_chain(ratchet_root_key *root_key, 25 ratchet_root_key **new_root_key, ratchet_chain_key **new_chain_key, 26 ec_public_key *their_ratchet_key, 27 ec_private_key *our_ratchet_key_private); 28 int ratchet_root_key_get_key(ratchet_root_key *root_key, signal_buffer **buffer); 29 int ratchet_root_key_compare(const ratchet_root_key *key1, const ratchet_root_key *key2); 30 void ratchet_root_key_destroy(signal_type_base *type); 31 32 int ratchet_identity_key_pair_create( 33 ratchet_identity_key_pair **key_pair, 34 ec_public_key *public_key, 35 ec_private_key *private_key); 36 int ratchet_identity_key_pair_serialize(signal_buffer **buffer, const ratchet_identity_key_pair *key_pair); 37 int ratchet_identity_key_pair_deserialize(ratchet_identity_key_pair **key_pair, const uint8_t *data, size_t len, signal_context *global_context); 38 ec_public_key *ratchet_identity_key_pair_get_public(const ratchet_identity_key_pair *key_pair); 39 ec_private_key *ratchet_identity_key_pair_get_private(const ratchet_identity_key_pair *key_pair); 40 void ratchet_identity_key_pair_destroy(signal_type_base *type); 41 42 typedef struct symmetric_signal_protocol_parameters symmetric_signal_protocol_parameters; 43 typedef struct alice_signal_protocol_parameters alice_signal_protocol_parameters; 44 typedef struct bob_signal_protocol_parameters bob_signal_protocol_parameters; 45 46 int symmetric_signal_protocol_parameters_create( 47 symmetric_signal_protocol_parameters **parameters, 48 ratchet_identity_key_pair *our_identity_key, 49 ec_key_pair *our_base_key, 50 ec_key_pair *our_ratchet_key, 51 ec_public_key *their_base_key, 52 ec_public_key *their_ratchet_key, 53 ec_public_key *their_identity_key); 54 ratchet_identity_key_pair *symmetric_signal_protocol_parameters_get_our_identity_key(const symmetric_signal_protocol_parameters *parameters); 55 ec_key_pair *symmetric_signal_protocol_parameters_get_our_base_key(const symmetric_signal_protocol_parameters *parameters); 56 ec_key_pair *symmetric_signal_protocol_parameters_get_our_ratchet_key(const symmetric_signal_protocol_parameters *parameters); 57 ec_public_key *symmetric_signal_protocol_parameters_get_their_base_key(const symmetric_signal_protocol_parameters *parameters); 58 ec_public_key *symmetric_signal_protocol_parameters_get_their_ratchet_key(const symmetric_signal_protocol_parameters *parameters); 59 ec_public_key *symmetric_signal_protocol_parameters_get_their_identity_key(const symmetric_signal_protocol_parameters *parameters); 60 void symmetric_signal_protocol_parameters_destroy(signal_type_base *type); 61 62 int alice_signal_protocol_parameters_create( 63 alice_signal_protocol_parameters **parameters, 64 ratchet_identity_key_pair *our_identity_key, 65 ec_key_pair *our_base_key, 66 ec_public_key *their_identity_key, 67 ec_public_key *their_signed_pre_key, 68 ec_public_key *their_one_time_pre_key, 69 ec_public_key *their_ratchet_key); 70 void alice_signal_protocol_parameters_destroy(signal_type_base *type); 71 72 int bob_signal_protocol_parameters_create( 73 bob_signal_protocol_parameters **parameters, 74 ratchet_identity_key_pair *our_identity_key, 75 ec_key_pair *our_signed_pre_key, 76 ec_key_pair *our_one_time_pre_key, 77 ec_key_pair *our_ratchet_key, 78 ec_public_key *their_identity_key, 79 ec_public_key *their_base_key); 80 void bob_signal_protocol_parameters_destroy(signal_type_base *type); 81 82 int ratcheting_session_symmetric_initialize(session_state *state, symmetric_signal_protocol_parameters *parameters, signal_context *global_context); 83 int ratcheting_session_alice_initialize(session_state *state, alice_signal_protocol_parameters *parameters, signal_context *global_context); 84 int ratcheting_session_bob_initialize(session_state *state, bob_signal_protocol_parameters *parameters, signal_context *global_context); 85 86 #ifdef __cplusplus 87 } 88 #endif 89 90 #endif /* RATCHET_H */ 91