|
|
|
@ -130,10 +130,6 @@ namespace client
@@ -130,10 +130,6 @@ namespace client
|
|
|
|
|
if (!m_IsRunning) |
|
|
|
|
{ |
|
|
|
|
m_IsRunning = true; |
|
|
|
|
if (m_IsPublic) |
|
|
|
|
PersistTemporaryKeys (); |
|
|
|
|
else |
|
|
|
|
i2p::crypto::GenerateElGamalKeyPair(m_EncryptionPrivateKey, m_EncryptionPublicKey); |
|
|
|
|
m_Pool->SetLocalDestination (shared_from_this ()); |
|
|
|
|
m_Pool->SetActive (true); |
|
|
|
|
m_Thread = new std::thread (std::bind (&LeaseSetDestination::Run, shared_from_this ())); |
|
|
|
@ -204,14 +200,21 @@ namespace client
@@ -204,14 +200,21 @@ namespace client
|
|
|
|
|
return m_LeaseSet; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LeaseSetDestination::SetLeaseSet (i2p::data::LocalLeaseSet * newLeaseSet) |
|
|
|
|
{ |
|
|
|
|
m_LeaseSet.reset (newLeaseSet); |
|
|
|
|
if (m_IsPublic) |
|
|
|
|
{ |
|
|
|
|
m_PublishVerificationTimer.cancel (); |
|
|
|
|
Publish (); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LeaseSetDestination::UpdateLeaseSet () |
|
|
|
|
{ |
|
|
|
|
int numTunnels = m_Pool->GetNumInboundTunnels () + 2; // 2 backup tunnels
|
|
|
|
|
if (numTunnels > i2p::data::MAX_NUM_LEASES) numTunnels = i2p::data::MAX_NUM_LEASES; // 16 tunnels maximum
|
|
|
|
|
auto leaseSet = new i2p::data::LocalLeaseSet (GetIdentity (), GetEncryptionPublicKey (), |
|
|
|
|
m_Pool->GetInboundTunnels (numTunnels)); |
|
|
|
|
Sign (leaseSet->GetBuffer (), leaseSet->GetBufferLen () - leaseSet->GetSignatureLen (), leaseSet->GetSignature ()); // TODO
|
|
|
|
|
m_LeaseSet.reset (leaseSet); |
|
|
|
|
CreateNewLeaseSet (m_Pool->GetInboundTunnels (numTunnels)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool LeaseSetDestination::SubmitSessionKey (const uint8_t * key, const uint8_t * tag) |
|
|
|
@ -391,11 +394,6 @@ namespace client
@@ -391,11 +394,6 @@ namespace client
|
|
|
|
|
{ |
|
|
|
|
i2p::garlic::GarlicDestination::SetLeaseSetUpdated (); |
|
|
|
|
UpdateLeaseSet (); |
|
|
|
|
if (m_IsPublic) |
|
|
|
|
{ |
|
|
|
|
m_PublishVerificationTimer.cancel (); |
|
|
|
|
Publish (); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LeaseSetDestination::Publish () |
|
|
|
@ -644,34 +642,14 @@ namespace client
@@ -644,34 +642,14 @@ namespace client
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LeaseSetDestination::PersistTemporaryKeys () |
|
|
|
|
{ |
|
|
|
|
std::string ident = GetIdentHash().ToBase32(); |
|
|
|
|
std::string path = i2p::fs::DataDirPath("destinations", (ident + ".dat")); |
|
|
|
|
std::ifstream f(path, std::ifstream::binary); |
|
|
|
|
|
|
|
|
|
if (f) { |
|
|
|
|
f.read ((char *)m_EncryptionPublicKey, 256); |
|
|
|
|
f.read ((char *)m_EncryptionPrivateKey, 256); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LogPrint (eLogInfo, "Destination: Creating new temporary keys for address ", ident, ".b32.i2p"); |
|
|
|
|
i2p::crypto::GenerateElGamalKeyPair(m_EncryptionPrivateKey, m_EncryptionPublicKey); |
|
|
|
|
|
|
|
|
|
std::ofstream f1 (path, std::ofstream::binary | std::ofstream::out); |
|
|
|
|
if (f1) { |
|
|
|
|
f1.write ((char *)m_EncryptionPublicKey, 256); |
|
|
|
|
f1.write ((char *)m_EncryptionPrivateKey, 256); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
LogPrint(eLogError, "Destinations: Can't save keys to ", path); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ClientDestination::ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic, const std::map<std::string, std::string> * params): |
|
|
|
|
LeaseSetDestination (isPublic, params), |
|
|
|
|
m_Keys (keys), m_DatagramDestination (nullptr) |
|
|
|
|
{ |
|
|
|
|
if (isPublic) |
|
|
|
|
PersistTemporaryKeys (); |
|
|
|
|
else |
|
|
|
|
i2p::crypto::GenerateElGamalKeyPair(m_EncryptionPrivateKey, m_EncryptionPublicKey); |
|
|
|
|
if (isPublic) |
|
|
|
|
LogPrint (eLogInfo, "Destination: Local address ", GetIdentHash().ToBase32 (), " created"); |
|
|
|
|
} |
|
|
|
@ -840,5 +818,37 @@ namespace client
@@ -840,5 +818,37 @@ namespace client
|
|
|
|
|
ret.push_back (it1.second); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ClientDestination::PersistTemporaryKeys () |
|
|
|
|
{ |
|
|
|
|
std::string ident = GetIdentHash().ToBase32(); |
|
|
|
|
std::string path = i2p::fs::DataDirPath("destinations", (ident + ".dat")); |
|
|
|
|
std::ifstream f(path, std::ifstream::binary); |
|
|
|
|
|
|
|
|
|
if (f) { |
|
|
|
|
f.read ((char *)m_EncryptionPublicKey, 256); |
|
|
|
|
f.read ((char *)m_EncryptionPrivateKey, 256); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LogPrint (eLogInfo, "Destination: Creating new temporary keys for address ", ident, ".b32.i2p"); |
|
|
|
|
i2p::crypto::GenerateElGamalKeyPair(m_EncryptionPrivateKey, m_EncryptionPublicKey); |
|
|
|
|
|
|
|
|
|
std::ofstream f1 (path, std::ofstream::binary | std::ofstream::out); |
|
|
|
|
if (f1) { |
|
|
|
|
f1.write ((char *)m_EncryptionPublicKey, 256); |
|
|
|
|
f1.write ((char *)m_EncryptionPrivateKey, 256); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
LogPrint(eLogError, "Destinations: Can't save keys to ", path); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ClientDestination::CreateNewLeaseSet (std::vector<std::shared_ptr<i2p::tunnel::InboundTunnel> > tunnels) |
|
|
|
|
{ |
|
|
|
|
auto leaseSet = new i2p::data::LocalLeaseSet (GetIdentity (), m_EncryptionPublicKey, tunnels); |
|
|
|
|
// sign
|
|
|
|
|
Sign (leaseSet->GetBuffer (), leaseSet->GetBufferLen () - leaseSet->GetSignatureLen (), leaseSet->GetSignature ()); // TODO
|
|
|
|
|
SetLeaseSet (leaseSet); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|