diff --git a/CMakeLists.txt b/CMakeLists.txt index b1586fb2bca8918f1d47233fe0cfad9296bc202f..a712896a4d58e89358f9a492b1bf05775507f5a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.5-23") +set(CELLFRAME_SDK_NATIVE_VERSION "2.5-24") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c index b164bab85779d8dda73f833c52a7384dd49b14cf..b55f4d0229142f63b2281d71b9c4af76f7b2f5c0 100644 --- a/dap-sdk/net/client/dap_client.c +++ b/dap-sdk/net/client/dap_client.c @@ -109,7 +109,11 @@ MEM_ALLOC_ERR: void dap_client_set_uplink(dap_client_t * a_client,const char* a_addr, uint16_t a_port) { if(a_addr == NULL){ - log_it(L_ERROR,"Address is NULL"); + log_it(L_ERROR,"Address is NULL for dap_client_set_uplink"); + return; + } + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_set_uplink"); return; } DAP_CLIENT_PVT(a_client)->uplink_addr = strdup(a_addr); @@ -123,6 +127,11 @@ void dap_client_set_uplink(dap_client_t * a_client,const char* a_addr, uint16_t */ const char* dap_client_get_uplink_addr(dap_client_t * a_client) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_uplink"); + return NULL; + } + return DAP_CLIENT_PVT(a_client)->uplink_addr; } @@ -133,9 +142,14 @@ const char* dap_client_get_uplink_addr(dap_client_t * a_client) */ void dap_client_set_active_channels (dap_client_t * a_client, const char * a_active_channels) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_set_active_channels"); + return; + } + if ( DAP_CLIENT_PVT(a_client)->active_channels ) DAP_DELETE(DAP_CLIENT_PVT(a_client)->active_channels ); - DAP_CLIENT_PVT(a_client)->active_channels = dap_strdup( a_active_channels); + DAP_CLIENT_PVT(a_client)->active_channels = a_active_channels? dap_strdup( a_active_channels) : NULL; } /** @@ -145,11 +159,21 @@ void dap_client_set_active_channels (dap_client_t * a_client, const char * a_act */ uint16_t dap_client_get_uplink_port(dap_client_t * a_client) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_uplink_port"); + return 0; + } + return DAP_CLIENT_PVT(a_client)->uplink_port; } void dap_client_set_auth_cert(dap_client_t * a_client, dap_cert_t *a_cert) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_set_auth_cert"); + return; + } + DAP_CLIENT_PVT(a_client)->auth_cert = a_cert; } @@ -348,7 +372,11 @@ const char * dap_client_error_str(dap_client_error_t a_client_error) */ const char * dap_client_get_error_str(dap_client_t * a_client) { - return dap_client_error_str( DAP_CLIENT_PVT(a_client)->last_error ); + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_error_str"); + return NULL; + } + return dap_client_error_str( DAP_CLIENT_PVT(a_client)->last_error ); } /** * @brief dap_client_get_stage @@ -357,6 +385,10 @@ const char * dap_client_get_error_str(dap_client_t * a_client) */ dap_client_stage_t dap_client_get_stage(dap_client_t * a_client) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_stage"); + return -1; + } return DAP_CLIENT_PVT(a_client)->stage; } @@ -366,6 +398,10 @@ dap_client_stage_t dap_client_get_stage(dap_client_t * a_client) * @return */ const char * dap_client_get_stage_status_str(dap_client_t *a_client){ + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_stage_status_str"); + return NULL; + } return dap_client_stage_status_str(DAP_CLIENT_PVT(a_client)->stage_status); } @@ -392,6 +428,10 @@ const char * dap_client_stage_status_str(dap_client_stage_status_t a_stage_statu */ const char * dap_client_get_stage_str(dap_client_t *a_client) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_stage_str"); + return NULL; + } return dap_client_stage_str(DAP_CLIENT_PVT(a_client)->stage); } @@ -439,6 +479,11 @@ dap_enc_key_t * dap_client_get_key_stream(dap_client_t * a_client){ */ dap_stream_t * dap_client_get_stream(dap_client_t * a_client) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_stream"); + return NULL; + } + dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client); return (l_client_internal) ? l_client_internal->stream : NULL; } @@ -450,6 +495,10 @@ dap_stream_t * dap_client_get_stream(dap_client_t * a_client) */ dap_stream_worker_t * dap_client_get_stream_worker(dap_client_t * a_client) { + if(a_client == NULL){ + log_it(L_ERROR,"Client is NULL for dap_client_get_stream_worker"); + return NULL; + } dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client); return (l_client_internal) ? l_client_internal->stream_worker : NULL; @@ -460,7 +509,7 @@ dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch dap_stream_ch_t * l_ch = NULL; dap_client_pvt_t * l_client_internal = a_client ? DAP_CLIENT_PVT(a_client) : NULL; if(l_client_internal && l_client_internal->stream && l_client_internal->stream_es) - for(int i = 0; i < l_client_internal->stream->channel_count; i++) { + for(size_t i = 0; i < l_client_internal->stream->channel_count; i++) { if(l_client_internal->stream->channel[i]->proc->id == a_ch_id) { l_ch = l_client_internal->stream->channel[i]; break; diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index acccb093f8348564e3797d504a0b940f32ed0e20..5a3ca7692c94c91b10a17f7e2d2401813e52ce60 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -421,7 +421,7 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt) l_sign_size = dap_sign_get_size(l_sign); } uint8_t l_data[l_key_size + l_sign_size]; - memcpy(l_data, a_client_pvt->session_key_open->pub_key_data, l_key_size); + memcpy(l_data,a_client_pvt->session_key_open->pub_key_data, l_key_size); if (l_sign) { memcpy(l_data + l_key_size, l_sign, l_sign_size); } diff --git a/dap-sdk/net/client/include/dap_client.h b/dap-sdk/net/client/include/dap_client.h index b18b329d9500dd5591081722a8b5f0f2d296dee0..272bf758ee390cef9147ae20b2a9b2748421427b 100644 --- a/dap-sdk/net/client/include/dap_client.h +++ b/dap-sdk/net/client/include/dap_client.h @@ -34,6 +34,7 @@ * @brief The dap_client_stage enum. Top level of client's state machine **/ typedef enum dap_client_stage { + STAGE_UNDEFINED=-1, STAGE_BEGIN=0, STAGE_ENC_INIT=1, STAGE_STREAM_CTL=2, diff --git a/dap-sdk/net/server/enc_server/dap_enc_http.c b/dap-sdk/net/server/enc_server/dap_enc_http.c index 1235945309a220b941313c288c878efd18941a2a..840cdb5a68b0f4f85f8899d6a7afb1712150f48f 100644 --- a/dap-sdk/net/server/enc_server/dap_enc_http.c +++ b/dap-sdk/net/server/enc_server/dap_enc_http.c @@ -106,7 +106,8 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) sscanf(cl_st->http_client->in_query_string, "enc_type=%d,pkey_exchange_type=%d,pkey_exchange_size=%zd", &l_enc_type,&l_pkey_exchange_type,&l_pkey_exchange_size); - + log_it(L_DEBUG, "Stream encryption: %s\t public key exchange: %s",dap_enc_get_type_name(l_enc_type), + dap_enc_get_type_name(l_pkey_exchange_type)); uint8_t alice_msg[cl_st->request_size]; size_t l_decode_len = dap_enc_base64_decode(cl_st->request, cl_st->request_size, alice_msg, DAP_ENC_DATA_TYPE_B64); dap_chain_hash_fast_t l_sign_hash = {}; diff --git a/dap-sdk/net/stream/stream/dap_stream_ctl.c b/dap-sdk/net/stream/stream/dap_stream_ctl.c index dc82ed592ccacebcd472a7bf682e888faec5b6a1..52bf55be3d7ea1de459d6ebd43193bb756723631 100644 --- a/dap-sdk/net/stream/stream/dap_stream_ctl.c +++ b/dap-sdk/net/stream/stream/dap_stream_ctl.c @@ -121,26 +121,35 @@ void s_proc(struct dap_http_simple *a_http_simple, void * a_arg) char l_channels_str[sizeof(ss->active_channels)]; dap_enc_key_type_t l_enc_type = s_socket_forward_key.type; int l_enc_headers = 0; - bool l_is_legacy=false; - int l_url_sscanf_res = sscanf(l_dg->url_path, "stream_ctl,channels=%16s,enc_type=%d,enc_headers=%d", l_channels_str, &l_enc_type, &l_enc_headers); - if(l_url_sscanf_res > 0){ - if(l_url_sscanf_res < 3){ - log_it(L_INFO, "legacy encryption mode used (OAES)"); - l_enc_type = DAP_ENC_KEY_TYPE_OAES; - l_is_legacy = true; + bool l_is_legacy=true; + char * l_tok_tmp = NULL; + char * l_tok = strtok_r(l_dg->url_path, ",",&l_tok_tmp) ; + do { + char * l_subtok_tmp = NULL; + char * l_subtok_name = strtok_r(l_tok, "=",&l_subtok_tmp); + char * l_subtok_value = strtok_r(NULL, "=",&l_subtok_tmp); + if (l_subtok_value){ + log_it(L_DEBUG, "tok = %s value =%s",l_subtok_name,l_subtok_value); + if ( strcmp(l_subtok_name,"channels")==0 ){ + strncpy(l_channels_str,l_subtok_value,sizeof (l_channels_str)-1); + log_it(L_DEBUG,"Param: channels=%s",l_channels_str); + }else if(strcmp(l_subtok_name,"enc_type")==0){ + l_enc_type = atoi(l_subtok_value); + log_it(L_DEBUG,"Param: enc_type=%s",dap_enc_get_type_name(l_enc_type)); + l_is_legacy = false; + }else if(strcmp(l_subtok_name,"enc_headers")==0){ + l_enc_headers = atoi(l_subtok_value); + log_it(L_DEBUG,"Param: enc_headers=%d",l_enc_headers); + } } + l_tok = strtok_r(NULL, ",",&l_tok_tmp) ; + } while(l_tok); + l_new_session = true; + if(l_is_legacy){ + log_it(L_INFO, "legacy encryption mode used (OAES)"); + l_enc_type = DAP_ENC_KEY_TYPE_OAES; l_new_session = true; } - else if(strcmp(l_dg->url_path, "socket_forward" ) == 0) { - l_channels_str[0] = '\0'; - l_new_session = true; - } - else{ - log_it(L_ERROR,"ctl command unknown: %s",l_dg->url_path); - enc_http_delegate_delete(l_dg); - *return_code = Http_Status_MethodNotAllowed; - return; - } if(l_new_session){ ss = dap_stream_session_pure_new();