diff --git a/configure/cfg.c b/configure/cfg.c index 1b0165a..4599ff8 100644 --- a/configure/cfg.c +++ b/configure/cfg.c @@ -20,6 +20,8 @@ static PUSER_CONFIG g_pUserCfg = NULL; static GLOGAL_CONFIG g_globalCfg; +static int CfgEncrypto(unsigned char* pDest, unsigned char* pSrc, int iSlen); + static void __dumpGlobalCfg(void) { int err; @@ -247,6 +249,7 @@ static void __dumpUserConfig(PUSER_CONFIG pCfg) } LOG_EX(LOG_Debug, "User Configure Information:\n%s\n", pStr); + free(pStr); } @@ -261,6 +264,7 @@ PUSER_CONFIG CreateDefaultUserCfg(void) usrCfg.UsedDefault = TRUE; usrCfg.FactoryMode = 0; usrCfg.DeviceType = 0; + usrCfg.DeviceName = "MC01"; usrCfg.ServerCfg.ProductKey = "46ab16f31749ac85076d50294efe2e03"; usrCfg.ServerCfg.ProductSecury = "eac46ba44c94"; usrCfg.ServerCfg.MQTTServer = "mqtt-dev.netease.im"; @@ -305,6 +309,9 @@ int UserCfgSaveToFlash(void) { char* pStr; int err = ERR_OK; + int out, oSize; + char *pBuf, *pCode; + SpiFlashOpResult ret = spi_flash_erase_sector(PARAM_SAVE_USERCFG); if(ret != SPI_FLASH_RESULT_OK) @@ -321,43 +328,98 @@ int UserCfgSaveToFlash(void) return -ERR_JSON_STR_FORMAT; } - ret = spi_flash_write(PARAM_SAVE_USERCFG * SECTOR_SIZE, (unsigned int *)pStr, strlen(pStr)); - + pBuf = (char*)HAL_Malloc(SECTOR_SIZE); + pCode = (char*)HAL_Malloc(SECTOR_SIZE); + + memset(pBuf, 0, SECTOR_SIZE); + memset(pCode, 0, SECTOR_SIZE); + + oSize = CfgEncrypto(pBuf, pStr, strlen(pStr)); + + free(pStr); + + mbedtls_base64_encode(pCode, SECTOR_SIZE, &out, pBuf, oSize); + free(pBuf); + + ret = spi_flash_write(PARAM_SAVE_USERCFG * SECTOR_SIZE, (unsigned int *)pCode, strlen(pCode)); + free(pCode); + if(ret != SPI_FLASH_RESULT_OK) { LOG_EX(LOG_Error, "Erase Sector error: %d\n", ret); return -ERR_WRITE_FLASH; - } + } - free(pStr); return ERR_OK; } +static int CfgEncrypto(unsigned char* pDest, unsigned char* pSrc, int iSlen) +{ + int isPad, outlen = 0, i = 0; + unsigned char* pRet = pDest; + mbedtls_aes_context aes_ctx; + char pad[16]; + + memset(pad, 0, 16); + + isPad = iSlen % 16; + + //密钥数值 + const unsigned char key[16] = {'0', '1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; + + mbedtls_aes_init(&aes_ctx); + + //设置密钥 + mbedtls_aes_setkey_enc(&aes_ctx, key, 128); + + //LOG_EX(LOG_Debug, "Input(%d):\n%s\n", iSlen, pSrc); + + // AES ECB 加密 + for(i = 0; i < iSlen / 16; i++) + { + mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, (const unsigned char*)pSrc, pDest); + pSrc += 16; + pDest += 16; + outlen += 16; + } + + if(isPad) + { + memcpy(pad, pSrc, isPad); + mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, (const unsigned char*)pad, pDest); + outlen += 16; + } + + return outlen; +} + + static int CfgDecrypto(unsigned char* pDest, unsigned char* pSrc, int iSlen) { int i = 0; unsigned char* pRet = pDest; mbedtls_aes_context aes_ctx; - //ÃÜÔ¿ÊýÖµ + //密钥数值 const unsigned char key[16] = {'0', '1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; mbedtls_aes_init(&aes_ctx); - //ÉèÖýâÃÜÃÜÔ¿ + //设置密钥 mbedtls_aes_setkey_dec(&aes_ctx, key, 128); - //LOG_EX(LOG_Debug, "Input size: %d\n", iSlen); + //LOG_EX(LOG_Debug, "Input(%d):\n%s\n", iSlen, pSrc); - // AES ECB ½âÃÜ + // AES ECB 解密 for(i = 0; i < iSlen / 16; i++) { mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_DECRYPT, (const unsigned char*)pSrc, pDest); pSrc += 16; pDest += 16; } - - // È¥³ýpad×Ö·û + + //LOG_EX(LOG_Debug, "AES Dec:\n%s\n", pRet); + // 去除pad字符 for(i = 0; i < iSlen; i++) { if((isprint(pRet[i]) == 0) @@ -369,6 +431,7 @@ static int CfgDecrypto(unsigned char* pDest, unsigned char* pSrc, int iSlen) break; } } + //LOG_EX(LOG_Debug, "AES Dec Format:\n%s\n", pRet); return i; } @@ -393,11 +456,21 @@ int CfgReadUserCfgFromFlash(void) if(ret != SPI_FLASH_RESULT_OK) { - //LOG_EX(LOG_Error, "Read Sector error: %d\n", ret); +#if DEBUG_USER_CFG + LOG_EX(LOG_Error, "Read Sector error: %d\n", ret); +#endif return -ERR_READ_FLASH; } slen = strlen(pUserCfg); + + if(slen > SECTOR_SIZE) + { +#if DEBUG_USER_CFG + LOG_EX(LOG_Error, "Bad configure File: %d\n", slen); +#endif + return -ERR_BAD_CFG_FILE; + } pBase64Buf = (unsigned char *)HAL_Malloc(slen); if(pBase64Buf == NULL) @@ -416,14 +489,17 @@ int CfgReadUserCfgFromFlash(void) ret = CfgDecrypto(pUserCfg, pBase64Buf, i); #if DEBUG_USER_CFG LOG_EX(LOG_Debug, "User Cfg Decode(%d): \n%s\n\n", ret, pUserCfg); -#endif +#endif + //IHW_LOG_BUF(LOG_Debug, "Json", (unsigned char*)pBase64Buf, strlen(pBase64Buf)); - + pCfgInfo = (PUSER_CONFIG)Json2Struct(pUserCfg, JE_USER_CFG, CRYPTO_NONE, &i); if(i != ERR_OK || pCfgInfo == NULL) { - //LOG_EX(LOG_Error, "Decode User Configure Error: %d\n", i); +#if DEBUG_USER_CFG + LOG_EX(LOG_Error, "Decode User Configure Error: %d\n", i); +#endif if(pCfgInfo) { diff --git a/driver/ne_general.c b/driver/ne_general.c index 334b1cb..d93ea5a 100644 --- a/driver/ne_general.c +++ b/driver/ne_general.c @@ -279,7 +279,7 @@ static int32 ne_general_local_process(uint8 *input, uint32 ilen) GENERAL_LOG_EX(LOG_Info, "start apconfig\r\n"); /* get mcu product id - save to flash - set init flag */ - set_platform_product_id(input + 1, 4); +// set_platform_product_id(input + 1, 4); ne_cfg_set_init_type(NE_DEVICE_APCONFIG); wifi_station_disconnect(); @@ -432,6 +432,42 @@ static int32 ne_general_local_process(uint8 *input, uint32 ilen) HAL_Free(pBuf); } + break; + case NE_DEVICE_GENERAL_CMD_GET_DEVICENAME: + { + uint32 slen; + ne_general_rsp_data_t rsp_data; + const char* pId = USR_CFG_DEVICE_NAME(); + unsigned char proBuf[36]; + unsigned char* pBuf = (unsigned char*)HAL_Malloc(strlen(pId) + NE_GENERAL_MAX_SBUF_LEN); + + if(pBuf) { + memset(proBuf, 0, 36); + proBuf[0] = NE_DEVICE_GENERAL_CMD_GET_DEVICENAME; + memcpy(proBuf + 1, pId, strlen(pId)); + slen = ne_general_create_frame(NE_DEVICE_GENERAL_WIFI_PROCESS, + proBuf, + strlen(pId) + 1, + pBuf, + NE_GENERAL_MAX_SBUF_LEN); + } else { + rsp_data.msgtype = NE_DEVICE_GENERAL_CMD_GET_DEVICENAME; + rsp_data.result = NE_GENERAL_FAIL; + + slen = ne_general_create_frame(NE_DEVICE_GENERAL_WIFI_PROCESS, + (uint8_t *)&rsp_data, + sizeof(rsp_data), + pBuf, + NE_GENERAL_MAX_SBUF_LEN); + } + + if(slen < 0){ + GENERAL_LOG_EX(LOG_Error, "create frame fail!\r\n"); + } + ne_general_write(NULL, pBuf, slen); + + HAL_Free(pBuf); + } break; default: diff --git a/include/cfg.h b/include/cfg.h index 325494d..3f1c115 100644 --- a/include/cfg.h +++ b/include/cfg.h @@ -218,6 +218,7 @@ typedef struct int Version; int FactoryMode; int DeviceType; + char* DeviceName; SERVER_CFG ServerCfg; SOFTAP_CONFIG SoftAP; WIFIAP_CONFIG WifiAP; @@ -239,6 +240,7 @@ PUSER_CONFIG ne_cfg_get_user_cfg(void); #define USR_CFG_FACTORY_MODE() (ne_cfg_get_user_cfg()->FactoryMode) #define USR_CFG_DEVICE_TYPE() (ne_cfg_get_user_cfg()->DeviceType) +#define USR_CFG_DEVICE_NAME() (ne_cfg_get_user_cfg()->DeviceName) #define USR_CFG_SERVER(key) (ne_cfg_get_user_cfg()->ServerCfg.key) #define USR_CFG_WIFIAP(key) (ne_cfg_get_user_cfg()->WifiAP.key) #define USR_CFG_SOFTAP(key) (ne_cfg_get_user_cfg()->SoftAP.key) diff --git a/include/ne_general.h b/include/ne_general.h index f3904ef..18aba93 100644 --- a/include/ne_general.h +++ b/include/ne_general.h @@ -62,6 +62,7 @@ enum{ NE_DEVICE_GENERAL_CMD_RESET_WIFI, NE_DEVICE_GENERAL_CMD_GET_VERSION, NE_DEVICE_GENERAL_CMD_GET_CHIPID, + NE_DEVICE_GENERAL_CMD_GET_DEVICENAME, }; #pragma pack (1) diff --git a/include/user_main.h b/include/user_main.h index bf02f65..0f91912 100644 --- a/include/user_main.h +++ b/include/user_main.h @@ -55,6 +55,7 @@ typedef enum ERR_ERASE_FLASH = 1500, ERR_WRITE_FLASH, ERR_READ_FLASH, + ERR_BAD_CFG_FILE, ERR_GPIO_NOT_SUPPORT = 1600, ERR_GPIO_NOT_CONFIG, diff --git a/jsprase/json_prase.c b/jsprase/json_prase.c index 908ab6b..cb09b70 100644 --- a/jsprase/json_prase.c +++ b/jsprase/json_prase.c @@ -431,6 +431,8 @@ static const char* __userCfg2Json(void* pData) cJSON_AddItemToObject(pRoot, "FactoryMode", cJSON_CreateNumber(pCfg->FactoryMode)); cJSON_AddItemToObject(pRoot, "DeviceType", cJSON_CreateNumber(pCfg->DeviceType)); + cJSON_AddItemToObject(pRoot, "DeviceName", cJSON_CreateString(pCfg->DeviceName)); + cJSON_AddItemToObject(pRoot, "ServerCfg", pSvrCfg); cJSON_AddItemToObject(pRoot, "WIFIApConfig", pWifiApCfg); cJSON_AddItemToObject(pRoot, "SoftAP", pSoftApCfg); @@ -498,7 +500,7 @@ static const char* __userCfg2Json(void* pData) pJsonS = cJSON_Print(pRoot); cJSON_Delete(pRoot); - + return pJsonS; } @@ -528,7 +530,8 @@ static void* __json2UserCfg(const char* pJsonS) pCfg->Version = __getIntValue(pRoot, "Version", USER_CFG_VERSION); pCfg->FactoryMode = __getIntValue(pRoot, "FactoryMode", 0); pCfg->DeviceType = __getIntValue(pRoot, "DeviceType", 1); - + pCfg->DeviceName = __getStringValue(pRoot, "DeviceName", "MC01"); + pItem = cJSON_GetObjectItem(pRoot, "ServerCfg"); if(pItem) @@ -565,7 +568,7 @@ static void* __json2UserCfg(const char* pJsonS) pCfg->SoftAP.softAPDHCP.DHCPEndIP = __getStringValue(pObj, "DHCPEndIP", "192.168.5.105"); } } - + pItem = cJSON_GetObjectItem(pRoot, "UART"); if(pItem) @@ -619,7 +622,7 @@ static void* __json2UserCfg(const char* pJsonS) pList = pList->next; } } - + cJSON_Delete(pRoot); return pCfg; } diff --git a/protocol/protocol.c b/protocol/protocol.c index ea5cd52..840d739 100644 --- a/protocol/protocol.c +++ b/protocol/protocol.c @@ -243,9 +243,12 @@ int ProtocolOnMsg(PCLOUND_API pApi) memset(&devId, 0, sizeof(RSP_GET_DEVID_PRO)); devId.cpuId = (char*)GetPlatformDevId(); devId.macAddr = (char *)GetSTAMacAddr(); + devId.productSign = USR_CFG_DEVICE_NAME(); +#if 0 if(ne_cfg_get_product_id(product_id, sizeof(product_id)) == ERR_OK){ devId.productSign = product_id; } +#endif pSubMsg = (char*)Struct2Json(&devId, JE_GETID, CRYPTO_NONE, &err); if(err != ERR_OK || pSubMsg == NULL)