2018-05-26 18:31:45 +00:00
|
|
|
#ifndef LLARP_ENCRYPTED_FRAME_HPP
|
|
|
|
#define LLARP_ENCRYPTED_FRAME_HPP
|
|
|
|
|
2019-01-13 22:39:10 +00:00
|
|
|
#include <crypto/encrypted.hpp>
|
2019-01-13 16:30:07 +00:00
|
|
|
#include <crypto/types.hpp>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <util/buffer.hpp>
|
2019-07-30 23:42:13 +00:00
|
|
|
#include <utility>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <util/mem.h>
|
2019-09-01 13:26:16 +00:00
|
|
|
#include <util/thread/threadpool.h>
|
2018-05-26 18:31:45 +00:00
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
{
|
2020-04-07 18:38:56 +00:00
|
|
|
static constexpr size_t EncryptedFrameOverheadSize = PUBKEYSIZE + TUNNONCESIZE + SHORTHASHSIZE;
|
2019-04-29 18:06:16 +00:00
|
|
|
static constexpr size_t EncryptedFrameBodySize = 128 * 6;
|
2020-04-07 18:38:56 +00:00
|
|
|
static constexpr size_t EncryptedFrameSize = EncryptedFrameOverheadSize + EncryptedFrameBodySize;
|
2018-06-21 12:55:02 +00:00
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
struct EncryptedFrame : public Encrypted<EncryptedFrameSize>
|
2018-12-20 16:49:05 +00:00
|
|
|
{
|
|
|
|
EncryptedFrame() : EncryptedFrame(EncryptedFrameBodySize)
|
2018-06-21 12:55:02 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2018-06-14 20:13:07 +00:00
|
|
|
EncryptedFrame(size_t sz)
|
2020-04-07 18:38:56 +00:00
|
|
|
: Encrypted<EncryptedFrameSize>(
|
|
|
|
std::min(sz, EncryptedFrameBodySize) + EncryptedFrameOverheadSize)
|
2018-06-11 13:25:10 +00:00
|
|
|
{
|
2018-06-21 12:55:02 +00:00
|
|
|
}
|
|
|
|
|
2019-02-19 15:06:39 +00:00
|
|
|
void
|
|
|
|
Resize(size_t sz)
|
|
|
|
{
|
2020-04-07 18:38:56 +00:00
|
|
|
if (sz <= EncryptedFrameSize)
|
2019-02-19 15:06:39 +00:00
|
|
|
{
|
|
|
|
_sz = sz;
|
|
|
|
UpdateBuffer();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-04 18:31:17 +00:00
|
|
|
bool
|
|
|
|
DoEncrypt(const SharedSecret& shared, bool noDH = false);
|
|
|
|
|
2018-06-10 14:05:48 +00:00
|
|
|
bool
|
2019-05-28 19:45:08 +00:00
|
|
|
DecryptInPlace(const SecretKey& seckey);
|
2018-06-11 13:25:10 +00:00
|
|
|
|
2019-06-04 18:31:17 +00:00
|
|
|
bool
|
|
|
|
DoDecrypt(const SharedSecret& shared);
|
|
|
|
|
2018-06-11 13:25:10 +00:00
|
|
|
bool
|
2019-05-28 19:45:08 +00:00
|
|
|
EncryptInPlace(const SecretKey& seckey, const PubKey& other);
|
2018-06-10 14:05:48 +00:00
|
|
|
};
|
|
|
|
|
2019-01-02 01:04:04 +00:00
|
|
|
/// TODO: can only handle 1 frame at a time
|
2020-04-07 18:38:56 +00:00
|
|
|
template <typename User>
|
2018-06-10 14:05:48 +00:00
|
|
|
struct AsyncFrameDecrypter
|
|
|
|
{
|
2020-04-07 18:38:56 +00:00
|
|
|
using User_ptr = std::shared_ptr<User>;
|
|
|
|
using DecryptHandler = std::function<void(llarp_buffer_t*, User_ptr)>;
|
2018-06-10 14:05:48 +00:00
|
|
|
|
2019-11-19 20:53:36 +00:00
|
|
|
void
|
|
|
|
Decrypt(User_ptr user)
|
2018-06-10 14:05:48 +00:00
|
|
|
{
|
2020-04-07 18:38:56 +00:00
|
|
|
if (target.DecryptInPlace(seckey))
|
2018-06-21 12:55:02 +00:00
|
|
|
{
|
2019-11-19 20:53:36 +00:00
|
|
|
auto buf = target.Buffer();
|
2018-12-20 16:49:05 +00:00
|
|
|
buf->cur = buf->base + EncryptedFrameOverheadSize;
|
2019-11-19 20:53:36 +00:00
|
|
|
result(buf, user);
|
2018-06-21 12:55:02 +00:00
|
|
|
}
|
2018-06-10 14:05:48 +00:00
|
|
|
else
|
2019-11-19 20:53:36 +00:00
|
|
|
result(nullptr, user);
|
2018-06-10 14:05:48 +00:00
|
|
|
}
|
|
|
|
|
2019-05-28 19:45:08 +00:00
|
|
|
AsyncFrameDecrypter(const SecretKey& secretkey, DecryptHandler h)
|
2019-07-30 23:42:13 +00:00
|
|
|
: result(std::move(h)), seckey(secretkey)
|
2018-06-10 14:05:48 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
DecryptHandler result;
|
2019-01-02 01:04:04 +00:00
|
|
|
const SecretKey& seckey;
|
2018-12-20 16:49:05 +00:00
|
|
|
EncryptedFrame target;
|
2018-06-20 12:34:48 +00:00
|
|
|
|
2018-06-10 14:05:48 +00:00
|
|
|
void
|
2020-04-07 18:38:56 +00:00
|
|
|
AsyncDecrypt(
|
|
|
|
const std::shared_ptr<thread::ThreadPool>& worker, const EncryptedFrame& frame, User_ptr u)
|
2018-06-10 14:05:48 +00:00
|
|
|
{
|
2019-04-30 12:22:15 +00:00
|
|
|
target = frame;
|
2020-04-07 18:38:56 +00:00
|
|
|
worker->addJob(std::bind(&AsyncFrameDecrypter<User>::Decrypt, this, std::move(u)));
|
2018-06-10 14:05:48 +00:00
|
|
|
}
|
|
|
|
};
|
2018-06-14 20:13:07 +00:00
|
|
|
} // namespace llarp
|
2018-05-26 18:31:45 +00:00
|
|
|
|
|
|
|
#endif
|