diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..e80666b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} diff --git a/src/IRbaby.cpp b/src/IRbaby.cpp index 4c50105..452048c 100644 --- a/src/IRbaby.cpp +++ b/src/IRbaby.cpp @@ -104,9 +104,6 @@ void setup() { disableIRTask.attach_scheduled(DISABLE_SIGNAL_INTERVALS, disableIR); disableRFTask.attach_scheduled(DISABLE_SIGNAL_INTERVALS, disableRF); saveDataTask.attach_scheduled(SAVE_DATA_INTERVALS, settingsSave); - - // LSOC DAS2 related block - lsocHeartBeatTask.attach_scheduled(LSOC_HB_CYCLE, lsocInfoReport); } void loop() { diff --git a/src/IRbabySecurity.cpp b/src/IRbabySecurity.cpp index 6369c7d..4d53489 100644 --- a/src/IRbabySecurity.cpp +++ b/src/IRbabySecurity.cpp @@ -29,35 +29,4 @@ #include #include "IRbabySerial.h" -#include "IRbabyAlink.h" -#include "das.h" - -// global SOC session abstractive object -static void* dasSession = NULL; - -int lsocClientInit(const char* productName, const char* deviceName) { - INFOLN("initialize SOC client"); - dasSession = das_init(productName, deviceName); - - if (NULL == dasSession) { - INFOLN("failed to initialize SOC client !!"); - return -1; - } - - INFOLN("SOC client initialized"); - AliyunIoTSDK session = getSession(); - das_connection(dasSession, securityPublish, &session); - - return 0; -} - -void setDas2Alink() { - // NOTE: if the Communication-processor has MQTT support, - // set connection to virutal socket pointer - // otherwise, set to espatblished Alink publish prototype - -} - -void lsocInfoReport() { - -} \ No newline at end of file +#include "IRbabyAlink.h" \ No newline at end of file diff --git a/src/lsoc_das2/board/esp8266m01/das_board.c b/src/lsoc_das2/board/esp8266m01/das_board.c deleted file mode 100644 index 170002c..0000000 --- a/src/lsoc_das2/board/esp8266m01/das_board.c +++ /dev/null @@ -1,38 +0,0 @@ -/** - * - * Filename: das_board.c - * - * Description: BSP adapative layer - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#include - -#include "IRBabyIRIS.h" - -size_t das_hal_firmware_version(char *buf, size_t size) { - return getIRISKitVersion(buf, size); -} - -size_t das_hal_device_id(char *buf, size_t size) { - return getDeviceID(buf, size); -} - -#if (DAS_SERVICE_ROM_ENABLED) - -extern uint32_t __flash_text_start__; -extern uint32_t __flash_text_end__; - -int das_hal_rom_info(das_rom_bank_t banks[DAS_ROM_BANK_NUMBER]) { - - banks[0].address = &__flash_text_start__; - banks[0].size = &__flash_text_end__ - &__flash_text_start__; - - return DAS_ROM_BANK_NUMBER; -} - -#endif /* DAS_SERVICE_ROM_ENABLED */ diff --git a/src/lsoc_das2/board/esp8266m01/das_board.h b/src/lsoc_das2/board/esp8266m01/das_board.h deleted file mode 100644 index 40f0ad9..0000000 --- a/src/lsoc_das2/board/esp8266m01/das_board.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * - * Filename: das_board.h - * - * Description: BSP adapative layer - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - - -#ifndef __DAS_BOARD_H__ -#define __DAS_BOARD_H__ - -#include "das_configure.h" - -#if (DAS_SERVICE_ROM_ENABLED) - -#define DAS_ROM_BANK_NUMBER 1 - -#endif - - -#endif /* __DAS_BOARD_H__ */ diff --git a/src/lsoc_das2/das_attest.c b/src/lsoc_das2/das_attest.c deleted file mode 100644 index 4e2eb94..0000000 --- a/src/lsoc_das2/das_attest.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * - * Filename: das_atteste.c - * - * Description: Attestation engine - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#include "das_service.h" -#include "das_hardware.h" - -#include "das.h" - -int das_attest(const char* tag, ...) -{ - int ret = -1; - va_list args; - int i = 0; - das_attest_handler_t* attest_hdlr = NULL; - -#if (DAS_SERVICE_STACK_PROTECTION_ENABLED) - stack_protection(tag); -#endif - - va_start(args, tag); - - for (i = 0; das_attest_handler_table[i]; i++) { - attest_hdlr = das_attest_handler_table[i]; - - if (!attest_hdlr->tag || !attest_hdlr->handler) { - DAS_LOG("invalid tag handler, index: %d, tag: %s.\n", i, attest_hdlr->tag); - break; - } - - if (!strcmp(attest_hdlr->tag, tag)) { - ret = attest_hdlr->handler(args); - break; - } - } - - va_end(args); - - return ret; -} diff --git a/src/lsoc_das2/das_core.c b/src/lsoc_das2/das_core.c deleted file mode 100644 index 915196e..0000000 --- a/src/lsoc_das2/das_core.c +++ /dev/null @@ -1,1433 +0,0 @@ -/** - * - * Filename: das_core.c - * - * Description: DAS policy engine - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#include - -#include "proto/pb_encode.h" -#include "proto/pb_decode.h" -#include "proto/lsoc_pb.h" -#include "proto/lsoc_defs.h" - -#include "das_platform.h" -#include "das_service.h" -#include "das_hardware.h" -#include "das_sha1.h" - -#include "das.h" - -static const char DAS_VERSION[] = "das:2.0.1"; -static const char DAS_PROFILE[] = "profile:rtos|lv"; -static const char DAS_FIRMWARE[] = "firmware:"; - -static const char DAS_PLATFORM[] = "os:rtos,arch:"DAS_ARCH; - -static const char DAS_FIL_TAG[] = "file:"; -static const char DAS_KEY_DEVICE_ID[] = "uid:"; -static const char DAS_KEY_SEPARATOR = ','; - -#define DEVICE_ID_MAX_LEN 96 -#define DEFAULT_FIRMWARE_VERSION "0.0.0" - -// protocol : auth_code and ID in session of Message -#define MES_SESS_KEY_AUTH_CODE "auth_code:" -#define MES_SESS_KEY_ID "id:" -#define ID2_AUTH_CODE_MAX (256) - -// protocol : auth_code and ID in session of AtsDev -#define ATS_DEV_KEY_CHALLENGE "challenge:" -#define ATS_DEV_KEY_AUTH_CODE "auth_code:" -#define ATS_DEV_KEY_ID2_ID "id:" -#define ID2_CHALLANGE_AUTH_CODE_MAX (256) - -#define UPT_CMD_KEY_TOKEN "token:" -#define UPT_CMD_KEY_OTP "otp:" - - -char g_fw_ver[DEVICE_ID_MAX_LEN] = {0}; -char g_dev_id[DEVICE_ID_MAX_LEN] = {0}; - -#ifdef DAS_DEBUG - -#define DAS_LOG_ATS_CMD(ss, m) \ - DAS_LOG("ats_cmd - domain: %d\n", m.domain); \ - DAS_LOG("ats_cmd - code: %d\n", m.code); \ - DAS_LOG("ats_cmd - time_ms: 0x%lx\n", (long)m.timestamp); \ - DAS_LOG("ats_cmd - which_data: %d\n", m.which_data); \ - DAS_LOG("ats_cmd - type: %d\n", m.data.atsCmdData.type); \ - DAS_LOG("ats_cmd - patternUrl: %s\n", ss->pbb.ats_cmd_ptn_url); \ - DAS_LOG("ats_cmd - pattern: %s\n", ss->pbb.ats_cmd_ptn); - -#define DAS_LOG_MES_CMD(ss, m) \ - DAS_LOG("mes_cmd - domain: %d\n", m.domain); \ - DAS_LOG("mes_cmd - code: %d\n", m.code); \ - DAS_LOG("mes_cmd - time_ms: 0x%lx\n", (long)m.timestamp); \ - DAS_LOG("mes_cmd - which_data: %d\n", m.which_data); \ - DAS_LOG("mes_cmd - type: %d\n", m.data.mesCmdData.type); - -#define DAS_LOG_UPT_CMD(ss, m) \ - DAS_LOG("upt_cmd - domain: %d\n", m.domain); \ - DAS_LOG("upt_cmd - code: %d\n", m.code); \ - DAS_LOG("upt_cmd - time_ms: 0x%lx\n", (long)m.timestamp); \ - DAS_LOG("upt_cmd - which_data: %d\n", m.which_data); \ - DAS_LOG("upt_cmd - type: %d\n", m.data.uptCmdData.type); \ - DAS_LOG("upt_cmd - url: %s\n", ss->pbb.upt_cmd_url); \ - DAS_LOG("upt_cmd - object: %s\n", ss->pbb.upt_cmd_obj); - -#define DAS_LOG_INFO(ss, m) \ - DAS_LOG("dev_inf - domain: %d\n", m->domain); \ - DAS_LOG("dev_inf - code: %d\n", m->code); \ - DAS_LOG("dev_inf - time_ms: 0x%lx\n", (long)m->timestamp); \ - DAS_LOG("dev_inf - which_data: %d\n", m->which_data); \ - DAS_LOG("dev_inf - version: %s\n", ss->pbb.inf_ver); \ - DAS_LOG("dev_inf - device: %s\n", ss->pbb.inf_dev); \ - DAS_LOG("dev_inf - state: %s\n", ss->pbb.inf_state); \ - DAS_LOG("dev_inf - session : %s\n", ss->pbb.msg_session); - -#define DAS_LOG_ATS_FIL(ss, m) \ - DAS_LOG("ats_fil - domain: %d\n", m->domain); \ - DAS_LOG("ats_fil - code: %d\n", m->code); \ - DAS_LOG("ats_fil - time_ms: 0x%lx\n", (long)m->timestamp); \ - DAS_LOG("ats_fil - which_data: %d\n", m->which_data); \ - DAS_LOG("ats_fil - cmd: 0x%lx\n", (long)m->data.atsFilData.cmd); \ - DAS_LOG("ats_fil - path: %s\n", ss->pbb.ats_fil_path); \ - DAS_LOG("ats_fil - sum: %s\n", ss->pbb.ats_fil_sig); \ - DAS_LOG("ats_fil - attribute: %s\n", ss->pbb.ats_fil_attr); \ - DAS_LOG("ats_fil - session : %s\n", ss->pbb.msg_session); - -#define DAS_LOG_ATS_DEV(ss, m) \ - DAS_LOG("ats_dev - domain: %d\n", m->domain); \ - DAS_LOG("ats_dev - code: %d\n", m->code); \ - DAS_LOG("ats_dev - time_ms: 0x%lx\n", (long)m->timestamp); \ - DAS_LOG("ats_dev - which_data: %d\n", m->which_data); \ - DAS_LOG("ats_dev - cmd: 0x%lx\n", (long)m->data.atsDevData.cmd); \ - DAS_LOG("ats_dev - object: %s\n", ss->pbb.ats_dev_obj); \ - DAS_LOG("ats_dev - session : %s\n", ss->pbb.msg_session); - -#define DAS_LOG_ATS_END(ss, m) \ - DAS_LOG("ats_end - domain: %d\n", m->domain); \ - DAS_LOG("ats_end - code: %d\n", m->code); \ - DAS_LOG("ats_end - time_ms: 0x%lx\n", (long)m->timestamp); \ - DAS_LOG("ats_end - which_data: %d\n", m->which_data); \ - DAS_LOG("ats_end - cmd: 0x%lx\n", (long)m->data.atsEndData.cmd); \ - DAS_LOG("ats_end - total: %d\n", m->data.atsEndData.total); \ - DAS_LOG("ats_end - sum: %s\n", ss->pbb.ats_end_sum); \ - DAS_LOG("ats_end - session : %s\n", ss->pbb.msg_session); - -#define DAS_LOG_MES_FIL(ss, m) \ - DAS_LOG("mes_fil - domain: %d\n", m->domain); \ - DAS_LOG("mes_fil - code: %d\n", m->code); \ - DAS_LOG("mes_fil - time_ms: 0x%lx\n", (long)m->timestamp); \ - DAS_LOG("mes_fil - which_data: %d\n", m->which_data); \ - DAS_LOG("mes_fil - cmd: 0x%lx\n", (long)m->data.mesFilData.cmd); \ - DAS_LOG("mes_fil - sum: %s\n", ss->pbb.mes_fil_sum); \ - DAS_LOG("mes_fil - mac: %s\n", ss->pbb.mes_fil_mac); \ - DAS_LOG("mes_fil - session : %s\n", ss->pbb.msg_session); - -#define DAS_LOG_MES_END(ss, m) \ - DAS_LOG("mes_end - domain: %d\n", m->domain); \ - DAS_LOG("mes_end - code: %d\n", m->code); \ - DAS_LOG("mes_end - time_ms: 0x%lx\n", (long)m->timestamp); \ - DAS_LOG("mes_end - which_data: %d\n", m->which_data); \ - DAS_LOG("mes_end - cmd: 0x%lx\n", (long)m->data.mesEndData.cmd); \ - DAS_LOG("mes_end - total: %d\n", m->data.mesEndData.total); \ - DAS_LOG("mes_end - session : %s\n", ss->pbb.msg_session); - -#define DAS_LOG_STEPPING(ss, m) \ - DAS_LOG("stepping - step: %d\n", m->step); \ - DAS_LOG("stepping - service_index: %d\n", m->service_index); - -#define DAS_CORE_ASSERT(_x) \ - do { \ - if (!(_x)) { \ - DAS_LOG("ASSERT FAILURE:\n"); \ - DAS_LOG("%s (%d): %s\n", \ - __FILE__, __LINE__, __FUNCTION__); \ - while (1) /* loop */; \ - } \ - } while (0) - -#else - -#define DAS_LOG_INFO(ss, m) -#define DAS_LOG_ATS_CMD(ss, m) -#define DAS_LOG_MES_CMD(ss, m) -#define DAS_LOG_UPT_CMD(ss, m) -#define DAS_LOG_ATS_FIL(ss, m) -#define DAS_LOG_ATS_DEV(ss, m) -#define DAS_LOG_ATS_END(ss, m) -#define DAS_LOG_MES_FIL(ss, m) -#define DAS_LOG_MES_END(ss, m) -#define DAS_LOG_STEPPING(ss, m) - -#define DAS_CORE_ASSERT(_x) - -#endif - -#define DAS_SESSION_MAGIC 0x73736164 - -#define DAS_PUB_TOPIC(s,p,d) { \ - char *_o=s->pub_topic; \ - int _l=strlen("/sys/"); \ - memcpy(_o,"/sys/",_l); \ - _o+=_l;_l=strlen(p); \ - memcpy(_o,p,_l); \ - _o+=_l;*_o='/'; \ - _o++;_l=strlen(d); \ - memcpy(_o,d,_l);_o+=_l; \ - _l=strlen("/security/upstream"); \ - memcpy(_o,"/security/upstream",_l); \ - } -#define DAS_SUB_TOPIC(s,p,d) { \ - char *_o=s->sub_topic; \ - int _l=strlen("/sys/"); \ - memcpy(_o,"/sys/",_l); \ - _o+=_l;_l=strlen(p); \ - memcpy(_o,p,_l); \ - _o+=_l;*_o='/'; \ - _o++;_l=strlen(d); \ - memcpy(_o,d,_l);_o+=_l; \ - _l=strlen("/security/downstream"); \ - memcpy(_o,"/security/downstream",_l); \ - } - -typedef enum { - DAS_CMD_NONE = 0, - DAS_CMD_ATTEST_FULL = 1, - DAS_CMD_ATTEST_DEV = 2, // simple command : response immediately - DAS_CMD_MEASURE = 3, - DAS_CMD_UPDATE = 4, // simple command : do immediately -} das_cmd_t; - -typedef enum { - DAS_STEP_IDLE = 0, - DAS_STEP_INFO = 1, - DAS_STEP_ATTEST_FULL = 2, - DAS_STEP_MEASURE = 3, -} das_step_t; - -typedef struct _das_proto_buffer { - char ats_cmd_ptn_url[MAX_ATS_CMD_PTN_URL_SIZE]; - char ats_cmd_ptn[MAX_ATS_CMD_PTN_SIZE]; - - char upt_cmd_url[MAX_UPT_CMD_URL_SIZE]; - char upt_cmd_obj[MAX_UPT_CMD_OBJ_SIZE]; - - char inf_ver[MAX_INF_VERSION_SIZE]; - char inf_dev[MAX_INF_DEVICE_SIZE]; - char inf_state[MAX_INF_STATE_SIZE]; - - char ats_fil_path[MAX_ATS_FIL_PATH_SIZE]; - char ats_fil_attr[MAX_ATS_FIL_ATTR_SIZE]; - char ats_fil_sig[MAX_ATS_FIL_SIG_SIZE]; - - char ats_dev_obj[MAX_ATS_DEV_OBJ_SIZE]; - - char ats_end_sum[MAX_ATS_END_SUM_SIZE]; - - char mes_fil_sum[MAX_MES_FIL_SUM_SIZE]; - char mes_fil_mac[MAX_MES_FIL_MAC_SIZE]; - - char msg_session[MAX_MSG_SESS_SIZE]; -} das_proto_buffer_t; - -typedef struct _das_session { - uint32_t magic; /* magic number */ - - char pub_topic[DAS_TOPIC_LENGTH]; - char sub_topic[DAS_TOPIC_LENGTH]; - - void *channel; /* communication channel handle */ - bool connected; - publish_handle_t publish_handle; - - das_cmd_t cmd; - uint64_t cmd_id; - char cmd_buffer[DAS_CMD_BUFFER_LENGTH]; - - uint64_t info_time; - - Message report; - uint32_t report_number; - // this buffer is used as an adjustable buffer for 'Message' - das_proto_buffer_t pbb; - - das_step_t step; - uint64_t stepping_now; - das_service_t *stepping_service; - - das_sha1_context_t stepping_sum_context; - das_sha1_context_t stepping_mac_context; - - // upload and download may in different threads/tasks - uint8_t stepping_buffer[DAS_BUFFER_LENGTH]; - - uint32_t service_index; - das_service_state_t service_state; - - bool is_id2_prov; -} das_session_t; - -static das_session_t _g_session = {0}; -// For first info stage, we only report heartbeat -static bool _g_is_first_info = true; - -void *das_init(const char *product_name, const char *device_name) { - das_session_t *ss = &_g_session; - das_service_t *service; - int i; - - if (product_name == NULL || device_name == NULL) { - DAS_LOG("invalid input args\n"); - return NULL; - } - -#if(DAS_SERVICE_ID2_ID) - if (IROT_SUCCESS != lite_id2_client_init()) { - DAS_LOG("id2 init error\n"); - return NULL; - } -#endif - - ss->magic = DAS_SESSION_MAGIC; - - DAS_PUB_TOPIC(ss, product_name, device_name); - DAS_SUB_TOPIC(ss, product_name, device_name); - - for (i = 0; das_service_table[i] != NULL; i++) { - service = das_service_table[i]; - - if (!service->name) { - DAS_LOG("invalid service %d\n", i); - return NULL; - } - if (service->init) { - service->init(); - } - } - - ss->channel = NULL; - ss->publish_handle = NULL; - - ss->cmd = DAS_CMD_NONE; - ss->info_time = 0; - ss->step = DAS_STEP_IDLE; - - return ss; -} - -void das_final(void *session) { - das_service_t *service; - int i; - /* session is static, do nothing*/ - DAS_LOG("das session finalized.\n"); - - for (i = 0; das_service_table[i] != NULL; i++) { - service = das_service_table[i]; - - if (!service->name) { - DAS_LOG("invalid service %d\n", i); - return; - } - - if (service->deinit) { - service->deinit(); - } - } -} - -static const char *_get_sub_topic(das_session_t *session) { - return session->sub_topic; -} - -const char *das_sub_topic(void *session, const char *topic) { - uint32_t topic_len; - das_session_t *ss = (das_session_t *)session; - - if (ss == NULL) { - DAS_LOG("invalid input args\n"); - return NULL; - } - - if (topic == NULL) { - return _get_sub_topic(ss); - } - - topic_len = strlen(topic); - if (topic_len > DAS_TOPIC_LENGTH - 1) { - return NULL; - } - - memcpy(ss->sub_topic, topic, topic_len); - ss->sub_topic[topic_len] = '\0'; - - return ss->sub_topic; -} - -static const char *_get_pub_topic(das_session_t *session) { - return session->pub_topic; -} - -const char *das_pub_topic(void *session, const char *topic) { - uint32_t topic_len; - das_session_t *ss = (das_session_t *)session; - - if (ss == NULL) { - DAS_LOG("invalid input args\n"); - return NULL; - } - - if (topic == NULL) { - return _get_pub_topic(ss); - } - - topic_len = strlen(topic); - if (topic_len > DAS_TOPIC_LENGTH - 1) { - DAS_LOG("short buffer, %d\n", topic_len); - return NULL; - } - - memcpy(ss->pub_topic, topic, topic_len); - ss->pub_topic[topic_len] = '\0'; - - return ss->pub_topic; -} - -void das_connection(void *session, publish_handle_t publish_handle, void *channel) { - das_session_t *ss = (das_session_t *)session; - - if (session == NULL || publish_handle == NULL || channel == NULL) { - DAS_LOG("invalid input args\n"); - DAS_CORE_ASSERT(0); - return; - } - - if (ss->magic != DAS_SESSION_MAGIC) { - DAS_LOG("invalid session magic, 0x%x\n", ss->magic); - DAS_CORE_ASSERT(0); - return; - } - - ss->channel = channel; - ss->publish_handle = publish_handle; - ss->connected = false; - - return; -} - -void das_on_connected(void *session) { - das_session_t *ss = (das_session_t *)session; - - DAS_CORE_ASSERT(session != NULL && ss->magic == DAS_SESSION_MAGIC); - - ss->connected = true; - - return; -} - -void das_on_disconnected(void *session) { - das_session_t *ss = (das_session_t *)session; - - DAS_CORE_ASSERT(session != NULL && ss->magic == DAS_SESSION_MAGIC); - - ss->connected = false; - - return; -} - -#if defined DAS2_FEATURE_ATTESTATION -das_result_t _do_update_cmd(const char * cmd_buffer, - char * out_buffer, int out_buffer_size, - bool * is_id2_prov) { - das_result_t res = DAS_SUCCESS; - lite_irot_result_t id2_res = IROT_SUCCESS; - char delim_comma[] = ","; - // char delim_colon[] = ":"; - char ** result_pair = NULL; - size_t i, nb_pair; - uint8_t auth_code[ID2_AUTH_CODE_MAX]; - uint32_t auth_code_len = sizeof(auth_code); - uint32_t base64_auth_code_len = 0; - - if (!cmd_buffer || !out_buffer || !is_id2_prov) { - return DAS_ERROR_BAD_PARAMETERS; - } - - out_buffer[0] = '\0'; - - result_pair = das_strsplit(cmd_buffer, delim_comma, &nb_pair); - if (result_pair) { - for (i = 0; i < nb_pair; i++) { - DAS_LOG("update data : %s\n", result_pair[i]); - - if (strncmp(result_pair[i], UPT_CMD_KEY_TOKEN, strlen(UPT_CMD_KEY_TOKEN)) == 0) { - char * ptr = result_pair[i] + strlen(UPT_CMD_KEY_TOKEN); - - if (out_buffer_size < strlen(MES_SESS_KEY_AUTH_CODE) + 4 * ((ID2_AUTH_CODE_MAX + 2) / 3) + 1) { - DAS_LOG("input buffer to small, buffer size = %d\n", out_buffer_size); - res = DAS_ERROR_SHORT_BUFFER; - break; - } - - id2_res = lite_id2_client_get_otp_auth_code((uint8_t*)ptr, strlen(ptr), - auth_code, &auth_code_len); - - if (id2_res != IROT_SUCCESS) { - DAS_LOG("lite_id2_client_get_otp_auth_code = %d\n", id2_res); - out_buffer[0] = '\0'; - res = DAS_ERROR_ID2_INTERNAL; - } else { - base64_auth_code_len = out_buffer_size - strlen(MES_SESS_KEY_AUTH_CODE); - if (id2_plat_base64_encode(auth_code, auth_code_len, - (uint8_t*)out_buffer + strlen(MES_SESS_KEY_AUTH_CODE), &base64_auth_code_len) == 0) { - memcpy(out_buffer, MES_SESS_KEY_AUTH_CODE, strlen(MES_SESS_KEY_AUTH_CODE)); - DAS_LOG("encoded auth code : %s\n", out_buffer); - *is_id2_prov = true; - } else { - DAS_LOG("id2_plat_base64_encode error\n"); - out_buffer[0] = '\0'; - res = DAS_ERROR_ID2_INTERNAL; - } - } - } else if (strncmp(result_pair[i], UPT_CMD_KEY_OTP, strlen(UPT_CMD_KEY_OTP)) == 0) { - uint8_t * raw_otp = (uint8_t*) result_pair[i] + strlen(UPT_CMD_KEY_OTP); - uint32_t raw_otp_len = strlen(result_pair[i] + strlen(UPT_CMD_KEY_OTP)); - uint32_t otp_data_len = 0; - uint8_t * otp_data = (uint8_t*) malloc(sizeof(uint8_t) * raw_otp_len); - - if (otp_data) { - DAS_LOG("encoded otp data : %s\n", raw_otp); - if (id2_plat_base64_decode(raw_otp, raw_otp_len, otp_data, &otp_data_len) == 0) { - DAS_LOG("decoded otp data len : %d\n", otp_data_len); - id2_res = lite_id2_client_load_otp_data(otp_data, otp_data_len); - if (id2_res != IROT_SUCCESS) { - DAS_LOG("lite_id2_client_load_otp_data = %d\n", id2_res); - res = DAS_ERROR_ID2_INTERNAL; - } - } else { - DAS_LOG("id2_plat_base64_decode error\n"); - res = DAS_ERROR_ID2_INTERNAL; - } - free(otp_data); - } else { - DAS_LOG("out-of-memory"); - res = DAS_ERROR_OUT_OF_MEMORY; - } - } else { - DAS_LOG("unknown update data error\n"); - res = DAS_ERROR_NOT_SUPPORTED; - } - - } - free(result_pair); - } else { - DAS_LOG("out-of-mem error"); - res = DAS_ERROR_OUT_OF_MEMORY; - } - - return res; -} -#endif - -bool _proto_write_string(das_pb_ostream_t *stream, const das_pb_field_t *field, void * const *arg) { - char *str = *arg; - - if (!das_pb_encode_tag_for_field(stream, field)) - return false; - - return das_pb_encode_string(stream, (uint8_t*)str, strlen(str)); -} - -bool _proto_read_string(das_pb_istream_t *stream, const das_pb_field_t *field, void **arg) { - // uint8_t buffer[MAX_COMMON_READ_BUFFER_SIZE]; - int len = stream->bytes_left; - uint8_t *buffer = *arg; - - // if (len > sizeof(buffer) - 1) { - // DAS_LOG("MAX_COMMON_READ_BUFFER_SIZE too small\n"); - // return false; - // } - - // buffer[len] = '\0'; - - if (!das_pb_read(stream, buffer, len)) - return false; - - /* Print the string, in format comparable with protoc --decode. - * Format comes from the arg defined in main(). - */ - // strncpy(tmp, buffer, MAX_COMMON_READ_BUFFER_SIZE); - - return true; -} - -/* - * https://github.com/nanopb/nanopb/blob/master/tests/oneof_callback/decode_oneof.c - */ -/* The callback below is a message-level callback which is called before each - * submessage is encoded. It is used to set the das_pb_callback_t callbacks inside - * the submessage. The reason we need this is that different submessages share - * storage inside oneof union, and before we know the message type we can't set - * the callbacks without overwriting each other. - */ - -bool _proto_decode_message_data(das_pb_istream_t *stream, const das_pb_field_t *field, void **arg) { - /* Print the prefix field before the submessages. - * This also demonstrates how to access the top level message fields - * from callbacks. - */ - // Message *top_msg = field->message; - // DAS_LOG("prefix: %d\n", (int)topmsg->prefix); - - das_session_t *ss = *arg; - - if (field->tag == Message_atsCmdData_tag) { - - AtsCmdData *ats_cmd_data = field->pData; - DAS_LOG("parse ats cmd with type = %d\n", (int) ats_cmd_data->type); - - ats_cmd_data->patternUrl.funcs.decode = _proto_read_string; - ats_cmd_data->patternUrl.arg = ss->pbb.ats_cmd_ptn_url; - ats_cmd_data->pattern.funcs.decode = _proto_read_string; - ats_cmd_data->pattern.arg = ss->pbb.ats_cmd_ptn; - - } else if (field->tag == Message_mesCmdData_tag) { - - MesCmdData *mes_cmd_data = field->pData; - DAS_LOG("parse mes cmd with type = %d\n", (int) mes_cmd_data->type); - - } else if (field->tag == Message_uptCmdData_tag) { - - UptCmdData *upt_cmd_data = field->pData; - DAS_LOG("parse upt cmd with type = %d\n", (int) upt_cmd_data->type); - - upt_cmd_data->url.funcs.decode = _proto_read_string; - upt_cmd_data->url.arg = ss->pbb.upt_cmd_url; - upt_cmd_data->object.funcs.decode = _proto_read_string; - upt_cmd_data->object.arg = ss->pbb.upt_cmd_obj; - - } else { - DAS_LOG("cannot parse the submessage error, tag = %d\n", (int)field->tag); - return false; - } - - /* Once we return true, das_pb_dec_submessage() will go on to decode the - * submessage contents. But if we want, we can also decode it ourselves - * above and leave stream->bytes_left at 0 value, inhibiting automatic - * decoding. - */ - return true; -} - -#if defined DAS2_FEATURE_ATTESTATION -static das_result_t _do_attest_dev(const char * cmd_buffer, - char * out_buffer, - int out_buffer_size) { - das_result_t res = DAS_SUCCESS; - lite_irot_result_t id2_res = IROT_SUCCESS; - uint32_t auth_code_len, id_len; - int offset = 0; - char * challenge = NULL; - char delim_colon[] = ":"; - - if (!cmd_buffer || !out_buffer) { - return DAS_ERROR_BAD_PARAMETERS; - } - - // buffer size check -> auth_code:xxx,id:xxx - if ((out_buffer_size - 1) < (strlen(ATS_DEV_KEY_AUTH_CODE) + - ID2_CHALLANGE_AUTH_CODE_MAX + 1 + strlen(ATS_DEV_KEY_ID2_ID) + ID2_ID_LEN)) { - DAS_LOG("buffer not enough"); - return DAS_ERROR_SHORT_BUFFER; - } - - DAS_LOG("command : %s\n", cmd_buffer); - - challenge = strstr(cmd_buffer, delim_colon); - if (!challenge) { - DAS_LOG("challenge parse error"); - return DAS_ERROR_SOC_PROTO_ERROR; - } - - challenge += 1; - DAS_LOG("challenge : %s\n", challenge); - - offset = strlen(ATS_DEV_KEY_AUTH_CODE); - memcpy(out_buffer, ATS_DEV_KEY_AUTH_CODE, offset); - - auth_code_len = out_buffer_size - offset - 1;// buffer length when used as input - id2_res = lite_id2_client_get_challenge_auth_code(challenge, - NULL, 0, - (uint8_t*)(out_buffer + offset), - &auth_code_len); - - if (id2_res != IROT_SUCCESS) { - DAS_LOG("lite_id2_client_get_challenge_auth_code = %d\n", id2_res); - out_buffer[0] = '\0'; - res = DAS_ERROR_ID2_INTERNAL; - } else { - offset += auth_code_len; - - out_buffer[offset] = DAS_KEY_SEPARATOR; - offset++; - - memcpy(out_buffer + offset, ATS_DEV_KEY_ID2_ID, strlen(ATS_DEV_KEY_ID2_ID)); - offset += strlen(ATS_DEV_KEY_ID2_ID); - - id_len = out_buffer_size - offset - 1;// buffer length when used as input - if (IROT_SUCCESS == lite_id2_client_get_id((uint8_t*)(out_buffer + offset), &id_len)) { - offset += id_len; - out_buffer[offset] = '\0'; - } else { - DAS_LOG("cannot get id2 id"); - out_buffer[offset] = '\0'; - res = DAS_ERROR_ID2_INTERNAL; - } - } - - return res; -} -#endif - -static void _reset_protocol_buffer(das_session_t *session) { - session->pbb.ats_cmd_ptn_url[0] = '\0'; - session->pbb.ats_cmd_ptn[0] = '\0'; - - session->pbb.upt_cmd_url[0] = '\0'; - session->pbb.upt_cmd_obj[0] = '\0'; - - session->pbb.inf_ver[0] = '\0'; - session->pbb.inf_dev[0] = '\0'; - session->pbb.inf_state[0] = '\0'; - - session->pbb.ats_fil_path[0] = '\0'; - session->pbb.ats_fil_attr[0] = '\0'; - session->pbb.ats_fil_sig[0] = '\0'; - - session->pbb.ats_dev_obj[0] = '\0'; - - session->pbb.ats_end_sum[0] = '\0'; - - session->pbb.mes_fil_sum[0] = '\0'; - session->pbb.mes_fil_mac[0] = '\0'; - - session->pbb.msg_session[0] = '\0'; -} - -static int _decode_message(das_session_t *session, const uint8_t *message, size_t size) { - bool status; - das_pb_istream_t stream; - Message cmd = Message_init_zero; - - if (session == NULL || message == NULL || size == 0) { - DAS_LOG("invalid input args\n"); - return DAS_ERROR_BAD_PARAMETERS; - } - - /* reset protocol buffer before decoding message */ - _reset_protocol_buffer(session); - - cmd.cb_data.funcs.decode = _proto_decode_message_data; - cmd.cb_data.arg = session; - stream = das_pb_istream_from_buffer(message, size); - - status = das_pb_decode(&stream, Message_fields, &cmd); - if (!status) { - DAS_LOG("decode failed: %s\n", PB_GET_ERROR(&stream)); - return DAS_ERROR_GENERIC; - } - - if (cmd.which_data == Message_atsCmdData_tag) { - if (AtsCmdData_Type_FULL == cmd.data.atsCmdData.type) { - DAS_LOG_ATS_CMD(session, cmd); - - session->cmd = DAS_CMD_ATTEST_FULL; - session->cmd_id = cmd.timestamp; - - } else if (AtsCmdData_Type_DEV == cmd.data.atsCmdData.type) { - DAS_LOG_ATS_CMD(session, cmd); - - session->cmd = DAS_CMD_ATTEST_DEV; - session->cmd_id = cmd.timestamp; - - // put update data to stepping buffer - strncpy((char*)session->cmd_buffer, - session->pbb.ats_cmd_ptn, - DAS_CMD_BUFFER_LENGTH - 1); - ((char*)session->cmd_buffer)[DAS_CMD_BUFFER_LENGTH - 1] = '\0'; - - } else { - DAS_LOG("not support ats cmd type: %d\n", cmd.data.atsCmdData.type); - return DAS_ERROR_NOT_SUPPORTED; - } - - } else if (cmd.which_data == Message_mesCmdData_tag) { - if (MesCmdData_Type_FULL != cmd.data.mesCmdData.type) { - DAS_LOG("not support mes cmd type: %d\n", cmd.data.mesCmdData.type); - return DAS_ERROR_NOT_SUPPORTED; - } - - DAS_LOG_MES_CMD(session, cmd); - - session->cmd = DAS_CMD_MEASURE; - session->cmd_id = cmd.timestamp; - - } else if (cmd.which_data == Message_uptCmdData_tag) { - if (UptCmdData_Type_SESSION != cmd.data.uptCmdData.type) { - DAS_LOG("not support upt cmd type: %d\n", cmd.data.uptCmdData.type); - return DAS_ERROR_NOT_SUPPORTED; - } - - DAS_LOG_UPT_CMD(session, cmd); - - session->cmd = DAS_CMD_UPDATE; - session->cmd_id = cmd.timestamp; - - // put update data to stepping buffer - strncpy((char*)session->cmd_buffer, - session->pbb.upt_cmd_obj, - DAS_CMD_BUFFER_LENGTH - 1); - ((char*)session->cmd_buffer)[DAS_CMD_BUFFER_LENGTH - 1] = '\0'; - - } else { - DAS_LOG("unknown command: %d\n", cmd.which_data); - } - - return DAS_SUCCESS; -} - -void das_on_message(void *session, const uint8_t *message, size_t size) { - das_session_t *ss = (das_session_t *)session; - - if (session == NULL || ss->magic != DAS_SESSION_MAGIC) { - DAS_LOG("Invalid session 0x%lx\n", (long)ss); - return; - } - - if (message == NULL || size == 0) { - DAS_LOG("Invalid message 0x%lx\n", (long)message); - return; - } - - if (ss->cmd != DAS_CMD_NONE) { - DAS_LOG("DAS command (%d) is in processing, so a incoming command dropped.\n", ss->cmd); - return; - } - - _decode_message(ss, message, size); -} - -static size_t _encode_message(das_session_t *session, Message *message) { - bool status; - size_t size; - das_pb_ostream_t stream; - - status = das_pb_get_encoded_size(&size, Message_fields, message); - if (!status) { - DAS_LOG("get encoded size failed\n"); - return 0; - } - - /* get buf size only */ - if (message == NULL) { - return size; - } - - if (size > DAS_BUFFER_LENGTH) { - DAS_LOG("short buffer, %lx\n", (long)size); - return 0; - } - - stream = das_pb_ostream_from_buffer(session->stepping_buffer, size); - - status = das_pb_encode(&stream, Message_fields, message); - if (!status) { - DAS_LOG("encoding failed: %s\n", PB_GET_ERROR(&stream)); - return 0; - } - - return size; -} - -static void _publish_message(das_session_t *session) { - size_t size; - - if (session->connected) { - size = _encode_message(session, &session->report); - if (size > 0) { - session->publish_handle(session->pub_topic, - session->stepping_buffer, size, session->channel); - } - } - - /* reset protocol buffer after publish message */ - _reset_protocol_buffer(session); -} - -static void _fill_session(char * buffer, int size) { - -#if (DAS_SERVICE_ID2_ID) - uint32_t id_buf_len = 0; - int id_tag_len = strlen(MES_SESS_KEY_ID); - - if (!buffer) { - DAS_LOG("buffer null\n"); - return; - } - - if (size < id_tag_len + ID2_ID_LEN + 1) { - DAS_LOG("buffer too small\n"); - return; - } - - // if we cannot get id2 id, let server know - id_buf_len = size - id_tag_len - 1; - if (IROT_SUCCESS == lite_id2_client_get_id((uint8_t*)(buffer + id_tag_len), &id_buf_len)) { - memcpy(buffer, MES_SESS_KEY_ID, id_tag_len); - //memcpy(buffer + id_tag_len, id, id_buf_len); - buffer[id_tag_len + id_buf_len] = '\0'; - } else { - DAS_LOG("cannot get id2 id\n"); - buffer[0] = '\0'; - } -#endif -} - -static void _publish_info(das_session_t *session, bool final) { - Message *report = &(session->report); - InfData *info = &(report->data.infData); - char *offset; - int length; - size_t device_id_len = 0; - char *fversion = NULL; - - if (true == final) { - return; - } - - /******************************************** - * Setup encode buffer - ********************************************/ - report->session.funcs.encode = _proto_write_string; - report->session.arg = session->pbb.msg_session; - - info->version.funcs.encode = _proto_write_string; - info->version.arg = session->pbb.inf_ver; - info->device.funcs.encode = _proto_write_string; - info->device.arg = session->pbb.inf_dev; - info->state.funcs.encode = _proto_write_string; - info->state.arg = session->pbb.inf_state; - /********************************************/ - - report->domain = Domain_SYS; - report->code = Code_INF; - report->timestamp = session->stepping_now; - report->which_data = Message_infData_tag; - - if (!session->is_id2_prov) { - _fill_session(session->pbb.msg_session, sizeof(session->pbb.msg_session)); - } - - /* das version */ - offset = session->pbb.inf_ver; - length = strlen(DAS_VERSION); - memcpy(offset, DAS_VERSION, length); - offset += length; - *offset = DAS_KEY_SEPARATOR; - offset++; - - /* profile */ - length = strlen(DAS_PROFILE); - memcpy(offset, DAS_PROFILE, length); - offset += length; - *offset = DAS_KEY_SEPARATOR; - offset++; - - /* firmware version */ - length = strlen(DAS_FIRMWARE); - memcpy(offset, DAS_FIRMWARE, length); - offset += length; - - length = sizeof(session->pbb.inf_ver) - (offset - session->pbb.inf_ver); - fversion = strlen(g_fw_ver) > 0 ? g_fw_ver : DEFAULT_FIRMWARE_VERSION; - length = length > strlen(fversion) ? strlen(fversion) : length - 1; - memcpy(offset, fversion, length); - /* truncate overflow */ - offset += length; - *offset = '\0'; - - /* device & device.arch */ - offset = session->pbb.inf_dev; - length = strlen(DAS_PLATFORM); - memcpy(offset, DAS_PLATFORM, length); - offset += length; - - /* device.id */ - length = 0; - device_id_len = strlen(g_dev_id); - if (device_id_len) { - *offset = DAS_KEY_SEPARATOR; - offset++; - - length = strlen(DAS_KEY_DEVICE_ID); - memcpy(offset, DAS_KEY_DEVICE_ID, length); - offset += length; - - length = sizeof(session->pbb.inf_dev) - (offset - session->pbb.inf_dev); - length = length > device_id_len ? device_id_len : length - 1; - memcpy(offset, g_dev_id, length); - } - - /* truncate overflow */ - offset += length; - *offset = '\0'; - - DAS_LOG_INFO(session, report); - - _publish_message(session); -} - -#if defined DAS2_FEATURE_ATTESTATION -static void _publish_attest(das_session_t *session, bool final) { - uint8_t hash[DAS_SHA1_LENGTH]; - Message *report = &(session->report); - AtsFilData *fdata = &(report->data.atsFilData); - AtsEndData *edata = &(report->data.atsEndData); - das_sum_context_t *sum_ctx = (das_sum_context_t *)session->stepping_buffer; - - /******************************************** - * Setup encode buffer - ********************************************/ - report->session.funcs.encode = _proto_write_string; - report->session.arg = session->pbb.msg_session; - /********************************************/ - - report->domain = Domain_SYS; - report->code = Code_ATS; - report->timestamp = session->stepping_now; - - _fill_session(session->pbb.msg_session, sizeof(session->pbb.msg_session)); - - /* recycle sum context if final */ - das_sum_finish(sum_ctx, hash); - - if (false == final) { - report->which_data = Message_atsFilData_tag; - fdata->cmd = session->cmd_id; - - /******************************************** - * Setup encode buffer for Ats Fil - ********************************************/ - fdata->path.funcs.encode = _proto_write_string; - fdata->path.arg = session->pbb.ats_fil_path; - fdata->attribute.funcs.encode = _proto_write_string; - fdata->attribute.arg = session->pbb.ats_fil_attr; - fdata->signature.funcs.encode = _proto_write_string; - fdata->signature.arg = session->pbb.ats_fil_sig; - - das_hex2string(session->pbb.ats_fil_sig, sizeof(session->pbb.ats_fil_sig), hash, DAS_SHA1_LENGTH); - - das_sum_update(&session->stepping_sum_context, hash, DAS_SHA1_LENGTH); - session->report_number++; - - DAS_LOG_ATS_FIL(session, report); - - _publish_message(session); - - /* re-start sum context */ - das_sum_start(sum_ctx); - } else { - report->which_data = Message_atsEndData_tag; - edata->cmd = session->cmd_id; - edata->total = session->report_number; - - /******************************************** - * Setup encode buffer for Ats End - ********************************************/ - edata->sum.funcs.encode = _proto_write_string; - edata->sum.arg = session->pbb.ats_end_sum; - - das_sum_finish(&session->stepping_sum_context, hash); - - memcpy(session->pbb.ats_end_sum, DAS_FIL_TAG, strlen(DAS_FIL_TAG)); - das_hex2string((char*)session->pbb.ats_end_sum + strlen(DAS_FIL_TAG), - sizeof(session->pbb.ats_end_sum) - strlen(DAS_FIL_TAG), hash, DAS_SHA1_LENGTH); - - DAS_LOG_ATS_END(session, report); - - _publish_message(session); - - session->cmd = DAS_CMD_NONE; - } -} - -static void _publish_measure(das_session_t *session, bool final) { - uint8_t hash[DAS_SHA1_LENGTH]; - Message *report = &(session->report); - MesFilData *fdata = &(report->data.mesFilData); - MesEndData *edata = &(report->data.mesEndData); - das_sum_context_t *sum_ctx = (das_sum_context_t *)session->stepping_buffer; - - /******************************************** - * Setup encode buffer - ********************************************/ - report->session.funcs.encode = _proto_write_string; - report->session.arg = session->pbb.msg_session; - /********************************************/ - - report->domain = Domain_SYS; - report->code = Code_MES; - report->timestamp = session->stepping_now; - - _fill_session(session->pbb.msg_session, sizeof(session->pbb.msg_session)); - - /* recycle sum context if final */ - das_sum_finish(sum_ctx, hash); - - if (false == final) { - das_sum_update(&session->stepping_sum_context, hash, DAS_SHA1_LENGTH); - - /* re-start sum context */ - das_sum_start(sum_ctx); - } else { - report->which_data = Message_mesFilData_tag; - fdata->cmd = session->cmd_id; - - /******************************************** - * Setup encode buffer for Mes Fil - ********************************************/ - fdata->sum.funcs.encode = _proto_write_string; - fdata->sum.arg = session->pbb.mes_fil_sum; - fdata->mac.funcs.encode = _proto_write_string; - fdata->mac.arg = session->pbb.mes_fil_mac; - - das_sum_finish(&session->stepping_sum_context, hash); - - das_hex2string(session->pbb.mes_fil_sum, sizeof(session->pbb.mes_fil_sum), hash, DAS_SHA1_LENGTH); - - das_mac_finish(&session->stepping_mac_context, hash); - - das_hex2string(session->pbb.mes_fil_mac, sizeof(session->pbb.mes_fil_mac), hash, DAS_SHA1_LENGTH); - - DAS_LOG_MES_FIL(session, report); - _publish_message(session); - - report->which_data = Message_mesEndData_tag; - edata->cmd = session->cmd_id; - edata->total = 1; - - DAS_LOG_MES_END(session, report); - - _publish_message(session); - - session->cmd = DAS_CMD_NONE; - } -} - -static void _publish_ats_dev(das_session_t *session, bool final) { - Message *report = &(session->report); - AtsDevData *dev = &(report->data.atsDevData); - - /******************************************** - * Setup encode buffer - ********************************************/ - report->session.funcs.encode = _proto_write_string; - report->session.arg = session->pbb.msg_session; - - dev->object.funcs.encode = _proto_write_string; - dev->object.arg = session->pbb.ats_dev_obj; - /********************************************/ - - report->domain = Domain_SYS; - report->code = Code_ATS; - report->timestamp = session->stepping_now; - report->which_data = Message_atsDevData_tag; - - _fill_session(session->pbb.msg_session, sizeof(session->pbb.msg_session)); - - /* cmd timestamp */ - dev->cmd = session->cmd_id; - - DAS_LOG_ATS_DEV(session, report); - - _publish_message(session); - - session->cmd = DAS_CMD_NONE; -} - -#if (DAS_AUTO_MEASURE) -static bool _das_measured = false; -void _das_auto_measure(das_session_t *session, uint64_t now) { - if (session == NULL || now == 0) { - return; - } - - if (_das_measured == false) { - session->cmd = DAS_CMD_MEASURE; - session->cmd_id = now; - _das_measured = true; - } -} -#endif - -static das_result_t _process_update_cmd(das_session_t *ss) { - das_result_t ret = DAS_SUCCESS; - - if (!ss) { - DAS_LOG("null param"); - ret = DAS_ERROR_GENERIC; - } else { - ss->is_id2_prov = false; - - ret = _do_update_cmd(ss->cmd_buffer, // paramters for update - (char*)(ss->pbb.msg_session), - sizeof(ss->pbb.msg_session), - &ss->is_id2_prov); - - if (ret != DAS_SUCCESS) { - DAS_LOG("service update error, err code: %d\n", ret); - } else { - // TODO: put state assignment to _publish_info because we want it to be determined - // after which_data is set. - ss->pbb.inf_state[0] = '\0'; - _publish_info(ss, false); - } - - ss->is_id2_prov = false; - } - - ss->cmd = DAS_CMD_NONE; - - return ret; -} - -static das_result_t _process_attest_dev(das_session_t *ss) { - das_result_t ret = DAS_SUCCESS; - - ret = _do_attest_dev(ss->cmd_buffer, // paramters for ats dev - (char*)(ss->pbb.ats_dev_obj), - sizeof(ss->pbb.ats_dev_obj)); - if (ret != DAS_SUCCESS) { - DAS_LOG("service attest dev error, err code: %d\n", ret); - } else { - _publish_ats_dev(ss, false); - } - - ss->cmd = DAS_CMD_NONE; - - return ret; -} - -#endif /* DAS2_FEATURE_ATTESTATION */ - -/* - * A exception case to drop message if we must - */ -static bool dropping_policy(const das_session_t * ss) { - if (!ss) { - return true; - } - - /* Rule#1 : For first info stage, we only report heartbeat */ - if (_g_is_first_info) { - if (ss->stepping_service && - ss->stepping_service->name && - strncmp(ss->stepping_service->name, SERVICE_NAME_SYS, strlen(SERVICE_NAME_SYS) + 1) != 0) { - DAS_LOG("Now is the first info stage, drop %s info\n", ss->stepping_service->name); - return true; - } - } - - return false; -} - -das_result_t das_stepping(void *session, uint64_t now) { - das_result_t ret = DAS_SUCCESS; - bool is_stepping = false; - das_session_t *ss = (das_session_t *)session; - uint8_t hash[DAS_SHA1_LENGTH] = {0}; - das_sum_context_t *sum_ctx = (das_sum_context_t *)ss->stepping_buffer; - - if (ss == NULL || ss->magic != DAS_SESSION_MAGIC) { - DAS_LOG("invalid session, 0x%lx\n", (long)ss); - return DAS_ERROR_BAD_PARAMETERS; - } - - ss->stepping_now = now; - - if (ss->step == DAS_STEP_IDLE) { - if (ss->cmd != DAS_CMD_NONE) { - ss->report_number = 0; -#if defined DAS2_FEATURE_ATTESTATION - if (ss->cmd == DAS_CMD_ATTEST_FULL) { - das_sum_start(sum_ctx); - das_sum_start(&ss->stepping_sum_context); - ss->step = DAS_STEP_ATTEST_FULL; - } else if (ss->cmd == DAS_CMD_ATTEST_DEV) { - _process_attest_dev(ss); - } else if (ss->cmd == DAS_CMD_MEASURE) { - das_sum_start(sum_ctx); - das_sum_start(&ss->stepping_sum_context); - - das_mac_start(&ss->stepping_mac_context); - das_mac_update(&ss->stepping_mac_context, (uint8_t *)&ss->cmd_id, sizeof(uint64_t)); - ss->step = DAS_STEP_MEASURE; - } else if (ss->cmd == DAS_CMD_UPDATE) { - _process_update_cmd(ss); - } else { - DAS_LOG("unknown cmd, keep idle"); - } -#else - DAS_LOG("unknown cmd, keep idle"); -#endif - } else { - _g_is_first_info = (ss->info_time == 0) ? true : false; - if (ss->info_time == 0 || now - ss->info_time > DAS_HEARTBEAT_PERIOD) { - ss->info_time = now; - ss->step = DAS_STEP_INFO; - } else { -#if (DAS_AUTO_MEASURE) - _das_auto_measure(ss, now); -#endif - } - } - - ss->service_index = 0; - ss->stepping_service = das_service_table[0]; - ss->service_state.status = DAS_SRV_STATUS_START; - } - - if (ss->step != DAS_STEP_IDLE) { - das_service_state_t *service_state = &ss->service_state; - void (*publish_handle)(das_session_t *, bool) = NULL; - - memset(&ss->report, 0, sizeof(Message)); - - switch (ss->step) { - case DAS_STEP_INFO: { - publish_handle = _publish_info; - if (ss->stepping_service->info) { - ret = ss->stepping_service->info( - (char*) & (ss->pbb.inf_state), - sizeof(ss->pbb.inf_state), service_state); - - if (ret == DAS_ERROR_GENERIC && strlen((char*) & (ss->pbb.inf_state)) == 0) { - ret = DAS_SUCCESS; - is_stepping = true; - } - - if (ret != DAS_SUCCESS) { - DAS_LOG("service %s info error, err code: %d\n", ss->stepping_service->name, ret); - goto _out; - } - } else { - is_stepping = true; - } - break; - } -#if defined DAS2_FEATURE_ATTESTATION - case DAS_STEP_ATTEST_FULL: { - publish_handle = _publish_attest; - if (ss->stepping_service->attest) { - ret = ss->stepping_service->attest( - (char*) & (ss->pbb.ats_fil_path), - sizeof(ss->pbb.ats_fil_path), - (char*) & (ss->pbb.ats_fil_attr), - sizeof(ss->pbb.ats_fil_attr), - sum_ctx, - service_state - ); - if (ret != DAS_SUCCESS) { - DAS_LOG("service %s attest error, err code: %d\n", ss->stepping_service->name, ret); - goto _out; - } - } else { - is_stepping = true; - } - break; - } - case DAS_STEP_MEASURE: { - publish_handle = _publish_measure; - if (ss->stepping_service->measure) { - ret = ss->stepping_service->measure(sum_ctx, &ss->stepping_mac_context, service_state); - if (ret != DAS_SUCCESS) { - DAS_LOG("service %s measure error, err code: %d\n", ss->stepping_service->name, ret); - goto _out; - } - } else { - is_stepping = true; - } - break; - } -#endif - default: - DAS_LOG("invalid das step status, %d\n", ss->step); - ret = DAS_ERROR_GENERIC; - goto _out; - } - - if (is_stepping) { - service_state->status = DAS_SRV_STATUS_START; - ss->service_index++; - } else { - if (service_state->status == DAS_SRV_STATUS_PUBLISH) { - if (!dropping_policy(ss)) { - publish_handle(ss, false); - } - } else if (service_state->status == DAS_SRV_STATUS_FINISH) { - if (!dropping_policy(ss)) { - publish_handle(ss, false); - } - service_state->status = DAS_SRV_STATUS_START; - ss->service_index++; - } - } - - ss->stepping_service = das_service_table[ss->service_index]; - if (ss->stepping_service == NULL) { - if (!dropping_policy(ss)) { - publish_handle(ss, true); - } - ss->step = DAS_STEP_IDLE; - } - } - -_out: - // TODO : not all failure goes here - if (ret != DAS_SUCCESS) { - das_sum_finish(sum_ctx, hash); - das_sum_finish(&ss->stepping_sum_context, hash); - - if (ss->step == DAS_STEP_MEASURE) { - das_mac_finish(&ss->stepping_mac_context, hash); - } - - ss->step = DAS_STEP_IDLE; - } - - return ret; -} - -int das_set_firmware_version(char *ver) { - int ret = -1; - size_t len = 0; - - if (ver == NULL || (len = strlen(ver)) == 0) { - return ret; - } - - len = len < DEVICE_ID_MAX_LEN ? len : DEVICE_ID_MAX_LEN - 1; - memcpy(g_fw_ver, ver, len); - g_fw_ver[len] = '\0'; - - ret = 0; - return ret; -} diff --git a/src/lsoc_das2/das_rlimit.c b/src/lsoc_das2/das_rlimit.c deleted file mode 100644 index 5157480..0000000 --- a/src/lsoc_das2/das_rlimit.c +++ /dev/null @@ -1,61 +0,0 @@ -/** - * - * Filename: das_rlimit.c - * - * Description: Message rate limit control - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#include -#include - -#include "das_rlimit.h" -#include "das_configure.h" - -#if (DAS_RATE_LIMIT_ENABLE) - -static int rl_tps = 1; -static uint64_t rl_begin_time = 0; -static uint64_t rl_used_ticket = 0; - -static void rate_limiter_reset(uint64_t now_s) { - rl_used_ticket = 0; - rl_begin_time = now_s; -} - -void rate_limiter_init(uint64_t tps, uint64_t now_s) { - rl_tps = tps; - rate_limiter_reset(now_s); -} - -bool rate_limiter_pass(uint64_t now_s) { -#if defined(_NO_RATE_LIMIT_) - return true; -#else - bool pass = false; - - // not used this because only reporter thread will call this file - // pthread_mutex_lock(&g_lock_ticket); - if ((now_s - rl_begin_time) >= (rl_used_ticket * (1000 / rl_tps))) { - rl_used_ticket++; - pass = true; - } - - // reset each 1000 ms - if (now_s - rl_begin_time > 1000) { - rate_limiter_reset(now_s); - if (pass) { // because we give the ticket this time - rl_used_ticket++; - } - } - // pthread_mutex_unlock(&g_lock_ticket); - - return pass; -#endif -} - -#endif /* DAS_RATE_LIMIT_ENABLE */ \ No newline at end of file diff --git a/src/lsoc_das2/include/das.h b/src/lsoc_das2/include/das.h deleted file mode 100644 index 073078d..0000000 --- a/src/lsoc_das2/include/das.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * - * Filename: das.h - * - * Description: DAS main header - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#ifndef __DAS_H__ -#define __DAS_H__ - -#include "das_configure.h" -#include "das_platform.h" - -#include "das.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef int das_result_t; - -/* Result Codes */ -#define DAS_SUCCESS (0) -#define DAS_ERROR_GENERIC (-1) -#define DAS_ERROR_BAD_PARAMETERS (-2) -#define DAS_ERROR_SHORT_BUFFER (-3) -#define DAS_ERROR_EXCESS_DATA (-4) -#define DAS_ERROR_OUT_OF_MEMORY (-5) -#define DAS_ERROR_COMMUNICATION (-6) -#define DAS_ERROR_NOT_SUPPORTED (-7) -#define DAS_ERROR_NOT_IMPLEMENTED (-8) -#define DAS_ERROR_TIMEOUT (-9) -#define DAS_ERROR_ID2_INTERNAL (-10) -#define DAS_ERROR_SOC_PROTO_ERROR (-11) - - -typedef int (*publish_handle_t)(const char *topic, const uint8_t *message, size_t msg_size, - void *channel); - -void *das_init(const char *product_name, const char *device_name); -void das_final(void *session); - -const char *das_sub_topic(void *session, const char *topic); -const char *das_pub_topic(void *session, const char *topic); - -void das_connection(void *session, publish_handle_t publish_handle, void *channel); - -void das_on_connected(void *session); -void das_on_disconnected(void *session); -void das_on_message(void *session, const uint8_t *message, size_t msg_size); - -das_result_t das_stepping(void *session, uint64_t now); - -int das_attest(const char* tag, ...); - -int das_set_firmware_version(char *ver); - -#ifdef __cplusplus -} -#endif - -#endif /* __DAS_H__ */ diff --git a/src/lsoc_das2/include/das_configure.h b/src/lsoc_das2/include/das_configure.h deleted file mode 100644 index ad76e41..0000000 --- a/src/lsoc_das2/include/das_configure.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * - * Filename: configure.h - * - * Description: DAS configure center - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#ifndef __DAS_CONFIGURE_H__ -#define __DAS_CONFIGURE_H__ - -/* DAS heartbeat period in ms */ -#define DAS_HEARTBEAT_PERIOD (1000*60*15) // 15min - -/* servcie features */ - -#ifdef DAS_PLATFORM_LINUX -#define DAS_SERVICE_ROM_ENABLED 0 -#define DAS_SERVICE_FSCAN_ENABLED 1 -#define DAS_SERVICE_NETFILER_ENABLED 1 -#define DAS_AUTO_MEASURE 0 -#define DAS_SERVICE_ID2_ID 1 -#endif - -#ifdef DAS_PLATFORM_MACOS -#define DAS_SERVICE_ROM_ENABLED 0 -#define DAS_SERVICE_FSCAN_ENABLED 0 -#define DAS_SERVICE_NETFILER_ENABLED 0 -#define DAS_AUTO_MEASURE 0 -#define DAS_SERVICE_ID2_ID 0 -#endif - -#if defined(DAS_PLATFORM_AOS) || defined(DAS_PLATFORM_FREERTOS) -#define DAS_SERVICE_ROM_ENABLED 1 -#define DAS_SERVICE_LWIP_NFI_ENABLED 1 -#define DAS_SERVICE_STACK_PROTECTION_ENABLED 0 -#define DAS_AUTO_MEASURE 0 -#define DAS_SERVICE_ID2_ID 1 -#endif - -/* Maximum topic length */ -#define DAS_TOPIC_LENGTH 64 - -/* Message buffer length */ -#define DAS_BUFFER_LENGTH 1024 - -/* servcie configurations */ -#define DAS_MAX_SERVICE_NUMBER 8 - -/* servcie rom configurations */ -#if (DAS_SERVICE_ROM_ENABLED) -#define DAS_SERVICE_ROM_STEP_SIZE 8192 -#endif - -/* servcie fscan configurations */ -#if (DAS_SERVICE_FSCAN_ENABLED) -#define DAS_SERVICE_FSCAN_SEGMENT_SIZE 4096 -#define DAS_SERVICE_FSCAN_PATH_BUF_MAX 256 -#endif - -/* servcie lwip nfi configurations */ -#if (DAS_SERVICE_LWIP_NFI_ENABLED) -#define DAS_SERVICE_NFI_MAX_INFO_CNT 20 -#define DAS_SERVICE_NFI_MAX_LOCAL_SVC_CNT 10 -#endif - -/* servcie netfilter configurations */ -#if (DAS_SERVICE_NETFILER_ENABLED) -#define DAS_MAX_PREPROCESSOR_NUMBER 8 -#define DAS_SERVICE_NETFILER_USE_NFC 0 -#define DAS_SERVICE_NETFILER_USE_AFPACKET 1 -#endif - -#endif /* __DAS_CONFIGURE_H__ */ diff --git a/src/lsoc_das2/include/das_hardware.h b/src/lsoc_das2/include/das_hardware.h deleted file mode 100644 index 9c1a75e..0000000 --- a/src/lsoc_das2/include/das_hardware.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * - * Filename: hardware.h - * - * Description: BSP adapter interface - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#ifndef __DAS_HARDWARE_H__ -#define __DAS_HARDWARE_H__ - -#include - -#include "das_configure.h" -#include "das_platform.h" - -/* @brief get platform firmware version string. - * - * @param buf[out]: the firmware string, terminated with with '\0'. - * @param size[in]: the length of buffer. - * - * @return: platform arch string. - */ -size_t das_hal_firmware_version(char *buf, size_t size); - -/* @brief get device unique identifier string. - * - * @param buf[out]: the device id string, terminated with '\0'. - * @param size[in]: the length of buffer. - * - * @return: @see error codes. - */ -size_t das_hal_device_id(char *buf, size_t size); - -#if (DAS_SERVICE_ROM_ENABLED) - -typedef struct _das_rom_bank { - uint8_t* address; - size_t size; -} das_rom_bank_t; - -/* @brief get rom block infos for detection. - * - * @param rom_info[out]: rom info array, containing rom block infos. - * - * @return: @see error codes. - */ -int das_hal_rom_info(das_rom_bank_t banks[DAS_ROM_BANK_NUMBER]); - -#endif - -#endif /* __DAS_HAL_H__ */ diff --git a/src/lsoc_das2/include/das_platform.h b/src/lsoc_das2/include/das_platform.h deleted file mode 100644 index 9fbd454..0000000 --- a/src/lsoc_das2/include/das_platform.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * - * Filename: platform.h - * - * Description: OS specific definitions - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - - -#ifndef __DAS_PLATFORM_H__ -#define __DAS_PLATFORM_H__ - -#include "das_configure.h" -#include "das_hardware.h" - -/* Include all the system headers needed by nanopb. You will need the - * definitions of the following: - * - strlen, memcpy, memset functions - * - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t - * - size_t - * - bool - * - * If you don't have the standard header files, you can instead provide - * a custom header that defines or includes all this. In that case, - * define PB_SYSTEM_HEADER to the path of this file. - */ - -#ifdef DAS_PLATFORM_ALT -#include -#else -#include -#include -#include -#include -#include -#include -#ifdef DAS_FEATURE_MALLOC_ENABLED -#include -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef i386 -#define DAS_ARCH "x86" -#endif - -#ifdef __x86_64__ -#define DAS_ARCH "x86_64" -#endif - -#ifdef __aarch64__ -#define DAS_ARCH "aarch64c" -#endif - -#ifdef __arm__p -#define DAS_ARCH "arm" -#endif - -#ifdef __arm__ -#define DAS_ARCH "arm" -#endif - -#ifdef __mips__ -#define DAS_ARCH "mips" -#endif - -#ifdef __mips64 -#define DAS_ARCH "mips64" -#endif - -#ifdef __csky__ -#define DAS_ARCH "csky" -#endif - -#ifdef ESP8266 -#define DAS_ARCH "arm" -#endif - -#ifndef DAS_ARCH -#error "can not identify compiler's cpu arch." -#endif - -#ifdef DAS_DEBUG -#define DAS_LOG(_f, ...) printf("%s %s %d: " _f, "", \ - __FUNCTION__, __LINE__, ##__VA_ARGS__) -#else -#define DAS_LOG(_f, ...) ; -#endif - -size_t das_hex2string(char *buffer, size_t buf_length, uint8_t *hex, size_t hex_length); - -char *das_itoa(int value, char *string, unsigned int radix); - -char** das_strsplit( const char* s, const char* delim, size_t* nb); - -#ifdef __cplusplus -} -#endif - -#endif /* __DAS_PLATFORM_H__ */ diff --git a/src/lsoc_das2/include/das_queue.h b/src/lsoc_das2/include/das_queue.h deleted file mode 100644 index ec2ff12..0000000 --- a/src/lsoc_das2/include/das_queue.h +++ /dev/null @@ -1,566 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - * $FreeBSD: stable/9/sys/sys/queue.h 252365 2013-06-29 04:25:40Z lstewart $ - */ - -#ifndef QUEUE_H -#define QUEUE_H - -/* #include */ -#define __containerof(ptr, type, field) ((type *)((char *)(ptr) - ((char *)&((type *)0)->field))) - -/* - * This file defines four types of data structures: singly-linked lists, - * singly-linked tail queues, lists and tail queues. - * - * A singly-linked list is headed by a single forward pointer. The elements - * are singly linked for minimum space and pointer manipulation overhead at - * the expense of O(n) removal for arbitrary elements. New elements can be - * added to the list after an existing element or at the head of the list. - * Elements being removed from the head of the list should use the explicit - * macro for this purpose for optimum efficiency. A singly-linked list may - * only be traversed in the forward direction. Singly-linked lists are ideal - * for applications with large datasets and few or no removals or for - * implementing a LIFO queue. - * - * A singly-linked tail queue is headed by a pair of pointers, one to the - * head of the list and the other to the tail of the list. The elements are - * singly linked for minimum space and pointer manipulation overhead at the - * expense of O(n) removal for arbitrary elements. New elements can be added - * to the list after an existing element, at the head of the list, or at the - * end of the list. Elements being removed from the head of the tail queue - * should use the explicit macro for this purpose for optimum efficiency. - * A singly-linked tail queue may only be traversed in the forward direction. - * Singly-linked tail queues are ideal for applications with large datasets - * and few or no removals or for implementing a FIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may be traversed in either direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * For details on the use of these macros, see the queue(3) manual page. - * - * SLIST LIST STAILQ TAILQ - * _HEAD + + + + - * _HEAD_INITIALIZER + + + + - * _ENTRY + + + + - * _INIT + + + + - * _EMPTY + + + + - * _FIRST + + + + - * _NEXT + + + + - * _PREV - + - + - * _LAST - - + + - * _FOREACH + + + + - * _FOREACH_FROM + + + + - * _FOREACH_SAFE + + + + - * _FOREACH_FROM_SAFE + + + + - * _FOREACH_REVERSE - - - + - * _FOREACH_REVERSE_FROM - - - + - * _FOREACH_REVERSE_SAFE - - - + - * _FOREACH_REVERSE_FROM_SAFE - - - + - * _INSERT_HEAD + + + + - * _INSERT_BEFORE - + - + - * _INSERT_AFTER + + + + - * _INSERT_TAIL - - + + - * _CONCAT - - + + - * _REMOVE_AFTER + - + - - * _REMOVE_HEAD + - + - - * _REMOVE + + + + - * _SWAP + + + + - * - */ - -/* - * Singly-linked List declarations. - */ -#define SLIST_HEAD(name, type, qual) \ - struct name { \ - struct type *qual slh_first; /* first element */ \ - } - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type, qual) \ - struct { \ - struct type *qual sle_next; /* next element */ \ - } - -/* - * Singly-linked List functions. - */ -#define SLIST_INIT(head) do { \ - SLIST_FIRST((head)) = NULL; \ - } while (0) - -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) - -#define SLIST_FIRST(head) ((head)->slh_first) - -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - -#define SLIST_FOREACH(var, head, field) \ - for ((var) = SLIST_FIRST((head)); \ - (var); \ - (var) = SLIST_NEXT((var), field)) - -#define SLIST_FOREACH_FROM(var, head, field) \ - for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ - (var); \ - (var) = SLIST_NEXT((var), field)) - -#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = SLIST_FIRST((head)); \ - (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define SLIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ - for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ - (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ - SLIST_FIRST((head)) = (elm); \ - } while (0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ - SLIST_NEXT((slistelm), field) = (elm); \ - } while (0) - -#define SLIST_REMOVE_AFTER(elm, field) do { \ - SLIST_NEXT(elm, field) = \ - SLIST_NEXT(SLIST_NEXT(elm, field), field); \ - } while (0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ - } while (0) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if (SLIST_FIRST((head)) == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = SLIST_FIRST((head)); \ - while (SLIST_NEXT(curelm, field) != (elm)) \ - curelm = SLIST_NEXT(curelm, field); \ - SLIST_REMOVE_AFTER(curelm, field); \ - } \ - } while (0) - -#define SLIST_SWAP(head1, head2, type) do { \ - struct type *swap_first = SLIST_FIRST(head1); \ - SLIST_FIRST(head1) = SLIST_FIRST(head2); \ - SLIST_FIRST(head2) = swap_first; \ - } while (0) - -/* - * List declarations. - */ -#define LIST_HEAD(name, type, qual) \ - struct name { \ - struct type *qual lh_first; /* first element */ \ - } - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type, qual) \ - struct { \ - struct type *qual le_next; /* next element */ \ - struct type *qual *le_prev; /* address of previous next element */ \ - } - -/* - * List functions. - */ -#define LIST_INIT(head) do { \ - LIST_FIRST((head)) = NULL; \ - } while (0) - -#define LIST_EMPTY(head) ((head)->lh_first == NULL) - -#define LIST_FIRST(head) ((head)->lh_first) - -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - -#define LIST_PREV(elm, head, type, field) \ - ((elm)->field.le_prev == &LIST_FIRST((head)) ? NULL : \ - __containerof((elm)->field.le_prev, struct type, field.le_next)) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = LIST_FIRST((head)); \ - (var); \ - (var) = LIST_NEXT((var), field)) - -#define LIST_FOREACH_FROM(var, head, field) \ - for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ - (var); \ - (var) = LIST_NEXT((var), field)) - -#define LIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = LIST_FIRST((head)); \ - (var) && ((tvar) = LIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define LIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ - for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ - (var) && ((tvar) = LIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ - LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field); \ - LIST_FIRST((head)) = (elm); \ - (elm)->field.le_prev = &LIST_FIRST((head)); \ - } while (0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - LIST_NEXT((elm), field) = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ - } while (0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL) \ - LIST_NEXT((listelm), field)->field.le_prev = \ - &LIST_NEXT((elm), field); \ - LIST_NEXT((listelm), field) = (elm); \ - (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ - } while (0) - -#define LIST_REMOVE(elm, field) do { \ - if (LIST_NEXT((elm), field) != NULL) \ - LIST_NEXT((elm), field)->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = LIST_NEXT((elm), field); \ - } while (0) - -#define LIST_SWAP(head1, head2, type, field) do { \ - struct type *swap_tmp = LIST_FIRST((head1)); \ - LIST_FIRST((head1)) = LIST_FIRST((head2)); \ - LIST_FIRST((head2)) = swap_tmp; \ - if ((swap_tmp = LIST_FIRST((head1))) != NULL) \ - swap_tmp->field.le_prev = &LIST_FIRST((head1)); \ - if ((swap_tmp = LIST_FIRST((head2))) != NULL) \ - swap_tmp->field.le_prev = &LIST_FIRST((head2)); \ - } while (0) - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type, qual) \ - struct name { \ - struct type *qual stqh_first;/* first element */ \ - struct type *qual *stqh_last;/* addr of last next element */ \ - } - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type, qual) \ - struct { \ - struct type *qual stqe_next; /* next element */ \ - } - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_INIT(head) do { \ - STAILQ_FIRST((head)) = NULL; \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ - } while (0) - -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) - -#define STAILQ_FIRST(head) ((head)->stqh_first) - -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY((head)) ? NULL : \ - __containerof((head)->stqh_last, struct type, field.stqe_next)) - -#define STAILQ_FOREACH(var, head, field) \ - for((var) = STAILQ_FIRST((head)); \ - (var); \ - (var) = STAILQ_NEXT((var), field)) - -#define STAILQ_FOREACH_FROM(var, head, field) \ - for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ - (var); \ - (var) = STAILQ_NEXT((var), field)) - -#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = STAILQ_FIRST((head)); \ - (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define STAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ - for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ - (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_FIRST((head)) = (elm); \ - } while (0) - -#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_NEXT((tqelm), field) = (elm); \ - } while (0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - STAILQ_NEXT((elm), field) = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - } while (0) - -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ - } while (0) - -#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ - if ((STAILQ_NEXT(elm, field) = \ - STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - } while (0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if ((STAILQ_FIRST((head)) = \ - STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ - } while (0) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if (STAILQ_FIRST((head)) == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = STAILQ_FIRST((head)); \ - while (STAILQ_NEXT(curelm, field) != (elm)) \ - curelm = STAILQ_NEXT(curelm, field); \ - STAILQ_REMOVE_AFTER(head, curelm, field); \ - } \ - } while (0) - -#define STAILQ_SWAP(head1, head2, type) do { \ - struct type *swap_first = STAILQ_FIRST(head1); \ - struct type **swap_last = (head1)->stqh_last; \ - STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_FIRST(head2) = swap_first; \ - (head2)->stqh_last = swap_last; \ - if (STAILQ_EMPTY(head1)) \ - (head1)->stqh_last = &STAILQ_FIRST(head1); \ - if (STAILQ_EMPTY(head2)) \ - (head2)->stqh_last = &STAILQ_FIRST(head2); \ - } while (0) - -/* - * Tail queue declarations. - */ -#define TAILQ_HEAD(name, type, qual) \ - struct name { \ - struct type *qual tqh_first; /* first element */ \ - struct type *qual *tqh_last; /* addr of last next element */ \ -} - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define TAILQ_ENTRY(type, qual) \ - struct { \ - struct type *qual tqe_next; /* next element */ \ - struct type *qual *tqe_prev; /* address of previous next element */ \ - } - -#define TAILQ_HEAD_NEW(name, type) \ - struct name { \ - struct type *tqh_first; /* first element */ \ - struct type **tqh_last; /* addr of last next element */ \ -} - -#define TAILQ_ENTRY_NEW(type) \ - struct { \ - struct type *tqe_next; /* next element */ \ - struct type **tqe_prev; /* address of previous next element */ \ - } - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) do { \ - TAILQ_FIRST((head)) = NULL; \ - (head)->tqh_last = &TAILQ_FIRST((head)); \ - } while (0) - -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) - -#define TAILQ_FIRST(head) ((head)->tqh_first) - -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = TAILQ_FIRST((head)); \ - (var); \ - (var) = TAILQ_NEXT((var), field)) - -#define TAILQ_FOREACH_FROM(var, head, field) \ - for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ - (var); \ - (var) = TAILQ_NEXT((var), field)) - -#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = TAILQ_FIRST((head)); \ - (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define TAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ - for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ - (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var); \ - (var) = TAILQ_PREV((var), headname, field)) - -#define TAILQ_FOREACH_REVERSE_FROM(var, head, headname, field) \ - for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ - (var); \ - (var) = TAILQ_PREV((var), headname, field)) - -#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ - (var) = (tvar)) - -#define TAILQ_FOREACH_REVERSE_FROM_SAFE(var, head, headname, field, tvar) \ - for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ - (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ - (var) = (tvar)) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ - TAILQ_FIRST((head))->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - TAILQ_FIRST((head)) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ - } while (0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - TAILQ_NEXT((elm), field) = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ - } while (0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL) \ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - TAILQ_NEXT((listelm), field) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ - } while (0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - TAILQ_NEXT((elm), field) = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - } while (0) - -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ - } while (0) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field)) != NULL) \ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ - } while (0) - -#define TAILQ_SWAP(head1, head2, type, field) do { \ - struct type *swap_first = (head1)->tqh_first; \ - struct type **swap_last = (head1)->tqh_last; \ - (head1)->tqh_first = (head2)->tqh_first; \ - (head1)->tqh_last = (head2)->tqh_last; \ - (head2)->tqh_first = swap_first; \ - (head2)->tqh_last = swap_last; \ - if ((swap_first = (head1)->tqh_first) != NULL) \ - swap_first->field.tqe_prev = &(head1)->tqh_first; \ - else \ - (head1)->tqh_last = &(head1)->tqh_first; \ - if ((swap_first = (head2)->tqh_first) != NULL) \ - swap_first->field.tqe_prev = &(head2)->tqh_first; \ - else \ - (head2)->tqh_last = &(head2)->tqh_first; \ - } while (0) - -#endif diff --git a/src/lsoc_das2/include/das_rlimit.h b/src/lsoc_das2/include/das_rlimit.h deleted file mode 100644 index 80592d6..0000000 --- a/src/lsoc_das2/include/das_rlimit.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * - * Filename: das_rlimit.h - * - * Description: Message rate limit control - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#ifndef __DAS_RLIMIT_H__ -#define __DAS_RLIMIT_H__ - -#include - -#if defined(__cplusplus) -extern "C" { -#endif - -void rate_limiter_init(uint64_t tps, uint64_t now_s); - -bool rate_limiter_pass(uint64_t now_s); - -#if defined(__cplusplus) -} -#endif - -#endif \ No newline at end of file diff --git a/src/lsoc_das2/include/das_service.h b/src/lsoc_das2/include/das_service.h deleted file mode 100644 index 016591c..0000000 --- a/src/lsoc_das2/include/das_service.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * - * Filename: service.h - * - * Description: DAS backward compatible services - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#ifndef __DAS_SERVICE_H__ -#define __DAS_SERVICE_H__ - -#include "das_platform.h" -#include "das_sha1.h" -#include "das.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#define das_sum_context_t das_sha1_context_t -#define das_mac_context_t das_sha1_context_t - -#define das_sum_start das_sha1_start -#define das_mac_start das_sha1_start - -#define das_sum_update das_sha1_update -#define das_mac_update das_sha1_update - -#define das_sum_finish das_sha1_finish -#define das_mac_finish das_sha1_finish - -typedef enum _das_service_status { - DAS_SRV_STATUS_START = 0, - DAS_SRV_STATUS_NEXT, - DAS_SRV_STATUS_PUBLISH, - DAS_SRV_STATUS_FINISH, -} das_service_status_t; - -typedef struct _das_service_state { - das_service_status_t status; -} das_service_state_t; - -typedef struct _das_service { - const char *name; - int (*init)(void); - int (*deinit)(void); - das_result_t (*info)(char *buffer, - size_t size, - das_service_state_t *state); - -#if defined DAS2_FEATURE_ATTESTATION - das_result_t (*attest)(char *path, - size_t path_size, - char* attribute, - size_t attribute_size, - das_sum_context_t *sum_context, - das_service_state_t *state); - das_result_t (*measure)(das_sum_context_t *sum_context, - das_mac_context_t *mac_context, - das_service_state_t *state); -#endif -} das_service_t; - -extern das_service_t * das_service_table[]; - -typedef struct _das_attest_handler { - const char *tag; - int (*handler)(va_list params); -} das_attest_handler_t; - -extern das_attest_handler_t* das_attest_handler_table[]; - -#define FIELDS_SEPARATE_TAG '|' -#define INFOS_SEPARATE_TAG ',' - -#define SERVICE_NAME_SYS "SYS" -#define SERVICE_NAME_ROM "ROM" -#define SERVICE_NAME_FSCAN "FSCAN" -#define SERVICE_NAME_LWIP_NFI "LWIP_NFI" -#define SERVICE_NAME_NETFILTER "NETFILTER" -#define SERVICE_NAME_DNS_PARSE_PROCESSOR "DNS_PARSE_PROCESSOR" -#define SERVICE_NAME_ICMP_IGNORE_PROCESSOR "ICMP_IGNORE_PROCESSOR" -#define SERVICE_NAME_STACK_PROTECTION "STACK_PROTECTION" - -int stack_protection(const char *tag); - -#if (DAS_SERVICE_NETFILER_ENABLED) -#include - -#if (DAS_SERVICE_NETFILER_USE_NFC) -#include -#endif /* DAS_SERVICE_NETFILER_USE_NFC */ - -union _das_address { - struct in_addr v4; - struct in6_addr v6; -}; - -typedef struct _netflow_info { - union _das_address src_ip; // ip & port are network bytes order - union _das_address dest_ip; - uint16_t src_port; - uint16_t dest_port; - uint16_t domain; // AF_INET/AF_INET6... - uint16_t protocol; // tcp/udp/icmp... - uint16_t direction; // IN = 1; OUT = 2 - uint32_t reserved; -} netflow_info_t; - -typedef enum _pre_process_status { - PRE_PROCESS_REPORT_Q_FULL = -3, // the report queue is full. max = MAX_INFO_COUNT - PRE_PROCESS_BUF_TOO_SMALL = -2, // report buf is too small. - PRE_PROCESS_GENERAL_ERROR = -1, // general error, such as parameters error. - PRE_PROCESS_REPORT_IGNORE = 0, // do not report the netflow info. - PRE_PROCESS_REPORT_CUSTOM = 1, // report customer infos. - PRE_PROCESS_CALL_NEXT = 2, // call next pre processor. -} pre_process_status_t; - -typedef struct _netfilter_pre_processor { - const char *name; - int (*init)(void); - pre_process_status_t (*pre_process)(netflow_info_t *info, - void *payload, - size_t payload_size, - char *buf, - size_t buf_size); -} netfilter_pre_processor_t; - -extern netfilter_pre_processor_t *netfilter_pre_processor_table[]; - -#endif // DAS_SERVICE_NETFILER_ENABLED - -#if defined(__cplusplus) -} -#endif - -#endif /* __DAS_SERVICE_H__ */ diff --git a/src/lsoc_das2/include/das_sha1.h b/src/lsoc_das2/include/das_sha1.h deleted file mode 100644 index 6b07f66..0000000 --- a/src/lsoc_das2/include/das_sha1.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * - * Filename: sha1.h - * - * Description: Inline SHA1 algorithm - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#ifndef __DAS_SHA1_H__ -#define __DAS_SHA1_H__ - -#include "das_platform.h" - -#ifdef DAS_PLATFORM_SHA1_ALT -#include "das_sha1_alt.h" -#else -/** - * brief SHA-1 context structure - */ -typedef struct _das_sha1_context { - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[5]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} das_sha1_context_t; -#endif - -#define DAS_SHA1_LENGTH 20 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * brief Initialize SHA-1 context - * - * param ctx SHA-1 context to be initialized - */ -void das_sha1_start(das_sha1_context_t *context); - -/** - * brief SHA-1 process buffer - * - * param ctx SHA-1 context - * param input buffer holding the data - * param ilen length of the input data - */ -void das_sha1_update(das_sha1_context_t *ctx, const unsigned char *input, size_t ilen); - -/** - * brief SHA-1 final digest - * - * param ctx SHA-1 context - * param output SHA-1 checksum result - */ -void das_sha1_finish(das_sha1_context_t *ctx, unsigned char output[DAS_SHA1_LENGTH]); - - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_sha1.h */ diff --git a/src/lsoc_das2/include/das_sha1_alt.h b/src/lsoc_das2/include/das_sha1_alt.h deleted file mode 100644 index 1c47e08..0000000 --- a/src/lsoc_das2/include/das_sha1_alt.h +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - * Filename: sha1_alt.h - * - * Description: Yet another implementation of SHA1 algorithms - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#ifndef __DAS_SHA1_ALT_H__ -#define __DAS_SHA1_ALT_H__ - -#include "das_platform.h" - -typedef struct _das_sha1_context { - void *context; - uint32_t size; -} das_sha1_context_t; - -#endif /* __DAS_SHA1_ALT_H__ */ diff --git a/src/lsoc_das2/proto/lsoc.proto b/src/lsoc_das2/proto/lsoc.proto deleted file mode 100644 index bbb5fc8..0000000 --- a/src/lsoc_das2/proto/lsoc.proto +++ /dev/null @@ -1,123 +0,0 @@ -syntax="proto3"; -// Domain -enum Domain -{ - APP = 0; // When DPS is used to protect an application - SYS = 1; // When DPS is used to protect a system - NET = 2; // When DPS is used to protect a network product, e.g. Gateway... -} -// Function code -enum Code -{ - // Message that it self-motivated by device - INF = 0; // Device information - ATS = 1; // Attestation - MES = 2; // Mesurement - UPT = 3; // update policy notification - ACC = 4; // Access control -} -//heart-beat info, also report status -message InfData -{ - string version = 1; // dps version, include os, as "linux:dps:1.0", or "alios_things:das:1.0" - string device = 2; // hardware fingerprint, as "key:value, key:value" - string state = 3; // general status in format: "key:value, key:value" -} -message AtsCmdData -{ - enum Type { - FULL = 0; - FILE = 1; - LIBRARY = 2; - NET = 3; - DEV = 5; - } - Type type = 1; - string patternUrl = 2; // The vulnerability-scan pattern - string pattern = 3; // The pattern object name -} -message AtsFilData -{ - uint64 cmd = 1; - string path = 2; //generic path, rom path as "rom:/", memory path as "mem:address/size" - string attribute = 3; //"key:value, " - string signature = 4; //signature -} -message AtsNetData -{ - uint64 cmd = 1; - // TBD -} -message AtsSysData -{ - uint64 cmd = 1; - // TBD -} -message AtsDevData -{ - uint64 cmd = 1; - string object = 2; // id2 challenge auth code as "auth_code:xxx", id2 id as "id:xxx" -} -message AtsEndData -{ - uint64 cmd = 1; - uint32 total = 2; - string sum = 3; // file:xxx,net:xxx -} -message MesCmdData -{ - enum Type { - FULL = 0; - FILE = 1; - NET = 3; - } - Type type = 1; -} -message MesFilData -{ - uint64 cmd = 1; - string sum = 2; - string mac = 3; //use cmd as the heading value to calculate checksum -} -message MesNetData -{ - uint64 cmd = 1; - string sum = 2; - string mac = 3; -} -message MesEndData -{ - uint64 cmd = 1; - uint32 total = 2; -} -message UptCmdData { - enum Type { - POLICY = 0; - SESSION = 4; - } - Type type = 1; - string url = 2; - string object = 3; // id2 prov token as "token:xxx", id2 prov otp as "otp:xxx" -} -message Message // SOC's command to DAS -{ - // Routing information - Domain domain = 1; - Code code = 2; // Select cmdData according to code - uint64 timestamp = 3; // epoch time (from Unix) - // check option, check required!!! - // check oneof selection !! - oneof data { //not only for cmd, also for message - InfData infData = 4; - AtsCmdData atsCmdData = 5; - AtsEndData atsEndData = 6; - AtsFilData atsFilData = 7; // file-by-file -AtsDevData atsDevData = 10; // file-by-file - MesCmdData mesCmdData = 11; - MesEndData mesEndData = 12; - MesFilData mesFilData = 13; -UptCmdData uptCmdData = 32; - } - string session = 254; // instance id or id2 id as "id:xxx", id2 prov auth code as "auth_code:xxx", traditional token as "token:xxx" -} - diff --git a/src/lsoc_das2/proto/lsoc_defs.h b/src/lsoc_das2/proto/lsoc_defs.h deleted file mode 100644 index dd221a8..0000000 --- a/src/lsoc_das2/proto/lsoc_defs.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Configurable proto buffer size, 20201222 Maqiu */ - -#ifndef LSOC_DEFS_H -#define LSOC_DEFS_H - -/* SOC command buffer length */ -#define DAS_CMD_BUFFER_LENGTH (256) - -// must bigger than all char[] in protocol messages -//#define MAX_COMMON_READ_BUFFER_SIZE (1024) - -#define MAX_INF_VERSION_SIZE (96) -#define MAX_INF_DEVICE_SIZE (96) - -#ifdef DAS_PLATFORM_LINUX -#define MAX_INF_STATE_SIZE (1024) -#else -#define MAX_INF_STATE_SIZE (96) -#endif - -#define MAX_ATS_CMD_PTN_URL_SIZE (1) -#define MAX_ATS_CMD_PTN_SIZE (256) - -#ifdef DAS_PLATFORM_LINUX -#define MAX_ATS_FIL_PATH_SIZE (1024) -#else -#define MAX_ATS_FIL_PATH_SIZE (96) -#endif - -#define MAX_ATS_FIL_ATTR_SIZE (96) -#define MAX_ATS_FIL_SIG_SIZE (96) - -#define MAX_ATS_DEV_OBJ_SIZE (512) - -#define MAX_ATS_END_SUM_SIZE (96) - -#define MAX_MES_FIL_SUM_SIZE (96) -#define MAX_MES_FIL_MAC_SIZE (96) - -//#define MAX_MES_NET_SUM_SIZE (96) -//#define MAX_MES_NET_MAC_SIZE (96) - -#define MAX_UPT_CMD_URL_SIZE (96) -#define MAX_UPT_CMD_OBJ_SIZE (256) - -#define MAX_MSG_SESS_SIZE (512) - - -#endif /* LSOC_DEFS_H */ - - diff --git a/src/lsoc_das2/proto/lsoc_pb.c b/src/lsoc_das2/proto/lsoc_pb.c deleted file mode 100644 index f8f415a..0000000 --- a/src/lsoc_das2/proto/lsoc_pb.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.4 */ - -#include "lsoc_pb.h" -#if PB_PROTO_HEADER_VERSION != 40 -#error Regenerate this file with the current version of nanopb generator. -#endif - -PB_BIND(InfData, InfData, AUTO) - - -PB_BIND(AtsCmdData, AtsCmdData, AUTO) - - -PB_BIND(AtsFilData, AtsFilData, AUTO) - - -PB_BIND(AtsNetData, AtsNetData, AUTO) - - -PB_BIND(AtsSysData, AtsSysData, AUTO) - - -PB_BIND(AtsDevData, AtsDevData, AUTO) - - -PB_BIND(AtsEndData, AtsEndData, AUTO) - - -PB_BIND(MesCmdData, MesCmdData, AUTO) - - -PB_BIND(MesFilData, MesFilData, AUTO) - - -PB_BIND(MesNetData, MesNetData, AUTO) - - -PB_BIND(MesEndData, MesEndData, AUTO) - - -PB_BIND(UptCmdData, UptCmdData, AUTO) - - -PB_BIND(Message, Message, 2) - - - - - - - - diff --git a/src/lsoc_das2/proto/lsoc_pb.h b/src/lsoc_das2/proto/lsoc_pb.h deleted file mode 100644 index 08323da..0000000 --- a/src/lsoc_das2/proto/lsoc_pb.h +++ /dev/null @@ -1,383 +0,0 @@ -/* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.4 */ - -#ifndef PB_LSOC_PB_H_INCLUDED -#define PB_LSOC_PB_H_INCLUDED -#include "pb.h" - -#if PB_PROTO_HEADER_VERSION != 40 -#error Regenerate this file with the current version of nanopb generator. -#endif - -/* Enum definitions */ -typedef enum _Domain { - Domain_APP = 0, - Domain_SYS = 1, - Domain_NET = 2 -} Domain; - -typedef enum _Code { - Code_INF = 0, - Code_ATS = 1, - Code_MES = 2, - Code_UPT = 3, - Code_ACC = 4 -} Code; - -typedef enum _AtsCmdData_Type { - AtsCmdData_Type_FULL = 0, - AtsCmdData_Type_FILE = 1, - AtsCmdData_Type_LIBRARY = 2, - AtsCmdData_Type_NET = 3, - AtsCmdData_Type_DEV = 5 -} AtsCmdData_Type; - -typedef enum _MesCmdData_Type { - MesCmdData_Type_FULL = 0, - MesCmdData_Type_FILE = 1, - MesCmdData_Type_NET = 3 -} MesCmdData_Type; - -typedef enum _UptCmdData_Type { - UptCmdData_Type_POLICY = 0, - UptCmdData_Type_SESSION = 4 -} UptCmdData_Type; - -/* Struct definitions */ -typedef struct _InfData { - das_pb_callback_t version; - das_pb_callback_t device; - das_pb_callback_t state; -} InfData; - -typedef struct _AtsCmdData { - AtsCmdData_Type type; - das_pb_callback_t patternUrl; - das_pb_callback_t pattern; -} AtsCmdData; - -typedef struct _AtsDevData { - uint64_t cmd; - das_pb_callback_t object; -} AtsDevData; - -typedef struct _AtsEndData { - uint64_t cmd; - uint32_t total; - das_pb_callback_t sum; -} AtsEndData; - -typedef struct _AtsFilData { - uint64_t cmd; - das_pb_callback_t path; - das_pb_callback_t attribute; - das_pb_callback_t signature; -} AtsFilData; - -typedef struct _AtsNetData { - uint64_t cmd; -} AtsNetData; - -typedef struct _AtsSysData { - uint64_t cmd; -} AtsSysData; - -typedef struct _MesCmdData { - MesCmdData_Type type; -} MesCmdData; - -typedef struct _MesEndData { - uint64_t cmd; - uint32_t total; -} MesEndData; - -typedef struct _MesFilData { - uint64_t cmd; - das_pb_callback_t sum; - das_pb_callback_t mac; -} MesFilData; - -typedef struct _MesNetData { - uint64_t cmd; - das_pb_callback_t sum; - das_pb_callback_t mac; -} MesNetData; - -typedef struct _UptCmdData { - UptCmdData_Type type; - das_pb_callback_t url; - das_pb_callback_t object; -} UptCmdData; - -typedef struct _Message { - Domain domain; - Code code; - uint64_t timestamp; - das_pb_callback_t cb_data; - das_pb_size_t which_data; - union { - InfData infData; - AtsCmdData atsCmdData; - AtsEndData atsEndData; - AtsFilData atsFilData; - AtsDevData atsDevData; - MesCmdData mesCmdData; - MesEndData mesEndData; - MesFilData mesFilData; - UptCmdData uptCmdData; - } data; - das_pb_callback_t session; -} Message; - - -/* Helper constants for enums */ -#define _Domain_MIN Domain_APP -#define _Domain_MAX Domain_NET -#define _Domain_ARRAYSIZE ((Domain)(Domain_NET+1)) - -#define _Code_MIN Code_INF -#define _Code_MAX Code_ACC -#define _Code_ARRAYSIZE ((Code)(Code_ACC+1)) - -#define _AtsCmdData_Type_MIN AtsCmdData_Type_FULL -#define _AtsCmdData_Type_MAX AtsCmdData_Type_DEV -#define _AtsCmdData_Type_ARRAYSIZE ((AtsCmdData_Type)(AtsCmdData_Type_DEV+1)) - -#define _MesCmdData_Type_MIN MesCmdData_Type_FULL -#define _MesCmdData_Type_MAX MesCmdData_Type_NET -#define _MesCmdData_Type_ARRAYSIZE ((MesCmdData_Type)(MesCmdData_Type_NET+1)) - -#define _UptCmdData_Type_MIN UptCmdData_Type_POLICY -#define _UptCmdData_Type_MAX UptCmdData_Type_SESSION -#define _UptCmdData_Type_ARRAYSIZE ((UptCmdData_Type)(UptCmdData_Type_SESSION+1)) - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Initializer values for message structs */ -#define InfData_init_default {{{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}} -#define AtsCmdData_init_default {_AtsCmdData_Type_MIN, {{NULL}, NULL}, {{NULL}, NULL}} -#define AtsFilData_init_default {0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}} -#define AtsNetData_init_default {0} -#define AtsSysData_init_default {0} -#define AtsDevData_init_default {0, {{NULL}, NULL}} -#define AtsEndData_init_default {0, 0, {{NULL}, NULL}} -#define MesCmdData_init_default {_MesCmdData_Type_MIN} -#define MesFilData_init_default {0, {{NULL}, NULL}, {{NULL}, NULL}} -#define MesNetData_init_default {0, {{NULL}, NULL}, {{NULL}, NULL}} -#define MesEndData_init_default {0, 0} -#define UptCmdData_init_default {_UptCmdData_Type_MIN, {{NULL}, NULL}, {{NULL}, NULL}} -#define Message_init_default {_Domain_MIN, _Code_MIN, 0, {{NULL}, NULL}, 0, {InfData_init_default}, {{NULL}, NULL}} -#define InfData_init_zero {{{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}} -#define AtsCmdData_init_zero {_AtsCmdData_Type_MIN, {{NULL}, NULL}, {{NULL}, NULL}} -#define AtsFilData_init_zero {0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}} -#define AtsNetData_init_zero {0} -#define AtsSysData_init_zero {0} -#define AtsDevData_init_zero {0, {{NULL}, NULL}} -#define AtsEndData_init_zero {0, 0, {{NULL}, NULL}} -#define MesCmdData_init_zero {_MesCmdData_Type_MIN} -#define MesFilData_init_zero {0, {{NULL}, NULL}, {{NULL}, NULL}} -#define MesNetData_init_zero {0, {{NULL}, NULL}, {{NULL}, NULL}} -#define MesEndData_init_zero {0, 0} -#define UptCmdData_init_zero {_UptCmdData_Type_MIN, {{NULL}, NULL}, {{NULL}, NULL}} -#define Message_init_zero {_Domain_MIN, _Code_MIN, 0, {{NULL}, NULL}, 0, {InfData_init_zero}, {{NULL}, NULL}} - -/* Field tags (for use in manual encoding/decoding) */ -#define InfData_version_tag 1 -#define InfData_device_tag 2 -#define InfData_state_tag 3 -#define AtsCmdData_type_tag 1 -#define AtsCmdData_patternUrl_tag 2 -#define AtsCmdData_pattern_tag 3 -#define AtsDevData_cmd_tag 1 -#define AtsDevData_object_tag 2 -#define AtsEndData_cmd_tag 1 -#define AtsEndData_total_tag 2 -#define AtsEndData_sum_tag 3 -#define AtsFilData_cmd_tag 1 -#define AtsFilData_path_tag 2 -#define AtsFilData_attribute_tag 3 -#define AtsFilData_signature_tag 4 -#define AtsNetData_cmd_tag 1 -#define AtsSysData_cmd_tag 1 -#define MesCmdData_type_tag 1 -#define MesEndData_cmd_tag 1 -#define MesEndData_total_tag 2 -#define MesFilData_cmd_tag 1 -#define MesFilData_sum_tag 2 -#define MesFilData_mac_tag 3 -#define MesNetData_cmd_tag 1 -#define MesNetData_sum_tag 2 -#define MesNetData_mac_tag 3 -#define UptCmdData_type_tag 1 -#define UptCmdData_url_tag 2 -#define UptCmdData_object_tag 3 -#define Message_domain_tag 1 -#define Message_code_tag 2 -#define Message_timestamp_tag 3 -#define Message_infData_tag 4 -#define Message_atsCmdData_tag 5 -#define Message_atsEndData_tag 6 -#define Message_atsFilData_tag 7 -#define Message_atsDevData_tag 10 -#define Message_mesCmdData_tag 11 -#define Message_mesEndData_tag 12 -#define Message_mesFilData_tag 13 -#define Message_uptCmdData_tag 32 -#define Message_session_tag 254 - -/* Struct field encoding specification for nanopb */ -#define InfData_FIELDLIST(X, a) \ -X(a, CALLBACK, SINGULAR, STRING, version, 1) \ -X(a, CALLBACK, SINGULAR, STRING, device, 2) \ -X(a, CALLBACK, SINGULAR, STRING, state, 3) -#define InfData_CALLBACK das_pb_default_field_callback -#define InfData_DEFAULT NULL - -#define AtsCmdData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UENUM, type, 1) \ -X(a, CALLBACK, SINGULAR, STRING, patternUrl, 2) \ -X(a, CALLBACK, SINGULAR, STRING, pattern, 3) -#define AtsCmdData_CALLBACK das_pb_default_field_callback -#define AtsCmdData_DEFAULT NULL - -#define AtsFilData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) \ -X(a, CALLBACK, SINGULAR, STRING, path, 2) \ -X(a, CALLBACK, SINGULAR, STRING, attribute, 3) \ -X(a, CALLBACK, SINGULAR, STRING, signature, 4) -#define AtsFilData_CALLBACK das_pb_default_field_callback -#define AtsFilData_DEFAULT NULL - -#define AtsNetData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) -#define AtsNetData_CALLBACK NULL -#define AtsNetData_DEFAULT NULL - -#define AtsSysData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) -#define AtsSysData_CALLBACK NULL -#define AtsSysData_DEFAULT NULL - -#define AtsDevData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) \ -X(a, CALLBACK, SINGULAR, STRING, object, 2) -#define AtsDevData_CALLBACK das_pb_default_field_callback -#define AtsDevData_DEFAULT NULL - -#define AtsEndData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) \ -X(a, STATIC, SINGULAR, UINT32, total, 2) \ -X(a, CALLBACK, SINGULAR, STRING, sum, 3) -#define AtsEndData_CALLBACK das_pb_default_field_callback -#define AtsEndData_DEFAULT NULL - -#define MesCmdData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UENUM, type, 1) -#define MesCmdData_CALLBACK NULL -#define MesCmdData_DEFAULT NULL - -#define MesFilData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) \ -X(a, CALLBACK, SINGULAR, STRING, sum, 2) \ -X(a, CALLBACK, SINGULAR, STRING, mac, 3) -#define MesFilData_CALLBACK das_pb_default_field_callback -#define MesFilData_DEFAULT NULL - -#define MesNetData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) \ -X(a, CALLBACK, SINGULAR, STRING, sum, 2) \ -X(a, CALLBACK, SINGULAR, STRING, mac, 3) -#define MesNetData_CALLBACK das_pb_default_field_callback -#define MesNetData_DEFAULT NULL - -#define MesEndData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, cmd, 1) \ -X(a, STATIC, SINGULAR, UINT32, total, 2) -#define MesEndData_CALLBACK NULL -#define MesEndData_DEFAULT NULL - -#define UptCmdData_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UENUM, type, 1) \ -X(a, CALLBACK, SINGULAR, STRING, url, 2) \ -X(a, CALLBACK, SINGULAR, STRING, object, 3) -#define UptCmdData_CALLBACK das_pb_default_field_callback -#define UptCmdData_DEFAULT NULL - -#define Message_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UENUM, domain, 1) \ -X(a, STATIC, SINGULAR, UENUM, code, 2) \ -X(a, STATIC, SINGULAR, UINT64, timestamp, 3) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,infData,data.infData), 4) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,atsCmdData,data.atsCmdData), 5) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,atsEndData,data.atsEndData), 6) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,atsFilData,data.atsFilData), 7) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,atsDevData,data.atsDevData), 10) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,mesCmdData,data.mesCmdData), 11) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,mesEndData,data.mesEndData), 12) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,mesFilData,data.mesFilData), 13) \ -X(a, STATIC, ONEOF, MSG_W_CB, (data,uptCmdData,data.uptCmdData), 32) \ -X(a, CALLBACK, SINGULAR, STRING, session, 254) -#define Message_CALLBACK das_pb_default_field_callback -#define Message_DEFAULT NULL -#define Message_data_infData_MSGTYPE InfData -#define Message_data_atsCmdData_MSGTYPE AtsCmdData -#define Message_data_atsEndData_MSGTYPE AtsEndData -#define Message_data_atsFilData_MSGTYPE AtsFilData -#define Message_data_atsDevData_MSGTYPE AtsDevData -#define Message_data_mesCmdData_MSGTYPE MesCmdData -#define Message_data_mesEndData_MSGTYPE MesEndData -#define Message_data_mesFilData_MSGTYPE MesFilData -#define Message_data_uptCmdData_MSGTYPE UptCmdData - -extern const das_pb_msgdesc_t InfData_msg; -extern const das_pb_msgdesc_t AtsCmdData_msg; -extern const das_pb_msgdesc_t AtsFilData_msg; -extern const das_pb_msgdesc_t AtsNetData_msg; -extern const das_pb_msgdesc_t AtsSysData_msg; -extern const das_pb_msgdesc_t AtsDevData_msg; -extern const das_pb_msgdesc_t AtsEndData_msg; -extern const das_pb_msgdesc_t MesCmdData_msg; -extern const das_pb_msgdesc_t MesFilData_msg; -extern const das_pb_msgdesc_t MesNetData_msg; -extern const das_pb_msgdesc_t MesEndData_msg; -extern const das_pb_msgdesc_t UptCmdData_msg; -extern const das_pb_msgdesc_t Message_msg; - -/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ -#define InfData_fields &InfData_msg -#define AtsCmdData_fields &AtsCmdData_msg -#define AtsFilData_fields &AtsFilData_msg -#define AtsNetData_fields &AtsNetData_msg -#define AtsSysData_fields &AtsSysData_msg -#define AtsDevData_fields &AtsDevData_msg -#define AtsEndData_fields &AtsEndData_msg -#define MesCmdData_fields &MesCmdData_msg -#define MesFilData_fields &MesFilData_msg -#define MesNetData_fields &MesNetData_msg -#define MesEndData_fields &MesEndData_msg -#define UptCmdData_fields &UptCmdData_msg -#define Message_fields &Message_msg - -/* Maximum encoded size of messages (where known) */ -/* InfData_size depends on runtime parameters */ -/* AtsCmdData_size depends on runtime parameters */ -/* AtsFilData_size depends on runtime parameters */ -#define AtsNetData_size 11 -#define AtsSysData_size 11 -/* AtsDevData_size depends on runtime parameters */ -/* AtsEndData_size depends on runtime parameters */ -#define MesCmdData_size 2 -/* MesFilData_size depends on runtime parameters */ -/* MesNetData_size depends on runtime parameters */ -#define MesEndData_size 17 -/* UptCmdData_size depends on runtime parameters */ -/* Message_size depends on runtime parameters */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/lsoc_das2/proto/pb.h b/src/lsoc_das2/proto/pb.h deleted file mode 100644 index 6eb0590..0000000 --- a/src/lsoc_das2/proto/pb.h +++ /dev/null @@ -1,875 +0,0 @@ -/* Common parts of the nanopb library. Most of these are quite low-level - * stuff. For the high-level interface, see pb_encode.h and pb_decode.h. - */ - -#ifndef PB_H_INCLUDED -#define PB_H_INCLUDED - -/***************************************************************** - * Nanopb compilation time options. You can change these here by * - * uncommenting the lines, or on the compiler command line. * - *****************************************************************/ - -/* Enable support for dynamically allocated fields */ -/* #define PB_ENABLE_MALLOC 1 */ - -/* Define this if your CPU / compiler combination does not support - * unaligned memory access to packed structures. */ -/* #define PB_NO_PACKED_STRUCTS 1 */ - -/* Increase the number of required fields that are tracked. - * A compiler warning will tell if you need this. */ -/* #define PB_MAX_REQUIRED_FIELDS 256 */ - -/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */ -/* #define PB_FIELD_32BIT 1 */ - -/* Disable support for error messages in order to save some code space. */ -/* #define PB_NO_ERRMSG 1 */ - -/* Disable support for custom streams (support only memory buffers). */ -/* #define PB_BUFFER_ONLY 1 */ - -/* Disable support for 64-bit datatypes, for compilers without int64_t - or to save some code space. */ -/* #define PB_WITHOUT_64BIT 1 */ - -/* Don't encode scalar arrays as packed. This is only to be used when - * the decoder on the receiving side cannot process packed scalar arrays. - * Such example is older protobuf.js. */ -/* #define PB_ENCODE_ARRAYS_UNPACKED 1 */ - -/* Enable conversion of doubles to floats for platforms that do not - * support 64-bit doubles. Most commonly AVR. */ -/* #define PB_CONVERT_DOUBLE_FLOAT 1 */ - -/* Check whether incoming strings are valid UTF-8 sequences. Slows down - * the string processing slightly and slightly increases code size. */ -/* #define PB_VALIDATE_UTF8 1 */ - -/****************************************************************** - * You usually don't need to change anything below this line. * - * Feel free to look around and use the defined macros, though. * - ******************************************************************/ - - -/* Version of the nanopb library. Just in case you want to check it in - * your own program. */ -#define NANOPB_VERSION nanopb-0.4.4 - -/* Include all the system headers needed by nanopb. You will need the - * definitions of the following: - * - strlen, memcpy, memset functions - * - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t - * - size_t - * - bool - * - * If you don't have the standard header files, you can instead provide - * a custom header that defines or includes all this. In that case, - * define PB_SYSTEM_HEADER to the path of this file. - */ -#ifdef PB_SYSTEM_HEADER -#include PB_SYSTEM_HEADER -#else -#include -#include -#include -#include -#include - -#ifdef PB_ENABLE_MALLOC -#include -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* Macro for defining packed structures (compiler dependent). - * This just reduces memory requirements, but is not required. - */ -#if defined(PB_NO_PACKED_STRUCTS) - /* Disable struct packing */ -# define PB_PACKED_STRUCT_START -# define PB_PACKED_STRUCT_END -# define das_pb_packed -#elif defined(__GNUC__) || defined(__clang__) - /* For GCC and clang */ -# define PB_PACKED_STRUCT_START -# define PB_PACKED_STRUCT_END -# define das_pb_packed __attribute__((packed)) -#elif defined(__ICCARM__) || defined(__CC_ARM) - /* For IAR ARM and Keil MDK-ARM compilers */ -# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") -# define PB_PACKED_STRUCT_END _Pragma("pack(pop)") -# define das_pb_packed -#elif defined(_MSC_VER) && (_MSC_VER >= 1500) - /* For Microsoft Visual C++ */ -# define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) -# define PB_PACKED_STRUCT_END __pragma(pack(pop)) -# define das_pb_packed -#else - /* Unknown compiler */ -# define PB_PACKED_STRUCT_START -# define PB_PACKED_STRUCT_END -# define das_pb_packed -#endif - -/* Handly macro for suppressing unreferenced-parameter compiler warnings. */ -#ifndef PB_UNUSED -#define PB_UNUSED(x) (void)(x) -#endif - -/* Harvard-architecture processors may need special attributes for storing - * field information in program memory. */ -#ifndef PB_PROGMEM -#ifdef __AVR__ -#include -#define PB_PROGMEM PROGMEM -#define PB_PROGMEM_READU32(x) pgm_read_dword(&x) -#else -#define PB_PROGMEM -#define PB_PROGMEM_READU32(x) (x) -#endif -#endif - -/* Compile-time assertion, used for checking compatible compilation options. - * If this does not work properly on your compiler, use - * #define PB_NO_STATIC_ASSERT to disable it. - * - * But before doing that, check carefully the error message / place where it - * comes from to see if the error has a real cause. Unfortunately the error - * message is not always very clear to read, but you can see the reason better - * in the place where the PB_STATIC_ASSERT macro was called. - */ -#ifndef PB_NO_STATIC_ASSERT -# ifndef PB_STATIC_ASSERT -# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L - /* C11 standard _Static_assert mechanism */ -# define PB_STATIC_ASSERT(COND,MSG) _Static_assert(COND,#MSG); -# else - /* Classic negative-size-array static assert mechanism */ -# define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1]; -# define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) -# define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) das_pb_static_assertion_##MSG##_##LINE##_##COUNTER -# endif -# endif -#else - /* Static asserts disabled by PB_NO_STATIC_ASSERT */ -# define PB_STATIC_ASSERT(COND,MSG) -#endif - -/* Number of required fields to keep track of. */ -#ifndef PB_MAX_REQUIRED_FIELDS -#define PB_MAX_REQUIRED_FIELDS 64 -#endif - -#if PB_MAX_REQUIRED_FIELDS < 64 -#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64). -#endif - -#ifdef PB_WITHOUT_64BIT -#ifdef PB_CONVERT_DOUBLE_FLOAT -/* Cannot use doubles without 64-bit types */ -#undef PB_CONVERT_DOUBLE_FLOAT -#endif -#endif - -/* List of possible field types. These are used in the autogenerated code. - * Least-significant 4 bits tell the scalar type - * Most-significant 4 bits specify repeated/required/packed etc. - */ - -typedef uint_least8_t das_pb_type_t; - -/**** Field data types ****/ - -/* Numeric types */ -#define PB_LTYPE_BOOL 0x00U /* bool */ -#define PB_LTYPE_VARINT 0x01U /* int32, int64, enum, bool */ -#define PB_LTYPE_UVARINT 0x02U /* uint32, uint64 */ -#define PB_LTYPE_SVARINT 0x03U /* sint32, sint64 */ -#define PB_LTYPE_FIXED32 0x04U /* fixed32, sfixed32, float */ -#define PB_LTYPE_FIXED64 0x05U /* fixed64, sfixed64, double */ - -/* Marker for last packable field type. */ -#define PB_LTYPE_LAST_PACKABLE 0x05U - -/* Byte array with pre-allocated buffer. - * data_size is the length of the allocated PB_BYTES_ARRAY structure. */ -#define PB_LTYPE_BYTES 0x06U - -/* String with pre-allocated buffer. - * data_size is the maximum length. */ -#define PB_LTYPE_STRING 0x07U - -/* Submessage - * submsg_fields is pointer to field descriptions */ -#define PB_LTYPE_SUBMESSAGE 0x08U - -/* Submessage with pre-decoding callback - * The pre-decoding callback is stored as das_pb_callback_t right before pSize. - * submsg_fields is pointer to field descriptions */ -#define PB_LTYPE_SUBMSG_W_CB 0x09U - -/* Extension pseudo-field - * The field contains a pointer to das_pb_extension_t */ -#define PB_LTYPE_EXTENSION 0x0AU - -/* Byte array with inline, pre-allocated byffer. - * data_size is the length of the inline, allocated buffer. - * This differs from PB_LTYPE_BYTES by defining the element as - * das_pb_byte_t[data_size] rather than das_pb_bytes_array_t. */ -#define PB_LTYPE_FIXED_LENGTH_BYTES 0x0BU - -/* Number of declared LTYPES */ -#define PB_LTYPES_COUNT 0x0CU -#define PB_LTYPE_MASK 0x0FU - -/**** Field repetition rules ****/ - -#define PB_HTYPE_REQUIRED 0x00U -#define PB_HTYPE_OPTIONAL 0x10U -#define PB_HTYPE_SINGULAR 0x10U -#define PB_HTYPE_REPEATED 0x20U -#define PB_HTYPE_FIXARRAY 0x20U -#define PB_HTYPE_ONEOF 0x30U -#define PB_HTYPE_MASK 0x30U - -/**** Field allocation types ****/ - -#define PB_ATYPE_STATIC 0x00U -#define PB_ATYPE_POINTER 0x80U -#define PB_ATYPE_CALLBACK 0x40U -#define PB_ATYPE_MASK 0xC0U - -#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK) -#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK) -#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK) -#define PB_LTYPE_IS_SUBMSG(x) (PB_LTYPE(x) == PB_LTYPE_SUBMESSAGE || \ - PB_LTYPE(x) == PB_LTYPE_SUBMSG_W_CB) - -/* Data type used for storing sizes of struct fields - * and array counts. - */ -#if defined(PB_FIELD_32BIT) - typedef uint32_t das_pb_size_t; - typedef int32_t das_pb_ssize_t; -#else - typedef uint_least16_t das_pb_size_t; - typedef int_least16_t das_pb_ssize_t; -#endif -#define PB_SIZE_MAX ((das_pb_size_t)-1) - -/* Data type for storing encoded data and other byte streams. - * This typedef exists to support platforms where uint8_t does not exist. - * You can regard it as equivalent on uint8_t on other platforms. - */ -typedef uint_least8_t das_pb_byte_t; - -/* Forward declaration of struct types */ -typedef struct das_pb_istream_s das_pb_istream_t; -typedef struct das_pb_ostream_s das_pb_ostream_t; -typedef struct das_pb_field_iter_s das_pb_field_iter_t; - -/* This structure is used in auto-generated constants - * to specify struct fields. - */ -typedef struct das_pb_msgdesc_s das_pb_msgdesc_t; -struct das_pb_msgdesc_s { - const uint32_t *field_info; - const das_pb_msgdesc_t * const * submsg_info; - const das_pb_byte_t *default_value; - - bool (*field_callback)(das_pb_istream_t *istream, das_pb_ostream_t *ostream, const das_pb_field_iter_t *field); - - das_pb_size_t field_count; - das_pb_size_t required_field_count; - das_pb_size_t largest_tag; -}; - -/* Iterator for message descriptor */ -struct das_pb_field_iter_s { - const das_pb_msgdesc_t *descriptor; /* Pointer to message descriptor constant */ - void *message; /* Pointer to start of the structure */ - - das_pb_size_t index; /* Index of the field */ - das_pb_size_t field_info_index; /* Index to descriptor->field_info array */ - das_pb_size_t required_field_index; /* Index that counts only the required fields */ - das_pb_size_t submessage_index; /* Index that counts only submessages */ - - das_pb_size_t tag; /* Tag of current field */ - das_pb_size_t data_size; /* sizeof() of a single item */ - das_pb_size_t array_size; /* Number of array entries */ - das_pb_type_t type; /* Type of current field */ - - void *pField; /* Pointer to current field in struct */ - void *pData; /* Pointer to current data contents. Different than pField for arrays and pointers. */ - void *pSize; /* Pointer to count/has field */ - - const das_pb_msgdesc_t *submsg_desc; /* For submessage fields, pointer to field descriptor for the submessage. */ -}; - -/* For compatibility with legacy code */ -typedef das_pb_field_iter_t das_pb_field_t; - -/* Make sure that the standard integer types are of the expected sizes. - * Otherwise fixed32/fixed64 fields can break. - * - * If you get errors here, it probably means that your stdint.h is not - * correct for your platform. - */ -#ifndef PB_WITHOUT_64BIT -PB_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), INT64_T_WRONG_SIZE) -PB_STATIC_ASSERT(sizeof(uint64_t) == 2 * sizeof(uint32_t), UINT64_T_WRONG_SIZE) -#endif - -/* This structure is used for 'bytes' arrays. - * It has the number of bytes in the beginning, and after that an array. - * Note that actual structs used will have a different length of bytes array. - */ -#define PB_BYTES_ARRAY_T(n) struct { das_pb_size_t size; das_pb_byte_t bytes[n]; } -#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(das_pb_bytes_array_t, bytes)) - -struct das_pb_bytes_array_s { - das_pb_size_t size; - das_pb_byte_t bytes[1]; -}; -typedef struct das_pb_bytes_array_s das_pb_bytes_array_t; - -/* This structure is used for giving the callback function. - * It is stored in the message structure and filled in by the method that - * calls das_pb_decode. - * - * The decoding callback will be given a limited-length stream - * If the wire type was string, the length is the length of the string. - * If the wire type was a varint/fixed32/fixed64, the length is the length - * of the actual value. - * The function may be called multiple times (especially for repeated types, - * but also otherwise if the message happens to contain the field multiple - * times.) - * - * The encoding callback will receive the actual output stream. - * It should write all the data in one call, including the field tag and - * wire type. It can write multiple fields. - * - * The callback can be null if you want to skip a field. - */ -typedef struct das_pb_callback_s das_pb_callback_t; -struct das_pb_callback_s { - /* Callback functions receive a pointer to the arg field. - * You can access the value of the field as *arg, and modify it if needed. - */ - union { - bool (*decode)(das_pb_istream_t *stream, const das_pb_field_t *field, void **arg); - bool (*encode)(das_pb_ostream_t *stream, const das_pb_field_t *field, void * const *arg); - } funcs; - - /* Free arg for use by callback */ - void *arg; -}; - -extern bool das_pb_default_field_callback(das_pb_istream_t *istream, das_pb_ostream_t *ostream, const das_pb_field_t *field); - -/* Wire types. Library user needs these only in encoder callbacks. */ -typedef enum { - PB_WT_VARINT = 0, - PB_WT_64BIT = 1, - PB_WT_STRING = 2, - PB_WT_32BIT = 5 -} das_pb_wire_type_t; - -/* Structure for defining the handling of unknown/extension fields. - * Usually the das_pb_extension_type_t structure is automatically generated, - * while the das_pb_extension_t structure is created by the user. However, - * if you want to catch all unknown fields, you can also create a custom - * das_pb_extension_type_t with your own callback. - */ -typedef struct das_pb_extension_type_s das_pb_extension_type_t; -typedef struct das_pb_extension_s das_pb_extension_t; -struct das_pb_extension_type_s { - /* Called for each unknown field in the message. - * If you handle the field, read off all of its data and return true. - * If you do not handle the field, do not read anything and return true. - * If you run into an error, return false. - * Set to NULL for default handler. - */ - bool (*decode)(das_pb_istream_t *stream, das_pb_extension_t *extension, - uint32_t tag, das_pb_wire_type_t wire_type); - - /* Called once after all regular fields have been encoded. - * If you have something to write, do so and return true. - * If you do not have anything to write, just return true. - * If you run into an error, return false. - * Set to NULL for default handler. - */ - bool (*encode)(das_pb_ostream_t *stream, const das_pb_extension_t *extension); - - /* Free field for use by the callback. */ - const void *arg; -}; - -struct das_pb_extension_s { - /* Type describing the extension field. Usually you'll initialize - * this to a pointer to the automatically generated structure. */ - const das_pb_extension_type_t *type; - - /* Destination for the decoded data. This must match the datatype - * of the extension field. */ - void *dest; - - /* Pointer to the next extension handler, or NULL. - * If this extension does not match a field, the next handler is - * automatically called. */ - das_pb_extension_t *next; - - /* The decoder sets this to true if the extension was found. - * Ignored for encoding. */ - bool found; -}; - -#define das_pb_extension_init_zero {NULL,NULL,NULL,false} - -/* Memory allocation functions to use. You can define das_pb_realloc and - * das_pb_free to custom functions if you want. */ -#ifdef PB_ENABLE_MALLOC -# ifndef das_pb_realloc -# define das_pb_realloc(ptr, size) realloc(ptr, size) -# endif -# ifndef das_pb_free -# define das_pb_free(ptr) free(ptr) -# endif -#endif - -/* This is used to inform about need to regenerate .pb.h/.pb.c files. */ -#define PB_PROTO_HEADER_VERSION 40 - -/* These macros are used to declare das_pb_field_t's in the constant array. */ -/* Size of a structure member, in bytes. */ -#define das_pb_membersize(st, m) (sizeof ((st*)0)->m) -/* Number of entries in an array. */ -#define das_pb_arraysize(st, m) (das_pb_membersize(st, m) / das_pb_membersize(st, m[0])) -/* Delta from start of one member to the start of another member. */ -#define das_pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) - -/* Force expansion of macro value */ -#define PB_EXPAND(x) x - -/* Binding of a message field set into a specific structure */ -#define PB_BIND(msgname, structname, width) \ - const uint32_t structname ## _field_info[] PB_PROGMEM = \ - { \ - msgname ## _FIELDLIST(PB_GEN_FIELD_INFO_ ## width, structname) \ - 0 \ - }; \ - const das_pb_msgdesc_t* const structname ## _submsg_info[] = \ - { \ - msgname ## _FIELDLIST(PB_GEN_SUBMSG_INFO, structname) \ - NULL \ - }; \ - const das_pb_msgdesc_t structname ## _msg = \ - { \ - structname ## _field_info, \ - structname ## _submsg_info, \ - msgname ## _DEFAULT, \ - msgname ## _CALLBACK, \ - 0 msgname ## _FIELDLIST(PB_GEN_FIELD_COUNT, structname), \ - 0 msgname ## _FIELDLIST(PB_GEN_REQ_FIELD_COUNT, structname), \ - 0 msgname ## _FIELDLIST(PB_GEN_LARGEST_TAG, structname), \ - }; \ - msgname ## _FIELDLIST(PB_GEN_FIELD_INFO_ASSERT_ ## width, structname) - -#define PB_GEN_FIELD_COUNT(structname, atype, htype, ltype, fieldname, tag) +1 -#define PB_GEN_REQ_FIELD_COUNT(structname, atype, htype, ltype, fieldname, tag) \ - + (PB_HTYPE_ ## htype == PB_HTYPE_REQUIRED) -#define PB_GEN_LARGEST_TAG(structname, atype, htype, ltype, fieldname, tag) \ - * 0 + tag - -/* X-macro for generating the entries in struct_field_info[] array. */ -#define PB_GEN_FIELD_INFO_1(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_1(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_2(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_2(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_4(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_4(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_8(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_8(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_AUTO(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_AUTO2(PB_FIELDINFO_WIDTH_AUTO(_PB_ATYPE_ ## atype, _PB_HTYPE_ ## htype, _PB_LTYPE_ ## ltype), \ - tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_FIELDINFO_AUTO2(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) - -#define PB_FIELDINFO_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_ ## width(tag, type, data_offset, data_size, size_offset, array_size) - -/* X-macro for generating asserts that entries fit in struct_field_info[] array. - * The structure of macros here must match the structure above in PB_GEN_FIELD_INFO_x(), - * but it is not easily reused because of how macro substitutions work. */ -#define PB_GEN_FIELD_INFO_ASSERT_1(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_1(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_2(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_2(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_4(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_4(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_8(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_8(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_AUTO(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_AUTO2(PB_FIELDINFO_WIDTH_AUTO(_PB_ATYPE_ ## atype, _PB_HTYPE_ ## htype, _PB_LTYPE_ ## ltype), \ - tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ - PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ - PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) - -#define PB_FIELDINFO_ASSERT_AUTO2(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_ASSERT_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) - -#define PB_FIELDINFO_ASSERT_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_ASSERT_ ## width(tag, type, data_offset, data_size, size_offset, array_size) - -#define PB_DATA_OFFSET_STATIC(htype, structname, fieldname) PB_DO ## htype(structname, fieldname) -#define PB_DATA_OFFSET_POINTER(htype, structname, fieldname) PB_DO ## htype(structname, fieldname) -#define PB_DATA_OFFSET_CALLBACK(htype, structname, fieldname) PB_DO ## htype(structname, fieldname) -#define PB_DO_PB_HTYPE_REQUIRED(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_SINGULAR(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_ONEOF(structname, fieldname) offsetof(structname, PB_ONEOF_NAME(FULL, fieldname)) -#define PB_DO_PB_HTYPE_OPTIONAL(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_REPEATED(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_FIXARRAY(structname, fieldname) offsetof(structname, fieldname) - -#define PB_SIZE_OFFSET_STATIC(htype, structname, fieldname) PB_SO ## htype(structname, fieldname) -#define PB_SIZE_OFFSET_POINTER(htype, structname, fieldname) PB_SO_PTR ## htype(structname, fieldname) -#define PB_SIZE_OFFSET_CALLBACK(htype, structname, fieldname) PB_SO_CB ## htype(structname, fieldname) -#define PB_SO_PB_HTYPE_REQUIRED(structname, fieldname) 0 -#define PB_SO_PB_HTYPE_SINGULAR(structname, fieldname) 0 -#define PB_SO_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF2(structname, PB_ONEOF_NAME(FULL, fieldname), PB_ONEOF_NAME(UNION, fieldname)) -#define PB_SO_PB_HTYPE_ONEOF2(structname, fullname, unionname) PB_SO_PB_HTYPE_ONEOF3(structname, fullname, unionname) -#define PB_SO_PB_HTYPE_ONEOF3(structname, fullname, unionname) das_pb_delta(structname, fullname, which_ ## unionname) -#define PB_SO_PB_HTYPE_OPTIONAL(structname, fieldname) das_pb_delta(structname, fieldname, has_ ## fieldname) -#define PB_SO_PB_HTYPE_REPEATED(structname, fieldname) das_pb_delta(structname, fieldname, fieldname ## _count) -#define PB_SO_PB_HTYPE_FIXARRAY(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_REQUIRED(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_SINGULAR(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF(structname, fieldname) -#define PB_SO_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_REPEATED(structname, fieldname) PB_SO_PB_HTYPE_REPEATED(structname, fieldname) -#define PB_SO_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_REQUIRED(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_SINGULAR(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF(structname, fieldname) -#define PB_SO_CB_PB_HTYPE_OPTIONAL(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_REPEATED(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_FIXARRAY(structname, fieldname) 0 - -#define PB_ARRAY_SIZE_STATIC(htype, structname, fieldname) PB_AS ## htype(structname, fieldname) -#define PB_ARRAY_SIZE_POINTER(htype, structname, fieldname) PB_AS_PTR ## htype(structname, fieldname) -#define PB_ARRAY_SIZE_CALLBACK(htype, structname, fieldname) 1 -#define PB_AS_PB_HTYPE_REQUIRED(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_SINGULAR(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_OPTIONAL(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_ONEOF(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_REPEATED(structname, fieldname) das_pb_arraysize(structname, fieldname) -#define PB_AS_PB_HTYPE_FIXARRAY(structname, fieldname) das_pb_arraysize(structname, fieldname) -#define PB_AS_PTR_PB_HTYPE_REQUIRED(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_SINGULAR(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_ONEOF(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_REPEATED(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) das_pb_arraysize(structname, fieldname[0]) - -#define PB_DATA_SIZE_STATIC(htype, structname, fieldname) PB_DS ## htype(structname, fieldname) -#define PB_DATA_SIZE_POINTER(htype, structname, fieldname) PB_DS_PTR ## htype(structname, fieldname) -#define PB_DATA_SIZE_CALLBACK(htype, structname, fieldname) PB_DS_CB ## htype(structname, fieldname) -#define PB_DS_PB_HTYPE_REQUIRED(structname, fieldname) das_pb_membersize(structname, fieldname) -#define PB_DS_PB_HTYPE_SINGULAR(structname, fieldname) das_pb_membersize(structname, fieldname) -#define PB_DS_PB_HTYPE_OPTIONAL(structname, fieldname) das_pb_membersize(structname, fieldname) -#define PB_DS_PB_HTYPE_ONEOF(structname, fieldname) das_pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)) -#define PB_DS_PB_HTYPE_REPEATED(structname, fieldname) das_pb_membersize(structname, fieldname[0]) -#define PB_DS_PB_HTYPE_FIXARRAY(structname, fieldname) das_pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_REQUIRED(structname, fieldname) das_pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_SINGULAR(structname, fieldname) das_pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) das_pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_ONEOF(structname, fieldname) das_pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)[0]) -#define PB_DS_PTR_PB_HTYPE_REPEATED(structname, fieldname) das_pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) das_pb_membersize(structname, fieldname[0][0]) -#define PB_DS_CB_PB_HTYPE_REQUIRED(structname, fieldname) das_pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_SINGULAR(structname, fieldname) das_pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_OPTIONAL(structname, fieldname) das_pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_ONEOF(structname, fieldname) das_pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)) -#define PB_DS_CB_PB_HTYPE_REPEATED(structname, fieldname) das_pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_FIXARRAY(structname, fieldname) das_pb_membersize(structname, fieldname) - -#define PB_ONEOF_NAME(type, tuple) PB_EXPAND(PB_ONEOF_NAME_ ## type tuple) -#define PB_ONEOF_NAME_UNION(unionname,membername,fullname) unionname -#define PB_ONEOF_NAME_MEMBER(unionname,membername,fullname) membername -#define PB_ONEOF_NAME_FULL(unionname,membername,fullname) fullname - -#define PB_GEN_SUBMSG_INFO(structname, atype, htype, ltype, fieldname, tag) \ - PB_SUBMSG_INFO_ ## htype(_PB_LTYPE_ ## ltype, structname, fieldname) - -#define PB_SUBMSG_INFO_REQUIRED(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) -#define PB_SUBMSG_INFO_SINGULAR(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) -#define PB_SUBMSG_INFO_OPTIONAL(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) -#define PB_SUBMSG_INFO_ONEOF(ltype, structname, fieldname) PB_SUBMSG_INFO_ONEOF2(ltype, structname, PB_ONEOF_NAME(UNION, fieldname), PB_ONEOF_NAME(MEMBER, fieldname)) -#define PB_SUBMSG_INFO_ONEOF2(ltype, structname, unionname, membername) PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername) -#define PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername) PB_SI ## ltype(structname ## _ ## unionname ## _ ## membername ## _MSGTYPE) -#define PB_SUBMSG_INFO_REPEATED(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) -#define PB_SUBMSG_INFO_FIXARRAY(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) -#define PB_SI_PB_LTYPE_BOOL(t) -#define PB_SI_PB_LTYPE_BYTES(t) -#define PB_SI_PB_LTYPE_DOUBLE(t) -#define PB_SI_PB_LTYPE_ENUM(t) -#define PB_SI_PB_LTYPE_UENUM(t) -#define PB_SI_PB_LTYPE_FIXED32(t) -#define PB_SI_PB_LTYPE_FIXED64(t) -#define PB_SI_PB_LTYPE_FLOAT(t) -#define PB_SI_PB_LTYPE_INT32(t) -#define PB_SI_PB_LTYPE_INT64(t) -#define PB_SI_PB_LTYPE_MESSAGE(t) PB_SUBMSG_DESCRIPTOR(t) -#define PB_SI_PB_LTYPE_MSG_W_CB(t) PB_SUBMSG_DESCRIPTOR(t) -#define PB_SI_PB_LTYPE_SFIXED32(t) -#define PB_SI_PB_LTYPE_SFIXED64(t) -#define PB_SI_PB_LTYPE_SINT32(t) -#define PB_SI_PB_LTYPE_SINT64(t) -#define PB_SI_PB_LTYPE_STRING(t) -#define PB_SI_PB_LTYPE_UINT32(t) -#define PB_SI_PB_LTYPE_UINT64(t) -#define PB_SI_PB_LTYPE_EXTENSION(t) -#define PB_SI_PB_LTYPE_FIXED_LENGTH_BYTES(t) -#define PB_SUBMSG_DESCRIPTOR(t) &(t ## _msg), - -/* The field descriptors use a variable width format, with width of either - * 1, 2, 4 or 8 of 32-bit words. The two lowest bytes of the first byte always - * encode the descriptor size, 6 lowest bits of field tag number, and 8 bits - * of the field type. - * - * Descriptor size is encoded as 0 = 1 word, 1 = 2 words, 2 = 4 words, 3 = 8 words. - * - * Formats, listed starting with the least significant bit of the first word. - * 1 word: [2-bit len] [6-bit tag] [8-bit type] [8-bit data_offset] [4-bit size_offset] [4-bit data_size] - * - * 2 words: [2-bit len] [6-bit tag] [8-bit type] [12-bit array_size] [4-bit size_offset] - * [16-bit data_offset] [12-bit data_size] [4-bit tag>>6] - * - * 4 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit array_size] - * [8-bit size_offset] [24-bit tag>>6] - * [32-bit data_offset] - * [32-bit data_size] - * - * 8 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit reserved] - * [8-bit size_offset] [24-bit tag>>6] - * [32-bit data_offset] - * [32-bit data_size] - * [32-bit array_size] - * [32-bit reserved] - * [32-bit reserved] - * [32-bit reserved] - */ - -#define PB_FIELDINFO_1(tag, type, data_offset, data_size, size_offset, array_size) \ - (0 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(data_offset) & 0xFF) << 16) | \ - (((uint32_t)(size_offset) & 0x0F) << 24) | (((uint32_t)(data_size) & 0x0F) << 28)), - -#define PB_FIELDINFO_2(tag, type, data_offset, data_size, size_offset, array_size) \ - (1 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size) & 0xFFF) << 16) | (((uint32_t)(size_offset) & 0x0F) << 28)), \ - (((uint32_t)(data_offset) & 0xFFFF) | (((uint32_t)(data_size) & 0xFFF) << 16) | (((uint32_t)(tag) & 0x3c0) << 22)), - -#define PB_FIELDINFO_4(tag, type, data_offset, data_size, size_offset, array_size) \ - (2 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size) & 0xFFFF) << 16)), \ - ((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), \ - (data_offset), (data_size), - -#define PB_FIELDINFO_8(tag, type, data_offset, data_size, size_offset, array_size) \ - (3 | (((tag) << 2) & 0xFF) | ((type) << 8)), \ - ((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), \ - (data_offset), (data_size), (array_size), 0, 0, 0, - -/* These assertions verify that the field information fits in the allocated space. - * The generator tries to automatically determine the correct width that can fit all - * data associated with a message. These asserts will fail only if there has been a - * problem in the automatic logic - this may be worth reporting as a bug. As a workaround, - * you can increase the descriptor width by defining PB_FIELDINFO_WIDTH or by setting - * descriptorsize option in .options file. - */ -#define PB_FITS(value,bits) ((uint32_t)(value) < ((uint32_t)1<2GB messages with nanopb anyway. - */ -#define PB_FIELDINFO_ASSERT_4(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag,30) && PB_FITS(data_offset,31) && PB_FITS(size_offset,8) && PB_FITS(data_size,31) && PB_FITS(array_size,16), FIELDINFO_DOES_NOT_FIT_width4_field ## tag) - -#define PB_FIELDINFO_ASSERT_8(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag,30) && PB_FITS(data_offset,31) && PB_FITS(size_offset,8) && PB_FITS(data_size,31) && PB_FITS(array_size,31), FIELDINFO_DOES_NOT_FIT_width8_field ## tag) -#endif - - -/* Automatic picking of FIELDINFO width: - * Uses width 1 when possible, otherwise resorts to width 2. - * This is used when PB_BIND() is called with "AUTO" as the argument. - * The generator will give explicit size argument when it knows that a message - * structure grows beyond 1-word format limits. - */ -#define PB_FIELDINFO_WIDTH_AUTO(atype, htype, ltype) PB_FI_WIDTH ## atype(htype, ltype) -#define PB_FI_WIDTH_PB_ATYPE_STATIC(htype, ltype) PB_FI_WIDTH ## htype(ltype) -#define PB_FI_WIDTH_PB_ATYPE_POINTER(htype, ltype) PB_FI_WIDTH ## htype(ltype) -#define PB_FI_WIDTH_PB_ATYPE_CALLBACK(htype, ltype) 2 -#define PB_FI_WIDTH_PB_HTYPE_REQUIRED(ltype) PB_FI_WIDTH ## ltype -#define PB_FI_WIDTH_PB_HTYPE_SINGULAR(ltype) PB_FI_WIDTH ## ltype -#define PB_FI_WIDTH_PB_HTYPE_OPTIONAL(ltype) PB_FI_WIDTH ## ltype -#define PB_FI_WIDTH_PB_HTYPE_ONEOF(ltype) PB_FI_WIDTH ## ltype -#define PB_FI_WIDTH_PB_HTYPE_REPEATED(ltype) 2 -#define PB_FI_WIDTH_PB_HTYPE_FIXARRAY(ltype) 2 -#define PB_FI_WIDTH_PB_LTYPE_BOOL 1 -#define PB_FI_WIDTH_PB_LTYPE_BYTES 2 -#define PB_FI_WIDTH_PB_LTYPE_DOUBLE 1 -#define PB_FI_WIDTH_PB_LTYPE_ENUM 1 -#define PB_FI_WIDTH_PB_LTYPE_UENUM 1 -#define PB_FI_WIDTH_PB_LTYPE_FIXED32 1 -#define PB_FI_WIDTH_PB_LTYPE_FIXED64 1 -#define PB_FI_WIDTH_PB_LTYPE_FLOAT 1 -#define PB_FI_WIDTH_PB_LTYPE_INT32 1 -#define PB_FI_WIDTH_PB_LTYPE_INT64 1 -#define PB_FI_WIDTH_PB_LTYPE_MESSAGE 2 -#define PB_FI_WIDTH_PB_LTYPE_MSG_W_CB 2 -#define PB_FI_WIDTH_PB_LTYPE_SFIXED32 1 -#define PB_FI_WIDTH_PB_LTYPE_SFIXED64 1 -#define PB_FI_WIDTH_PB_LTYPE_SINT32 1 -#define PB_FI_WIDTH_PB_LTYPE_SINT64 1 -#define PB_FI_WIDTH_PB_LTYPE_STRING 2 -#define PB_FI_WIDTH_PB_LTYPE_UINT32 1 -#define PB_FI_WIDTH_PB_LTYPE_UINT64 1 -#define PB_FI_WIDTH_PB_LTYPE_EXTENSION 1 -#define PB_FI_WIDTH_PB_LTYPE_FIXED_LENGTH_BYTES 2 - -/* The mapping from protobuf types to LTYPEs is done using these macros. */ -#define PB_LTYPE_MAP_BOOL PB_LTYPE_BOOL -#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES -#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT -#define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT -#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT -#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE -#define PB_LTYPE_MAP_MSG_W_CB PB_LTYPE_SUBMSG_W_CB -#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT -#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT -#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING -#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION -#define PB_LTYPE_MAP_FIXED_LENGTH_BYTES PB_LTYPE_FIXED_LENGTH_BYTES - -/* These macros are used for giving out error messages. - * They are mostly a debugging aid; the main error information - * is the true/false return value from functions. - * Some code space can be saved by disabling the error - * messages if not used. - * - * PB_SET_ERROR() sets the error message if none has been set yet. - * msg must be a constant string literal. - * PB_GET_ERROR() always returns a pointer to a string. - * PB_RETURN_ERROR() sets the error and returns false from current - * function. - */ -#ifdef PB_NO_ERRMSG -#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream) -#define PB_GET_ERROR(stream) "(errmsg disabled)" -#else -#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg)) -#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)") -#endif - -#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#ifdef __cplusplus -#if __cplusplus >= 201103L -#define PB_CONSTEXPR constexpr -#else // __cplusplus >= 201103L -#define PB_CONSTEXPR -#endif // __cplusplus >= 201103L - -#if __cplusplus >= 201703L -#define PB_INLINE_CONSTEXPR inline constexpr -#else // __cplusplus >= 201703L -#define PB_INLINE_CONSTEXPR PB_CONSTEXPR -#endif // __cplusplus >= 201703L - -namespace nanopb { -// Each type will be partially specialized by the generator. -template struct MessageDescriptor; -} // namespace nanopb -#endif /* __cplusplus */ - -#endif - diff --git a/src/lsoc_das2/proto/pb_common.c b/src/lsoc_das2/proto/pb_common.c deleted file mode 100644 index 4a349d1..0000000 --- a/src/lsoc_das2/proto/pb_common.c +++ /dev/null @@ -1,388 +0,0 @@ -/* pb_common.c: Common support functions for pb_encode.c and pb_decode.c. - * - * 2014 Petteri Aimonen - */ - -#include "pb_common.h" - -static bool load_descriptor_values(das_pb_field_iter_t *iter) -{ - uint32_t word0; - uint32_t data_offset; - int_least8_t size_offset; - - if (iter->index >= iter->descriptor->field_count) - return false; - - word0 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - iter->type = (das_pb_type_t)((word0 >> 8) & 0xFF); - - switch(word0 & 3) - { - case 0: { - /* 1-word format */ - iter->array_size = 1; - iter->tag = (das_pb_size_t)((word0 >> 2) & 0x3F); - size_offset = (int_least8_t)((word0 >> 24) & 0x0F); - data_offset = (word0 >> 16) & 0xFF; - iter->data_size = (das_pb_size_t)((word0 >> 28) & 0x0F); - break; - } - - case 1: { - /* 2-word format */ - uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]); - - iter->array_size = (das_pb_size_t)((word0 >> 16) & 0x0FFF); - iter->tag = (das_pb_size_t)(((word0 >> 2) & 0x3F) | ((word1 >> 28) << 6)); - size_offset = (int_least8_t)((word0 >> 28) & 0x0F); - data_offset = word1 & 0xFFFF; - iter->data_size = (das_pb_size_t)((word1 >> 16) & 0x0FFF); - break; - } - - case 2: { - /* 4-word format */ - uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]); - uint32_t word2 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 2]); - uint32_t word3 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 3]); - - iter->array_size = (das_pb_size_t)(word0 >> 16); - iter->tag = (das_pb_size_t)(((word0 >> 2) & 0x3F) | ((word1 >> 8) << 6)); - size_offset = (int_least8_t)(word1 & 0xFF); - data_offset = word2; - iter->data_size = (das_pb_size_t)word3; - break; - } - - default: { - /* 8-word format */ - uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]); - uint32_t word2 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 2]); - uint32_t word3 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 3]); - uint32_t word4 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 4]); - - iter->array_size = (das_pb_size_t)word4; - iter->tag = (das_pb_size_t)(((word0 >> 2) & 0x3F) | ((word1 >> 8) << 6)); - size_offset = (int_least8_t)(word1 & 0xFF); - data_offset = word2; - iter->data_size = (das_pb_size_t)word3; - break; - } - } - - if (!iter->message) - { - /* Avoid doing arithmetic on null pointers, it is undefined */ - iter->pField = NULL; - iter->pSize = NULL; - } - else - { - iter->pField = (char*)iter->message + data_offset; - - if (size_offset) - { - iter->pSize = (char*)iter->pField - size_offset; - } - else if (PB_HTYPE(iter->type) == PB_HTYPE_REPEATED && - (PB_ATYPE(iter->type) == PB_ATYPE_STATIC || - PB_ATYPE(iter->type) == PB_ATYPE_POINTER)) - { - /* Fixed count array */ - iter->pSize = &iter->array_size; - } - else - { - iter->pSize = NULL; - } - - if (PB_ATYPE(iter->type) == PB_ATYPE_POINTER && iter->pField != NULL) - { - iter->pData = *(void**)iter->pField; - } - else - { - iter->pData = iter->pField; - } - } - - if (PB_LTYPE_IS_SUBMSG(iter->type)) - { - iter->submsg_desc = iter->descriptor->submsg_info[iter->submessage_index]; - } - else - { - iter->submsg_desc = NULL; - } - - return true; -} - -static void advance_iterator(das_pb_field_iter_t *iter) -{ - iter->index++; - - if (iter->index >= iter->descriptor->field_count) - { - /* Restart */ - iter->index = 0; - iter->field_info_index = 0; - iter->submessage_index = 0; - iter->required_field_index = 0; - } - else - { - /* Increment indexes based on previous field type. - * All field info formats have the following fields: - * - lowest 2 bits tell the amount of words in the descriptor (2^n words) - * - bits 2..7 give the lowest bits of tag number. - * - bits 8..15 give the field type. - */ - uint32_t prev_descriptor = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - das_pb_type_t prev_type = (prev_descriptor >> 8) & 0xFF; - das_pb_size_t descriptor_len = (das_pb_size_t)(1 << (prev_descriptor & 3)); - - /* Add to fields. - * The cast to das_pb_size_t is needed to avoid -Wconversion warning. - * Because the data is is constants from generator, there is no danger of overflow. - */ - iter->field_info_index = (das_pb_size_t)(iter->field_info_index + descriptor_len); - iter->required_field_index = (das_pb_size_t)(iter->required_field_index + (PB_HTYPE(prev_type) == PB_HTYPE_REQUIRED)); - iter->submessage_index = (das_pb_size_t)(iter->submessage_index + PB_LTYPE_IS_SUBMSG(prev_type)); - } -} - -bool das_pb_field_iter_begin(das_pb_field_iter_t *iter, const das_pb_msgdesc_t *desc, void *message) -{ - memset(iter, 0, sizeof(*iter)); - - iter->descriptor = desc; - iter->message = message; - - return load_descriptor_values(iter); -} - -bool das_pb_field_iter_begin_extension(das_pb_field_iter_t *iter, das_pb_extension_t *extension) -{ - const das_pb_msgdesc_t *msg = (const das_pb_msgdesc_t*)extension->type->arg; - bool status; - - uint32_t word0 = PB_PROGMEM_READU32(msg->field_info[0]); - if (PB_ATYPE(word0 >> 8) == PB_ATYPE_POINTER) - { - /* For pointer extensions, the pointer is stored directly - * in the extension structure. This avoids having an extra - * indirection. */ - status = das_pb_field_iter_begin(iter, msg, &extension->dest); - } - else - { - status = das_pb_field_iter_begin(iter, msg, extension->dest); - } - - iter->pSize = &extension->found; - return status; -} - -bool das_pb_field_iter_next(das_pb_field_iter_t *iter) -{ - advance_iterator(iter); - (void)load_descriptor_values(iter); - return iter->index != 0; -} - -bool das_pb_field_iter_find(das_pb_field_iter_t *iter, uint32_t tag) -{ - if (iter->tag == tag) - { - return true; /* Nothing to do, correct field already. */ - } - else if (tag > iter->descriptor->largest_tag) - { - return false; - } - else - { - das_pb_size_t start = iter->index; - uint32_t fieldinfo; - - if (tag < iter->tag) - { - /* Fields are in tag number order, so we know that tag is between - * 0 and our start position. Setting index to end forces - * advance_iterator() call below to restart from beginning. */ - iter->index = iter->descriptor->field_count; - } - - do - { - /* Advance iterator but don't load values yet */ - advance_iterator(iter); - - /* Do fast check for tag number match */ - fieldinfo = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - - if (((fieldinfo >> 2) & 0x3F) == (tag & 0x3F)) - { - /* Good candidate, check further */ - (void)load_descriptor_values(iter); - - if (iter->tag == tag && - PB_LTYPE(iter->type) != PB_LTYPE_EXTENSION) - { - /* Found it */ - return true; - } - } - } while (iter->index != start); - - /* Searched all the way back to start, and found nothing. */ - (void)load_descriptor_values(iter); - return false; - } -} - -bool das_pb_field_iter_find_extension(das_pb_field_iter_t *iter) -{ - if (PB_LTYPE(iter->type) == PB_LTYPE_EXTENSION) - { - return true; - } - else - { - das_pb_size_t start = iter->index; - uint32_t fieldinfo; - - do - { - /* Advance iterator but don't load values yet */ - advance_iterator(iter); - - /* Do fast check for field type */ - fieldinfo = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - - if (PB_LTYPE((fieldinfo >> 8) & 0xFF) == PB_LTYPE_EXTENSION) - { - return load_descriptor_values(iter); - } - } while (iter->index != start); - - /* Searched all the way back to start, and found nothing. */ - (void)load_descriptor_values(iter); - return false; - } -} - -static void *das_pb_const_cast(const void *p) -{ - /* Note: this casts away const, in order to use the common field iterator - * logic for both encoding and decoding. The cast is done using union - * to avoid spurious compiler warnings. */ - union { - void *p1; - const void *p2; - } t; - t.p2 = p; - return t.p1; -} - -bool das_pb_field_iter_begin_const(das_pb_field_iter_t *iter, const das_pb_msgdesc_t *desc, const void *message) -{ - return das_pb_field_iter_begin(iter, desc, das_pb_const_cast(message)); -} - -bool das_pb_field_iter_begin_extension_const(das_pb_field_iter_t *iter, const das_pb_extension_t *extension) -{ - return das_pb_field_iter_begin_extension(iter, (das_pb_extension_t*)das_pb_const_cast(extension)); -} - -bool das_pb_default_field_callback(das_pb_istream_t *istream, das_pb_ostream_t *ostream, const das_pb_field_t *field) -{ - if (field->data_size == sizeof(das_pb_callback_t)) - { - das_pb_callback_t *pCallback = (das_pb_callback_t*)field->pData; - - if (pCallback != NULL) - { - if (istream != NULL && pCallback->funcs.decode != NULL) - { - return pCallback->funcs.decode(istream, field, &pCallback->arg); - } - - if (ostream != NULL && pCallback->funcs.encode != NULL) - { - return pCallback->funcs.encode(ostream, field, &pCallback->arg); - } - } - } - - return true; /* Success, but didn't do anything */ - -} - -#ifdef PB_VALIDATE_UTF8 - -/* This function checks whether a string is valid UTF-8 text. - * - * Algorithm is adapted from https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c - * Original copyright: Markus Kuhn 2005-03-30 - * Licensed under "Short code license", which allows use under MIT license or - * any compatible with it. - */ - -bool das_pb_validate_utf8(const char *str) -{ - const das_pb_byte_t *s = (const das_pb_byte_t*)str; - while (*s) - { - if (*s < 0x80) - { - /* 0xxxxxxx */ - s++; - } - else if ((s[0] & 0xe0) == 0xc0) - { - /* 110XXXXx 10xxxxxx */ - if ((s[1] & 0xc0) != 0x80 || - (s[0] & 0xfe) == 0xc0) /* overlong? */ - return false; - else - s += 2; - } - else if ((s[0] & 0xf0) == 0xe0) - { - /* 1110XXXX 10Xxxxxx 10xxxxxx */ - if ((s[1] & 0xc0) != 0x80 || - (s[2] & 0xc0) != 0x80 || - (s[0] == 0xe0 && (s[1] & 0xe0) == 0x80) || /* overlong? */ - (s[0] == 0xed && (s[1] & 0xe0) == 0xa0) || /* surrogate? */ - (s[0] == 0xef && s[1] == 0xbf && - (s[2] & 0xfe) == 0xbe)) /* U+FFFE or U+FFFF? */ - return false; - else - s += 3; - } - else if ((s[0] & 0xf8) == 0xf0) - { - /* 11110XXX 10XXxxxx 10xxxxxx 10xxxxxx */ - if ((s[1] & 0xc0) != 0x80 || - (s[2] & 0xc0) != 0x80 || - (s[3] & 0xc0) != 0x80 || - (s[0] == 0xf0 && (s[1] & 0xf0) == 0x80) || /* overlong? */ - (s[0] == 0xf4 && s[1] > 0x8f) || s[0] > 0xf4) /* > U+10FFFF? */ - return false; - else - s += 4; - } - else - { - return false; - } - } - - return true; -} - -#endif - diff --git a/src/lsoc_das2/proto/pb_common.h b/src/lsoc_das2/proto/pb_common.h deleted file mode 100644 index ae5b5d9..0000000 --- a/src/lsoc_das2/proto/pb_common.h +++ /dev/null @@ -1,49 +0,0 @@ -/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c. - * These functions are rarely needed by applications directly. - */ - -#ifndef PB_COMMON_H_INCLUDED -#define PB_COMMON_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Initialize the field iterator structure to beginning. - * Returns false if the message type is empty. */ -bool das_pb_field_iter_begin(das_pb_field_iter_t *iter, const das_pb_msgdesc_t *desc, void *message); - -/* Get a field iterator for extension field. */ -bool das_pb_field_iter_begin_extension(das_pb_field_iter_t *iter, das_pb_extension_t *extension); - -/* Same as das_pb_field_iter_begin(), but for const message pointer. - * Note that the pointers in das_pb_field_iter_t will be non-const but shouldn't - * be written to when using these functions. */ -bool das_pb_field_iter_begin_const(das_pb_field_iter_t *iter, const das_pb_msgdesc_t *desc, const void *message); -bool das_pb_field_iter_begin_extension_const(das_pb_field_iter_t *iter, const das_pb_extension_t *extension); - -/* Advance the iterator to the next field. - * Returns false when the iterator wraps back to the first field. */ -bool das_pb_field_iter_next(das_pb_field_iter_t *iter); - -/* Advance the iterator until it points at a field with the given tag. - * Returns false if no such field exists. */ -bool das_pb_field_iter_find(das_pb_field_iter_t *iter, uint32_t tag); - -/* Find a field with type PB_LTYPE_EXTENSION, or return false if not found. - * There can be only one extension range field per message. */ -bool das_pb_field_iter_find_extension(das_pb_field_iter_t *iter); - -#ifdef PB_VALIDATE_UTF8 -/* Validate UTF-8 text string */ -bool das_pb_validate_utf8(const char *s); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif - diff --git a/src/lsoc_das2/proto/pb_decode.c b/src/lsoc_das2/proto/pb_decode.c deleted file mode 100644 index f5e6458..0000000 --- a/src/lsoc_das2/proto/pb_decode.c +++ /dev/null @@ -1,1692 +0,0 @@ -/* pb_decode.c -- decode a protobuf using minimal resources - * - * 2011 Petteri Aimonen - */ - -/* Use the GCC warn_unused_result attribute to check that all return values - * are propagated correctly. On other compilers and gcc before 3.4.0 just - * ignore the annotation. - */ -#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) - #define checkreturn -#else - #define checkreturn __attribute__((warn_unused_result)) -#endif - -#include "pb.h" -#include "pb_decode.h" -#include "pb_common.h" - -/************************************** - * Declarations internal to this file * - **************************************/ - -static bool checkreturn buf_read(das_pb_istream_t *stream, das_pb_byte_t *buf, size_t count); -static bool checkreturn das_pb_decode_varint32_eof(das_pb_istream_t *stream, uint32_t *dest, bool *eof); -static bool checkreturn read_raw_value(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_byte_t *buf, size_t *size); -static bool checkreturn decode_basic_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field); -static bool checkreturn decode_static_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field); -static bool checkreturn decode_pointer_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field); -static bool checkreturn decode_callback_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field); -static bool checkreturn decode_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field); -static bool checkreturn default_extension_decoder(das_pb_istream_t *stream, das_pb_extension_t *extension, uint32_t tag, das_pb_wire_type_t wire_type); -static bool checkreturn decode_extension(das_pb_istream_t *stream, uint32_t tag, das_pb_wire_type_t wire_type, das_pb_extension_t *extension); -static bool das_pb_field_set_to_default(das_pb_field_iter_t *field); -static bool das_pb_message_set_to_defaults(das_pb_field_iter_t *iter); -static bool checkreturn das_pb_dec_bool(das_pb_istream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_dec_varint(das_pb_istream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_dec_bytes(das_pb_istream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_dec_string(das_pb_istream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_dec_submessage(das_pb_istream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_dec_fixed_length_bytes(das_pb_istream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_skip_varint(das_pb_istream_t *stream); -static bool checkreturn das_pb_skip_string(das_pb_istream_t *stream); - -#ifdef PB_ENABLE_MALLOC -static bool checkreturn allocate_field(das_pb_istream_t *stream, void *pData, size_t data_size, size_t array_size); -static void initialize_pointer_field(void *pItem, das_pb_field_iter_t *field); -static bool checkreturn das_pb_release_union_field(das_pb_istream_t *stream, das_pb_field_iter_t *field); -static void das_pb_release_single_field(das_pb_field_iter_t *field); -#endif - -#ifdef PB_WITHOUT_64BIT -#define das_pb_int64_t int32_t -#define das_pb_uint64_t uint32_t -#else -#define das_pb_int64_t int64_t -#define das_pb_uint64_t uint64_t -#endif - -#define PB_WT_PACKED ((das_pb_wire_type_t)0xFF) - -typedef struct { - uint32_t bitfield[(PB_MAX_REQUIRED_FIELDS + 31) / 32]; -} das_pb_fields_seen_t; - -/******************************* - * das_pb_istream_t implementation * - *******************************/ - -static bool checkreturn buf_read(das_pb_istream_t *stream, das_pb_byte_t *buf, size_t count) -{ - size_t i; - const das_pb_byte_t *source = (const das_pb_byte_t*)stream->state; - stream->state = (das_pb_byte_t*)stream->state + count; - - if (buf != NULL) - { - for (i = 0; i < count; i++) - buf[i] = source[i]; - } - - return true; -} - -bool checkreturn das_pb_read(das_pb_istream_t *stream, das_pb_byte_t *buf, size_t count) -{ - if (count == 0) - return true; - -#ifndef PB_BUFFER_ONLY - if (buf == NULL && stream->callback != buf_read) - { - /* Skip input bytes */ - das_pb_byte_t tmp[16]; - while (count > 16) - { - if (!das_pb_read(stream, tmp, 16)) - return false; - - count -= 16; - } - - return das_pb_read(stream, tmp, count); - } -#endif - - if (stream->bytes_left < count) - PB_RETURN_ERROR(stream, "end-of-stream"); - -#ifndef PB_BUFFER_ONLY - if (!stream->callback(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#else - if (!buf_read(stream, buf, count)) - return false; -#endif - - stream->bytes_left -= count; - return true; -} - -/* Read a single byte from input stream. buf may not be NULL. - * This is an optimization for the varint decoding. */ -static bool checkreturn das_pb_readbyte(das_pb_istream_t *stream, das_pb_byte_t *buf) -{ - if (stream->bytes_left == 0) - PB_RETURN_ERROR(stream, "end-of-stream"); - -#ifndef PB_BUFFER_ONLY - if (!stream->callback(stream, buf, 1)) - PB_RETURN_ERROR(stream, "io error"); -#else - *buf = *(const das_pb_byte_t*)stream->state; - stream->state = (das_pb_byte_t*)stream->state + 1; -#endif - - stream->bytes_left--; - - return true; -} - -das_pb_istream_t das_pb_istream_from_buffer(const das_pb_byte_t *buf, size_t msglen) -{ - das_pb_istream_t stream; - /* Cast away the const from buf without a compiler error. We are - * careful to use it only in a const manner in the callbacks. - */ - union { - void *state; - const void *c_state; - } state; -#ifdef PB_BUFFER_ONLY - stream.callback = NULL; -#else - stream.callback = &buf_read; -#endif - state.c_state = buf; - stream.state = state.state; - stream.bytes_left = msglen; -#ifndef PB_NO_ERRMSG - stream.errmsg = NULL; -#endif - return stream; -} - -/******************** - * Helper functions * - ********************/ - -static bool checkreturn das_pb_decode_varint32_eof(das_pb_istream_t *stream, uint32_t *dest, bool *eof) -{ - das_pb_byte_t byte; - uint32_t result; - - if (!das_pb_readbyte(stream, &byte)) - { - if (stream->bytes_left == 0) - { - if (eof) - { - *eof = true; - } - } - - return false; - } - - if ((byte & 0x80) == 0) - { - /* Quick case, 1 byte value */ - result = byte; - } - else - { - /* Multibyte case */ - uint_fast8_t bitpos = 7; - result = byte & 0x7F; - - do - { - if (!das_pb_readbyte(stream, &byte)) - return false; - - if (bitpos >= 32) - { - /* Note: The varint could have trailing 0x80 bytes, or 0xFF for negative. */ - das_pb_byte_t sign_extension = (bitpos < 63) ? 0xFF : 0x01; - bool valid_extension = ((byte & 0x7F) == 0x00 || - ((result >> 31) != 0 && byte == sign_extension)); - - if (bitpos >= 64 || !valid_extension) - { - PB_RETURN_ERROR(stream, "varint overflow"); - } - } - else - { - result |= (uint32_t)(byte & 0x7F) << bitpos; - } - bitpos = (uint_fast8_t)(bitpos + 7); - } while (byte & 0x80); - - if (bitpos == 35 && (byte & 0x70) != 0) - { - /* The last byte was at bitpos=28, so only bottom 4 bits fit. */ - PB_RETURN_ERROR(stream, "varint overflow"); - } - } - - *dest = result; - return true; -} - -bool checkreturn das_pb_decode_varint32(das_pb_istream_t *stream, uint32_t *dest) -{ - return das_pb_decode_varint32_eof(stream, dest, NULL); -} - -#ifndef PB_WITHOUT_64BIT -bool checkreturn das_pb_decode_varint(das_pb_istream_t *stream, uint64_t *dest) -{ - das_pb_byte_t byte; - uint_fast8_t bitpos = 0; - uint64_t result = 0; - - do - { - if (bitpos >= 64) - PB_RETURN_ERROR(stream, "varint overflow"); - - if (!das_pb_readbyte(stream, &byte)) - return false; - - result |= (uint64_t)(byte & 0x7F) << bitpos; - bitpos = (uint_fast8_t)(bitpos + 7); - } while (byte & 0x80); - - *dest = result; - return true; -} -#endif - -bool checkreturn das_pb_skip_varint(das_pb_istream_t *stream) -{ - das_pb_byte_t byte; - do - { - if (!das_pb_read(stream, &byte, 1)) - return false; - } while (byte & 0x80); - return true; -} - -bool checkreturn das_pb_skip_string(das_pb_istream_t *stream) -{ - uint32_t length; - if (!das_pb_decode_varint32(stream, &length)) - return false; - - if ((size_t)length != length) - { - PB_RETURN_ERROR(stream, "size too large"); - } - - return das_pb_read(stream, NULL, (size_t)length); -} - -bool checkreturn das_pb_decode_tag(das_pb_istream_t *stream, das_pb_wire_type_t *wire_type, uint32_t *tag, bool *eof) -{ - uint32_t temp; - *eof = false; - *wire_type = (das_pb_wire_type_t) 0; - *tag = 0; - - if (!das_pb_decode_varint32_eof(stream, &temp, eof)) - { - return false; - } - - *tag = temp >> 3; - *wire_type = (das_pb_wire_type_t)(temp & 7); - return true; -} - -bool checkreturn das_pb_skip_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type) -{ - switch (wire_type) - { - case PB_WT_VARINT: return das_pb_skip_varint(stream); - case PB_WT_64BIT: return das_pb_read(stream, NULL, 8); - case PB_WT_STRING: return das_pb_skip_string(stream); - case PB_WT_32BIT: return das_pb_read(stream, NULL, 4); - default: PB_RETURN_ERROR(stream, "invalid wire_type"); - } -} - -/* Read a raw value to buffer, for the purpose of passing it to callback as - * a substream. Size is maximum size on call, and actual size on return. - */ -static bool checkreturn read_raw_value(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_byte_t *buf, size_t *size) -{ - size_t max_size = *size; - switch (wire_type) - { - case PB_WT_VARINT: - *size = 0; - do - { - (*size)++; - if (*size > max_size) - PB_RETURN_ERROR(stream, "varint overflow"); - - if (!das_pb_read(stream, buf, 1)) - return false; - } while (*buf++ & 0x80); - return true; - - case PB_WT_64BIT: - *size = 8; - return das_pb_read(stream, buf, 8); - - case PB_WT_32BIT: - *size = 4; - return das_pb_read(stream, buf, 4); - - case PB_WT_STRING: - /* Calling read_raw_value with a PB_WT_STRING is an error. - * Explicitly handle this case and fallthrough to default to avoid - * compiler warnings. - */ - - default: PB_RETURN_ERROR(stream, "invalid wire_type"); - } -} - -/* Decode string length from stream and return a substream with limited length. - * Remember to close the substream using das_pb_close_string_substream(). - */ -bool checkreturn das_pb_make_string_substream(das_pb_istream_t *stream, das_pb_istream_t *substream) -{ - uint32_t size; - if (!das_pb_decode_varint32(stream, &size)) - return false; - - *substream = *stream; - if (substream->bytes_left < size) - PB_RETURN_ERROR(stream, "parent stream too short"); - - substream->bytes_left = (size_t)size; - stream->bytes_left -= (size_t)size; - return true; -} - -bool checkreturn das_pb_close_string_substream(das_pb_istream_t *stream, das_pb_istream_t *substream) -{ - if (substream->bytes_left) { - if (!das_pb_read(substream, NULL, substream->bytes_left)) - return false; - } - - stream->state = substream->state; - -#ifndef PB_NO_ERRMSG - stream->errmsg = substream->errmsg; -#endif - return true; -} - -/************************* - * Decode a single field * - *************************/ - -static bool checkreturn decode_basic_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field) -{ - switch (PB_LTYPE(field->type)) - { - case PB_LTYPE_BOOL: - if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return das_pb_dec_bool(stream, field); - - case PB_LTYPE_VARINT: - case PB_LTYPE_UVARINT: - case PB_LTYPE_SVARINT: - if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return das_pb_dec_varint(stream, field); - - case PB_LTYPE_FIXED32: - if (wire_type != PB_WT_32BIT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return das_pb_decode_fixed32(stream, field->pData); - - case PB_LTYPE_FIXED64: - if (wire_type != PB_WT_64BIT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - -#ifdef PB_CONVERT_DOUBLE_FLOAT - if (field->data_size == sizeof(float)) - { - return das_pb_decode_double_as_float(stream, (float*)field->pData); - } -#endif - -#ifdef PB_WITHOUT_64BIT - PB_RETURN_ERROR(stream, "invalid data_size"); -#else - return das_pb_decode_fixed64(stream, field->pData); -#endif - - case PB_LTYPE_BYTES: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return das_pb_dec_bytes(stream, field); - - case PB_LTYPE_STRING: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return das_pb_dec_string(stream, field); - - case PB_LTYPE_SUBMESSAGE: - case PB_LTYPE_SUBMSG_W_CB: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return das_pb_dec_submessage(stream, field); - - case PB_LTYPE_FIXED_LENGTH_BYTES: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return das_pb_dec_fixed_length_bytes(stream, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -static bool checkreturn decode_static_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field) -{ - switch (PB_HTYPE(field->type)) - { - case PB_HTYPE_REQUIRED: - return decode_basic_field(stream, wire_type, field); - - case PB_HTYPE_OPTIONAL: - if (field->pSize != NULL) - *(bool*)field->pSize = true; - return decode_basic_field(stream, wire_type, field); - - case PB_HTYPE_REPEATED: - if (wire_type == PB_WT_STRING - && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Packed array */ - bool status = true; - das_pb_istream_t substream; - das_pb_size_t *size = (das_pb_size_t*)field->pSize; - field->pData = (char*)field->pField + field->data_size * (*size); - - if (!das_pb_make_string_substream(stream, &substream)) - return false; - - while (substream.bytes_left > 0 && *size < field->array_size) - { - if (!decode_basic_field(&substream, PB_WT_PACKED, field)) - { - status = false; - break; - } - (*size)++; - field->pData = (char*)field->pData + field->data_size; - } - - if (substream.bytes_left != 0) - PB_RETURN_ERROR(stream, "array overflow"); - if (!das_pb_close_string_substream(stream, &substream)) - return false; - - return status; - } - else - { - /* Repeated field */ - das_pb_size_t *size = (das_pb_size_t*)field->pSize; - field->pData = (char*)field->pField + field->data_size * (*size); - - if ((*size)++ >= field->array_size) - PB_RETURN_ERROR(stream, "array overflow"); - - return decode_basic_field(stream, wire_type, field); - } - - case PB_HTYPE_ONEOF: - if (PB_LTYPE_IS_SUBMSG(field->type) && - *(das_pb_size_t*)field->pSize != field->tag) - { - /* We memset to zero so that any callbacks are set to NULL. - * This is because the callbacks might otherwise have values - * from some other union field. - * If callbacks are needed inside oneof field, use .proto - * option submsg_callback to have a separate callback function - * that can set the fields before submessage is decoded. - * das_pb_dec_submessage() will set any default values. */ - memset(field->pData, 0, (size_t)field->data_size); - - /* Set default values for the submessage fields. */ - if (!das_pb_field_set_to_default(field)) - PB_RETURN_ERROR(stream, "failed to set defaults"); - } - *(das_pb_size_t*)field->pSize = field->tag; - - return decode_basic_field(stream, wire_type, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -#ifdef PB_ENABLE_MALLOC -/* Allocate storage for the field and store the pointer at iter->pData. - * array_size is the number of entries to reserve in an array. - * Zero size is not allowed, use das_pb_free() for releasing. - */ -static bool checkreturn allocate_field(das_pb_istream_t *stream, void *pData, size_t data_size, size_t array_size) -{ - void *ptr = *(void**)pData; - - if (data_size == 0 || array_size == 0) - PB_RETURN_ERROR(stream, "invalid size"); - -#ifdef __AVR__ - /* Workaround for AVR libc bug 53284: http://savannah.nongnu.org/bugs/?53284 - * Realloc to size of 1 byte can cause corruption of the malloc structures. - */ - if (data_size == 1 && array_size == 1) - { - data_size = 2; - } -#endif - - /* Check for multiplication overflows. - * This code avoids the costly division if the sizes are small enough. - * Multiplication is safe as long as only half of bits are set - * in either multiplicand. - */ - { - const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4); - if (data_size >= check_limit || array_size >= check_limit) - { - const size_t size_max = (size_t)-1; - if (size_max / array_size < data_size) - { - PB_RETURN_ERROR(stream, "size too large"); - } - } - } - - /* Allocate new or expand previous allocation */ - /* Note: on failure the old pointer will remain in the structure, - * the message must be freed by caller also on error return. */ - ptr = das_pb_realloc(ptr, array_size * data_size); - if (ptr == NULL) - PB_RETURN_ERROR(stream, "realloc failed"); - - *(void**)pData = ptr; - return true; -} - -/* Clear a newly allocated item in case it contains a pointer, or is a submessage. */ -static void initialize_pointer_field(void *pItem, das_pb_field_iter_t *field) -{ - if (PB_LTYPE(field->type) == PB_LTYPE_STRING || - PB_LTYPE(field->type) == PB_LTYPE_BYTES) - { - *(void**)pItem = NULL; - } - else if (PB_LTYPE_IS_SUBMSG(field->type)) - { - /* We memset to zero so that any callbacks are set to NULL. - * Default values will be set by das_pb_dec_submessage(). */ - memset(pItem, 0, field->data_size); - } -} -#endif - -static bool checkreturn decode_pointer_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field) -{ -#ifndef PB_ENABLE_MALLOC - PB_UNUSED(wire_type); - PB_UNUSED(field); - PB_RETURN_ERROR(stream, "no malloc support"); -#else - switch (PB_HTYPE(field->type)) - { - case PB_HTYPE_REQUIRED: - case PB_HTYPE_OPTIONAL: - case PB_HTYPE_ONEOF: - if (PB_LTYPE_IS_SUBMSG(field->type) && *(void**)field->pField != NULL) - { - /* Duplicate field, have to release the old allocation first. */ - /* FIXME: Does this work correctly for oneofs? */ - das_pb_release_single_field(field); - } - - if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF) - { - *(das_pb_size_t*)field->pSize = field->tag; - } - - if (PB_LTYPE(field->type) == PB_LTYPE_STRING || - PB_LTYPE(field->type) == PB_LTYPE_BYTES) - { - /* das_pb_dec_string and das_pb_dec_bytes handle allocation themselves */ - field->pData = field->pField; - return decode_basic_field(stream, wire_type, field); - } - else - { - if (!allocate_field(stream, field->pField, field->data_size, 1)) - return false; - - field->pData = *(void**)field->pField; - initialize_pointer_field(field->pData, field); - return decode_basic_field(stream, wire_type, field); - } - - case PB_HTYPE_REPEATED: - if (wire_type == PB_WT_STRING - && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Packed array, multiple items come in at once. */ - bool status = true; - das_pb_size_t *size = (das_pb_size_t*)field->pSize; - size_t allocated_size = *size; - das_pb_istream_t substream; - - if (!das_pb_make_string_substream(stream, &substream)) - return false; - - while (substream.bytes_left) - { - if (*size == PB_SIZE_MAX) - { -#ifndef PB_NO_ERRMSG - stream->errmsg = "too many array entries"; -#endif - status = false; - break; - } - - if ((size_t)*size + 1 > allocated_size) - { - /* Allocate more storage. This tries to guess the - * number of remaining entries. Round the division - * upwards. */ - size_t remain = (substream.bytes_left - 1) / field->data_size + 1; - if (remain < PB_SIZE_MAX - allocated_size) - allocated_size += remain; - else - allocated_size += 1; - - if (!allocate_field(&substream, field->pField, field->data_size, allocated_size)) - { - status = false; - break; - } - } - - /* Decode the array entry */ - field->pData = *(char**)field->pField + field->data_size * (*size); - initialize_pointer_field(field->pData, field); - if (!decode_basic_field(&substream, PB_WT_PACKED, field)) - { - status = false; - break; - } - - (*size)++; - } - if (!das_pb_close_string_substream(stream, &substream)) - return false; - - return status; - } - else - { - /* Normal repeated field, i.e. only one item at a time. */ - das_pb_size_t *size = (das_pb_size_t*)field->pSize; - - if (*size == PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "too many array entries"); - - if (!allocate_field(stream, field->pField, field->data_size, (size_t)(*size + 1))) - return false; - - field->pData = *(char**)field->pField + field->data_size * (*size); - (*size)++; - initialize_pointer_field(field->pData, field); - return decode_basic_field(stream, wire_type, field); - } - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -#endif -} - -static bool checkreturn decode_callback_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field) -{ - if (!field->descriptor->field_callback) - return das_pb_skip_field(stream, wire_type); - - if (wire_type == PB_WT_STRING) - { - das_pb_istream_t substream; - size_t prev_bytes_left; - - if (!das_pb_make_string_substream(stream, &substream)) - return false; - - do - { - prev_bytes_left = substream.bytes_left; - if (!field->descriptor->field_callback(&substream, NULL, field)) - PB_RETURN_ERROR(stream, "callback failed"); - } while (substream.bytes_left > 0 && substream.bytes_left < prev_bytes_left); - - if (!das_pb_close_string_substream(stream, &substream)) - return false; - - return true; - } - else - { - /* Copy the single scalar value to stack. - * This is required so that we can limit the stream length, - * which in turn allows to use same callback for packed and - * not-packed fields. */ - das_pb_istream_t substream; - das_pb_byte_t buffer[10]; - size_t size = sizeof(buffer); - - if (!read_raw_value(stream, wire_type, buffer, &size)) - return false; - substream = das_pb_istream_from_buffer(buffer, size); - - return field->descriptor->field_callback(&substream, NULL, field); - } -} - -static bool checkreturn decode_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type, das_pb_field_iter_t *field) -{ -#ifdef PB_ENABLE_MALLOC - /* When decoding an oneof field, check if there is old data that must be - * released first. */ - if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF) - { - if (!das_pb_release_union_field(stream, field)) - return false; - } -#endif - - switch (PB_ATYPE(field->type)) - { - case PB_ATYPE_STATIC: - return decode_static_field(stream, wire_type, field); - - case PB_ATYPE_POINTER: - return decode_pointer_field(stream, wire_type, field); - - case PB_ATYPE_CALLBACK: - return decode_callback_field(stream, wire_type, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -/* Default handler for extension fields. Expects to have a das_pb_msgdesc_t - * pointer in the extension->type->arg field, pointing to a message with - * only one field in it. */ -static bool checkreturn default_extension_decoder(das_pb_istream_t *stream, - das_pb_extension_t *extension, uint32_t tag, das_pb_wire_type_t wire_type) -{ - das_pb_field_iter_t iter; - - if (!das_pb_field_iter_begin_extension(&iter, extension)) - PB_RETURN_ERROR(stream, "invalid extension"); - - if (iter.tag != tag || !iter.message) - return true; - - extension->found = true; - return decode_field(stream, wire_type, &iter); -} - -/* Try to decode an unknown field as an extension field. Tries each extension - * decoder in turn, until one of them handles the field or loop ends. */ -static bool checkreturn decode_extension(das_pb_istream_t *stream, - uint32_t tag, das_pb_wire_type_t wire_type, das_pb_extension_t *extension) -{ - size_t pos = stream->bytes_left; - - while (extension != NULL && pos == stream->bytes_left) - { - bool status; - if (extension->type->decode) - status = extension->type->decode(stream, extension, tag, wire_type); - else - status = default_extension_decoder(stream, extension, tag, wire_type); - - if (!status) - return false; - - extension = extension->next; - } - - return true; -} - -/* Initialize message fields to default values, recursively */ -static bool das_pb_field_set_to_default(das_pb_field_iter_t *field) -{ - das_pb_type_t type; - type = field->type; - - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - das_pb_extension_t *ext = *(das_pb_extension_t* const *)field->pData; - while (ext != NULL) - { - das_pb_field_iter_t ext_iter; - if (das_pb_field_iter_begin_extension(&ext_iter, ext)) - { - ext->found = false; - if (!das_pb_message_set_to_defaults(&ext_iter)) - return false; - } - ext = ext->next; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_STATIC) - { - bool init_data = true; - if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL) - { - /* Set has_field to false. Still initialize the optional field - * itself also. */ - *(bool*)field->pSize = false; - } - else if (PB_HTYPE(type) == PB_HTYPE_REPEATED || - PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - /* REPEATED: Set array count to 0, no need to initialize contents. - ONEOF: Set which_field to 0. */ - *(das_pb_size_t*)field->pSize = 0; - init_data = false; - } - - if (init_data) - { - if (PB_LTYPE_IS_SUBMSG(field->type) && - (field->submsg_desc->default_value != NULL || - field->submsg_desc->field_callback != NULL || - field->submsg_desc->submsg_info[0] != NULL)) - { - /* Initialize submessage to defaults. - * Only needed if it has default values - * or callback/submessage fields. */ - das_pb_field_iter_t submsg_iter; - if (das_pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData)) - { - if (!das_pb_message_set_to_defaults(&submsg_iter)) - return false; - } - } - else - { - /* Initialize to zeros */ - memset(field->pData, 0, (size_t)field->data_size); - } - } - } - else if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - /* Initialize the pointer to NULL. */ - *(void**)field->pField = NULL; - - /* Initialize array count to 0. */ - if (PB_HTYPE(type) == PB_HTYPE_REPEATED || - PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - *(das_pb_size_t*)field->pSize = 0; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK) - { - /* Don't overwrite callback */ - } - - return true; -} - -static bool das_pb_message_set_to_defaults(das_pb_field_iter_t *iter) -{ - das_pb_istream_t defstream = PB_ISTREAM_EMPTY; - uint32_t tag = 0; - das_pb_wire_type_t wire_type = PB_WT_VARINT; - bool eof; - - if (iter->descriptor->default_value) - { - defstream = das_pb_istream_from_buffer(iter->descriptor->default_value, (size_t)-1); - if (!das_pb_decode_tag(&defstream, &wire_type, &tag, &eof)) - return false; - } - - do - { - if (!das_pb_field_set_to_default(iter)) - return false; - - if (tag != 0 && iter->tag == tag) - { - /* We have a default value for this field in the defstream */ - if (!decode_field(&defstream, wire_type, iter)) - return false; - if (!das_pb_decode_tag(&defstream, &wire_type, &tag, &eof)) - return false; - - if (iter->pSize) - *(bool*)iter->pSize = false; - } - } while (das_pb_field_iter_next(iter)); - - return true; -} - -/********************* - * Decode all fields * - *********************/ - -static bool checkreturn das_pb_decode_inner(das_pb_istream_t *stream, const das_pb_msgdesc_t *fields, void *dest_struct, unsigned int flags) -{ - uint32_t extension_range_start = 0; - das_pb_extension_t *extensions = NULL; - - /* 'fixed_count_field' and 'fixed_count_size' track position of a repeated fixed - * count field. This can only handle _one_ repeated fixed count field that - * is unpacked and unordered among other (non repeated fixed count) fields. - */ - das_pb_size_t fixed_count_field = PB_SIZE_MAX; - das_pb_size_t fixed_count_size = 0; - das_pb_size_t fixed_count_total_size = 0; - - das_pb_fields_seen_t fields_seen = {{0, 0}}; - const uint32_t allbits = ~(uint32_t)0; - das_pb_field_iter_t iter; - - if (das_pb_field_iter_begin(&iter, fields, dest_struct)) - { - if ((flags & PB_DECODE_NOINIT) == 0) - { - if (!das_pb_message_set_to_defaults(&iter)) - PB_RETURN_ERROR(stream, "failed to set defaults"); - } - } - - while (stream->bytes_left) - { - uint32_t tag; - das_pb_wire_type_t wire_type; - bool eof; - - if (!das_pb_decode_tag(stream, &wire_type, &tag, &eof)) - { - if (eof) - break; - else - return false; - } - - if (tag == 0) - { - if (flags & PB_DECODE_NULLTERMINATED) - { - break; - } - else - { - PB_RETURN_ERROR(stream, "zero tag"); - } - } - - if (!das_pb_field_iter_find(&iter, tag) || PB_LTYPE(iter.type) == PB_LTYPE_EXTENSION) - { - /* No match found, check if it matches an extension. */ - if (extension_range_start == 0) - { - if (das_pb_field_iter_find_extension(&iter)) - { - extensions = *(das_pb_extension_t* const *)iter.pData; - extension_range_start = iter.tag; - } - - if (!extensions) - { - extension_range_start = (uint32_t)-1; - } - } - - if (tag >= extension_range_start) - { - size_t pos = stream->bytes_left; - - if (!decode_extension(stream, tag, wire_type, extensions)) - return false; - - if (pos != stream->bytes_left) - { - /* The field was handled */ - continue; - } - } - - /* No match found, skip data */ - if (!das_pb_skip_field(stream, wire_type)) - return false; - continue; - } - - /* If a repeated fixed count field was found, get size from - * 'fixed_count_field' as there is no counter contained in the struct. - */ - if (PB_HTYPE(iter.type) == PB_HTYPE_REPEATED && iter.pSize == &iter.array_size) - { - if (fixed_count_field != iter.index) { - /* If the new fixed count field does not match the previous one, - * check that the previous one is NULL or that it finished - * receiving all the expected data. - */ - if (fixed_count_field != PB_SIZE_MAX && - fixed_count_size != fixed_count_total_size) - { - PB_RETURN_ERROR(stream, "wrong size for fixed count field"); - } - - fixed_count_field = iter.index; - fixed_count_size = 0; - fixed_count_total_size = iter.array_size; - } - - iter.pSize = &fixed_count_size; - } - - if (PB_HTYPE(iter.type) == PB_HTYPE_REQUIRED - && iter.required_field_index < PB_MAX_REQUIRED_FIELDS) - { - uint32_t tmp = ((uint32_t)1 << (iter.required_field_index & 31)); - fields_seen.bitfield[iter.required_field_index >> 5] |= tmp; - } - - if (!decode_field(stream, wire_type, &iter)) - return false; - } - - /* Check that all elements of the last decoded fixed count field were present. */ - if (fixed_count_field != PB_SIZE_MAX && - fixed_count_size != fixed_count_total_size) - { - PB_RETURN_ERROR(stream, "wrong size for fixed count field"); - } - - /* Check that all required fields were present. */ - { - das_pb_size_t req_field_count = iter.descriptor->required_field_count; - - if (req_field_count > 0) - { - das_pb_size_t i; - - if (req_field_count > PB_MAX_REQUIRED_FIELDS) - req_field_count = PB_MAX_REQUIRED_FIELDS; - - /* Check the whole words */ - for (i = 0; i < (req_field_count >> 5); i++) - { - if (fields_seen.bitfield[i] != allbits) - PB_RETURN_ERROR(stream, "missing required field"); - } - - /* Check the remaining bits (if any) */ - if ((req_field_count & 31) != 0) - { - if (fields_seen.bitfield[req_field_count >> 5] != - (allbits >> (uint_least8_t)(32 - (req_field_count & 31)))) - { - PB_RETURN_ERROR(stream, "missing required field"); - } - } - } - } - - return true; -} - -bool checkreturn das_pb_decode_ex(das_pb_istream_t *stream, const das_pb_msgdesc_t *fields, void *dest_struct, unsigned int flags) -{ - bool status; - - if ((flags & PB_DECODE_DELIMITED) == 0) - { - status = das_pb_decode_inner(stream, fields, dest_struct, flags); - } - else - { - das_pb_istream_t substream; - if (!das_pb_make_string_substream(stream, &substream)) - return false; - - status = das_pb_decode_inner(&substream, fields, dest_struct, flags); - - if (!das_pb_close_string_substream(stream, &substream)) - return false; - } - -#ifdef PB_ENABLE_MALLOC - if (!status) - das_pb_release(fields, dest_struct); -#endif - - return status; -} - -bool checkreturn das_pb_decode(das_pb_istream_t *stream, const das_pb_msgdesc_t *fields, void *dest_struct) -{ - bool status; - - status = das_pb_decode_inner(stream, fields, dest_struct, 0); - -#ifdef PB_ENABLE_MALLOC - if (!status) - das_pb_release(fields, dest_struct); -#endif - - return status; -} - -#ifdef PB_ENABLE_MALLOC -/* Given an oneof field, if there has already been a field inside this oneof, - * release it before overwriting with a different one. */ -static bool das_pb_release_union_field(das_pb_istream_t *stream, das_pb_field_iter_t *field) -{ - das_pb_field_iter_t old_field = *field; - das_pb_size_t old_tag = *(das_pb_size_t*)field->pSize; /* Previous which_ value */ - das_pb_size_t new_tag = field->tag; /* New which_ value */ - - if (old_tag == 0) - return true; /* Ok, no old data in union */ - - if (old_tag == new_tag) - return true; /* Ok, old data is of same type => merge */ - - /* Release old data. The find can fail if the message struct contains - * invalid data. */ - if (!das_pb_field_iter_find(&old_field, old_tag)) - PB_RETURN_ERROR(stream, "invalid union tag"); - - das_pb_release_single_field(&old_field); - - return true; -} - -static void das_pb_release_single_field(das_pb_field_iter_t *field) -{ - das_pb_type_t type; - type = field->type; - - if (PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - if (*(das_pb_size_t*)field->pSize != field->tag) - return; /* This is not the current field in the union */ - } - - /* Release anything contained inside an extension or submsg. - * This has to be done even if the submsg itself is statically - * allocated. */ - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - /* Release fields from all extensions in the linked list */ - das_pb_extension_t *ext = *(das_pb_extension_t**)field->pData; - while (ext != NULL) - { - das_pb_field_iter_t ext_iter; - if (das_pb_field_iter_begin_extension(&ext_iter, ext)) - { - das_pb_release_single_field(&ext_iter); - } - ext = ext->next; - } - } - else if (PB_LTYPE_IS_SUBMSG(type) && PB_ATYPE(type) != PB_ATYPE_CALLBACK) - { - /* Release fields in submessage or submsg array */ - das_pb_size_t count = 1; - - if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - field->pData = *(void**)field->pField; - } - else - { - field->pData = field->pField; - } - - if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - count = *(das_pb_size_t*)field->pSize; - - if (PB_ATYPE(type) == PB_ATYPE_STATIC && count > field->array_size) - { - /* Protect against corrupted _count fields */ - count = field->array_size; - } - } - - if (field->pData) - { - for (; count > 0; count--) - { - das_pb_release(field->submsg_desc, field->pData); - field->pData = (char*)field->pData + field->data_size; - } - } - } - - if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - if (PB_HTYPE(type) == PB_HTYPE_REPEATED && - (PB_LTYPE(type) == PB_LTYPE_STRING || - PB_LTYPE(type) == PB_LTYPE_BYTES)) - { - /* Release entries in repeated string or bytes array */ - void **pItem = *(void***)field->pField; - das_pb_size_t count = *(das_pb_size_t*)field->pSize; - for (; count > 0; count--) - { - das_pb_free(*pItem); - *pItem++ = NULL; - } - } - - if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - /* We are going to release the array, so set the size to 0 */ - *(das_pb_size_t*)field->pSize = 0; - } - - /* Release main pointer */ - das_pb_free(*(void**)field->pField); - *(void**)field->pField = NULL; - } -} - -void das_pb_release(const das_pb_msgdesc_t *fields, void *dest_struct) -{ - das_pb_field_iter_t iter; - - if (!dest_struct) - return; /* Ignore NULL pointers, similar to free() */ - - if (!das_pb_field_iter_begin(&iter, fields, dest_struct)) - return; /* Empty message type */ - - do - { - das_pb_release_single_field(&iter); - } while (das_pb_field_iter_next(&iter)); -} -#endif - -/* Field decoders */ - -bool das_pb_decode_bool(das_pb_istream_t *stream, bool *dest) -{ - uint32_t value; - if (!das_pb_decode_varint32(stream, &value)) - return false; - - *(bool*)dest = (value != 0); - return true; -} - -bool das_pb_decode_svarint(das_pb_istream_t *stream, das_pb_int64_t *dest) -{ - das_pb_uint64_t value; - if (!das_pb_decode_varint(stream, &value)) - return false; - - if (value & 1) - *dest = (das_pb_int64_t)(~(value >> 1)); - else - *dest = (das_pb_int64_t)(value >> 1); - - return true; -} - -bool das_pb_decode_fixed32(das_pb_istream_t *stream, void *dest) -{ - union { - uint32_t fixed32; - das_pb_byte_t bytes[4]; - } u; - - if (!das_pb_read(stream, u.bytes, 4)) - return false; - -#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && CHAR_BIT == 8 - /* fast path - if we know that we're on little endian, assign directly */ - *(uint32_t*)dest = u.fixed32; -#else - *(uint32_t*)dest = ((uint32_t)u.bytes[0] << 0) | - ((uint32_t)u.bytes[1] << 8) | - ((uint32_t)u.bytes[2] << 16) | - ((uint32_t)u.bytes[3] << 24); -#endif - return true; -} - -#ifndef PB_WITHOUT_64BIT -bool das_pb_decode_fixed64(das_pb_istream_t *stream, void *dest) -{ - union { - uint64_t fixed64; - das_pb_byte_t bytes[8]; - } u; - - if (!das_pb_read(stream, u.bytes, 8)) - return false; - -#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && CHAR_BIT == 8 - /* fast path - if we know that we're on little endian, assign directly */ - *(uint64_t*)dest = u.fixed64; -#else - *(uint64_t*)dest = ((uint64_t)u.bytes[0] << 0) | - ((uint64_t)u.bytes[1] << 8) | - ((uint64_t)u.bytes[2] << 16) | - ((uint64_t)u.bytes[3] << 24) | - ((uint64_t)u.bytes[4] << 32) | - ((uint64_t)u.bytes[5] << 40) | - ((uint64_t)u.bytes[6] << 48) | - ((uint64_t)u.bytes[7] << 56); -#endif - return true; -} -#endif - -static bool checkreturn das_pb_dec_bool(das_pb_istream_t *stream, const das_pb_field_iter_t *field) -{ - return das_pb_decode_bool(stream, (bool*)field->pData); -} - -static bool checkreturn das_pb_dec_varint(das_pb_istream_t *stream, const das_pb_field_iter_t *field) -{ - if (PB_LTYPE(field->type) == PB_LTYPE_UVARINT) - { - das_pb_uint64_t value, clamped; - if (!das_pb_decode_varint(stream, &value)) - return false; - - /* Cast to the proper field size, while checking for overflows */ - if (field->data_size == sizeof(das_pb_uint64_t)) - clamped = *(das_pb_uint64_t*)field->pData = value; - else if (field->data_size == sizeof(uint32_t)) - clamped = *(uint32_t*)field->pData = (uint32_t)value; - else if (field->data_size == sizeof(uint_least16_t)) - clamped = *(uint_least16_t*)field->pData = (uint_least16_t)value; - else if (field->data_size == sizeof(uint_least8_t)) - clamped = *(uint_least8_t*)field->pData = (uint_least8_t)value; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (clamped != value) - PB_RETURN_ERROR(stream, "integer too large"); - - return true; - } - else - { - das_pb_uint64_t value; - das_pb_int64_t svalue; - das_pb_int64_t clamped; - - if (PB_LTYPE(field->type) == PB_LTYPE_SVARINT) - { - if (!das_pb_decode_svarint(stream, &svalue)) - return false; - } - else - { - if (!das_pb_decode_varint(stream, &value)) - return false; - - /* See issue 97: Google's C++ protobuf allows negative varint values to - * be cast as int32_t, instead of the int64_t that should be used when - * encoding. Nanopb versions before 0.2.5 had a bug in encoding. In order to - * not break decoding of such messages, we cast <=32 bit fields to - * int32_t first to get the sign correct. - */ - if (field->data_size == sizeof(das_pb_int64_t)) - svalue = (das_pb_int64_t)value; - else - svalue = (int32_t)value; - } - - /* Cast to the proper field size, while checking for overflows */ - if (field->data_size == sizeof(das_pb_int64_t)) - clamped = *(das_pb_int64_t*)field->pData = svalue; - else if (field->data_size == sizeof(int32_t)) - clamped = *(int32_t*)field->pData = (int32_t)svalue; - else if (field->data_size == sizeof(int_least16_t)) - clamped = *(int_least16_t*)field->pData = (int_least16_t)svalue; - else if (field->data_size == sizeof(int_least8_t)) - clamped = *(int_least8_t*)field->pData = (int_least8_t)svalue; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (clamped != svalue) - PB_RETURN_ERROR(stream, "integer too large"); - - return true; - } -} - -static bool checkreturn das_pb_dec_bytes(das_pb_istream_t *stream, const das_pb_field_iter_t *field) -{ - uint32_t size; - size_t alloc_size; - das_pb_bytes_array_t *dest; - - if (!das_pb_decode_varint32(stream, &size)) - return false; - - if (size > PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "bytes overflow"); - - alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size); - if (size > alloc_size) - PB_RETURN_ERROR(stream, "size too large"); - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { -#ifndef PB_ENABLE_MALLOC - PB_RETURN_ERROR(stream, "no malloc support"); -#else - if (stream->bytes_left < size) - PB_RETURN_ERROR(stream, "end-of-stream"); - - if (!allocate_field(stream, field->pData, alloc_size, 1)) - return false; - dest = *(das_pb_bytes_array_t**)field->pData; -#endif - } - else - { - if (alloc_size > field->data_size) - PB_RETURN_ERROR(stream, "bytes overflow"); - dest = (das_pb_bytes_array_t*)field->pData; - } - - dest->size = (das_pb_size_t)size; - return das_pb_read(stream, dest->bytes, (size_t)size); -} - -static bool checkreturn das_pb_dec_string(das_pb_istream_t *stream, const das_pb_field_iter_t *field) -{ - uint32_t size; - size_t alloc_size; - das_pb_byte_t *dest = (das_pb_byte_t*)field->pData; - - if (!das_pb_decode_varint32(stream, &size)) - return false; - - if (size == (uint32_t)-1) - PB_RETURN_ERROR(stream, "size too large"); - - /* Space for null terminator */ - alloc_size = (size_t)(size + 1); - - if (alloc_size < size) - PB_RETURN_ERROR(stream, "size too large"); - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { -#ifndef PB_ENABLE_MALLOC - PB_RETURN_ERROR(stream, "no malloc support"); -#else - if (stream->bytes_left < size) - PB_RETURN_ERROR(stream, "end-of-stream"); - - if (!allocate_field(stream, field->pData, alloc_size, 1)) - return false; - dest = *(das_pb_byte_t**)field->pData; -#endif - } - else - { - if (alloc_size > field->data_size) - PB_RETURN_ERROR(stream, "string overflow"); - } - - dest[size] = 0; - - if (!das_pb_read(stream, dest, (size_t)size)) - return false; - -#ifdef PB_VALIDATE_UTF8 - if (!das_pb_validate_utf8((const char*)dest)) - PB_RETURN_ERROR(stream, "invalid utf8"); -#endif - - return true; -} - -static bool checkreturn das_pb_dec_submessage(das_pb_istream_t *stream, const das_pb_field_iter_t *field) -{ - bool status = true; - bool submsg_consumed = false; - das_pb_istream_t substream; - - if (!das_pb_make_string_substream(stream, &substream)) - return false; - - if (field->submsg_desc == NULL) - PB_RETURN_ERROR(stream, "invalid field descriptor"); - - /* Submessages can have a separate message-level callback that is called - * before decoding the message. Typically it is used to set callback fields - * inside oneofs. */ - if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL) - { - /* Message callback is stored right before pSize. */ - das_pb_callback_t *callback = (das_pb_callback_t*)field->pSize - 1; - if (callback->funcs.decode) - { - status = callback->funcs.decode(&substream, field, &callback->arg); - - if (substream.bytes_left == 0) - { - submsg_consumed = true; - } - } - } - - /* Now decode the submessage contents */ - if (status && !submsg_consumed) - { - unsigned int flags = 0; - - /* Static required/optional fields are already initialized by top-level - * das_pb_decode(), no need to initialize them again. */ - if (PB_ATYPE(field->type) == PB_ATYPE_STATIC && - PB_HTYPE(field->type) != PB_HTYPE_REPEATED) - { - flags = PB_DECODE_NOINIT; - } - - status = das_pb_decode_inner(&substream, field->submsg_desc, field->pData, flags); - } - - if (!das_pb_close_string_substream(stream, &substream)) - return false; - - return status; -} - -static bool checkreturn das_pb_dec_fixed_length_bytes(das_pb_istream_t *stream, const das_pb_field_iter_t *field) -{ - uint32_t size; - - if (!das_pb_decode_varint32(stream, &size)) - return false; - - if (size > PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "bytes overflow"); - - if (size == 0) - { - /* As a special case, treat empty bytes string as all zeros for fixed_length_bytes. */ - memset(field->pData, 0, (size_t)field->data_size); - return true; - } - - if (size != field->data_size) - PB_RETURN_ERROR(stream, "incorrect fixed length bytes size"); - - return das_pb_read(stream, (das_pb_byte_t*)field->pData, (size_t)field->data_size); -} - -#ifdef PB_CONVERT_DOUBLE_FLOAT -bool das_pb_decode_double_as_float(das_pb_istream_t *stream, float *dest) -{ - uint_least8_t sign; - int exponent; - uint32_t mantissa; - uint64_t value; - union { float f; uint32_t i; } out; - - if (!das_pb_decode_fixed64(stream, &value)) - return false; - - /* Decompose input value */ - sign = (uint_least8_t)((value >> 63) & 1); - exponent = (int)((value >> 52) & 0x7FF) - 1023; - mantissa = (value >> 28) & 0xFFFFFF; /* Highest 24 bits */ - - /* Figure if value is in range representable by floats. */ - if (exponent == 1024) - { - /* Special value */ - exponent = 128; - mantissa >>= 1; - } - else - { - if (exponent > 127) - { - /* Too large, convert to infinity */ - exponent = 128; - mantissa = 0; - } - else if (exponent < -150) - { - /* Too small, convert to zero */ - exponent = -127; - mantissa = 0; - } - else if (exponent < -126) - { - /* Denormalized */ - mantissa |= 0x1000000; - mantissa >>= (-126 - exponent); - exponent = -127; - } - - /* Round off mantissa */ - mantissa = (mantissa + 1) >> 1; - - /* Check if mantissa went over 2.0 */ - if (mantissa & 0x800000) - { - exponent += 1; - mantissa &= 0x7FFFFF; - mantissa >>= 1; - } - } - - /* Combine fields */ - out.i = mantissa; - out.i |= (uint32_t)(exponent + 127) << 23; - out.i |= (uint32_t)sign << 31; - - *dest = out.f; - return true; -} -#endif diff --git a/src/lsoc_das2/proto/pb_decode.h b/src/lsoc_das2/proto/pb_decode.h deleted file mode 100644 index addad09..0000000 --- a/src/lsoc_das2/proto/pb_decode.h +++ /dev/null @@ -1,199 +0,0 @@ -/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c. - * The main function is pb_decode. You also need an input stream, and the - * field descriptions created by nanopb_generator.py. - */ - -#ifndef PB_DECODE_H_INCLUDED -#define PB_DECODE_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Structure for defining custom input streams. You will need to provide - * a callback function to read the bytes from your storage, which can be - * for example a file or a network socket. - * - * The callback must conform to these rules: - * - * 1) Return false on IO errors. This will cause decoding to abort. - * 2) You can use state to store your own data (e.g. buffer pointer), - * and rely on das_pb_read to verify that no-body reads past bytes_left. - * 3) Your callback may be used with substreams, in which case bytes_left - * is different than from the main stream. Don't use bytes_left to compute - * any pointers. - */ -struct das_pb_istream_s -{ -#ifdef PB_BUFFER_ONLY - /* Callback pointer is not used in buffer-only configuration. - * Having an int pointer here allows binary compatibility but - * gives an error if someone tries to assign callback function. - */ - int *callback; -#else - bool (*callback)(das_pb_istream_t *stream, das_pb_byte_t *buf, size_t count); -#endif - - void *state; /* Free field for use by callback implementation */ - size_t bytes_left; - -#ifndef PB_NO_ERRMSG - const char *errmsg; -#endif -}; - -#ifndef PB_NO_ERRMSG -#define PB_ISTREAM_EMPTY {0,0,0,0} -#else -#define PB_ISTREAM_EMPTY {0,0,0} -#endif - -/*************************** - * Main decoding functions * - ***************************/ - -/* Decode a single protocol buffers message from input stream into a C structure. - * Returns true on success, false on any failure. - * The actual struct pointed to by dest must match the description in fields. - * Callback fields of the destination structure must be initialized by caller. - * All other fields will be initialized by this function. - * - * Example usage: - * MyMessage msg = {}; - * uint8_t buffer[64]; - * das_pb_istream_t stream; - * - * // ... read some data into buffer ... - * - * stream = das_pb_istream_from_buffer(buffer, count); - * das_pb_decode(&stream, MyMessage_fields, &msg); - */ -bool das_pb_decode(das_pb_istream_t *stream, const das_pb_msgdesc_t *fields, void *dest_struct); - -/* Extended version of das_pb_decode, with several options to control - * the decoding process: - * - * PB_DECODE_NOINIT: Do not initialize the fields to default values. - * This is slightly faster if you do not need the default - * values and instead initialize the structure to 0 using - * e.g. memset(). This can also be used for merging two - * messages, i.e. combine already existing data with new - * values. - * - * PB_DECODE_DELIMITED: Input message starts with the message size as varint. - * Corresponds to parseDelimitedFrom() in Google's - * protobuf API. - * - * PB_DECODE_NULLTERMINATED: Stop reading when field tag is read as 0. This allows - * reading null terminated messages. - * NOTE: Until nanopb-0.4.0, das_pb_decode() also allows - * null-termination. This behaviour is not supported in - * most other protobuf implementations, so PB_DECODE_DELIMITED - * is a better option for compatibility. - * - * Multiple flags can be combined with bitwise or (| operator) - */ -#define PB_DECODE_NOINIT 0x01U -#define PB_DECODE_DELIMITED 0x02U -#define PB_DECODE_NULLTERMINATED 0x04U -bool das_pb_decode_ex(das_pb_istream_t *stream, const das_pb_msgdesc_t *fields, void *dest_struct, unsigned int flags); - -/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ -#define das_pb_decode_noinit(s,f,d) das_pb_decode_ex(s,f,d, PB_DECODE_NOINIT) -#define das_pb_decode_delimited(s,f,d) das_pb_decode_ex(s,f,d, PB_DECODE_DELIMITED) -#define das_pb_decode_delimited_noinit(s,f,d) das_pb_decode_ex(s,f,d, PB_DECODE_DELIMITED | PB_DECODE_NOINIT) -#define das_pb_decode_nullterminated(s,f,d) das_pb_decode_ex(s,f,d, PB_DECODE_NULLTERMINATED) - -#ifdef PB_ENABLE_MALLOC -/* Release any allocated pointer fields. If you use dynamic allocation, you should - * call this for any successfully decoded message when you are done with it. If - * das_pb_decode() returns with an error, the message is already released. - */ -void das_pb_release(const das_pb_msgdesc_t *fields, void *dest_struct); -#else -/* Allocation is not supported, so release is no-op */ -#define das_pb_release(fields, dest_struct) PB_UNUSED(fields); PB_UNUSED(dest_struct); -#endif - - -/************************************** - * Functions for manipulating streams * - **************************************/ - -/* Create an input stream for reading from a memory buffer. - * - * msglen should be the actual length of the message, not the full size of - * allocated buffer. - * - * Alternatively, you can use a custom stream that reads directly from e.g. - * a file or a network socket. - */ -das_pb_istream_t das_pb_istream_from_buffer(const das_pb_byte_t *buf, size_t msglen); - -/* Function to read from a das_pb_istream_t. You can use this if you need to - * read some custom header data, or to read data in field callbacks. - */ -bool das_pb_read(das_pb_istream_t *stream, das_pb_byte_t *buf, size_t count); - - -/************************************************ - * Helper functions for writing field callbacks * - ************************************************/ - -/* Decode the tag for the next field in the stream. Gives the wire type and - * field tag. At end of the message, returns false and sets eof to true. */ -bool das_pb_decode_tag(das_pb_istream_t *stream, das_pb_wire_type_t *wire_type, uint32_t *tag, bool *eof); - -/* Skip the field payload data, given the wire type. */ -bool das_pb_skip_field(das_pb_istream_t *stream, das_pb_wire_type_t wire_type); - -/* Decode an integer in the varint format. This works for enum, int32, - * int64, uint32 and uint64 field types. */ -#ifndef PB_WITHOUT_64BIT -bool das_pb_decode_varint(das_pb_istream_t *stream, uint64_t *dest); -#else -#define das_pb_decode_varint das_pb_decode_varint32 -#endif - -/* Decode an integer in the varint format. This works for enum, int32, - * and uint32 field types. */ -bool das_pb_decode_varint32(das_pb_istream_t *stream, uint32_t *dest); - -/* Decode a bool value in varint format. */ -bool das_pb_decode_bool(das_pb_istream_t *stream, bool *dest); - -/* Decode an integer in the zig-zagged svarint format. This works for sint32 - * and sint64. */ -#ifndef PB_WITHOUT_64BIT -bool das_pb_decode_svarint(das_pb_istream_t *stream, int64_t *dest); -#else -bool das_pb_decode_svarint(das_pb_istream_t *stream, int32_t *dest); -#endif - -/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to - * a 4-byte wide C variable. */ -bool das_pb_decode_fixed32(das_pb_istream_t *stream, void *dest); - -#ifndef PB_WITHOUT_64BIT -/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to - * a 8-byte wide C variable. */ -bool das_pb_decode_fixed64(das_pb_istream_t *stream, void *dest); -#endif - -#ifdef PB_CONVERT_DOUBLE_FLOAT -/* Decode a double value into float variable. */ -bool das_pb_decode_double_as_float(das_pb_istream_t *stream, float *dest); -#endif - -/* Make a limited-length substream for reading a PB_WT_STRING field. */ -bool das_pb_make_string_substream(das_pb_istream_t *stream, das_pb_istream_t *substream); -bool das_pb_close_string_substream(das_pb_istream_t *stream, das_pb_istream_t *substream); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/lsoc_das2/proto/pb_encode.c b/src/lsoc_das2/proto/pb_encode.c deleted file mode 100644 index 5ceb3a0..0000000 --- a/src/lsoc_das2/proto/pb_encode.c +++ /dev/null @@ -1,987 +0,0 @@ -/* pb_encode.c -- encode a protobuf using minimal resources - * - * 2011 Petteri Aimonen - */ - -#include "pb.h" -#include "pb_encode.h" -#include "pb_common.h" - -/* Use the GCC warn_unused_result attribute to check that all return values - * are propagated correctly. On other compilers and gcc before 3.4.0 just - * ignore the annotation. - */ -#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) - #define checkreturn -#else - #define checkreturn __attribute__((warn_unused_result)) -#endif - -/************************************** - * Declarations internal to this file * - **************************************/ -static bool checkreturn buf_write(das_pb_ostream_t *stream, const das_pb_byte_t *buf, size_t count); -static bool checkreturn encode_array(das_pb_ostream_t *stream, das_pb_field_iter_t *field); -static bool checkreturn das_pb_check_proto3_default_value(const das_pb_field_iter_t *field); -static bool checkreturn encode_basic_field(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn encode_callback_field(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn encode_field(das_pb_ostream_t *stream, das_pb_field_iter_t *field); -static bool checkreturn encode_extension_field(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn default_extension_encoder(das_pb_ostream_t *stream, const das_pb_extension_t *extension); -static bool checkreturn das_pb_encode_varint_32(das_pb_ostream_t *stream, uint32_t low, uint32_t high); -static bool checkreturn das_pb_enc_bool(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_enc_varint(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_enc_fixed(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_enc_bytes(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_enc_string(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_enc_submessage(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); -static bool checkreturn das_pb_enc_fixed_length_bytes(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); - -#ifdef PB_WITHOUT_64BIT -#define das_pb_int64_t int32_t -#define das_pb_uint64_t uint32_t -#else -#define das_pb_int64_t int64_t -#define das_pb_uint64_t uint64_t -#endif - -/******************************* - * das_pb_ostream_t implementation * - *******************************/ - -static bool checkreturn buf_write(das_pb_ostream_t *stream, const das_pb_byte_t *buf, size_t count) -{ - size_t i; - das_pb_byte_t *dest = (das_pb_byte_t*)stream->state; - stream->state = dest + count; - - for (i = 0; i < count; i++) - dest[i] = buf[i]; - - return true; -} - -das_pb_ostream_t das_pb_ostream_from_buffer(das_pb_byte_t *buf, size_t bufsize) -{ - das_pb_ostream_t stream; -#ifdef PB_BUFFER_ONLY - stream.callback = (void*)1; /* Just a marker value */ -#else - stream.callback = &buf_write; -#endif - stream.state = buf; - stream.max_size = bufsize; - stream.bytes_written = 0; -#ifndef PB_NO_ERRMSG - stream.errmsg = NULL; -#endif - return stream; -} - -bool checkreturn das_pb_write(das_pb_ostream_t *stream, const das_pb_byte_t *buf, size_t count) -{ - if (count > 0 && stream->callback != NULL) - { - if (stream->bytes_written + count < stream->bytes_written || - stream->bytes_written + count > stream->max_size) - { - PB_RETURN_ERROR(stream, "stream full"); - } - -#ifdef PB_BUFFER_ONLY - if (!buf_write(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#else - if (!stream->callback(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#endif - } - - stream->bytes_written += count; - return true; -} - -/************************* - * Encode a single field * - *************************/ - -/* Read a bool value without causing undefined behavior even if the value - * is invalid. See issue #434 and - * https://stackoverflow.com/questions/27661768/weird-results-for-conditional - */ -static bool safe_read_bool(const void *pSize) -{ - const char *p = (const char *)pSize; - size_t i; - for (i = 0; i < sizeof(bool); i++) - { - if (p[i] != 0) - return true; - } - return false; -} - -/* Encode a static array. Handles the size calculations and possible packing. */ -static bool checkreturn encode_array(das_pb_ostream_t *stream, das_pb_field_iter_t *field) -{ - das_pb_size_t i; - das_pb_size_t count; -#ifndef PB_ENCODE_ARRAYS_UNPACKED - size_t size; -#endif - - count = *(das_pb_size_t*)field->pSize; - - if (count == 0) - return true; - - if (PB_ATYPE(field->type) != PB_ATYPE_POINTER && count > field->array_size) - PB_RETURN_ERROR(stream, "array max size exceeded"); - -#ifndef PB_ENCODE_ARRAYS_UNPACKED - /* We always pack arrays if the datatype allows it. */ - if (PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) - { - if (!das_pb_encode_tag(stream, PB_WT_STRING, field->tag)) - return false; - - /* Determine the total size of packed array. */ - if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32) - { - size = 4 * (size_t)count; - } - else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED64) - { - size = 8 * (size_t)count; - } - else - { - das_pb_ostream_t sizestream = PB_OSTREAM_SIZING; - void *pData_orig = field->pData; - for (i = 0; i < count; i++) - { - if (!das_pb_enc_varint(&sizestream, field)) - PB_RETURN_ERROR(stream, PB_GET_ERROR(&sizestream)); - field->pData = (char*)field->pData + field->data_size; - } - field->pData = pData_orig; - size = sizestream.bytes_written; - } - - if (!das_pb_encode_varint(stream, (das_pb_uint64_t)size)) - return false; - - if (stream->callback == NULL) - return das_pb_write(stream, NULL, size); /* Just sizing.. */ - - /* Write the data */ - for (i = 0; i < count; i++) - { - if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32 || PB_LTYPE(field->type) == PB_LTYPE_FIXED64) - { - if (!das_pb_enc_fixed(stream, field)) - return false; - } - else - { - if (!das_pb_enc_varint(stream, field)) - return false; - } - - field->pData = (char*)field->pData + field->data_size; - } - } - else /* Unpacked fields */ -#endif - { - for (i = 0; i < count; i++) - { - /* Normally the data is stored directly in the array entries, but - * for pointer-type string and bytes fields, the array entries are - * actually pointers themselves also. So we have to dereference once - * more to get to the actual data. */ - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER && - (PB_LTYPE(field->type) == PB_LTYPE_STRING || - PB_LTYPE(field->type) == PB_LTYPE_BYTES)) - { - bool status; - void *pData_orig = field->pData; - field->pData = *(void* const*)field->pData; - - if (!field->pData) - { - /* Null pointer in array is treated as empty string / bytes */ - status = das_pb_encode_tag_for_field(stream, field) && - das_pb_encode_varint(stream, 0); - } - else - { - status = encode_basic_field(stream, field); - } - - field->pData = pData_orig; - - if (!status) - return false; - } - else - { - if (!encode_basic_field(stream, field)) - return false; - } - field->pData = (char*)field->pData + field->data_size; - } - } - - return true; -} - -/* In proto3, all fields are optional and are only encoded if their value is "non-zero". - * This function implements the check for the zero value. */ -static bool checkreturn das_pb_check_proto3_default_value(const das_pb_field_iter_t *field) -{ - das_pb_type_t type = field->type; - - if (PB_ATYPE(type) == PB_ATYPE_STATIC) - { - if (PB_HTYPE(type) == PB_HTYPE_REQUIRED) - { - /* Required proto2 fields inside proto3 submessage, pretty rare case */ - return false; - } - else if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - /* Repeated fields inside proto3 submessage: present if count != 0 */ - return *(const das_pb_size_t*)field->pSize == 0; - } - else if (PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - /* Oneof fields */ - return *(const das_pb_size_t*)field->pSize == 0; - } - else if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL) - { - /* Proto2 optional fields inside proto3 message, or proto3 - * submessage fields. */ - return safe_read_bool(field->pSize) == false; - } - else if (field->descriptor->default_value) - { - /* Proto3 messages do not have default values, but proto2 messages - * can contain optional fields without has_fields (generator option 'proto3'). - * In this case they must always be encoded, to make sure that the - * non-zero default value is overwritten. - */ - return false; - } - - /* Rest is proto3 singular fields */ - if (PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Simple integer / float fields */ - das_pb_size_t i; - const char *p = (const char*)field->pData; - for (i = 0; i < field->data_size; i++) - { - if (p[i] != 0) - { - return false; - } - } - - return true; - } - else if (PB_LTYPE(type) == PB_LTYPE_BYTES) - { - const das_pb_bytes_array_t *bytes = (const das_pb_bytes_array_t*)field->pData; - return bytes->size == 0; - } - else if (PB_LTYPE(type) == PB_LTYPE_STRING) - { - return *(const char*)field->pData == '\0'; - } - else if (PB_LTYPE(type) == PB_LTYPE_FIXED_LENGTH_BYTES) - { - /* Fixed length bytes is only empty if its length is fixed - * as 0. Which would be pretty strange, but we can check - * it anyway. */ - return field->data_size == 0; - } - else if (PB_LTYPE_IS_SUBMSG(type)) - { - /* Check all fields in the submessage to find if any of them - * are non-zero. The comparison cannot be done byte-per-byte - * because the C struct may contain padding bytes that must - * be skipped. Note that usually proto3 submessages have - * a separate has_field that is checked earlier in this if. - */ - das_pb_field_iter_t iter; - if (das_pb_field_iter_begin(&iter, field->submsg_desc, field->pData)) - { - do - { - if (!das_pb_check_proto3_default_value(&iter)) - { - return false; - } - } while (das_pb_field_iter_next(&iter)); - } - return true; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - return field->pData == NULL; - } - else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK) - { - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - const das_pb_extension_t *extension = *(const das_pb_extension_t* const *)field->pData; - return extension == NULL; - } - else if (field->descriptor->field_callback == das_pb_default_field_callback) - { - das_pb_callback_t *pCallback = (das_pb_callback_t*)field->pData; - return pCallback->funcs.encode == NULL; - } - else - { - return field->descriptor->field_callback == NULL; - } - } - - return false; /* Not typically reached, safe default for weird special cases. */ -} - -/* Encode a field with static or pointer allocation, i.e. one whose data - * is available to the encoder directly. */ -static bool checkreturn encode_basic_field(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - if (!field->pData) - { - /* Missing pointer field */ - return true; - } - - if (!das_pb_encode_tag_for_field(stream, field)) - return false; - - switch (PB_LTYPE(field->type)) - { - case PB_LTYPE_BOOL: - return das_pb_enc_bool(stream, field); - - case PB_LTYPE_VARINT: - case PB_LTYPE_UVARINT: - case PB_LTYPE_SVARINT: - return das_pb_enc_varint(stream, field); - - case PB_LTYPE_FIXED32: - case PB_LTYPE_FIXED64: - return das_pb_enc_fixed(stream, field); - - case PB_LTYPE_BYTES: - return das_pb_enc_bytes(stream, field); - - case PB_LTYPE_STRING: - return das_pb_enc_string(stream, field); - - case PB_LTYPE_SUBMESSAGE: - case PB_LTYPE_SUBMSG_W_CB: - return das_pb_enc_submessage(stream, field); - - case PB_LTYPE_FIXED_LENGTH_BYTES: - return das_pb_enc_fixed_length_bytes(stream, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -/* Encode a field with callback semantics. This means that a user function is - * called to provide and encode the actual data. */ -static bool checkreturn encode_callback_field(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - if (field->descriptor->field_callback != NULL) - { - if (!field->descriptor->field_callback(NULL, stream, field)) - PB_RETURN_ERROR(stream, "callback error"); - } - return true; -} - -/* Encode a single field of any callback, pointer or static type. */ -static bool checkreturn encode_field(das_pb_ostream_t *stream, das_pb_field_iter_t *field) -{ - /* Check field presence */ - if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF) - { - if (*(const das_pb_size_t*)field->pSize != field->tag) - { - /* Different type oneof field */ - return true; - } - } - else if (PB_HTYPE(field->type) == PB_HTYPE_OPTIONAL) - { - if (field->pSize) - { - if (safe_read_bool(field->pSize) == false) - { - /* Missing optional field */ - return true; - } - } - else if (PB_ATYPE(field->type) == PB_ATYPE_STATIC) - { - /* Proto3 singular field */ - if (das_pb_check_proto3_default_value(field)) - return true; - } - } - - if (!field->pData) - { - if (PB_HTYPE(field->type) == PB_HTYPE_REQUIRED) - PB_RETURN_ERROR(stream, "missing required field"); - - /* Pointer field set to NULL */ - return true; - } - - /* Then encode field contents */ - if (PB_ATYPE(field->type) == PB_ATYPE_CALLBACK) - { - return encode_callback_field(stream, field); - } - else if (PB_HTYPE(field->type) == PB_HTYPE_REPEATED) - { - return encode_array(stream, field); - } - else - { - return encode_basic_field(stream, field); - } -} - -/* Default handler for extension fields. Expects to have a das_pb_msgdesc_t - * pointer in the extension->type->arg field, pointing to a message with - * only one field in it. */ -static bool checkreturn default_extension_encoder(das_pb_ostream_t *stream, const das_pb_extension_t *extension) -{ - das_pb_field_iter_t iter; - - if (!das_pb_field_iter_begin_extension_const(&iter, extension)) - PB_RETURN_ERROR(stream, "invalid extension"); - - return encode_field(stream, &iter); -} - - -/* Walk through all the registered extensions and give them a chance - * to encode themselves. */ -static bool checkreturn encode_extension_field(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - const das_pb_extension_t *extension = *(const das_pb_extension_t* const *)field->pData; - - while (extension) - { - bool status; - if (extension->type->encode) - status = extension->type->encode(stream, extension); - else - status = default_extension_encoder(stream, extension); - - if (!status) - return false; - - extension = extension->next; - } - - return true; -} - -/********************* - * Encode all fields * - *********************/ - -bool checkreturn das_pb_encode(das_pb_ostream_t *stream, const das_pb_msgdesc_t *fields, const void *src_struct) -{ - das_pb_field_iter_t iter; - if (!das_pb_field_iter_begin_const(&iter, fields, src_struct)) - return true; /* Empty message type */ - - do { - if (PB_LTYPE(iter.type) == PB_LTYPE_EXTENSION) - { - /* Special case for the extension field placeholder */ - if (!encode_extension_field(stream, &iter)) - return false; - } - else - { - /* Regular field */ - if (!encode_field(stream, &iter)) - return false; - } - } while (das_pb_field_iter_next(&iter)); - - return true; -} - -bool checkreturn das_pb_encode_ex(das_pb_ostream_t *stream, const das_pb_msgdesc_t *fields, const void *src_struct, unsigned int flags) -{ - if ((flags & PB_ENCODE_DELIMITED) != 0) - { - return das_pb_encode_submessage(stream, fields, src_struct); - } - else if ((flags & PB_ENCODE_NULLTERMINATED) != 0) - { - const das_pb_byte_t zero = 0; - - if (!das_pb_encode(stream, fields, src_struct)) - return false; - - return das_pb_write(stream, &zero, 1); - } - else - { - return das_pb_encode(stream, fields, src_struct); - } -} - -bool das_pb_get_encoded_size(size_t *size, const das_pb_msgdesc_t *fields, const void *src_struct) -{ - das_pb_ostream_t stream = PB_OSTREAM_SIZING; - - if (!das_pb_encode(&stream, fields, src_struct)) - return false; - - *size = stream.bytes_written; - return true; -} - -/******************** - * Helper functions * - ********************/ - -/* This function avoids 64-bit shifts as they are quite slow on many platforms. */ -static bool checkreturn das_pb_encode_varint_32(das_pb_ostream_t *stream, uint32_t low, uint32_t high) -{ - size_t i = 0; - das_pb_byte_t buffer[10]; - das_pb_byte_t byte = (das_pb_byte_t)(low & 0x7F); - low >>= 7; - - while (i < 4 && (low != 0 || high != 0)) - { - byte |= 0x80; - buffer[i++] = byte; - byte = (das_pb_byte_t)(low & 0x7F); - low >>= 7; - } - - if (high) - { - byte = (das_pb_byte_t)(byte | ((high & 0x07) << 4)); - high >>= 3; - - while (high) - { - byte |= 0x80; - buffer[i++] = byte; - byte = (das_pb_byte_t)(high & 0x7F); - high >>= 7; - } - } - - buffer[i++] = byte; - - return das_pb_write(stream, buffer, i); -} - -bool checkreturn das_pb_encode_varint(das_pb_ostream_t *stream, das_pb_uint64_t value) -{ - if (value <= 0x7F) - { - /* Fast path: single byte */ - das_pb_byte_t byte = (das_pb_byte_t)value; - return das_pb_write(stream, &byte, 1); - } - else - { -#ifdef PB_WITHOUT_64BIT - return das_pb_encode_varint_32(stream, value, 0); -#else - return das_pb_encode_varint_32(stream, (uint32_t)value, (uint32_t)(value >> 32)); -#endif - } -} - -bool checkreturn das_pb_encode_svarint(das_pb_ostream_t *stream, das_pb_int64_t value) -{ - das_pb_uint64_t zigzagged; - if (value < 0) - zigzagged = ~((das_pb_uint64_t)value << 1); - else - zigzagged = (das_pb_uint64_t)value << 1; - - return das_pb_encode_varint(stream, zigzagged); -} - -bool checkreturn das_pb_encode_fixed32(das_pb_ostream_t *stream, const void *value) -{ - uint32_t val = *(const uint32_t*)value; - das_pb_byte_t bytes[4]; - bytes[0] = (das_pb_byte_t)(val & 0xFF); - bytes[1] = (das_pb_byte_t)((val >> 8) & 0xFF); - bytes[2] = (das_pb_byte_t)((val >> 16) & 0xFF); - bytes[3] = (das_pb_byte_t)((val >> 24) & 0xFF); - return das_pb_write(stream, bytes, 4); -} - -#ifndef PB_WITHOUT_64BIT -bool checkreturn das_pb_encode_fixed64(das_pb_ostream_t *stream, const void *value) -{ - uint64_t val = *(const uint64_t*)value; - das_pb_byte_t bytes[8]; - bytes[0] = (das_pb_byte_t)(val & 0xFF); - bytes[1] = (das_pb_byte_t)((val >> 8) & 0xFF); - bytes[2] = (das_pb_byte_t)((val >> 16) & 0xFF); - bytes[3] = (das_pb_byte_t)((val >> 24) & 0xFF); - bytes[4] = (das_pb_byte_t)((val >> 32) & 0xFF); - bytes[5] = (das_pb_byte_t)((val >> 40) & 0xFF); - bytes[6] = (das_pb_byte_t)((val >> 48) & 0xFF); - bytes[7] = (das_pb_byte_t)((val >> 56) & 0xFF); - return das_pb_write(stream, bytes, 8); -} -#endif - -bool checkreturn das_pb_encode_tag(das_pb_ostream_t *stream, das_pb_wire_type_t wiretype, uint32_t field_number) -{ - das_pb_uint64_t tag = ((das_pb_uint64_t)field_number << 3) | wiretype; - return das_pb_encode_varint(stream, tag); -} - -bool das_pb_encode_tag_for_field ( das_pb_ostream_t* stream, const das_pb_field_iter_t* field ) -{ - das_pb_wire_type_t wiretype; - switch (PB_LTYPE(field->type)) - { - case PB_LTYPE_BOOL: - case PB_LTYPE_VARINT: - case PB_LTYPE_UVARINT: - case PB_LTYPE_SVARINT: - wiretype = PB_WT_VARINT; - break; - - case PB_LTYPE_FIXED32: - wiretype = PB_WT_32BIT; - break; - - case PB_LTYPE_FIXED64: - wiretype = PB_WT_64BIT; - break; - - case PB_LTYPE_BYTES: - case PB_LTYPE_STRING: - case PB_LTYPE_SUBMESSAGE: - case PB_LTYPE_SUBMSG_W_CB: - case PB_LTYPE_FIXED_LENGTH_BYTES: - wiretype = PB_WT_STRING; - break; - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } - - return das_pb_encode_tag(stream, wiretype, field->tag); -} - -bool checkreturn das_pb_encode_string(das_pb_ostream_t *stream, const das_pb_byte_t *buffer, size_t size) -{ - if (!das_pb_encode_varint(stream, (das_pb_uint64_t)size)) - return false; - - return das_pb_write(stream, buffer, size); -} - -bool checkreturn das_pb_encode_submessage(das_pb_ostream_t *stream, const das_pb_msgdesc_t *fields, const void *src_struct) -{ - /* First calculate the message size using a non-writing substream. */ - das_pb_ostream_t substream = PB_OSTREAM_SIZING; - size_t size; - bool status; - - if (!das_pb_encode(&substream, fields, src_struct)) - { -#ifndef PB_NO_ERRMSG - stream->errmsg = substream.errmsg; -#endif - return false; - } - - size = substream.bytes_written; - - if (!das_pb_encode_varint(stream, (das_pb_uint64_t)size)) - return false; - - if (stream->callback == NULL) - return das_pb_write(stream, NULL, size); /* Just sizing */ - - if (stream->bytes_written + size > stream->max_size) - PB_RETURN_ERROR(stream, "stream full"); - - /* Use a substream to verify that a callback doesn't write more than - * what it did the first time. */ - substream.callback = stream->callback; - substream.state = stream->state; - substream.max_size = size; - substream.bytes_written = 0; -#ifndef PB_NO_ERRMSG - substream.errmsg = NULL; -#endif - - status = das_pb_encode(&substream, fields, src_struct); - - stream->bytes_written += substream.bytes_written; - stream->state = substream.state; -#ifndef PB_NO_ERRMSG - stream->errmsg = substream.errmsg; -#endif - - if (substream.bytes_written != size) - PB_RETURN_ERROR(stream, "submsg size changed"); - - return status; -} - -/* Field encoders */ - -static bool checkreturn das_pb_enc_bool(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - uint32_t value = safe_read_bool(field->pData) ? 1 : 0; - PB_UNUSED(field); - return das_pb_encode_varint(stream, value); -} - -static bool checkreturn das_pb_enc_varint(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - if (PB_LTYPE(field->type) == PB_LTYPE_UVARINT) - { - /* Perform unsigned integer extension */ - das_pb_uint64_t value = 0; - - if (field->data_size == sizeof(uint_least8_t)) - value = *(const uint_least8_t*)field->pData; - else if (field->data_size == sizeof(uint_least16_t)) - value = *(const uint_least16_t*)field->pData; - else if (field->data_size == sizeof(uint32_t)) - value = *(const uint32_t*)field->pData; - else if (field->data_size == sizeof(das_pb_uint64_t)) - value = *(const das_pb_uint64_t*)field->pData; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - return das_pb_encode_varint(stream, value); - } - else - { - /* Perform signed integer extension */ - das_pb_int64_t value = 0; - - if (field->data_size == sizeof(int_least8_t)) - value = *(const int_least8_t*)field->pData; - else if (field->data_size == sizeof(int_least16_t)) - value = *(const int_least16_t*)field->pData; - else if (field->data_size == sizeof(int32_t)) - value = *(const int32_t*)field->pData; - else if (field->data_size == sizeof(das_pb_int64_t)) - value = *(const das_pb_int64_t*)field->pData; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (PB_LTYPE(field->type) == PB_LTYPE_SVARINT) - return das_pb_encode_svarint(stream, value); -#ifdef PB_WITHOUT_64BIT - else if (value < 0) - return das_pb_encode_varint_32(stream, (uint32_t)value, (uint32_t)-1); -#endif - else - return das_pb_encode_varint(stream, (das_pb_uint64_t)value); - - } -} - -static bool checkreturn das_pb_enc_fixed(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ -#ifdef PB_CONVERT_DOUBLE_FLOAT - if (field->data_size == sizeof(float) && PB_LTYPE(field->type) == PB_LTYPE_FIXED64) - { - return das_pb_encode_float_as_double(stream, *(float*)field->pData); - } -#endif - - if (field->data_size == sizeof(uint32_t)) - { - return das_pb_encode_fixed32(stream, field->pData); - } -#ifndef PB_WITHOUT_64BIT - else if (field->data_size == sizeof(uint64_t)) - { - return das_pb_encode_fixed64(stream, field->pData); - } -#endif - else - { - PB_RETURN_ERROR(stream, "invalid data_size"); - } -} - -static bool checkreturn das_pb_enc_bytes(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - const das_pb_bytes_array_t *bytes = NULL; - - bytes = (const das_pb_bytes_array_t*)field->pData; - - if (bytes == NULL) - { - /* Treat null pointer as an empty bytes field */ - return das_pb_encode_string(stream, NULL, 0); - } - - if (PB_ATYPE(field->type) == PB_ATYPE_STATIC && - bytes->size > field->data_size - offsetof(das_pb_bytes_array_t, bytes)) - { - PB_RETURN_ERROR(stream, "bytes size exceeded"); - } - - return das_pb_encode_string(stream, bytes->bytes, (size_t)bytes->size); -} - -static bool checkreturn das_pb_enc_string(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - size_t size = 0; - size_t max_size = (size_t)field->data_size; - const char *str = (const char*)field->pData; - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { - max_size = (size_t)-1; - } - else - { - /* das_pb_dec_string() assumes string fields end with a null - * terminator when the type isn't PB_ATYPE_POINTER, so we - * shouldn't allow more than max-1 bytes to be written to - * allow space for the null terminator. - */ - if (max_size == 0) - PB_RETURN_ERROR(stream, "zero-length string"); - - max_size -= 1; - } - - - if (str == NULL) - { - size = 0; /* Treat null pointer as an empty string */ - } - else - { - const char *p = str; - - /* strnlen() is not always available, so just use a loop */ - while (size < max_size && *p != '\0') - { - size++; - p++; - } - - if (*p != '\0') - { - PB_RETURN_ERROR(stream, "unterminated string"); - } - } - -#ifdef PB_VALIDATE_UTF8 - if (!das_pb_validate_utf8(str)) - PB_RETURN_ERROR(stream, "invalid utf8"); -#endif - - return das_pb_encode_string(stream, (const das_pb_byte_t*)str, size); -} - -static bool checkreturn das_pb_enc_submessage(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - if (field->submsg_desc == NULL) - PB_RETURN_ERROR(stream, "invalid field descriptor"); - - if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL) - { - /* Message callback is stored right before pSize. */ - das_pb_callback_t *callback = (das_pb_callback_t*)field->pSize - 1; - if (callback->funcs.encode) - { - if (!callback->funcs.encode(stream, field, &callback->arg)) - return false; - } - } - - return das_pb_encode_submessage(stream, field->submsg_desc, field->pData); -} - -static bool checkreturn das_pb_enc_fixed_length_bytes(das_pb_ostream_t *stream, const das_pb_field_iter_t *field) -{ - return das_pb_encode_string(stream, (const das_pb_byte_t*)field->pData, (size_t)field->data_size); -} - -#ifdef PB_CONVERT_DOUBLE_FLOAT -bool das_pb_encode_float_as_double(das_pb_ostream_t *stream, float value) -{ - union { float f; uint32_t i; } in; - uint_least8_t sign; - int exponent; - uint64_t mantissa; - - in.f = value; - - /* Decompose input value */ - sign = (uint_least8_t)((in.i >> 31) & 1); - exponent = (int)((in.i >> 23) & 0xFF) - 127; - mantissa = in.i & 0x7FFFFF; - - if (exponent == 128) - { - /* Special value (NaN etc.) */ - exponent = 1024; - } - else if (exponent == -127) - { - if (!mantissa) - { - /* Zero */ - exponent = -1023; - } - else - { - /* Denormalized */ - mantissa <<= 1; - while (!(mantissa & 0x800000)) - { - mantissa <<= 1; - exponent--; - } - mantissa &= 0x7FFFFF; - } - } - - /* Combine fields */ - mantissa <<= 29; - mantissa |= (uint64_t)(exponent + 1023) << 52; - mantissa |= (uint64_t)sign << 63; - - return das_pb_encode_fixed64(stream, &mantissa); -} -#endif diff --git a/src/lsoc_das2/proto/pb_encode.h b/src/lsoc_das2/proto/pb_encode.h deleted file mode 100644 index 3b94b0a..0000000 --- a/src/lsoc_das2/proto/pb_encode.h +++ /dev/null @@ -1,185 +0,0 @@ -/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c. - * The main function is pb_encode. You also need an output stream, and the - * field descriptions created by nanopb_generator.py. - */ - -#ifndef PB_ENCODE_H_INCLUDED -#define PB_ENCODE_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Structure for defining custom output streams. You will need to provide - * a callback function to write the bytes to your storage, which can be - * for example a file or a network socket. - * - * The callback must conform to these rules: - * - * 1) Return false on IO errors. This will cause encoding to abort. - * 2) You can use state to store your own data (e.g. buffer pointer). - * 3) das_pb_write will update bytes_written after your callback runs. - * 4) Substreams will modify max_size and bytes_written. Don't use them - * to calculate any pointers. - */ -struct das_pb_ostream_s -{ -#ifdef PB_BUFFER_ONLY - /* Callback pointer is not used in buffer-only configuration. - * Having an int pointer here allows binary compatibility but - * gives an error if someone tries to assign callback function. - * Also, NULL pointer marks a 'sizing stream' that does not - * write anything. - */ - int *callback; -#else - bool (*callback)(das_pb_ostream_t *stream, const das_pb_byte_t *buf, size_t count); -#endif - void *state; /* Free field for use by callback implementation. */ - size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ - size_t bytes_written; /* Number of bytes written so far. */ - -#ifndef PB_NO_ERRMSG - const char *errmsg; -#endif -}; - -/*************************** - * Main encoding functions * - ***************************/ - -/* Encode a single protocol buffers message from C structure into a stream. - * Returns true on success, false on any failure. - * The actual struct pointed to by src_struct must match the description in fields. - * All required fields in the struct are assumed to have been filled in. - * - * Example usage: - * MyMessage msg = {}; - * uint8_t buffer[64]; - * das_pb_ostream_t stream; - * - * msg.field1 = 42; - * stream = das_pb_ostream_from_buffer(buffer, sizeof(buffer)); - * das_pb_encode(&stream, MyMessage_fields, &msg); - */ -bool das_pb_encode(das_pb_ostream_t *stream, const das_pb_msgdesc_t *fields, const void *src_struct); - -/* Extended version of das_pb_encode, with several options to control the - * encoding process: - * - * PB_ENCODE_DELIMITED: Prepend the length of message as a varint. - * Corresponds to writeDelimitedTo() in Google's - * protobuf API. - * - * PB_ENCODE_NULLTERMINATED: Append a null byte to the message for termination. - * NOTE: This behaviour is not supported in most other - * protobuf implementations, so PB_ENCODE_DELIMITED - * is a better option for compatibility. - */ -#define PB_ENCODE_DELIMITED 0x02U -#define PB_ENCODE_NULLTERMINATED 0x04U -bool das_pb_encode_ex(das_pb_ostream_t *stream, const das_pb_msgdesc_t *fields, const void *src_struct, unsigned int flags); - -/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ -#define das_pb_encode_delimited(s,f,d) das_pb_encode_ex(s,f,d, PB_ENCODE_DELIMITED) -#define das_pb_encode_nullterminated(s,f,d) das_pb_encode_ex(s,f,d, PB_ENCODE_NULLTERMINATED) - -/* Encode the message to get the size of the encoded data, but do not store - * the data. */ -bool das_pb_get_encoded_size(size_t *size, const das_pb_msgdesc_t *fields, const void *src_struct); - -/************************************** - * Functions for manipulating streams * - **************************************/ - -/* Create an output stream for writing into a memory buffer. - * The number of bytes written can be found in stream.bytes_written after - * encoding the message. - * - * Alternatively, you can use a custom stream that writes directly to e.g. - * a file or a network socket. - */ -das_pb_ostream_t das_pb_ostream_from_buffer(das_pb_byte_t *buf, size_t bufsize); - -/* Pseudo-stream for measuring the size of a message without actually storing - * the encoded data. - * - * Example usage: - * MyMessage msg = {}; - * das_pb_ostream_t stream = PB_OSTREAM_SIZING; - * das_pb_encode(&stream, MyMessage_fields, &msg); - * printf("Message size is %d\n", stream.bytes_written); - */ -#ifndef PB_NO_ERRMSG -#define PB_OSTREAM_SIZING {0,0,0,0,0} -#else -#define PB_OSTREAM_SIZING {0,0,0,0} -#endif - -/* Function to write into a das_pb_ostream_t stream. You can use this if you need - * to append or prepend some custom headers to the message. - */ -bool das_pb_write(das_pb_ostream_t *stream, const das_pb_byte_t *buf, size_t count); - - -/************************************************ - * Helper functions for writing field callbacks * - ************************************************/ - -/* Encode field header based on type and field number defined in the field - * structure. Call this from the callback before writing out field contents. */ -bool das_pb_encode_tag_for_field(das_pb_ostream_t *stream, const das_pb_field_iter_t *field); - -/* Encode field header by manually specifying wire type. You need to use this - * if you want to write out packed arrays from a callback field. */ -bool das_pb_encode_tag(das_pb_ostream_t *stream, das_pb_wire_type_t wiretype, uint32_t field_number); - -/* Encode an integer in the varint format. - * This works for bool, enum, int32, int64, uint32 and uint64 field types. */ -#ifndef PB_WITHOUT_64BIT -bool das_pb_encode_varint(das_pb_ostream_t *stream, uint64_t value); -#else -bool das_pb_encode_varint(das_pb_ostream_t *stream, uint32_t value); -#endif - -/* Encode an integer in the zig-zagged svarint format. - * This works for sint32 and sint64. */ -#ifndef PB_WITHOUT_64BIT -bool das_pb_encode_svarint(das_pb_ostream_t *stream, int64_t value); -#else -bool das_pb_encode_svarint(das_pb_ostream_t *stream, int32_t value); -#endif - -/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */ -bool das_pb_encode_string(das_pb_ostream_t *stream, const das_pb_byte_t *buffer, size_t size); - -/* Encode a fixed32, sfixed32 or float value. - * You need to pass a pointer to a 4-byte wide C variable. */ -bool das_pb_encode_fixed32(das_pb_ostream_t *stream, const void *value); - -#ifndef PB_WITHOUT_64BIT -/* Encode a fixed64, sfixed64 or double value. - * You need to pass a pointer to a 8-byte wide C variable. */ -bool das_pb_encode_fixed64(das_pb_ostream_t *stream, const void *value); -#endif - -#ifdef PB_CONVERT_DOUBLE_FLOAT -/* Encode a float value so that it appears like a double in the encoded - * message. */ -bool das_pb_encode_float_as_double(das_pb_ostream_t *stream, float value); -#endif - -/* Encode a submessage field. - * You need to pass the das_pb_field_t array and pointer to struct, just like - * with das_pb_encode(). This internally encodes the submessage twice, first to - * calculate message size and then to actually write it out. - */ -bool das_pb_encode_submessage(das_pb_ostream_t *stream, const das_pb_msgdesc_t *fields, const void *src_struct); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/lsoc_das2/sha1.c b/src/lsoc_das2/sha1.c deleted file mode 100644 index d5984f6..0000000 --- a/src/lsoc_das2/sha1.c +++ /dev/null @@ -1,291 +0,0 @@ -/** - * - * Filename: sha1.c - * - * Description: Inline SHA1 algorithm - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - - -#include "das_platform.h" -#include "das_sha1.h" - -#ifndef DAS_PLATFORM_SHA1_ALT - -/* Implementation that should never be optimized out by the compiler */ -static void das_zeroize(void *v, size_t n) { - volatile unsigned char *p = (unsigned char*)v; - while (n--) *p++ = 0; -} - -/* - * 32-bit integer manipulation macros (big endian) - */ -#ifndef GET_UINT32_BE -#define GET_UINT32_BE(n,b,i) \ - { \ - (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ - | ( (uint32_t) (b)[(i) + 1] << 16 ) \ - | ( (uint32_t) (b)[(i) + 2] << 8 ) \ - | ( (uint32_t) (b)[(i) + 3] ); \ - } -#endif - -#ifndef PUT_UINT32_BE -#define PUT_UINT32_BE(n,b,i) \ - { \ - (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ - (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ - (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ - (b)[(i) + 3] = (unsigned char) ( (n) ); \ - } -#endif - -static void _sha1_process(das_sha1_context_t *ctx, const unsigned char data[64]) { - uint32_t temp, W[16], A, B, C, D, E; - - GET_UINT32_BE(W[ 0], data, 0); - GET_UINT32_BE(W[ 1], data, 4); - GET_UINT32_BE(W[ 2], data, 8); - GET_UINT32_BE(W[ 3], data, 12); - GET_UINT32_BE(W[ 4], data, 16); - GET_UINT32_BE(W[ 5], data, 20); - GET_UINT32_BE(W[ 6], data, 24); - GET_UINT32_BE(W[ 7], data, 28); - GET_UINT32_BE(W[ 8], data, 32); - GET_UINT32_BE(W[ 9], data, 36); - GET_UINT32_BE(W[10], data, 40); - GET_UINT32_BE(W[11], data, 44); - GET_UINT32_BE(W[12], data, 48); - GET_UINT32_BE(W[13], data, 52); - GET_UINT32_BE(W[14], data, 56); - GET_UINT32_BE(W[15], data, 60); - -#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) - -#define R(t) \ - ( \ - temp = W[( t - 3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \ - W[( t - 14 ) & 0x0F] ^ W[ t & 0x0F], \ - ( W[t & 0x0F] = S(temp,1) ) \ - ) - -#define P(a,b,c,d,e,x) \ - { \ - e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ - } - - A = ctx->state[0]; - B = ctx->state[1]; - C = ctx->state[2]; - D = ctx->state[3]; - E = ctx->state[4]; - -#define F(x,y,z) (z ^ (x & (y ^ z))) -#define K 0x5A827999 - - P(A, B, C, D, E, W[0]); - P(E, A, B, C, D, W[1]); - P(D, E, A, B, C, W[2]); - P(C, D, E, A, B, W[3]); - P(B, C, D, E, A, W[4]); - P(A, B, C, D, E, W[5]); - P(E, A, B, C, D, W[6]); - P(D, E, A, B, C, W[7]); - P(C, D, E, A, B, W[8]); - P(B, C, D, E, A, W[9]); - P(A, B, C, D, E, W[10]); - P(E, A, B, C, D, W[11]); - P(D, E, A, B, C, W[12]); - P(C, D, E, A, B, W[13]); - P(B, C, D, E, A, W[14]); - P(A, B, C, D, E, W[15]); - P(E, A, B, C, D, R(16)); - P(D, E, A, B, C, R(17)); - P(C, D, E, A, B, R(18)); - P(B, C, D, E, A, R(19)); - -#undef K -#undef F - -#define F(x,y,z) (x ^ y ^ z) -#define K 0x6ED9EBA1 - - P(A, B, C, D, E, R(20)); - P(E, A, B, C, D, R(21)); - P(D, E, A, B, C, R(22)); - P(C, D, E, A, B, R(23)); - P(B, C, D, E, A, R(24)); - P(A, B, C, D, E, R(25)); - P(E, A, B, C, D, R(26)); - P(D, E, A, B, C, R(27)); - P(C, D, E, A, B, R(28)); - P(B, C, D, E, A, R(29)); - P(A, B, C, D, E, R(30)); - P(E, A, B, C, D, R(31)); - P(D, E, A, B, C, R(32)); - P(C, D, E, A, B, R(33)); - P(B, C, D, E, A, R(34)); - P(A, B, C, D, E, R(35)); - P(E, A, B, C, D, R(36)); - P(D, E, A, B, C, R(37)); - P(C, D, E, A, B, R(38)); - P(B, C, D, E, A, R(39)); - -#undef K -#undef F - -#define F(x,y,z) ((x & y) | (z & (x | y))) -#define K 0x8F1BBCDC - - P(A, B, C, D, E, R(40)); - P(E, A, B, C, D, R(41)); - P(D, E, A, B, C, R(42)); - P(C, D, E, A, B, R(43)); - P(B, C, D, E, A, R(44)); - P(A, B, C, D, E, R(45)); - P(E, A, B, C, D, R(46)); - P(D, E, A, B, C, R(47)); - P(C, D, E, A, B, R(48)); - P(B, C, D, E, A, R(49)); - P(A, B, C, D, E, R(50)); - P(E, A, B, C, D, R(51)); - P(D, E, A, B, C, R(52)); - P(C, D, E, A, B, R(53)); - P(B, C, D, E, A, R(54)); - P(A, B, C, D, E, R(55)); - P(E, A, B, C, D, R(56)); - P(D, E, A, B, C, R(57)); - P(C, D, E, A, B, R(58)); - P(B, C, D, E, A, R(59)); - -#undef K -#undef F - -#define F(x,y,z) (x ^ y ^ z) -#define K 0xCA62C1D6 - - P(A, B, C, D, E, R(60)); - P(E, A, B, C, D, R(61)); - P(D, E, A, B, C, R(62)); - P(C, D, E, A, B, R(63)); - P(B, C, D, E, A, R(64)); - P(A, B, C, D, E, R(65)); - P(E, A, B, C, D, R(66)); - P(D, E, A, B, C, R(67)); - P(C, D, E, A, B, R(68)); - P(B, C, D, E, A, R(69)); - P(A, B, C, D, E, R(70)); - P(E, A, B, C, D, R(71)); - P(D, E, A, B, C, R(72)); - P(C, D, E, A, B, R(73)); - P(B, C, D, E, A, R(74)); - P(A, B, C, D, E, R(75)); - P(E, A, B, C, D, R(76)); - P(D, E, A, B, C, R(77)); - P(C, D, E, A, B, R(78)); - P(B, C, D, E, A, R(79)); - -#undef K -#undef F - - ctx->state[0] += A; - ctx->state[1] += B; - ctx->state[2] += C; - ctx->state[3] += D; - ctx->state[4] += E; -} - -/* - * SHA-1 context setup - */ -void das_sha1_start(das_sha1_context_t *ctx) { - das_zeroize(ctx, sizeof(das_sha1_context_t)); - - ctx->total[0] = 0; - ctx->total[1] = 0; - - ctx->state[0] = 0x67452301; - ctx->state[1] = 0xEFCDAB89; - ctx->state[2] = 0x98BADCFE; - ctx->state[3] = 0x10325476; - ctx->state[4] = 0xC3D2E1F0; -} - -/* - * SHA-1 process buffer - */ -void das_sha1_update(das_sha1_context_t *ctx, const unsigned char *input, size_t ilen) { - size_t fill; - uint32_t left; - - if (ilen == 0) - return; - - left = ctx->total[0] & 0x3F; - fill = 64 - left; - - ctx->total[0] += (uint32_t) ilen; - ctx->total[0] &= 0xFFFFFFFF; - - if (ctx->total[0] < (uint32_t) ilen) - ctx->total[1]++; - - if (left && ilen >= fill) { - memcpy((void *)(ctx->buffer + left), input, fill); - _sha1_process(ctx, ctx->buffer); - input += fill; - ilen -= fill; - left = 0; - } - - while (ilen >= 64) { - _sha1_process(ctx, input); - input += 64; - ilen -= 64; - } - - if (ilen > 0) - memcpy((void *)(ctx->buffer + left), input, ilen); -} - -static const unsigned char sha1_padding[64] = { - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* - * SHA-1 final digest - */ -void das_sha1_finish(das_sha1_context_t *ctx, unsigned char output[20]) { - uint32_t last, padn; - uint32_t high, low; - unsigned char msglen[8]; - - high = (ctx->total[0] >> 29) - | (ctx->total[1] << 3); - low = (ctx->total[0] << 3); - - PUT_UINT32_BE(high, msglen, 0); - PUT_UINT32_BE(low, msglen, 4); - - last = ctx->total[0] & 0x3F; - padn = (last < 56) ? (56 - last) : (120 - last); - - das_sha1_update(ctx, sha1_padding, padn); - das_sha1_update(ctx, msglen, 8); - - PUT_UINT32_BE(ctx->state[0], output, 0); - PUT_UINT32_BE(ctx->state[1], output, 4); - PUT_UINT32_BE(ctx->state[2], output, 8); - PUT_UINT32_BE(ctx->state[3], output, 12); - PUT_UINT32_BE(ctx->state[4], output, 16); -} - -#endif /* DAS_PLATFORM_SHA1_ALT */ diff --git a/src/lsoc_das2/utils.c b/src/lsoc_das2/utils.c deleted file mode 100644 index f2db0d4..0000000 --- a/src/lsoc_das2/utils.c +++ /dev/null @@ -1,110 +0,0 @@ -/** - * - * Filename: utils.c - * - * Description: DAS utilities - * - * Created by strawmanbobi 2022-01-10 - * - * Copyright (c) 2022 Aliyun-IoT - * - **/ - -#include - -#include "das_platform.h" - -size_t das_hex2string(char *str, size_t str_len, uint8_t *hex, size_t hex_len) { - static const char *hex_table = "0123465789abcdef"; - size_t i; - uint8_t v; - - if (str_len <= hex_len * 2) { - return 0; - } else { - str_len = hex_len * 2; - } - - for (i = 0; i < hex_len; i++) { - v = hex[i]; - str[2 * i + 0] = hex_table[(v & 0xf0) >> 4]; - str[2 * i + 1] = hex_table[(v & 0x0f)]; - } - - str[2 * i] = '\0'; - - return str_len; -} - -char *das_itoa(int val, char *buf, unsigned int radix) { - char *p; - char *firstdig; - char temp; - unsigned digval; - p = buf; - if (val < 0) { - *p++ = '-'; - val = (unsigned long)(-(long)val); - } - - firstdig = p; - do { - digval = (unsigned)(val % radix); - val /= radix; - - if (digval > 9) - *p++ = (char)(digval - 10 + 'a'); - else - *p++ = (char)(digval + '0'); - } while (val > 0); - - *p-- = '\0'; - do { - temp = *p; - *p = *firstdig; - *firstdig = temp; - --p; - ++firstdig; - } while (firstdig < p); - - return buf; -} - - -static char** _strsplit(const char* s, const char* delim, size_t* nb) { - void* data; - char* _s = (char*)s; - const char** ptrs; - size_t ptrsSize; - size_t nbWords = 1; - size_t sLen = strlen(s); - size_t delimLen = strlen(delim); - - while ((_s = strstr(_s, delim))) { - _s += delimLen; - ++nbWords; - } - ptrsSize = (nbWords + 1) * sizeof(char*); - ptrs = - data = malloc(ptrsSize + sLen + 1); - if (data) { - *ptrs = - _s = strcpy(((char*)data) + ptrsSize, s); - if (nbWords > 1) { - while ((_s = strstr(_s, delim))) { - *_s = '\0'; - _s += delimLen; - *++ptrs = _s; - } - } - *++ptrs = NULL; - } - if (nb) { - *nb = data ? nbWords : 0; - } - return data; -} - -char** das_strsplit(const char* s, const char* delim, size_t* nb) { - return _strsplit(s, delim, nb); -}