From 5f654dde020d3c8b7261e8810fdbb6bee5217db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Thu, 29 Nov 2018 14:23:08 +0100 Subject: [PATCH] Create GKCrypts --- lib/include/chiaki/common.h | 1 + lib/include/chiaki/gkcrypt.h | 22 ++++++++++++++++++++++ lib/include/chiaki/nagare.h | 5 ++++- lib/src/nagare.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/lib/include/chiaki/common.h b/lib/include/chiaki/common.h index 71f96af..f94c424 100644 --- a/lib/include/chiaki/common.h +++ b/lib/include/chiaki/common.h @@ -24,6 +24,7 @@ extern "C" { #define CHIAKI_EXPORT +#define CHIAKI_NEW(t) (malloc(sizeof(t))) typedef enum { diff --git a/lib/include/chiaki/gkcrypt.h b/lib/include/chiaki/gkcrypt.h index 5caacbc..d64c7c7 100644 --- a/lib/include/chiaki/gkcrypt.h +++ b/lib/include/chiaki/gkcrypt.h @@ -46,6 +46,28 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_gkcrypt_gen_key_stream(ChiakiGKCrypt *gkcry CHIAKI_EXPORT ChiakiErrorCode chiaki_gkcrypt_decrypt(ChiakiGKCrypt *gkcrypt, size_t key_pos, uint8_t *buf, size_t buf_size); static inline ChiakiErrorCode chiaki_gkcrypt_encrypt(ChiakiGKCrypt *gkcrypt, size_t key_pos, uint8_t *buf, size_t buf_size) { return chiaki_gkcrypt_decrypt(gkcrypt, key_pos, buf, buf_size); } +static inline ChiakiGKCrypt *chiaki_gkcrypt_new(ChiakiLog *log, size_t key_buf_blocks, uint8_t index, const uint8_t *handshake_key, const uint8_t *ecdh_secret) +{ + ChiakiGKCrypt *gkcrypt = CHIAKI_NEW(ChiakiGKCrypt); + if(!gkcrypt) + return NULL; + ChiakiErrorCode err = chiaki_gkcrypt_init(gkcrypt, log, key_buf_blocks, index, handshake_key, ecdh_secret); + if(err != CHIAKI_ERR_SUCCESS) + { + free(gkcrypt); + return NULL; + } + return gkcrypt; +} + +static inline void chiaki_gkcrypt_free(ChiakiGKCrypt *gkcrypt) +{ + if(!gkcrypt) + return; + chiaki_gkcrypt_fini(gkcrypt); + free(gkcrypt); +} + #ifdef __cplusplus } #endif diff --git a/lib/include/chiaki/nagare.h b/lib/include/chiaki/nagare.h index 86af8bd..55984d9 100644 --- a/lib/include/chiaki/nagare.h +++ b/lib/include/chiaki/nagare.h @@ -22,6 +22,7 @@ #include "takion.h" #include "log.h" #include "ecdh.h" +#include "gkcrypt.h" #include @@ -35,7 +36,9 @@ typedef struct chiaki_nagare_t ChiakiLog *log; ChiakiTakion takion; ChiakiMirai bang_mirai; - uint8_t ecdh_secret[CHIAKI_ECDH_SECRET_SIZE]; + uint8_t *ecdh_secret; + ChiakiGKCrypt *gkcrypt_a; + ChiakiGKCrypt *gkcrypt_b; } ChiakiNagare; CHIAKI_EXPORT ChiakiErrorCode chiaki_nagare_run(struct chiaki_session_t *session); diff --git a/lib/src/nagare.c b/lib/src/nagare.c index 6d89ea3..48d9e8a 100644 --- a/lib/src/nagare.c +++ b/lib/src/nagare.c @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -50,6 +51,8 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_nagare_run(ChiakiSession *session) nagare->session = session; nagare->log = &session->log; + nagare->ecdh_secret = NULL; + ChiakiErrorCode err = chiaki_mirai_init(&nagare->bang_mirai); if(err != CHIAKI_ERR_SUCCESS) goto error_bang_mirai; @@ -106,6 +109,22 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_nagare_run(ChiakiSession *session) CHIAKI_LOGI(&session->log, "Nagare successfully received bang\n"); + nagare->gkcrypt_a = chiaki_gkcrypt_new(&session->log, 0 /* TODO */, 2, session->handshake_key, nagare->ecdh_secret); + if(!nagare->gkcrypt_a) + { + CHIAKI_LOGE(&session->log, "Nagare failed to initialize GKCrypt with index 2\n"); + goto error_takion; + } + nagare->gkcrypt_b = chiaki_gkcrypt_new(&session->log, 0 /* TODO */, 3, session->handshake_key, nagare->ecdh_secret); + if(!nagare->gkcrypt_b) + { + CHIAKI_LOGE(&session->log, "Nagare failed to initialize GKCrypt with index 3\n"); + goto error_gkcrypt_a; + } + + + while(1) + sleep(1); CHIAKI_LOGI(&session->log, "Nagare is disconnecting\n"); @@ -113,11 +132,15 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_nagare_run(ChiakiSession *session) nagare_send_disconnect(nagare); err = CHIAKI_ERR_SUCCESS; + chiaki_gkcrypt_free(nagare->gkcrypt_b); +error_gkcrypt_a: + chiaki_gkcrypt_free(nagare->gkcrypt_a); error_takion: chiaki_takion_close(&nagare->takion); CHIAKI_LOGI(&session->log, "Nagare closed takion\n"); error_bang_mirai: chiaki_mirai_fini(&nagare->bang_mirai); + free(nagare->ecdh_secret); return err; @@ -200,6 +223,14 @@ static void nagare_takion_data_expect_bang(ChiakiNagare *nagare, uint8_t *buf, s goto error; } + assert(!nagare->ecdh_secret); + nagare->ecdh_secret = malloc(CHIAKI_ECDH_SECRET_SIZE); + if(!nagare->ecdh_secret) + { + CHIAKI_LOGE(nagare->log, "Nagare failed to alloc ECDH secret memory\n"); + goto error; + } + ChiakiErrorCode err = chiaki_ecdh_derive_secret(&nagare->session->ecdh, nagare->ecdh_secret, ecdh_pub_key_buf.buf, ecdh_pub_key_buf.size, @@ -208,6 +239,8 @@ static void nagare_takion_data_expect_bang(ChiakiNagare *nagare, uint8_t *buf, s if(err != CHIAKI_ERR_SUCCESS) { + free(nagare->ecdh_secret); + nagare->ecdh_secret = NULL; CHIAKI_LOGE(nagare->log, "Nagare failed to derive secret from bang\n"); goto error; }