mirror of https://github.com/oxen-io/lokinet
clang format and lots of stupid bug fixes
parent
afdf5fa51c
commit
bc9e32d690
@ -1,9 +1,9 @@
|
||||
#ifndef LLARP_H_
|
||||
#define LLARP_H_
|
||||
#include <llarp/router.h>
|
||||
#include <llarp/version.h>
|
||||
#include <llarp/mem.h>
|
||||
#include <llarp/ev.h>
|
||||
#include <llarp/logic.h>
|
||||
#include <llarp/mem.h>
|
||||
#include <llarp/nodedb.h>
|
||||
#include <llarp/router.h>
|
||||
#include <llarp/version.h>
|
||||
#endif
|
||||
|
@ -0,0 +1,262 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <llarp/address_info.h>
|
||||
#include <llarp/bencode.h>
|
||||
#include <llarp/mem.h>
|
||||
#include <llarp/string.h>
|
||||
#include <vector>
|
||||
|
||||
struct llarp_ai_list
|
||||
{
|
||||
llarp_alloc *mem;
|
||||
std::vector< llarp_ai > list;
|
||||
|
||||
llarp_ai_list(llarp_alloc *m) : mem(m)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
static bool
|
||||
llarp_ai_decode_key(struct dict_reader *r, llarp_buffer_t *key)
|
||||
{
|
||||
int64_t i;
|
||||
char tmp[128] = {0};
|
||||
|
||||
llarp_buffer_t strbuf;
|
||||
llarp_ai *ai = static_cast< llarp_ai * >(r->user);
|
||||
|
||||
// done
|
||||
if(!key)
|
||||
return true;
|
||||
|
||||
// rank
|
||||
if(llarp_buffer_eq(*key, "c"))
|
||||
{
|
||||
if(!bdecode_read_integer(r->buffer, &i))
|
||||
return false;
|
||||
|
||||
if(i > 65536 || i <= 0)
|
||||
return false;
|
||||
|
||||
ai->rank = i;
|
||||
return true;
|
||||
}
|
||||
|
||||
// dialect
|
||||
if(llarp_buffer_eq(*key, "d"))
|
||||
{
|
||||
if(!bdecode_read_string(r->buffer, &strbuf))
|
||||
return false;
|
||||
|
||||
if(strbuf.sz >= sizeof(ai->dialect))
|
||||
return false;
|
||||
|
||||
memcpy(ai->dialect, strbuf.base, strbuf.sz);
|
||||
ai->dialect[strbuf.sz] = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
// encryption public key
|
||||
if(llarp_buffer_eq(*key, "e"))
|
||||
{
|
||||
if(!bdecode_read_string(r->buffer, &strbuf))
|
||||
return false;
|
||||
|
||||
if(strbuf.sz != sizeof(llarp_pubkey_t))
|
||||
return false;
|
||||
|
||||
memcpy(ai->enc_key, strbuf.base, sizeof(llarp_pubkey_t));
|
||||
return true;
|
||||
}
|
||||
|
||||
// ip address
|
||||
if(llarp_buffer_eq(*key, "i"))
|
||||
{
|
||||
if(!bdecode_read_string(r->buffer, &strbuf))
|
||||
return false;
|
||||
|
||||
if(strbuf.sz >= sizeof(tmp))
|
||||
return false;
|
||||
|
||||
memcpy(tmp, strbuf.base, strbuf.sz);
|
||||
tmp[strbuf.sz] = 0;
|
||||
|
||||
return inet_pton(AF_INET6, tmp, ai->ip.s6_addr) == 1;
|
||||
}
|
||||
|
||||
// port
|
||||
if(llarp_buffer_eq(*key, "p"))
|
||||
{
|
||||
if(!bdecode_read_integer(r->buffer, &i))
|
||||
return false;
|
||||
|
||||
if(i > 65536 || i <= 0)
|
||||
return false;
|
||||
|
||||
ai->port = i;
|
||||
return true;
|
||||
}
|
||||
|
||||
// version
|
||||
if(llarp_buffer_eq(*key, "v"))
|
||||
{
|
||||
if(!bdecode_read_integer(r->buffer, &i))
|
||||
return false;
|
||||
return i == LLARP_PROTO_VERSION;
|
||||
}
|
||||
|
||||
// bad key
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
llarp_ai_list_bdecode_item(struct list_reader *r, bool more)
|
||||
{
|
||||
if(!more)
|
||||
return true;
|
||||
llarp_ai_list *l = static_cast< llarp_ai_list * >(r->user);
|
||||
llarp_ai ai;
|
||||
|
||||
if(!llarp_ai_bdecode(&ai, r->buffer))
|
||||
return false;
|
||||
|
||||
llarp_ai_list_pushback(l, &ai);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
llarp_ai_list_iter_bencode(struct llarp_ai_list_iter *iter, struct llarp_ai *ai)
|
||||
{
|
||||
return llarp_ai_bencode(ai, static_cast< llarp_buffer_t * >(iter->user));
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
bool
|
||||
llarp_ai_bdecode(struct llarp_ai *ai, llarp_buffer_t *buff)
|
||||
{
|
||||
struct dict_reader reader = {.user = ai, .on_key = &llarp_ai_decode_key};
|
||||
return bdecode_read_dict(buff, &reader);
|
||||
}
|
||||
|
||||
bool
|
||||
llarp_ai_bencode(struct llarp_ai *ai, llarp_buffer_t *buff)
|
||||
{
|
||||
char ipbuff[128] = {0};
|
||||
const char *ipstr;
|
||||
if(!bencode_start_dict(buff))
|
||||
return false;
|
||||
/* rank */
|
||||
if(!bencode_write_bytestring(buff, "c", 1))
|
||||
return false;
|
||||
if(!bencode_write_uint16(buff, ai->rank))
|
||||
return false;
|
||||
/* dialect */
|
||||
if(!bencode_write_bytestring(buff, "d", 1))
|
||||
return false;
|
||||
if(!bencode_write_bytestring(buff, ai->dialect,
|
||||
strnlen(ai->dialect, sizeof(ai->dialect))))
|
||||
return false;
|
||||
/* encryption key */
|
||||
if(!bencode_write_bytestring(buff, "e", 1))
|
||||
return false;
|
||||
if(!bencode_write_bytestring(buff, ai->enc_key, sizeof(llarp_pubkey_t)))
|
||||
return false;
|
||||
/** ip */
|
||||
ipstr = inet_ntop(AF_INET6, &ai->ip, ipbuff, sizeof(ipbuff));
|
||||
if(!ipstr)
|
||||
return false;
|
||||
if(!bencode_write_bytestring(buff, "i", 1))
|
||||
return false;
|
||||
if(!bencode_write_bytestring(buff, ipstr, strnlen(ipstr, sizeof(ipbuff))))
|
||||
return false;
|
||||
/** port */
|
||||
if(!bencode_write_bytestring(buff, "p", 1))
|
||||
return false;
|
||||
if(!bencode_write_uint16(buff, ai->port))
|
||||
return false;
|
||||
|
||||
/** version */
|
||||
if(!bencode_write_version_entry(buff))
|
||||
return false;
|
||||
/** end */
|
||||
return bencode_end(buff);
|
||||
}
|
||||
|
||||
bool
|
||||
llarp_ai_list_bencode(struct llarp_ai_list *l, llarp_buffer_t *buff)
|
||||
{
|
||||
if(!bencode_start_list(buff))
|
||||
return false;
|
||||
struct llarp_ai_list_iter ai_itr = {.user = buff,
|
||||
.visit = &llarp_ai_list_iter_bencode};
|
||||
llarp_ai_list_iterate(l, &ai_itr);
|
||||
return bencode_end(buff);
|
||||
}
|
||||
|
||||
struct llarp_ai_list *
|
||||
llarp_ai_list_new(struct llarp_alloc *mem)
|
||||
{
|
||||
void *ptr = mem->alloc(mem, sizeof(struct llarp_ai_list), 8);
|
||||
if(ptr)
|
||||
{
|
||||
return new(ptr) llarp_ai_list(mem);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void
|
||||
llarp_ai_list_free(struct llarp_ai_list *l)
|
||||
{
|
||||
if(l)
|
||||
{
|
||||
struct llarp_alloc *mem = l->mem;
|
||||
l->~llarp_ai_list();
|
||||
mem->free(mem, l);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
llarp_ai_copy(struct llarp_ai *dst, struct llarp_ai *src)
|
||||
{
|
||||
memcpy(dst, src, sizeof(struct llarp_ai));
|
||||
}
|
||||
|
||||
void
|
||||
llarp_ai_list_pushback(struct llarp_ai_list *l, struct llarp_ai *ai)
|
||||
{
|
||||
llarp_ai a;
|
||||
llarp_ai_copy(&a, ai);
|
||||
l->list.push_back(a);
|
||||
}
|
||||
|
||||
void
|
||||
llarp_ai_list_iterate(struct llarp_ai_list *l, struct llarp_ai_list_iter *itr)
|
||||
{
|
||||
itr->list = l;
|
||||
for(auto &ai : l->list)
|
||||
if(!itr->visit(itr, &ai))
|
||||
return;
|
||||
}
|
||||
|
||||
bool
|
||||
llarp_ai_list_index(struct llarp_ai_list *l, ssize_t idx, struct llarp_ai *dst)
|
||||
{
|
||||
// TODO: implement negative indexes
|
||||
if(idx < 0)
|
||||
return false;
|
||||
|
||||
if(l->list.size() > idx)
|
||||
{
|
||||
llarp_ai_copy(dst, &l->list[idx]);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
llarp_ai_list_bdecode(struct llarp_ai_list *l, llarp_buffer_t *buff)
|
||||
{
|
||||
struct list_reader r = {.user = l, .on_item = &llarp_ai_list_bdecode_item};
|
||||
return bdecode_read_list(buff, &r);
|
||||
}
|
||||
}
|
@ -1,235 +1,246 @@
|
||||
#include <llarp/crypto_async.h>
|
||||
#include <llarp/mem.h>
|
||||
#include <string.h>
|
||||
#include "buffer.hpp"
|
||||
#include "mem.hpp"
|
||||
|
||||
struct llarp_async_iwp
|
||||
{
|
||||
struct llarp_alloc * mem;
|
||||
struct llarp_crypto * crypto;
|
||||
struct llarp_logic * logic;
|
||||
struct llarp_threadpool * worker;
|
||||
struct llarp_alloc *mem;
|
||||
struct llarp_crypto *crypto;
|
||||
struct llarp_logic *logic;
|
||||
struct llarp_threadpool *worker;
|
||||
};
|
||||
|
||||
namespace iwp
|
||||
{
|
||||
void
|
||||
inform_keygen(void *user)
|
||||
{
|
||||
iwp_async_keygen *keygen = static_cast< iwp_async_keygen * >(user);
|
||||
keygen->hook(keygen);
|
||||
}
|
||||
|
||||
void inform_keygen(void * user)
|
||||
{
|
||||
iwp_async_keygen * keygen = static_cast<iwp_async_keygen *>(user);
|
||||
keygen->hook(keygen);
|
||||
}
|
||||
|
||||
void keygen(void * user)
|
||||
{
|
||||
iwp_async_keygen * keygen = static_cast<iwp_async_keygen *>(user);
|
||||
keygen->iwp->crypto->keygen(keygen->keybuf);
|
||||
llarp_thread_job job = {
|
||||
.user = user,
|
||||
.work = &inform_keygen
|
||||
};
|
||||
llarp_logic_queue_job(keygen->iwp->logic, job);
|
||||
}
|
||||
|
||||
void inform_gen_intro(void * user)
|
||||
{
|
||||
iwp_async_intro * intro = static_cast<iwp_async_intro *>(user);
|
||||
intro->hook(intro);
|
||||
}
|
||||
|
||||
void gen_intro(void * user)
|
||||
{
|
||||
iwp_async_intro * intro = static_cast<iwp_async_intro *>(user);
|
||||
llarp_sharedkey_t sharedkey;
|
||||
llarp_shorthash_t e_k;
|
||||
llarp_buffer_t buf;
|
||||
llarp_crypto * crypto = intro->iwp->crypto;
|
||||
uint8_t tmp[64];
|
||||
llarp_thread_job job = {
|
||||
.user = user,
|
||||
.work = &inform_gen_intro
|
||||
};
|
||||
// S = TKE(a.k, b.k, n)
|
||||
crypto->transport_dh_client(sharedkey, intro->remote_pubkey, intro->secretkey, intro->nonce);
|
||||
|
||||
buf.base = (char*)tmp;
|
||||
buf.sz = sizeof(tmp);
|
||||
// e_k = HS(b.k + n)
|
||||
memcpy(tmp, intro->remote_pubkey, 32);
|
||||
memcpy(tmp + 32, intro->nonce, 32);
|
||||
crypto->shorthash(&e_k, buf);
|
||||
// e = SE(a.k, e_k, n[0:24])
|
||||
memcpy(intro->buf + 32, llarp_seckey_topublic(intro->secretkey), 32);
|
||||
buf.base = (char*) intro->buf + 32;
|
||||
buf.sz = 32;
|
||||
crypto->xchacha20(buf, e_k, intro->nonce);
|
||||
// h = MDS( n + e + w0, S)
|
||||
buf.sz = intro->sz - 32;
|
||||
crypto->hmac(intro->buf, buf, sharedkey);
|
||||
// inform result
|
||||
llarp_logic_queue_job(intro->iwp->logic, job);
|
||||
}
|
||||
void
|
||||
keygen(void *user)
|
||||
{
|
||||
iwp_async_keygen *keygen = static_cast< iwp_async_keygen * >(user);
|
||||
keygen->iwp->crypto->keygen(keygen->keybuf);
|
||||
llarp_thread_job job = {.user = user, .work = &inform_keygen};
|
||||
llarp_logic_queue_job(keygen->iwp->logic, job);
|
||||
}
|
||||
|
||||
void
|
||||
inform_gen_intro(void *user)
|
||||
{
|
||||
iwp_async_intro *intro = static_cast< iwp_async_intro * >(user);
|
||||
intro->hook(intro);
|
||||
}
|
||||
|
||||
void inform_verify_introack(void * user)
|
||||
{
|
||||
iwp_async_introack * introack = static_cast<iwp_async_introack *>(user);
|
||||
introack->hook(introack);
|
||||
}
|
||||
void
|
||||
gen_intro(void *user)
|
||||
{
|
||||
iwp_async_intro *intro = static_cast< iwp_async_intro * >(user);
|
||||
llarp_sharedkey_t sharedkey;
|
||||
llarp_shorthash_t e_k;
|
||||
llarp_nonce_t n;
|
||||
llarp_crypto *crypto = intro->iwp->crypto;
|
||||
byte_t tmp[64];
|
||||
// S = TKE(a.k, b.k, n)
|
||||
printf("dh\n");
|
||||
crypto->transport_dh_client(sharedkey, intro->remote_pubkey,
|
||||
intro->secretkey, intro->nonce);
|
||||
llarp_buffer_t buf;
|
||||
llarp::StackBuffer< decltype(tmp) >(buf, tmp);
|
||||
// copy nonce
|
||||
memcpy(n, intro->nonce, 24);
|
||||
// e_k = HS(b.k + n)
|
||||
memcpy(tmp, intro->remote_pubkey, 32);
|
||||
memcpy(tmp + 32, intro->nonce, 32);
|
||||
printf("shorthash\n");
|
||||
crypto->shorthash(e_k, buf);
|
||||
printf("copy\n");
|
||||
// e = SE(a.k, e_k, n[0:24])
|
||||
memcpy(intro->buf + 32, llarp_seckey_topublic(intro->secretkey), 32);
|
||||
buf.base = intro->buf + 32;
|
||||
buf.sz = 32;
|
||||
printf("chacha\n");
|
||||
crypto->xchacha20(buf, e_k, n);
|
||||
// h = MDS( n + e + w0, S)
|
||||
buf.sz = intro->sz - 32;
|
||||
printf("hmac\n");
|
||||
crypto->hmac(intro->buf, buf, sharedkey);
|
||||
// inform result
|
||||
llarp_logic_queue_job(intro->iwp->logic, {intro, &inform_gen_intro});
|
||||
}
|
||||
|
||||
void
|
||||
inform_verify_introack(void *user)
|
||||
{
|
||||
iwp_async_introack *introack = static_cast< iwp_async_introack * >(user);
|
||||
introack->hook(introack);
|
||||
}
|
||||
|
||||
void verify_introack(void * user)
|
||||
{
|
||||
iwp_async_introack * introack = static_cast<iwp_async_introack *>(user);
|
||||
auto crypto = introack->iwp->crypto;
|
||||
auto logic = introack->iwp->logic;
|
||||
|
||||
llarp_thread_job job = {
|
||||
.user = user,
|
||||
.work = &inform_verify_introack
|
||||
};
|
||||
|
||||
llarp_hmac_t digest;
|
||||
llarp_sharedkey_t sharedkey;
|
||||
|
||||
auto hmac = introack->buf;
|
||||
auto body = introack->buf + 32;
|
||||
auto pubkey = introack->remote_pubkey;
|
||||
auto secretkey = introack->secretkey;
|
||||
auto nonce = introack->buf + 32;
|
||||
auto token = introack->buf + 64;
|
||||
size_t bodysz = introack->sz - 32;
|
||||
llarp_buffer_t buf;
|
||||
buf.base = (char*) body;
|
||||
buf.sz = bodysz;
|
||||
|
||||
// S = TKE(a.k, b.k, n)
|
||||
crypto->transport_dh_client(sharedkey, pubkey, secretkey, nonce);
|
||||
|
||||
// h = MDS(n + x + w1, S)
|
||||
crypto->hmac(digest, buf, sharedkey);
|
||||
|
||||
if(!llarp_eq(digest, hmac, 32))
|
||||
void
|
||||
verify_introack(void *user)
|
||||
{
|
||||
// fail to verify hmac
|
||||
introack->buf = nullptr;
|
||||
iwp_async_introack *introack = static_cast< iwp_async_introack * >(user);
|
||||
auto crypto = introack->iwp->crypto;
|
||||
auto logic = introack->iwp->logic;
|
||||
|
||||
llarp_thread_job job = {.user = user, .work = &inform_verify_introack};
|
||||
|
||||
llarp_hmac_t digest;
|
||||
llarp_sharedkey_t sharedkey;
|
||||
|
||||
auto hmac = introack->buf;
|
||||
auto body = introack->buf + 32;
|
||||
auto pubkey = introack->remote_pubkey;
|
||||
auto secretkey = introack->secretkey;
|
||||
auto nonce = introack->buf + 32;
|
||||
auto token = introack->buf + 64;
|
||||
size_t bodysz = introack->sz - 32;
|
||||
llarp_buffer_t buf;
|
||||
buf.base = body;
|
||||
buf.cur = body;
|
||||
buf.sz = bodysz;
|
||||
|
||||
// S = TKE(a.k, b.k, n)
|
||||
crypto->transport_dh_client(sharedkey, pubkey, secretkey, nonce);
|
||||
|
||||
// h = MDS(n + x + w1, S)
|
||||
crypto->hmac(digest, buf, sharedkey);
|
||||
|
||||
if(!llarp_eq(digest, hmac, 32))
|
||||
{
|
||||
// fail to verify hmac
|
||||
introack->buf = nullptr;
|
||||
llarp_logic_queue_job(logic, job);
|
||||
return;
|
||||
}
|
||||
buf.base = token;
|
||||
buf.sz = 32;
|
||||
// token = SD(S, x, n[0:24])
|
||||
crypto->xchacha20(buf, sharedkey, nonce);
|
||||
// copy token
|
||||
memcpy(introack->token, token, 32);
|
||||
llarp_logic_queue_job(logic, job);
|
||||
return;
|
||||
}
|
||||
buf.base = (char *) token;
|
||||
buf.sz = 32;
|
||||
// token = SD(S, x, n[0:24])
|
||||
crypto->xchacha20(buf, sharedkey, nonce);
|
||||
// copy token
|
||||
memcpy(introack->token, token, 32);
|
||||
llarp_logic_queue_job(logic, job);
|
||||
}
|
||||
|
||||
void inform_gen_session_start(void * user)
|
||||
void
|
||||
inform_gen_session_start(void *user)
|
||||
{
|
||||
iwp_async_session_start * session = static_cast<iwp_async_session_start *>(user);
|
||||
session->hook(session);
|
||||
iwp_async_session_start *session =
|
||||
static_cast< iwp_async_session_start * >(user);
|
||||
session->hook(session);
|
||||
}
|
||||
|
||||
void gen_session_start(void * user)
|
||||
|
||||
void
|
||||
gen_session_start(void *user)
|
||||
{
|
||||
iwp_async_session_start * session = static_cast<iwp_async_session_start *>(user);
|
||||
iwp_async_session_start *session =
|
||||
static_cast< iwp_async_session_start * >(user);
|
||||
auto crypto = session->iwp->crypto;
|
||||
|
||||
auto dh = crypto->transport_dh_client;
|
||||
auto dh = crypto->transport_dh_client;
|
||||
auto shorthash = crypto->shorthash;
|
||||
auto hmac = crypto->hmac;
|
||||
auto encrypt = crypto->xchacha20;
|
||||
|
||||
auto hmac = crypto->hmac;
|
||||
auto encrypt = crypto->xchacha20;
|
||||
|
||||
auto logic = session->iwp->logic;
|
||||
auto a_sK = session->secretkey;
|
||||
auto b_K = session->remote_pubkey;
|
||||
auto N = session->nonce;
|
||||
auto a_sK = session->secretkey;
|
||||
auto b_K = session->remote_pubkey;
|
||||
auto N = session->nonce;
|
||||
auto token = session->token;
|
||||
auto K = session->sessionkey;
|
||||
auto K = session->sessionkey;
|
||||
|
||||
llarp_sharedkey_t e_K;
|
||||
llarp_shorthash_t T;
|
||||
llarp_buffer_t buf;
|
||||
|
||||
uint8_t tmp[64];
|
||||
byte_t tmp[64];
|
||||
llarp_buffer_t buf;
|
||||
llarp::StackBuffer< decltype(tmp) >(buf, tmp);
|
||||
|
||||
// T = HS(token + n)
|
||||
memcpy(tmp, token, 32);
|
||||
memcpy(tmp + 32, N, 32);
|
||||
buf.base = (char *) tmp;
|
||||
buf.sz = 64;
|
||||
shorthash(&T, buf);
|
||||
|
||||
shorthash(T, buf);
|
||||
|
||||
// e_K = TKE(a.k, b.k, N)
|
||||
dh(e_K, b_K, a_sK, N);
|
||||
// K = TKE(a.k, b.k, T)
|
||||
dh(K, b_K, a_sK, T);
|
||||
|
||||
// x = SE(e_K, token, n[0:24])
|
||||
buf.base = (char *) (session->buf + 64);
|
||||
buf.sz = 32;
|
||||
buf.base = (session->buf + 32);
|
||||
buf.sz = 32;
|
||||
memcpy(buf.base, token, 32);
|
||||
encrypt(buf, e_K, N);
|
||||
|
||||
// h = MDS(n + x + w2, e_K)
|
||||
buf.base = (char*) (session->buf + 32);
|
||||
buf.sz = session->sz - 32;
|
||||
buf.base = (session->buf + 32);
|
||||
buf.sz = session->sz - 32;
|
||||
hmac(session->buf, buf, e_K);
|
||||
|
||||
|
||||
// K = TKE(a.k, b.k, T)
|
||||
dh(K, b_K, a_sK, T);
|
||||
|
||||
llarp_logic_queue_job(logic, {user, &inform_gen_session_start});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void iwp_call_async_keygen(struct llarp_async_iwp * iwp, struct iwp_async_keygen * keygen)
|
||||
void
|
||||
iwp_call_async_keygen(struct llarp_async_iwp *iwp,
|
||||
struct iwp_async_keygen *keygen)
|
||||
{
|
||||
keygen->iwp = iwp;
|
||||
llarp_threadpool_queue_job(iwp->worker, {keygen, &iwp::keygen});
|
||||
}
|
||||
|
||||
void iwp_call_async_gen_intro(struct llarp_async_iwp * iwp, struct iwp_async_intro * intro)
|
||||
void
|
||||
iwp_call_async_gen_intro(struct llarp_async_iwp *iwp,
|
||||
struct iwp_async_intro *intro)
|
||||
{
|
||||
intro->iwp = iwp;
|
||||
llarp_threadpool_queue_job(iwp->worker, {intro, &iwp::gen_intro});
|
||||
}
|
||||
|
||||
void iwp_call_async_verify_introack(struct llarp_async_iwp * iwp, struct iwp_async_introack * introack)
|
||||
void
|
||||
iwp_call_async_verify_introack(struct llarp_async_iwp *iwp,
|
||||
struct iwp_async_introack *introack)
|
||||
{
|
||||
introack->iwp = iwp;
|
||||
llarp_threadpool_queue_job(iwp->worker, {introack, &iwp::verify_introack});
|
||||
}
|
||||
|
||||
void iwp_call_async_gen_session_start(struct llarp_async_iwp * iwp, struct iwp_async_session_start * session)
|
||||
void
|
||||
iwp_call_async_gen_session_start(struct llarp_async_iwp *iwp,
|
||||
struct iwp_async_session_start *session)
|
||||
{
|
||||
session->iwp = iwp;
|
||||
llarp_threadpool_queue_job(iwp->worker, {session, &iwp::gen_session_start});
|
||||
}
|
||||
|
||||
void iwp_call_async_frame_decrypt(struct llarp_async_iwp * iwp, struct iwp_async_frame * frame)
|
||||
void
|
||||
iwp_call_async_frame_decrypt(struct llarp_async_iwp *iwp,
|
||||
struct iwp_async_frame *frame)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
struct llarp_async_iwp * llarp_async_iwp_new(struct llarp_alloc * mem,
|
||||
struct llarp_crypto * crypto,
|
||||
struct llarp_logic * logic,
|
||||
struct llarp_threadpool * worker)
|
||||
struct llarp_async_iwp *
|
||||
llarp_async_iwp_new(struct llarp_alloc *mem, struct llarp_crypto *crypto,
|
||||
struct llarp_logic *logic, struct llarp_threadpool *worker)
|
||||
{
|
||||
struct llarp_async_iwp * iwp = llarp::Alloc<llarp_async_iwp>(mem);
|
||||
struct llarp_async_iwp *iwp = llarp::Alloc< llarp_async_iwp >(mem);
|
||||
if(iwp)
|
||||
{
|
||||
iwp->mem = mem;
|
||||
iwp->mem = mem;
|
||||
iwp->crypto = crypto;
|
||||
iwp->logic = logic;
|
||||
iwp->logic = logic;
|
||||
iwp->worker = worker;
|
||||
}
|
||||
return iwp;
|
||||
}
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,14 @@
|
||||
#include "link_handlers.hpp"
|
||||
|
||||
namespace llarp {
|
||||
namespace frame {
|
||||
bool process_intro(struct llarp_frame_handler* h, struct llarp_link_session* s,
|
||||
llarp_buffer_t msg) {
|
||||
return false;
|
||||
}
|
||||
} // namespace frame
|
||||
namespace llarp
|
||||
{
|
||||
namespace frame
|
||||
{
|
||||
bool
|
||||
process_intro(struct llarp_frame_handler* h, struct llarp_link_session* s,
|
||||
llarp_buffer_t msg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
} // namespace frame
|
||||
} // namespace llarp
|
||||
|
@ -1,10 +1,14 @@
|
||||
#include "link_handlers.hpp"
|
||||
|
||||
namespace llarp {
|
||||
namespace frame {
|
||||
bool process_relay_down(struct llarp_frame_handler* h,
|
||||
struct llarp_link_session* s, llarp_buffer_t msg) {
|
||||
return false;
|
||||
}
|
||||
} // namespace frame
|
||||
namespace llarp
|
||||
{
|
||||
namespace frame
|
||||
{
|
||||
bool
|
||||
process_relay_down(struct llarp_frame_handler* h,
|
||||
struct llarp_link_session* s, llarp_buffer_t msg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
} // namespace frame
|
||||
} // namespace llarp
|
||||
|
@ -1,10 +1,14 @@
|
||||
#include "link_handlers.hpp"
|
||||
|
||||
namespace llarp {
|
||||
namespace frame {
|
||||
bool process_relay_up(struct llarp_frame_handler* h,
|
||||
struct llarp_link_session* s, llarp_buffer_t msg) {
|
||||
return false;
|
||||
}
|
||||
} // namespace frame
|
||||
namespace llarp
|
||||
{
|
||||
namespace frame
|
||||
{
|
||||
bool
|
||||
process_relay_up(struct llarp_frame_handler* h,
|
||||
struct llarp_link_session* s, llarp_buffer_t msg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
} // namespace frame
|
||||
} // namespace llarp
|
||||
|
@ -1,26 +1,32 @@
|
||||
#ifndef LLARP_MEM_HPP
|
||||
#define LLARP_MEM_HPP
|
||||
#include <llarp/mem.h>
|
||||
namespace llarp {
|
||||
template <typename T>
|
||||
static constexpr size_t alignment() {
|
||||
size_t idx = 0;
|
||||
size_t sz = sizeof(T);
|
||||
while (sz) {
|
||||
++idx;
|
||||
sz >>= 1;
|
||||
namespace llarp
|
||||
{
|
||||
template < typename T >
|
||||
static constexpr size_t
|
||||
alignment()
|
||||
{
|
||||
size_t idx = 0;
|
||||
size_t sz = sizeof(T);
|
||||
while(sz)
|
||||
{
|
||||
++idx;
|
||||
sz >>= 1;
|
||||
}
|
||||
return 1 << idx;
|
||||
}
|
||||
return 1 << idx;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static T *Alloc(llarp_alloc *mem) {
|
||||
return static_cast<T *>(mem->alloc(mem, sizeof(T), alignment<T>()));
|
||||
}
|
||||
template < typename T >
|
||||
static T *
|
||||
Alloc(llarp_alloc *mem)
|
||||
{
|
||||
return static_cast< T * >(mem->alloc(mem, sizeof(T), alignment< T >()));
|
||||
}
|
||||
|
||||
void Zero(void * ptr, size_t sz);
|
||||
|
||||
} // namespace llarp
|
||||
void
|
||||
Zero(void *ptr, size_t sz);
|
||||
|
||||
} // namespace llarp
|
||||
|
||||
#endif
|
||||
|
@ -1,21 +0,0 @@
|
||||
#include <jemalloc/jemalloc.h>
|
||||
#include <llarp/mem.h>
|
||||
|
||||
namespace llarp {
|
||||
static void *jem_malloc(struct llarp_alloc * mem, size_t sz, size_t align) {
|
||||
(void) mem;
|
||||
return mallocx(sz, MALLOCX_ALIGN(align));
|
||||
}
|
||||
|
||||
static void jem_free(struct llarp_alloc * mem, void *ptr) {
|
||||
(void) mem;
|
||||
if (ptr) free(ptr);
|
||||
}
|
||||
} // namespace llarp
|
||||
|
||||
extern "C" {
|
||||
void llarp_mem_jemalloc(struct llarp_alloc * mem) {
|
||||
mem->alloc = llarp::jem_malloc;
|
||||
mem->free = llarp::jem_free;
|
||||
}
|
||||
}
|
@ -1,28 +1,39 @@
|
||||
#define NO_JEMALLOC
|
||||
#include <llarp/mem.h>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
namespace llarp {
|
||||
void *std_malloc(struct llarp_alloc *mem, size_t sz, size_t align) {
|
||||
(void)mem;
|
||||
(void)align;
|
||||
void *ptr = malloc(sz);
|
||||
if (ptr) {
|
||||
std::memset(ptr, 0, sz);
|
||||
return ptr;
|
||||
namespace llarp
|
||||
{
|
||||
void *
|
||||
std_malloc(struct llarp_alloc *mem, size_t sz, size_t align)
|
||||
{
|
||||
(void)mem;
|
||||
(void)align;
|
||||
void *ptr = malloc(sz);
|
||||
if(ptr)
|
||||
{
|
||||
std::memset(ptr, 0, sz);
|
||||
return ptr;
|
||||
}
|
||||
abort();
|
||||
}
|
||||
abort();
|
||||
}
|
||||
|
||||
void std_free(struct llarp_alloc * mem, void *ptr) {
|
||||
(void) mem;
|
||||
if (ptr) free(ptr);
|
||||
}
|
||||
void
|
||||
std_free(struct llarp_alloc *mem, void *ptr)
|
||||
{
|
||||
(void)mem;
|
||||
if(ptr)
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
} // namespace llarp
|
||||
|
||||
extern "C" {
|
||||
void llarp_mem_stdlib(struct llarp_alloc * mem) {
|
||||
void
|
||||
llarp_mem_stdlib(struct llarp_alloc *mem)
|
||||
{
|
||||
mem->alloc = llarp::std_malloc;
|
||||
mem->free = llarp::std_free;
|
||||
mem->free = llarp::std_free;
|
||||
}
|
||||
}
|
||||
|
@ -1,46 +1,33 @@
|
||||
#include <llarp/msg_handler.h>
|
||||
#include "link_handlers.hpp"
|
||||
#include "router.hpp"
|
||||
|
||||
namespace llarp {
|
||||
struct llarp_frame_handler introduce_handler = {
|
||||
.paths = nullptr,
|
||||
.parent = nullptr,
|
||||
.process = &llarp::frame::process_intro};
|
||||
|
||||
struct llarp_frame_handler lrdm_handler = {
|
||||
.paths = nullptr,
|
||||
.parent = nullptr,
|
||||
.process = &llarp::frame::process_relay_down};
|
||||
|
||||
struct llarp_frame_handler lrum_handler = {
|
||||
.paths = nullptr,
|
||||
.parent = nullptr,
|
||||
.process = &llarp::frame::process_relay_up};
|
||||
|
||||
static struct llarp_frame_handler* find_frame_handler(struct llarp_router* r,
|
||||
const char ch) {
|
||||
struct llarp_frame_handler* handler = nullptr;
|
||||
switch (ch) {
|
||||
case 'i':
|
||||
handler = &introduce_handler;
|
||||
}
|
||||
if (handler) {
|
||||
handler->paths = r->paths;
|
||||
handler->parent = &r->muxer;
|
||||
namespace llarp
|
||||
{
|
||||
static struct llarp_frame_handler*
|
||||
find_frame_handler(struct llarp_router* r, const char ch)
|
||||
{
|
||||
auto itr = r->frame_handlers.find(ch);
|
||||
if(itr != r->frame_handlers.end())
|
||||
{
|
||||
auto handler = &itr->second;
|
||||
handler->paths = r->paths;
|
||||
handler->parent = &r->muxer;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
return handler;
|
||||
}
|
||||
|
||||
static struct llarp_msg_handler* find_msg_handler(struct llarp_router* r,
|
||||
const char ch) {
|
||||
return nullptr;
|
||||
}
|
||||
static struct llarp_msg_handler*
|
||||
find_msg_handler(struct llarp_router* r, const char ch)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
} // namespace llarp
|
||||
|
||||
extern "C" {
|
||||
void llarp_msg_muxer_init(struct llarp_msg_muxer* muxer) {
|
||||
muxer->link_handler_for = &llarp::find_frame_handler;
|
||||
void
|
||||
llarp_msg_muxer_init(struct llarp_msg_muxer* muxer)
|
||||
{
|
||||
muxer->link_handler_for = &llarp::find_frame_handler;
|
||||
muxer->routing_handler_for = &llarp::find_msg_handler;
|
||||
}
|
||||
}
|
||||
|
@ -1,35 +1,75 @@
|
||||
#include <llarp/net.h>
|
||||
#include "net.hpp"
|
||||
#include "str.hpp"
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <ifaddrs.h>
|
||||
#include <cstdio>
|
||||
|
||||
bool
|
||||
operator==(const sockaddr& a, const sockaddr& b)
|
||||
{
|
||||
socklen_t sz = sizeof(a.sa_data);
|
||||
switch(a.sa_family)
|
||||
{
|
||||
case AF_INET:
|
||||
sz = sizeof(sockaddr_in);
|
||||
break;
|
||||
case AF_INET6:
|
||||
sz = sizeof(sockaddr_in6);
|
||||
break;
|
||||
case AF_PACKET:
|
||||
sz = sizeof(sockaddr_ll);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return a.sa_family == b.sa_family && memcmp(a.sa_data, b.sa_data, sz) == 0;
|
||||
}
|
||||
|
||||
bool
|
||||
operator<(const sockaddr_in6& a, const sockaddr_in6& b)
|
||||
{
|
||||
return memcmp(&a, &b, sizeof(sockaddr_in6)) < 0;
|
||||
}
|
||||
|
||||
bool
|
||||
operator<(const in6_addr& a, const in6_addr& b)
|
||||
{
|
||||
return memcmp(&a, &b, sizeof(in6_addr)) < 0;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
bool llarp_getifaddr(const char * ifname, int af, struct sockaddr* addr) {
|
||||
|
||||
bool
|
||||
llarp_getifaddr(const char* ifname, int af, struct sockaddr* addr)
|
||||
{
|
||||
ifaddrs* ifa = nullptr;
|
||||
bool found = false;
|
||||
bool found = false;
|
||||
socklen_t sl = sizeof(sockaddr_in6);
|
||||
if (af == AF_INET) sl = sizeof(sockaddr_in);
|
||||
if (af == AF_PACKET) sl = sizeof(sockaddr_ll);
|
||||
if(af == AF_INET)
|
||||
sl = sizeof(sockaddr_in);
|
||||
if(af == AF_PACKET)
|
||||
sl = sizeof(sockaddr_ll);
|
||||
|
||||
if (getifaddrs(&ifa) == -1) return false;
|
||||
if(getifaddrs(&ifa) == -1)
|
||||
return false;
|
||||
ifaddrs* i = ifa;
|
||||
while (i) {
|
||||
if (i->ifa_addr)
|
||||
while(i)
|
||||
{
|
||||
if(i->ifa_addr)
|
||||
{
|
||||
if (llarp::StrEq(i->ifa_name, ifname) && i->ifa_addr->sa_family == af) {
|
||||
if(llarp::StrEq(i->ifa_name, ifname) && i->ifa_addr->sa_family == af)
|
||||
{
|
||||
memcpy(addr, i->ifa_addr, sl);
|
||||
addr->sa_family = af;
|
||||
found = true;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
i = i->ifa_next;
|
||||
}
|
||||
if (ifa) freeifaddrs(ifa);
|
||||
if(ifa)
|
||||
freeifaddrs(ifa);
|
||||
return found;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,23 +1,30 @@
|
||||
#include <llarp/time.h>
|
||||
#include <chrono>
|
||||
|
||||
namespace llarp {
|
||||
typedef std::chrono::steady_clock clock_t;
|
||||
namespace llarp
|
||||
{
|
||||
typedef std::chrono::steady_clock clock_t;
|
||||
|
||||
template <typename Res, typename IntType>
|
||||
static IntType time_since_epoch() {
|
||||
return std::chrono::duration_cast<Res>(
|
||||
llarp::clock_t::now().time_since_epoch())
|
||||
.count();
|
||||
}
|
||||
template < typename Res, typename IntType >
|
||||
static IntType
|
||||
time_since_epoch()
|
||||
{
|
||||
return std::chrono::duration_cast< Res >(
|
||||
llarp::clock_t::now().time_since_epoch())
|
||||
.count();
|
||||
}
|
||||
} // namespace llarp
|
||||
|
||||
extern "C" {
|
||||
llarp_time_t llarp_time_now_ms() {
|
||||
return llarp::time_since_epoch<std::chrono::milliseconds, llarp_time_t>();
|
||||
llarp_time_t
|
||||
llarp_time_now_ms()
|
||||
{
|
||||
return llarp::time_since_epoch< std::chrono::milliseconds, llarp_time_t >();
|
||||
}
|
||||
|
||||
llarp_seconds_t llarp_time_now_sec() {
|
||||
return llarp::time_since_epoch<std::chrono::seconds, llarp_seconds_t>();
|
||||
llarp_seconds_t
|
||||
llarp_time_now_sec()
|
||||
{
|
||||
return llarp::time_since_epoch< std::chrono::seconds, llarp_seconds_t >();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue