1
1
Fork 0
mirror of https://github.com/oxen-io/lokinet synced 2023-12-14 06:53:00 +01:00
lokinet/include/llarp/encrypted_frame.hpp

115 lines
2.8 KiB
C++
Raw Normal View History

#ifndef LLARP_ENCRYPTED_FRAME_HPP
#define LLARP_ENCRYPTED_FRAME_HPP
2018-06-10 16:05:48 +02:00
#include <llarp/crypto.h>
#include <llarp/mem.h>
2018-06-10 16:05:48 +02:00
#include <llarp/threadpool.h>
2018-06-11 15:25:10 +02:00
#include <llarp/encrypted.hpp>
namespace llarp
{
2018-06-11 15:25:10 +02:00
struct EncryptedFrame : public Encrypted
2018-06-10 16:05:48 +02:00
{
2018-06-11 15:25:10 +02:00
EncryptedFrame() = default;
EncryptedFrame(byte_t* buf, size_t sz) : Encrypted(buf, sz)
{
}
2018-06-14 22:13:07 +02:00
EncryptedFrame(size_t sz)
: Encrypted(sz + PUBKEYSIZE + TUNNONCESIZE + SHORTHASHSIZE)
2018-06-11 15:25:10 +02:00
{
}
2018-06-10 16:05:48 +02:00
bool
2018-06-11 15:25:10 +02:00
DecryptInPlace(byte_t* seckey, llarp_crypto* crypto);
bool
2018-06-11 15:44:49 +02:00
EncryptInPlace(byte_t* seckey, byte_t* other, llarp_crypto* crypto);
2018-06-11 15:25:10 +02:00
};
/// TOOD: can only handle 1 frame at a time
template < typename User >
struct AsyncFrameEncrypter
{
typedef void (*EncryptHandler)(EncryptedFrame*, User*);
2018-06-10 16:05:48 +02:00
2018-06-11 15:25:10 +02:00
static void
Encrypt(void* user)
2018-06-10 16:05:48 +02:00
{
2018-06-11 15:25:10 +02:00
AsyncFrameEncrypter< User >* ctx =
static_cast< AsyncFrameEncrypter< User >* >(user);
2018-06-11 15:44:49 +02:00
if(ctx->frame->EncryptInPlace(ctx->seckey, ctx->otherKey, ctx->crypto))
2018-06-11 15:25:10 +02:00
ctx->handler(ctx->frame, ctx->user);
else
{
delete ctx->frame;
ctx->handler(nullptr, ctx->user);
}
2018-06-10 16:05:48 +02:00
}
2018-06-11 15:25:10 +02:00
llarp_crypto* crypto;
byte_t* secretkey;
EncryptHandler handler;
EncryptedFrame* frame;
User* user;
2018-06-11 15:44:49 +02:00
byte_t* otherKey;
2018-06-11 15:25:10 +02:00
AsyncFrameEncrypter(llarp_crypto* c, byte_t* seckey, EncryptHandler h)
: crypto(c), secretkey(seckey), handler(h)
{
}
void
2018-06-11 15:44:49 +02:00
AsyncEncrypt(llarp_threadpool* worker, llarp_buffer_t buf, byte_t* other,
User* u)
2018-06-11 15:25:10 +02:00
{
2018-06-11 15:44:49 +02:00
// TODO: should we own otherKey?
otherKey = other;
frame = new EncryptedFrame(buf.sz);
2018-06-14 22:13:07 +02:00
memcpy(frame->data + PUBKEYSIZE + TUNNONCESIZE + SHORTHASHSIZE, buf.base,
buf.sz);
2018-06-11 15:25:10 +02:00
user = u;
llarp_threadpool_queue_job(worker, {this, &Encrypt});
}
2018-06-10 16:05:48 +02:00
};
2018-06-11 15:25:10 +02:00
/// TOOD: can only handle 1 frame at a time
2018-06-10 16:05:48 +02:00
template < typename User >
struct AsyncFrameDecrypter
{
typedef void (*DecryptHandler)(llarp_buffer_t*, User*);
static void
Decrypt(void* user)
{
AsyncFrameDecrypter< User >* ctx =
static_cast< AsyncFrameDecrypter< User >* >(user);
if(ctx->target->DecryptInPlace(ctx->seckey, ctx->crypto))
ctx->result(ctx->target->Buffer(), ctx->context);
else
ctx->result(nullptr, ctx->context);
}
2018-06-11 15:25:10 +02:00
AsyncFrameDecrypter(llarp_crypto* c, byte_t* secretkey, DecryptHandler h)
2018-06-10 16:05:48 +02:00
: result(h), crypto(c), seckey(secretkey)
{
}
DecryptHandler result;
User* context;
llarp_crypto* crypto;
2018-06-11 15:25:10 +02:00
byte_t* seckey;
2018-06-10 16:05:48 +02:00
EncryptedFrame* target;
void
AsyncDecrypt(llarp_threadpool* worker, EncryptedFrame* frame, User* user)
{
target = frame;
context = user;
llarp_threadpool_queue_job(worker, {this, &Decrypt});
}
};
2018-06-14 22:13:07 +02:00
} // namespace llarp
#endif