lime
Lime is a C++ library implementing Open Whisper System Signal protocol
|
store a Double Rachet session. More...
Public Member Functions | |
DR ()=delete | |
DR (std::shared_ptr< lime::Db > localStorage, const DRChainKey &SK, const SharedADBuffer &AD, const X< Curve, lime::Xtype::publicKey > &peerPublicKey, const long int peerDid, const std::string &peerDeviceId, const DSA< Curve, lime::DSAtype::publicKey > &peerIk, long int selfDeviceId, const std::vector< uint8_t > &X3DH_initMessage, std::shared_ptr< RNG > RNG_context) | |
Create a new DR session for sending message. Match pseudo code for RatchetInitAlice in DR spec section 3.3. More... | |
DR (std::shared_ptr< lime::Db > localStorage, const DRChainKey &SK, const SharedADBuffer &AD, const Xpair< Curve > &selfKeyPair, long int peerDid, const std::string &peerDeviceId, const uint32_t OPk_id, const DSA< Curve, lime::DSAtype::publicKey > &peerIk, long int selfDeviceId, std::shared_ptr< RNG > RNG_context) | |
Create a new DR session for message reception. Match pseudo code for RatchetInitBob in DR spec section 3.3. More... | |
DR (std::shared_ptr< lime::Db > localStorage, long sessionId, std::shared_ptr< RNG > RNG_context) | |
Create a new DR session to be loaded from db. More... | |
DR (DR< Curve > &a)=delete | |
DR< Curve > & | operator= (DR< Curve > &a)=delete |
~DR () | |
template<typename inputContainer > | |
void | ratchetEncrypt (const inputContainer &plaintext, std::vector< uint8_t > &&AD, std::vector< uint8_t > &ciphertext, const bool payloadDirectEncryption) |
Encrypt using the double-ratchet algorithm. More... | |
template<typename outputContainer > | |
bool | ratchetDecrypt (const std::vector< uint8_t > &cipherText, const std::vector< uint8_t > &AD, outputContainer &plaintext, const bool payloadDirectEncryption) |
Decrypt Double Ratchet message. More... | |
long int | dbSessionId (void) const |
return the session's local storage id More... | |
bool | isActive (void) const |
return the current status of session More... | |
store a Double Rachet session.
A session is associated to a local user and a peer device. It stores all the state variables described in Double Ratcher spec section 3.2 and provide encrypt/decrypt functions
lime::DR< Curve >::DR | ( | std::shared_ptr< lime::Db > | localStorage, |
const DRChainKey & | SK, | ||
const SharedADBuffer & | AD, | ||
const X< Curve, lime::Xtype::publicKey > & | peerPublicKey, | ||
const long int | peerDid, | ||
const std::string & | peerDeviceId, | ||
const DSA< Curve, lime::DSAtype::publicKey > & | peerIk, | ||
long int | selfDid, | ||
const std::vector< uint8_t > & | X3DH_initMessage, | ||
std::shared_ptr< RNG > | RNG_context | ||
) |
Create a new DR session for sending message. Match pseudo code for RatchetInitAlice in DR spec section 3.3.
[in] | localStorage | Local storage accessor to save DR session and perform mkskipped lookup |
[in] | SK | a 32 bytes shared secret established prior the session init (likely done using X3DH) |
[in] | AD | The associated data generated by X3DH protocol and permanently part of the DR session(see X3DH spec section 3.3 and lime doc section 5.4.3) |
[in] | peerPublicKey | the public key of message recipient (also obtained through X3DH, shall be peer SPk) |
[in] | peerDid | Id used in local storage for this peer Device this session shall be attached to |
[in] | peerDeviceId | The peer Device Id this session is connected to. Ignored if peerDid is not 0 |
[in] | peerIk | The Identity Key of the peer device this session is connected to. Ignored if peerDid is not 0 |
[in] | selfDid | Id used in local storage for local user this session shall be attached to |
[in] | X3DH_initMessage | at session creation as sender we shall also store the X3DHInit message to be able to include it in all message until we got a response from peer |
[in] | RNG_context | A Random Number Generator context used for any rndom generation needed by this session |
lime::DR< Curve >::DR | ( | std::shared_ptr< lime::Db > | localStorage, |
const DRChainKey & | SK, | ||
const SharedADBuffer & | AD, | ||
const Xpair< Curve > & | selfKeyPair, | ||
long int | peerDid, | ||
const std::string & | peerDeviceId, | ||
const uint32_t | OPk_id, | ||
const DSA< Curve, lime::DSAtype::publicKey > & | peerIk, | ||
long int | selfDid, | ||
std::shared_ptr< RNG > | RNG_context | ||
) |
Create a new DR session for message reception. Match pseudo code for RatchetInitBob in DR spec section 3.3.
[in] | localStorage | Local storage accessor to save DR session and perform mkskipped lookup |
[in] | SK | a 32 bytes shared secret established prior the session init (likely done using X3DH) |
[in] | AD | The associated data generated by X3DH protocol and permanently part of the DR session(see X3DH spec section 3.3 and lime doc section 5.4.3) |
[in] | selfKeyPair | the key pair used by sender to establish this DR session (DR spec section 5.1: it shall be our SPk) |
[in] | peerDid | Id used in local storage for this peer Device this session shall be attached to |
[in] | peerDeviceId | The peer Device Id this session is connected to. Ignored if peerDid is not 0 |
[in] | OPk_id | Id of the self OPk used to create this session: we must remove it from local storage when saving the session in it. (ignored if 0) |
[in] | peerIk | The Identity Key of the peer device this session is connected to. Ignored if peerDid is not 0 |
[in] | selfDid | Id used in local storage for local user this session shall be attached to |
[in] | RNG_context | A Random Number Generator context used for any rndom generation needed by this session |
lime::DR< Curve >::DR | ( | std::shared_ptr< lime::Db > | localStorage, |
long | sessionId, | ||
std::shared_ptr< RNG > | RNG_context | ||
) |
Create a new DR session to be loaded from db.
m_dirty is already set to clean and DHR_valid to true as we won't save a session if no successfull sending or reception was performed if loading fails, caller should destroy the session
[in] | localStorage | Local storage accessor to save DR session and perform mkskipped lookup |
[in] | sessionId | row id in the database identifying the session to be loaded |
[in] | RNG_context | A Random Number Generator context used for any rndom generation needed by this session |
|
inline |
return the session's local storage id
|
inline |
return the current status of session
bool lime::DR< Curve >::ratchetDecrypt | ( | const std::vector< uint8_t > & | ciphertext, |
const std::vector< uint8_t > & | AD, | ||
outputContainer & | plaintext, | ||
const bool | payloadDirectEncryption | ||
) |
Decrypt Double Ratchet message.
outputContainer | is used with
|
[in] | ciphertext | Input to be decrypted, is likely to be a 32 bytes vector holding the crypted version of a random seed |
[in] | AD | Associated data authenticated along the encryption (initial session AD and DR message header are append to it) |
[out] | plaintext | Decrypted output |
[in] | payloadDirectEncryption | A flag to enforce checking on message type: when set we expect to get payload in the message(so message header matching flag must be set) |
void lime::DR< Curve >::ratchetEncrypt | ( | const inputContainer & | plaintext, |
std::vector< uint8_t > && | AD, | ||
std::vector< uint8_t > & | ciphertext, | ||
const bool | payloadDirectEncryption | ||
) |
Encrypt using the double-ratchet algorithm.
inputContainer | is used with
|
[in] | plaintext | the input to be encrypted, may actually be a 32 bytes buffer holding the seed used to generate key+IV for a AES-GCM encryption to the actual message |
[in] | AD | Associated Data, this buffer shall hold: source GRUU<...> || recipient GRUU<...> || [ actual message AEAD auth tag OR recipient User Id] |
[out] | ciphertext | buffer holding the header, cipher text and auth tag, shall contain the key and IV used to cipher the actual message, auth tag applies on AD || header |
[in] | payloadDirectEncryption | A flag to set in message header: set when having payload in the DR message |