mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-19 21:13:12 -07:00
Init Crypt in StreamConnection Bang Handler
This commit is contained in:
parent
74f2592a08
commit
7c8a8bc600
1 changed files with 32 additions and 22 deletions
|
@ -171,34 +171,13 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_stream_connection_run(ChiakiStreamConnectio
|
||||||
if(err == CHIAKI_ERR_TIMEOUT)
|
if(err == CHIAKI_ERR_TIMEOUT)
|
||||||
CHIAKI_LOGE(&session->log, "StreamConnection bang receive timeout\n");
|
CHIAKI_LOGE(&session->log, "StreamConnection bang receive timeout\n");
|
||||||
|
|
||||||
CHIAKI_LOGE(&session->log, "StreamConnection didn't receive bang\n");
|
CHIAKI_LOGE(&session->log, "StreamConnection didn't receive bang or failed to handle it\n");
|
||||||
err = CHIAKI_ERR_UNKNOWN;
|
err = CHIAKI_ERR_UNKNOWN;
|
||||||
goto disconnect;
|
goto disconnect;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHIAKI_LOGI(&session->log, "StreamConnection successfully received bang\n");
|
CHIAKI_LOGI(&session->log, "StreamConnection successfully received bang\n");
|
||||||
|
|
||||||
|
|
||||||
stream_connection->gkcrypt_local = chiaki_gkcrypt_new(&session->log, 0 /* TODO */, 2, session->handshake_key, stream_connection->ecdh_secret);
|
|
||||||
if(!stream_connection->gkcrypt_local)
|
|
||||||
{
|
|
||||||
CHIAKI_LOGE(&session->log, "StreamConnection failed to initialize GKCrypt with index 2\n");
|
|
||||||
goto disconnect;
|
|
||||||
}
|
|
||||||
stream_connection->gkcrypt_remote = chiaki_gkcrypt_new(&session->log, 0 /* TODO */, 3, session->handshake_key, stream_connection->ecdh_secret);
|
|
||||||
if(!stream_connection->gkcrypt_remote)
|
|
||||||
{
|
|
||||||
CHIAKI_LOGE(&session->log, "StreamConnection failed to initialize GKCrypt with index 3\n");
|
|
||||||
goto disconnect;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: IMPORTANT!!!
|
|
||||||
// This all needs to be synchronized correctly!!!
|
|
||||||
// After receiving the bang, we MUST wait for the gkcrypts to be set before handling any new takion packets!
|
|
||||||
// Otherwise we might ignore some macs.
|
|
||||||
// Also, access to the gkcrypts must be synchronized for key_pos and everything.
|
|
||||||
chiaki_takion_set_crypt(&stream_connection->takion, stream_connection->gkcrypt_local, stream_connection->gkcrypt_remote);
|
|
||||||
|
|
||||||
stream_connection->state = STATE_EXPECT_STREAMINFO;
|
stream_connection->state = STATE_EXPECT_STREAMINFO;
|
||||||
stream_connection->state_finished = false;
|
stream_connection->state_finished = false;
|
||||||
stream_connection->state_failed = false;
|
stream_connection->state_failed = false;
|
||||||
|
@ -329,6 +308,30 @@ static void stream_connection_takion_data_idle(ChiakiStreamConnection *stream_co
|
||||||
//chiaki_log_hexdump(stream_connection->log, CHIAKI_LOG_DEBUG, buf, buf_size);
|
//chiaki_log_hexdump(stream_connection->log, CHIAKI_LOG_DEBUG, buf, buf_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ChiakiErrorCode stream_connection_init_crypt(ChiakiStreamConnection *stream_connection)
|
||||||
|
{
|
||||||
|
ChiakiSession *session = stream_connection->session;
|
||||||
|
|
||||||
|
stream_connection->gkcrypt_local = chiaki_gkcrypt_new(stream_connection->log, 0 /* TODO */, 2, session->handshake_key, stream_connection->ecdh_secret);
|
||||||
|
if(!stream_connection->gkcrypt_local)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(stream_connection->log, "StreamConnection failed to initialize local GKCrypt with index 2\n");
|
||||||
|
return CHIAKI_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
stream_connection->gkcrypt_remote = chiaki_gkcrypt_new(stream_connection->log, 0 /* TODO */, 3, session->handshake_key, stream_connection->ecdh_secret);
|
||||||
|
if(!stream_connection->gkcrypt_remote)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(stream_connection->log, "StreamConnection failed to initialize remote GKCrypt with index 3\n");
|
||||||
|
free(stream_connection->gkcrypt_local);
|
||||||
|
stream_connection->gkcrypt_local = NULL;
|
||||||
|
return CHIAKI_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
chiaki_takion_set_crypt(&stream_connection->takion, stream_connection->gkcrypt_local, stream_connection->gkcrypt_remote);
|
||||||
|
|
||||||
|
return CHIAKI_ERR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static void stream_connection_takion_data_expect_bang(ChiakiStreamConnection *stream_connection, uint8_t *buf, size_t buf_size)
|
static void stream_connection_takion_data_expect_bang(ChiakiStreamConnection *stream_connection, uint8_t *buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
char ecdh_pub_key[128];
|
char ecdh_pub_key[128];
|
||||||
|
@ -406,6 +409,13 @@ static void stream_connection_takion_data_expect_bang(ChiakiStreamConnection *st
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = stream_connection_init_crypt(stream_connection);
|
||||||
|
if(err != CHIAKI_ERR_SUCCESS)
|
||||||
|
{
|
||||||
|
CHIAKI_LOGE(stream_connection->log, "StreamConnection failed to init crypt after receiving bang\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
// stream_connection->state_mutex is expected to be locked by the caller of this function
|
// stream_connection->state_mutex is expected to be locked by the caller of this function
|
||||||
stream_connection->state_finished = true;
|
stream_connection->state_finished = true;
|
||||||
chiaki_cond_signal(&stream_connection->state_cond);
|
chiaki_cond_signal(&stream_connection->state_cond);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue