20 #ifndef lime_x3dh_protocol_hpp
21 #define lime_x3dh_protocol_hpp
43 template <
typename Curve>
60 X3DH_peerBundle(std::string &&deviceId,
const std::vector<uint8_t>::const_iterator bundle,
bool haveOPk, std::ostringstream &message_trace) :
66 message_trace <<
" Ik: "<<std::hex << std::setfill(
'0');
69 SPk.dump(message_trace);
72 OPk.dump(message_trace);
83 namespace x3dh_protocol {
119 template <
typename Curve>
122 template <typename Curve>
125 template <typename Curve>
128 template <typename Curve>
131 template <typename Curve>
134 template <typename Curve>
137 template <typename Curve>
140 template <typename Curve>
143 template <typename Curve>
144 bool parseMessage_selfOPks(const std::vector<uint8_t> &body, std::vector<uint32_t> &selfOPkIds) noexcept;
147 #ifdef EC25519_ENABLED
149 extern template void buildMessage_deleteUser<C255>(std::vector<uint8_t> &message) noexcept;
150 extern template void buildMessage_publishSPk<C255>(std::vector<uint8_t> &message,
const SignedPreKey<C255> &SPk) noexcept;
151 extern template void buildMessage_publishOPks<C255>(std::vector<uint8_t> &message,
const std::vector<OneTimePreKey<C255>> &OPks) noexcept;
152 extern template void buildMessage_getPeerBundles<C255>(std::vector<uint8_t> &message, std::vector<std::string> &peer_device_ids) noexcept;
153 extern template void buildMessage_getSelfOPks<C255>(std::vector<uint8_t> &message) noexcept;
154 extern template bool parseMessage_getType<C255>(
const std::vector<uint8_t> &body,
x3dh_message_type &message_type,
x3dh_error_code &error_code,
const std::shared_ptr<limeCallback> callback) noexcept;
155 extern template bool parseMessage_getPeerBundles<C255>(
const std::vector<uint8_t> &body, std::vector<X3DH_peerBundle<C255>> &peersBundle) noexcept;
156 extern template bool parseMessage_selfOPks<C255>(
const std::vector<uint8_t> &body, std::vector<uint32_t> &selfOPkIds) noexcept;
161 extern template void buildMessage_deleteUser<C448>(std::vector<uint8_t> &message) noexcept;
162 extern template void buildMessage_publishSPk<C448>(std::vector<uint8_t> &message,
const SignedPreKey<C448> &SPk) noexcept;
163 extern template void buildMessage_publishOPks<C448>(std::vector<uint8_t> &message,
const std::vector<OneTimePreKey<C448>> &OPks) noexcept;
164 extern template void buildMessage_getPeerBundles<C448>(std::vector<uint8_t> &message, std::vector<std::string> &peer_device_ids) noexcept;
165 extern template void buildMessage_getSelfOPks<C448>(std::vector<uint8_t> &message) noexcept;
166 extern template bool parseMessage_getType<C448>(
const std::vector<uint8_t> &body,
x3dh_message_type &message_type,
x3dh_error_code &error_code,
const std::shared_ptr<limeCallback> callback) noexcept;
167 extern template bool parseMessage_getPeerBundles<C448>(
const std::vector<uint8_t> &body, std::vector<X3DH_peerBundle<C448>> &peersBundle) noexcept;
168 extern template bool parseMessage_selfOPks<C448>(
const std::vector<uint8_t> &body, std::vector<uint32_t> &selfOPkIds) noexcept;
172 #ifdef EC25519_ENABLED
175 extern template void buildMessage_deleteUser<C255K512>(std::vector<uint8_t> &message) noexcept;
176 extern template void buildMessage_publishSPk<C255K512>(std::vector<uint8_t> &message,
const SignedPreKey<C255K512> &SPk) noexcept;
177 extern template void buildMessage_publishOPks<C255K512>(std::vector<uint8_t> &message,
const std::vector<OneTimePreKey<C255K512>> &OPks) noexcept;
178 extern template void buildMessage_getPeerBundles<C255K512>(std::vector<uint8_t> &message, std::vector<std::string> &peer_device_ids) noexcept;
179 extern template void buildMessage_getSelfOPks<C255K512>(std::vector<uint8_t> &message) noexcept;
180 extern template bool parseMessage_getType<C255K512>(
const std::vector<uint8_t> &body,
x3dh_message_type &message_type,
x3dh_error_code &error_code,
const std::shared_ptr<limeCallback> callback) noexcept;
181 extern template bool parseMessage_getPeerBundles<C255K512>(
const std::vector<uint8_t> &body, std::vector<X3DH_peerBundle<C255K512>> &peersBundle) noexcept;
182 extern template bool parseMessage_selfOPks<C255K512>(
const std::vector<uint8_t> &body, std::vector<uint32_t> &selfOPkIds) noexcept;
185 extern template void buildMessage_deleteUser<C255MLK512>(std::vector<uint8_t> &message) noexcept;
186 extern template void buildMessage_publishSPk<C255MLK512>(std::vector<uint8_t> &message,
const SignedPreKey<C255MLK512> &SPk) noexcept;
187 extern template void buildMessage_publishOPks<C255MLK512>(std::vector<uint8_t> &message,
const std::vector<OneTimePreKey<C255MLK512>> &OPks) noexcept;
188 extern template void buildMessage_getPeerBundles<C255MLK512>(std::vector<uint8_t> &message, std::vector<std::string> &peer_device_ids) noexcept;
189 extern template void buildMessage_getSelfOPks<C255MLK512>(std::vector<uint8_t> &message) noexcept;
190 extern template bool parseMessage_getType<C255MLK512>(
const std::vector<uint8_t> &body,
x3dh_message_type &message_type,
x3dh_error_code &error_code,
const std::shared_ptr<limeCallback> callback) noexcept;
191 extern template bool parseMessage_getPeerBundles<C255MLK512>(
const std::vector<uint8_t> &body, std::vector<X3DH_peerBundle<C255MLK512>> &peersBundle) noexcept;
192 extern template bool parseMessage_selfOPks<C255MLK512>(
const std::vector<uint8_t> &body, std::vector<uint32_t> &selfOPkIds) noexcept;
197 extern template void buildMessage_deleteUser<C448MLK1024>(std::vector<uint8_t> &message) noexcept;
198 extern template void buildMessage_publishSPk<C448MLK1024>(std::vector<uint8_t> &message,
const SignedPreKey<C448MLK1024> &SPk) noexcept;
199 extern template void buildMessage_publishOPks<C448MLK1024>(std::vector<uint8_t> &message,
const std::vector<OneTimePreKey<C448MLK1024>> &OPks) noexcept;
200 extern template void buildMessage_getPeerBundles<C448MLK1024>(std::vector<uint8_t> &message, std::vector<std::string> &peer_device_ids) noexcept;
201 extern template void buildMessage_getSelfOPks<C448MLK1024>(std::vector<uint8_t> &message) noexcept;
202 extern template bool parseMessage_getType<C448MLK1024>(
const std::vector<uint8_t> &body,
x3dh_message_type &message_type,
x3dh_error_code &error_code,
const std::shared_ptr<limeCallback> callback) noexcept;
203 extern template bool parseMessage_getPeerBundles<C448MLK1024>(
const std::vector<uint8_t> &body, std::vector<X3DH_peerBundle<C448MLK1024>> &peersBundle) noexcept;
204 extern template bool parseMessage_selfOPks<C448MLK1024>(
const std::vector<uint8_t> &body, std::vector<uint32_t> &selfOPkIds) noexcept;
206 #endif // HAVE_BCTBXPQ
const DSA< typename Curve::EC, lime::DSAtype::publicKey > Ik
Definition: lime_x3dh_protocol.hpp:47
X3DHKeyBundleFlag
Set possible values for a flag in the keyBundle X3DH packet.
Definition: lime_x3dh_protocol.hpp:35
void buildMessage_deleteUser(std::vector< uint8_t > &message) noexcept
build a deleteUser message
Definition: lime_x3dh_protocol.cpp:192
const std::string deviceId
Definition: lime_x3dh_protocol.hpp:45
Holds everything found in a key bundle received from X3DH server.
Definition: lime_x3dh_protocol.hpp:44
bool parseMessage_getType(const std::vector< uint8_t > &body, x3dh_message_type &message_type, x3dh_error_code &error_code, const std::shared_ptr< limeCallback > callback) noexcept
Definition: lime_x3dh_protocol.cpp:337
x3dh_message_type
the x3dh message type exchanged with the X3DH server
Definition: lime_x3dh_protocol.hpp:88
void buildMessage_publishSPk(std::vector< uint8_t > &message, const SignedPreKey< Curve > &SPk) noexcept
build a postSPk message
Definition: lime_x3dh_protocol.cpp:209
void buildMessage_publishOPks(std::vector< uint8_t > &message, const std::vector< OneTimePreKey< Curve >> &OPks) noexcept
build a postOPks message
Definition: lime_x3dh_protocol.cpp:234
OneTimePreKey< Curve > OPk
Definition: lime_x3dh_protocol.hpp:49
X3DH_peerBundle(std::string &&deviceId)
Definition: lime_x3dh_protocol.hpp:79
std::function< void(const lime::CallbackReturn status, const std::string message)> limeCallback
Callback use to give a status on asynchronous operation.
Definition: lime.hpp:103
Definition: lime_x3dh.hpp:218
bool parseMessage_getPeerBundles(const std::vector< uint8_t > &body, std::vector< X3DH_peerBundle< Curve >> &peersBundle) noexcept
Parse a peerBundles message and populate a vector of peerBundles.
Definition: lime_x3dh_protocol.cpp:494
X3DH_peerBundle(std::string &&deviceId, const std::vector< uint8_t >::const_iterator bundle, bool haveOPk, std::ostringstream &message_trace)
Definition: lime_x3dh_protocol.hpp:60
static constexpr size_t ssize(void)
provide a static size function to be able to call the function not on an object
Definition: lime_crypto_primitives.hpp:151
void buildMessage_getPeerBundles(std::vector< uint8_t > &message, std::vector< std::string > &peer_device_ids) noexcept
build a getPeerBundle message
Definition: lime_x3dh_protocol.cpp:277
void buildMessage_getSelfOPks(std::vector< uint8_t > &message) noexcept
build a getSelfOPks message
Definition: lime_x3dh_protocol.cpp:320
static constexpr size_t ssize(bool haveOPk)
Definition: lime_x3dh_protocol.hpp:45
const SignedPreKey< Curve > SPk
Definition: lime_x3dh_protocol.hpp:48
void buildMessage_registerUser(std::vector< uint8_t > &message, const DSA< typename Curve::EC, lime::DSAtype::publicKey > &Ik, const SignedPreKey< Curve > &SPk, const std::vector< OneTimePreKey< Curve >> &OPks) noexcept
build a registerUser message : Identity Key
Definition: lime_x3dh_protocol.cpp:146
Definition: lime_x3dh.hpp:32
x3dh_error_code
the error codes included in the x3dh error message received from the X3DH server
Definition: lime_x3dh_protocol.hpp:104
const lime::X3DHKeyBundleFlag bundleFlag
Definition: lime_x3dh_protocol.hpp:50
bool parseMessage_selfOPks(const std::vector< uint8_t > &body, std::vector< uint32_t > &selfOPkIds) noexcept
Parse a selfOPk message and populate a self OPk ids.
Definition: lime_x3dh_protocol.cpp:598
void hexStr(std::ostringstream &os, const uint8_t *data, size_t len, size_t digest)
Definition: lime_log.cpp:30