mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 16:10:33 +03:00
Merge remote-tracking branch 'purple/openssl'
This commit is contained in:
commit
eda13f9023
69
BloomFilter.cpp
Normal file
69
BloomFilter.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "BloomFilter.h"
|
||||||
|
#include "I2PEndian.h"
|
||||||
|
#include <array>
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
|
||||||
|
namespace i2p
|
||||||
|
{
|
||||||
|
namespace util
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @brief decaying bloom filter implementation */
|
||||||
|
class DecayingBloomFilter : public IBloomFilter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DecayingBloomFilter(const std::size_t size)
|
||||||
|
{
|
||||||
|
m_Size = size;
|
||||||
|
m_Data = new uint8_t[size];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief implements IBloomFilter::~IBloomFilter */
|
||||||
|
~DecayingBloomFilter()
|
||||||
|
{
|
||||||
|
delete [] m_Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief implements IBloomFilter::Add */
|
||||||
|
bool Add(const uint8_t * data, std::size_t len)
|
||||||
|
{
|
||||||
|
std::size_t idx;
|
||||||
|
uint8_t mask;
|
||||||
|
Get(data, len, idx, mask);
|
||||||
|
if(m_Data[idx] & mask) return false; // filter hit
|
||||||
|
m_Data[idx] |= mask;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief implements IBloomFilter::Decay */
|
||||||
|
void Decay()
|
||||||
|
{
|
||||||
|
// reset bloom filter buffer
|
||||||
|
memset(m_Data, 0, m_Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** @brief get bit index for for data */
|
||||||
|
void Get(const uint8_t * data, std::size_t len, std::size_t & idx, uint8_t & bm)
|
||||||
|
{
|
||||||
|
bm = 1;
|
||||||
|
uint8_t digest[32];
|
||||||
|
// TODO: use blake2 because it's faster
|
||||||
|
SHA256(data, len, digest);
|
||||||
|
uint64_t i = buf64toh(digest);
|
||||||
|
idx = i % m_Size;
|
||||||
|
bm <<= (i % 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t * m_Data;
|
||||||
|
std::size_t m_Size;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
BloomFilterPtr BloomFilter(std::size_t capacity)
|
||||||
|
{
|
||||||
|
return std::make_shared<DecayingBloomFilter>(capacity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
31
BloomFilter.h
Normal file
31
BloomFilter.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef BLOOM_FILTER_H_
|
||||||
|
#define BLOOM_FILTER_H_
|
||||||
|
#include <memory>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace i2p
|
||||||
|
{
|
||||||
|
namespace util
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @brief interface for bloom filter */
|
||||||
|
struct IBloomFilter
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @brief destructor */
|
||||||
|
virtual ~IBloomFilter();
|
||||||
|
/** @brief add entry to bloom filter, return false if filter hit otherwise return true */
|
||||||
|
virtual bool Add(const uint8_t * data, std::size_t len) = 0;
|
||||||
|
/** @brief optionally decay old entries */
|
||||||
|
virtual void Decay();
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::shared_ptr<IBloomFilter> BloomFilterPtr;
|
||||||
|
|
||||||
|
/** @brief create bloom filter */
|
||||||
|
BloomFilterPtr BloomFilter(std::size_t capacity = 1024 * 8);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -709,11 +709,15 @@ namespace http {
|
|||||||
char b64_creds[64];
|
char b64_creds[64];
|
||||||
std::size_t len = 0;
|
std::size_t len = 0;
|
||||||
len = i2p::data::ByteStreamToBase64((unsigned char *)expected.c_str(), expected.length(), b64_creds, sizeof(b64_creds));
|
len = i2p::data::ByteStreamToBase64((unsigned char *)expected.c_str(), expected.length(), b64_creds, sizeof(b64_creds));
|
||||||
b64_creds[len] = '\0';
|
/* if we decoded properly then check credentials */
|
||||||
expected = "Basic ";
|
if(len) {
|
||||||
expected += b64_creds;
|
b64_creds[len] = '\0';
|
||||||
if (provided == expected)
|
expected = "Basic ";
|
||||||
return true;
|
expected += b64_creds;
|
||||||
|
return expected == provided;
|
||||||
|
}
|
||||||
|
/** we decoded wrong so it's not a correct login credential */
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogPrint(eLogWarning, "HTTPServer: auth failure from ", m_Socket->remote_endpoint().address ());
|
LogPrint(eLogWarning, "HTTPServer: auth failure from ", m_Socket->remote_endpoint().address ());
|
||||||
|
14
Identity.cpp
14
Identity.cpp
@ -593,11 +593,25 @@ namespace data
|
|||||||
XORMetric operator^(const IdentHash& key1, const IdentHash& key2)
|
XORMetric operator^(const IdentHash& key1, const IdentHash& key2)
|
||||||
{
|
{
|
||||||
XORMetric m;
|
XORMetric m;
|
||||||
|
#if defined(__AVX__) // for AVX
|
||||||
|
__asm__
|
||||||
|
(
|
||||||
|
"vmovups %1, %%ymm0 \n"
|
||||||
|
"vmovups %2, %%ymm1 \n"
|
||||||
|
"vxorps %%ymm0, %%ymm1, %%ymm1 \n"
|
||||||
|
"vmovups %%ymm1, %0 \n"
|
||||||
|
: "=m"(*m.metric)
|
||||||
|
: "m"(*key1), "m"(*key2)
|
||||||
|
: "memory", "%xmm0", "%xmm1" // should be replaced by %ymm0/1 once supported by compiler
|
||||||
|
);
|
||||||
|
#else
|
||||||
const uint64_t * hash1 = key1.GetLL (), * hash2 = key2.GetLL ();
|
const uint64_t * hash1 = key1.GetLL (), * hash2 = key2.GetLL ();
|
||||||
m.metric_ll[0] = hash1[0] ^ hash2[0];
|
m.metric_ll[0] = hash1[0] ^ hash2[0];
|
||||||
m.metric_ll[1] = hash1[1] ^ hash2[1];
|
m.metric_ll[1] = hash1[1] ^ hash2[1];
|
||||||
m.metric_ll[2] = hash1[2] ^ hash2[2];
|
m.metric_ll[2] = hash1[2] ^ hash2[2];
|
||||||
m.metric_ll[3] = hash1[3] ^ hash2[3];
|
m.metric_ll[3] = hash1[3] ^ hash2[3];
|
||||||
|
#endif
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,12 @@ ifeq ($(USE_AESNI),yes)
|
|||||||
ifeq ($(IS_64),1)
|
ifeq ($(IS_64),1)
|
||||||
#check if AES-NI is supported by CPU
|
#check if AES-NI is supported by CPU
|
||||||
ifneq ($(shell $(GREP) -c aes /proc/cpuinfo),0)
|
ifneq ($(shell $(GREP) -c aes /proc/cpuinfo),0)
|
||||||
CPU_FLAGS = -maes -DAESNI
|
CPU_FLAGS += -maes -DAESNI
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
#check if AVX supported by CPU
|
||||||
|
ifneq ($(shell $(GREP) -c avx /proc/cpuinfo),0)
|
||||||
|
CPU_FLAGS += -mavx
|
||||||
|
endif
|
||||||
|
@ -59,6 +59,7 @@ LOCAL_SRC_FILES := DaemonAndroid.cpp i2pd_android.cpp \
|
|||||||
../../TunnelPool.cpp \
|
../../TunnelPool.cpp \
|
||||||
../../Timestamp.cpp \
|
../../Timestamp.cpp \
|
||||||
../../Event.cpp \
|
../../Event.cpp \
|
||||||
|
../../BloomFiler.cpp \
|
||||||
../../util.cpp \
|
../../util.cpp \
|
||||||
../../i2pd.cpp ../../UPnP.cpp
|
../../i2pd.cpp ../../UPnP.cpp
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules" )
|
|||||||
set ( CMAKE_SOURCE_DIR ".." )
|
set ( CMAKE_SOURCE_DIR ".." )
|
||||||
|
|
||||||
set (LIBI2PD_SRC
|
set (LIBI2PD_SRC
|
||||||
|
"${CMAKE_SOURCE_DIR}/BloomFilter.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/Config.cpp"
|
"${CMAKE_SOURCE_DIR}/Config.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/Crypto.cpp"
|
"${CMAKE_SOURCE_DIR}/Crypto.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/Garlic.cpp"
|
"${CMAKE_SOURCE_DIR}/Garlic.cpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
LIB_SRC = \
|
LIB_SRC = \
|
||||||
Gzip.cpp Crypto.cpp Datagram.cpp Garlic.cpp I2NPProtocol.cpp LeaseSet.cpp \
|
BloomFilter.cpp Gzip.cpp Crypto.cpp Datagram.cpp Garlic.cpp I2NPProtocol.cpp LeaseSet.cpp \
|
||||||
Log.cpp NTCPSession.cpp NetDb.cpp NetDbRequests.cpp Profiling.cpp \
|
Log.cpp NTCPSession.cpp NetDb.cpp NetDbRequests.cpp Profiling.cpp \
|
||||||
Reseed.cpp RouterContext.cpp RouterInfo.cpp Signature.cpp SSU.cpp \
|
Reseed.cpp RouterContext.cpp RouterInfo.cpp Signature.cpp SSU.cpp \
|
||||||
SSUSession.cpp SSUData.cpp Streaming.cpp Identity.cpp TransitTunnel.cpp \
|
SSUSession.cpp SSUData.cpp Streaming.cpp Identity.cpp TransitTunnel.cpp \
|
||||||
|
@ -36,7 +36,7 @@ SOURCES += DaemonQT.cpp mainwindow.cpp \
|
|||||||
../../SSUData.cpp ../../SSUSession.cpp ../../Streaming.cpp ../../TransitTunnel.cpp \
|
../../SSUData.cpp ../../SSUSession.cpp ../../Streaming.cpp ../../TransitTunnel.cpp \
|
||||||
../../Transports.cpp ../../Tunnel.cpp ../../TunnelEndpoint.cpp ../../TunnelGateway.cpp \
|
../../Transports.cpp ../../Tunnel.cpp ../../TunnelEndpoint.cpp ../../TunnelGateway.cpp \
|
||||||
../../TunnelPool.cpp ../../UPnP.cpp ../../Gzip.cpp ../../Timestamp.cpp ../../util.cpp \
|
../../TunnelPool.cpp ../../UPnP.cpp ../../Gzip.cpp ../../Timestamp.cpp ../../util.cpp \
|
||||||
../../Event.cpp ../../i2pd.cpp
|
../../Event.cpp ../../BloomFiler.cpp ../../i2pd.cpp
|
||||||
|
|
||||||
HEADERS += DaemonQT.h mainwindow.h \
|
HEADERS += DaemonQT.h mainwindow.h \
|
||||||
../../HTTPServer.h ../../I2PControl.h ../../UPnP.h ../../Daemon.h ../../Config.h \
|
../../HTTPServer.h ../../I2PControl.h ../../UPnP.h ../../Daemon.h ../../Config.h \
|
||||||
@ -50,7 +50,8 @@ HEADERS += DaemonQT.h mainwindow.h \
|
|||||||
../../Streaming.h ../../Timestamp.h ../../TransitTunnel.h ../../Transports.h \
|
../../Streaming.h ../../Timestamp.h ../../TransitTunnel.h ../../Transports.h \
|
||||||
../../TransportSession.h ../../Tunnel.h ../../TunnelBase.h ../../TunnelConfig.h \
|
../../TransportSession.h ../../Tunnel.h ../../TunnelBase.h ../../TunnelConfig.h \
|
||||||
../../TunnelEndpoint.h ../../TunnelGateway.h ../../TunnelPool.h ../../UPnP.h \
|
../../TunnelEndpoint.h ../../TunnelGateway.h ../../TunnelPool.h ../../UPnP.h \
|
||||||
../../util.h ../../version.h ../../Gzip.h ../../Tag.h ../../Event.h
|
../../util.h ../../version.h ../../Gzip.h ../../Tag.h \
|
||||||
|
../../BloomFiler.h ../../Event.h
|
||||||
|
|
||||||
FORMS += mainwindow.ui
|
FORMS += mainwindow.ui
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user