Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Commits on Source (7)
...@@ -46,21 +46,34 @@ set(WOLFSSL_DEFINITIONS) ...@@ -46,21 +46,34 @@ set(WOLFSSL_DEFINITIONS)
set(WOLFSSL_LINK_LIBS) set(WOLFSSL_LINK_LIBS)
#set(WOLFSSL_INSTALL_LIBS) #set(WOLFSSL_INSTALL_LIBS)
set(WOLFSSL_ECC "yes")
set(WOLFSSL_CURVE25519 "yes")
set(WOLFSSL_ED25519 "yes")
set(WOLFSSL_CURVE448 "yes")
set(WOLFSSL_ED448 "yes")
set(WOLFSSL_FE448 "yes")
set(WOLFSSL_GE448 "yes")
set(WOLFSSL_FEMATH "yes")
set(WOLFSSL_GEMATH "yes")
set(WOLFSSL_PSK "yes")
set(WOLFSSL_OPENSSLEXTRA "yes")
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_STATIC_DH")
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_STATIC_RSA") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_STATIC_RSA")
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_STATIC_PSK") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_STATIC_PSK")
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_STATIC_DH") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ED25519")
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_OPENSSLEXTRA") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_CURVE25519")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ED448")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_CURVE448")
list(APPEND WOLFSSL_DEFINITIONS "-DOPENSSL_EXTRA")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_SUPPORTED_CURVES") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_SUPPORTED_CURVES")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_TLS_EXTENSIONS") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_TLS_EXTENSIONS")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ECC") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ECC")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_AES") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_AES")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_AESGCM") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_AESGCM")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_AESGCM_DECRYPT") list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_AESGCM_DECRYPT")
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHA384")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_CHACHA") #list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_AESNI")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_POLY1305") list(APPEND WOLFSSL_DEFINITIONS "-DDEBUG_WOLFSSL")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_TLS_EXTENSIONS")
list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_SNI")
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/functions.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/functions.cmake)
...@@ -184,6 +197,8 @@ find_package(Threads) ...@@ -184,6 +197,8 @@ find_package(Threads)
# Example for map file and custom linker script # Example for map file and custom linker script
#set(CMAKE_EXE_LINKER_FLAGS " -Xlinker -Map=output.map -T\"${CMAKE_CURRENT_SOURCE_DIR}/linker.ld\"") #set(CMAKE_EXE_LINKER_FLAGS " -Xlinker -Map=output.map -T\"${CMAKE_CURRENT_SOURCE_DIR}/linker.ld\"")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -m64")
#################################################### ####################################################
# Build Options # Build Options
#################################################### ####################################################
...@@ -983,11 +998,8 @@ if (WOLFSSL_TLS13) ...@@ -983,11 +998,8 @@ if (WOLFSSL_TLS13)
"-DWOLFSSL_TLS13" "-DWOLFSSL_TLS13"
"-DHAVE_TLS_EXTENSIONS" "-DHAVE_TLS_EXTENSIONS"
"-DHAVE_SUPPORTED_CURVES") "-DHAVE_SUPPORTED_CURVES")
message("[+] TLS1.3 enabled")
endif() endif()
list(APPEND WOLFSSL_DEFINITIONS
"-DWOLFSSL_TLS13"
"-DHAVE_TLS_EXTENSIONS"
"-DHAVE_SUPPORTED_CURVES")
# TODO: - Session ticket # TODO: - Session ticket
......
...@@ -18,17 +18,29 @@ ...@@ -18,17 +18,29 @@
extern "C" { extern "C" {
#endif #endif
#undef WOLFSSL_STATIC_DH
#define WOLFSSL_STATIC_DH
#undef WOLFSSL_STATIC_RSA #undef WOLFSSL_STATIC_RSA
#define WOLFSSL_STATIC_RSA #define WOLFSSL_STATIC_RSA
#undef WOLFSSL_STATIC_PSK #undef WOLFSSL_STATIC_PSK
#define WOLFSSL_STATIC_PSK #define WOLFSSL_STATIC_PSK
#undef WOLFSSL_STATIC_DH #undef HAVE_ED25519
#define WOLFSSL_STATIC_DH #define HAVE_ED25519
#undef HAVE_CURVE25519
#define HAVE_CURVE25519
#undef HAVE_ED448
#define HAVE_ED448
#undef HAVE_CURVE448
#define HAVE_CURVE448
#undef WOLFSSL_OPENSSLEXTRA #undef OPENSSL_EXTRA
#define WOLFSSL_OPENSSLEXTRA #define OPENSSL_EXTRA
#undef HAVE_SUPPORTED_CURVES #undef HAVE_SUPPORTED_CURVES
#define HAVE_SUPPORTED_CURVES #define HAVE_SUPPORTED_CURVES
...@@ -48,20 +60,8 @@ extern "C" { ...@@ -48,20 +60,8 @@ extern "C" {
#undef HAVE_AESGCM_DECRYPT #undef HAVE_AESGCM_DECRYPT
#define HAVE_AESGCM_DECRYPT #define HAVE_AESGCM_DECRYPT
#undef WOLFSSL_SHA384 #undef DEBUG_WOLFSSL
#define WOLFSSL_SHA384 #define DEBUG_WOLFSSL
#undef HAVE_CHACHA
#define HAVE_CHACHA
#undef HAVE_POLY1305
#define HAVE_POLY1305
#undef HAVE_TLS_EXTENSIONS
#define HAVE_TLS_EXTENSIONS
#undef HAVE_SNI
#define HAVE_SNI
#undef HAVE_THREAD_LS #undef HAVE_THREAD_LS
#define HAVE_THREAD_LS #define HAVE_THREAD_LS
...@@ -164,30 +164,15 @@ extern "C" { ...@@ -164,30 +164,15 @@ extern "C" {
#undef HAVE_SUPPORTED_CURVES #undef HAVE_SUPPORTED_CURVES
#define HAVE_SUPPORTED_CURVES #define HAVE_SUPPORTED_CURVES
#undef WOLFSSL_TLS13
#define WOLFSSL_TLS13
#undef HAVE_TLS_EXTENSIONS
#define HAVE_TLS_EXTENSIONS
#undef HAVE_SUPPORTED_CURVES
#define HAVE_SUPPORTED_CURVES
#undef HAVE_EXTENDED_MASTER #undef HAVE_EXTENDED_MASTER
#define HAVE_EXTENDED_MASTER #define HAVE_EXTENDED_MASTER
#undef NO_PSK
#define NO_PSK
#undef HAVE_ENCRYPT_THEN_MAC #undef HAVE_ENCRYPT_THEN_MAC
#define HAVE_ENCRYPT_THEN_MAC #define HAVE_ENCRYPT_THEN_MAC
#undef NO_MD4 #undef NO_MD4
#define NO_MD4 #define NO_MD4
#undef NO_PWDBASED
#define NO_PWDBASED
#undef USE_FAST_MATH #undef USE_FAST_MATH
#define USE_FAST_MATH #define USE_FAST_MATH
......
...@@ -15,17 +15,29 @@ ...@@ -15,17 +15,29 @@
extern "C" { extern "C" {
#endif #endif
#undef WOLFSSL_STATIC_DH
#define WOLFSSL_STATIC_DH
#undef WOLFSSL_STATIC_RSA #undef WOLFSSL_STATIC_RSA
#define WOLFSSL_STATIC_RSA #define WOLFSSL_STATIC_RSA
#undef WOLFSSL_STATIC_PSK #undef WOLFSSL_STATIC_PSK
#define WOLFSSL_STATIC_PSK #define WOLFSSL_STATIC_PSK
#undef WOLFSSL_STATIC_DH #undef HAVE_ED25519
#define WOLFSSL_STATIC_DH #define HAVE_ED25519
#undef HAVE_CURVE25519
#define HAVE_CURVE25519
#undef HAVE_ED448
#define HAVE_ED448
#undef HAVE_CURVE448
#define HAVE_CURVE448
#undef WOLFSSL_OPENSSLEXTRA #undef OPENSSL_EXTRA
#define WOLFSSL_OPENSSLEXTRA #define OPENSSL_EXTRA
#undef HAVE_SUPPORTED_CURVES #undef HAVE_SUPPORTED_CURVES
#define HAVE_SUPPORTED_CURVES #define HAVE_SUPPORTED_CURVES
...@@ -45,20 +57,8 @@ extern "C" { ...@@ -45,20 +57,8 @@ extern "C" {
#undef HAVE_AESGCM_DECRYPT #undef HAVE_AESGCM_DECRYPT
#define HAVE_AESGCM_DECRYPT #define HAVE_AESGCM_DECRYPT
#undef WOLFSSL_SHA384 #undef DEBUG_WOLFSSL
#define WOLFSSL_SHA384 #define DEBUG_WOLFSSL
#undef HAVE_CHACHA
#define HAVE_CHACHA
#undef HAVE_POLY1305
#define HAVE_POLY1305
#undef HAVE_TLS_EXTENSIONS
#define HAVE_TLS_EXTENSIONS
#undef HAVE_SNI
#define HAVE_SNI
#undef HAVE_THREAD_LS #undef HAVE_THREAD_LS
#define HAVE_THREAD_LS #define HAVE_THREAD_LS
...@@ -161,30 +161,15 @@ extern "C" { ...@@ -161,30 +161,15 @@ extern "C" {
#undef HAVE_SUPPORTED_CURVES #undef HAVE_SUPPORTED_CURVES
#define HAVE_SUPPORTED_CURVES #define HAVE_SUPPORTED_CURVES
#undef WOLFSSL_TLS13
#define WOLFSSL_TLS13
#undef HAVE_TLS_EXTENSIONS
#define HAVE_TLS_EXTENSIONS
#undef HAVE_SUPPORTED_CURVES
#define HAVE_SUPPORTED_CURVES
#undef HAVE_EXTENDED_MASTER #undef HAVE_EXTENDED_MASTER
#define HAVE_EXTENDED_MASTER #define HAVE_EXTENDED_MASTER
#undef NO_PSK
#define NO_PSK
#undef HAVE_ENCRYPT_THEN_MAC #undef HAVE_ENCRYPT_THEN_MAC
#define HAVE_ENCRYPT_THEN_MAC #define HAVE_ENCRYPT_THEN_MAC
#undef NO_MD4 #undef NO_MD4
#define NO_MD4 #define NO_MD4
#undef NO_PWDBASED
#define NO_PWDBASED
#undef USE_FAST_MATH #undef USE_FAST_MATH
#define USE_FAST_MATH #define USE_FAST_MATH
......
...@@ -2,7 +2,7 @@ project(cellframe-sdk C) ...@@ -2,7 +2,7 @@ project(cellframe-sdk C)
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
set(CELLFRAME_SDK_NATIVE_VERSION "2.9-4") set(CELLFRAME_SDK_NATIVE_VERSION "2.9-5")
add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
set(DAPSDK_MODULES "") set(DAPSDK_MODULES "")
message("Cellframe modules: ${CELLFRAME_MODULES}") message("Cellframe modules: ${CELLFRAME_MODULES}")
......
...@@ -86,6 +86,7 @@ typedef struct dap_http_client_internal { ...@@ -86,6 +86,7 @@ typedef struct dap_http_client_internal {
#define PVT(a) (a ? (dap_client_http_pvt_t *) (a)->_inheritor : NULL) #define PVT(a) (a ? (dap_client_http_pvt_t *) (a)->_inheritor : NULL)
static void s_http_connected(dap_events_socket_t * a_esocket); // Connected callback static void s_http_connected(dap_events_socket_t * a_esocket); // Connected callback
static void s_http_ssl_connected(dap_events_socket_t * a_esocket); // connected SSL callback
static void s_client_http_delete(dap_client_http_pvt_t * a_http_pvt); static void s_client_http_delete(dap_client_http_pvt_t * a_http_pvt);
static void s_http_read(dap_events_socket_t * a_es, void * arg); static void s_http_read(dap_events_socket_t * a_es, void * arg);
static void s_http_error(dap_events_socket_t * a_es, int a_arg); static void s_http_error(dap_events_socket_t * a_es, int a_arg);
...@@ -114,7 +115,7 @@ int dap_client_http_init() ...@@ -114,7 +115,7 @@ int dap_client_http_init()
s_client_timeout_read_after_connect_ms = (time_t) dap_config_get_item_uint32_default(g_config,"dap_client","timeout_read_after_connect",5); s_client_timeout_read_after_connect_ms = (time_t) dap_config_get_item_uint32_default(g_config,"dap_client","timeout_read_after_connect",5);
#ifndef DAP_NET_CLIENT_NO_SSL #ifndef DAP_NET_CLIENT_NO_SSL
wolfSSL_Init(); wolfSSL_Init();
wolfSSL_Debugging_ON(); wolfSSL_Debugging_ON ();
if ((s_ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL) if ((s_ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL)
return -1; return -1;
const char *l_ssl_cert_path = dap_config_get_item_str(g_config, "dap_client", "ssl_cert_path"); const char *l_ssl_cert_path = dap_config_get_item_str(g_config, "dap_client", "ssl_cert_path");
...@@ -123,22 +124,21 @@ int dap_client_http_init() ...@@ -123,22 +124,21 @@ int dap_client_http_init()
return -2; return -2;
} else } else
wolfSSL_CTX_set_verify(s_ctx, WOLFSSL_VERIFY_NONE, 0); wolfSSL_CTX_set_verify(s_ctx, WOLFSSL_VERIFY_NONE, 0);
if (wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP160R1) != SSL_SUCCESS) { if (wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP256R1) != SSL_SUCCESS) {
log_it(L_ERROR, "WolfSSL UseSupportedCurve() handle error"); log_it(L_ERROR, "WolfSSL UseSupportedCurve() handle error");
} }
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP160R1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP160R2);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP192K1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP192R1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP224K1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP224R1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP256K1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP256R1); wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP256R1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP384R1); wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP384R1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP521R1); wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_SECP521R1);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_BRAINPOOLP256R1); wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_X25519);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_BRAINPOOLP384R1); wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_X448);
wolfSSL_CTX_UseSupportedCurve(s_ctx, WOLFSSL_ECC_BRAINPOOLP512R1);
if (s_debug_more) {
const int l_ciphers_len = 2048;
char l_buf[l_ciphers_len];
wolfSSL_get_ciphers(l_buf, l_ciphers_len);
log_it(L_DEBUG, "WolfSSL cipher list is :\n%s", l_buf);
}
#endif #endif
return 0; return 0;
} }
...@@ -604,25 +604,24 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker, const char *a_upli ...@@ -604,25 +604,24 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker, const char *a_upli
l_ev_socket->remote_addr.sin_family = AF_INET; l_ev_socket->remote_addr.sin_family = AF_INET;
l_ev_socket->remote_addr.sin_port = htons(a_uplink_port); l_ev_socket->remote_addr.sin_port = htons(a_uplink_port);
l_ev_socket->flags |= DAP_SOCK_CONNECTING; l_ev_socket->flags |= DAP_SOCK_CONNECTING;
l_ev_socket->type = a_over_ssl ? DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL : DESCRIPTOR_TYPE_SOCKET_CLIENT; l_ev_socket->type = DESCRIPTOR_TYPE_SOCKET_CLIENT;
l_ev_socket->flags |= DAP_SOCK_READY_TO_WRITE; l_ev_socket->flags |= DAP_SOCK_READY_TO_WRITE;
if (a_over_ssl) {
#ifndef DAP_NET_CLIENT_NO_SSL
l_ev_socket->callbacks.connected_callback = s_http_ssl_connected;
#else
log_it(L_ERROR,"We have no SSL implementation but trying to create SSL connection!");
#endif
}
int l_err = connect(l_socket, (struct sockaddr *) &l_ev_socket->remote_addr, sizeof(struct sockaddr_in)); int l_err = connect(l_socket, (struct sockaddr *) &l_ev_socket->remote_addr, sizeof(struct sockaddr_in));
if (l_err == 0){ if (l_err == 0){
log_it(L_DEBUG, "Connected momentaly with %s:%u!", a_uplink_addr, a_uplink_port); log_it(L_DEBUG, "Connected momentaly with %s:%u!", a_uplink_addr, a_uplink_port);
l_http_pvt->worker = a_worker?a_worker: dap_events_worker_get_auto(); l_http_pvt->worker = a_worker?a_worker: dap_events_worker_get_auto();
if (a_over_ssl) { if (a_over_ssl) {
#ifndef DAP_NET_CLIENT_NO_SSL #ifndef DAP_NET_CLIENT_NO_SSL
WOLFSSL *l_ssl = wolfSSL_new(s_ctx); s_http_ssl_connected(l_ev_socket);
if (!l_ssl)
log_it(L_ERROR, "wolfSSL_new error");
wolfSSL_set_fd(l_ssl, l_socket);
l_ev_socket->_pvt = (void *)l_ssl;
#else
log_it(L_ERROR,"We have no SSL implementation but trying to create SSL connection!");
#endif #endif
} }
dap_worker_add_events_socket(l_ev_socket,l_http_pvt->worker);
return l_http_pvt; return l_http_pvt;
} }
#ifdef DAP_OS_WINDOWS #ifdef DAP_OS_WINDOWS
...@@ -674,6 +673,31 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker, const char *a_upli ...@@ -674,6 +673,31 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker, const char *a_upli
#endif #endif
} }
#ifndef DAP_NET_CLIENT_NO_SSL
static void s_http_ssl_connected(dap_events_socket_t * a_esocket)
{
assert(a_esocket);
dap_client_http_pvt_t * l_http_pvt = PVT(a_esocket);
assert(l_http_pvt);
dap_worker_t *l_worker = l_http_pvt->worker;
assert(l_worker);
WOLFSSL *l_ssl = wolfSSL_new(s_ctx);
if (!l_ssl)
log_it(L_ERROR, "wolfSSL_new error");
wolfSSL_set_fd(l_ssl, a_esocket->socket);
a_esocket->_pvt = (void *)l_ssl;
a_esocket->type = DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL;
a_esocket->flags |= DAP_SOCK_CONNECTING;
a_esocket->flags |= DAP_SOCK_READY_TO_WRITE;
a_esocket->callbacks.connected_callback = s_http_connected;
dap_events_socket_handler_t * l_ev_socket_handler = DAP_NEW_Z(dap_events_socket_handler_t);
l_ev_socket_handler->esocket = a_esocket;
l_ev_socket_handler->uuid = a_esocket->uuid;
dap_timerfd_start_on_worker(l_http_pvt->worker, s_client_timeout_ms, s_timer_timeout_check, l_ev_socket_handler);
}
#endif
/** /**
* @brief s_http_connected * @brief s_http_connected
* @param a_esocket * @param a_esocket
...@@ -686,15 +710,6 @@ static void s_http_connected(dap_events_socket_t * a_esocket) ...@@ -686,15 +710,6 @@ static void s_http_connected(dap_events_socket_t * a_esocket)
dap_worker_t *l_worker = l_http_pvt->worker; dap_worker_t *l_worker = l_http_pvt->worker;
assert(l_worker); assert(l_worker);
if (l_http_pvt->is_over_ssl) {
#ifndef DAP_NET_CLIENT_NO_SSL
WOLFSSL *l_ssl = wolfSSL_new(s_ctx);
if (!l_ssl)
log_it(L_ERROR, "wolfSSL_new error");
wolfSSL_set_fd(l_ssl, a_esocket->socket);
a_esocket->_pvt = (void *)l_ssl;
#endif
}
log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %d", l_http_pvt->uplink_addr, l_http_pvt->uplink_port, a_esocket->socket); log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %d", l_http_pvt->uplink_addr, l_http_pvt->uplink_port, a_esocket->socket);
// add to dap_worker // add to dap_worker
//dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t*) a_obj; //dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t*) a_obj;
......
...@@ -566,29 +566,52 @@ void *dap_worker_thread(void *arg) ...@@ -566,29 +566,52 @@ void *dap_worker_thread(void *arg)
} }
// If its outgoing connection // If its outgoing connection
if ( l_flag_write && !l_cur->server && (l_cur->flags & DAP_SOCK_CONNECTING) && if ((l_flag_write && !l_cur->server && l_cur->flags & DAP_SOCK_CONNECTING && l_cur->type == DESCRIPTOR_TYPE_SOCKET_CLIENT) ||
( l_cur->type == DESCRIPTOR_TYPE_SOCKET_CLIENT || l_cur->type == DESCRIPTOR_TYPE_SOCKET_UDP || (l_cur->type == DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL && l_cur->flags & DAP_SOCK_CONNECTING)) {
l_cur->type == DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL)){
int l_error = 0; int l_error = 0;
socklen_t l_error_len = sizeof(l_error); socklen_t l_error_len = sizeof(l_error);
char l_error_buf[128]; char l_error_buf[128];
l_error_buf[0]='\0'; l_error_buf[0]='\0';
getsockopt(l_cur->socket, SOL_SOCKET, SO_ERROR, (void *)&l_error, &l_error_len); if (l_cur->type == DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL) {
if(l_error == EINPROGRESS) { #ifndef DAP_NET_CLIENT_NO_SSL
log_it(L_DEBUG, "Connecting with %s in progress...", l_cur->remote_addr_str ? l_cur->remote_addr_str: "(NULL)"); WOLFSSL *l_ssl = SSL(l_cur);
}else if (l_error){ int l_res = wolfSSL_negotiate(l_ssl);
strerror_r(l_error, l_error_buf, sizeof (l_error_buf)); if (l_res != WOLFSSL_SUCCESS) {
log_it(L_ERROR,"Connecting error with %s: \"%s\" (code %d)", l_cur->remote_addr_str ? l_cur->remote_addr_str: "(NULL)", char l_err_str[80];
l_error_buf, l_error); int l_err = wolfSSL_get_error(l_ssl, l_res);
if ( l_cur->callbacks.error_callback ) if (l_err != WOLFSSL_ERROR_WANT_READ && l_err != WOLFSSL_ERROR_WANT_WRITE) {
l_cur->callbacks.error_callback(l_cur, l_error); wolfSSL_ERR_error_string(l_err, l_err_str);
}else{ log_it(L_ERROR, "SSL handshake error \"%s\" with code %d", l_err_str, l_err);
if(s_debug_reactor) if ( l_cur->callbacks.error_callback )
log_it(L_NOTICE, "Connected with %s",l_cur->remote_addr_str ? l_cur->remote_addr_str: "(NULL)"); l_cur->callbacks.error_callback(l_cur, l_error);
l_cur->flags ^= DAP_SOCK_CONNECTING; }
if (l_cur->callbacks.connected_callback) } else {
l_cur->callbacks.connected_callback(l_cur); if(s_debug_reactor)
dap_events_socket_worker_poll_update_unsafe(l_cur); log_it(L_NOTICE, "SSL handshake done with %s", l_cur->remote_addr_str ? l_cur->remote_addr_str: "(NULL)");
l_cur->flags ^= DAP_SOCK_CONNECTING;
if (l_cur->callbacks.connected_callback)
l_cur->callbacks.connected_callback(l_cur);
dap_events_socket_worker_poll_update_unsafe(l_cur);
}
#endif
} else {
getsockopt(l_cur->socket, SOL_SOCKET, SO_ERROR, (void *)&l_error, &l_error_len);
if(l_error == EINPROGRESS) {
log_it(L_DEBUG, "Connecting with %s in progress...", l_cur->remote_addr_str ? l_cur->remote_addr_str: "(NULL)");
}else if (l_error){
strerror_r(l_error, l_error_buf, sizeof (l_error_buf));
log_it(L_ERROR,"Connecting error with %s: \"%s\" (code %d)", l_cur->remote_addr_str ? l_cur->remote_addr_str: "(NULL)",
l_error_buf, l_error);
if ( l_cur->callbacks.error_callback )
l_cur->callbacks.error_callback(l_cur, l_error);
}else{
if(s_debug_reactor)
log_it(L_NOTICE, "Connected with %s",l_cur->remote_addr_str ? l_cur->remote_addr_str: "(NULL)");
l_cur->flags ^= DAP_SOCK_CONNECTING;
if (l_cur->callbacks.connected_callback)
l_cur->callbacks.connected_callback(l_cur);
dap_events_socket_worker_poll_update_unsafe(l_cur);
}
} }
} }
......
...@@ -12,6 +12,11 @@ if (CELLFRAME_MODULES MATCHES "chains") ...@@ -12,6 +12,11 @@ if (CELLFRAME_MODULES MATCHES "chains")
add_subdirectory(global-db) add_subdirectory(global-db)
endif() endif()
# Distributed Hash Tables (DHT)
if (CELLFRAME_MODULES MATCHES "dht")
add_subdirectory(dht)
endif()
# Network # Network
if (CELLFRAME_MODULES MATCHES "network") if (CELLFRAME_MODULES MATCHES "network")
add_subdirectory(mempool) add_subdirectory(mempool)
......
...@@ -1282,9 +1282,13 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) ...@@ -1282,9 +1282,13 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
{ {
UNUSED(a_arg); UNUSED(a_arg);
if (a_ch->stream->esocket->buf_out_size >= a_ch->stream->esocket->buf_out_size_max / 2)
return;
dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(a_ch); dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(a_ch);
switch (l_ch_chain->state) { switch (l_ch_chain->state) {
// Update list of global DB records to remote
case CHAIN_STATE_UPDATE_GLOBAL_DB: { case CHAIN_STATE_UPDATE_GLOBAL_DB: {
if (l_ch_chain->stats_request_gdb_processed == l_ch_chain->local_gdbs_count) { if (l_ch_chain->stats_request_gdb_processed == l_ch_chain->local_gdbs_count) {
dap_stream_ch_chain_sync_request_t l_sync_gdb = {}; dap_stream_ch_chain_sync_request_t l_sync_gdb = {};
......
cmake_minimum_required(VERSION 3.1)
project (dap_chain_dht C)
set(DAP_CHAIN_DHT_SRC
dap_chain_dht.c
)
set(DAP_CHAIN_DHT_HDR
include/dap_chain_dht.h
)
set(DAP_CHAIN_GLOBAL_DB_LIBS dap_core dap_crypto dap_chain)
add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DHT_SRC} ${DAP_CHAIN_DHT_HDR})
target_link_libraries(${PROJECT_NAME} ${DAP_CHAIN_DHT_LIBS})
target_include_directories(dap_chain_dht INTERFACE .)
target_include_directories(${PROJECT_NAME} PUBLIC include)
...@@ -2166,10 +2166,8 @@ dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id) ...@@ -2166,10 +2166,8 @@ dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id)
*/ */
uint16_t dap_chain_net_acl_idx_by_id(dap_chain_net_id_t a_id) uint16_t dap_chain_net_acl_idx_by_id(dap_chain_net_id_t a_id)
{ {
dap_chain_net_item_t * l_net_item = NULL; dap_chain_net_t *l_net = dap_chain_net_by_id(a_id);
HASH_FIND(hh,s_net_items_ids,&a_id,sizeof (a_id), l_net_item ); return l_net ? PVT(l_net)->acl_idx : (uint16_t)-1;
return l_net_item ? PVT(l_net_item->chain_net)->acl_idx : (uint16_t)-1;
} }
...@@ -2289,6 +2287,8 @@ dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net) ...@@ -2289,6 +2287,8 @@ dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net)
uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t * l_net) uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t * l_net)
{ {
if (!l_net)
return 0;
return dap_chain_net_get_cur_addr(l_net) ? dap_chain_net_get_cur_addr(l_net)->uint64 : return dap_chain_net_get_cur_addr(l_net) ? dap_chain_net_get_cur_addr(l_net)->uint64 :
dap_db_get_cur_node_addr(l_net->pub.name); dap_db_get_cur_node_addr(l_net->pub.name);
} }
......
...@@ -85,6 +85,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t*, uint8_ ...@@ -85,6 +85,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t*, uint8_
static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_chain, uint8_t a_pkt_type, static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_chain, uint8_t a_pkt_type,
dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size, dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size,
void * a_arg); void * a_arg);
static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels);
bool s_stream_ch_chain_debug_more = false; bool s_stream_ch_chain_debug_more = false;
uint32_t s_timer_update_states=60; uint32_t s_timer_update_states=60;
...@@ -146,6 +147,8 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg) ...@@ -146,6 +147,8 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
SetEvent( l_node_client->wait_cond ); SetEvent( l_node_client->wait_cond );
#endif #endif
pthread_mutex_unlock(&l_node_client->wait_mutex); pthread_mutex_unlock(&l_node_client->wait_mutex);
dap_timerfd_start_on_worker(dap_events_worker_get_auto(),s_timer_update_states*1000,s_timer_update_states_callback, l_node_client);
return;
} }
if(l_node_client && l_node_client->keep_connection && if(l_node_client && l_node_client->keep_connection &&
...@@ -182,61 +185,53 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg) ...@@ -182,61 +185,53 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
*/ */
static bool s_timer_update_states_callback(void * a_arg ) static bool s_timer_update_states_callback(void * a_arg )
{ {
dap_events_socket_handler_t * l_es_handler = (dap_events_socket_handler_t *) a_arg; dap_chain_node_client_t *l_me = (dap_chain_node_client_t *) a_arg;
dap_worker_t * l_worker = dap_events_get_current_worker(dap_events_get_default()); dap_worker_t * l_worker = dap_events_get_current_worker(dap_events_get_default());
assert(l_worker); assert(l_worker);
assert(l_es_handler); assert(l_me);
dap_events_socket_t * l_es = l_es_handler->esocket; dap_events_socket_t * l_es = l_me->own_esh->esocket;
uint128_t l_es_uuid = l_es_handler->uuid; uint128_t l_es_uuid = l_me->own_esh->uuid;
// check if esocket still in worker // check if esocket still in worker
if(dap_events_socket_check_unsafe(l_worker,l_es)){ if(dap_events_socket_check_unsafe(l_worker,l_es)){
// Check if its exactly ours! // Check if its exactly ours!
if (dap_uint128_check_equal(l_es->uuid,l_es_uuid)){ if (dap_uint128_check_equal(l_es->uuid,l_es_uuid)){
dap_client_t * l_client = dap_client_from_esocket(l_es); dap_client_t * l_client = dap_client_from_esocket(l_es);
if(! l_client ){ if (l_client ) {
DAP_DELETE(l_es_handler); dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t*) l_client->_inheritor;
return false; if (l_node_client && l_node_client->ch_chain) {
} dap_stream_ch_chain_t * l_ch_chain = (dap_stream_ch_chain_t*) l_node_client->ch_chain->internal;
dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t*) l_client->_inheritor; assert(l_ch_chain);
if(! l_node_client){ // No active node client dap_chain_net_t * l_net = l_node_client->net;
DAP_DELETE(l_es_handler); assert(l_net);
return false;
} // If we do nothing - init sync process
if(! l_node_client->ch_chain){ // No active ch channel if (l_ch_chain->state == CHAIN_STATE_IDLE ||l_ch_chain->state == CHAIN_STATE_SYNC_ALL ){
DAP_DELETE(l_es_handler); dap_stream_ch_chain_sync_request_t l_sync_gdb = {};
return false; l_sync_gdb.id_start = (uint64_t) dap_db_get_last_id_remote(l_node_client->remote_node_addr.uint64);
} l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
dap_stream_ch_chain_t * l_ch_chain = (dap_stream_ch_chain_t*) l_node_client->ch_chain->internal; log_it(L_DEBUG, "Prepared request to gdb sync from %llu to %llu", l_sync_gdb.id_start,
assert(l_ch_chain); l_sync_gdb.id_end?l_sync_gdb.id_end:-1 );
dap_chain_net_t * l_net = l_node_client->net; // find dap_chain_id_t
assert(l_net); dap_chain_t *l_chain = l_net->pub.chains;
dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) {0};
// If we do nothing - init sync process dap_stream_ch_chain_pkt_write_unsafe( l_node_client->ch_chain ,
if (l_ch_chain->state == CHAIN_STATE_IDLE ||l_ch_chain->state == CHAIN_STATE_SYNC_ALL ){ DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ, l_net->pub.id.uint64,
dap_stream_ch_chain_sync_request_t l_sync_gdb = {}; l_chain_id.uint64, l_net->pub.cell_id.uint64,
l_sync_gdb.id_start = (uint64_t) dap_db_get_last_id_remote(l_node_client->remote_node_addr.uint64); &l_sync_gdb, sizeof(l_sync_gdb));
l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); }
log_it(L_DEBUG, "Prepared request to gdb sync from %llu to %llu", l_sync_gdb.id_start, return true;
l_sync_gdb.id_end?l_sync_gdb.id_end:-1 ); }
// find dap_chain_id_t
dap_chain_t *l_chain = l_net->pub.chains;
dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) {0};
dap_stream_ch_chain_pkt_write_unsafe( l_node_client->ch_chain ,
DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ, l_net->pub.id.uint64,
l_chain_id.uint64, l_net->pub.cell_id.uint64,
&l_sync_gdb, sizeof(l_sync_gdb));
} }
return true;
}else{
DAP_DELETE(l_es_handler);
return false;
} }
}else{
DAP_DELETE(l_es_handler);
return false;
} }
// if we not returned yet
l_me->state = NODE_CLIENT_STATE_DISCONNECTED;
if (l_me->keep_connection) {
log_it(L_INFO, "Reconnecting node client with peer "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_me->remote_node_addr));
dap_chain_node_client_connect_internal(l_me, "CN"); // isn't always CN here?
}
DAP_DELETE(l_me->own_esh);
return false;
} }
/** /**
...@@ -273,7 +268,8 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg) ...@@ -273,7 +268,8 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg)
dap_events_socket_handler_t * l_es_handler = DAP_NEW_Z(dap_events_socket_handler_t); dap_events_socket_handler_t * l_es_handler = DAP_NEW_Z(dap_events_socket_handler_t);
l_es_handler->esocket = l_stream->esocket; l_es_handler->esocket = l_stream->esocket;
l_es_handler->uuid = l_stream->esocket->uuid; l_es_handler->uuid = l_stream->esocket->uuid;
dap_timerfd_start_on_worker(l_stream->esocket->worker,s_timer_update_states*1000,s_timer_update_states_callback, l_es_handler); l_node_client->own_esh = l_es_handler;
dap_timerfd_start_on_worker(l_stream->esocket->worker,s_timer_update_states*1000,s_timer_update_states_callback, l_node_client);
} }
#ifndef _WIN32 #ifndef _WIN32
pthread_cond_broadcast(&l_node_client->wait_cond); pthread_cond_broadcast(&l_node_client->wait_cond);
...@@ -606,41 +602,49 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t ...@@ -606,41 +602,49 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t
pthread_mutex_init(&l_node_client->wait_mutex, NULL); pthread_mutex_init(&l_node_client->wait_mutex, NULL);
l_node_client->events = NULL; //dap_events_new(); l_node_client->events = NULL; //dap_events_new();
l_node_client->client = dap_client_new(l_node_client->events, s_stage_status_callback,
s_stage_status_error_callback);
dap_client_set_is_always_reconnect(l_node_client->client, true);
l_node_client->client->_inheritor = l_node_client;
l_node_client->remote_node_addr.uint64 = a_node_info->hdr.address.uint64; l_node_client->remote_node_addr.uint64 = a_node_info->hdr.address.uint64;
dap_client_set_active_channels_unsafe(l_node_client->client, a_active_channels); if (dap_chain_node_client_connect_internal(l_node_client, a_active_channels))
return l_node_client;
return NULL;
}
//dap_client_set_auth_cert(l_node_client->client, dap_cert_find_by_name("auth")); // TODO provide the certificate choice // Create new dap_client, setup it, and send it in adventure trip
static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels)
{
a_node_client->client = dap_client_new(a_node_client->events, s_stage_status_callback,
s_stage_status_error_callback);
dap_client_set_is_always_reconnect(a_node_client->client, true);
a_node_client->client->_inheritor = a_node_client;
dap_client_set_active_channels_unsafe(a_node_client->client, a_active_channels);
//dap_client_set_auth_cert(a_node_client->client, dap_cert_find_by_name("auth")); // TODO provide the certificate choice
int hostlen = 128; int hostlen = 128;
char host[hostlen]; char host[hostlen];
if(a_node_info->hdr.ext_addr_v4.s_addr){ if(a_node_client->info->hdr.ext_addr_v4.s_addr){
struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = a_node_info->hdr.ext_addr_v4 }; struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = a_node_client->info->hdr.ext_addr_v4 };
inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host, hostlen); inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host, hostlen);
log_it(L_INFO, "Connecting to %s address",host); log_it(L_INFO, "Connecting to %s address",host);
} else { } else {
struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = a_node_info->hdr.ext_addr_v6 }; struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = a_node_client->info->hdr.ext_addr_v6 };
inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host, hostlen); inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host, hostlen);
log_it(L_INFO, "Connecting to %s address",host); log_it(L_INFO, "Connecting to %s address",host);
} }
// address not defined // address not defined
if(!strcmp(host, "::")) { if(!strcmp(host, "::")) {
dap_chain_node_client_close(l_node_client); dap_chain_node_client_close(a_node_client);
return NULL; return false;
} }
dap_client_set_uplink_unsafe(l_node_client->client, strdup(host), a_node_info->hdr.ext_port); dap_client_set_uplink_unsafe(a_node_client->client, strdup(host), a_node_client->info->hdr.ext_port);
// dap_client_stage_t a_stage_target = STAGE_ENC_INIT; // dap_client_stage_t a_stage_target = STAGE_ENC_INIT;
// dap_client_stage_t l_stage_target = STAGE_STREAM_STREAMING; // dap_client_stage_t l_stage_target = STAGE_STREAM_STREAMING;
l_node_client->state = NODE_CLIENT_STATE_CONNECTING ; a_node_client->state = NODE_CLIENT_STATE_CONNECTING ;
// ref pvt client // ref pvt client
//dap_client_pvt_ref(DAP_CLIENT_PVT(l_node_client->client)); //dap_client_pvt_ref(DAP_CLIENT_PVT(a_node_client->client));
// Handshake & connect // Handshake & connect
dap_client_go_stage(l_node_client->client, STAGE_STREAM_STREAMING, s_stage_connected_callback); dap_client_go_stage(a_node_client->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
return l_node_client; return true;
} }
/** /**
......
...@@ -94,6 +94,7 @@ typedef struct dap_chain_node_client { ...@@ -94,6 +94,7 @@ typedef struct dap_chain_node_client {
// Timer // Timer
dap_events_socket_t * timer_update_states; dap_events_socket_t * timer_update_states;
dap_events_socket_handler_t *own_esh;
#ifndef _WIN32 #ifndef _WIN32
......