diff --git a/gui/src/main.cpp b/gui/src/main.cpp index 36ca884..4e25dfc 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -24,6 +24,13 @@ int main(int argc, char *argv[]) { qRegisterMetaType(); + ChiakiErrorCode err = chiaki_lib_init(); + if(err != CHIAKI_ERR_SUCCESS) + { + fprintf(stderr, "Chiaki lib init failed: %s\n", chiaki_error_string(err)); + return 1; + } + QApplication app(argc, argv); QApplication::setApplicationName("Chiaki"); diff --git a/lib/include/chiaki/common.h b/lib/include/chiaki/common.h index 44bd7b4..9ff5656 100644 --- a/lib/include/chiaki/common.h +++ b/lib/include/chiaki/common.h @@ -51,7 +51,12 @@ typedef enum CHIAKI_EXPORT const char *chiaki_error_string(ChiakiErrorCode code); -void *chiaki_aligned_alloc(size_t alignment, size_t size); +CHIAKI_EXPORT void *chiaki_aligned_alloc(size_t alignment, size_t size); + +/** + * Perform initialization of global state needed for using the Chiaki lib + */ +CHIAKI_EXPORT ChiakiErrorCode chiaki_lib_init(); #ifdef __cplusplus } diff --git a/lib/include/chiaki/random.h b/lib/include/chiaki/random.h index ee35f20..33bb1f2 100644 --- a/lib/include/chiaki/random.h +++ b/lib/include/chiaki/random.h @@ -27,7 +27,12 @@ extern "C" { #endif -CHIAKI_EXPORT ChiakiErrorCode chiaki_random_bytes(uint8_t *buf, size_t buf_size); +/** + * Random for cryptography + */ +CHIAKI_EXPORT ChiakiErrorCode chiaki_random_bytes_crypt(uint8_t *buf, size_t buf_size); + +CHIAKI_EXPORT uint32_t chiaki_random_32(); #ifdef __cplusplus } diff --git a/lib/src/common.c b/lib/src/common.c index b7dfe5e..1c21a38 100644 --- a/lib/src/common.c +++ b/lib/src/common.c @@ -16,9 +16,14 @@ */ #include +#include +#include + +#include #include - +#include +#include CHIAKI_EXPORT const char *chiaki_error_string(ChiakiErrorCode code) { @@ -63,3 +68,16 @@ void *chiaki_aligned_alloc(size_t alignment, size_t size) { return aligned_alloc(alignment, size); } + +CHIAKI_EXPORT ChiakiErrorCode chiaki_lib_init() +{ + unsigned int seed; + chiaki_random_bytes_crypt((uint8_t *)&seed, sizeof(seed)); + srand(seed); // doesn't necessarily need to be secure for crypto + + int galois_r = galois_init_default_field(CHIAKI_FEC_WORDSIZE); + if(galois_r != 0) + return galois_r == ENOMEM ? CHIAKI_ERR_MEMORY : CHIAKI_ERR_UNKNOWN; + + return CHIAKI_ERR_SUCCESS; +} diff --git a/lib/src/random.c b/lib/src/random.c index 18960c7..beaf373 100644 --- a/lib/src/random.c +++ b/lib/src/random.c @@ -19,10 +19,15 @@ #include -CHIAKI_EXPORT ChiakiErrorCode chiaki_random_bytes(uint8_t *buf, size_t buf_size) +CHIAKI_EXPORT ChiakiErrorCode chiaki_random_bytes_crypt(uint8_t *buf, size_t buf_size) { int r = RAND_bytes(buf, (int)buf_size); if(!r) return CHIAKI_ERR_UNKNOWN; return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT uint32_t chiaki_random_32() +{ + return rand() % UINT32_MAX; } \ No newline at end of file diff --git a/lib/src/session.c b/lib/src/session.c index 4ca70cc..655382d 100644 --- a/lib/src/session.c +++ b/lib/src/session.c @@ -333,7 +333,7 @@ static void *session_thread_func(void *arg) session->mtu = 1454; session->rtt = 12; - err = chiaki_random_bytes(session->handshake_key, sizeof(session->handshake_key)); + err = chiaki_random_bytes_crypt(session->handshake_key, sizeof(session->handshake_key)); if(err != CHIAKI_ERR_SUCCESS) { CHIAKI_LOGE(session->log, "Session failed to generate handshake key"); diff --git a/lib/src/takion.c b/lib/src/takion.c index 2567bfb..93c9ce1 100644 --- a/lib/src/takion.c +++ b/lib/src/takion.c @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -186,7 +187,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_connect(ChiakiTakion *takion, Chiaki takion->cb_user = info->cb_user; takion->a_rwnd = TAKION_A_RWND; - takion->tag_local = 0x4823; // "random" tag TODO: use actual random tag + takion->tag_local = chiaki_random_32(); // 0x4823 takion->seq_num_local = takion->tag_local; ret = chiaki_mutex_init(&takion->seq_num_local_mutex, false); if(ret != CHIAKI_ERR_SUCCESS)