mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-20 13:33:13 -07:00
Nagare receive bang
This commit is contained in:
parent
0b3ce4725d
commit
587fc0ea69
2 changed files with 93 additions and 10 deletions
|
@ -41,6 +41,7 @@
|
||||||
static void nagare_takion_data(uint8_t *buf, size_t buf_size, void *user);
|
static void nagare_takion_data(uint8_t *buf, size_t buf_size, void *user);
|
||||||
static ChiakiErrorCode nagare_send_big(ChiakiNagare *nagare);
|
static ChiakiErrorCode nagare_send_big(ChiakiNagare *nagare);
|
||||||
static ChiakiErrorCode nagare_send_disconnect(ChiakiNagare *nagare);
|
static ChiakiErrorCode nagare_send_disconnect(ChiakiNagare *nagare);
|
||||||
|
static void nagare_handle_bang(ChiakiNagare *nagare, tkproto_BangPayload *payload);
|
||||||
|
|
||||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_nagare_run(ChiakiSession *session)
|
CHIAKI_EXPORT ChiakiErrorCode chiaki_nagare_run(ChiakiSession *session)
|
||||||
{
|
{
|
||||||
|
@ -120,11 +121,18 @@ error_bang_mirai:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void nagare_takion_data_expect_bang(ChiakiNagare *nagare, uint8_t *buf, size_t buf_size);
|
||||||
|
|
||||||
static void nagare_takion_data(uint8_t *buf, size_t buf_size, void *user)
|
static void nagare_takion_data(uint8_t *buf, size_t buf_size, void *user)
|
||||||
{
|
{
|
||||||
ChiakiNagare *nagare = user;
|
ChiakiNagare *nagare = user;
|
||||||
|
|
||||||
|
if(nagare->bang_mirai.expected)
|
||||||
|
{
|
||||||
|
nagare_takion_data_expect_bang(nagare, buf, buf_size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
tkproto_TakionMessage msg;
|
tkproto_TakionMessage msg;
|
||||||
memset(&msg, 0, sizeof(msg));
|
memset(&msg, 0, sizeof(msg));
|
||||||
|
|
||||||
|
@ -135,17 +143,67 @@ static void nagare_takion_data(uint8_t *buf, size_t buf_size, void *user)
|
||||||
CHIAKI_LOGE(nagare->log, "Nagare failed to decode data protobuf\n");
|
CHIAKI_LOGE(nagare->log, "Nagare failed to decode data protobuf\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(nagare->bang_mirai.expected)
|
static void nagare_takion_data_expect_bang(ChiakiNagare *nagare, uint8_t *buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
|
char ecdh_pub_key[128];
|
||||||
|
ChiakiPBDecodeBuf ecdh_pub_key_buf = { sizeof(ecdh_pub_key), 0, ecdh_pub_key };
|
||||||
|
char ecdh_sig[32];
|
||||||
|
ChiakiPBDecodeBuf ecdh_sig_buf = { sizeof(ecdh_sig), 0, ecdh_sig };
|
||||||
|
|
||||||
|
tkproto_TakionMessage msg;
|
||||||
|
memset(&msg, 0, sizeof(msg));
|
||||||
|
|
||||||
|
msg.bang_payload.ecdh_pub_key.arg = &ecdh_pub_key_buf;
|
||||||
|
msg.bang_payload.ecdh_pub_key.funcs.decode = chiaki_pb_decode_buf;
|
||||||
|
msg.bang_payload.ecdh_sig.arg = &ecdh_sig_buf;
|
||||||
|
msg.bang_payload.ecdh_sig.funcs.decode = chiaki_pb_decode_buf;
|
||||||
|
|
||||||
|
pb_istream_t stream = pb_istream_from_buffer(buf, buf_size);
|
||||||
|
bool r = pb_decode(&stream, tkproto_TakionMessage_fields, &msg);
|
||||||
|
if(!r)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(nagare->log, "Nagare failed to decode data protobuf\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(msg.type != tkproto_TakionMessage_PayloadType_BANG || !msg.has_bang_payload)
|
if(msg.type != tkproto_TakionMessage_PayloadType_BANG || !msg.has_bang_payload)
|
||||||
{
|
{
|
||||||
CHIAKI_LOGE(nagare->log, "Nagare expected bang payload but received something else\n");
|
CHIAKI_LOGE(nagare->log, "Nagare expected bang payload but received something else\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!msg.bang_payload.version_accepted)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(nagare->log, "Nagare bang remote didn't accept version\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!msg.bang_payload.encrypted_key_accepted)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(nagare->log, "Nagare bang remote didn't accept encrypted key\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ecdh_pub_key_buf.size)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(nagare->log, "Nagare didn't get remote ECDH pub key from bang\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ecdh_sig_buf.size)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(nagare->log, "Nagare didn't get remote ECDH sig from bang\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
CHIAKI_LOGI(nagare->log, "Nagare bang looks good so far\n");
|
||||||
|
|
||||||
|
error:
|
||||||
chiaki_mirai_signal(&nagare->bang_mirai, true);
|
chiaki_mirai_signal(&nagare->bang_mirai, true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool chiaki_pb_encode_zero_encrypted_key(pb_ostream_t *stream, const pb_field_t *field, void *const *arg)
|
static bool chiaki_pb_encode_zero_encrypted_key(pb_ostream_t *stream, const pb_field_t *field, void *const *arg)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define CHIAKI_PB_UTILS_H
|
#define CHIAKI_PB_UTILS_H
|
||||||
|
|
||||||
#include <pb_encode.h>
|
#include <pb_encode.h>
|
||||||
|
#include <pb_decode.h>
|
||||||
|
|
||||||
static bool chiaki_pb_encode_string(pb_ostream_t *stream, const pb_field_t *field, void *const *arg)
|
static bool chiaki_pb_encode_string(pb_ostream_t *stream, const pb_field_t *field, void *const *arg)
|
||||||
{
|
{
|
||||||
|
@ -47,4 +48,28 @@ static bool chiaki_pb_encode_buf(pb_ostream_t *stream, const pb_field_t *field,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct chiaki_pb_decode_buf_t
|
||||||
|
{
|
||||||
|
size_t max_size;
|
||||||
|
size_t size;
|
||||||
|
uint8_t *buf;
|
||||||
|
} ChiakiPBDecodeBuf;
|
||||||
|
|
||||||
|
static bool chiaki_pb_decode_buf(pb_istream_t *stream, const pb_field_t *field, void **arg)
|
||||||
|
{
|
||||||
|
ChiakiPBDecodeBuf *buf = *arg;
|
||||||
|
if(stream->bytes_left > buf->max_size)
|
||||||
|
{
|
||||||
|
buf->size = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf->size = stream->bytes_left;
|
||||||
|
bool r = pb_read(stream, buf->buf, buf->size);
|
||||||
|
if(!r)
|
||||||
|
buf->size = 0;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif // CHIAKI_PB_UTILS_H
|
#endif // CHIAKI_PB_UTILS_H
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue