Compare commits
No commits in common. "7397a0d02b190887d2e45e3eb2c225af72e46dd3" and "dd6551ed27591cc8e3eabea2064798fb934eae8f" have entirely different histories.
7397a0d02b
...
dd6551ed27
21
LICENSE
21
LICENSE
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Erik Scholz
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <solanaceae/contact/fwd.hpp>
|
||||
#include <solanaceae/contact/contact_model3.hpp>
|
||||
#include <solanaceae/util/event_provider.hpp>
|
||||
#include <solanaceae/util/span.hpp>
|
||||
|
||||
@ -98,7 +98,7 @@ namespace P2PRNG::Events {
|
||||
// fired when a secret does not match the hmac
|
||||
struct ValError {
|
||||
const ByteSpan id;
|
||||
Contact4 c;
|
||||
Contact3 c;
|
||||
// TODO: more info?
|
||||
};
|
||||
|
||||
@ -136,9 +136,9 @@ struct P2PRNGI : public P2PRNGEventProviderI {
|
||||
|
||||
// returns unique id, you can then use when listen to events
|
||||
// chooses peers depending on C, if C is a group it (tries?) to use everyone?
|
||||
virtual std::vector<uint8_t> newGernation(ContactHandle4 c, const ByteSpan initial_state_user_data) = 0;
|
||||
virtual std::vector<uint8_t> newGernation(Contact3Handle c, const ByteSpan initial_state_user_data) = 0;
|
||||
// manually tell it which peers to use
|
||||
virtual std::vector<uint8_t> newGernationPeers(const std::vector<ContactHandle4>& c_vec, const ByteSpan initial_state_user_data) = 0;
|
||||
virtual std::vector<uint8_t> newGernationPeers(const std::vector<Contact3Handle>& c_vec, const ByteSpan initial_state_user_data) = 0;
|
||||
|
||||
|
||||
// TODO: do we really need this, or are event enough??
|
||||
|
@ -5,9 +5,6 @@
|
||||
#include <solanaceae/toxcore/tox_interface.hpp>
|
||||
#include <solanaceae/util/utils.hpp>
|
||||
|
||||
#include <entt/entity/registry.hpp>
|
||||
#include <entt/entity/handle.hpp>
|
||||
|
||||
#include <sodium.h>
|
||||
|
||||
#include <iostream>
|
||||
@ -41,7 +38,7 @@
|
||||
#define TOX_PKG_ID_FRIEND 0xB1
|
||||
#define TOX_PKG_ID_GROUP 0xa6
|
||||
|
||||
ContactHandle4 ToxP2PRNG::RngState::getSelf(void) const {
|
||||
Contact3Handle ToxP2PRNG::RngState::getSelf(void) const {
|
||||
for (auto c : contacts) {
|
||||
if (c.all_of<Contact::Components::TagSelfStrong>()) {
|
||||
return c;
|
||||
@ -171,7 +168,7 @@ void ToxP2PRNG::checkHaveAllHMACs(RngState* rng_state, const ByteSpan id) {
|
||||
// we should also validate any secret that already is in storage
|
||||
|
||||
// validate existing (self should be good)
|
||||
std::vector<Contact4> bad_secrets;
|
||||
std::vector<Contact3> bad_secrets;
|
||||
for (const auto& [pre_c, secret] : rng_state->secrets) {
|
||||
const auto& pre_hmac = rng_state->hmacs.at(pre_c);
|
||||
if (p2prng_auth_verify(secret.data()+P2PRNG_LEN, pre_hmac.data(), secret.data(), P2PRNG_LEN) != 0) {
|
||||
@ -197,7 +194,7 @@ void ToxP2PRNG::checkHaveAllHMACs(RngState* rng_state, const ByteSpan id) {
|
||||
}
|
||||
|
||||
// find self contact
|
||||
ContactHandle4 self = rng_state->getSelf();
|
||||
Contact3Handle self = rng_state->getSelf();
|
||||
if (!static_cast<bool>(self)) {
|
||||
std::cerr << "TP2PRNG error: failed to look up self\n";
|
||||
return;
|
||||
@ -273,13 +270,13 @@ ToxP2PRNG::ToxP2PRNG(
|
||||
ToxP2PRNG::~ToxP2PRNG(void) {
|
||||
}
|
||||
|
||||
std::vector<uint8_t> ToxP2PRNG::newGernation(ContactHandle4 c, const ByteSpan initial_state_user_data) {
|
||||
std::vector<uint8_t> ToxP2PRNG::newGernation(Contact3Handle c, const ByteSpan initial_state_user_data) {
|
||||
(void)c;
|
||||
(void)initial_state_user_data;
|
||||
return {};
|
||||
}
|
||||
|
||||
std::vector<uint8_t> ToxP2PRNG::newGernationPeers(const std::vector<ContactHandle4>& c_vec, const ByteSpan initial_state_user_data) {
|
||||
std::vector<uint8_t> ToxP2PRNG::newGernationPeers(const std::vector<Contact3Handle>& c_vec, const ByteSpan initial_state_user_data) {
|
||||
if (initial_state_user_data.empty()) {
|
||||
return {};
|
||||
}
|
||||
@ -405,7 +402,7 @@ ByteSpan ToxP2PRNG::getResult(const ByteSpan id_bytes) {
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::handlePacket(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
PKG pkg_type,
|
||||
ByteSpan data
|
||||
) {
|
||||
@ -489,7 +486,7 @@ bool ToxP2PRNG::handleGroupPacket(
|
||||
|
||||
#define _DATA_HAVE(x, error) if ((data.size - curser) < (x)) { error; }
|
||||
|
||||
bool ToxP2PRNG::handle_init_with_hmac(ContactHandle4 c, const ByteSpan id, ByteSpan data) {
|
||||
bool ToxP2PRNG::handle_init_with_hmac(Contact3Handle c, const ByteSpan id, ByteSpan data) {
|
||||
std::cerr << "TP2PRNG: got packet INIT_WITH_HMAC\n";
|
||||
|
||||
if (data.size < sizeof(uint16_t) + ToxKey{}.size() + 1) {
|
||||
@ -556,7 +553,7 @@ bool ToxP2PRNG::handle_init_with_hmac(ContactHandle4 c, const ByteSpan id, ByteS
|
||||
|
||||
// else, its new
|
||||
// first resolve peer keys to contacts
|
||||
std::vector<ContactHandle4> peer_contacts;
|
||||
std::vector<Contact3Handle> peer_contacts;
|
||||
if (c.all_of<Contact::Components::ToxFriendEphemeral>()) {
|
||||
// assuming a 1to1 can only have 2 peers
|
||||
assert(peers.size() == 2);
|
||||
@ -564,7 +561,7 @@ bool ToxP2PRNG::handle_init_with_hmac(ContactHandle4 c, const ByteSpan id, ByteS
|
||||
// TODO: accel lookup
|
||||
for (const auto& [find_c, tfp] : c.registry()->view<Contact::Components::ToxFriendPersistent>().each()) {
|
||||
if (tfp.key == peer_key) {
|
||||
peer_contacts.push_back(ContactHandle4{*c.registry(), find_c});
|
||||
peer_contacts.push_back(Contact3Handle{*c.registry(), find_c});
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -578,7 +575,7 @@ bool ToxP2PRNG::handle_init_with_hmac(ContactHandle4 c, const ByteSpan id, ByteS
|
||||
// TODO: accel lookup
|
||||
for (const auto& [find_c, tgpp] : c.registry()->view<Contact::Components::ToxGroupPeerPersistent>().each()) {
|
||||
if (tgpp.peer_key == peer_key) {
|
||||
peer_contacts.push_back(ContactHandle4{*c.registry(), find_c});
|
||||
peer_contacts.push_back(Contact3Handle{*c.registry(), find_c});
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -669,7 +666,7 @@ bool ToxP2PRNG::handle_init_with_hmac(ContactHandle4 c, const ByteSpan id, ByteS
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::handle_hmac(ContactHandle4 c, const ByteSpan id, ByteSpan data) {
|
||||
bool ToxP2PRNG::handle_hmac(Contact3Handle c, const ByteSpan id, ByteSpan data) {
|
||||
std::cerr << "TP2PRNG: got packet HMAC\n";
|
||||
|
||||
if (data.size < P2PRNG_MAC_LEN) {
|
||||
@ -722,7 +719,7 @@ bool ToxP2PRNG::handle_hmac(ContactHandle4 c, const ByteSpan id, ByteSpan data)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::handle_hmac_request(ContactHandle4 c, const ByteSpan id, ByteSpan data) {
|
||||
bool ToxP2PRNG::handle_hmac_request(Contact3Handle c, const ByteSpan id, ByteSpan data) {
|
||||
std::cerr << "TP2PRNG: got packet HMAC_REQUEST\n";
|
||||
|
||||
if (!data.empty()) {
|
||||
@ -737,7 +734,7 @@ bool ToxP2PRNG::handle_hmac_request(ContactHandle4 c, const ByteSpan id, ByteSpa
|
||||
// no state check necessary
|
||||
|
||||
// find self contact
|
||||
ContactHandle4 self = rng_state->getSelf();
|
||||
Contact3Handle self = rng_state->getSelf();
|
||||
|
||||
if (!static_cast<bool>(self)) {
|
||||
std::cerr << "TP2PRNG error: failed to look up self\n";
|
||||
@ -757,7 +754,7 @@ bool ToxP2PRNG::handle_hmac_request(ContactHandle4 c, const ByteSpan id, ByteSpa
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::handle_secret(ContactHandle4 c, const ByteSpan id, ByteSpan data) {
|
||||
bool ToxP2PRNG::handle_secret(Contact3Handle c, const ByteSpan id, ByteSpan data) {
|
||||
std::cerr << "TP2PRNG: got packet SECRET\n";
|
||||
|
||||
if (data.size < P2PRNG_LEN + P2PRNG_MAC_KEY_LEN) {
|
||||
@ -838,7 +835,7 @@ bool ToxP2PRNG::handle_secret(ContactHandle4 c, const ByteSpan id, ByteSpan data
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::handle_secret_request(ContactHandle4 c, const ByteSpan id, ByteSpan data) {
|
||||
bool ToxP2PRNG::handle_secret_request(Contact3Handle c, const ByteSpan id, ByteSpan data) {
|
||||
std::cerr << "TP2PRNG: got packet SECRET_REQUEST\n";
|
||||
|
||||
if (!data.empty()) {
|
||||
@ -856,7 +853,7 @@ bool ToxP2PRNG::handle_secret_request(ContactHandle4 c, const ByteSpan id, ByteS
|
||||
}
|
||||
|
||||
// find self contact
|
||||
ContactHandle4 self = rng_state->getSelf();
|
||||
Contact3Handle self = rng_state->getSelf();
|
||||
|
||||
if (!static_cast<bool>(self)) {
|
||||
std::cerr << "TP2PRNG error: failed to look up self\n";
|
||||
@ -878,7 +875,7 @@ bool ToxP2PRNG::handle_secret_request(ContactHandle4 c, const ByteSpan id, ByteS
|
||||
return true;
|
||||
}
|
||||
|
||||
static std::tuple<std::vector<uint8_t>, const Contact::Components::ToxFriendEphemeral*, const Contact::Components::ToxGroupPeerEphemeral*> prepSendPkgWithID(ContactHandle4 c, ToxP2PRNG::PKG pkg_type, ByteSpan id) {
|
||||
static std::tuple<std::vector<uint8_t>, const Contact::Components::ToxFriendEphemeral*, const Contact::Components::ToxGroupPeerEphemeral*> prepSendPkgWithID(Contact3Handle c, ToxP2PRNG::PKG pkg_type, ByteSpan id) {
|
||||
std::vector<uint8_t> pkg;
|
||||
|
||||
// determine friend or group (meh)
|
||||
@ -928,9 +925,9 @@ static bool sendToxPrivatePacket(
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::send_init_with_hmac(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
const ByteSpan id,
|
||||
const std::vector<ContactHandle4>& peers,
|
||||
const std::vector<Contact3Handle>& peers,
|
||||
const ByteSpan initial_state,
|
||||
const ByteSpan hmac
|
||||
) {
|
||||
@ -975,7 +972,7 @@ bool ToxP2PRNG::send_init_with_hmac(
|
||||
return sendToxPrivatePacket(_t, tfe, tgpe, pkg);
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::send_hmac(ContactHandle4 c, ByteSpan id, const ByteSpan hmac) {
|
||||
bool ToxP2PRNG::send_hmac(Contact3Handle c, ByteSpan id, const ByteSpan hmac) {
|
||||
auto [pkg, tfe, tgpe] = prepSendPkgWithID(c, PKG::HMAC, id);
|
||||
if (pkg.empty()) {
|
||||
return false;
|
||||
@ -989,7 +986,7 @@ bool ToxP2PRNG::send_hmac(ContactHandle4 c, ByteSpan id, const ByteSpan hmac) {
|
||||
return sendToxPrivatePacket(_t, tfe, tgpe, pkg);
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::send_hmac_request(ContactHandle4 c, ByteSpan id) {
|
||||
bool ToxP2PRNG::send_hmac_request(Contact3Handle c, ByteSpan id) {
|
||||
auto [pkg, tfe, tgpe] = prepSendPkgWithID(c, PKG::HMAC_REQUEST, id);
|
||||
if (pkg.empty()) {
|
||||
return false;
|
||||
@ -1000,7 +997,7 @@ bool ToxP2PRNG::send_hmac_request(ContactHandle4 c, ByteSpan id) {
|
||||
return sendToxPrivatePacket(_t, tfe, tgpe, pkg);
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::send_secret(ContactHandle4 c, ByteSpan id, const ByteSpan secret) {
|
||||
bool ToxP2PRNG::send_secret(Contact3Handle c, ByteSpan id, const ByteSpan secret) {
|
||||
auto [pkg, tfe, tgpe] = prepSendPkgWithID(c, PKG::SECRET, id);
|
||||
if (pkg.empty()) {
|
||||
return false;
|
||||
@ -1014,7 +1011,7 @@ bool ToxP2PRNG::send_secret(ContactHandle4 c, ByteSpan id, const ByteSpan secret
|
||||
return sendToxPrivatePacket(_t, tfe, tgpe, pkg);
|
||||
}
|
||||
|
||||
bool ToxP2PRNG::send_secret_request(ContactHandle4 c, ByteSpan id) {
|
||||
bool ToxP2PRNG::send_secret_request(Contact3Handle c, ByteSpan id) {
|
||||
auto [pkg, tfe, tgpe] = prepSendPkgWithID(c, PKG::SECRET_REQUEST, id);
|
||||
if (pkg.empty()) {
|
||||
return false;
|
||||
@ -1025,7 +1022,7 @@ bool ToxP2PRNG::send_secret_request(ContactHandle4 c, ByteSpan id) {
|
||||
return sendToxPrivatePacket(_t, tfe, tgpe, pkg);
|
||||
}
|
||||
|
||||
ToxP2PRNG::RngState* ToxP2PRNG::getRngSate(ContactHandle4 c, ByteSpan id_bytes) {
|
||||
ToxP2PRNG::RngState* ToxP2PRNG::getRngSate(Contact3Handle c, ByteSpan id_bytes) {
|
||||
if (id_bytes.size != ID{}.size()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -36,8 +36,8 @@ class ToxP2PRNG : public P2PRNGI, public ToxEventI {
|
||||
private:
|
||||
struct RngState {
|
||||
// all contacts participating, including self
|
||||
std::vector<ContactHandle4> contacts;
|
||||
ContactHandle4 getSelf(void) const;
|
||||
std::vector<Contact3Handle> contacts;
|
||||
Contact3Handle getSelf(void) const;
|
||||
|
||||
// app given
|
||||
std::vector<uint8_t> initial_state;
|
||||
@ -49,8 +49,8 @@ class ToxP2PRNG : public P2PRNGI, public ToxEventI {
|
||||
void fillInitalStatePreamble(const ByteSpan id);
|
||||
|
||||
// use contacts instead?
|
||||
entt::dense_map<Contact4, std::array<uint8_t, P2PRNG_MAC_LEN>> hmacs;
|
||||
entt::dense_map<Contact4, std::array<uint8_t, P2PRNG_LEN + P2PRNG_MAC_KEY_LEN>> secrets;
|
||||
entt::dense_map<Contact3, std::array<uint8_t, P2PRNG_MAC_LEN>> hmacs;
|
||||
entt::dense_map<Contact3, std::array<uint8_t, P2PRNG_LEN + P2PRNG_MAC_KEY_LEN>> secrets;
|
||||
|
||||
void genFinalResult(void);
|
||||
|
||||
@ -72,15 +72,15 @@ class ToxP2PRNG : public P2PRNGI, public ToxEventI {
|
||||
~ToxP2PRNG(void);
|
||||
|
||||
public: // p2prng
|
||||
std::vector<uint8_t> newGernation(ContactHandle4 c, const ByteSpan initial_state_user_data) override;
|
||||
std::vector<uint8_t> newGernationPeers(const std::vector<ContactHandle4>& c_vec, const ByteSpan initial_state_user_data) override;
|
||||
std::vector<uint8_t> newGernation(Contact3Handle c, const ByteSpan initial_state_user_data) override;
|
||||
std::vector<uint8_t> newGernationPeers(const std::vector<Contact3Handle>& c_vec, const ByteSpan initial_state_user_data) override;
|
||||
|
||||
P2PRNG::State getSate(const ByteSpan id) override;
|
||||
ByteSpan getResult(const ByteSpan id) override;
|
||||
|
||||
protected:
|
||||
bool handlePacket(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
PKG pkg_type,
|
||||
ByteSpan data
|
||||
);
|
||||
@ -96,43 +96,42 @@ class ToxP2PRNG : public P2PRNGI, public ToxEventI {
|
||||
const bool _private
|
||||
);
|
||||
|
||||
bool handle_init_with_hmac(ContactHandle4 c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_hmac(ContactHandle4 c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_hmac_request(ContactHandle4 c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_secret(ContactHandle4 c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_secret_request(ContactHandle4 c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_init_with_hmac(Contact3Handle c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_hmac(Contact3Handle c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_hmac_request(Contact3Handle c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_secret(Contact3Handle c, const ByteSpan id, ByteSpan data);
|
||||
bool handle_secret_request(Contact3Handle c, const ByteSpan id, ByteSpan data);
|
||||
|
||||
bool send_init_with_hmac(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
const ByteSpan id,
|
||||
const std::vector<ContactHandle4>& peers,
|
||||
const std::vector<Contact3Handle>& peers,
|
||||
const ByteSpan initial_state,
|
||||
const ByteSpan hmac
|
||||
);
|
||||
bool send_hmac(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
const ByteSpan id,
|
||||
const ByteSpan hmac
|
||||
);
|
||||
bool send_hmac_request(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
const ByteSpan id
|
||||
);
|
||||
bool send_secret(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
const ByteSpan id,
|
||||
const ByteSpan secret
|
||||
);
|
||||
bool send_secret_request(
|
||||
ContactHandle4 c,
|
||||
Contact3Handle c,
|
||||
const ByteSpan id
|
||||
);
|
||||
|
||||
RngState* getRngSate(ContactHandle4 c, ByteSpan id);
|
||||
RngState* getRngSate(Contact3Handle c, ByteSpan id);
|
||||
|
||||
protected:
|
||||
bool onToxEvent(const Tox_Event_Friend_Lossless_Packet* e) override;
|
||||
bool onToxEvent(const Tox_Event_Group_Custom_Packet* e) override;
|
||||
bool onToxEvent(const Tox_Event_Group_Custom_Private_Packet* e) override;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user