extract and verify family from RouterInfo

This commit is contained in:
orignal 2016-02-19 16:37:41 -05:00
parent 7bfc3562af
commit 4eef9e780f
5 changed files with 24 additions and 7 deletions

View File

@ -101,12 +101,12 @@ namespace data
LogPrint (eLogInfo, "Family: ", numCertificates, " certificates loaded");
}
bool Families::VerifyFamily (const char * family, const IdentHash& ident,
bool Families::VerifyFamily (const std::string& family, const IdentHash& ident,
const char * signature, const char * key)
{
uint8_t buf[50], signatureBuf[64];
size_t len = strlen (family), signatureLen = strlen (signature);
memcpy (buf, family, len);
size_t len = family.length (), signatureLen = strlen (signature);
memcpy (buf, family.c_str (), len);
memcpy (buf + len, (const uint8_t *)ident, 32);
len += 32;
Base64ToByteStream (signature, signatureLen, signatureBuf, 64);

View File

@ -18,8 +18,8 @@ namespace data
Families ();
~Families ();
void LoadCertificates ();
bool VerifyFamily (const char * family, const IdentHash& ident,
const char * signature, const char * key);
bool VerifyFamily (const std::string& family, const IdentHash& ident,
const char * signature, const char * key = nullptr);
private:

View File

@ -62,6 +62,7 @@ namespace data
void PostI2NPMsg (std::shared_ptr<const I2NPMessage> msg);
void Reseed ();
Families& GetFamilies () { return m_Families; };
// for web interface
int GetNumRouters () const { return m_RouterInfos.size (); };

View File

@ -8,6 +8,7 @@
#include "Base.h"
#include "Timestamp.h"
#include "Log.h"
#include "NetDb.h"
#include "RouterInfo.h"
namespace i2p
@ -262,11 +263,26 @@ namespace data
if (!strcmp (key, "caps"))
ExtractCaps (value);
// check netId
if (!strcmp (key, "netId") && atoi (value) != I2PD_NET_ID)
else if (!strcmp (key, "netId") && atoi (value) != I2PD_NET_ID)
{
LogPrint (eLogError, "Unexpected netid=", value);
m_IsUnreachable = true;
}
// family
else if (!strcmp (key, "family"))
{
m_Family = value;
boost::to_lower (m_Family);
}
else if (!strcmp (key, "family.sig"))
{
if (!netdb.GetFamilies ().VerifyFamily (m_Family, GetIdentHash (), value))
{
LogPrint (eLogWarning, "RouterInfo: family signature verification failed");
m_Family.clear ();
}
}
if (!s) return;
}

View File

@ -180,7 +180,7 @@ namespace data
private:
std::string m_FullPath;
std::string m_FullPath, m_Family;
std::shared_ptr<const IdentityEx> m_RouterIdentity;
uint8_t * m_Buffer;
size_t m_BufferLen;