lime
Lime is a C++ library implementing Open Whisper System Signal protocol
Classes | Namespaces | Typedefs | Enumerations | Functions | Variables
lime_double_ratchet.cpp File Reference

Classes

struct  lime::anonymous_namespace{lime_double_ratchet.cpp}::ReceiverKeyChain< Curve >
 Chain storing the DH and MKs associated with Nr(uint16_t map index) More...
 
class  lime::anonymous_namespace{lime_double_ratchet.cpp}::DRHeader< Curve, bool >
 helper class and functions to parse Double Ratchet message header and access its components More...
 
class  lime::anonymous_namespace{lime_double_ratchet.cpp}::DRHeader< Curve, false >
 
class  lime::anonymous_namespace{lime_double_ratchet.cpp}::DRHeader< Algo, true >
 
class  lime::DRi< Curve >
 a Double Rachet session, implements the DR interface. More...
 

Namespaces

 lime
 
 lime::anonymous_namespace{lime_double_ratchet.cpp}
 

Typedefs

using lime::anonymous_namespace{lime_double_ratchet.cpp}::DRMKey = lime::sBuffer< lime::settings::DRMessageKeySize+lime::settings::DRMessageIVSize >
 

Enumerations

enum  lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus : uint8_t {
  lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus::clean, lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus::dirty_encrypt, lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus::dirty_decrypt, lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus::dirty_ratchet_receiving,
  lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus::dirty_kem_ratchet_receiving, lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus::dirty_ratchet_sending, lime::anonymous_namespace{lime_double_ratchet.cpp}::DRSessionDbStatus::dirty
}
 the possible status of session regarding the Local Storage More...
 
enum  lime::anonymous_namespace{lime_double_ratchet.cpp}::DHrStatusBitMap : uint32_t {
  lime::anonymous_namespace{lime_double_ratchet.cpp}::DHrStatusBitMap::forceKEMRatchet = 0x00000001, lime::anonymous_namespace{lime_double_ratchet.cpp}::DHrStatusBitMap::peerKEMPkAvailable = 0x00000002, lime::anonymous_namespace{lime_double_ratchet.cpp}::DHrStatusBitMap::peerHasSelfKEMPk = 0x00000004, lime::anonymous_namespace{lime_double_ratchet.cpp}::DHrStatusBitMap::peerECPkAvailable = 0x00000008,
  lime::anonymous_namespace{lime_double_ratchet.cpp}::DHrStatusBitMap::KEMRatchetChainSize = 0x7FFFFF00
}
 

Functions

template<typename Curve >
static void lime::anonymous_namespace{lime_double_ratchet.cpp}::KDF_RK (DRChainKey &RK, DRChainKey &CK, const X< Curve, lime::Xtype::sharedSecret > &dhOut) noexcept
 Key Derivation Function used in Root key/Diffie-Hellman Ratchet chain. More...
 
template<typename Curve >
static void lime::anonymous_namespace{lime_double_ratchet.cpp}::KEM_KDF_RK (DRChainKey &RK, DRChainKey &CK, const X< typename Curve::EC, lime::Xtype::sharedSecret > &dhOut, const K< typename Curve::KEM, lime::Ktype::sharedSecret > &kemOut, const X< typename Curve::EC, lime::Xtype::publicKey > &ECPkSender, const X< typename Curve::EC, lime::Xtype::publicKey > &ECPkReceiver, const K< typename Curve::KEM, lime::Ktype::publicKey > &KEMPk, const K< typename Curve::KEM, lime::Ktype::cipherText > &KEMCt) noexcept
 Key Derivation Function used in Root key/Diffie-Hellman/KEM Ratchet chain. More...
 
template<typename Curve >
static void lime::anonymous_namespace{lime_double_ratchet.cpp}::KDF_CK (DRChainKey &CK, DRMKey &MK, uint16_t chainIndex, typename std::enable_if_t<!std::is_base_of_v< genericKEM, Curve >, bool >=true) noexcept
 Key Derivation Function used in Symmetric key ratchet chain. More...
 
template<typename Curve >
static void lime::anonymous_namespace{lime_double_ratchet.cpp}::KDF_CK (DRChainKey &CK, DRMKey &MK, uint16_t chainIndex, typename std::enable_if_t< std::is_base_of_v< genericKEM, Curve >, bool >=true) noexcept
 
static bool lime::anonymous_namespace{lime_double_ratchet.cpp}::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. More...
 
template<typename Algo >
std::shared_ptr< DR > lime::make_DR_from_localStorage (std::shared_ptr< lime::Db > localStorage, long sessionId, std::shared_ptr< RNG > RNG_context)
 
template<typename Algo >
std::shared_ptr< DR > lime::make_DR_for_sender (std::shared_ptr< lime::Db > localStorage, const DRChainKey &SK, const SharedADBuffer &AD, const ARrKey< Algo > &peerPublicKey, long int peerDid, const std::string &peerDeviceId, const DSA< typename Algo::EC, lime::DSAtype::publicKey > &peerIk, long int selfDid, const std::vector< uint8_t > &X3DH_initMessage, std::shared_ptr< RNG > RNG_context)
 
template<typename Algo >
std::shared_ptr< DR > lime::make_DR_for_receiver (std::shared_ptr< lime::Db > localStorage, const DRChainKey &SK, const SharedADBuffer &AD, const ARsKey< Algo > &selfKeyPair, long int peerDid, const std::string &peerDeviceId, const uint32_t OPk_id, const DSA< typename Algo::EC, lime::DSAtype::publicKey > &peerIk, long int selfDeviceId, std::shared_ptr< RNG > RNG_context)
 
void lime::encryptMessage (std::vector< RecipientInfos > &recipients, const std::vector< uint8_t > &plaintext, const std::vector< uint8_t > &recipientUserId, const std::string &sourceDeviceId, std::vector< uint8_t > &cipherMessage, const lime::EncryptionPolicy encryptionPolicy, std::shared_ptr< lime::Db > localStorage, const std::shared_ptr< limeRandomSeedCallback > randomSeedCallback)
 Encrypt a message to all recipients, identified by their device id. More...
 
std::shared_ptr< DR > lime::decryptMessage (const std::string &sourceDeviceId, const std::string &recipientDeviceId, const std::vector< uint8_t > &recipientUserId, std::vector< std::shared_ptr< DR >> &DRSessions, const std::vector< uint8_t > &DRmessage, const std::vector< uint8_t > &cipherMessage, std::vector< uint8_t > &plaintext)
 Decrypt a message. More...
 

Variables

const std::array< uint8_t, 1 > lime::anonymous_namespace{lime_double_ratchet.cpp}::hkdf_ck_info {{0x02}}
 
const std::array< uint8_t, 1 > lime::anonymous_namespace{lime_double_ratchet.cpp}::hkdf_mk_info {{0x01}}