lime
Lime is a C++ library implementing Open Whisper System Signal protocol
lime.hpp
Go to the documentation of this file.
1 /*
2  lime.hpp
3  @author Johan Pascal
4  @copyright Copyright (C) 2017 Belledonne Communications SARL
5 
6  This program is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #ifndef lime_hpp
20 #define lime_hpp
21 
22 #include <memory> //smart ptrs
23 #include <unordered_map>
24 #include <vector>
25 #include <list>
26 #include <functional>
27 #include <string>
28 #include <mutex>
29 
30 namespace lime {
31 
35  enum class CurveId : uint8_t {
36  unset=0,
37  c25519=1,
38  c448=2
39  };
40 
42  enum class EncryptionPolicy {
43  DRMessage,
47  };
48 
54  enum class PeerDeviceStatus : uint8_t {
55  untrusted=0,
56  trusted=1,
57  unsafe=2,
58  fail,
60  unknown
62  };
63 
68  struct RecipientData {
69  const std::string deviceId;
76  std::vector<uint8_t> DRmessage;
81  RecipientData(const std::string &deviceId) : deviceId{deviceId}, peerStatus{lime::PeerDeviceStatus::unknown}, DRmessage{} {};
82  };
83 
85  enum class CallbackReturn : uint8_t {
86  success,
87  fail
88  };
96  using limeCallback = std::function<void(const lime::CallbackReturn status, const std::string message)>;
97 
98  /* X3DH server communication : these functions prototypes are used to post data and get response from/to the X3DH server */
106  using limeX3DHServerResponseProcess = std::function<void(int responseCode, const std::vector<uint8_t> &responseBody)>;
107 
116  using limeX3DHServerPostData = std::function<void(const std::string &url, const std::string &from, const std::vector<uint8_t> &message, const limeX3DHServerResponseProcess &reponseProcess)>;
117 
118  /* Forward declare the class managing one lime user and class managing database */
119  class LimeGeneric;
120  class Db;
121 
128  class LimeManager {
129  private :
130  std::unordered_map<std::string, std::shared_ptr<LimeGeneric>> m_users_cache; // cache of already opened Lime Session, identified by user Id (GRUU)
131  std::mutex m_users_mutex; // m_users_cache mutex
132  std::shared_ptr<lime::Db> m_localStorage; // DB access information forwarded to SOCI to correctly access database
133  limeX3DHServerPostData m_X3DH_post_data; // send data to the X3DH key server
134  void load_user(std::shared_ptr<LimeGeneric> &user, const std::string &localDeviceId, const bool allStatus=false); // helper function, get from m_users_cache of local Storage the requested Lime object
135 
136  public :
137 
155  void create_user(const std::string &localDeviceId, const std::string &x3dhServerUrl, const lime::CurveId curve, const uint16_t OPkInitialBatchSize, const limeCallback &callback);
159  void create_user(const std::string &localDeviceId, const std::string &x3dhServerUrl, const lime::CurveId curve, const limeCallback &callback);
160 
170  void delete_user(const std::string &localDeviceId, const limeCallback &callback);
171 
179  bool is_user(const std::string &localDeviceId);
180 
221  void encrypt(const std::string &localDeviceId, std::shared_ptr<const std::string> recipientUserId, std::shared_ptr<std::vector<RecipientData>> recipients, std::shared_ptr<const std::vector<uint8_t>> plainMessage, std::shared_ptr<std::vector<uint8_t>> cipherMessage, const limeCallback &callback, lime::EncryptionPolicy encryptionPolicy=lime::EncryptionPolicy::optimizeUploadSize);
222 
238  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);
243  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);
244 
264  void update(const std::string &localDeviceId, const limeCallback &callback, uint16_t OPkServerLowLimit, uint16_t OPkBatchSize);
268  void update(const std::string &localDeviceId, const limeCallback &callback);
269 
279  void get_selfIdentityKey(const std::string &localDeviceId, std::vector<uint8_t> &Ik);
280 
309  void set_peerDeviceStatus(const std::string &peerDeviceId, const std::vector<uint8_t> &Ik, lime::PeerDeviceStatus status);
310 
325  void set_peerDeviceStatus(const std::string &peerDeviceId, lime::PeerDeviceStatus status);
326 
335  lime::PeerDeviceStatus get_peerDeviceStatus(const std::string &peerDeviceId);
336 
346  lime::PeerDeviceStatus get_peerDeviceStatus(const std::list<std::string> &peerDeviceIds);
347 
355  bool is_localUser(const std::string &deviceId);
356 
364  void delete_peerDevice(const std::string &peerDeviceId);
365 
375  void stale_sessions(const std::string &localDeviceId, const std::string &peerDeviceId);
376 
385  void set_x3dhServerUrl(const std::string &localDeviceId, const std::string &x3dhServerUrl);
386 
396  std::string get_x3dhServerUrl(const std::string &localDeviceId);
397 
398  LimeManager() = delete; // no manager without Database and http provider
399  LimeManager(const LimeManager&) = delete; // no copy constructor
400  LimeManager operator=(const LimeManager &) = delete; // nor copy operator
401 
409  LimeManager(const std::string &db_access, const limeX3DHServerPostData &X3DH_post_data, std::shared_ptr<std::recursive_mutex> db_mutex);
413  LimeManager(const std::string &db_access, const limeX3DHServerPostData &X3DH_post_data);
414 
415  ~LimeManager() = default;
416  };
417 } //namespace lime
418 #endif /* lime_hpp */
std::vector< uint8_t > DRmessage
Definition: lime.hpp:76
CallbackReturn
Definition: lime.hpp:85
RecipientData(const std::string &deviceId)
Definition: lime.hpp:81
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:106
std::function< void(const std::string &url, const std::string &from, const std::vector< uint8_t > &message, const limeX3DHServerResponseProcess &reponseProcess)> limeX3DHServerPostData
Post a message to the X3DH server.
Definition: lime.hpp:116
lime::PeerDeviceStatus peerStatus
Definition: lime.hpp:70
std::function< void(const lime::CallbackReturn status, const std::string message)> limeCallback
Callback use to give a status on asynchronous operation.
Definition: lime.hpp:96
PeerDeviceStatus
Definition: lime.hpp:54
static bool decrypt(const lime::DRMKey &MK, const std::vector< uint8_t > &ciphertext, const size_t headerSize, std::vector< uint8_t > &AD, std::vector< uint8_t > &plaintext)
Decrypt as described is spec section 3.1.
Definition: lime_double_ratchet.cpp:99
Definition: lime.cpp:30
The encrypt function input/output data structure.
Definition: lime.hpp:68
Database access class.
Definition: lime_localStorage.hpp:34
EncryptionPolicy
Definition: lime.hpp:42
CurveId
Definition: lime.hpp:35
Manage several Lime objects(one is needed for each local user).
Definition: lime.hpp:128
A pure abstract class defining the API to encrypt/decrypt/manage user and its keys.
Definition: lime_lime.hpp:35
const std::string deviceId
Definition: lime.hpp:69