Browse Source

store intermediate symmetric keys

pull/1515/head
orignal 4 years ago
parent
commit
f9175db28e
  1. 33
      libi2pd/ECIESX25519AEADRatchetSession.cpp
  2. 9
      libi2pd/ECIESX25519AEADRatchetSession.h

33
libi2pd/ECIESX25519AEADRatchetSession.cpp

@ -44,27 +44,36 @@ namespace garlic
void RatchetTagSet::GetSymmKey (int index, uint8_t * key) void RatchetTagSet::GetSymmKey (int index, uint8_t * key)
{ {
if (m_NextSymmKeyIndex > 0 && index >= m_NextSymmKeyIndex) if (index >= m_NextSymmKeyIndex)
{ {
auto num = index + 1 - m_NextSymmKeyIndex; auto num = index + 1 - m_NextSymmKeyIndex;
if (!m_NextSymmKeyIndex)
{
i2p::crypto::HKDF (m_SymmKeyCK, nullptr, 0, "SymmetricRatchet", m_CurrentSymmKeyCK); // keydata_0 = HKDF(symmKey_ck, SYMMKEY_CONSTANT, "SymmetricRatchet", 64)
m_NextSymmKeyIndex = 1;
num--;
}
for (int i = 0; i < num; i++) for (int i = 0; i < num; i++)
{
i2p::crypto::HKDF (m_CurrentSymmKeyCK, nullptr, 0, "SymmetricRatchet", m_CurrentSymmKeyCK); i2p::crypto::HKDF (m_CurrentSymmKeyCK, nullptr, 0, "SymmetricRatchet", m_CurrentSymmKeyCK);
if (i < num - 1)
m_ItermediateSymmKeys.emplace (m_NextSymmKeyIndex + i, m_CurrentSymmKeyCK + 32);
}
m_NextSymmKeyIndex += num; m_NextSymmKeyIndex += num;
memcpy (key, m_CurrentSymmKeyCK + 32, 32); memcpy (key, m_CurrentSymmKeyCK + 32, 32);
} }
else else
CalculateSymmKeyCK (index, key); {
auto it = m_ItermediateSymmKeys.find (index);
if (it != m_ItermediateSymmKeys.end ())
{
memcpy (key, it->second, 32);
m_ItermediateSymmKeys.erase (it);
}
else
LogPrint (eLogError, "Garlic: Missing symmetric key for index ", index);
}
} }
void RatchetTagSet::CalculateSymmKeyCK (int index, uint8_t * key)
{
// TODO: store intermediate keys
uint8_t currentSymmKeyCK[64];
i2p::crypto::HKDF (m_SymmKeyCK, nullptr, 0, "SymmetricRatchet", currentSymmKeyCK); // keydata_0 = HKDF(symmKey_ck, SYMMKEY_CONSTANT, "SymmetricRatchet", 64)
for (int i = 0; i < index; i++)
i2p::crypto::HKDF (currentSymmKeyCK, nullptr, 0, "SymmetricRatchet", currentSymmKeyCK); // keydata_n = HKDF(symmKey_chainKey_(n-1), SYMMKEY_CONSTANT, "SymmetricRatchet", 64)
memcpy (key, currentSymmKeyCK + 32, 32);
}
ECIESX25519AEADRatchetSession::ECIESX25519AEADRatchetSession (GarlicDestination * owner): ECIESX25519AEADRatchetSession::ECIESX25519AEADRatchetSession (GarlicDestination * owner):
GarlicRoutingSession (owner, true) GarlicRoutingSession (owner, true)

9
libi2pd/ECIESX25519AEADRatchetSession.h

@ -7,9 +7,11 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <list> #include <list>
#include <unordered_map>
#include "Identity.h" #include "Identity.h"
#include "Crypto.h" #include "Crypto.h"
#include "Garlic.h" #include "Garlic.h"
#include "Tag.h"
namespace i2p namespace i2p
{ {
@ -24,10 +26,6 @@ namespace garlic
uint64_t GetNextSessionTag (); uint64_t GetNextSessionTag ();
int GetNextIndex () const { return m_NextIndex; }; int GetNextIndex () const { return m_NextIndex; };
void GetSymmKey (int index, uint8_t * key); void GetSymmKey (int index, uint8_t * key);
private:
void CalculateSymmKeyCK (int index, uint8_t * key);
private: private:
@ -42,7 +40,8 @@ namespace garlic
} m_KeyData; } m_KeyData;
uint8_t m_SessTagConstant[32], m_SymmKeyCK[32], m_CurrentSymmKeyCK[64]; uint8_t m_SessTagConstant[32], m_SymmKeyCK[32], m_CurrentSymmKeyCK[64];
int m_NextIndex, m_NextSymmKeyIndex; int m_NextIndex, m_NextSymmKeyIndex;
std::unordered_map<int, i2p::data::Tag<32> > m_ItermediateSymmKeys;
}; };
enum ECIESx25519BlockType enum ECIESx25519BlockType

Loading…
Cancel
Save