Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
29bd5e55c4
@ -3,9 +3,9 @@
|
|||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "src/log/LogUtils.h"
|
#include "./log/LogUtils.h"
|
||||||
#include <src/misc/sassert.h>
|
#include "./misc/sassert.h"
|
||||||
#include "EventLoop.h"
|
#include "./EventLoop.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace ts::event;
|
using namespace ts::event;
|
||||||
@ -65,7 +65,7 @@ void EventExecutor::shutdown() {
|
|||||||
this->_shutdown(lock);
|
this->_shutdown(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EventExecutor::schedule(const std::shared_ptr<event::EventEntry> &entry) {
|
bool EventExecutor::schedule(const std::shared_ptr<ts::event::EventEntry> &entry) {
|
||||||
unique_lock lock(this->lock);
|
unique_lock lock(this->lock);
|
||||||
if(!entry || entry->_event_ptr)
|
if(!entry || entry->_event_ptr)
|
||||||
return true; /* already scheduled */
|
return true; /* already scheduled */
|
||||||
@ -89,7 +89,7 @@ bool EventExecutor::schedule(const std::shared_ptr<event::EventEntry> &entry) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EventExecutor::cancel(const std::shared_ptr<event::EventEntry> &entry) {
|
bool EventExecutor::cancel(const std::shared_ptr<ts::event::EventEntry> &entry) {
|
||||||
unique_lock lock(this->lock);
|
unique_lock lock(this->lock);
|
||||||
if(!entry || !entry->_event_ptr)
|
if(!entry || !entry->_event_ptr)
|
||||||
return false;
|
return false;
|
||||||
@ -158,7 +158,7 @@ void EventExecutor::_reassign_thread_names(std::unique_lock<std::mutex> &lock) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void EventExecutor::_executor(event::EventExecutor *loop) {
|
void EventExecutor::_executor(ts::event::EventExecutor *loop) {
|
||||||
while(true) {
|
while(true) {
|
||||||
unique_lock lock(loop->lock);
|
unique_lock lock(loop->lock);
|
||||||
loop->condition.wait(lock, [&] {
|
loop->condition.wait(lock, [&] {
|
||||||
@ -204,11 +204,16 @@ void EventExecutor::_executor(event::EventExecutor *loop) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto event_handler = linked_entry->entry.lock();
|
auto event_handler = linked_entry->entry.lock();
|
||||||
|
if(!event_handler) {
|
||||||
|
/* event handler passed away while waiting for beeing executed */
|
||||||
|
delete linked_entry;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
sassert(event_handler->_event_ptr == linked_entry);
|
sassert(event_handler->_event_ptr == linked_entry);
|
||||||
event_handler->_event_ptr = nullptr;
|
event_handler->_event_ptr = nullptr;
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
if(event_handler)
|
|
||||||
event_handler->event_execute(linked_entry->scheduled);
|
event_handler->event_execute(linked_entry->scheduled);
|
||||||
delete linked_entry;
|
delete linked_entry;
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ namespace ts {
|
|||||||
if(!_instance)
|
if(!_instance)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((void(*)(class_t*, const std::chrono::system_clock::time_point &)) this->callback)(&*_instance, point);
|
((void(*)(class_t*, const std::chrono::system_clock::time_point &)) (void*) this->callback)(&*_instance, point);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ namespace std {
|
|||||||
count--;
|
count--;
|
||||||
} else {
|
} else {
|
||||||
// normal unlocking
|
// normal unlocking
|
||||||
owner = std::thread::id();
|
owner = this_id;
|
||||||
count = 0;
|
count = 0;
|
||||||
handle.unlock();
|
handle.unlock();
|
||||||
}
|
}
|
||||||
|
@ -6,20 +6,22 @@
|
|||||||
class spin_lock {
|
class spin_lock {
|
||||||
std::atomic_flag locked = ATOMIC_FLAG_INIT;
|
std::atomic_flag locked = ATOMIC_FLAG_INIT;
|
||||||
public:
|
public:
|
||||||
void lock() {
|
inline void lock() {
|
||||||
uint8_t round = 0;
|
uint8_t round = 0;
|
||||||
while (locked.test_and_set(std::memory_order_acquire)) {
|
while (locked.test_and_set(std::memory_order_acquire)) {
|
||||||
|
while(locked._M_i) { /* waiting 'till its zero so we can try an exchanged again; Atomic exchanges have a huge bug overhead to deal with! */
|
||||||
//Yield when we're using this lock for a longer time, which we usually not doing
|
//Yield when we're using this lock for a longer time, which we usually not doing
|
||||||
if(round++ % 8 == 0)
|
if(round++ % 8 == 0)
|
||||||
std::this_thread::yield();
|
std::this_thread::yield();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline bool try_lock() {
|
inline bool try_lock() {
|
||||||
return !locked.test_and_set(std::memory_order_acquire);
|
return !locked.test_and_set(std::memory_order_acquire);
|
||||||
}
|
}
|
||||||
|
|
||||||
void unlock() {
|
inline void unlock() {
|
||||||
locked.clear(std::memory_order_release);
|
locked.clear(std::memory_order_release);
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -1,5 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TIMING_DISABLED
|
||||||
|
#define TIMING_REPORT(expression) \
|
||||||
|
expression
|
||||||
|
|
||||||
#define TIMING_START(_name) \
|
#define TIMING_START(_name) \
|
||||||
struct { \
|
struct { \
|
||||||
struct entry { \
|
struct entry { \
|
||||||
@ -17,20 +22,30 @@ _name ##_timings.begin = std::chrono::system_clock::now(); \
|
|||||||
#define TIMING_STEP(name, step) \
|
#define TIMING_STEP(name, step) \
|
||||||
name ##_timings.timings.push_back({step, std::chrono::system_clock::now()});
|
name ##_timings.timings.push_back({step, std::chrono::system_clock::now()});
|
||||||
|
|
||||||
#define TIMING_FINISH(_name) \
|
#define TIMING_FINISH_U(_name, unit, unit_name) \
|
||||||
([&](){ \
|
([&](){ \
|
||||||
_name ##_timings.end = std::chrono::system_clock::now(); \
|
_name ##_timings.end = std::chrono::system_clock::now(); \
|
||||||
std::string result; \
|
std::string result; \
|
||||||
result = "timings for " + _name ##_timings.name + ": "; \
|
result = "timings for " + _name ##_timings.name + ": "; \
|
||||||
result += std::to_string(std::chrono::duration_cast<std::chrono::milliseconds>(_name ##_timings.end - _name ##_timings.begin).count()) + "ms"; \
|
result += std::to_string(std::chrono::duration_cast<std::chrono::unit>(_name ##_timings.end - _name ##_timings.begin).count()) + unit_name; \
|
||||||
\
|
\
|
||||||
auto tp = _name ##_timings.begin; \
|
auto tp = _name ##_timings.begin; \
|
||||||
for(const auto& entry : _name ##_timings.timings) { \
|
for(const auto& entry : _name ##_timings.timings) { \
|
||||||
result += "\n "; \
|
result += "\n "; \
|
||||||
result += "- " + entry.name + ": "; \
|
result += "- " + entry.name + ": "; \
|
||||||
result += "@" + std::to_string(std::chrono::duration_cast<std::chrono::milliseconds>(entry.ts - _name ##_timings.begin).count()) + "ms"; \
|
result += "@" + std::to_string(std::chrono::duration_cast<std::chrono::unit>(entry.ts - _name ##_timings.begin).count()) + unit_name; \
|
||||||
result += ": " + std::to_string(std::chrono::duration_cast<std::chrono::milliseconds>(entry.ts - tp).count()) + "ms"; \
|
result += ": " + std::to_string(std::chrono::duration_cast<std::chrono::unit>(entry.ts - tp).count()) + unit_name; \
|
||||||
tp = entry.ts; \
|
tp = entry.ts; \
|
||||||
} \
|
} \
|
||||||
return result; \
|
return result; \
|
||||||
})()
|
})()
|
||||||
|
|
||||||
|
#define TIMING_FINISH(_name) TIMING_FINISH_U(_name, milliseconds, "ms")
|
||||||
|
#else
|
||||||
|
#define TIMING_REPORT(expression)
|
||||||
|
#define TIMING_START(_name)
|
||||||
|
#define TIMING_STEP(name, step)
|
||||||
|
#define TIMING_FINISH_U(_name, unit, unit_name)
|
||||||
|
#define TIMING_FINISH(_name)
|
||||||
|
#endif
|
||||||
|
/* FIX the "backslash-newline at end of file" warning */
|
||||||
|
@ -70,7 +70,7 @@ bool CompressionHandler::progressPacketIn(protocol::BasicPacket* packet, std::st
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CompressionHandler::progressPacketOut(protocol::BasicPacket* packet, std::string& error) {
|
bool CompressionHandler::progressPacketOut(protocol::BasicPacket* packet, std::string& error) {
|
||||||
if(packet->hasFlag(protocol::PacketFlag::Compressed) && !packet->isCompressed()) {
|
if(packet->has_flag(protocol::PacketFlag::Compressed) && !packet->isCompressed()) {
|
||||||
if(!this->compress(packet, error)) return false;
|
if(!this->compress(packet, error)) return false;
|
||||||
packet->setCompressed(true);
|
packet->setCompressed(true);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#define NO_OPEN_SSL /* because we're lazy and dont want to build this lib extra for the TeaClient */
|
//#define NO_OPEN_SSL /* because we're lazy and dont want to build this lib extra for the TeaClient */
|
||||||
#define FIXEDINT_H_INCLUDED /* else it will be included by ge */
|
#define FIXEDINT_H_INCLUDED /* else it will be included by ge */
|
||||||
|
|
||||||
#include "misc/endianness.h"
|
#include "misc/endianness.h"
|
||||||
@ -8,6 +8,7 @@
|
|||||||
#include "misc/memtracker.h"
|
#include "misc/memtracker.h"
|
||||||
#include "misc/digest.h"
|
#include "misc/digest.h"
|
||||||
#include "CryptionHandler.h"
|
#include "CryptionHandler.h"
|
||||||
|
#include "../misc/sassert.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace ts;
|
using namespace ts;
|
||||||
@ -27,7 +28,7 @@ void CryptionHandler::reset() {
|
|||||||
this->useDefaultChipherKeyNonce = true;
|
this->useDefaultChipherKeyNonce = true;
|
||||||
this->iv_struct_length = 0;
|
this->iv_struct_length = 0;
|
||||||
memset(this->iv_struct, 0, sizeof(this->iv_struct));
|
memset(this->iv_struct, 0, sizeof(this->iv_struct));
|
||||||
memcpy(this->current_mac, this->default_mac, sizeof(this->default_mac));
|
memcpy(this->current_mac, CryptionHandler::default_mac, sizeof(CryptionHandler::default_mac));
|
||||||
|
|
||||||
for(auto& cache : this->cache_key_client)
|
for(auto& cache : this->cache_key_client)
|
||||||
cache.generation = 0xFFEF;
|
cache.generation = 0xFFEF;
|
||||||
@ -35,21 +36,21 @@ void CryptionHandler::reset() {
|
|||||||
cache.generation = 0xFFEF;
|
cache.generation = 0xFFEF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SHARED_KEY_BUFFER_LENGTH (256)
|
||||||
bool CryptionHandler::setupSharedSecret(const std::string& alpha, const std::string& beta, ecc_key *publicKey, ecc_key *ownKey, std::string &error) {
|
bool CryptionHandler::setupSharedSecret(const std::string& alpha, const std::string& beta, ecc_key *publicKey, ecc_key *ownKey, std::string &error) {
|
||||||
size_t bufferLength = 128;
|
size_t buffer_length = SHARED_KEY_BUFFER_LENGTH;
|
||||||
uint8_t* buffer = new uint8_t[bufferLength];
|
uint8_t buffer[SHARED_KEY_BUFFER_LENGTH];
|
||||||
int err;
|
int err;
|
||||||
if((err = ecc_shared_secret(ownKey, publicKey, buffer, (unsigned long*) &bufferLength)) != CRYPT_OK){
|
if((err = ecc_shared_secret(ownKey, publicKey, buffer, (unsigned long*) &buffer_length)) != CRYPT_OK){
|
||||||
delete[] buffer;
|
|
||||||
error = "Could not calculate shared secret. Message: " + string(error_to_string(err));
|
error = "Could not calculate shared secret. Message: " + string(error_to_string(err));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto result = this->setupSharedSecret(alpha, beta, string((const char*) buffer, bufferLength), error);
|
|
||||||
delete[] buffer;
|
auto result = this->setupSharedSecret(alpha, beta, string((const char*) buffer, buffer_length), error);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CryptionHandler::setupSharedSecret(const std::string& alpha, const std::string& beta, std::string sharedKey, std::string &error) {
|
bool CryptionHandler::setupSharedSecret(const std::string& alpha, const std::string& beta, const std::string& sharedKey, std::string &error) {
|
||||||
auto secret_hash = digest::sha1(sharedKey);
|
auto secret_hash = digest::sha1(sharedKey);
|
||||||
|
|
||||||
char ivStruct[SHA_DIGEST_LENGTH];
|
char ivStruct[SHA_DIGEST_LENGTH];
|
||||||
@ -108,7 +109,7 @@ void _fe_neg(fe h, const fe f) {
|
|||||||
h[9] = h9;
|
h[9] = h9;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string keyMul(const uint8_t* publicKey /* compressed */, const uint8_t* privateKey /* uncompressed */, bool negate){
|
inline void keyMul(uint8_t(& target_buffer)[32], const uint8_t* publicKey /* compressed */, const uint8_t* privateKey /* uncompressed */, bool negate){
|
||||||
ge_p3 keyA{};
|
ge_p3 keyA{};
|
||||||
ge_p2 result{};
|
ge_p2 result{};
|
||||||
|
|
||||||
@ -119,30 +120,27 @@ inline std::string keyMul(const uint8_t* publicKey /* compressed */, const uint8
|
|||||||
}
|
}
|
||||||
ge_scalarmult_vartime(&result, privateKey, &keyA);
|
ge_scalarmult_vartime(&result, privateKey, &keyA);
|
||||||
|
|
||||||
char buffer[32];
|
ge_tobytes(target_buffer, &result);
|
||||||
ge_tobytes((uint8_t*) buffer, &result);
|
|
||||||
return string(buffer, 32);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CryptionHandler::setupSharedSecretNew(const std::string &alpha, const std::string &beta, const char* privateKey /* uncompressed */, const char* publicKey /* compressed */) {
|
bool CryptionHandler::setupSharedSecretNew(const std::string &alpha, const std::string &beta, const char* privateKey /* uncompressed */, const char* publicKey /* compressed */) {
|
||||||
assert(alpha.length() == 10);
|
if(alpha.length() != 10 || beta.length() != 54)
|
||||||
assert(beta.length() == 54);
|
return false;
|
||||||
|
|
||||||
string shared;
|
uint8_t shared[32];
|
||||||
string sharedIv;
|
uint8_t shared_iv[64];
|
||||||
shared.resize(32, '\0');
|
|
||||||
sharedIv.resize(64, '\0');
|
ed25519_key_exchange(shared, (uint8_t*) publicKey, (uint8_t*) privateKey);
|
||||||
ed25519_key_exchange((uint8_t*) shared.data(), (uint8_t*) publicKey, (uint8_t*) privateKey);
|
keyMul(shared, reinterpret_cast<const uint8_t *>(publicKey), reinterpret_cast<const uint8_t *>(privateKey), true); //Remote key get negated
|
||||||
shared = keyMul(reinterpret_cast<const uint8_t *>(publicKey), reinterpret_cast<const uint8_t *>(privateKey), true); //Remote key get negated
|
digest::sha512((char*) shared, 32, shared_iv);
|
||||||
sharedIv = digest::sha512(shared);
|
|
||||||
|
|
||||||
auto xor_key = alpha + beta;
|
auto xor_key = alpha + beta;
|
||||||
for(int i = 0; i < 64; i++)
|
for(int i = 0; i < 64; i++)
|
||||||
sharedIv[i] ^= xor_key[i];
|
shared_iv[i] ^= xor_key[i];
|
||||||
|
|
||||||
{
|
{
|
||||||
lock_guard lock(this->cache_key_lock);
|
lock_guard lock(this->cache_key_lock);
|
||||||
memcpy(this->iv_struct, sharedIv.data(), 64);
|
memcpy(this->iv_struct, shared_iv, 64);
|
||||||
this->iv_struct_length = 64;
|
this->iv_struct_length = 64;
|
||||||
|
|
||||||
auto digest_buffer = digest::sha1((char*) this->iv_struct, 64);
|
auto digest_buffer = digest::sha1((char*) this->iv_struct, 64);
|
||||||
@ -165,6 +163,7 @@ bool CryptionHandler::generate_key_nonce(protocol::BasicPacket* packet, bool use
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define GENERATE_BUFFER_LENGTH (128)
|
||||||
bool CryptionHandler::generate_key_nonce(
|
bool CryptionHandler::generate_key_nonce(
|
||||||
bool to_server, /* its from the client to the server */
|
bool to_server, /* its from the client to the server */
|
||||||
protocol::PacketType type,
|
protocol::PacketType type,
|
||||||
@ -189,8 +188,10 @@ bool CryptionHandler::generate_key_nonce(
|
|||||||
auto& key_cache = key_cache_array[type];
|
auto& key_cache = key_cache_array[type];
|
||||||
if(key_cache.generation != generation) {
|
if(key_cache.generation != generation) {
|
||||||
const size_t buffer_length = 6 + this->iv_struct_length;
|
const size_t buffer_length = 6 + this->iv_struct_length;
|
||||||
char* buffer = new char[buffer_length];
|
sassert(buffer_length < GENERATE_BUFFER_LENGTH);
|
||||||
memset(buffer, 0, 6 + this->iv_struct_length);
|
|
||||||
|
char buffer[GENERATE_BUFFER_LENGTH];
|
||||||
|
memset(buffer, 0, buffer_length);
|
||||||
|
|
||||||
if (to_server) {
|
if (to_server) {
|
||||||
buffer[0] = 0x31;
|
buffer[0] = 0x31;
|
||||||
@ -201,13 +202,11 @@ bool CryptionHandler::generate_key_nonce(
|
|||||||
|
|
||||||
le2be32(generation, buffer, 2);
|
le2be32(generation, buffer, 2);
|
||||||
memcpy(&buffer[6], this->iv_struct, this->iv_struct_length);
|
memcpy(&buffer[6], this->iv_struct, this->iv_struct_length);
|
||||||
auto key_nonce = digest::sha256(buffer, 6 + this->iv_struct_length);
|
auto key_nonce = digest::sha256(buffer, buffer_length);
|
||||||
|
|
||||||
memcpy(key_cache.key, key_nonce.data(), 16);
|
memcpy(key_cache.key, key_nonce.data(), 16);
|
||||||
memcpy(key_cache.nonce, key_nonce.data() + 16, 16);
|
memcpy(key_cache.nonce, key_nonce.data() + 16, 16);
|
||||||
key_cache.generation = generation;
|
key_cache.generation = generation;
|
||||||
|
|
||||||
delete[] buffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(key, key_cache.key, 16);
|
memcpy(key, key_cache.key, 16);
|
||||||
@ -234,9 +233,10 @@ bool CryptionHandler::verify_encryption(const pipes::buffer_view &packet, uint16
|
|||||||
|
|
||||||
auto length = data.length();
|
auto length = data.length();
|
||||||
|
|
||||||
const unsigned long target_length = 2048;
|
/* static shareable void buffer */
|
||||||
uint8_t target_buffer[2048];
|
const static unsigned long void_target_length = 2048;
|
||||||
if(target_length < length)
|
static uint8_t void_target_buffer[2048];
|
||||||
|
if(void_target_length < length)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
err = eax_decrypt_verify_memory(find_cipher("rijndael"),
|
err = eax_decrypt_verify_memory(find_cipher("rijndael"),
|
||||||
@ -248,7 +248,7 @@ bool CryptionHandler::verify_encryption(const pipes::buffer_view &packet, uint16
|
|||||||
(unsigned long) header.length(), /* header length */
|
(unsigned long) header.length(), /* header length */
|
||||||
(const unsigned char *) data.data_ptr(),
|
(const unsigned char *) data.data_ptr(),
|
||||||
(unsigned long) data.length(),
|
(unsigned long) data.length(),
|
||||||
(unsigned char *) target_buffer,
|
(unsigned char *) void_target_buffer,
|
||||||
(unsigned char *) mac.data_ptr(),
|
(unsigned char *) mac.data_ptr(),
|
||||||
(unsigned long) mac.length(),
|
(unsigned long) mac.length(),
|
||||||
&success
|
&success
|
||||||
@ -270,14 +270,6 @@ bool CryptionHandler::decryptPacket(protocol::BasicPacket *packet, std::string &
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t target_length = 2048;
|
|
||||||
uint8_t target_buffer[2048];
|
|
||||||
auto length = data.length();
|
|
||||||
if(target_length < length) {
|
|
||||||
error = "buffer too large";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = eax_decrypt_verify_memory(find_cipher("rijndael"),
|
err = eax_decrypt_verify_memory(find_cipher("rijndael"),
|
||||||
(uint8_t *) key, /* the key */
|
(uint8_t *) key, /* the key */
|
||||||
(unsigned long) 16, /* key is 16 bytes */
|
(unsigned long) 16, /* key is 16 bytes */
|
||||||
@ -287,7 +279,7 @@ bool CryptionHandler::decryptPacket(protocol::BasicPacket *packet, std::string &
|
|||||||
(unsigned long) header.length(), /* header length */
|
(unsigned long) header.length(), /* header length */
|
||||||
(const unsigned char *) data.data_ptr(),
|
(const unsigned char *) data.data_ptr(),
|
||||||
(unsigned long) data.length(),
|
(unsigned long) data.length(),
|
||||||
(unsigned char *) target_buffer,
|
(unsigned char *) data.data_ptr(),
|
||||||
(unsigned char *) packet->mac().data_ptr(),
|
(unsigned char *) packet->mac().data_ptr(),
|
||||||
(unsigned long) packet->mac().length(),
|
(unsigned long) packet->mac().length(),
|
||||||
&success
|
&success
|
||||||
@ -302,7 +294,6 @@ bool CryptionHandler::decryptPacket(protocol::BasicPacket *packet, std::string &
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
packet->data(pipes::buffer_view{target_buffer, length});
|
|
||||||
packet->setEncrypted(false);
|
packet->setEncrypted(false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -314,18 +305,9 @@ bool CryptionHandler::encryptPacket(protocol::BasicPacket *packet, std::string &
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t length = packet->data().length();
|
|
||||||
|
|
||||||
size_t tag_length = 8;
|
size_t tag_length = 8;
|
||||||
char tag_buffer[8];
|
char tag_buffer[8];
|
||||||
|
|
||||||
size_t target_length = 2048;
|
|
||||||
uint8_t target_buffer[2048];
|
|
||||||
if(target_length < length) {
|
|
||||||
error = "buffer too large";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int err;
|
int err;
|
||||||
if((err = eax_encrypt_authenticate_memory(find_cipher("rijndael"),
|
if((err = eax_encrypt_authenticate_memory(find_cipher("rijndael"),
|
||||||
(uint8_t *) key, /* the key */
|
(uint8_t *) key, /* the key */
|
||||||
@ -336,7 +318,7 @@ bool CryptionHandler::encryptPacket(protocol::BasicPacket *packet, std::string &
|
|||||||
(unsigned long) packet->header().length(), /* header length */
|
(unsigned long) packet->header().length(), /* header length */
|
||||||
(uint8_t *) packet->data().data_ptr(), /* The plain text */
|
(uint8_t *) packet->data().data_ptr(), /* The plain text */
|
||||||
(unsigned long) packet->data().length(), /* Plain text length */
|
(unsigned long) packet->data().length(), /* Plain text length */
|
||||||
(uint8_t *) target_buffer, /* The result buffer */
|
(uint8_t *) packet->data().data_ptr(), /* The result buffer */
|
||||||
(uint8_t *) tag_buffer,
|
(uint8_t *) tag_buffer,
|
||||||
(unsigned long *) &tag_length
|
(unsigned long *) &tag_length
|
||||||
)) != CRYPT_OK){
|
)) != CRYPT_OK){
|
||||||
@ -344,8 +326,6 @@ bool CryptionHandler::encryptPacket(protocol::BasicPacket *packet, std::string &
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(tag_length == 8);
|
assert(tag_length == 8);
|
||||||
|
|
||||||
packet->data(pipes::buffer_view{target_buffer, length});
|
|
||||||
packet->mac().write(tag_buffer, tag_length);
|
packet->mac().write(tag_buffer, tag_length);
|
||||||
packet->setEncrypted(true);
|
packet->setEncrypted(true);
|
||||||
return true;
|
return true;
|
||||||
@ -353,7 +333,7 @@ bool CryptionHandler::encryptPacket(protocol::BasicPacket *packet, std::string &
|
|||||||
|
|
||||||
bool CryptionHandler::progressPacketIn(protocol::BasicPacket* packet, std::string& error, bool use_default) {
|
bool CryptionHandler::progressPacketIn(protocol::BasicPacket* packet, std::string& error, bool use_default) {
|
||||||
while(blocked)
|
while(blocked)
|
||||||
this_thread::sleep_for(chrono::microseconds(100));
|
this_thread::yield();
|
||||||
|
|
||||||
if(packet->isEncrypted()){
|
if(packet->isEncrypted()){
|
||||||
bool success = decryptPacket(packet, error, use_default);
|
bool success = decryptPacket(packet, error, use_default);
|
||||||
@ -365,9 +345,9 @@ bool CryptionHandler::progressPacketIn(protocol::BasicPacket* packet, std::strin
|
|||||||
|
|
||||||
bool CryptionHandler::progressPacketOut(protocol::BasicPacket* packet, std::string& error, bool use_default) {
|
bool CryptionHandler::progressPacketOut(protocol::BasicPacket* packet, std::string& error, bool use_default) {
|
||||||
while(blocked)
|
while(blocked)
|
||||||
this_thread::sleep_for(chrono::microseconds(100));
|
this_thread::yield();
|
||||||
|
|
||||||
if(packet->hasFlag(PacketFlag::Unencrypted)) {
|
if(packet->has_flag(PacketFlag::Unencrypted)) {
|
||||||
packet->mac().write(this->current_mac, 8);
|
packet->mac().write(this->current_mac, 8);
|
||||||
} else {
|
} else {
|
||||||
bool success = encryptPacket(packet, error, use_default);
|
bool success = encryptPacket(packet, error, use_default);
|
||||||
|
@ -26,7 +26,7 @@ namespace ts {
|
|||||||
|
|
||||||
//TeamSpeak old
|
//TeamSpeak old
|
||||||
bool setupSharedSecret(const std::string& alpha, const std::string& beta, ecc_key* publicKey, ecc_key* ownKey, std::string &error);
|
bool setupSharedSecret(const std::string& alpha, const std::string& beta, ecc_key* publicKey, ecc_key* ownKey, std::string &error);
|
||||||
bool setupSharedSecret(const std::string& alpha, const std::string& beta, std::string sharedKey, std::string &error);
|
bool setupSharedSecret(const std::string& alpha, const std::string& beta, const std::string& sharedKey, std::string &error);
|
||||||
|
|
||||||
//TeamSpeak new
|
//TeamSpeak new
|
||||||
bool setupSharedSecretNew(const std::string& alpha, const std::string& beta, const char privateKey[32], const char publicKey[32]);
|
bool setupSharedSecretNew(const std::string& alpha, const std::string& beta, const char privateKey[32], const char publicKey[32]);
|
||||||
|
@ -91,10 +91,10 @@ namespace ts {
|
|||||||
std::string BasicPacket::flags() const {
|
std::string BasicPacket::flags() const {
|
||||||
std::string result;
|
std::string result;
|
||||||
|
|
||||||
if(hasFlag(PacketFlag::Unencrypted)) result += string(result.empty() ? "" : " | ") + "Unencrypted";
|
if(this->has_flag(PacketFlag::Unencrypted)) result += string(result.empty() ? "" : " | ") + "Unencrypted";
|
||||||
if(hasFlag(PacketFlag::Compressed)) result += string(result.empty() ? "" : " | ") + "Compressed";
|
if(this->has_flag(PacketFlag::Compressed)) result += string(result.empty() ? "" : " | ") + "Compressed";
|
||||||
if(hasFlag(PacketFlag::Fragmented)) result += string(result.empty() ? "" : " | ") + "Fragmented";
|
if(this->has_flag(PacketFlag::Fragmented)) result += string(result.empty() ? "" : " | ") + "Fragmented";
|
||||||
if(hasFlag(PacketFlag::NewProtocol)) result += string(result.empty() ? "" : " | ") + "NewProtocol";
|
if(this->has_flag(PacketFlag::NewProtocol)) result += string(result.empty() ? "" : " | ") + "NewProtocol";
|
||||||
|
|
||||||
if(result.empty()) result = "none";
|
if(result.empty()) result = "none";
|
||||||
return result;
|
return result;
|
||||||
@ -130,6 +130,10 @@ namespace ts {
|
|||||||
memcpy(this->data().data_ptr(), data.data_ptr(), data.length());
|
memcpy(this->data().data_ptr(), data.data_ptr(), data.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ServerPacket::ServerPacket(ts::protocol::PacketTypeInfo type, size_t data_length) : BasicPacket(SERVER_HEADER_SIZE, data_length) {
|
||||||
|
this->header()[2] |= type.type();
|
||||||
|
}
|
||||||
|
|
||||||
ServerPacket::~ServerPacket() {}
|
ServerPacket::~ServerPacket() {}
|
||||||
|
|
||||||
uint16_t ServerPacket::packetId() const {
|
uint16_t ServerPacket::packetId() const {
|
||||||
@ -149,22 +153,6 @@ namespace ts {
|
|||||||
return PacketTypeInfo::fromid(this->header()[2] & 0xF);
|
return PacketTypeInfo::fromid(this->header()[2] & 0xF);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t ServerPacket::flagMask() const {
|
|
||||||
return this->header()[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ServerPacket::hasFlag(PacketFlag::PacketFlag flag) const {
|
|
||||||
return (this->header()[2] & flag) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServerPacket::toggle(PacketFlag::PacketFlag flag, bool state) {
|
|
||||||
if(state){
|
|
||||||
this->header()[2] |= flag;
|
|
||||||
} else {
|
|
||||||
this->header()[2] &= ~flag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ClientPacket::ClientPacket(const pipes::buffer_view& buffer) : BasicPacket(CLIENT_HEADER_SIZE, buffer.own_buffer()) { }
|
ClientPacket::ClientPacket(const pipes::buffer_view& buffer) : BasicPacket(CLIENT_HEADER_SIZE, buffer.own_buffer()) { }
|
||||||
|
|
||||||
@ -198,23 +186,6 @@ namespace ts {
|
|||||||
field |= type.type();
|
field |= type.type();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientPacket::hasFlag(PacketFlag::PacketFlag flag) const {
|
|
||||||
return (this->header()[4] & flag) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t ClientPacket::flagMask() const {
|
|
||||||
return this->header()[4];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ClientPacket::toggle(PacketFlag::PacketFlag flag, bool state) {
|
|
||||||
if(state){
|
|
||||||
this->header()[4] |= flag;
|
|
||||||
} else {
|
|
||||||
this->header()[4] &= ~flag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientPacket::setPacketId(uint16_t pkId, uint16_t gen) {
|
void ClientPacket::setPacketId(uint16_t pkId, uint16_t gen) {
|
||||||
this->header()[0] = (uint8_t) ((pkId >> 8) & 0xFF);
|
this->header()[0] = (uint8_t) ((pkId >> 8) & 0xFF);
|
||||||
this->header()[1] = (uint8_t) ((pkId >> 0) & 0xFF);
|
this->header()[1] = (uint8_t) ((pkId >> 0) & 0xFF);
|
||||||
|
@ -114,6 +114,7 @@ namespace ts {
|
|||||||
Compressed = 0x40, //If packet type voice than its the header
|
Compressed = 0x40, //If packet type voice than its the header
|
||||||
Unencrypted = 0x80
|
Unencrypted = 0x80
|
||||||
};
|
};
|
||||||
|
typedef uint8_t PacketFlags;
|
||||||
|
|
||||||
std::string to_string(PacketFlag flag);
|
std::string to_string(PacketFlag flag);
|
||||||
}
|
}
|
||||||
@ -134,11 +135,26 @@ namespace ts {
|
|||||||
virtual uint16_t packetId() const = 0;
|
virtual uint16_t packetId() const = 0;
|
||||||
virtual uint16_t generationId() const = 0;
|
virtual uint16_t generationId() const = 0;
|
||||||
virtual PacketTypeInfo type() const = 0;
|
virtual PacketTypeInfo type() const = 0;
|
||||||
virtual bool hasFlag(PacketFlag::PacketFlag flag) const = 0;
|
|
||||||
virtual uint8_t flagMask() const = 0;
|
/* packet flag info */
|
||||||
virtual std::string flags() const;
|
inline bool has_flag(PacketFlag::PacketFlag flag) const { return this->_flags_type_byte() & flag; }
|
||||||
virtual void enableFlag(PacketFlag::PacketFlag flag){ toggle(flag, true); }
|
inline uint8_t flag_mask() const { return this->_flags_type_byte(); };
|
||||||
virtual void toggle(PacketFlag::PacketFlag flag, bool state) = 0;
|
std::string flags() const;
|
||||||
|
|
||||||
|
/* manipulate flags */
|
||||||
|
inline void set_flags(PacketFlag::PacketFlags flags) {
|
||||||
|
uint8_t& byte = this->_flags_type_byte();
|
||||||
|
byte &= 0xF; /* clear all flags */
|
||||||
|
byte |= (flags & 0xF0);
|
||||||
|
}
|
||||||
|
inline void enabled_flag(PacketFlag::PacketFlag flag){ this->toggle_flag(flag, true); }
|
||||||
|
inline void toggle_flag(PacketFlag::PacketFlag flag, bool state) {
|
||||||
|
if(state)
|
||||||
|
this->_flags_type_byte() |= flag;
|
||||||
|
else
|
||||||
|
this->_flags_type_byte() &= ~flag;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void applyPacketId(PacketIdManager &);
|
virtual void applyPacketId(PacketIdManager &);
|
||||||
virtual void applyPacketId(uint16_t, uint16_t);
|
virtual void applyPacketId(uint16_t, uint16_t);
|
||||||
|
|
||||||
@ -149,14 +165,14 @@ namespace ts {
|
|||||||
}
|
}
|
||||||
inline std::unique_ptr<threads::Future<bool>>& getListener() { return this->listener; }
|
inline std::unique_ptr<threads::Future<bool>>& getListener() { return this->listener; }
|
||||||
|
|
||||||
inline pipes::buffer_view mac() const { return this->_buffer.view(0, MAC_SIZE); }
|
inline const pipes::buffer_view mac() const { return this->_buffer.view(0, MAC_SIZE); }
|
||||||
inline pipes::buffer mac() { return this->_buffer.range(0, MAC_SIZE); }
|
inline pipes::buffer mac() { return this->_buffer.range(0, MAC_SIZE); }
|
||||||
|
|
||||||
inline pipes::buffer_view header() const { return this->_buffer.view(MAC_SIZE, this->_header_length); }
|
inline const pipes::buffer_view header() const { return this->_buffer.view(MAC_SIZE, this->_header_length); }
|
||||||
inline pipes::buffer header() { return this->_buffer.range(MAC_SIZE, this->_header_length); }
|
inline pipes::buffer header() { return this->_buffer.range(MAC_SIZE, this->_header_length); }
|
||||||
|
|
||||||
inline size_t data_length() const { return this->_buffer.length() - (MAC_SIZE + this->_header_length); }
|
inline size_t data_length() const { return this->_buffer.length() - (MAC_SIZE + this->_header_length); }
|
||||||
inline pipes::buffer_view data() const { return this->_buffer.view(MAC_SIZE + this->_header_length); }
|
inline const pipes::buffer_view data() const { return this->_buffer.view(MAC_SIZE + this->_header_length); }
|
||||||
inline pipes::buffer data() { return this->_buffer.range(MAC_SIZE + this->_header_length); }
|
inline pipes::buffer data() { return this->_buffer.range(MAC_SIZE + this->_header_length); }
|
||||||
|
|
||||||
void append_data(const std::vector<pipes::buffer> &data);
|
void append_data(const std::vector<pipes::buffer> &data);
|
||||||
@ -206,15 +222,12 @@ namespace ts {
|
|||||||
pipes::buffer buffer() { return this->_buffer; }
|
pipes::buffer buffer() { return this->_buffer; }
|
||||||
void buffer(pipes::buffer buffer) { this->_buffer = std::move(buffer); }
|
void buffer(pipes::buffer buffer) { this->_buffer = std::move(buffer); }
|
||||||
protected:
|
protected:
|
||||||
|
virtual const uint8_t& _flags_type_byte() const = 0;
|
||||||
|
virtual uint8_t& _flags_type_byte() = 0;
|
||||||
|
|
||||||
virtual void setPacketId(uint16_t, uint16_t) = 0;
|
virtual void setPacketId(uint16_t, uint16_t) = 0;
|
||||||
uint8_t _header_length;
|
uint8_t _header_length;
|
||||||
pipes::buffer _buffer;
|
pipes::buffer _buffer;
|
||||||
//std::unique_ptr<uint8_t, decltype(::free)*> buffer;
|
|
||||||
/*
|
|
||||||
std::string _header;
|
|
||||||
std::string _data;
|
|
||||||
std::string _mac;
|
|
||||||
*/
|
|
||||||
|
|
||||||
uint16_t genId = 0;
|
uint16_t genId = 0;
|
||||||
std::unique_ptr<threads::Future<bool>> listener;
|
std::unique_ptr<threads::Future<bool>> listener;
|
||||||
@ -237,8 +250,6 @@ namespace ts {
|
|||||||
ClientPacket(const ClientPacket&) = delete;
|
ClientPacket(const ClientPacket&) = delete;
|
||||||
ClientPacket(ClientPacket&&) = delete;
|
ClientPacket(ClientPacket&&) = delete;
|
||||||
|
|
||||||
void toggle(PacketFlag::PacketFlag flag, bool state) override;
|
|
||||||
|
|
||||||
uint16_t clientId() const;
|
uint16_t clientId() const;
|
||||||
void clientId(uint16_t);
|
void clientId(uint16_t);
|
||||||
|
|
||||||
@ -250,10 +261,15 @@ namespace ts {
|
|||||||
PacketTypeInfo type() const override;
|
PacketTypeInfo type() const override;
|
||||||
void type(const PacketTypeInfo&);
|
void type(const PacketTypeInfo&);
|
||||||
|
|
||||||
bool hasFlag(PacketFlag::PacketFlag flag) const override;
|
|
||||||
uint8_t flagMask() const override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const uint8_t &_flags_type_byte() const override {
|
||||||
|
return this->header().data_ptr<uint8_t>()[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t &_flags_type_byte() override {
|
||||||
|
return this->header().data_ptr<uint8_t>()[4];
|
||||||
|
}
|
||||||
|
|
||||||
void setPacketId(uint16_t, uint16_t) override;
|
void setPacketId(uint16_t, uint16_t) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -269,6 +285,7 @@ namespace ts {
|
|||||||
explicit ServerPacket(const pipes::buffer_view& buffer);
|
explicit ServerPacket(const pipes::buffer_view& buffer);
|
||||||
ServerPacket(uint8_t flagMask, const pipes::buffer_view& data);
|
ServerPacket(uint8_t flagMask, const pipes::buffer_view& data);
|
||||||
ServerPacket(PacketTypeInfo type, const pipes::buffer_view& data);
|
ServerPacket(PacketTypeInfo type, const pipes::buffer_view& data);
|
||||||
|
ServerPacket(PacketTypeInfo type, size_t /* data length */);
|
||||||
~ServerPacket() override;
|
~ServerPacket() override;
|
||||||
ServerPacket(const ServerPacket&) = delete;
|
ServerPacket(const ServerPacket&) = delete;
|
||||||
ServerPacket(ServerPacket&&) = delete;
|
ServerPacket(ServerPacket&&) = delete;
|
||||||
@ -278,12 +295,15 @@ namespace ts {
|
|||||||
void generationId(uint16_t generation) { this->genId = generation; }
|
void generationId(uint16_t generation) { this->genId = generation; }
|
||||||
PacketTypeInfo type() const override;
|
PacketTypeInfo type() const override;
|
||||||
|
|
||||||
bool hasFlag(PacketFlag::PacketFlag flag) const override;
|
|
||||||
uint8_t flagMask() const override;
|
|
||||||
|
|
||||||
void toggle(PacketFlag::PacketFlag flag, bool state) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const uint8_t &_flags_type_byte() const override {
|
||||||
|
return this->header().data_ptr<uint8_t>()[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t &_flags_type_byte() override {
|
||||||
|
return this->header().data_ptr<uint8_t>()[2];
|
||||||
|
}
|
||||||
|
|
||||||
void setPacketId(uint16_t, uint16_t) override;
|
void setPacketId(uint16_t, uint16_t) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ namespace ts {
|
|||||||
slot.flag_set = false;
|
slot.flag_set = false;
|
||||||
auto entry = std::move(slot.entry);
|
auto entry = std::move(slot.entry);
|
||||||
this->_ring_base_index += 1;
|
this->_ring_base_index += 1;
|
||||||
this->_ring_index += 1;
|
this->_ring_index_full += 1;
|
||||||
if(this->_ring_base_index >= this->_capacity)
|
if(this->_ring_base_index >= this->_capacity)
|
||||||
this->_ring_base_index -= this->_capacity;
|
this->_ring_base_index -= this->_capacity;
|
||||||
return entry;
|
return entry;
|
||||||
@ -85,7 +85,7 @@ namespace ts {
|
|||||||
this->_ring_base_index = (size_type) this->_capacity;
|
this->_ring_base_index = (size_type) this->_capacity;
|
||||||
|
|
||||||
this->_ring_base_index -= 1;
|
this->_ring_base_index -= 1;
|
||||||
this->_ring_index -= 1;
|
this->_ring_index_full -= 1;
|
||||||
|
|
||||||
auto& slot = this->_slots[this->_ring_base_index];
|
auto& slot = this->_slots[this->_ring_base_index];
|
||||||
slot.entry = std::forward<E>(entry);
|
slot.entry = std::forward<E>(entry);
|
||||||
@ -118,7 +118,7 @@ namespace ts {
|
|||||||
if(index > this->_ring_index)
|
if(index > this->_ring_index)
|
||||||
this->_ring_index = index;
|
this->_ring_index = index;
|
||||||
else if(index < 100 && this->_ring_index > std::numeric_limits<size_type>::max() - 100) {
|
else if(index < 100 && this->_ring_index > std::numeric_limits<size_type>::max() - 100) {
|
||||||
this->_ring_index += 200; /* let the index overflow into the generation counter */
|
this->_ring_index_full += 200; /* let the index overflow into the generation counter */
|
||||||
this->_ring_index = index; /* set the lover (16) bytes */
|
this->_ring_index = index; /* set the lover (16) bytes */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -161,8 +161,9 @@ namespace ts {
|
|||||||
struct {
|
struct {
|
||||||
static_assert(8 - sizeof(size_type) > 0, "Invalid size type!");
|
static_assert(8 - sizeof(size_type) > 0, "Invalid size type!");
|
||||||
|
|
||||||
uint8_t padding[8 - sizeof(size_type)];
|
/* little endian */
|
||||||
size_type _ring_index; /* index of the insert index | overflow is welcome here */
|
size_type _ring_index; /* index of the insert index | overflow is welcome here */
|
||||||
|
uint8_t padding[8 - sizeof(size_type)];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -94,5 +94,28 @@ int main() {
|
|||||||
buffer.push_front(2);
|
buffer.push_front(2);
|
||||||
buffer.push_front(1);
|
buffer.push_front(1);
|
||||||
print_queue(buffer);
|
print_queue(buffer);
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65527, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65528, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65529, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65530, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65531, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65532, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65533, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65534, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
[2019-07-05 13:49:02] [DEBUG] 162 | [127.0.0.1:60793/Another TeaSpeak user | 1] Cant decrypt packet of type Voice. Packet ID: 65535, Estimated generation: 2, Full counter: 65536. Dropping packet. Error: memory verify failed!
|
||||||
|
*/
|
||||||
|
PacketRingBuffer<int, 16> buffer;
|
||||||
|
buffer.set_generation_packet(0, 65500);
|
||||||
|
|
||||||
|
while(buffer.current_index() < 100 || (buffer.full_index() >> 16) == 0) {
|
||||||
|
buffer.push_back(nullptr);
|
||||||
|
buffer.pop_front();
|
||||||
|
cout << buffer.full_index() << " | " << buffer.current_index() << " | " << buffer.generation(buffer.current_index()) << endl;
|
||||||
|
}
|
||||||
|
__asm__("nop");
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user