bool CKadID::SetKey(CHolder<CPublicKey>& pKey, UINT eAlgorithm) { if(m_PublicKey) return m_PublicKey->GetSize() == pKey->GetSize() && memcmp(m_PublicKey->GetKey(), pKey->GetKey(), m_PublicKey->GetSize()) == 0; CUInt128 ID; MakeID(pKey, ID.GetData(), ID.GetSize(), eAlgorithm); if(CompareTo(ID) != 0) return false; m_PublicKey = pKey; return true; }
CKademlia::CKademlia(uint16 Port, bool bIPv6, const CVariant& Config, const string& Version) { m_Protocol = KAD_PROT_VER; if(!Version.empty()) m_Version += Version; else m_Version = "v " STR(KAD_PROT_MJR) "." STR(KAD_PROT_MIN); m_pConfig = new CKadConfig(this); if(Config.IsValid()) m_pConfig->Merge(Config); LoadData(); if(m_pKadKey->GetAlgorithm() == CAbstractKey::eUndefined) { m_pKadKey->SetAlgorithm(CAbstractKey::eECP); //m_pKadKey->GenerateKey("secp256r1"); // NIST: P-256 m_pKadKey->GenerateKey("brainpoolP256r1"); // dont trust NIST (NSA) curves, use brainpool LogLine(LOG_INFO, L"Generated new Private NodeKey"); SaveData(); } m_pSocket = new CSmartSocket(SEC2MS(Cfg()->GetInt("ConnectionTimeout")), this); CScoped<CPublicKey> pKey = m_pKadKey->PublicKey(); CUInt128 ID; CKadID::MakeID(pKey, ID.GetData(), ID.GetSize()); LogLine(LOG_INFO, L"Neo Kad ID: %s", ID.ToHex().c_str()); uint64 RecvKey; CAbstractKey::Fold(ID.GetData(), ID.GetSize(),(byte*)&RecvKey, sizeof(RecvKey)); m_pSocket->SetupCrypto(RecvKey, m_pKadKey); #ifdef _DEBUG LogLine(LOG_INFO, L"Socket PassKey is %I64u", RecvKey); #endif m_Port = 0; m_IPv4 = CAddress(CAddress::IPv4); m_IPv6 = CAddress(CAddress::IPv6); for(int i=Port; i < Port + 1000; i++) { CUTPSocketListner* pSocketListner = new CUTPSocketListner(m_pSocket); CUTPSocketListner* pSocketListnerV6 = bIPv6 ? new CUTPSocketListner(m_pSocket) : NULL; bool bV4 = pSocketListner->Bind(i, CAddress(CAddress::IPv4)); bool bV6 = !pSocketListnerV6 || pSocketListnerV6->Bind(i, CAddress(CAddress::IPv6)); if(bV4 && bV6) { m_pSocket->InstallListener(pSocketListner); if(pSocketListnerV6) m_pSocket->InstallListener(pSocketListnerV6); m_Port = i; break; } delete pSocketListner; delete pSocketListnerV6; } }