23 #include <unordered_map>
88 void dump(std::ostringstream &os, std::string indent=
" ")
const;
103 using limeCallback = std::function<void(const lime::CallbackReturn status, const std::string message)>;
154 std::string
CurveId2String(
const std::vector<lime::CurveId> algos,
const std::string separator=
",");
173 std::string username;
180 explicit operator std::string()
const {
return std::string{username}.append(
" on ").append(
CurveId2String(baseAlgo));}
182 return (username==other.username && baseAlgo == other.baseAlgo);
185 std::hash<std::string> username_hash;
186 std::hash<lime::CurveId> baseAlgo_hash;
188 return username_hash(d.username) ^ (baseAlgo_hash(d.baseAlgo) << 1);
202 m_associatedData(associatedData), m_plainMessage(plainMessage), m_encryptionPolicy(encryptionPolicy) {};
204 m_associatedData(associatedData.cbegin(), associatedData.cend()), m_plainMessage(plainMessage), m_encryptionPolicy(encryptionPolicy) {};
206 void addRecipient(
const std::string &recipientAddress) { m_recipients.emplace_back(recipientAddress); }
207 void dump(std::ostringstream &os, std::string indent=
" ")
const;
224 std::unordered_map<lime::DeviceId, std::shared_ptr<LimeGeneric>, decltype(&
lime::DeviceId::hash)> m_users_cache;
225 std::mutex m_users_mutex;
226 std::shared_ptr<lime::Db> m_localStorage;
228 std::shared_ptr<LimeGeneric> load_user(
const lime::DeviceId &localDeviceId,
const bool allStatus=
false);
229 std::shared_ptr<LimeGeneric> load_user_noexcept(
const lime::DeviceId &localDeviceId) noexcept;
250 void create_user(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos,
const std::string &x3dhServerUrl,
const uint16_t OPkInitialBatchSize,
limeCallback callback);
254 void create_user(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos,
const std::string &x3dhServerUrl,
limeCallback callback);
276 bool is_user(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos);
325 void encrypt(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos, std::shared_ptr<lime::EncryptionContext> encryptionContext,
limeCallback callback);
342 lime::PeerDeviceStatus decrypt(
const std::string &localDeviceId,
const std::string &recipientUserId,
const std::string &senderDeviceId,
const std::vector<uint8_t> &DRmessage,
const std::vector<uint8_t> &
cipherMessage, std::vector<uint8_t> &plainMessage);
347 lime::PeerDeviceStatus decrypt(
const std::string &localDeviceId,
const std::string &recipientUserId,
const std::string &senderDeviceId,
const std::vector<uint8_t> &DRmessage, std::vector<uint8_t> &plainMessage);
352 lime::PeerDeviceStatus decrypt(
const std::string &localDeviceId,
const std::vector<uint8_t> &associatedData,
const std::string &senderDeviceId,
const std::vector<uint8_t> &DRmessage,
const std::vector<uint8_t> &cipherMessage, std::vector<uint8_t> &plainMessage);
358 lime::PeerDeviceStatus decrypt(
const std::string &localDeviceId,
const std::vector<uint8_t> &associatedData,
const std::string &senderDeviceId,
const std::vector<uint8_t> &DRmessage, std::vector<uint8_t> &plainMessage);
380 void update(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos,
limeCallback callback, uint16_t OPkServerLowLimit, uint16_t OPkBatchSize);
384 void update(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos,
limeCallback callback);
486 void stale_sessions(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos,
const std::string &peerDeviceId);
497 void set_x3dhServerUrl(
const std::string &localDeviceId,
const std::vector<lime::CurveId> &algos,
const std::string &x3dhServerUrl);
std::string get_x3dhServerUrl(const DeviceId &localDeviceId)
Get the X3DH key server URL for this identified user.
Definition: lime_manager.cpp:432
std::string PeerDeviceStatus2String(const lime::PeerDeviceStatus status)
Definition: lime_manager.cpp:484
DeviceId(const std::string &username, const lime::CurveId baseAlgo)
Definition: lime.hpp:176
std::vector< uint8_t > DRmessage
Definition: lime.hpp:81
bool is_user(const std::string &localDeviceId, const std::vector< lime::CurveId > &algos)
Check if a user is present and active in local storage This function loads the user from DB if not al...
Definition: lime_manager.cpp:164
std::vector< uint8_t > m_cipherMessage
Definition: lime.hpp:197
CallbackReturn
Definition: lime.hpp:92
EncryptionContext(const std::string &associatedData, const std::vector< uint8_t > &plainMessage, const lime::EncryptionPolicy encryptionPolicy=lime::EncryptionPolicy::optimizeUploadSize)
Definition: lime.hpp:203
RecipientData(const std::string &deviceId)
Definition: lime.hpp:87
static std::size_t hash(const lime::DeviceId &d)
Definition: lime.hpp:184
void dump(std::ostringstream &os, std::string indent=" ") const
Definition: lime_log.cpp:61
void set_peerDeviceStatus(const std::string &peerDeviceId, const lime::CurveId algo, const std::vector< uint8_t > &Ik, lime::PeerDeviceStatus status)
set the peer device status flag in local storage: unsafe, trusted or untrusted.
Definition: lime_manager.cpp:384
void update(const std::string &localDeviceId, const std::vector< lime::CurveId > &algos, limeCallback callback, uint16_t OPkServerLowLimit, uint16_t OPkBatchSize)
Update: shall be called regularly, once a day at least, performs checks, updates and cleaning operati...
Definition: lime_manager.cpp:316
void addRecipient(const std::string &recipientAddress)
Definition: lime.hpp:206
std::function< void(const std::string &url, const std::string &from, std::vector< uint8_t > &&message, const limeX3DHServerResponseProcess &reponseProcess)> limeX3DHServerPostData
Post a message to the X3DH server.
Definition: lime.hpp:123
const std::string getAlgoString() const
Definition: lime.hpp:179
std::function< void(int responseCode, const std::vector< uint8_t > &responseBody)> limeX3DHServerResponseProcess
Get the response from server. The external service providing secure communication to the X3DH server ...
Definition: lime.hpp:113
void create_user(const std::string &localDeviceId, const std::vector< lime::CurveId > &algos, const std::string &x3dhServerUrl, const uint16_t OPkInitialBatchSize, limeCallback callback)
Create a user in local database and publish it on the given X3DH server.
Definition: lime_manager.cpp:92
std::vector< RecipientData > m_recipients
Definition: lime.hpp:195
bool lime_is_PQ_available(void)
Definition: lime_manager.cpp:501
void set_x3dhServerUrl(const std::string &localDeviceId, const std::vector< lime::CurveId > &algos, const std::string &x3dhServerUrl)
Set the X3DH key server URL for this identified user.
Definition: lime_manager.cpp:423
lime::PeerDeviceStatus peerStatus
Definition: lime.hpp:75
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
PeerDeviceStatus
Definition: lime.hpp:59
lime::PeerDeviceStatus get_peerDeviceStatus(const std::string &peerDeviceId)
get the status of a peer device: unknown, untrusted, trusted, unsafe device's Id matching a local acc...
Definition: lime_manager.cpp:394
EncryptionContext(const std::vector< uint8_t > &associatedData, const std::vector< uint8_t > &plainMessage, const lime::EncryptionPolicy encryptionPolicy=lime::EncryptionPolicy::optimizeUploadSize)
Definition: lime.hpp:201
const lime::CurveId & getAlgo() const
Definition: lime.hpp:178
const lime::EncryptionPolicy m_encryptionPolicy
Definition: lime.hpp:198
std::string CurveId2String(const lime::CurveId algo)
Definition: lime_manager.cpp:461
const std::vector< uint8_t > m_associatedData
Definition: lime.hpp:194
void dump(std::ostringstream &os, std::string indent=" ") const
Definition: lime_log.cpp:49
void stale_sessions(const std::string &localDeviceId, const std::vector< lime::CurveId > &algos, const std::string &peerDeviceId)
Stale all sessions between localDeviceId and peerDevice. If peerDevice keep using this session to enc...
Definition: lime_manager.cpp:412
void get_selfIdentityKey(const std::string &localDeviceId, const std::vector< lime::CurveId > &algos, std::map< lime::CurveId, std::vector< uint8_t >> &Iks)
retrieve self Identity Key, an EdDSA formatted public key
Definition: lime_manager.cpp:376
void delete_peerDevice(const std::string &peerDeviceId)
delete a peerDevice from local storage
Definition: lime_manager.cpp:402
const std::vector< uint8_t > m_plainMessage
Definition: lime.hpp:196
lime::CurveId string2CurveId(const std::string &algo)
Definition: lime_manager.cpp:452
bool done
Definition: lime.hpp:82
const std::string & getUsername() const
Definition: lime.hpp:177
LimeManager operator=(const LimeManager &)=delete
bool operator==(const DeviceId &other) const
Definition: lime.hpp:181
The encrypt function input/output data structure.
Definition: lime.hpp:73
lime::PeerDeviceStatus decrypt(const std::string &localDeviceId, const std::string &recipientUserId, const std::string &senderDeviceId, const std::vector< uint8_t > &DRmessage, const std::vector< uint8_t > &cipherMessage, std::vector< uint8_t > &plainMessage)
Decrypt the given message.
Definition: lime_manager.cpp:302
Database access class.
Definition: lime_localStorage.hpp:34
EncryptionPolicy
Definition: lime.hpp:47
CurveId
Definition: lime.hpp:37
void encrypt(const std::string &localDeviceId, const std::vector< lime::CurveId > &algos, std::shared_ptr< lime::EncryptionContext > encryptionContext, limeCallback callback)
Encrypt a buffer (text or file) for a given list of recipient devices.
Definition: lime_manager.cpp:173
Manage several Lime objects(one is needed for each local user).
Definition: lime.hpp:221
A pure abstract class defining the API to encrypt/decrypt/manage user and its keys.
Definition: lime_lime.hpp:42
const std::string deviceId
Definition: lime.hpp:74
void delete_user(const DeviceId &localDeviceId, limeCallback callback)
Delete a user from local database and from the X3DH server.
Definition: lime_manager.cpp:146