mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-07 16:04:14 +00:00
Merge branch 'master' of github.com:majestrate/i2pd
This commit is contained in:
commit
88d1aab7a3
31
Crypto.cpp
31
Crypto.cpp
@ -386,9 +386,11 @@ namespace crypto
|
|||||||
// HMAC
|
// HMAC
|
||||||
const uint64_t IPAD = 0x3636363636363636;
|
const uint64_t IPAD = 0x3636363636363636;
|
||||||
const uint64_t OPAD = 0x5C5C5C5C5C5C5C5C;
|
const uint64_t OPAD = 0x5C5C5C5C5C5C5C5C;
|
||||||
|
|
||||||
|
#if defined(__AVX__)
|
||||||
static const uint64_t ipads[] = { IPAD, IPAD, IPAD, IPAD };
|
static const uint64_t ipads[] = { IPAD, IPAD, IPAD, IPAD };
|
||||||
static const uint64_t opads[] = { OPAD, OPAD, OPAD, OPAD };
|
static const uint64_t opads[] = { OPAD, OPAD, OPAD, OPAD };
|
||||||
|
#endif
|
||||||
|
|
||||||
void HMACMD5Digest (uint8_t * msg, size_t len, const MACKey& key, uint8_t * digest)
|
void HMACMD5Digest (uint8_t * msg, size_t len, const MACKey& key, uint8_t * digest)
|
||||||
// key is 32 bytes
|
// key is 32 bytes
|
||||||
@ -402,18 +404,19 @@ namespace crypto
|
|||||||
(
|
(
|
||||||
"vmovups %[key], %%ymm0 \n"
|
"vmovups %[key], %%ymm0 \n"
|
||||||
"vmovups %[ipad], %%ymm1 \n"
|
"vmovups %[ipad], %%ymm1 \n"
|
||||||
"vmovups %%ymm1, 32%[buf] \n"
|
"vmovups %%ymm1, 32(%[buf]) \n"
|
||||||
"vxorps %%ymm0, %%ymm1, %%ymm1 \n"
|
"vxorps %%ymm0, %%ymm1, %%ymm1 \n"
|
||||||
"vmovups %%ymm1, %[buf] \n"
|
"vmovups %%ymm1, (%[buf]) \n"
|
||||||
"vmovups %[opad], %%ymm1 \n"
|
"vmovups %[opad], %%ymm1 \n"
|
||||||
"vmovups %%ymm1, 32%[hash] \n"
|
"vmovups %%ymm1, 32(%[hash]) \n"
|
||||||
"vxorps %%ymm0, %%ymm1, %%ymm1 \n"
|
"vxorps %%ymm0, %%ymm1, %%ymm1 \n"
|
||||||
"vmovups %%ymm1, %[hash] \n"
|
"vmovups %%ymm1, (%[hash]) \n"
|
||||||
"vzeroall \n" // end of AVX
|
"vzeroall \n" // end of AVX
|
||||||
"movups %%xmm0, 80%[hash] \n" // zero last 16 bytes
|
"movups %%xmm0, 80(%[hash]) \n" // zero last 16 bytes
|
||||||
: [buf]"=m"(*buf), [hash]"=m"(*hash)
|
:
|
||||||
: [key]"m"(*(const uint8_t *)key), [ipad]"m"(*ipads), [opad]"m"(*opads)
|
: [key]"m"(*(const uint8_t *)key), [ipad]"m"(*ipads), [opad]"m"(*opads),
|
||||||
: "memory"
|
[buf]"r"(buf), [hash]"r"(hash)
|
||||||
|
: "memory", "%xmm0" // TODO: change to %ymm0 later
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
// ikeypad
|
// ikeypad
|
||||||
@ -421,13 +424,19 @@ namespace crypto
|
|||||||
buf[1] = key.GetLL ()[1] ^ IPAD;
|
buf[1] = key.GetLL ()[1] ^ IPAD;
|
||||||
buf[2] = key.GetLL ()[2] ^ IPAD;
|
buf[2] = key.GetLL ()[2] ^ IPAD;
|
||||||
buf[3] = key.GetLL ()[3] ^ IPAD;
|
buf[3] = key.GetLL ()[3] ^ IPAD;
|
||||||
memcpy (buf + 4, ipads, 32);
|
buf[4] = IPAD;
|
||||||
|
buf[5] = IPAD;
|
||||||
|
buf[6] = IPAD;
|
||||||
|
buf[7] = IPAD;
|
||||||
// okeypad
|
// okeypad
|
||||||
hash[0] = key.GetLL ()[0] ^ OPAD;
|
hash[0] = key.GetLL ()[0] ^ OPAD;
|
||||||
hash[1] = key.GetLL ()[1] ^ OPAD;
|
hash[1] = key.GetLL ()[1] ^ OPAD;
|
||||||
hash[2] = key.GetLL ()[2] ^ OPAD;
|
hash[2] = key.GetLL ()[2] ^ OPAD;
|
||||||
hash[3] = key.GetLL ()[3] ^ OPAD;
|
hash[3] = key.GetLL ()[3] ^ OPAD;
|
||||||
memcpy (hash + 4, opads, 32);
|
hash[4] = OPAD;
|
||||||
|
hash[5] = OPAD;
|
||||||
|
hash[6] = OPAD;
|
||||||
|
hash[7] = OPAD;
|
||||||
// fill last 16 bytes with zeros (first hash size assumed 32 bytes in I2P)
|
// fill last 16 bytes with zeros (first hash size assumed 32 bytes in I2P)
|
||||||
memset (hash + 10, 0, 16);
|
memset (hash + 10, 0, 16);
|
||||||
#endif
|
#endif
|
||||||
|
13
Crypto.h
13
Crypto.h
@ -76,7 +76,18 @@ namespace crypto
|
|||||||
|
|
||||||
void operator^=(const ChipherBlock& other) // XOR
|
void operator^=(const ChipherBlock& other) // XOR
|
||||||
{
|
{
|
||||||
#if defined(__x86_64__) || defined(__SSE__) // for Intel x84 or with SSE
|
#if defined(__AVX__) // AVX
|
||||||
|
__asm__
|
||||||
|
(
|
||||||
|
"vmovups (%[buf]), %%xmm0 \n"
|
||||||
|
"vmovups (%[other]), %%xmm1 \n"
|
||||||
|
"vxorps %%xmm0, %%xmm1, %%xmm0 \n"
|
||||||
|
"vmovups %%xmm0, (%[buf]) \n"
|
||||||
|
:
|
||||||
|
: [buf]"r"(buf), [other]"r"(other.buf)
|
||||||
|
: "%xmm0", "%xmm1", "memory"
|
||||||
|
);
|
||||||
|
#elif defined(__SSE__) // SSE
|
||||||
__asm__
|
__asm__
|
||||||
(
|
(
|
||||||
"movups (%[buf]), %%xmm0 \n"
|
"movups (%[buf]), %%xmm0 \n"
|
||||||
|
@ -243,9 +243,6 @@ namespace datagram
|
|||||||
if (sz) {
|
if (sz) {
|
||||||
auto idx = rand() % sz;
|
auto idx = rand() % sz;
|
||||||
m_CurrentRemoteLease = ls[idx];
|
m_CurrentRemoteLease = ls[idx];
|
||||||
} else {
|
|
||||||
// no more leases, bail
|
|
||||||
LogPrint(eLogWarning, "DatagramSession: no more valid remote leases to ", m_RemoteIdent.ToBase32());
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// no remote lease set?
|
// no remote lease set?
|
||||||
@ -293,6 +290,7 @@ namespace datagram
|
|||||||
|
|
||||||
void DatagramSession::HandleLeaseSetUpdated(std::shared_ptr<i2p::data::LeaseSet> ls)
|
void DatagramSession::HandleLeaseSetUpdated(std::shared_ptr<i2p::data::LeaseSet> ls)
|
||||||
{
|
{
|
||||||
|
if(!ls) return;
|
||||||
// only update lease set if found and newer than previous lease set
|
// only update lease set if found and newer than previous lease set
|
||||||
uint64_t oldExpire = 0;
|
uint64_t oldExpire = 0;
|
||||||
if(m_RemoteLeaseSet) oldExpire = m_RemoteLeaseSet->GetExpirationTime();
|
if(m_RemoteLeaseSet) oldExpire = m_RemoteLeaseSet->GetExpirationTime();
|
||||||
|
10
Garlic.cpp
10
Garlic.cpp
@ -20,8 +20,7 @@ namespace garlic
|
|||||||
std::shared_ptr<const i2p::data::RoutingDestination> destination, int numTags, bool attachLeaseSet):
|
std::shared_ptr<const i2p::data::RoutingDestination> destination, int numTags, bool attachLeaseSet):
|
||||||
m_Owner (owner), m_Destination (destination), m_NumTags (numTags),
|
m_Owner (owner), m_Destination (destination), m_NumTags (numTags),
|
||||||
m_LeaseSetUpdateStatus (attachLeaseSet ? eLeaseSetUpdated : eLeaseSetDoNotSend),
|
m_LeaseSetUpdateStatus (attachLeaseSet ? eLeaseSetUpdated : eLeaseSetDoNotSend),
|
||||||
m_LeaseSetUpdateMsgID (0),
|
m_LeaseSetUpdateMsgID (0)
|
||||||
m_ElGamalEncryption (new i2p::crypto::ElGamalEncryption (destination->GetEncryptionPublicKey ()))
|
|
||||||
{
|
{
|
||||||
// create new session tags and session key
|
// create new session tags and session key
|
||||||
RAND_bytes (m_SessionKey, 32);
|
RAND_bytes (m_SessionKey, 32);
|
||||||
@ -29,7 +28,7 @@ namespace garlic
|
|||||||
}
|
}
|
||||||
|
|
||||||
GarlicRoutingSession::GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag):
|
GarlicRoutingSession::GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag):
|
||||||
m_Owner (nullptr), m_Destination (nullptr), m_NumTags (1), m_LeaseSetUpdateStatus (eLeaseSetDoNotSend), m_LeaseSetUpdateMsgID (0)
|
m_Owner (nullptr), m_NumTags (1), m_LeaseSetUpdateStatus (eLeaseSetDoNotSend), m_LeaseSetUpdateMsgID (0)
|
||||||
{
|
{
|
||||||
memcpy (m_SessionKey, sessionKey, 32);
|
memcpy (m_SessionKey, sessionKey, 32);
|
||||||
m_Encryption.SetKey (m_SessionKey);
|
m_Encryption.SetKey (m_SessionKey);
|
||||||
@ -188,7 +187,8 @@ namespace garlic
|
|||||||
RAND_bytes (elGamal.preIV, 32); // Pre-IV
|
RAND_bytes (elGamal.preIV, 32); // Pre-IV
|
||||||
uint8_t iv[32]; // IV is first 16 bytes
|
uint8_t iv[32]; // IV is first 16 bytes
|
||||||
SHA256(elGamal.preIV, 32, iv);
|
SHA256(elGamal.preIV, 32, iv);
|
||||||
m_ElGamalEncryption->Encrypt ((uint8_t *)&elGamal, buf, true);
|
i2p::crypto::ElGamalEncryption elGamalEncryption (m_Destination->GetEncryptionPublicKey ());
|
||||||
|
elGamalEncryption.Encrypt ((uint8_t *)&elGamal, buf, true);
|
||||||
m_Encryption.SetIV (iv);
|
m_Encryption.SetIV (iv);
|
||||||
buf += 514;
|
buf += 514;
|
||||||
len += 514;
|
len += 514;
|
||||||
@ -315,7 +315,7 @@ namespace garlic
|
|||||||
{
|
{
|
||||||
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 8000; // 8 sec
|
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 8000; // 8 sec
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
if (isDestination && m_Destination)
|
if (isDestination)
|
||||||
{
|
{
|
||||||
buf[size] = eGarlicDeliveryTypeDestination << 5;// delivery instructions flag destination
|
buf[size] = eGarlicDeliveryTypeDestination << 5;// delivery instructions flag destination
|
||||||
size++;
|
size++;
|
||||||
|
2
Garlic.h
2
Garlic.h
@ -128,6 +128,7 @@ namespace garlic
|
|||||||
|
|
||||||
GarlicDestination * m_Owner;
|
GarlicDestination * m_Owner;
|
||||||
std::shared_ptr<const i2p::data::RoutingDestination> m_Destination;
|
std::shared_ptr<const i2p::data::RoutingDestination> m_Destination;
|
||||||
|
|
||||||
i2p::crypto::AESKey m_SessionKey;
|
i2p::crypto::AESKey m_SessionKey;
|
||||||
std::list<SessionTag> m_SessionTags;
|
std::list<SessionTag> m_SessionTags;
|
||||||
int m_NumTags;
|
int m_NumTags;
|
||||||
@ -138,7 +139,6 @@ namespace garlic
|
|||||||
uint64_t m_LeaseSetSubmissionTime; // in milliseconds
|
uint64_t m_LeaseSetSubmissionTime; // in milliseconds
|
||||||
|
|
||||||
i2p::crypto::CBCEncryption m_Encryption;
|
i2p::crypto::CBCEncryption m_Encryption;
|
||||||
std::unique_ptr<const i2p::crypto::ElGamalEncryption> m_ElGamalEncryption;
|
|
||||||
|
|
||||||
std::shared_ptr<GarlicRoutingPath> m_SharedRoutingPath;
|
std::shared_ptr<GarlicRoutingPath> m_SharedRoutingPath;
|
||||||
|
|
||||||
|
@ -451,26 +451,26 @@ namespace http {
|
|||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowCommands (std::stringstream& s)
|
static void ShowCommands (std::stringstream& s, uint32_t token)
|
||||||
{
|
{
|
||||||
/* commands */
|
/* commands */
|
||||||
s << "<b>Router Commands</b><br>\r\n";
|
s << "<b>Router Commands</b><br>\r\n";
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_RUN_PEER_TEST << "\">Run peer test</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_RUN_PEER_TEST << "&token=" << token << "\">Run peer test</a><br>\r\n";
|
||||||
//s << " <a href=\"/?cmd=" << HTTP_COMMAND_RELOAD_CONFIG << "\">Reload config</a><br>\r\n";
|
//s << " <a href=\"/?cmd=" << HTTP_COMMAND_RELOAD_CONFIG << "\">Reload config</a><br>\r\n";
|
||||||
if (i2p::context.AcceptsTunnels ())
|
if (i2p::context.AcceptsTunnels ())
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_DISABLE_TRANSIT << "\">Decline transit tunnels</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_DISABLE_TRANSIT << "&token=" << token << "\">Decline transit tunnels</a><br>\r\n";
|
||||||
else
|
else
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_ENABLE_TRANSIT << "\">Accept transit tunnels</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_ENABLE_TRANSIT << "&token=" << token << "\">Accept transit tunnels</a><br>\r\n";
|
||||||
#if (!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID))
|
#if (!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID))
|
||||||
if (Daemon.gracefulShutdownInterval)
|
if (Daemon.gracefulShutdownInterval)
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_CANCEL << "\">Cancel graceful shutdown</a><br>";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_CANCEL << "&token=" << token << "\">Cancel graceful shutdown</a><br>";
|
||||||
else
|
else
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_START << "\">Start graceful shutdown</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_START << "&token=" << token << "\">Start graceful shutdown</a><br>\r\n";
|
||||||
#endif
|
#endif
|
||||||
#ifdef WIN32_APP
|
#ifdef WIN32_APP
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_START << "\">Graceful shutdown</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_START << "&token=" << token << "\">Graceful shutdown</a><br>\r\n";
|
||||||
#endif
|
#endif
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_NOW << "\">Force shutdown</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_NOW << "&token=" << token << "\">Force shutdown</a><br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowTransitTunnels (std::stringstream& s)
|
static void ShowTransitTunnels (std::stringstream& s)
|
||||||
@ -756,6 +756,7 @@ namespace http {
|
|||||||
SendReply (res, content);
|
SendReply (res, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::map<uint32_t, uint32_t> HTTPConnection::m_Tokens;
|
||||||
void HTTPConnection::HandlePage (const HTTPReq& req, HTTPRes& res, std::stringstream& s)
|
void HTTPConnection::HandlePage (const HTTPReq& req, HTTPRes& res, std::stringstream& s)
|
||||||
{
|
{
|
||||||
std::map<std::string, std::string> params;
|
std::map<std::string, std::string> params;
|
||||||
@ -771,7 +772,20 @@ namespace http {
|
|||||||
else if (page == HTTP_PAGE_TUNNELS)
|
else if (page == HTTP_PAGE_TUNNELS)
|
||||||
ShowTunnels (s);
|
ShowTunnels (s);
|
||||||
else if (page == HTTP_PAGE_COMMANDS)
|
else if (page == HTTP_PAGE_COMMANDS)
|
||||||
ShowCommands (s);
|
{
|
||||||
|
uint32_t token;
|
||||||
|
RAND_bytes ((uint8_t *)&token, 4);
|
||||||
|
auto ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
|
for (auto it = m_Tokens.begin (); it != m_Tokens.end (); )
|
||||||
|
{
|
||||||
|
if (ts > it->second + TOKEN_EXPIRATION_TIMEOUT)
|
||||||
|
it = m_Tokens.erase (it);
|
||||||
|
else
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
m_Tokens[token] = ts;
|
||||||
|
ShowCommands (s, token);
|
||||||
|
}
|
||||||
else if (page == HTTP_PAGE_TRANSIT_TUNNELS)
|
else if (page == HTTP_PAGE_TRANSIT_TUNNELS)
|
||||||
ShowTransitTunnels (s);
|
ShowTransitTunnels (s);
|
||||||
else if (page == HTTP_PAGE_LOCAL_DESTINATIONS)
|
else if (page == HTTP_PAGE_LOCAL_DESTINATIONS)
|
||||||
@ -798,13 +812,19 @@ namespace http {
|
|||||||
void HTTPConnection::HandleCommand (const HTTPReq& req, HTTPRes& res, std::stringstream& s)
|
void HTTPConnection::HandleCommand (const HTTPReq& req, HTTPRes& res, std::stringstream& s)
|
||||||
{
|
{
|
||||||
std::map<std::string, std::string> params;
|
std::map<std::string, std::string> params;
|
||||||
std::string cmd("");
|
|
||||||
URL url;
|
URL url;
|
||||||
|
|
||||||
url.parse(req.uri);
|
url.parse(req.uri);
|
||||||
url.parse_query(params);
|
url.parse_query(params);
|
||||||
cmd = params["cmd"];
|
|
||||||
|
|
||||||
|
std::string token = params["token"];
|
||||||
|
if (token.empty () || m_Tokens.find (std::stoi (token)) == m_Tokens.end ())
|
||||||
|
{
|
||||||
|
ShowError(s, "Invalid token");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string cmd = params["cmd"];
|
||||||
if (cmd == HTTP_COMMAND_RUN_PEER_TEST)
|
if (cmd == HTTP_COMMAND_RUN_PEER_TEST)
|
||||||
i2p::transport::transports.PeerTest ();
|
i2p::transport::transports.PeerTest ();
|
||||||
else if (cmd == HTTP_COMMAND_RELOAD_CONFIG)
|
else if (cmd == HTTP_COMMAND_RELOAD_CONFIG)
|
||||||
|
20
HTTPServer.h
20
HTTPServer.h
@ -1,10 +1,20 @@
|
|||||||
#ifndef HTTP_SERVER_H__
|
#ifndef HTTP_SERVER_H__
|
||||||
#define HTTP_SERVER_H__
|
#define HTTP_SERVER_H__
|
||||||
|
|
||||||
namespace i2p {
|
#include <inttypes.h>
|
||||||
namespace http {
|
#include <string>
|
||||||
extern const char *itoopieFavicon;
|
#include <memory>
|
||||||
const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
|
#include <map>
|
||||||
|
#include <thread>
|
||||||
|
#include <boost/asio.hpp>
|
||||||
|
#include "HTTP.h"
|
||||||
|
|
||||||
|
namespace i2p
|
||||||
|
{
|
||||||
|
namespace http
|
||||||
|
{
|
||||||
|
const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
|
||||||
|
const int TOKEN_EXPIRATION_TIMEOUT = 30; // in seconds
|
||||||
|
|
||||||
class HTTPConnection: public std::enable_shared_from_this<HTTPConnection>
|
class HTTPConnection: public std::enable_shared_from_this<HTTPConnection>
|
||||||
{
|
{
|
||||||
@ -35,6 +45,8 @@ namespace http {
|
|||||||
bool needAuth;
|
bool needAuth;
|
||||||
std::string user;
|
std::string user;
|
||||||
std::string pass;
|
std::string pass;
|
||||||
|
|
||||||
|
static std::map<uint32_t, uint32_t> m_Tokens; // token->timestamp in seconds
|
||||||
};
|
};
|
||||||
|
|
||||||
class HTTPServer
|
class HTTPServer
|
||||||
|
@ -92,7 +92,9 @@ namespace client
|
|||||||
m_Stream->Close ();
|
m_Stream->Close ();
|
||||||
m_Stream.reset ();
|
m_Stream.reset ();
|
||||||
}
|
}
|
||||||
|
m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_send); // avoid RST
|
||||||
m_Socket->close ();
|
m_Socket->close ();
|
||||||
|
|
||||||
Done(shared_from_this ());
|
Done(shared_from_this ());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,9 +109,11 @@ namespace client
|
|||||||
{
|
{
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint (eLogError, "I2PTunnel: read error: ", ecode.message ());
|
|
||||||
if (ecode != boost::asio::error::operation_aborted)
|
if (ecode != boost::asio::error::operation_aborted)
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "I2PTunnel: read error: ", ecode.message ());
|
||||||
Terminate ();
|
Terminate ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -91,7 +91,7 @@ namespace data
|
|||||||
if (m_StoreLeases)
|
if (m_StoreLeases)
|
||||||
{
|
{
|
||||||
auto ret = m_Leases.insert (std::make_shared<Lease>(lease));
|
auto ret = m_Leases.insert (std::make_shared<Lease>(lease));
|
||||||
if (!ret.second) *(*ret.first) = lease; // update existing
|
if (!ret.second) (*ret.first)->endDate = lease.endDate; // update existing
|
||||||
(*ret.first)->isUpdated = true;
|
(*ret.first)->isUpdated = true;
|
||||||
// check if lease's gateway is in our netDb
|
// check if lease's gateway is in our netDb
|
||||||
if (!netdb.FindRouter (lease.tunnelGateway))
|
if (!netdb.FindRouter (lease.tunnelGateway))
|
||||||
|
@ -39,9 +39,13 @@ endif
|
|||||||
|
|
||||||
# don't change following line to ifeq ($(USE_AESNI),yes) !!!
|
# don't change following line to ifeq ($(USE_AESNI),yes) !!!
|
||||||
ifeq ($(USE_AESNI),1)
|
ifeq ($(USE_AESNI),1)
|
||||||
CPU_FLAGS = -maes -DAESNI
|
CPU_FLAGS += -maes -DAESNI
|
||||||
else
|
else
|
||||||
CPU_FLAGS = -msse
|
CPU_FLAGS += -msse
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(USE_AVX),1)
|
||||||
|
CPU_FLAGS += -mavx
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_ASLR),yes)
|
ifeq ($(USE_ASLR),yes)
|
||||||
|
13
Makefile.osx
13
Makefile.osx
@ -3,21 +3,26 @@ CXXFLAGS = -g -Wall -std=c++11 -DMAC_OSX
|
|||||||
#CXXFLAGS = -g -O2 -Wall -std=c++11
|
#CXXFLAGS = -g -O2 -Wall -std=c++11
|
||||||
INCFLAGS = -I/usr/local/include -I/usr/local/ssl/include
|
INCFLAGS = -I/usr/local/include -I/usr/local/ssl/include
|
||||||
LDFLAGS = -Wl,-rpath,/usr/local/lib -L/usr/local/lib -L/usr/local/ssl/lib
|
LDFLAGS = -Wl,-rpath,/usr/local/lib -L/usr/local/lib -L/usr/local/ssl/lib
|
||||||
|
|
||||||
|
ifeq ($(USE_STATIC),yes)
|
||||||
|
LDLIBS = -lz -lcrypto -lssl /usr/local/lib/libboost_system.a /usr/local/lib/libboost_date_time.a /usr/local/lib/libboost_filesystem.a /usr/local/lib/libboost_program_options.a -lpthread
|
||||||
|
else
|
||||||
LDLIBS = -lz -lcrypto -lssl -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
|
LDLIBS = -lz -lcrypto -lssl -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_UPNP),yes)
|
ifeq ($(USE_UPNP),yes)
|
||||||
LDFLAGS += -ldl
|
LDFLAGS += -ldl
|
||||||
CXXFLAGS += -DUSE_UPNP
|
CXXFLAGS += -DUSE_UPNP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# OSX Notes
|
|
||||||
# http://www.hutsby.net/2011/08/macs-with-aes-ni.html
|
|
||||||
# Seems like all recent Mac's have AES-NI, after firmware upgrade 2.2
|
|
||||||
# Found no good way to detect it from command line. TODO: Might be some osx sysinfo magic
|
|
||||||
ifeq ($(USE_AESNI),yes)
|
ifeq ($(USE_AESNI),yes)
|
||||||
CXXFLAGS += -maes -DAESNI
|
CXXFLAGS += -maes -DAESNI
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(USE_AVX),yes)
|
||||||
|
CXXFLAGS += -mavx
|
||||||
|
endif
|
||||||
|
|
||||||
# Disabled, since it will be the default make rule. I think its better
|
# Disabled, since it will be the default make rule. I think its better
|
||||||
# to define the default rule in Makefile and not Makefile.<ostype> - torkel
|
# to define the default rule in Makefile and not Makefile.<ostype> - torkel
|
||||||
#install: all
|
#install: all
|
||||||
|
@ -912,7 +912,6 @@ namespace data
|
|||||||
|
|
||||||
uint8_t randomHash[32];
|
uint8_t randomHash[32];
|
||||||
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
|
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
|
||||||
std::set<const RouterInfo *> floodfills;
|
|
||||||
LogPrint (eLogInfo, "NetDb: exploring new ", numDestinations, " routers ...");
|
LogPrint (eLogInfo, "NetDb: exploring new ", numDestinations, " routers ...");
|
||||||
for (int i = 0; i < numDestinations; i++)
|
for (int i = 0; i < numDestinations; i++)
|
||||||
{
|
{
|
||||||
@ -924,9 +923,8 @@ namespace data
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto floodfill = GetClosestFloodfill (randomHash, dest->GetExcludedPeers ());
|
auto floodfill = GetClosestFloodfill (randomHash, dest->GetExcludedPeers ());
|
||||||
if (floodfill && !floodfills.count (floodfill.get ())) // request floodfill only once
|
if (floodfill)
|
||||||
{
|
{
|
||||||
floodfills.insert (floodfill.get ());
|
|
||||||
if (i2p::transport::transports.IsConnected (floodfill->GetIdentHash ()))
|
if (i2p::transport::transports.IsConnected (floodfill->GetIdentHash ()))
|
||||||
throughTunnels = false;
|
throughTunnels = false;
|
||||||
if (throughTunnels)
|
if (throughTunnels)
|
||||||
|
@ -167,19 +167,19 @@ namespace data
|
|||||||
{
|
{
|
||||||
uint8_t supportedTransports = 0;
|
uint8_t supportedTransports = 0;
|
||||||
bool isValidAddress = true;
|
bool isValidAddress = true;
|
||||||
Address address;
|
auto address = std::make_shared<Address>();
|
||||||
s.read ((char *)&address.cost, sizeof (address.cost));
|
s.read ((char *)&address->cost, sizeof (address->cost));
|
||||||
s.read ((char *)&address.date, sizeof (address.date));
|
s.read ((char *)&address->date, sizeof (address->date));
|
||||||
char transportStyle[5];
|
char transportStyle[5];
|
||||||
ReadString (transportStyle, 5, s);
|
ReadString (transportStyle, 5, s);
|
||||||
if (!strcmp (transportStyle, "NTCP"))
|
if (!strcmp (transportStyle, "NTCP"))
|
||||||
address.transportStyle = eTransportNTCP;
|
address->transportStyle = eTransportNTCP;
|
||||||
else if (!strcmp (transportStyle, "SSU"))
|
else if (!strcmp (transportStyle, "SSU"))
|
||||||
address.transportStyle = eTransportSSU;
|
address->transportStyle = eTransportSSU;
|
||||||
else
|
else
|
||||||
address.transportStyle = eTransportUnknown;
|
address->transportStyle = eTransportUnknown;
|
||||||
address.port = 0;
|
address->port = 0;
|
||||||
address.mtu = 0;
|
address->mtu = 0;
|
||||||
uint16_t size, r = 0;
|
uint16_t size, r = 0;
|
||||||
s.read ((char *)&size, sizeof (size)); if (!s) return;
|
s.read ((char *)&size, sizeof (size)); if (!s) return;
|
||||||
size = be16toh (size);
|
size = be16toh (size);
|
||||||
@ -194,35 +194,35 @@ namespace data
|
|||||||
if (!strcmp (key, "host"))
|
if (!strcmp (key, "host"))
|
||||||
{
|
{
|
||||||
boost::system::error_code ecode;
|
boost::system::error_code ecode;
|
||||||
address.host = boost::asio::ip::address::from_string (value, ecode);
|
address->host = boost::asio::ip::address::from_string (value, ecode);
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
if (address.transportStyle == eTransportNTCP)
|
if (address->transportStyle == eTransportNTCP)
|
||||||
{
|
{
|
||||||
supportedTransports |= eNTCPV4; // TODO:
|
supportedTransports |= eNTCPV4; // TODO:
|
||||||
address.addressString = value;
|
address->addressString = value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
supportedTransports |= eSSUV4; // TODO:
|
supportedTransports |= eSSUV4; // TODO:
|
||||||
address.addressString = value;
|
address->addressString = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// add supported protocol
|
// add supported protocol
|
||||||
if (address.host.is_v4 ())
|
if (address->host.is_v4 ())
|
||||||
supportedTransports |= (address.transportStyle == eTransportNTCP) ? eNTCPV4 : eSSUV4;
|
supportedTransports |= (address->transportStyle == eTransportNTCP) ? eNTCPV4 : eSSUV4;
|
||||||
else
|
else
|
||||||
supportedTransports |= (address.transportStyle == eTransportNTCP) ? eNTCPV6 : eSSUV6;
|
supportedTransports |= (address->transportStyle == eTransportNTCP) ? eNTCPV6 : eSSUV6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!strcmp (key, "port"))
|
else if (!strcmp (key, "port"))
|
||||||
address.port = boost::lexical_cast<int>(value);
|
address->port = boost::lexical_cast<int>(value);
|
||||||
else if (!strcmp (key, "mtu"))
|
else if (!strcmp (key, "mtu"))
|
||||||
address.mtu = boost::lexical_cast<int>(value);
|
address->mtu = boost::lexical_cast<int>(value);
|
||||||
else if (!strcmp (key, "key"))
|
else if (!strcmp (key, "key"))
|
||||||
Base64ToByteStream (value, strlen (value), address.key, 32);
|
Base64ToByteStream (value, strlen (value), address->key, 32);
|
||||||
else if (!strcmp (key, "caps"))
|
else if (!strcmp (key, "caps"))
|
||||||
ExtractCaps (value);
|
ExtractCaps (value);
|
||||||
else if (key[0] == 'i')
|
else if (key[0] == 'i')
|
||||||
@ -237,9 +237,9 @@ namespace data
|
|||||||
LogPrint (eLogError, "RouterInfo: Unexpected introducer's index ", index, " skipped");
|
LogPrint (eLogError, "RouterInfo: Unexpected introducer's index ", index, " skipped");
|
||||||
if (s) continue; else return;
|
if (s) continue; else return;
|
||||||
}
|
}
|
||||||
if (index >= address.introducers.size ())
|
if (index >= address->introducers.size ())
|
||||||
address.introducers.resize (index + 1);
|
address->introducers.resize (index + 1);
|
||||||
Introducer& introducer = address.introducers.at (index);
|
Introducer& introducer = address->introducers.at (index);
|
||||||
if (!strcmp (key, "ihost"))
|
if (!strcmp (key, "ihost"))
|
||||||
{
|
{
|
||||||
boost::system::error_code ecode;
|
boost::system::error_code ecode;
|
||||||
@ -256,7 +256,7 @@ namespace data
|
|||||||
}
|
}
|
||||||
if (isValidAddress)
|
if (isValidAddress)
|
||||||
{
|
{
|
||||||
addresses->push_back(std::make_shared<Address>(address));
|
addresses->push_back(address);
|
||||||
m_SupportedTransports |= supportedTransports;
|
m_SupportedTransports |= supportedTransports;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -285,7 +285,7 @@ namespace stream
|
|||||||
auto s = shared_from_this();
|
auto s = shared_from_this();
|
||||||
m_Service.post ([=](void)
|
m_Service.post ([=](void)
|
||||||
{
|
{
|
||||||
if (!m_ReceiveQueue.empty () || m_Status == eStreamStatusReset || m_Status == eStreamStatusClosed)
|
if (!m_ReceiveQueue.empty () || m_Status == eStreamStatusReset)
|
||||||
s->HandleReceiveTimer (boost::asio::error::make_error_code (boost::asio::error::operation_aborted), buffer, handler, 0);
|
s->HandleReceiveTimer (boost::asio::error::make_error_code (boost::asio::error::operation_aborted), buffer, handler, 0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -306,7 +306,7 @@ namespace stream
|
|||||||
else if (ecode == boost::asio::error::operation_aborted)
|
else if (ecode == boost::asio::error::operation_aborted)
|
||||||
{
|
{
|
||||||
// timeout not expired
|
// timeout not expired
|
||||||
if (m_Status == eStreamStatusReset || m_Status == eStreamStatusClosed)
|
if (m_Status == eStreamStatusReset)
|
||||||
handler (boost::asio::error::make_error_code (boost::asio::error::connection_reset), 0);
|
handler (boost::asio::error::make_error_code (boost::asio::error::connection_reset), 0);
|
||||||
else
|
else
|
||||||
handler (boost::asio::error::make_error_code (boost::asio::error::operation_aborted), 0);
|
handler (boost::asio::error::make_error_code (boost::asio::error::operation_aborted), 0);
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
#define I2P_VERSION_MAJOR 0
|
#define I2P_VERSION_MAJOR 0
|
||||||
#define I2P_VERSION_MINOR 9
|
#define I2P_VERSION_MINOR 9
|
||||||
#define I2P_VERSION_MICRO 27
|
#define I2P_VERSION_MICRO 28
|
||||||
#define I2P_VERSION_PATCH 0
|
#define I2P_VERSION_PATCH 0
|
||||||
#define I2P_VERSION MAKE_VERSION(I2P_VERSION_MAJOR, I2P_VERSION_MINOR, I2P_VERSION_MICRO)
|
#define I2P_VERSION MAKE_VERSION(I2P_VERSION_MAJOR, I2P_VERSION_MINOR, I2P_VERSION_MICRO)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user