diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 706c69956ee17426a220dcb2139685194b412b3b..28871fc23c1392e4e8910eb144da2f27451ca3b0 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -1,9 +1,12 @@ cmake_minimum_required(VERSION 2.8) project (dap_core) -set(CORE_SRCS dap_common.c dap_config.c dap_math_ops.h) - -add_library(${PROJECT_NAME} STATIC ${CORE_SRCS}) +include_directories(common/) + +set(CORE_SRCS dap_common.c dap_config.c common/memwipe.c) +set(CORE_HEADERS dap_common.h dap_config.h dap_math_ops.h common/memwipe.h common/int-util.h) + +add_library(${PROJECT_NAME} STATIC ${CORE_SRCS} ${CORE_HEADERS}) target_link_libraries(${PROJECT_NAME} ev) diff --git a/core/dap_common.h b/core/dap_common.h index 32269cf3dcad28b0c10babe2ac016700d6056b7a..582885bf6d52f8474722b3a2eeb8a8dd5d52bf49 100644 --- a/core/dap_common.h +++ b/core/dap_common.h @@ -11,6 +11,7 @@ #define DAP_NEW_Z(a) ( (a*) calloc(1,sizeof(a))) #define DAP_NEW_Z_SIZE(a,b) ( (a*) calloc(1,b)) +#define DAP_DELETE(a) free(a) #define DAP_DUP(a) (__typeof(a) ret = memcpy(ret,a,sizeof(*a)) ) diff --git a/core/dap_config.c b/core/dap_config.c index 9a3b0a74e2ff25ac6ef278d32aff9ea808dada4b..7d2b052b3332dda6dfa4c23eae1feba61d98741d 100644 --- a/core/dap_config.c +++ b/core/dap_config.c @@ -1,18 +1,35 @@ #include <stdio.h> #include <string.h> +#include <errno.h> #include "dap_common.h" #include "dap_config.h" #define LOG_TAG "dap_config" +typedef struct dap_config_internal +{ + dap_config_item_t * root; +} dap_config_internal_t; +#define DAP_CONFIG_INTERNAL(a) ( (dap_config_internal_t* ) a->_internal ) + +char *s_configs_path = "/opt/dap/etc"; + + + + /** * @brief dap_config_init - * @param a_configs_path + * @param a_configs_path If NULL path is set to default * @return */ int dap_config_init(const char * a_configs_path) { - + if( a_configs_path ){ + s_configs_path = strdup(a_configs_path); + char cmd[1024]; + snprintf(cmd,sizeof(cmd),"test -d %s || mkdir -p %s",a_configs_path,a_configs_path); + system(cmd); + } } /** @@ -30,7 +47,137 @@ void dap_config_deinit() */ dap_config_t * dap_config_open(const char * a_name) { - + dap_config_t * ret = NULL; + if ( a_name ){ + log_it(L_DEBUG,"Looking for config name %s...",a_name); + size_t l_config_path_size_max = strlen(a_name)+6+strlen(s_configs_path); + char *l_config_path = DAP_NEW_SIZE(char,l_config_path_size_max); + snprintf(l_config_path,l_config_path_size_max, "%s/%s.cfg",s_configs_path,a_name); + FILE * f = fopen(l_config_path,"r"); + if ( f ){ + log_it(L_DEBUG,"Opened config %s",a_name); + ret = DAP_NEW_Z(dap_config_t); + dap_config_internal_t * l_config_internal = DAP_NEW_Z(dap_config_internal_t); + ret->_internal = l_config_internal; + + char buf[1024]; + size_t l_global_offset=0; + size_t l_buf_size=0; + size_t l_buf_pos_line_start=0; + size_t l_buf_pos_line_end=0; + dap_config_item_t * l_section_current = NULL ; + bool l_is_space_now = false; + while ( feof(f)==0){ // Break on lines + size_t i; + l_global_offset += (l_buf_size = fread(buf,1,sizeof(buf),f) ); + for (i=0; i< l_buf_size; i++){ + if( (buf[i] == '\r') || (buf[i] == '\n' ) ){ + if( ! l_is_space_now){ + l_buf_pos_line_end = i; + l_is_space_now = true; + //if(l_buf_pos_line_end) + // l_buf_pos_line_end--; + if(l_buf_pos_line_end != l_buf_pos_line_start ){ // Line detected + char *l_line = NULL; + size_t l_line_length = 0; + size_t j; + + // Trimming spaces and skip the line if commented + for ( j = l_buf_pos_line_start; j < l_buf_pos_line_end; j++ ){ + if ( buf[j] == '#' ) + break; + if (buf[j] != ' ' ){ + l_line_length = (l_buf_pos_line_end - j); + break; + } + } + if( l_line_length ){ + l_line = DAP_NEW_SIZE(char,l_line_length+1); + memcpy(l_line,buf+j,l_line_length); + l_line[l_line_length] = 0; + + // Process trimmed line + if( (l_line[0] == '[' ) && (l_line[l_line_length-1] == ']' ) ){ // Section detected + //log_it(L_DEBUG, "Raw line '%s'",l_line); + char * l_section_name = strdup(l_line+1); + size_t l_section_name_length = (l_line_length - 2); + l_section_name[l_section_name_length]='\0'; + log_it(L_DEBUG,"Config section '%s'",l_section_name); + + dap_config_item_t * l_item = DAP_NEW_Z(dap_config_item_t); + l_item->header.name = l_section_name; + l_item->header.next = l_config_internal->root; + l_config_internal->root = l_item; + + l_section_current = l_item; + }else{ // key-value line + //log_it(L_DEBUG,"Read line '%s'",l_line); + char l_param_name[256]; + size_t l_param_name_size=0; + size_t l_param_value_size=0; + char l_param_value[1024]; + l_param_name[0] = 0; + l_param_value[0] = 0; + for ( j = 0; j < l_line_length; j++ ){ // Parse param name + if ( ( l_line[j] == ' ' )|| ( l_line[j] == '=' ) ||( l_line[j] == '\t' ) ){ // Param name + l_param_name_size = j; + if (l_param_name_size > (sizeof(l_param_name) -1) ){ + l_param_name_size = (sizeof(l_param_name) - 1 ); + log_it(L_WARNING,"Too long param name in config, %u is more than %u maximum", + j,sizeof(l_param_name) -1); + } + strncpy(l_param_name,l_line,j); + l_param_name[j] = 0; + break; + } + + } + + for (; j < l_line_length; j++ ){ // Find beginning of param value + if ( ( l_line[j] != '\t' ) && ( l_line[j] != ' ' ) && ( l_line[j] != '=' ) ){ + break; + } + } + l_param_value_size = l_line_length - j; + if (l_param_value_size ){ + if (l_param_value_size > (sizeof(l_param_value) -1) ){ + l_param_value_size = (sizeof(l_param_value) - 1 ); + log_it(L_WARNING,"Too long param value in config, %u is more than %u maximum", + l_line_length - j,sizeof(l_param_value) -1); + } + strncpy(l_param_value,l_line +j, l_param_value_size); + l_param_value[l_param_value_size] = '\0'; + for(j=l_param_value_size-1; j>=0; j--){ + if( (l_param_value[j] ==' ') || (l_param_value[j] =='\t') ){ + l_param_value[j] = '\0'; + }else{ + break; + } + } + } + log_it(L_DEBUG," Param '%s' = '%s'", l_param_name, l_param_value); + } + DAP_DELETE(l_line); + } + } + } + continue; + }else{ + if (l_is_space_now){ + l_is_space_now = false; + l_buf_pos_line_start = i; + } + } + } + } + }else{ + log_it(L_ERROR,"Can't open config file '%s' (%s)",l_config_path,strerror(errno)); + } + + }else{ + log_it(L_ERROR,"Config name is NULL"); + } + return ret; } /** @@ -63,7 +210,7 @@ int32_t dap_config_get_item_int32(dap_config_t * a_config, const char * a_sectio */ const char * dap_config_get_item_str(dap_config_t * a_config, const char * a_section_path, const char * a_item_name) { - + return NULL; } /** diff --git a/core/dap_math_ops.h b/core/dap_math_ops.h index ee801913eeb94b93c87fde6d5a5d07a5c083a113..5e90589443e291f333c86eaf111f21e4a813e205 100644 --- a/core/dap_math_ops.h +++ b/core/dap_math_ops.h @@ -2,7 +2,8 @@ #define _DAP_MATH_OPS_H_ #include <stdint.h> -#include "monero_crypto/common/int-util.h" +#include "common/int-util.h" + #if defined(__GNUC__) ||defined (__clang__) #if __SIZEOF_INT128__ == 16 diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 04c62d7088bbd167cc31c22649b724cf3d8ed59e..6e6834468e101f0b9e711e1af34a52d8cf32ae8d 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -3,7 +3,7 @@ project (dap_crypto) set(CRYPTO_SRCS dap_enc.c - + dap_enc_base64.c dap_enc_aes.c dap_enc_newhope.c @@ -12,7 +12,7 @@ set(CRYPTO_SRCS set(CRYPTO_HEADERS dap_enc.h - + dap_enc_base64.h dap_enc_aes.h dap_enc_newhope.h diff --git a/crypto/dap_enc_base64.c b/crypto/dap_enc_base64.c index 5c51a1577f3bd880bbdce16706e12c64f09b677e..aff8e0027f3ff3480a406f4579e7a7238bf7e7b6 100755 --- a/crypto/dap_enc_base64.c +++ b/crypto/dap_enc_base64.c @@ -4,7 +4,7 @@ #include <ctype.h> #include <stdlib.h> -#include "enc_base64.h" +#include "dap_enc_base64.h" #define B64_TRUE 1 #define B64_FALSE 0