diff --git a/build/devattestconfig.gni b/build/devattestconfig.gni index 2872f61..0aafcf7 100644 --- a/build/devattestconfig.gni +++ b/build/devattestconfig.gni @@ -17,6 +17,7 @@ devattest_innerkit_path = "${devattest_path}/interfaces/innerkits" attest_core_path = "${devattest_path}/services/core" +devattest_unittest_module_path = "device_attest/device_attest" declare_args() { attest_release = "attest_release" attest_debug = "attest_debug" @@ -27,10 +28,10 @@ declare_args() { attest_build_target = attest_release # using mock network authentication data - enable_attest_mock_network = false + enable_attest_test_mock_network = false # using mock setting device data - enable_attest_mock_device = false + enable_attest_test_mock_device = false # check for memory leaks enable_attest_debug_memory_leak = false @@ -43,6 +44,12 @@ declare_args() { # 集成轻量设备授权验证模块 integrate_attest_mini_module = true + + # 域名增强关闭 + disable_attest_active_site = false + + # token预置方案 + enable_attest_preset_token = false } declare_args() { diff --git a/interfaces/innerkits/attest_result_info.h b/interfaces/innerkits/attest_result_info.h index 80fb188..18bec78 100644 --- a/interfaces/innerkits/attest_result_info.h +++ b/interfaces/innerkits/attest_result_info.h @@ -23,7 +23,16 @@ extern "C" { #endif #endif -#define SOFTWARE_RESULT_DETAIL_SIZE 5 +#define SOFTWARE_RESULT_DETAIL_SIZE 5 +#define MAX_ATTEST_RESULT_SIZE (SOFTWARE_RESULT_DETAIL_SIZE + 2) + +typedef enum { + SOFTWARE_RESULT_VERSIONID, + SOFTWARE_RESULT_PATCHLEVEL, + SOFTWARE_RESULT_ROOTHASH, + SOFTWARE_RESULT_PCID, + SOFTWARE_RESULT_RESERVE, +} SOFTWARE_RESULT_DETAIL_TYPE; typedef struct { int32_t authResult; diff --git a/services/core/BUILD.gn b/services/core/BUILD.gn index 3760ad6..e5bde1e 100644 --- a/services/core/BUILD.gn +++ b/services/core/BUILD.gn @@ -15,10 +15,6 @@ import("//build/lite/config/component/lite_component.gni") import("//test/xts/device_attest_lite/build/devattestconfig.gni") import("attestsource.gni") -if (enable_attest_mock_network && enable_attest_mock_device) { - sources_common += [ "${devattest_path}/test/unittest/src/attest_mock.c" ] -} - if (enable_attest_debug_memory_leak) { sources_common += [ "utils/attest_utils_memleak.c" ] } @@ -37,11 +33,11 @@ config("devattest_core_config") { defines += [ "__ATTEST_HILOG_LEVEL_DEBUG__" ] } - if (enable_attest_mock_network) { + if (enable_attest_test_mock_network) { defines += [ "__ATTEST_MOCK_NETWORK_STUB__" ] } - if (enable_attest_mock_device) { + if (enable_attest_test_mock_device) { defines += [ "__ATTEST_MOCK_DEVICE_STUB__" ] } @@ -52,6 +48,11 @@ config("devattest_core_config") { if (enable_attest_debug_dfx) { defines += [ "__ATTEST_DEBUG_DFX__" ] } + + if (disable_attest_active_site) { + defines += [ "__ATTEST_DISABLE_SITE__" ] + } + defines += [ "MBEDTLS_ALLOW_PRIVATE_ACCESS" ] } diff --git a/services/core/adapter/attest_adapter.c b/services/core/adapter/attest_adapter.c index ec9bcf2..6c6cb8a 100644 --- a/services/core/adapter/attest_adapter.c +++ b/services/core/adapter/attest_adapter.c @@ -21,7 +21,17 @@ // 是否存在重置标记 bool AttestIsResetFlagExist(void) { - return OEMIsFlagExist(OEM_FLAG_RESET); + bool isExist = OEMIsFlagExist(OEM_FLAG_RESET); + if (!isExist) { + return false; + } +#if !defined(__ATTEST_ENABLE_PRESET_TOKEN__) + TokenInfo tokenInfo; + if (AttestReadToken(&tokenInfo) == TOKEN_UNPRESET) { + return false; + } +#endif + return true; } // 创建重置标记 diff --git a/services/core/adapter/attest_adapter_hal.c b/services/core/adapter/attest_adapter_hal.c index 86d1d49..ecc974d 100644 --- a/services/core/adapter/attest_adapter_hal.c +++ b/services/core/adapter/attest_adapter_hal.c @@ -75,10 +75,16 @@ int32_t AttestWriteToken(TokenInfo* tokenInfo) return ATTEST_ERR; } int32_t ret = 0; + unsigned int len = 0; +#ifdef __LITEOS_M__ + len = TOKEN_ENCRYPT_LEN; +#else + len = sizeof(token); +#endif if (ATTEST_MOCK_DEVICE_STUB_FLAG) { - ret = OsWriteTokenStub(token, sizeof(token)); + ret = OsWriteTokenStub(token, len); } else { - ret = HalWriteToken(token, sizeof(token)); + ret = HalWriteToken(token, len); } if (ret != ATTEST_OK) { @@ -96,10 +102,16 @@ int32_t AttestReadToken(TokenInfo* tokenInfo) } char token[TOKEN_ENCRYPT_LEN + 1] = {0}; int32_t ret = 0; + unsigned int len = 0; +#ifdef __LITEOS_M__ + len = TOKEN_ENCRYPT_LEN; +#else + len = sizeof(token); +#endif if (ATTEST_MOCK_DEVICE_STUB_FLAG) { - ret = OsReadTokenStub(token, sizeof(token)); + ret = OsReadTokenStub(token, len); } else { - ret = HalReadToken(token, sizeof(token)); + ret = HalReadToken(token, len); } if (ret != ATTEST_OK) { diff --git a/services/core/adapter/attest_adapter_mock.c b/services/core/adapter/attest_adapter_mock.c index 7a6ef77..2ef5759 100644 --- a/services/core/adapter/attest_adapter_mock.c +++ b/services/core/adapter/attest_adapter_mock.c @@ -138,6 +138,11 @@ char* OsGetSecurityPatchTagStub(void) return GetDeviceParaStub("securityPatchTag"); } +char* OsGetSerialStub(void) +{ + return GetDeviceParaStub("serial"); +} + static int32_t OsGetUnencryptedUdidStub(char **outputBuff, int32_t *outputSize) { char* manufacture = NULL; @@ -175,7 +180,7 @@ static int32_t OsGetUnencryptedUdidStub(char **outputBuff, int32_t *outputSize) ret = ATTEST_ERR; break; } - ATTEST_LOG_INFO_ANONY("[OsGetUnencryptedUdidStub] udid = %s", udid); + ATTEST_LOG_INFO("[OsGetUnencryptedUdidStub] udid = %s", udid); } while (0); ATTEST_MEM_FREE(manufacture); ATTEST_MEM_FREE(model); @@ -191,6 +196,10 @@ static int32_t OsGetUnencryptedUdidStub(char **outputBuff, int32_t *outputSize) char* OsGetUdidStub(void) { + char *udidStub = GetDeviceParaStub("udid"); + if (udidStub != NULL) { + return udidStub; + } char *udid = NULL; char *udidSha256 = NULL; int32_t udidSize = 0; @@ -208,13 +217,16 @@ char* OsGetUdidStub(void) ret = ATTEST_ERR; break; } - - ret = Sha256Value((const unsigned char *)udid, udidSize, udidSha256, UDID_STRING_LEN + 1); + ret = Sha256Value((const unsigned char *)udid, udidSize - 1, udidSha256, UDID_STRING_LEN + 1); if (ret != ATTEST_OK) { ATTEST_LOG_ERROR("[OsGetUdidStub] failed to Sha256"); ATTEST_MEM_FREE(udidSha256); break; } + ret = ToLowerStr(udidSha256, UDID_STRING_LEN + 1); + if (ret != ATTEST_OK) { + break; + } } while (0); ATTEST_MEM_FREE(udid); if (ret != ATTEST_OK) { @@ -222,7 +234,7 @@ char* OsGetUdidStub(void) return NULL; } - ATTEST_LOG_INFO_ANONY("[OsGetUdidStub] Sha256(udid) = %s\n", udidSha256); + ATTEST_LOG_INFO("[OsGetUdidStub] Sha256(udid) = %s\n", udidSha256); return udidSha256; } @@ -231,17 +243,13 @@ int OsGetAcKeyStub(char *acKey, unsigned int len) if ((acKey == NULL) || (len == 0)) { return ATTEST_ERR; } - const char manufacturekeyBuf[] = { - 0x13, 0x42, 0x3F, 0x3F, 0x53, 0x3F, 0x72, 0x30, 0x3F, 0x3F, 0x1C, 0x3F, 0x2F, 0x3F, 0x2E, 0x42, - 0x3F, 0x08, 0x3F, 0x57, 0x3F, 0x10, 0x3F, 0x3F, 0x29, 0x17, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x57, 0x16, 0x3F, 0x7D, 0x4A, 0x0F, 0x3F, 0x3F, 0x3F, 0x30, 0x0C, 0x3F, 0x3F, 0x4C, 0x3F, 0x47 - }; - uint32_t manufacturekeyBufLen = sizeof(manufacturekeyBuf); - if (len < manufacturekeyBufLen) { + + char *manufacturekeyBuf = GetDeviceParaStub("manuKey"); + if (manufacturekeyBuf == NULL) { return ATTEST_ERR; } - - int ret = memcpy_s(acKey, len, manufacturekeyBuf, manufacturekeyBufLen); + int ret = HEXStringToAscii(manufacturekeyBuf, strlen(manufacturekeyBuf), acKey, len); + ATTEST_MEM_FREE(manufacturekeyBuf); return ret; } @@ -250,13 +258,18 @@ int OsGetProdIdStub(char* productId, uint32_t len) if ((productId == NULL) || (len == 0)) { return ATTEST_ERR; } - const char productIdBuf[] = "OH00000D"; + char *productIdBuf = GetDeviceParaStub("productId"); + if (productIdBuf == NULL) { + return ATTEST_ERR; + } uint32_t productIdLen = strlen(productIdBuf); if (len < productIdLen) { + ATTEST_MEM_FREE(productIdBuf); return ATTEST_ERR; } int ret = memcpy_s(productId, len, productIdBuf, productIdLen); + ATTEST_MEM_FREE(productIdBuf); return ret; } @@ -265,13 +278,19 @@ int OsGetProdKeyStub(char* productKey, uint32_t len) if ((productKey == NULL) || (len == 0)) { return ATTEST_ERR; } - const char productKeyBuf[] = "test"; - uint32_t productKeyLen = sizeof(productKeyBuf); + + char *productKeyBuf = GetDeviceParaStub("productKey"); + if (productKeyBuf == NULL) { + return ATTEST_ERR; + } + uint32_t productKeyLen = strlen(productKeyBuf); if (len < productKeyLen) { + ATTEST_MEM_FREE(productKeyBuf); return ATTEST_ERR; } int ret = memcpy_s(productKey, len, productKeyBuf, productKeyLen); + ATTEST_MEM_FREE(productKeyBuf); return ret; } @@ -281,8 +300,9 @@ int32_t OsReadTokenStub(char* buffer, uint32_t bufferLen) return ATTEST_ERR; } int32_t ret = ReadFile(ATTEST_MOCK_STUB_PATH, ATTEST_MOCK_TOKEN_FILE_NAME, buffer, bufferLen); - if (ret != 0) { - return ATTEST_ERR; + if (ret != ATTEST_OK) { + // token file does not exist, shuold return TOKEN_UNPRESET + return TOKEN_UNPRESET; } return ATTEST_OK; } diff --git a/services/core/adapter/attest_adapter_oem.c b/services/core/adapter/attest_adapter_oem.c index f4a2bf6..811d1f7 100644 --- a/services/core/adapter/attest_adapter_oem.c +++ b/services/core/adapter/attest_adapter_oem.c @@ -122,5 +122,8 @@ int32_t OEMWriteAuthResultCode(const char* data, uint32_t len) // 读取认证结果 int32_t OEMReadAuthResultCode(char* buffer, uint32_t bufferLen) { + if (!IsFileExist(AUTH_RESULT_PATH, AUTH_RESULT_CODE_FILE_NAME)) { + return ATTEST_ERR; + } return ReadFile(AUTH_RESULT_PATH, AUTH_RESULT_CODE_FILE_NAME, buffer, bufferLen); } diff --git a/services/core/adapter/attest_adapter_property.c b/services/core/adapter/attest_adapter_property.c index 8c3533d..518dbef 100644 --- a/services/core/adapter/attest_adapter_property.c +++ b/services/core/adapter/attest_adapter_property.c @@ -82,5 +82,8 @@ char* AttestGetUdid(void) char* AttestGetSerial(void) { + if (ATTEST_MOCK_DEVICE_STUB_FLAG) { + return OsGetSerialStub(); + } return OsGetSerial(); } diff --git a/services/core/attest/attest_service.c b/services/core/attest/attest_service.c index 3949a47..736e0b6 100644 --- a/services/core/attest/attest_service.c +++ b/services/core/attest/attest_service.c @@ -303,7 +303,7 @@ static int32_t ProcAttestImpl(void) DestroySysData(); return ATTEST_ERR; } - // 检查本地数据是否修改或过期,进行重新认证 + // 检查本地数据是否修改或过期,进行重新验证 if (!IsAuthStatusChg()) { ATTEST_LOG_WARN("[ProcAttestImpl] There is no change on auth status."); UpdateAuthResultCode(AUTH_SUCCESS); @@ -316,6 +316,7 @@ static int32_t ProcAttestImpl(void) DestroySysData(); return ATTEST_ERR; } + // 走授权验证流程 ret = AttestStartup(authResult); DestroySysData(); DestroyAuthResult(&authResult); @@ -327,11 +328,11 @@ int32_t ProcAttest(void) pthread_mutex_lock(&g_mtxAttest); PrintCurrentTime(); int32_t ret; + int32_t retValue; if (ATTEST_DEBUG_MEMORY_LEAK) { - ret = InitMemNodeList(); - ATTEST_LOG_INFO("[ProcAttest] Init mem node list, ret = %d.", ret); + retValue = InitMemNodeList(); + ATTEST_LOG_INFO("[ProcAttest] Init mem node list, retValue = %d.", retValue); } - do { // init network server info ret = InitNetworkServerInfo(); @@ -345,18 +346,17 @@ int32_t ProcAttest(void) ATTEST_LOG_ERROR("[ProcAttest] Connect wise device failed, ret = %d.", ret); break; } - + // 主流程 ret = ProcAttestImpl(); if (ret != ATTEST_OK) { ATTEST_LOG_ERROR("[ProcAttest] Proc Attest failed, ret = %d.", ret); } DisConnectWiseDevice(); } while (0); - if (ATTEST_DEBUG_MEMORY_LEAK) { PrintMemNodeList(); - ret = DestroyMemNodeList(); - ATTEST_LOG_INFO("[ProcAttest] Destroy mem node list, ret = %d.", ret); + retValue = DestroyMemNodeList(); + ATTEST_LOG_INFO("[ProcAttest] Destroy mem node list, retValue = %d.", retValue); } PrintCurrentTime(); pthread_mutex_unlock(&g_mtxAttest); diff --git a/services/core/attest/attest_service_active.c b/services/core/attest/attest_service_active.c index 47f28bd..f115ddc 100644 --- a/services/core/attest/attest_service_active.c +++ b/services/core/attest/attest_service_active.c @@ -48,9 +48,9 @@ int32_t GenActiveMsg(AuthResult* authResult, const ChallengeResult* challengeRes // 获取tokenId和tokenValue(hdmac加密) uint8_t tokenId[TOKEN_ID_LEN + 1] = {0}; uint8_t tokenValueHmac[TOKEN_VALUE_HMAC_LEN + 1] = {0}; - if (GetTokenValueHmac((const char*)(challengeResult->challenge), tokenValueHmac, TOKEN_VALUE_HMAC_LEN) != 0 || - GetTokenId(tokenId, TOKEN_ID_LEN) != 0) { - ATTEST_LOG_ERROR("[GenActiveMsg] Get tokenId or tokenValue failed."); + int32_t ret = GetTokenValueAndId(challengeResult->challenge, tokenValueHmac, TOKEN_VALUE_HMAC_LEN,\ + tokenId, TOKEN_ID_LEN); + if (ret != ATTEST_OK) { return ATTEST_ERR; } @@ -107,7 +107,7 @@ int32_t ParseActiveResult(const char* jsonStr) return ATTEST_ERR; } if ((int32_t)errorCode != ATTEST_OK) { - ATTEST_LOG_ERROR("[ParseActiveResult] -errorCode = %d.", -(int32_t)(errorCode)); + ATTEST_LOG_ERROR("[ParseActiveResult] errorCode = %d.", -(int32_t)(errorCode)); return -(int32_t)((errorCode)); } return ATTEST_OK; diff --git a/services/core/attest/attest_service_auth.c b/services/core/attest/attest_service_auth.c index d88ed69..0f542fe 100644 --- a/services/core/attest/attest_service_auth.c +++ b/services/core/attest/attest_service_auth.c @@ -36,7 +36,7 @@ bool IsAuthStatusChg(void) ATTEST_LOG_DEBUG("[IsAuthStatusChg] Begin."); char* authStatusBase64 = NULL; if (GetAuthStatus(&authStatusBase64) != ATTEST_OK) { - ATTEST_LOG_ERROR("[IsAuthStatusChg] Load auth status failed or status file not exist"); + ATTEST_LOG_WARN("[IsAuthStatusChg] Load auth status failed or status file not exist"); return true; } @@ -121,11 +121,15 @@ int32_t GetAttestStatusPara(void) char attestResult[AUTH_RESULT_LEN] = {0}; int ret = AttestGetParameter(STARTSUP_PARA_ATTEST_KEY, STARTSUP_PARA_ATTEST_ERROR, attestResult, sizeof(attestResult)); - if ((ret != 0) && (strcmp(STARTSUP_PARA_ATTEST_OK, attestResult) == 0)) { + if (ret == 0) { + ATTEST_LOG_ERROR("[GetAttestStatusPara] failed to get parameter."); + return ATTEST_ERR; + } + if (strcmp(STARTSUP_PARA_ATTEST_OK, attestResult) == 0) { ATTEST_LOG_INFO("[GetAttestStatusPara] success, persist.xts.devattest.authresult = %s", attestResult); return ATTEST_OK; } - ATTEST_LOG_WARN("[GetAttestStatusPara] failed."); + ATTEST_LOG_WARN("[GetAttestStatusPara] failed, persist.xts.devattest.authresult = ", attestResult); return ATTEST_ERR; } @@ -856,9 +860,9 @@ int32_t GenAuthMsg(const ChallengeResult* challengeResult, DevicePacket** devPac uint8_t tokenValueHmac[TOKEN_VALUE_HMAC_LEN + 1] = {0}; uint8_t tokenId[TOKEN_ID_LEN + 1] = {0}; - if (GetTokenValueHmac(challengeResult->challenge, tokenValueHmac, TOKEN_VALUE_HMAC_LEN) != 0 || - GetTokenId(tokenId, TOKEN_ID_LEN) != 0) { - ATTEST_LOG_ERROR("[GenAuthMsg] Get TokenId or TokenValueHmac failed"); + int32_t ret = GetTokenValueAndId(challengeResult->challenge, tokenValueHmac, TOKEN_VALUE_HMAC_LEN,\ + tokenId, TOKEN_ID_LEN); + if (ret != ATTEST_OK) { return ATTEST_ERR; } @@ -874,7 +878,7 @@ int32_t GenAuthMsg(const ChallengeResult* challengeResult, DevicePacket** devPac devicePacket->tokenInfo.uuid = AttestStrdup((char*)tokenId); devicePacket->tokenInfo.token = AttestStrdup((char*)tokenValueHmac); devicePacket->pcid = StrdupDevInfo(PCID); - int32_t ret = PackProductInfo(&devicePacket->productInfo); + ret = PackProductInfo(&devicePacket->productInfo); if (ret != ATTEST_OK) { ATTEST_LOG_ERROR("[GenAuthMsg] Pack ProductInfo failed."); FREE_DEVICE_PACKET(devicePacket); diff --git a/services/core/attest/attest_service_challenge.c b/services/core/attest/attest_service_challenge.c index ac7cd76..c7ee092 100644 --- a/services/core/attest/attest_service_challenge.c +++ b/services/core/attest/attest_service_challenge.c @@ -96,7 +96,7 @@ static int32_t ParseChallengeResult(const char* jsonStr, ChallengeResult* challe return ATTEST_ERR; } if ((int32_t)errorCode != ATTEST_OK) { - ATTEST_LOG_ERROR("[ParseChallengeResult] -errorCode = %d.", -(int32_t)(errorCode)); + ATTEST_LOG_ERROR("[ParseChallengeResult] errorCode = %d.", -(int32_t)(errorCode)); return -(int32_t)(errorCode); } @@ -110,6 +110,7 @@ static int32_t ParseChallengeResult(const char* jsonStr, ChallengeResult* challe ATTEST_LOG_ERROR("[ParseChallengeResult] GetObjectItem challenge failed."); return ATTEST_ERR; } +#ifndef __ATTEST_DISABLE_SITE__ char* serverInfo = NULL; do { ret = GetObjectItemValueObject(jsonStr, "serverInfo", &serverInfo); @@ -129,6 +130,7 @@ static int32_t ParseChallengeResult(const char* jsonStr, ChallengeResult* challe } } while (0); ATTEST_MEM_FREE(serverInfo); +#endif return ret; } diff --git a/services/core/attest/attest_service_device.c b/services/core/attest/attest_service_device.c index 86ed256..5b35370 100644 --- a/services/core/attest/attest_service_device.c +++ b/services/core/attest/attest_service_device.c @@ -21,7 +21,7 @@ #include "attest_service_device.h" char* g_devSysInfos[SYS_DEV_MAX] = {NULL}; -const char* g_devSysInfosStr[] = { +const char* g_devSysInfosStr[SYS_DEV_MAX] = { "VERSION_ID", "ROOT_HASH", "DISPLAY_VERSION", @@ -36,7 +36,7 @@ const char* g_devSysInfosStr[] = { "PCID", }; -SetDataFunc g_setDataFunc[] = { +SetDataFunc g_setDataFunc[SYS_DEV_MAX] = { &AttestGetVersionId, &AttestGetBuildRootHash, &AttestGetDisplayVersion, @@ -51,6 +51,35 @@ SetDataFunc g_setDataFunc[] = { &GetPcid, }; +size_t g_devSysInfosMaxLen[SYS_DEV_MAX] = { + MAX_ATTEST_VERSION_ID_LEN, + MAX_ATTEST_DEFAULT_LEN, + MAX_ATTEST_DISPLAY_VERSION_LEN, + MAX_ATTEST_MANUFACTURE_LEN, + MAX_ATTEST_MODEL_LEN, + MAX_ATTEST_BRAND_LEN, + MAX_ATTEST_PATCH_LEN, + MAX_ATTEST_DEFAULT_LEN, + MAX_ATTEST_DEFAULT_LEN, + MAX_ATTEST_DEFAULT_LEN, + MAX_ATTEST_DEFAULT_LEN, + MAX_ATTEST_DEFAULT_LEN, +}; + +/* 根据PCS表检查长度 */ +static int32_t CheckSysInfosLength(SYS_DEV_TYPE_E type, size_t sysInfosLength) +{ + if (type == ROOT_HASH || type == UDID || type == RANDOM_UUID ||\ + type == APP_ID || type == TENANT_ID || type == PCID) { + return ATTEST_OK; + } + if (sysInfosLength > g_devSysInfosMaxLen[type]) { + ATTEST_LOG_ERROR("[CheckSysInfosLength] The length of sysInfo type %d exceeds limit", type); + return ATTEST_ERR; + } + return ATTEST_OK; +} + static int32_t SetSysData(SYS_DEV_TYPE_E type) { if (type >= SYS_DEV_MAX) { @@ -58,13 +87,17 @@ static int32_t SetSysData(SYS_DEV_TYPE_E type) } SetDataFunc setDataFunc = g_setDataFunc[type]; if (setDataFunc == NULL) { - ATTEST_LOG_ERROR("[SetSysData] g_setDataFunc failed"); + ATTEST_LOG_ERROR("[SetSysData] g_setDataFunc failed, type = %d", type); return ATTEST_ERR; } char* value = setDataFunc(); if (value == NULL) { - ATTEST_LOG_ERROR("[SetSysData] set Data failed"); + ATTEST_LOG_ERROR("[SetSysData] set Data failed, type = %d", type); + return ATTEST_ERR; + } + + if (CheckSysInfosLength(type, strlen(value)) != ATTEST_OK) { return ATTEST_ERR; } @@ -100,7 +133,7 @@ static void PrintDevSysInfo(void) static void VerifyUDID(void) { - char *udidSrc = AttestGetUdid(); + char *udidSrc = g_devSysInfos[UDID]; if (udidSrc == NULL) { ATTEST_LOG_ERROR("[VerifyUDID] Failed to get udidSrc"); return; @@ -108,14 +141,12 @@ static void VerifyUDID(void) char *udidDest = (char *)GetUdidForVerification(); if (udidDest == NULL) { ATTEST_LOG_ERROR("[VerifyUDID] Failed to get udidDest"); - ATTEST_MEM_FREE(udidSrc); return; } if (strcmp(udidSrc, udidDest) != 0) { ATTEST_LOG_ERROR("[VerifyUDID] udid is invalid"); } - ATTEST_MEM_FREE(udidSrc); ATTEST_MEM_FREE(udidDest); return; } @@ -143,14 +174,13 @@ int32_t InitSysData(void) void DestroySysData(void) { - if (IsSysDataEmpty()) { - return; - } - for (int32_t i = 0; i < SYS_DEV_MAX; i++) { - (void)memset_s(g_devSysInfos[i], strlen(g_devSysInfos[i]), 0, strlen(g_devSysInfos[i])); - ATTEST_MEM_FREE(g_devSysInfos[i]); + if (g_devSysInfos[i] != NULL) { + (void)memset_s(g_devSysInfos[i], strlen(g_devSysInfos[i]), 0, strlen(g_devSysInfos[i])); + ATTEST_MEM_FREE(g_devSysInfos[i]); + } } + return; } // StrdupDevInfo 涉及申请内存,需要外部释放 @@ -208,11 +238,11 @@ char* GetRandomUuid(void) } static unsigned char* GetUdidDecrypted(void) { - char *enShortName = AttestGetManufacture(); + char *enShortName = StrdupDevInfo(MANU_FACTURE); if (enShortName == NULL) { return NULL; } - char *model = AttestGetProductModel(); + char *model = StrdupDevInfo(PRODUCT_MODEL); if (model == NULL) { ATTEST_MEM_FREE(enShortName); return NULL; @@ -229,9 +259,7 @@ static unsigned char* GetUdidDecrypted(void) unsigned char *udid = NULL; int32_t ret = ATTEST_ERR; do { - if ((strlen(enShortName) > MAX_ATTEST_MANUFACTURE_LEN) || \ - (strlen(model) > MAX_ATTEST_MODEL_LEN) || \ - (strlen(sn) > MAX_ATTEST_SERIAL_LEN)) { + if (strlen(sn) > MAX_ATTEST_SERIAL_LEN) { break; } int32_t udidSize = enShortNameLen + modelLen + snLen + 1; diff --git a/services/core/attest/attest_service_reset.c b/services/core/attest/attest_service_reset.c index 2383694..f8e3b8b 100644 --- a/services/core/attest/attest_service_reset.c +++ b/services/core/attest/attest_service_reset.c @@ -36,12 +36,12 @@ int32_t GenResetMsg(ChallengeResult* challengeResult, DevicePacket** devPacket) uint8_t tokenId[TOKEN_ID_LEN + 1] = {0}; uint8_t tokenValueHmac[TOKEN_VALUE_HMAC_LEN + 1] = {0}; - if (GetTokenValueHmac(challengeResult->challenge, tokenValueHmac, TOKEN_VALUE_HMAC_LEN) != ATTEST_OK || - GetTokenId(tokenId, TOKEN_ID_LEN) != ATTEST_OK) { - ATTEST_LOG_ERROR("[GenResetMsg] Get device token failed."); + int32_t ret = GetTokenValueAndId(challengeResult->challenge, tokenValueHmac, TOKEN_VALUE_HMAC_LEN,\ + tokenId, TOKEN_ID_LEN); + if (ret != ATTEST_OK) { return ATTEST_ERR; } - + DevicePacket* devicePacket = CreateDevicePacket(); if (devicePacket == NULL) { ATTEST_LOG_ERROR("[GenResetMsg] Create DevicePacket failed."); @@ -94,7 +94,7 @@ int32_t ParseResetResult(const char* jsonStr) return ATTEST_ERR; } if ((int32_t)errorCode != ATTEST_OK) { - ATTEST_LOG_ERROR("[ParseResetResult] -errorCode = %d.", -(int32_t)errorCode); + ATTEST_LOG_ERROR("[ParseResetResult] errorCode = %d.", -(int32_t)errorCode); return -(int32_t)(errorCode); } return ATTEST_OK; diff --git a/services/core/attest_entry.c b/services/core/attest_entry.c index f6b2325..a29ea1e 100644 --- a/services/core/attest_entry.c +++ b/services/core/attest_entry.c @@ -85,6 +85,7 @@ static void AttestAuthCallBack(void *argv) int32_t AttestTask(void) { ATTEST_LOG_INFO("[AttestTask] Begin."); + // 执行主流程代码 int32_t ret = ProcAttest(); if (ret != ATTEST_OK) { ATTEST_LOG_ERROR("[AttestTask] Proc failed ret = %d.", ret); diff --git a/services/core/attest_entry.h b/services/core/attest_entry.h index 07fe9b9..3b6df28 100644 --- a/services/core/attest_entry.h +++ b/services/core/attest_entry.h @@ -25,17 +25,6 @@ extern "C" { #endif #endif /* __cplusplus */ -#define SOFTWARE_RESULT_DETAIL_SIZE 5 -#define MAX_ATTEST_RESULT_SIZE (SOFTWARE_RESULT_DETAIL_SIZE + 2) - -typedef enum { - SOFTWARE_RESULT_VERSIONID, - SOFTWARE_RESULT_PATCHLEVEL, - SOFTWARE_RESULT_ROOTHASH, - SOFTWARE_RESULT_PCID, - SOFTWARE_RESULT_RESERVE, -} SOFTWARE_RESULT_DETAIL_TYPE; - int32_t AttestTask(void); int32_t EntryGetAttestStatus(AttestResultInfo* attestResultInfo); diff --git a/services/core/include/adapter/attest_adapter_mock.h b/services/core/include/adapter/attest_adapter_mock.h index 8be7df3..84a7b28 100644 --- a/services/core/include/adapter/attest_adapter_mock.h +++ b/services/core/include/adapter/attest_adapter_mock.h @@ -67,6 +67,8 @@ char* OsGetBrandStub(void); char* OsGetSecurityPatchTagStub(void); +char* OsGetSerialStub(void); + char* OsGetUdidStub(void); int OsGetAcKeyStub(char *acKey, unsigned int len); diff --git a/services/core/include/attest/attest_service_active.h b/services/core/include/attest/attest_service_active.h index 40df27f..db514e3 100644 --- a/services/core/include/attest/attest_service_active.h +++ b/services/core/include/attest/attest_service_active.h @@ -16,6 +16,8 @@ #ifndef __ATTEST_SERVICE_ACTIVE_H__ #define __ATTEST_SERVICE_ACTIVE_H__ +#include "attest_type.h" + #ifdef __cplusplus #if __cplusplus extern "C" { diff --git a/services/core/include/attest/attest_service_auth.h b/services/core/include/attest/attest_service_auth.h index 8b768b1..04f01a8 100644 --- a/services/core/include/attest/attest_service_auth.h +++ b/services/core/include/attest/attest_service_auth.h @@ -17,6 +17,7 @@ #define __ATTEST_SERVICE_AUTH_H__ #include +#include "attest_type.h" #ifdef __cplusplus #if __cplusplus diff --git a/services/core/include/attest/attest_service_challenge.h b/services/core/include/attest/attest_service_challenge.h index 1cbf3f0..5504006 100644 --- a/services/core/include/attest/attest_service_challenge.h +++ b/services/core/include/attest/attest_service_challenge.h @@ -16,6 +16,8 @@ #ifndef __ATTEST_SERVICE_CHALLENGE_H__ #define __ATTEST_SERVICE_CHALLENGE_H__ +#include "attest_type.h" + #ifdef __cplusplus #if __cplusplus extern "C" { diff --git a/services/core/include/attest/attest_service_device.h b/services/core/include/attest/attest_service_device.h index 7665da3..1557ee9 100644 --- a/services/core/include/attest/attest_service_device.h +++ b/services/core/include/attest/attest_service_device.h @@ -17,6 +17,16 @@ #define __ATTEST_SERVICE_DEVICE_H__ #include "attest_type.h" +// 最大长度限制 +#define MAX_ATTEST_DEFAULT_LEN 64 + +#define MAX_ATTEST_SERIAL_LEN 64 +#define MAX_ATTEST_VERSION_ID_LEN 255 +#define MAX_ATTEST_DISPLAY_VERSION_LEN 64 +#define MAX_ATTEST_MANUFACTURE_LEN 32 +#define MAX_ATTEST_MODEL_LEN 32 +#define MAX_ATTEST_BRAND_LEN 32 +#define MAX_ATTEST_PATCH_LEN 64 #ifdef __cplusplus #if __cplusplus diff --git a/services/core/include/attest/attest_service_reset.h b/services/core/include/attest/attest_service_reset.h index f9482ac..75ddcf6 100644 --- a/services/core/include/attest/attest_service_reset.h +++ b/services/core/include/attest/attest_service_reset.h @@ -16,6 +16,8 @@ #ifndef __ATTEST_SERVICE_RESET_H__ #define __ATTEST_SERVICE_RESET_H__ +#include "attest_type.h" + #ifdef __cplusplus #if __cplusplus extern "C" { diff --git a/services/core/include/attest_type.h b/services/core/include/attest_type.h index 7d7412c..21f9d24 100644 --- a/services/core/include/attest_type.h +++ b/services/core/include/attest_type.h @@ -67,6 +67,8 @@ extern "C" { #define MAX_ATTEST_MODEL_LEN 32 #define MAX_ATTEST_SERIAL_LEN 64 +#define SHA256_OUTPUT_SIZE 32 + // 认证接口返回值,与json结构一一对应 typedef struct { int32_t errorCode; diff --git a/services/core/include/security/attest_security_token.h b/services/core/include/security/attest_security_token.h index 16ca524..4d62f7a 100644 --- a/services/core/include/security/attest_security_token.h +++ b/services/core/include/security/attest_security_token.h @@ -32,9 +32,8 @@ extern "C" { #define UUID_FORMAT_INDEX_3 16 #define UUID_FORMAT_INDEX_4 20 -int32_t GetTokenValueHmac(const char* challenge, uint8_t* tokenValueHmac, uint8_t tokenValueHmacLen); - -int32_t GetTokenId(uint8_t* tokenId, uint8_t tokenIdLen); +int32_t GetTokenValueAndId(const char* challenge, uint8_t* tokenValueHmac, uint8_t tokenValueHmacLen,\ + uint8_t* tokenId, uint8_t tokenIdLen); int32_t FlushToken(AuthResult* authResult); diff --git a/services/core/include/utils/attest_utils.h b/services/core/include/utils/attest_utils.h index fb4ec82..3769be3 100644 --- a/services/core/include/utils/attest_utils.h +++ b/services/core/include/utils/attest_utils.h @@ -31,6 +31,8 @@ #define DEV_BUF_LENGTH 3 #define HASH_LENGTH 32 +#define ATTEST_EVEN_NUMBER 2 + void AttestMemFree(void **point); #define ATTEST_MEM_FREE(pointer) AttestMemFree((void **)&(pointer)) @@ -51,10 +53,14 @@ void PrintCurrentTime(void); int32_t ToLowerStr(char* str, int len); +int Sha256ValueToAscii(const unsigned char *src, int srcLen, unsigned char *dest, int destLen); + int Sha256Value(const unsigned char *src, int srcLen, char *dest, int destLen); int32_t AnonymiseStr(char* str); +int32_t HEXStringToAscii(const char* input, int32_t inputLen, char* output, int32_t outputLen); + #ifdef __cplusplus #if __cplusplus } diff --git a/services/core/network/attest_network.c b/services/core/network/attest_network.c index 634b567..d050f63 100644 --- a/services/core/network/attest_network.c +++ b/services/core/network/attest_network.c @@ -97,6 +97,7 @@ DevicePacket* CreateDevicePacket(void) devicePacket->productInfo.rootHash = NULL; devicePacket->productInfo.patchTag = NULL; devicePacket->kitinfo = NULL; + devicePacket->pcid = NULL; return devicePacket; } @@ -123,6 +124,7 @@ void DestroyDevicePacket(DevicePacket** devPacket) ATTEST_MEM_FREE(devicePacket->productInfo.rootHash); ATTEST_MEM_FREE(devicePacket->productInfo.patchTag); ATTEST_MEM_FREE(devicePacket->kitinfo); + ATTEST_MEM_FREE(devicePacket->pcid); ATTEST_MEM_FREE(*devPacket); } @@ -272,6 +274,7 @@ void D2CClose(void) } } +#ifndef __ATTEST_DISABLE_SITE__ static int32_t BuildCoapChallServerInfo(cJSON **postData) { if (postData == NULL) { @@ -311,6 +314,7 @@ static int32_t BuildCoapChallServerInfo(cJSON **postData) } return ATTEST_OK; } +#endif char* BuildCoapChallBody(const DevicePacket *postValue) { @@ -330,11 +334,14 @@ char* BuildCoapChallBody(const DevicePacket *postValue) ATTEST_LOG_ERROR("[BuildCoapChallBody] postData AddStringToObject fail"); break; } +#ifndef __ATTEST_DISABLE_SITE__ ret = BuildCoapChallServerInfo(&postData); if (ret != ATTEST_OK) { ATTEST_LOG_ERROR("[BuildCoapChallBody] BuildCoapChallServerInfo fail"); break; } +#endif + ret = ATTEST_OK; } while (0); if (ret != ATTEST_OK) { cJSON_Delete(postData); @@ -1059,6 +1066,10 @@ static int32_t ParseNetworkInfosConfig(char *inputData, List *list) ret = ATTEST_ERR; break; } + if (!cJSON_IsArray(array)) { + ret = ATTEST_ERR; + break; + } int32_t arraySize = cJSON_GetArraySize(array); for (int32_t i = 0; i < arraySize; i++) { char *valueString = cJSON_GetStringValue(cJSON_GetArrayItem(array, i)); diff --git a/services/core/security/attest_security.c b/services/core/security/attest_security.c index 7749e91..70f384f 100644 --- a/services/core/security/attest_security.c +++ b/services/core/security/attest_security.c @@ -51,7 +51,7 @@ int32_t Base64Encode(const uint8_t* srcData, size_t srcDataLen, uint8_t* base64E int32_t ret = mbedtls_base64_encode(NULL, 0, &outLen, srcData, srcDataLen); if ((outLen == 0) || (outLen > base64EncodeMaxLen)) { - ATTEST_LOG_ERROR("[Base64Encode] Base64 encode get outLen failed, outLen = %u, ret = -0x00%x", outLen, -ret); + ATTEST_LOG_ERROR("[Base64Encode] Base64 encode get outLen failed, outLen = %zu, ret = -0x00%x", outLen, -ret); return ERR_ATTEST_SECURITY_BASE64_ENCODE; } uint8_t base64Data[outLen]; diff --git a/services/core/security/attest_security_ticket.c b/services/core/security/attest_security_ticket.c index 01e33b0..312d289 100644 --- a/services/core/security/attest_security_ticket.c +++ b/services/core/security/attest_security_ticket.c @@ -60,12 +60,10 @@ int32_t WriteTicketToDevice(const char* ticket, uint8_t ticketLen) ATTEST_LOG_ERROR("[WriteTicketToDevice] ticket or salt memcpy_s fail."); return ERR_ATTEST_SECURITY_MEM_MEMCPY; } - if (AttestWriteTicket(&ticketInfo) != 0) { ATTEST_LOG_ERROR("[WriteTicketToDevice] Write ticket failed"); return ATTEST_ERR; } - ATTEST_LOG_DEBUG("[WriteTicketToDevice] End."); return ret; } diff --git a/services/core/security/attest_security_token.c b/services/core/security/attest_security_token.c index edfa32e..d9bdbb5 100644 --- a/services/core/security/attest_security_token.c +++ b/services/core/security/attest_security_token.c @@ -16,6 +16,7 @@ #include #include #include "mbedtls/md.h" +#include "mbedtls/hkdf.h" #include "attest_adapter.h" #include "attest_dfx.h" #include "attest_utils.h" @@ -49,6 +50,7 @@ static int32_t EncryptHmac(const char *challenge, const uint8_t *tokenValue, siz return ATTEST_OK; } +#if defined(__ATTEST_ENABLE_PRESET_TOKEN__) static uint8_t *GetIKM(void) { uint8_t *ikm = NULL; @@ -78,7 +80,6 @@ static uint8_t *GetIKM(void) return NULL; } - (void)memset_s(ikm, ikmSize, 0, ikmSize); if ((memcpy_s(ikm, ikmSize, productKey, productKeyLen) != 0) || \ (memcpy_s(ikm + productKeyLen, ikmSize, productId, productIdLen) != 0)) { ATTEST_LOG_ERROR("[GetIKM] Failed to merge ikm"); @@ -240,6 +241,202 @@ static int32_t GetTokenIdSpecial(uint8_t* tokenId, uint8_t tokenIdLen) return ATTEST_OK; } +#else +/*Same as static int32_t SetSocketCliented(char* udid, char **outClientId)*/ +static int32_t GetProductSalt(unsigned char *salt, int32_t saltLen) +{ + if (salt == NULL || saltLen < 0) { + ATTEST_LOG_ERROR("[GetProductSalt] Invalid parameter"); + return ATTEST_ERR; + } + + char *udid = StrdupDevInfo(UDID); + if (udid == NULL) { + ATTEST_LOG_ERROR("[GetProductSalt] Failed to get udid"); + return ATTEST_ERR; + } + + if (ToLowerStr(udid, strlen(udid)) != ATTEST_OK) { + ATTEST_MEM_FREE(udid); + return ATTEST_ERR; + } + + int32_t ret = Sha256ValueToAscii((unsigned char *)udid, strlen(udid), salt, saltLen); + ATTEST_MEM_FREE(udid); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetProductSalt] failed to Sha256"); + return ATTEST_ERR; + } + return ATTEST_OK; +} + +static uint8_t *GetProductIKMDecrypted(void) +{ + char *enShortName = StrdupDevInfo(MANU_FACTURE); + if (enShortName == NULL) { + return NULL; + } + + char *brand = StrdupDevInfo(BRAND); + if (brand == NULL) { + ATTEST_MEM_FREE(enShortName); + return NULL; + } + + char *model = StrdupDevInfo(PRODUCT_MODEL); + if (model == NULL) { + ATTEST_MEM_FREE(enShortName); + ATTEST_MEM_FREE(brand); + return NULL; + } + + unsigned char *ikm = NULL; + int32_t ret = ATTEST_ERR; + do { + int32_t ikmSize = strlen(enShortName) + strlen(brand) + strlen(model) + 1; + ikm = (unsigned char *)ATTEST_MEM_MALLOC(ikmSize); + if (ikm == NULL) { + ATTEST_LOG_ERROR("[GetProductIKMDecrypted] Failed to malloc ikm"); + break; + } + + if (strcat_s((char*)ikm, ikmSize, enShortName) != 0 || + strcat_s((char*)ikm, ikmSize, brand) != 0 || + strcat_s((char*)ikm, ikmSize, model) != 0) { + ATTEST_LOG_ERROR("[GetProductIKMDecrypted] Failed to merge ikm"); + ATTEST_MEM_FREE(ikm); + break; + } + + ret = ATTEST_OK; + } while (0); + ATTEST_MEM_FREE(enShortName); + ATTEST_MEM_FREE(brand); + ATTEST_MEM_FREE(model); + if (ret != ATTEST_OK) { + return NULL; + } + return ikm; +} + +static int32_t GetProductIKM(unsigned char *ikm, int32_t ikmLen) +{ + unsigned char *ikmDecrypted = GetProductIKMDecrypted(); + if (ikmDecrypted == NULL) { + ATTEST_LOG_ERROR("[GetProductIKM] Failed to get ikm"); + return ATTEST_ERR; + } + + int32_t ret = Sha256ValueToAscii(ikmDecrypted, strlen((const char *)ikmDecrypted), ikm, ikmLen); + ATTEST_MEM_FREE(ikmDecrypted); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetProductIKM] failed to Sha256"); + return ATTEST_ERR; + } + + return ATTEST_OK; +} + +static int32_t GetProductToken(const char* challenge, uint8_t* tokenValueHmac, uint8_t tokenValueHmacLen) +{ + if (tokenValueHmac == NULL || tokenValueHmacLen < TOKEN_VALUE_LEN) { + ATTEST_LOG_ERROR("[GetProductToken] Invalid parameter"); + return ATTEST_ERR; + } + + unsigned char salt[SHA256_OUTPUT_SIZE + 1] = {0}; + int32_t ret = GetProductSalt(salt, SHA256_OUTPUT_SIZE); + if (ret == ATTEST_ERR) { + return ATTEST_ERR; + } + + unsigned char ikm[SHA256_OUTPUT_SIZE + 1] = {0}; + ret = GetProductIKM(ikm, SHA256_OUTPUT_SIZE); + if (ret == ATTEST_ERR) { + return ATTEST_ERR; + } + + int infoLen = strlen(challenge) / 2; + char *info = (char *)ATTEST_MEM_MALLOC(infoLen + 1); + if (info == NULL) { + return ATTEST_ERR; + } + ret = HEXStringToAscii(challenge, strlen(challenge), info, infoLen); + if (ret == ATTEST_ERR) { + ATTEST_MEM_FREE(info); + return ATTEST_ERR; + } + + unsigned char okm[OKM_INPUT_LEN + 1] = {0}; + const mbedtls_md_info_t *mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); + ret = mbedtls_hkdf(mdInfo, salt, SHA256_OUTPUT_SIZE, + ikm, SHA256_OUTPUT_SIZE, + (const unsigned char*)info, strlen(info), + okm, OKM_INPUT_LEN); + ATTEST_MEM_FREE(info); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetProductToken] HKDF derive key failed, ret = -0x%x", -ret); + return ATTEST_ERR; + } + + uint8_t tokenValue[TOKEN_VALUE_LEN + 1] = {0}; + ret = Base64Encode(okm, OKM_INPUT_LEN, tokenValue, TOKEN_VALUE_LEN); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetProductToken] Base64 encode symbol info failed, ret = -0x00%x", -ret); + return ret; + } + if (memcpy_s(tokenValueHmac, tokenValueHmacLen, tokenValue, TOKEN_VALUE_LEN) != 0) { + return ATTEST_ERR; + } + return ret; +} + +static int32_t GetProductTokenInfo(const char* challenge, uint8_t* tokenValueHmac, uint8_t tokenValueHmacLen,\ + uint8_t* tokenId, uint8_t tokenIdLen) +{ + if (tokenValueHmacLen < TOKEN_VALUE_HMAC_LEN || tokenIdLen < TOKEN_VALUE_LEN) { + ATTEST_LOG_ERROR("[GetProductTokenInfo] Invalid parameter"); + return ATTEST_ERR; + } + TokenInfo tokenInfo; + (void)memset_s(&tokenInfo, sizeof(TokenInfo), 0, sizeof(TokenInfo)); + int32_t ret = AttestReadToken(&tokenInfo); + if (ret != TOKEN_UNPRESET) { + ATTEST_LOG_ERROR("[GetProductTokenInfo] The token file already exists"); + return ATTEST_ERR; + } + + memset_s(tokenValueHmac, tokenValueHmacLen, 0, tokenValueHmacLen); + memset_s(tokenId, tokenIdLen, 0, tokenIdLen); + + uint8_t tokenValue[TOKEN_VALUE_LEN + 1] = {0}; + ret = GetProductToken(challenge, tokenValue, TOKEN_VALUE_LEN); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetProductTokenInfo] Read token failed"); + return ATTEST_ERR; + } + + if (memcpy_s(tokenId, tokenIdLen, tokenValue, TOKEN_VALUE_LEN) != 0) { + ATTEST_LOG_ERROR("[GetProductTokenInfo] memcpy failed"); + return ATTEST_ERR; + } + + uint8_t hmac[HMAC_SHA256_CIPHER_LEN] = {0}; + ret = EncryptHmac(challenge, (const uint8_t*)tokenValue, strlen((const char *)tokenValue), hmac, sizeof(hmac)); + (void)memset_s(tokenValue, TOKEN_VALUE_LEN + 1, 0, TOKEN_VALUE_LEN + 1); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetProductTokenInfo] Encrypt token value hmac failed, ret = %d", ret); + return ret; + } + + ret = Base64Encode(hmac, sizeof(hmac), tokenValueHmac, tokenValueHmacLen); + (void)memset_s(hmac, HMAC_SHA256_CIPHER_LEN, 0, HMAC_SHA256_CIPHER_LEN); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetProductTokenInfo] Encrypt token value base64 encode failed, ret = %d", ret); + } + return ret; +} +#endif static int32_t TransTokenVersion(const char* tokenVersion, uint8_t tokenVersionLen) { @@ -444,7 +641,9 @@ static int32_t GetTokenValueDecrypted(uint8_t* tokenValue, uint8_t tokenValueLen int32_t ret = AttestReadToken(&tokenInfo); if (ret == TOKEN_UNPRESET) { ATTEST_LOG_ERROR("[GetTokenValueDecrypted] read tokenInfo failed, ret = %d", ret); +#if defined(__ATTEST_ENABLE_PRESET_TOKEN__) ret = GetTokenValueSpecial(tokenValue, tokenValueLen); +#endif return ret; } @@ -462,7 +661,7 @@ static int32_t GetTokenValueDecrypted(uint8_t* tokenValue, uint8_t tokenValueLen return ret; } -int32_t GetTokenValueHmac(const char* challenge, uint8_t* tokenValueHmac, uint8_t tokenValueHmacLen) +static int32_t GetTokenValueHmac(const char* challenge, uint8_t* tokenValueHmac, uint8_t tokenValueHmacLen) { ATTEST_LOG_DEBUG("[GetTokenValueHmac] Begin."); if ((challenge == NULL) || (tokenValueHmac == NULL)) { @@ -494,14 +693,16 @@ int32_t GetTokenValueHmac(const char* challenge, uint8_t* tokenValueHmac, uint8_ return ret; } -int32_t GetTokenId(uint8_t* tokenId, uint8_t tokenIdLen) +static int32_t GetTokenId(uint8_t* tokenId, uint8_t tokenIdLen) { TokenInfo tokenInfo; (void)memset_s(&tokenInfo, sizeof(TokenInfo), 0, sizeof(TokenInfo)); int32_t ret = AttestReadToken(&tokenInfo); if (ret == TOKEN_UNPRESET) { ATTEST_LOG_ERROR("[GetTokenId] read tokenInfo failed, ret = %d", ret); +#if defined(__ATTEST_ENABLE_PRESET_TOKEN__) ret = GetTokenIdSpecial(tokenId, tokenIdLen); +#endif return ret; } if (ret != ATTEST_OK) { @@ -517,6 +718,37 @@ int32_t GetTokenId(uint8_t* tokenId, uint8_t tokenIdLen) return ret; } +int32_t GetTokenValueAndId(const char* challenge, uint8_t* tokenValueHmac, uint8_t tokenValueHmacLen,\ + uint8_t* tokenId, uint8_t tokenIdLen) +{ + if (tokenValueHmacLen < TOKEN_VALUE_HMAC_LEN || tokenIdLen < TOKEN_VALUE_LEN) { + ATTEST_LOG_ERROR("[GetTokenValueAndId] Invalid parameter"); + return ATTEST_ERR; + } + + int32_t ret = ATTEST_ERR; + do { + if (GetTokenValueHmac(challenge, tokenValueHmac, tokenValueHmacLen) == ATTEST_OK &&\ + GetTokenId(tokenId, tokenIdLen) == ATTEST_OK) { + ATTEST_LOG_INFO("[GetTokenValueAndId] Get device token success."); + ret = ATTEST_OK; + break; + } +#if !defined(__ATTEST_ENABLE_PRESET_TOKEN__) + if (GetProductTokenInfo(challenge, tokenValueHmac, tokenValueHmacLen,\ + tokenId, tokenIdLen) == ATTEST_OK) { + ATTEST_LOG_INFO("[GetTokenValueAndId] Get product token success."); + ret = ATTEST_OK; + break; + } +#endif + } while (0); + if (ret != ATTEST_OK) { + ATTEST_LOG_ERROR("[GetTokenValueAndId] Get token failed."); + } + return ret; +} + static int32_t WriteToken(const char* tokenValue, uint8_t tokenValueLen, const char* tokenId, uint8_t tokenIdLen) { diff --git a/services/core/utils/attest_utils.c b/services/core/utils/attest_utils.c index 0948702..264fecb 100644 --- a/services/core/utils/attest_utils.c +++ b/services/core/utils/attest_utils.c @@ -187,16 +187,13 @@ int32_t ToLowerStr(char* str, int len) return ATTEST_OK; } -/** - * @brief Encrypt string with sha256 algorithm, and generate uppercase string. - * - */ -int Sha256Value(const unsigned char *src, int srcLen, char *dest, int destLen) +int Sha256ValueToAscii(const unsigned char *src, int srcLen, unsigned char *dest, int destLen) { - if (src == NULL) { + if (src == NULL || srcLen <= 0 || dest == NULL || destLen <= 0) { + ATTEST_LOG_ERROR("[Sha256ValueToAscii] Invalid parameter"); return ATTEST_ERR; } - char buf[DEV_BUF_LENGTH] = {0}; + unsigned char hash[HASH_LENGTH] = {0}; mbedtls_sha256_context context; @@ -205,11 +202,36 @@ int Sha256Value(const unsigned char *src, int srcLen, char *dest, int destLen) mbedtls_sha256_update_ret(&context, src, srcLen); mbedtls_sha256_finish_ret(&context, hash); - int32_t ret = ATTEST_OK; - for (size_t i = 0; i < HASH_LENGTH; i++) { - unsigned char value = hash[i]; + int ret = ATTEST_OK; + if (memcpy_s(dest, destLen, hash, HASH_LENGTH) != 0) { + ATTEST_LOG_ERROR("[Sha256ValueToAscii] Failed to memcpy"); + ret = ATTEST_ERR; + } + (void)memset_s(hash, HASH_LENGTH, 0, HASH_LENGTH); + return ret; +} + +/** + * @brief Encrypt string with sha256 algorithm, and generate uppercase string. + * + */ +int Sha256Value(const unsigned char *src, int srcLen, char *dest, int destLen) +{ + if (src == NULL || srcLen <= 0 || dest == NULL || destLen <= 0) { + ATTEST_LOG_ERROR("[Sha256Value] Invalid parameter"); + return ATTEST_ERR; + } + char buf[DEV_BUF_LENGTH] = {0}; + unsigned char hash[HASH_LENGTH] = {0}; + int32_t ret = Sha256ValueToAscii(src, srcLen, hash, HASH_LENGTH); + if (ret != ATTEST_OK) { + return ATTEST_ERR; + } + + for (int i = 0; i < HASH_LENGTH; i++) { (void)memset_s(buf, DEV_BUF_LENGTH, 0, DEV_BUF_LENGTH); - if (sprintf_s(buf, sizeof(buf), "%02X", value) < 0) { + // generate uppercase string + if (sprintf_s(buf, sizeof(buf), "%02X", hash[i]) < 0) { ret = ATTEST_ERR; break; } @@ -255,3 +277,44 @@ void AttestMemFree(void **point) *point = NULL; } +static int32_t HexToNumber(char inputChr) +{ + int retNumber = 0; + if (inputChr >= '0' && inputChr <= '9') { + retNumber = inputChr - '0'; + } else if (inputChr >= 'a' && inputChr <= 'f') { + retNumber = DECIMAL_BASE + inputChr - 'a'; + } else if (inputChr >= 'A' && inputChr <= 'F') { + retNumber = DECIMAL_BASE + inputChr - 'A'; + } else { + retNumber = ATTEST_ERR; + } + return retNumber; +} + +int32_t HEXStringToAscii(const char* input, int32_t inputLen, char* output, int32_t outputLen) +{ + if (input == NULL || inputLen <= 0 || output == NULL || (inputLen % ATTEST_EVEN_NUMBER == 1)) { + ATTEST_LOG_ERROR("[HEXStringToAscii] Invaild paramter"); + return ATTEST_ERR; + } + + if (outputLen < (inputLen / ATTEST_EVEN_NUMBER)) { + ATTEST_LOG_ERROR("[HEXStringToAscii] outputLen is shorter than required"); + return ATTEST_ERR; + } + + int tempLen = 0; + int32_t ret = ATTEST_OK; + for(int i = 0; i < inputLen; ) { + int highNumber = HexToNumber(input[i]); + int lowNumber = HexToNumber(input[i + 1]); + if (highNumber == ATTEST_ERR || lowNumber == ATTEST_ERR) { + ret = ATTEST_ERR; + break; + } + output[tempLen++] = highNumber * HEXADECIMAL_BASE + lowNumber; + i += ATTEST_EVEN_NUMBER; + } + return ret; +} diff --git a/services/core/utils/attest_utils_memleak.c b/services/core/utils/attest_utils_memleak.c index 35a3878..8b5b27a 100644 --- a/services/core/utils/attest_utils_memleak.c +++ b/services/core/utils/attest_utils_memleak.c @@ -133,16 +133,18 @@ static char* StrdupMemInfo(const char* input) if (input == NULL) { return NULL; } - size_t len = strlen(input) + 1; - if (len == 1) { + size_t inputLen = strlen(input); + if (inputLen == 0 || inputLen >= MAX_ATTEST_MALLOC_BUFF_SIZE) { return NULL; } - char* out = malloc(len); + + size_t outputLen = inputLen + 1; + char* out = malloc(outputLen); if (out == NULL) { return NULL; } - (void)memset_s(out, len, 0, len); - if (memcpy_s(out, len, input, strlen(input)) != 0) { + (void)memset_s(out, outputLen, 0, outputLen); + if (memcpy_s(out, outputLen, input, inputLen) != 0) { free(out); return NULL; } diff --git a/services/core/utils/attest_utils_timer.c b/services/core/utils/attest_utils_timer.c index 14d1ed6..1a5c3de 100644 --- a/services/core/utils/attest_utils_timer.c +++ b/services/core/utils/attest_utils_timer.c @@ -17,7 +17,8 @@ #include #include #include - +#include +#include #include "attest_utils.h" #include "attest_utils_log.h" #include "attest_utils_timer.h" @@ -26,6 +27,9 @@ static void AttestTimerCallback(union sigval attestTimer) { +#ifdef HAVE_PTHREAD_SETNAME_NP + (void)pthread_setname_np(pthread_self(), ATTEST_TIMER_TASK_ID); // set pthread name, at most 15 bytes. +#endif AttestTimerInfo *tmpTimerInfo = (AttestTimerInfo *)attestTimer.sival_ptr; if (tmpTimerInfo->type == ATTEST_TIMER_TYPE_ONCE) { tmpTimerInfo->status = ATTEST_TIMER_STATUS_STOP; @@ -123,7 +127,7 @@ int32_t AttestStartTimerTask(AttestTimerType isOnce, uint32_t milliseconds, if (*timerHandle != NULL) { AttestTimerInfo *tmpTimerInfo = (AttestTimerInfo *)timerHandle; if (tmpTimerInfo->timerId != 0) { - ATTEST_LOG_ERROR("[AttestStartTimerTask] timerId[%d] already exists", tmpTimerInfo->timerId); + ATTEST_LOG_ERROR("[AttestStartTimerTask] timerId already exists"); return ATTEST_ERR; } } diff --git a/test/tdd/gtest/BUILD.gn b/test/tdd/gtest/BUILD.gn index af3ffac..3c3a4ba 100644 --- a/test/tdd/gtest/BUILD.gn +++ b/test/tdd/gtest/BUILD.gn @@ -11,14 +11,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build/lite/config/test.gni") import("//build/ohos.gni") +import("//build/lite/config/test.gni") import("//test/xts/device_attest_lite/build/devattestconfig.gni") import("//test/xts/device_attest_lite/services/core/attestsource.gni") if (ohos_kernel_type == "liteos_a" || ohos_kernel_type == "linux") { unittest("device_attest_tdd") { output_extension = "bin" + output_dir = "$root_out_dir/test/unittest/device_attest_lite" cflags = [ "-ftrapv", "-Werror", @@ -29,29 +30,40 @@ if (ohos_kernel_type == "liteos_a" || ohos_kernel_type == "linux") { "-Wfloat-equal", "-Wdate-time", "-fPIC", - "-pthread", ] + defines = [ "MBEDTLS_ALLOW_PRIVATE_ACCESS" ] + + if (enable_attest_preset_token) { + defines += [ "__ATTEST_ENABLE_PRESET_TOKEN__" ] + } include_dirs = include_core_dirs include_dirs += [ - ".", + "./include", "${devattest_path}/services/core", "${devattest_path}/interfaces/innerkits", + "${devattest_path}/common", + "${devattest_path}/common/log", "${devattest_path}/common/small", ] sources = [ - "attest_tdd_data_transfer.c", - "attest_tdd_mock_hal.c", - "attest_tdd_mock_net.c", - "attest_tdd_mock_property.c", - "attest_tdd_test.cpp", + "./src/attest_tdd_data_transfer.c", + "./src/attest_tdd_mock_hal.c", + "./src/attest_tdd_mock_net.c", + "./src/attest_tdd_mock_property.c", + "./src/attest_tdd_test.cpp", ] sources += [ - "${devattest_path}/services/core/small/adapter/attest_adapter_network_config.c", "${devattest_path}/services/core/small/attest/attest_service_pcid.c", "${devattest_path}/services/core/small/utils/attest_utils_file_detail.c", ] sources += sources_common + + sources -= [ + "${devattest_path}/services/core/security/attest_security_ticket.c", + "${devattest_path}/services/core/adapter/attest_adapter.c", + ] + deps = [ "$ohos_product_adapter_dir/utils/token:haltoken_shared", "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", diff --git a/test/tdd/gtest/attest_tdd_mock_hal.c b/test/tdd/gtest/attest_tdd_mock_hal.c deleted file mode 100755 index 37c794e..0000000 --- a/test/tdd/gtest/attest_tdd_mock_hal.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include "attest_utils_log.h" -#include "attest_adapter_mock.h" -#include "attest_type.h" -#include "attest_tdd_data_transfer.h" -#include "attest_tdd_mock_config.h" - -static bool g_isFirstToken = true; - -static const char* ATTEST_FIRST_TOKENID = "57,65,104,109,101,122,89,84,112,99,50,88,56,57,114,71,48,66,54,66,52,73,\ -111,109,103,119,104,75,82,69,114,76,102,78,109,89,121,89,110,113,106,72,109,71,80,102,102,79,87,55,43,113,75,89,55,\ -117,47,85,67,68,114,119,103,106,89,49,73,87,90,56,105,81,79,52,73,78,113,79,105,105,102,78,89,52,100,101,71,54,113,77,\ -49,106,113,78,107,50,43,85,52,55,54,83,76,77,105,98,121,109,121,55,112,102,78,68,84,80,43,104,83,106,72,120,72,65,\ -101,70,86,65,65,81,54,53,76,109,101,98,56,118,43,51,111,108,83,108,49,48,48,48,0"; -static const char* ATTEST_FIRST_TOKEVALUE = "89,49,73,87,90,56,105,81,79,52,73,78,113,79,105,105,102,78,89,52,100,101,\ -71,54,113,77,49,106,113,78,107,50,43,85,52,55,54,83,76,77,105,98,121,109,121,55,112,102,78,68,84,80,43,104,83,106,72,\ -120,72,65,101,70,86,65,65,81,54,53,76,109,101,98,56,118,43,51,111,108,83,108,49,48,48,48,0"; -static const char* ATTEST_FIRST_SALT = "65,81,54,53,76,109,101,98,56,118,43,51,111,108,83,108,49,48,48,48,0"; -static const char* ATTEST_FIRST_VERSION = "49,48,48,48,0"; - -static const char* ATTEST_SECOND_TOKENID = "74,106,77,70,108,84,79,90,73,84,104,54,119,115,121,108,50,87,72,55,86,113,\ -111,43,65,102,102,114,48,108,57,52,120,48,70,111,78,100,49,111,71,82,48,113,49,73,121,67,50,84,82,122,112,55,118,\ -104,107,103,74,48,110,83,75,77,87,89,88,108,73,43,84,73,111,118,48,65,109,89,117,66,66,99,117,101,120,102,48,78,\ -102,76,66,90,98,72,53,106,114,47,98,99,113,81,85,80,107,54,53,98,57,86,50,82,48,107,108,82,121,72,118,113,101,54,\ -108,70,107,79,122,108,130,1,1,1,44,1,1,1,65,1,1,1,217,1,1,1,49,48,48,48,0"; -static const char* ATTEST_SECOND_TOKEVALUE = "87,89,88,108,73,43,84,73,111,118,48,65,109,89,117,66,66,99,117,101,120,\ -102,48,78,102,76,66,90,98,72,53,106,114,47,98,99,113,81,85,80,107,54,53,98,57,86,50,82,48,107,108,82,121,72,118,113,\ -101,54,108,70,107,79,122,108,130,1,1,1,44,1,1,1,65,1,1,1,217,1,1,1,49,48,48,48,0"; -static const char* ATTEST_SECOND_SALT = "130,1,1,1,44,1,1,1,65,1,1,1,217,1,1,1,49,48,48,48,0"; -static const char* ATTEST_SECOND_VERSION = "49,48,48,48,0"; - -// 读取Manufacturekey -int32_t AttestGetManufacturekey(uint8_t manufacturekey[], uint32_t len) -{ - return OsGetAcKeyStub((char*)manufacturekey, len); -} - -// 读取ProductId -int32_t AttestGetProductId(uint8_t productId[], uint32_t len) -{ - if ((productId == NULL) || (len == 0)) { - return ATTEST_ERR; - } - const char productIdBuf[] = "OH00004O"; - uint32_t productIdLen = strlen(productIdBuf); - if (len < productIdLen) { - return ATTEST_ERR; - } - - int ret = memcpy_s(productId, len, productIdBuf, productIdLen); - return ret; -} - -// 读取ProductKey -int32_t AttestGetProductKey(uint8_t productKey[], uint32_t len) -{ - return OsGetProdKeyStub((char*)productKey, len); -} - -int32_t AttestWriteToken(TokenInfo* tokenInfo) -{ - (void)tokenInfo; - return ATTEST_OK; -} - -int32_t AttestReadToken(TokenInfo* tokenInfo) -{ - ATTEST_LOG_INFO("[AttestTdd] In AttestReadToken."); - if (tokenInfo == NULL) { - return ATTEST_ERR; - } - int ret = -1; - uint8_t *out = (uint8_t *)tokenInfo->tokenId; - const char *tokenId = g_isFirstToken ? ATTEST_FIRST_TOKENID : ATTEST_SECOND_TOKENID; - ret = AttestSeriaToBinary(tokenId, &out, TOKEN_ID_ENCRYPT_LEN); - if (ret != ATTEST_OK) { - return ret; - } - - out = (uint8_t *)tokenInfo->tokenValue; - const char *tokenValue = g_isFirstToken ? ATTEST_FIRST_TOKEVALUE : ATTEST_SECOND_TOKEVALUE; - ret = AttestSeriaToBinary(tokenValue, &out, TOKEN_VALUE_ENCRYPT_LEN); - if (ret != ATTEST_OK) { - return ret; - } - - out = (uint8_t *)tokenInfo->salt; - const char *salt = g_isFirstToken ? ATTEST_FIRST_SALT : ATTEST_SECOND_SALT; - ret = AttestSeriaToBinary(salt, &out, SALT_ENCRYPT_LEN); - if (ret != ATTEST_OK) { - return ret; - } - - out = (uint8_t *)tokenInfo->version; - const char *version = g_isFirstToken ? ATTEST_FIRST_VERSION : ATTEST_SECOND_VERSION; - ret = AttestSeriaToBinary(version, &out, VERSION_ENCRYPT_LEN); - if (ret != ATTEST_OK) { - return ret; - } - ATTEST_LOG_INFO("[AttestTdd] out AttestReadToken."); - - return ATTEST_OK; -} diff --git a/test/tdd/gtest/attest_tdd_test.cpp b/test/tdd/gtest/attest_tdd_test.cpp deleted file mode 100644 index 4f02585..0000000 --- a/test/tdd/gtest/attest_tdd_test.cpp +++ /dev/null @@ -1,514 +0,0 @@ -/* - * Copyright (C) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include -#include -#include "attest_error.h" -#include "attest_utils_log.h" -#include "attest_utils.h" -#include "attest_entry.h" -#include "attest_result_info.h" -#include "attest_type.h" -#include "attest_network.h" -#include "attest_service_active.h" -#include "attest_service_auth.h" -#include "attest_service_challenge.h" -#include "attest_service_device.h" -#include "attest_service.h" -#include "attest_service_device.h" -#include "attest_security_token.h" -#include "attest_service_reset.h" -#include "attest_tdd_mock_config.h" -#include "attest_network.h" -#include "attest_adapter.h" - -using namespace testing::ext; -namespace OHOS { -namespace DevAttest { -static const int32_t TDD_AUTH_RESULT = 0; - -static const int32_t ATTEST_GET_CHANLLEGE = 0; -static const int32_t ATTEST_RESET = 1; -static const int32_t ATTEST_ACTIVE = 2; -static const int32_t ATTEST_AUTH = 3; - -static const int32_t ATTEST_CHANLLEGE_LEN = 64; - -static const char* ATTEST_RESET_EXPECT_TOKEN = "WOetrEFOcjw8Px2TZNmq3ckoMzXEkkoLfgQeGNnG3XA="; - -static const char* ATTEST_AUTH_EXPECT_RESULT = "{\"authStats\":\".eyJhdXRoUmVzdWx0IjowLCJhdXRoVHlwZSI6IlRPS0VOX0VO\ -QUJMRSIsImV4cGlyZVRpbWUiOjE2ODMzNzM2NzE2NzQsImtpdFBvbGljeSI6W10sInNvZnR3YXJlUmVzdWx0IjozMDAwMiwic29mdHdhcmVSZXN1bHRE\ -ZXRhaWwiOnsicGF0Y2hMZXZlbFJlc3VsdCI6MzAwMDgsInBjaWRSZXN1bHQiOjMwMDExLCJyb290SGFzaFJlc3VsdCI6MzAwMDksInZlcnNpb25JZFJlc\ -3VsdCI6MzAwMDJ9LCJ1ZGlkIjoiODFDOTQ0NTI3OUEzQTQxN0Q0MTU5RkRGQzYyNjkxQkM4REEwMDJFODQ2M0M3MEQyM0FCNENCRjRERjk4MjYxQy\ -IsInZlcnNpb25JZCI6ImRlZmF1bHQvaHVhLXdlaS9rZW1pbi9kZWZhdWx0L09wZW5IYXJtb255LTQuMC4zLjIoQ2FuYXJ5MSkvb2hvcy9tYXgvMTAv\ -T3Blbkhhcm1vbnkgMi4zIGJldGEvZGVidWcifQ.\",\ -\"errcode\":0,\ -\"ticket\":\"svnR0unsciaFi7S4hcpBa/LCSiYwNSt6\",\ -\"token\":\"yh9te54pfTb91CrSqpD5fQsVBA/etKNb\",\ -\"uuid\":\"156dcff8-0ab0-4521-ac8f-ba682e6ca5a0\"\ -}3"; - -static const char* ATTEST_AUTH_GEN_TOKEN = "5HWNhKgnJ+sVZM313rCsNa3QK2RhrC4+bClH9SX5O84="; -static const char* ATTEST_AUTH_CHAP = "a81441e3c0d8d6a78907fa0888f9241be9591c4d6b7a533318b010fb2c3d9b80"; -static const int64_t ATTEST_AUTH_CHAP_TIME = 1449458719; - -static const char* ATTEST_ACTIVE_EXPECT_TOKEN = "648390656"; -static const char* ATTEST_ACTIVE_CHAP = "01824812bda06b33e3c76ac8cf3f6d2153867ce39db08f625203a350d5635ac9"; -static const int64_t ATTEST_ACTIVE_CHAP_TIME = 1449459365; - -static const int64_t ATTEST_EXPIRRTIME = -584928741; -static const int32_t ATTEST_HARDWARERESULT = 0; - -static const char* ATTEST_REST_ERROR_EXPECT_RESULT = "15003"; - -static const char* ATTEST_RESET_EXPECT_CHAP = "39a9d04d41617162893c3312ceb030acac8d8bd0cc9fcebcab5402a43891341d"; -static const int64_t ATTEST_RESET_EXPECT_CHAP_TIME = 1449458490; - -static const char* ATTEST_TICKET = "svnR0unsciaFi7S4hcpBa/LCSiYwNSt6"; -static const char* ATTEST_STATUS = ".eyJhdXRoUmVzdWx0IjowLCJhdXRoVHlwZSI6IlRPS0VOX0VOQUJMRSI\ -sImV4cGlyZVRpbWUiOjE2ODMzNzM2NzE2NzQsImtpdFBvbGljeSI6W10sInNvZnR3YXJlUmVzdWx0IjozMDAwMiwic29mdHdhcmVSZXN1bHREZXRh\ -aWwiOnsicGF0Y2hMZXZlbFJlc3VsdCI6MzAwMDgsInBjaWRSZXN1bHQiOjMwMDExLCJyb290SGFzaFJlc3VsdCI6MzAwMDksInZlcnNpb25JZFJlc\ -3VsdCI6MzAwMDJ9LCJ1ZGlkIjoiODFDOTQ0NTI3OUEzQTQxN0Q0MTU5RkRGQzYyNjkxQkM4REEwMDJFODQ2M0M3MEQyM0FCNENCRjRERjk4MjYxQy\ -IsInZlcnNpb25JZCI6ImRlZmF1bHQvaHVhLXdlaS9rZW1pbi9kZWZhdWx0L09wZW5IYXJtb255LTQuMC4zLjIoQ2FuYXJ5MSkvb2hvcy9tYXgvMTAv\ -T3Blbkhhcm1vbnkgMi4zIGJldGEvZGVidWcifQ."; - -class AttestTddTest : public testing::Test { -public: - static void SetUpTestCase(void); - - static void TearDownTestCase(void); - - void SetUp(); - - void TearDown(); -}; - -void AttestTddTest::SetUpTestCase(void) -{ - // input testsuit setup step,setup invoked before all testcases - (void)InitSysData(); - (void)InitNetworkServerInfo(); -} - -void AttestTddTest::TearDownTestCase(void) -{ - // input testsuit teardown step,teardown invoked after all testcases -} - -void AttestTddTest::SetUp() -{ - // input testcase setup step,setup invoked before each testcases -} - -void AttestTddTest::TearDown() -{ - // input testcase teardown step,teardown invoked after each testcases -} - -static AuthResult *GetAuthResult() -{ - AuthResult *authResult = CreateAuthResult(); - if (authResult == nullptr) { - return nullptr; - } - int32_t ret = ParseAuthResultResp(ATTEST_AUTH_EXPECT_RESULT, authResult); - if (ret != ATTEST_OK) { - DestroyAuthResult(&authResult); - return nullptr; - } - return authResult; -} - -static DevicePacket* TddGenActiveMsg() -{ - if (ATTEST_CHANLLEGE_LEN != strlen(ATTEST_ACTIVE_CHAP)) { - return NULL; - } - - AuthResult *authResult = GetAuthResult(); - if (authResult == nullptr) { - return nullptr; - } - - DevicePacket* reqMsg = NULL; - char attestChallengeActive[ATTEST_CHANLLEGE_LEN + 1] = {0}; - errno_t rc = memcpy_s(attestChallengeActive, ATTEST_CHANLLEGE_LEN + 1, - ATTEST_ACTIVE_CHAP, ATTEST_CHANLLEGE_LEN); - if (rc != EOK) { - ATTEST_LOG_ERROR("[TddGenResetMsg] memset failed"); - return nullptr; - } - - ChallengeResult challenge; - challenge.challenge = attestChallengeActive; - challenge.currentTime = ATTEST_ACTIVE_CHAP_TIME; - int32_t ret = GenActiveMsg(authResult, &challenge, &reqMsg); - DestroyAuthResult(&authResult); - if (ret != ATTEST_OK) { - return nullptr; - } - return reqMsg; -} - -static DevicePacket* TddGenAuthMsg() -{ - if (ATTEST_CHANLLEGE_LEN != strlen(ATTEST_AUTH_CHAP)) { - return NULL; - } - DevicePacket* reqMsg = NULL; - char attestChallengeAuth[ATTEST_CHANLLEGE_LEN + 1] = {0}; - errno_t rc = memcpy_s(attestChallengeAuth, ATTEST_CHANLLEGE_LEN + 1, - ATTEST_AUTH_CHAP, ATTEST_CHANLLEGE_LEN); - if (rc != EOK) { - ATTEST_LOG_ERROR("[TddGenResetMsg] memset failed"); - return nullptr; - } - - ChallengeResult challenge; - challenge.challenge = attestChallengeAuth; - challenge.currentTime = ATTEST_AUTH_CHAP_TIME; - int32_t ret = GenAuthMsg(&challenge, &reqMsg); - if (ret != ATTEST_OK) { - return nullptr; - } - return reqMsg; -} - -static DevicePacket* TddGenResetMsg() -{ - if (ATTEST_CHANLLEGE_LEN != strlen(ATTEST_RESET_EXPECT_CHAP)) { - return nullptr; - } - DevicePacket* reqMsg = NULL; - char attestChallengeReset[ATTEST_CHANLLEGE_LEN + 1] = {0}; - errno_t rc = memcpy_s(attestChallengeReset, ATTEST_CHANLLEGE_LEN + 1, - ATTEST_RESET_EXPECT_CHAP, ATTEST_CHANLLEGE_LEN); - if (rc != EOK) { - ATTEST_LOG_ERROR("[TddGenResetMsg] memset failed"); - return nullptr; - } - ChallengeResult challenge; - challenge.challenge = attestChallengeReset; - challenge.currentTime = ATTEST_RESET_EXPECT_CHAP_TIME; - int32_t ret = GenResetMsg(&challenge, &reqMsg); - if (ret != ATTEST_OK) { - return nullptr; - } - return reqMsg; -} - -void WriteAuthStatus() -{ - int32_t ret = FlushAuthResult(ATTEST_TICKET, ATTEST_STATUS); - EXPECT_TRUE((ret == ATTEST_OK)); -} - -void TestGetAuthStatus(char **status) -{ - int32_t ret = GetAuthStatus(status); - EXPECT_TRUE((ret == ATTEST_OK)); -} - -static void FreeAuthStatus(AuthStatus* authStatus) -{ - if (authStatus->versionId != NULL) { - free(authStatus->versionId); - } - if (authStatus->authType != NULL) { - free(authStatus->authType); - } - if (authStatus->softwareResultDetail != NULL) { - free(authStatus->softwareResultDetail); - } - free(authStatus); -} - -/* - * @tc.name: TestInitNetWort001 - * @tc.desc: Test init network. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestInitNetWort001, TestSize.Level1) -{ - int ret = InitNetworkServerInfo(); - EXPECT_TRUE(ret == ATTEST_OK); - ret = D2CConnect(); - EXPECT_TRUE(ret == ATTEST_OK); -} - -/* - * @tc.name: TestSendActiveMsg001 - * @tc.desc: Test send active msg. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestSendActiveMsg001, TestSize.Level1) -{ - (void)InitNetworkServerInfo(); - (void)D2CConnect(); - - g_netType = ATTEST_ACTIVE; - DevicePacket* reqMsg = TddGenActiveMsg(); - ASSERT_TRUE(reqMsg != NULL); - - char* respMsg = NULL; - int32_t ret = SendActiveMsg(reqMsg, &respMsg); - EXPECT_TRUE((ret == ATTEST_OK) && (respMsg != NULL)); - if (respMsg == NULL) { - ATTEST_LOG_ERROR("[SendActiveMsgTdd] respMsg is NULL."); - return; - } - if (ret != ATTEST_OK) { - free(respMsg); - ATTEST_LOG_ERROR("[SendActiveMsgTdd] Send active message failed, ret = %d.", ret); - return; - } - const char* ATTEST_ACTIVE_EXPECT_RESULT = "{\"errcode\":0}"; - EXPECT_TRUE(strcmp(ATTEST_ACTIVE_EXPECT_RESULT, respMsg) == 0); - free(respMsg); -} - -/* - * @tc.name: TestParseActiveResult001 - * @tc.desc: Test parse active result,result is ok. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestParseActiveResult001, TestSize.Level1) -{ - const char *input = "{\"errcode\":0}"; - int32_t ret = ParseActiveResult(input); - EXPECT_TRUE(ret == ATTEST_OK); -} - -/* - * @tc.name: TestParseActiveResult002 - * @tc.desc: Test parse active result,result is error. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestParseActiveResult002, TestSize.Level1) -{ - const char *input = "{\"errcode\":\"-32s\"}"; - int32_t ret = ParseActiveResult(input); - EXPECT_TRUE((ret != ATTEST_OK)); -} - -/* - * @tc.name: TestGetAuthStatus001 - * @tc.desc: Test get authStatus. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestGetAuthStatus001, TestSize.Level1) -{ - WriteAuthStatus(); - char *status = nullptr; - TestGetAuthStatus(&status); - EXPECT_TRUE((status != nullptr)); - if (status == nullptr) { - return; - } - EXPECT_TRUE(strcmp(ATTEST_STATUS, status) == 0); - free(status); -} - -/* - * @tc.name: TestDecodeAuthStatus001 - * @tc.desc: Test decode auth status. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestDecodeAuthStatus001, TestSize.Level1) -{ - WriteAuthStatus(); - char *status = nullptr; - TestGetAuthStatus(&status); - AuthStatus* outStatus = CreateAuthStatus(); - EXPECT_TRUE((outStatus != nullptr)); - if (outStatus == nullptr) { - return; - } - int32_t ret = DecodeAuthStatus(status, outStatus); - EXPECT_TRUE(ret == ATTEST_OK); - SoftwareResultDetail* detail = outStatus->softwareResultDetail; - EXPECT_TRUE((outStatus->versionId != nullptr) && (outStatus->authType != nullptr) && (detail != nullptr)); - if ((outStatus->versionId == nullptr) || (outStatus->authType == nullptr) || (detail == nullptr)) { - FreeAuthStatus(outStatus); - return; - } - const char* ATTEST_AUTH_TYPE = "TOKEN_ENABLE"; - EXPECT_TRUE(strcmp(outStatus->authType, ATTEST_AUTH_TYPE) == 0); - EXPECT_TRUE((outStatus->hardwareResult == ATTEST_HARDWARERESULT)); - FreeAuthStatus(outStatus); -} - -/* - * @tc.name: TestCheckExpireTime001 - * @tc.desc: Test check auth result. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestCheckExpireTime001, TestSize.Level1) -{ - AuthStatus* outStatus = CreateAuthStatus(); - EXPECT_TRUE(outStatus != nullptr); - if (outStatus == nullptr) { - return; - } - outStatus->expireTime = 19673222; - uint64_t currentTime = 19673223; - int32_t ret = CheckExpireTime(outStatus, currentTime); - EXPECT_TRUE(ret != ATTEST_OK); - outStatus->expireTime = 19673222; - currentTime = 19673221; - ret = CheckExpireTime(outStatus, currentTime); - EXPECT_TRUE(ret == ATTEST_OK); - free(outStatus); -} - -/* - * @tc.name: TestGenAuthMsg001 - * @tc.desc: Test gen auth msg. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestGenAuthMsg001, TestSize.Level1) -{ - DevicePacket* reqMsg = TddGenAuthMsg(); - ASSERT_TRUE((reqMsg != nullptr)); - - char *outToken = reqMsg->tokenInfo.token; - EXPECT_TRUE(outToken != nullptr); - if (outToken == NULL) { - FREE_DEVICE_PACKET(reqMsg); - return; - } - EXPECT_TRUE(strcmp(outToken, ATTEST_AUTH_GEN_TOKEN) == 0); - FREE_DEVICE_PACKET(reqMsg); -} - -/* - * @tc.name: TestParseAuthResultResp001 - * @tc.desc: Test parse auth result resp. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestParseAuthResultResp001, TestSize.Level1) -{ - AuthResult *authResult = GetAuthResult(); - ASSERT_TRUE(authResult != nullptr); - - EXPECT_TRUE((authResult->ticket != nullptr) && (authResult->tokenValue != nullptr) && - (authResult->authStatus != nullptr)); - if (authResult->ticket != nullptr) { - EXPECT_TRUE(strcmp(authResult->ticket, ATTEST_TICKET) == 0); - } - DestroyAuthResult(&authResult); -} - -/* - * @tc.name: TestGetChallenge001 - * @tc.desc: Test get reset challenge. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestGetChallenge001, TestSize.Level1) -{ - g_netType = ATTEST_GET_CHANLLEGE; - ChallengeResult* challenge = NULL; - int32_t ret = GetChallenge(&challenge, ATTEST_ACTION_RESET); - EXPECT_TRUE(ret == ATTEST_OK); - EXPECT_TRUE(challenge != NULL); - if (ret != ATTEST_OK) { - FREE_CHALLENGE_RESULT(challenge); - ATTEST_LOG_ERROR("[AttestTdd] GetChallenge failed, ret = %d.", ret); - return; - } - EXPECT_TRUE(strcmp(ATTEST_RESET_EXPECT_CHAP, challenge->challenge) == 0); - FREE_CHALLENGE_RESULT(challenge); -} - -/* - * @tc.name: TestGenResetMsg001 - * @tc.desc: Test gen reset msg. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestGenResetMsg001, TestSize.Level1) -{ - DevicePacket* reqMsg = TddGenResetMsg(); - EXPECT_TRUE((reqMsg != nullptr)); - if (reqMsg == nullptr) { - return; - } - char *outToken = reqMsg->tokenInfo.token; - EXPECT_TRUE(outToken != nullptr); - if (outToken == NULL) { - FREE_DEVICE_PACKET(reqMsg); - return; - } - EXPECT_TRUE(strcmp(ATTEST_RESET_EXPECT_TOKEN, outToken) == 0); - FREE_DEVICE_PACKET(reqMsg); -} - -/* - * @tc.name: TestSendResetMsg001 - * @tc.desc: Test send reset msg. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestSendResetMsg001, TestSize.Level1) -{ - g_netType = ATTEST_RESET; - DevicePacket* reqMsg = TddGenResetMsg(); - if (reqMsg == NULL) { - return; - } - char* respMsg = NULL; - int32_t ret = SendResetMsg(reqMsg, &respMsg); - EXPECT_TRUE((ret == ATTEST_OK) && (respMsg != NULL)); - if (respMsg == NULL) { - FREE_DEVICE_PACKET(reqMsg); - ATTEST_LOG_ERROR("[SendResetTdd] respMsg is NULL."); - return; - } - if (ret != ATTEST_OK) { - FREE_DEVICE_PACKET(reqMsg); - free(respMsg); - ATTEST_LOG_ERROR("[SendResetMsgTdd] Send reset message failed, ret = %d.", ret); - return; - } - ATTEST_LOG_ERROR("[SendResetTdd] respMsg is NULL.respMsg = %s", respMsg); - EXPECT_TRUE(strstr(respMsg, ATTEST_REST_ERROR_EXPECT_RESULT) != nullptr); - free(respMsg); - FREE_DEVICE_PACKET(reqMsg); -} - -/* - * @tc.name: TestQueryAttestStatus001 - * @tc.desc: Test query attest status. - * @tc.type: FUNC - */ -HWTEST_F(AttestTddTest, TestQueryAttestStatus001, TestSize.Level1) -{ - AuthResult *authResult = GetAuthResult(); - ASSERT_TRUE(authResult != nullptr); - - int32_t ret = FlushToken(authResult); - EXPECT_EQ(ret, ATTEST_OK); - - uint8_t authResultCode = TDD_AUTH_RESULT; - AttestWriteAuthResultCode((char*)&authResultCode, 1); - AttestResultInfo attestResultInfo = { .softwareResultDetail = {-2, -2, -2, -2, -2} }; - attestResultInfo.ticket = NULL; - ret = EntryGetAttestStatus(&attestResultInfo); - EXPECT_TRUE((ret == ATTEST_OK) && (attestResultInfo.authResult == ATTEST_OK)); - EXPECT_TRUE((attestResultInfo.ticket != nullptr)); - if (attestResultInfo.ticket == nullptr) { - return; - } - EXPECT_TRUE(strcmp(attestResultInfo.ticket, ATTEST_TICKET) == 0); -} -} -} diff --git a/test/tdd/gtest/attest_tdd_data_transfer.h b/test/tdd/gtest/include/attest_tdd_data_transfer.h old mode 100755 new mode 100644 similarity index 89% rename from test/tdd/gtest/attest_tdd_data_transfer.h rename to test/tdd/gtest/include/attest_tdd_data_transfer.h index 937316f..36c490d --- a/test/tdd/gtest/attest_tdd_data_transfer.h +++ b/test/tdd/gtest/include/attest_tdd_data_transfer.h @@ -1,24 +1,24 @@ -/* - * Copyright (C) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef ATTEST_TDD_TEST_DATA_TRANSFER_H -#define ATTEST_TDD_TEST_DATA_TRANSFER_H -#define ATTEST_MAX_TLS_LEN (10240) -#define ATTEST_DECIMAL (10) -#define ATTEST_ZERO_CHAR '0' -#define ATTEST_ASCII_TO_STRING_SIZE (4) -int32_t AttestSeriaToBinary(const char* input, uint8_t** outputBuff, size_t len); -int32_t AttestBinaryToSerial(const uint8_t* input, int32_t inputLen, - uint8_t** outputBuff, int32_t* outputLen); -#endif \ No newline at end of file +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef ATTEST_TDD_TEST_DATA_TRANSFER_H +#define ATTEST_TDD_TEST_DATA_TRANSFER_H +#define ATTEST_MAX_TLS_LEN (10240) +#define ATTEST_DECIMAL (10) +#define ATTEST_ZERO_CHAR '0' +#define ATTEST_ASCII_TO_STRING_SIZE (4) +int32_t AttestSeriaToBinary(const char* input, uint8_t** buf, size_t len); +int32_t AttestBinaryToSerial(const uint8_t* input, int32_t inputLen, + uint8_t** outputBuff, int32_t* outputLen); +#endif diff --git a/test/tdd/gtest/attest_tdd_mock_config.h b/test/tdd/gtest/include/attest_tdd_mock_config.h old mode 100755 new mode 100644 similarity index 97% rename from test/tdd/gtest/attest_tdd_mock_config.h rename to test/tdd/gtest/include/attest_tdd_mock_config.h index a40fa2a..e103ad0 --- a/test/tdd/gtest/attest_tdd_mock_config.h +++ b/test/tdd/gtest/include/attest_tdd_mock_config.h @@ -1,20 +1,20 @@ -/* - * Copyright (C) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef ATTEST_TDD_MOCK_CONFIG_H -#define ATTEST_TDD_MOCK_CONFIG_H - -extern int32_t g_netType; - -#endif +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef ATTEST_TDD_MOCK_CONFIG_H +#define ATTEST_TDD_MOCK_CONFIG_H + +extern int32_t g_netType; + +#endif diff --git a/test/tdd/gtest/include/attest_tdd_mock_hal.h b/test/tdd/gtest/include/attest_tdd_mock_hal.h new file mode 100644 index 0000000..0964035 --- /dev/null +++ b/test/tdd/gtest/include/attest_tdd_mock_hal.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef ATTEST_TDD_MOCK_HAL_H +#define ATTEST_TDD_MOCK_HAL_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +void AttestSetMockReadTokenRet(int value); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#define ATTEST_MOCK_HAL_MANU_KEY "1234567890abcdef1234567890abcdef1234567890abcdef\ +1234567890abcdef1234567890abcdef1234567890abcdef" +#define ATTEST_MOCK_HAL_MANU_KEY_LEN 96 + +#define ATTEST_MOCK_HAL_PRO_ID "OH00Test" +#define ATTEST_MOCK_HAL_PRO_ID_LEN 8 + +#define ATTEST_MOCK_HAL_PRO_KEY "test" + +// tokenDecrypted "1Attest+-3Token*4Value/5=Test1e1" +#define ATTEST_FIRST_TOKENID "e10oVXrrR8Ra9LHXuorJ8PrwwWn/RUYinPiUbFAkA0ucJA1+IUhZ5GNsacn5vnWo" +#define ATTEST_FIRST_TOKEVALUE "e10oVXrrR8Ra9LHXuorJ8PrwwWn/RUYinPiUbFAkA0ucJA1+IUhZ5GNsacn5vnWo" +#define ATTEST_FIRST_SALT "Sa/lt+123Te-stX=" +#define ATTEST_FIRST_VERSION "1000" + +#define ATTEST_CASE_RESET 1 +#define ATTEST_RESET_CHAP "39a9d04d41617162893c3312ceb030acac8d8bd0cc9fcebcab5402a43891341d" +#define ATTEST_RESET_CHAP_TIME 1234567890 +#define ATTEST_RESET_GEN_TOKEN "ldV+D/FnxYLwL3myrVLXmLTvKi92WTGQgPAk5r6KAcg=" +// tokenDecrypted "QZYbv4NdQ1oPy9zCsh2RjOpleFNd6DDA" +#define ATTEST_RESET_GEN_PRODUCT_TOKEN "J9gNiIq3cjhWYv7rMrbEkFzHeEh3Hl9561+Taqdv7gY=" +// tokenDecrypted "AKXOFdCBwi3sHQy+YYEYM7U+WqZE1B5W" +#define ATTEST_RESET_GEN_ONLINE_TOKEN "n2wSEwmXnYWEsSqN4yngtnt1HGO5NqS/nhj6F2DG0js=" +#define ATTEST_RESET_GEN_ONLINE_TOKEN_ID "f1feb9b7-bde2-0ee7-3089-49277d648666" + +#define ATTEST_CASE_AUTH 2 +#define ATTEST_AUTH_EXPECT_RESULT "{\"authStats\":\".eyJhdXRoUmVzdWx0IjowLCJhdXRoVHlwZSI6IlRPS0VOX0VO\ +QUJMRSIsImV4cGlyZVRpbWUiOjE2ODMzNzM2NzE2NzQsImtpdFBvbGljeSI6W10sInNvZnR3YXJlUmVzdWx0IjozMDAwMiwic29mdHdhcmVSZXN1bHRE\ +ZXRhaWwiOnsicGF0Y2hMZXZlbFJlc3VsdCI6MzAwMDgsInBjaWRSZXN1bHQiOjMwMDExLCJyb290SGFzaFJlc3VsdCI6MzAwMDksInZlcnNpb25JZFJlc\ +3VsdCI6MzAwMDJ9LCJ1ZGlkIjoiODFDOTQ0NTI3OUEzQTQxN0Q0MTU5RkRGQzYyNjkxQkM4REEwMDJFODQ2M0M3MEQyM0FCNENCRjRERjk4MjYxQy\ +IsInZlcnNpb25JZCI6ImRlZmF1bHQvaHVhLXdlaS9rZW1pbi9kZWZhdWx0L09wZW5IYXJtb255LTQuMC4zLjIoQ2FuYXJ5MSkvb2hvcy9tYXgvMTAv\ +T3Blbkhhcm1vbnkgMi4zIGJldGEvZGVidWcifQ.\",\ +\"errcode\":0,\ +\"ticket\":\"svnR0unsciaFi7S4hcpBa/LCSiYwNSt6\",\ +\"token\":\"yh9te54pfTb91CrSqpD5fQsVBA/etKNb\",\ +\"uuid\":\"156dcff8-0ab0-4521-ac8f-ba682e6ca5a0\"\ +}3" +#define ATTEST_AUTH_CHAP "a81441e3c0d8d6a78907fa0888f9241be9591c4d6b7a533318b010fb2c3d9b80" +#define ATTEST_AUTH_CHAP_TIME 1234567890 +#define ATTEST_AUTH_GEN_TOKEN "hVWBm7/Rspndlt9jou8+dmJ2LFiToesDeFV4+Qrjs2A=" +// product token +#define ATTEST_AUTH_GEN_PRODUCT_TOKEN "W8QPcxhymyPI5T/43Jh9JpOz3R6LdAqxTiWTFvHH0xY=" +// tokenDecrypted "AKXOFdCBwi3sHQy+YYEYM7U+WqZE1B5W" +#define ATTEST_AUTH_GEN_ONLINE_TOKEN "sQW7UN8eUGOuWRYvryvoLEL+4LfDOxVUniJy2kkjt/U=" + +#define ATTEST_CASE_ACTIVE 3 +#define ATTEST_ACTIVE_CHAP "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" +#define ATTEST_ACTIVE_CHAP_TIME 1234567890 +#define ATTEST_ACTIVE_GEN_TOKEN "NwccOBLvwgb5+Far1tj+zGcitRg8LAYafZn2lu4UiGE=" +// product token +#define ATTEST_ACTIVE_GEN_PRODUCT_TOKEN "acQK/fx9oYVuLyk04MITltw8xLegbPiBf3bqtLkhVDc=" +// tokenDecrypted "AKXOFdCBwi3sHQy+YYEYM7U+WqZE1B5W" +#define ATTEST_ACTIVE_GEN_ONLINE_TOKEN "v7kYS5P+JM2uWHLrIAVHIwckm8pyfInPHx1SHugPJe0=" + +#define ATTEST_MOCK_HAL_TICKET "svnR0unsciaFi7S4hcpBa/LCSiYwNSt6" +#define ATTEST_MOCK_HAL_TICKET_LEN 32 + +#define ATTEST_MOCK_HAL_STATUS ".eyJhdXRoUmVzdWx0IjowLCJhdXRoVHlwZSI6IlRPS0VOX0VOQUJMRSI\ +sImV4cGlyZVRpbWUiOjE2ODMzNzM2NzE2NzQsImtpdFBvbGljeSI6W10sInNvZnR3YXJlUmVzdWx0IjozMDAwMiwic29mdHdhcmVSZXN1bHREZXRh\ +aWwiOnsicGF0Y2hMZXZlbFJlc3VsdCI6MzAwMDgsInBjaWRSZXN1bHQiOjMwMDExLCJyb290SGFzaFJlc3VsdCI6MzAwMDksInZlcnNpb25JZFJlc\ +3VsdCI6MzAwMDJ9LCJ1ZGlkIjoiODFDOTQ0NTI3OUEzQTQxN0Q0MTU5RkRGQzYyNjkxQkM4REEwMDJFODQ2M0M3MEQyM0FCNENCRjRERjk4MjYxQy\ +IsInZlcnNpb25JZCI6ImRlZmF1bHQvaHVhLXdlaS9rZW1pbi9kZWZhdWx0L09wZW5IYXJtb255LTQuMC4zLjIoQ2FuYXJ5MSkvb2hvcy9tYXgvMTAv\ +T3Blbkhhcm1vbnkgMi4zIGJldGEvZGVidWcifQ." +#define ATTEST_MOCK_HAL_STATUS_LEN 548 + +#define ATTEST_HARDWARE_RESULT 0 +#define ATTEST_AUTH_TYPE "TOKEN_ENABLE" +#define ATTEST_EXPIRE_TIME 1683373671674 +#define ATTEST_VERSION_ID "default/hua-wei/kemin/default/OpenHarmony-4.0.3.2(Canary1)/ohos/max/10\ +/OpenHarmony 2.3 beta/debug" +#define ATTEST_SOFTWARE_RESULT 30002 + +#define ATTEST_MOCK_HAL_NETWORK_CONFIG_CORRECT "{\"serverInfo\":[\"testserver:443\"]}" +#define ATTEST_MOCK_HAL_NETWORK_CONFIG_INCORRECT "{\"serverInfo\":\"testserver:443\"}" +#define ATTEST_MOCK_HAL_NETWORK_CONFIG_LEN 256 +#define ATTEST_MOCK_HAL_NETWORK_RESULT "testserver" + +#define ATTEST_MOCK_HAL_NETWORK_CONFIG_OPTION_CORRECT 1 +#define ATTEST_MOCK_HAL_NETWORK_CONFIG_OPTION_INCORRECT 2 + +#define ATTEST_RESULT_CODE 0 +#define ATTEST_RESULT_CODE_LEN 1 + +#endif \ No newline at end of file diff --git a/test/tdd/gtest/include/attest_tdd_mock_property.h b/test/tdd/gtest/include/attest_tdd_mock_property.h new file mode 100644 index 0000000..ecb1280 --- /dev/null +++ b/test/tdd/gtest/include/attest_tdd_mock_property.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef ATTEST_TDD_MOCK_PROPERTY_H +#define ATTEST_TDD_MOCK_PROPERTY_H + +#define ATTEST_MOCK_PROPERTY_VERSIONID "default/mock-manufacture/mock-brand/default\ +/OpenHarmony-4.0.3.2(Canary1)/mock-model/max/10/OpenHarmony 2.3 beta/debug" +#define ATTEST_MOCK_PROPERTY_HASH "abb" +#define ATTEST_MOCK_PROPERTY_SOFTWARE_VERSION "mock 1.2.3.4" +#define ATTEST_MOCK_PROPERTY_MANU "mock-manufacture" +#define ATTEST_MOCK_PROPERTY_MODEL "mock-model" +#define ATTEST_MOCK_PROPERTY_BRAND "mock-brand" +#define ATTEST_MOCK_PROPERTY_PATCH "1234-02-29" +#define ATTEST_MOCK_PROPERTY_UDID "a6e82fac8dd78484fb0185e1428b40eab8214e04de9e26995feb39333810d161" +#define ATTEST_MOCK_PROPERTY_SERIAL "MOCK123456789" + +#endif diff --git a/test/tdd/gtest/include/attest_tdd_test.h b/test/tdd/gtest/include/attest_tdd_test.h new file mode 100644 index 0000000..5cb5413 --- /dev/null +++ b/test/tdd/gtest/include/attest_tdd_test.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef ATTEST_TDD_TEST_H +#define ATTEST_TDD_TEST_H +#include "attest_utils_list.h" + +extern List g_attestNetworkList; + +#endif diff --git a/test/tdd/gtest/attest_tdd_data_transfer.c b/test/tdd/gtest/src/attest_tdd_data_transfer.c similarity index 75% rename from test/tdd/gtest/attest_tdd_data_transfer.c rename to test/tdd/gtest/src/attest_tdd_data_transfer.c index ceef1cd..3b44d63 100644 --- a/test/tdd/gtest/attest_tdd_data_transfer.c +++ b/test/tdd/gtest/src/attest_tdd_data_transfer.c @@ -1,113 +1,134 @@ -/* - * Copyright (C) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include -#include -#include "attest_utils.h" -#include "attest_utils_log.h" -#include "attest_tdd_data_transfer.h" - -static size_t AttestGetMallocLen(const char* input) -{ - size_t totalFlag = 0; - char *indexInput = (char *)input; - while (*indexInput != '\0') { - if (*indexInput == ',') { - totalFlag++; - } - indexInput++; - } - size_t totalByte = totalFlag + 1; - size_t charLen = sizeof(unsigned char); - size_t mallocLen = charLen * totalByte + 1; - return mallocLen; -} - -int32_t AttestSeriaToBinary(const char* input, uint8_t** outputBuff, size_t len) -{ - if (outputBuff == NULL || *outputBuff == NULL) { - return ATTEST_ERR; - } - size_t mollocLen = AttestGetMallocLen(input); - if (mollocLen > ATTEST_MAX_TLS_LEN) { - return ATTEST_ERR; - } - uint8_t *temp = (uint8_t *)malloc(mollocLen); - if (temp == NULL) { - return ATTEST_ERR; - } - memset_s(temp, mollocLen, 0, mollocLen); - - char *indexInput = (char *)input; - unsigned char *indexTemp = (unsigned char*)temp; - unsigned char total = 0; - while (true) { - if ((*indexInput == ',') || (*indexInput == '\0')) { - *indexTemp++ = total; - total = 0; - } else { - total = total * ATTEST_DECIMAL + (*indexInput - ATTEST_ZERO_CHAR); - } - if (*indexInput == '\0') { - break; - } - indexInput++; - } - if (memcpy_s(*outputBuff, len, temp, len) != 0) { - free(temp); - return ATTEST_ERR; - } - free(temp); - return ATTEST_OK; -} - -int32_t AttestBinaryToSerial(const uint8_t* input, int32_t inputLen, - uint8_t** outputBuff, int32_t* outputLen) -{ - if (input == NULL || outputBuff == NULL || outputLen == NULL) { - return ATTEST_ERR; - } - int32_t outputSize = (inputLen * ATTEST_ASCII_TO_STRING_SIZE) + sizeof(ATTEST_ZERO_CHAR) + 1; - char* tempBuf = (char *)malloc(outputSize); - if (tempBuf == NULL) { - return ATTEST_ERR; - } - memset_s(tempBuf, outputSize, 0, outputSize); - - int32_t ret = ATTEST_OK; - int32_t offsetLength = 0; - char* tempBufPtr = tempBuf; - for (int32_t i = 0; i < inputLen; i++) { - if (sprintf_s(tempBufPtr, outputSize - offsetLength, "%u", input[i]) <= 0) { - ret = ATTEST_ERR; - break; - } - for (; *tempBufPtr != '\0'; tempBufPtr++) { - offsetLength++; - } - *tempBufPtr = ','; - offsetLength++; - tempBufPtr++; - } - if (ret != ATTEST_OK) { - free(tempBuf); - tempBuf = NULL; - return ATTEST_ERR; - } - *tempBufPtr = ATTEST_ZERO_CHAR; - - *outputBuff = (uint8_t*)tempBuf; - *outputLen = outputSize; - return ATTEST_OK; -} +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "attest_utils.h" +#include "attest_utils_log.h" +#include "attest_tdd_data_transfer.h" + +#define ATTEST_LEAST_MALLOC_LEN 2 + +static size_t AttestGetMallocLen(const char* input) +{ + size_t totalFlag = 0; + for (size_t inputIndex = 0; inputIndex < strlen(input); inputIndex++) { + if (*(input + inputIndex) == '\0') { + break; + } + + if (*(input + inputIndex) == ',') { + totalFlag++; + } + + if (totalFlag >= MAX_ATTEST_MALLOC_BUFF_SIZE) { + totalFlag = 0; + break; + } + } + + size_t totalByte = totalFlag + 1; + size_t charLen = sizeof(unsigned char); + size_t mallocLen = charLen * totalByte + 1; + return mallocLen; +} + +int32_t AttestSeriaToBinary(const char* input, uint8_t** buf, size_t len) +{ + if (buf == NULL || *buf == NULL) { + return ATTEST_ERR; + } + size_t mollocLen = AttestGetMallocLen(input); + if (mollocLen <= ATTEST_LEAST_MALLOC_LEN || mollocLen > ATTEST_MAX_TLS_LEN) { + return ATTEST_ERR; + } + uint8_t *temp = (uint8_t *)malloc(mollocLen); + if (temp == NULL) { + return ATTEST_ERR; + } + memset_s(temp, mollocLen, 0, mollocLen); + + char *indexInput = (char *)input; + size_t inputLen = strlen(input); + size_t tempLen = 0; + unsigned char *indexTemp = (unsigned char*)temp; + unsigned char total = 0; + int32_t ret = ATTEST_OK; + while ((tempLen <= inputLen) && (*indexInput != '\0')) { + if (*indexInput == ',') { + *indexTemp++ = total; + total = 0; + } else if (isdigit(*indexInput)) { + total = total * ATTEST_DECIMAL + (*indexInput - ATTEST_ZERO_CHAR); + } else { + ret = ATTEST_ERR; + break; + } + tempLen++; + indexInput++; + } + if (ret != ATTEST_OK) { + free(temp); + return ATTEST_ERR; + } + + if (memcpy_s(*buf, len, temp, len) != 0) { + free(temp); + return ATTEST_ERR; + } + free(temp); + return ATTEST_OK; +} + +int32_t AttestBinaryToSerial(const uint8_t* input, int32_t inputLen, + uint8_t** outputBuff, int32_t* outputLen) +{ + if (input == NULL || outputBuff == NULL || outputLen == NULL) { + return ATTEST_ERR; + } + int32_t outputSize = (inputLen * ATTEST_ASCII_TO_STRING_SIZE) + sizeof(ATTEST_ZERO_CHAR) + 1; + char* tempBuf = (char *)malloc(outputSize); + if (tempBuf == NULL) { + return ATTEST_ERR; + } + memset_s(tempBuf, outputSize, 0, outputSize); + + int32_t ret = ATTEST_OK; + int32_t offsetLength = 0; + char* tempBufPtr = tempBuf; + for (int32_t i = 0; i < inputLen; i++) { + if (sprintf_s(tempBufPtr, outputSize - offsetLength, "%u", input[i]) <= 0) { + ret = ATTEST_ERR; + break; + } + for (; *tempBufPtr != '\0'; tempBufPtr++) { + offsetLength++; + } + *tempBufPtr = ','; + offsetLength++; + tempBufPtr++; + } + if (ret != ATTEST_OK) { + free(tempBuf); + tempBuf = NULL; + return ATTEST_ERR; + } + *tempBufPtr = ATTEST_ZERO_CHAR; + + *outputBuff = (uint8_t*)tempBuf; + *outputLen = outputSize; + return ATTEST_OK; +} diff --git a/test/tdd/gtest/src/attest_tdd_mock_hal.c b/test/tdd/gtest/src/attest_tdd_mock_hal.c new file mode 100644 index 0000000..ae42551 --- /dev/null +++ b/test/tdd/gtest/src/attest_tdd_mock_hal.c @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "attest_type.h" +#include "attest_tdd_test.h" +#include "attest_tdd_mock_hal.h" +#include "attest_utils.h" +#include "attest_utils_log.h" + +static int g_readTokenRet = ATTEST_OK; + +void AttestSetMockReadTokenRet(int value) +{ + g_readTokenRet = value; +} + +int32_t AttestGetManufacturekey(uint8_t manufacturekey[], uint32_t len) +{ + return HEXStringToAscii((const char *)ATTEST_MOCK_HAL_MANU_KEY, ATTEST_MOCK_HAL_MANU_KEY_LEN,\ + (char*)manufacturekey, len); +} + +int32_t AttestGetProductId(uint8_t productId[], uint32_t len) +{ + return memcpy_s(productId, len, ATTEST_MOCK_HAL_PRO_ID, ATTEST_MOCK_HAL_PRO_ID_LEN); +} + +int32_t AttestGetProductKey(uint8_t productKey[], uint32_t len) +{ + return memcpy_s(productKey, len, ATTEST_MOCK_HAL_PRO_KEY, strlen(ATTEST_MOCK_HAL_PRO_KEY)); +} + +int32_t AttestWriteToken(TokenInfo* tokenInfo) +{ + (void)tokenInfo; + return ATTEST_OK; +} + +int32_t AttestReadToken(TokenInfo* tokenInfo) +{ + if (tokenInfo == NULL) { + return ATTEST_ERR; + } + + memcpy_s(tokenInfo->tokenId, TOKEN_ID_ENCRYPT_LEN, ATTEST_FIRST_TOKENID, TOKEN_ID_ENCRYPT_LEN); + memcpy_s(tokenInfo->tokenValue, TOKEN_VALUE_ENCRYPT_LEN, ATTEST_FIRST_TOKEVALUE, TOKEN_VALUE_ENCRYPT_LEN); + memcpy_s(tokenInfo->salt, SALT_ENCRYPT_LEN, ATTEST_FIRST_SALT, SALT_ENCRYPT_LEN); + memcpy_s(tokenInfo->version, VERSION_ENCRYPT_LEN, ATTEST_FIRST_VERSION, VERSION_ENCRYPT_LEN); + return g_readTokenRet; +} + +int32_t AttestWriteTicket(const TicketInfo* ticketInfo) +{ + (void)ticketInfo; + return ATTEST_OK; +} + +int32_t AttestReadTicket(TicketInfo* ticketInfo) +{ + (void)ticketInfo; + return ATTEST_OK; +} + +int32_t WriteTicketToDevice(const char* ticket, uint8_t len) +{ + (void)ticket; + (void)len; + return ATTEST_OK; +} + +int32_t ReadTicketFromDevice(char* ticket, uint8_t ticketLen) +{ + int32_t ret = memcpy_s(ticket, ticketLen, ATTEST_MOCK_HAL_TICKET, ATTEST_MOCK_HAL_TICKET_LEN); + return ret; +} + +int32_t AttestWriteAuthStatus(const char* data, uint32_t len) +{ + (void)data; + (void)len; + return ATTEST_OK; +} + +int32_t AttestGetAuthStatusFileSize(uint32_t* len) +{ + *len = ATTEST_MOCK_HAL_STATUS_LEN; + return ATTEST_OK; +} + +int32_t AttestReadAuthStatus(char* buffer, uint32_t bufferLen) +{ + int32_t ret = memcpy_s(buffer, bufferLen, ATTEST_MOCK_HAL_STATUS, ATTEST_MOCK_HAL_STATUS_LEN); + return ret; +} + +int32_t AttestWriteAuthResultCode(const char* data, uint32_t len) +{ + (void)data; + (void)len; + return ATTEST_OK; +} + +int32_t AttestReadAuthResultCode(char* buffer, uint32_t bufferLen) +{ + int32_t ret = memcpy_s(buffer, bufferLen, ATTEST_RESULT_CODE, ATTEST_RESULT_CODE_LEN); + return ret; +} + +bool AttestNetworkConfigExist(void) +{ + return false; +} + +int32_t AttestWriteNetworkConfig(const char* buffer, uint32_t bufferLen) +{ + (void)buffer; + (void)bufferLen; + return ATTEST_OK; +} + +int32_t AttestReadNetworkConfig(char* buffer, uint32_t bufferLen) +{ + if (buffer == NULL) { + return ATTEST_ERR; + } + static int32_t status = 1; + int32_t ret = ATTEST_ERR; + switch (status) { + case ATTEST_MOCK_HAL_NETWORK_CONFIG_OPTION_CORRECT: + ret = memcpy_s(buffer, bufferLen, ATTEST_MOCK_HAL_NETWORK_CONFIG_CORRECT, ATTEST_MOCK_HAL_NETWORK_CONFIG_LEN); + break; + case ATTEST_MOCK_HAL_NETWORK_CONFIG_OPTION_INCORRECT: + ret = memcpy_s(buffer, bufferLen, ATTEST_MOCK_HAL_NETWORK_CONFIG_INCORRECT, ATTEST_MOCK_HAL_NETWORK_CONFIG_LEN); + break; + default: + ret = memcpy_s(buffer, bufferLen, ATTEST_MOCK_HAL_NETWORK_CONFIG_CORRECT, ATTEST_MOCK_HAL_NETWORK_CONFIG_LEN); + break; + } + status++; + return ret; +} + +int32_t AttestReadDefaultNetworkConfig(char* buffer, uint32_t bufferLen) +{ + (void)buffer; + (void)bufferLen; + return ATTEST_OK; +} + diff --git a/test/tdd/gtest/attest_tdd_mock_net.c b/test/tdd/gtest/src/attest_tdd_mock_net.c similarity index 96% rename from test/tdd/gtest/attest_tdd_mock_net.c rename to test/tdd/gtest/src/attest_tdd_mock_net.c index 374be95..b30058e 100644 --- a/test/tdd/gtest/attest_tdd_mock_net.c +++ b/test/tdd/gtest/src/attest_tdd_mock_net.c @@ -1,101 +1,104 @@ -/* - * Copyright (C) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include "securec.h" -#include "attest_channel.h" -#include "attest_tls.h" -#include "attest_utils.h" -#include "attest_utils_log.h" -#include "attest_tdd_mock_config.h" -#include "attest_tdd_data_transfer.h" - -int32_t g_netType = 0; - -#define MAX_INVOKE_TIME 3 -#define MAX_NO_EXTEND_TIME 2 -#define INTERFACE_COUNT 4 - -// can't change network -#define ATTEST_RESET_CHAP_FIRST_MSG "210,0" -#define ATTEST_RESET_CHAP_SECOND_MSG "227,49" -#define ATTEST_RESET_CHAP_THIRD_MSG "69,166,93,255,123,34,99,104,97,108,108,101,110,103,101,34,58,34,51,57,\ -97,57,100,48,52,100,52,49,54,49,55,49,54,50,56,57,51,99,51,51,49,50,99,101,98,48,51,48,97,99,97,99,56,100,56,\ -98,100,48,99,99,57,102,99,101,98,99,97,98,53,52,48,50,97,52,51,56,57,49,51,52,49,100,34,44,34,99,117,114,114,\ -101,110,116,84,105,109,101,34,58,49,54,56,48,55,56,49,54,55,49,50,50,54,44,34,101,114,114,99,111,100,101,34,58,\ -48,44,34,115,101,114,118,101,114,73,110,102,111,34,58,123,34,97,99,116,105,118,101,83,105,116,101,34,58,34,119,\ -105,115,101,100,101,118,105,99,101,45,108,105,116,101,45,100,114,99,110,46,111,112,101,110,104,97,114,109,111,\ -110,121,46,99,110,34,44,34,115,116,97,110,100,98,121,83,105,116,101,34,58,34,119,105,115,101,100,101,118,105,99,\ -101,45,108,105,116,101,45,100,114,99,110,46,111,112,101,110,104,97,114,109,111,110,121,46,99,110,34,125,125,0" - -#define ATTEST_REST_ERROR_FIRST_MSG "210,0" -#define ATTEST_REST_ERROR_SECOND_MSG "5,49" -#define ATTEST_REST_ERROR_THIRD_MSG "69,128,194,255,123,34,101,114,114,99,111,100,101,34,58,49,53,48,48,51,125,0" - -#define ATTEST_AUTH_FIRST_MSG "226,0" -#define ATTEST_AUTH_SECOND_MSG "1,185,54" -#define ATTEST_AUTH_THIRD_MSG "69,184,100,255,123,34,99,104,97,108,108,101,110,103,101,34,58,34,97,56,49,52,\ -52,49,101,51,99,48,100,56,100,54,97,55,56,57,48,55,102,97,48,56,56,56,102,57,50,52,49,98,101,57,53,57,49,99,52,100,54,\ -98,55,97,53,51,51,51,49,56,98,48,49,48,102,98,50,99,51,100,57,98,56,48,34,44,34,99,117,114,114,101,110,116,84,105,109,\ -101,34,58,49,54,56,48,55,56,49,54,55,49,52,53,53,44,34,101,114,114,99,111,100,101,34,58,48,125,108" - -#define ATTEST_ACTIVE_FIRST_MSG "210,0" -#define ATTEST_ACTIVE_SECOND_MSG "1,49" -#define ATTEST_ACTIVE_THIRD_MSG "69,254,246,255,123,34,101,114,114,99,111,100,101,34,58,48,125,0" - -static const char *mockTlsData[MAX_INVOKE_TIME][INTERFACE_COUNT] = { - {ATTEST_RESET_CHAP_FIRST_MSG, ATTEST_REST_ERROR_FIRST_MSG, ATTEST_ACTIVE_FIRST_MSG, ATTEST_AUTH_FIRST_MSG}, - {ATTEST_RESET_CHAP_SECOND_MSG, ATTEST_REST_ERROR_SECOND_MSG, ATTEST_ACTIVE_SECOND_MSG, ATTEST_AUTH_SECOND_MSG}, - {ATTEST_RESET_CHAP_THIRD_MSG, ATTEST_REST_ERROR_THIRD_MSG, ATTEST_ACTIVE_THIRD_MSG, ATTEST_AUTH_THIRD_MSG} -}; -bool isHasExtend[4] = {true, true, true, true}; -int g_cout = 0; - -int32_t TLSConnect(TLSSession* session) -{ - ATTEST_LOG_DEBUG("[TLSConnect mock] Begin."); - if (session == NULL) { - return ERR_NET_INVALID_ARG; - } - return ATTEST_OK; -} - -int32_t TLSWrite(const TLSSession* session, const uint8_t* buf, size_t len) -{ - (void)session; - (void)buf; - (void)len; - return ATTEST_OK; -} - -int32_t TLSRead(const TLSSession* session, uint8_t* buf, size_t len) -{ - (void)session; - (void)len; - if (g_cout > MAX_INVOKE_TIME || (g_netType < 0 || g_netType > INTERFACE_COUNT - 1)) { - return ATTEST_ERR; - } - int32_t ret = AttestSeriaToBinary(mockTlsData[g_cout][g_netType], &buf, len); - g_cout++; - int32_t maxInvokeTime = isHasExtend[g_netType] ? MAX_INVOKE_TIME : MAX_NO_EXTEND_TIME; - if (g_cout == maxInvokeTime) { - g_cout = 0; - } - return ret; -} - -int32_t TLSClose(TLSSession* session) -{ - (void)session; - return ATTEST_OK; -} +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "securec.h" +#include "attest_channel.h" +#include "attest_tls.h" +#include "attest_utils.h" +#include "attest_utils_log.h" +#include "attest_tdd_mock_config.h" +#include "attest_tdd_data_transfer.h" + +int32_t g_netType = 0; + +#define MAX_INVOKE_TIME 3 +#define MAX_NO_EXTEND_TIME 2 +#define INTERFACE_COUNT 4 + +// can't change network +#define ATTEST_RESET_CHAP_FIRST_MSG "210,0" +#define ATTEST_RESET_CHAP_SECOND_MSG "227,49" +#define ATTEST_RESET_CHAP_THIRD_MSG "69,166,93,255,123,34,99,104,97,108,108,101,110,103,101,34,58,34,51,57,\ +97,57,100,48,52,100,52,49,54,49,55,49,54,50,56,57,51,99,51,51,49,50,99,101,98,48,51,48,97,99,97,99,56,100,56,\ +98,100,48,99,99,57,102,99,101,98,99,97,98,53,52,48,50,97,52,51,56,57,49,51,52,49,100,34,44,34,99,117,114,114,\ +101,110,116,84,105,109,101,34,58,49,54,56,48,55,56,49,54,55,49,50,50,54,44,34,101,114,114,99,111,100,101,34,58,\ +48,44,34,115,101,114,118,101,114,73,110,102,111,34,58,123,34,97,99,116,105,118,101,83,105,116,101,34,58,34,119,\ +105,115,101,100,101,118,105,99,101,45,108,105,116,101,45,100,114,99,110,46,111,112,101,110,104,97,114,109,111,\ +110,121,46,99,110,34,44,34,115,116,97,110,100,98,121,83,105,116,101,34,58,34,119,105,115,101,100,101,118,105,99,\ +101,45,108,105,116,101,45,100,114,99,110,46,111,112,101,110,104,97,114,109,111,110,121,46,99,110,34,125,125,0" + +#define ATTEST_REST_ERROR_FIRST_MSG "210,0" +#define ATTEST_REST_ERROR_SECOND_MSG "5,49" +#define ATTEST_REST_ERROR_THIRD_MSG "69,128,194,255,123,34,101,114,114,99,111,100,101,34,58,49,53,48,48,51,125,0" + +#define ATTEST_AUTH_FIRST_MSG "226,0" +#define ATTEST_AUTH_SECOND_MSG "1,185,54" +#define ATTEST_AUTH_THIRD_MSG "69,184,100,255,123,34,99,104,97,108,108,101,110,103,101,34,58,34,97,56,49,52,\ +52,49,101,51,99,48,100,56,100,54,97,55,56,57,48,55,102,97,48,56,56,56,102,57,50,52,49,98,101,57,53,57,49,99,52,100,54,\ +98,55,97,53,51,51,51,49,56,98,48,49,48,102,98,50,99,51,100,57,98,56,48,34,44,34,99,117,114,114,101,110,116,84,105,109,\ +101,34,58,49,54,56,48,55,56,49,54,55,49,52,53,53,44,34,101,114,114,99,111,100,101,34,58,48,125,108" + +#define ATTEST_ACTIVE_FIRST_MSG "210,0" +#define ATTEST_ACTIVE_SECOND_MSG "1,49" +#define ATTEST_ACTIVE_THIRD_MSG "69,254,246,255,123,34,101,114,114,99,111,100,101,34,58,48,125,0" + +static const char *mockTlsData[MAX_INVOKE_TIME][INTERFACE_COUNT] = { + {ATTEST_RESET_CHAP_FIRST_MSG, ATTEST_REST_ERROR_FIRST_MSG, ATTEST_ACTIVE_FIRST_MSG, ATTEST_AUTH_FIRST_MSG}, + {ATTEST_RESET_CHAP_SECOND_MSG, ATTEST_REST_ERROR_SECOND_MSG, ATTEST_ACTIVE_SECOND_MSG, ATTEST_AUTH_SECOND_MSG}, + {ATTEST_RESET_CHAP_THIRD_MSG, ATTEST_REST_ERROR_THIRD_MSG, ATTEST_ACTIVE_THIRD_MSG, ATTEST_AUTH_THIRD_MSG} +}; +bool isHasExtend[4] = {true, true, true, true}; +int g_cout = 0; + +int32_t TLSConnect(TLSSession* session) +{ + ATTEST_LOG_INFO("[TLSConnect mock] Begin."); + if (session == NULL) { + return ERR_NET_INVALID_ARG; + } + return ATTEST_OK; +} + +int32_t TLSWrite(const TLSSession* session, const uint8_t* buf, size_t len) +{ + (void)session; + (void)buf; + (void)len; + return ATTEST_OK; +} + +int32_t TLSRead(const TLSSession* session, uint8_t* buf, size_t len) +{ + (void)session; + (void)len; + ATTEST_LOG_INFO("[TLSRead mock] g_cout:%d, g_netType:%d", g_cout, g_netType); + if (g_cout > MAX_INVOKE_TIME || (g_netType < 0 || g_netType > INTERFACE_COUNT - 1)) { + return ATTEST_ERR; + } + int32_t ret = AttestSeriaToBinary(mockTlsData[g_cout][g_netType], &buf, len); + g_cout++; + int32_t maxInvokeTime = isHasExtend[g_netType] ? MAX_INVOKE_TIME : MAX_NO_EXTEND_TIME; + if (g_cout == maxInvokeTime) { + g_cout = 0; + } + return ret; +} + +int32_t TLSClose(TLSSession* session) +{ + (void)session; + return ATTEST_OK; +} diff --git a/test/tdd/gtest/attest_tdd_mock_property.c b/test/tdd/gtest/src/attest_tdd_mock_property.c similarity index 51% rename from test/tdd/gtest/attest_tdd_mock_property.c rename to test/tdd/gtest/src/attest_tdd_mock_property.c index eaa9dec..8fb79d8 100644 --- a/test/tdd/gtest/attest_tdd_mock_property.c +++ b/test/tdd/gtest/src/attest_tdd_mock_property.c @@ -1,70 +1,65 @@ -/* - * Copyright (C) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include "attest_utils.h" -#include "attest_adapter_os.h" - -const char* ATTEST_NET_VERSIONID = "default/hua-wei/kemin/default/OpenHarmony-4.0.3.2(Canary1)/ohos/max/10\ -/OpenHarmony 2.3 beta/debug"; -const char* ATTEST_BUILD_ROOT_HASH = "test666"; -const char* ATTEST_SOFTWARE_VERSION = "OpenHarmony 4.0.3.2"; -const char* ATTEST_PRODUCT_MODEL = "ohos"; -const char* ATTEST_BRAND = "kemin"; -const char* ATTEST_SECURITY_PATCH = "2022-09-01"; -const char* ATTEST_UDID = "81C9445279A3A417D4159FDFC62691BC8DA002E8463C70D23AB4CBF4DF98261C"; - -char* AttestGetVersionId(void) -{ - return AttestStrdup(ATTEST_NET_VERSIONID); -} - -char* AttestGetBuildRootHash(void) -{ - return AttestStrdup(ATTEST_BUILD_ROOT_HASH); -} - -char* AttestGetDisplayVersion(void) -{ - return AttestStrdup(ATTEST_SOFTWARE_VERSION); -} - -char* AttestGetProductModel(void) -{ - return AttestStrdup(ATTEST_PRODUCT_MODEL); -} - -char* AttestGetBrand(void) -{ - return AttestStrdup(ATTEST_BRAND); -} - -char* AttestGetSecurityPatchTag(void) -{ - return AttestStrdup(ATTEST_SECURITY_PATCH); -} - -char* AttestGetUdid(void) -{ - return AttestStrdup(ATTEST_UDID); -} - -char* AttestGetManufacture(void) -{ - return AttestStrdup(OsGetManufacture()); -} - -char* AttestGetSerial(void) -{ - return OsGetSerial(); -} +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "attest_utils.h" +#include "attest_adapter_os.h" +#include "attest_tdd_mock_property.h" + +char* AttestGetVersionId(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_VERSIONID); +} + +char* AttestGetBuildRootHash(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_HASH); +} + +char* AttestGetDisplayVersion(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_SOFTWARE_VERSION); +} + +char* AttestGetManufacture(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_MANU); +} + +char* AttestGetProductModel(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_MODEL); +} + +char* AttestGetBrand(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_BRAND); +} + +char* AttestGetSecurityPatchTag(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_PATCH); +} + +char* AttestGetUdid(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_UDID); +} + +char* AttestGetSerial(void) +{ + return AttestStrdup(ATTEST_MOCK_PROPERTY_SERIAL); +} diff --git a/test/tdd/gtest/src/attest_tdd_test.cpp b/test/tdd/gtest/src/attest_tdd_test.cpp new file mode 100644 index 0000000..26523f2 --- /dev/null +++ b/test/tdd/gtest/src/attest_tdd_test.cpp @@ -0,0 +1,636 @@ +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include + +#include "devattest_log.h" +#include "attest_entry.h" +#include "attest_result_info.h" +#include "attest_type.h" +#include "attest_service_active.h" +#include "attest_service_auth.h" +#include "attest_service_challenge.h" +#include "attest_service_device.h" +#include "attest_service.h" +#include "attest_service_device.h" +#include "attest_security_token.h" +#include "attest_service_reset.h" +#include "attest_network.h" +#include "attest_adapter.h" +#include "devattest_errno.h" +#include "attest_utils.h" +#include "attest_tdd_mock_property.h" +#include "attest_tdd_mock_hal.h" +#include "attest_tdd_test.h" +#include "attest_tdd_mock_config.h" + +using namespace testing::ext; +namespace OHOS { +namespace DevAttest { + +static const int32_t ATTEST_GET_CHANLLEGE = 0; +static const int32_t ATTEST_RESET = 1; +static const int32_t ATTEST_ACTIVE = 2; +static const int32_t ATTEST_AUTH = 3; + +static const char* ATTEST_REST_ERROR_EXPECT_RESULT = "15003"; +static const char* ATTEST_RESET_EXPECT_CHAP = "39a9d04d41617162893c3312ceb030acac8d8bd0cc9fcebcab5402a43891341d"; + +class AttestTddTest : public testing::Test { +public: + static void SetUpTestCase(void); + + static void TearDownTestCase(void); + + void SetUp(); + + void TearDown(); +}; + +void AttestTddTest::SetUpTestCase(void) +{ +} + +void AttestTddTest::TearDownTestCase(void) +{ +} + +void AttestTddTest::SetUp() +{ +} + +void AttestTddTest::TearDown() +{ +} + +/* + * @tc.name: TestInitSysData001 + * @tc.desc: Test init system data. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestInitSysData001, TestSize.Level1) +{ + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + EXPECT_STREQ(StrdupDevInfo(VERSION_ID), ATTEST_MOCK_PROPERTY_VERSIONID); + EXPECT_STREQ(StrdupDevInfo(ROOT_HASH), ATTEST_MOCK_PROPERTY_HASH); + EXPECT_STREQ(StrdupDevInfo(DISPLAY_VERSION), ATTEST_MOCK_PROPERTY_SOFTWARE_VERSION); + EXPECT_STREQ(StrdupDevInfo(MANU_FACTURE), ATTEST_MOCK_PROPERTY_MANU); + EXPECT_STREQ(StrdupDevInfo(PRODUCT_MODEL), ATTEST_MOCK_PROPERTY_MODEL); + EXPECT_STREQ(StrdupDevInfo(BRAND), ATTEST_MOCK_PROPERTY_BRAND); + EXPECT_STREQ(StrdupDevInfo(SECURITY_PATCH_TAG), ATTEST_MOCK_PROPERTY_PATCH); + EXPECT_STREQ(StrdupDevInfo(UDID), ATTEST_MOCK_PROPERTY_UDID); + // 恢复环境 + DestroySysData(); + EXPECT_TRUE(StrdupDevInfo(VERSION_ID) == NULL); +} + +/* + * @tc.name: TestInitNetWork001 + * @tc.desc: Test init network, result is success. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestInitNetWork001, TestSize.Level1) +{ + int ret = InitNetworkServerInfo(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + ServerInfo* serverInfo = (ServerInfo*)g_attestNetworkList.head->data; + EXPECT_STREQ(serverInfo->hostName, ATTEST_MOCK_HAL_NETWORK_RESULT); + ReleaseList(&g_attestNetworkList); +} + +/* + * @tc.name: TestInitNetWork002 + * @tc.desc: Test init network, result is fail. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestInitNetWork002, TestSize.Level1) +{ + int ret = InitNetworkServerInfo(); + EXPECT_TRUE(ret == DEVATTEST_FAIL); + ReleaseList(&g_attestNetworkList); +} + +/* + * @tc.name: TestGetAuthStatus001 + * @tc.desc: Test get authStatus. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGetAuthStatus001, TestSize.Level1) +{ + int32_t ret = FlushAuthResult(ATTEST_MOCK_HAL_TICKET, ATTEST_MOCK_HAL_STATUS); + EXPECT_TRUE((ret == DEVATTEST_SUCCESS)); + char *status = nullptr; + ret = GetAuthStatus(&status); + EXPECT_TRUE((ret == DEVATTEST_SUCCESS)); + EXPECT_TRUE((status != nullptr)); + if (status == nullptr) { + return; + } + EXPECT_STREQ(ATTEST_MOCK_HAL_STATUS, status); + free(status); +} + +/* + * @tc.name: TestDecodeAuthStatus001 + * @tc.desc: Test decode auth status. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestDecodeAuthStatus001, TestSize.Level1) +{ + char *status = nullptr; + int32_t ret = GetAuthStatus(&status); + EXPECT_TRUE((ret == DEVATTEST_SUCCESS)); + AuthStatus* outStatus = CreateAuthStatus(); + EXPECT_TRUE((outStatus != nullptr)); + if (outStatus == nullptr) { + return; + } + ret = DecodeAuthStatus(status, outStatus); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + SoftwareResultDetail* detail = outStatus->softwareResultDetail; + EXPECT_TRUE((outStatus->versionId != nullptr) && (outStatus->authType != nullptr) && (detail != nullptr)); + if ((outStatus->versionId == nullptr) || (outStatus->authType == nullptr) || (detail == nullptr)) { + DestroyAuthStatus(&outStatus); + return; + } + EXPECT_TRUE(outStatus->hardwareResult == ATTEST_HARDWARE_RESULT); + EXPECT_STREQ(outStatus->authType, ATTEST_AUTH_TYPE); + EXPECT_TRUE(outStatus->expireTime == ATTEST_EXPIRE_TIME); + EXPECT_STREQ(outStatus->versionId, ATTEST_VERSION_ID); + EXPECT_TRUE(outStatus->softwareResult == ATTEST_SOFTWARE_RESULT); + DestroyAuthStatus(&outStatus); +} + +/* + * @tc.name: TestCheckExpireTime001 + * @tc.desc: Test check expire time. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestCheckExpireTime001, TestSize.Level1) +{ + AuthStatus* outStatus = CreateAuthStatus(); + EXPECT_TRUE(outStatus != nullptr); + if (outStatus == nullptr) { + return; + } + outStatus->expireTime = 19673222; + uint64_t currentTime = 19673223; + int32_t ret = CheckExpireTime(outStatus, currentTime); + EXPECT_TRUE(ret != DEVATTEST_SUCCESS); + outStatus->expireTime = 19673222; + currentTime = 19673221; + ret = CheckExpireTime(outStatus, currentTime); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + free(outStatus); +} + +/* + * @tc.name: TestCheckAuthResult001 + * @tc.desc: Test check auth result. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestCheckAuthResult001, TestSize.Level1) +{ + AuthStatus* outStatus = CreateAuthStatus(); + EXPECT_TRUE(outStatus != nullptr); + if (outStatus == nullptr) { + return; + } + outStatus->hardwareResult = 1; + outStatus->softwareResult = 0; + int32_t ret = CheckAuthResult(outStatus); + EXPECT_TRUE(ret != DEVATTEST_SUCCESS); + outStatus->hardwareResult = 0; + ret = CheckAuthResult(outStatus); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + free(outStatus); +} + +static AuthResult *GetAuthResult() +{ + AuthResult *authResult = CreateAuthResult(); + if (authResult == nullptr) { + return nullptr; + } + int32_t ret = ParseAuthResultResp(ATTEST_AUTH_EXPECT_RESULT, authResult); + if (ret != DEVATTEST_SUCCESS) { + DestroyAuthResult(&authResult); + return nullptr; + } + return authResult; +} + +static DevicePacket* TddGenMsg(int input) +{ + DevicePacket* reqMsg = nullptr; + int32_t ret = DEVATTEST_SUCCESS; + ChallengeResult challenge; + do { + if (input == ATTEST_CASE_RESET) { + challenge.challenge = (char*)ATTEST_RESET_CHAP; + challenge.currentTime = ATTEST_RESET_CHAP_TIME; + ret = GenResetMsg(&challenge, &reqMsg); + break; + } + if (input == ATTEST_CASE_AUTH) { + challenge.challenge = (char*)ATTEST_AUTH_CHAP; + challenge.currentTime = ATTEST_AUTH_CHAP_TIME; + ret = GenAuthMsg(&challenge, &reqMsg); + break; + } + if (input == ATTEST_CASE_ACTIVE) { + challenge.challenge = (char*)ATTEST_ACTIVE_CHAP; + challenge.currentTime = ATTEST_ACTIVE_CHAP_TIME; + AuthResult *authResult = GetAuthResult(); + ret = GenActiveMsg(authResult, &challenge, &reqMsg); + break; + } + } while (0); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + if (ret != DEVATTEST_SUCCESS) { + FREE_DEVICE_PACKET(reqMsg); + return nullptr; + } + return reqMsg; +} + +/* + * @tc.name: TestGenResetMsg001 + * @tc.desc: Test gen reset msg with stored token. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGenResetMsg001, TestSize.Level1) +{ + AttestSetMockReadTokenRet(ATTEST_OK); + // 初始化参数 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_RESET); + EXPECT_TRUE((reqMsg != nullptr)); + if (reqMsg == nullptr) { + DestroySysData(); + return; + } + char *outToken = reqMsg->tokenInfo.token; + EXPECT_TRUE(outToken != nullptr); + if (outToken == NULL) { + FREE_DEVICE_PACKET(reqMsg); + DestroySysData(); + return; + } + EXPECT_TRUE(strcmp(ATTEST_RESET_GEN_TOKEN, outToken) == 0); + FREE_DEVICE_PACKET(reqMsg); + // 恢复环境 + DestroySysData(); +} + +/* + * @tc.name: TestGenResetMsg002 + * @tc.desc: Test gen reset msg without token. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGenResetMsg002, TestSize.Level1) +{ + AttestSetMockReadTokenRet(TOKEN_UNPRESET); + // 初始化参数 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_RESET); + EXPECT_TRUE((reqMsg != nullptr)); + if (reqMsg == nullptr) { + DestroySysData(); + return; + } + char *outToken = reqMsg->tokenInfo.token; + EXPECT_TRUE(outToken != nullptr); + if (outToken == NULL) { + FREE_DEVICE_PACKET(reqMsg); + DestroySysData(); + return; + } +#if defined(__ATTEST_ENABLE_PRESET_TOKEN__) + EXPECT_TRUE(strcmp(ATTEST_RESET_GEN_ONLINE_TOKEN, outToken) == 0); + + outToken = reqMsg->tokenInfo.uuid; + EXPECT_TRUE(outToken != nullptr); + if (outToken == NULL) { + FREE_DEVICE_PACKET(reqMsg); + DestroySysData(); + return; + } + EXPECT_TRUE(strcmp(ATTEST_RESET_GEN_ONLINE_TOKEN_ID, outToken) == 0); +#else + EXPECT_TRUE(strcmp(ATTEST_RESET_GEN_PRODUCT_TOKEN, outToken) == 0); +#endif + FREE_DEVICE_PACKET(reqMsg); + // 恢复环境 + DestroySysData(); +} + +/* + * @tc.name: TestParseResetResult001 + * @tc.desc: Test parse reset result,result is ok. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestParseResetResult001, TestSize.Level1) +{ + string input = "{\"errcode\":0}"; + int32_t ret = ParseResetResult(input.c_str()); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + input = "{\"errcode\":\"-32s\"}"; + ret = ParseResetResult(input.c_str()); + EXPECT_TRUE((ret != DEVATTEST_SUCCESS)); +} + +/* + * @tc.name: TestGenAuthMsg001 + * @tc.desc: Test gen auth msg. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGenAuthMsg001, TestSize.Level1) +{ + AttestSetMockReadTokenRet(ATTEST_OK); + // 初始化参数 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_AUTH); + EXPECT_TRUE((reqMsg != nullptr)); + if (reqMsg == NULL) { + return; + } + char *outToken = reqMsg->tokenInfo.token; + EXPECT_TRUE(outToken != nullptr); + if (outToken == NULL) { + FREE_DEVICE_PACKET(reqMsg); + return; + } + EXPECT_TRUE(strcmp(outToken, ATTEST_AUTH_GEN_TOKEN) == 0); + FREE_DEVICE_PACKET(reqMsg); + // 恢复环境 + DestroySysData(); +} + +/* + * @tc.name: TestGenAuthMsg002 + * @tc.desc: Test gen auth msg without token. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGenAuthMsg002, TestSize.Level1) +{ + AttestSetMockReadTokenRet(TOKEN_UNPRESET); + // 初始化参数 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_AUTH); + EXPECT_TRUE((reqMsg != nullptr)); + if (reqMsg == nullptr) { + return; + } + char *outToken = reqMsg->tokenInfo.token; + EXPECT_TRUE(outToken != nullptr); + if (outToken == NULL) { + FREE_DEVICE_PACKET(reqMsg); + return; + } +#if defined(__ATTEST_ENABLE_PRESET_TOKEN__) + EXPECT_TRUE(strcmp(ATTEST_AUTH_GEN_ONLINE_TOKEN, outToken) == 0); +#else + EXPECT_TRUE(strcmp(ATTEST_AUTH_GEN_PRODUCT_TOKEN, outToken) == 0); +#endif + FREE_DEVICE_PACKET(reqMsg); + // 恢复环境 + DestroySysData(); +} + +/* + * @tc.name: TestParseAuthResultResp001 + * @tc.desc: Test parse auth result resp. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestParseAuthResultResp001, TestSize.Level1) +{ + AuthResult *authResult = GetAuthResult(); + EXPECT_TRUE(authResult != nullptr); + if (authResult == nullptr) { + return; + } + EXPECT_TRUE((authResult->ticket != nullptr) && (authResult->tokenValue != nullptr) && + (authResult->authStatus != nullptr)); + if (authResult->ticket != nullptr) { + EXPECT_TRUE(strcmp(authResult->ticket, ATTEST_MOCK_HAL_TICKET) == 0); + } + DestroyAuthResult(&authResult); +} + +/* + * @tc.name: TestGenActiveMsg001 + * @tc.desc: Test gen active msg. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGenActiveMsg001, TestSize.Level1) +{ + AttestSetMockReadTokenRet(ATTEST_OK); + // 初始化参数 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_ACTIVE); + EXPECT_TRUE((reqMsg != nullptr)); + if (reqMsg == NULL) { + return; + } + char *outToken = reqMsg->tokenInfo.token; + EXPECT_TRUE(outToken != nullptr); + if (outToken == NULL) { + FREE_DEVICE_PACKET(reqMsg); + return; + } + EXPECT_TRUE(strcmp(outToken, ATTEST_ACTIVE_GEN_TOKEN) == 0); + FREE_DEVICE_PACKET(reqMsg); + // 恢复环境 + DestroySysData(); +} + +/* + * @tc.name: TestGenActiveMsg002 + * @tc.desc: Test gen auth msg without token. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGenActiveMsg002, TestSize.Level1) +{ + AttestSetMockReadTokenRet(TOKEN_UNPRESET); + // 初始化参数 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_ACTIVE); + EXPECT_TRUE((reqMsg != nullptr)); + if (reqMsg == nullptr) { + return; + } + char *outToken = reqMsg->tokenInfo.token; + EXPECT_TRUE(outToken != nullptr); + if (outToken == NULL) { + FREE_DEVICE_PACKET(reqMsg); + return; + } +#if defined(__ATTEST_ENABLE_PRESET_TOKEN__) + EXPECT_TRUE(strcmp(ATTEST_ACTIVE_GEN_ONLINE_TOKEN, outToken) == 0); +#else + EXPECT_TRUE(strcmp(ATTEST_ACTIVE_GEN_PRODUCT_TOKEN, outToken) == 0); +#endif + FREE_DEVICE_PACKET(reqMsg); + // 恢复环境 + DestroySysData(); +} + +/* + * @tc.name: TestParseActiveResult001 + * @tc.desc: Test parse active result,result is ok. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestParseActiveResult001, TestSize.Level1) +{ + string input = "{\"errcode\":0}"; + int32_t ret = ParseActiveResult(input.c_str()); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + input = "{\"errcode\":\"-32s\"}"; + ret = ParseActiveResult(input.c_str()); + EXPECT_TRUE((ret != DEVATTEST_SUCCESS)); +} + +/* + * @tc.name: TestGetChallenge001 + * @tc.desc: Test get reset challenge. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestGetChallenge001, TestSize.Level1) +{ + // 初始化环境 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + (void)InitNetworkServerInfo(); + (void)D2CConnect(); + + g_netType = ATTEST_GET_CHANLLEGE; + ChallengeResult* challenge = NULL; + ret = GetChallenge(&challenge, ATTEST_ACTION_RESET); + EXPECT_TRUE(ret == ATTEST_OK); + EXPECT_TRUE(challenge != NULL); + if (ret == ATTEST_OK && challenge != NULL) { + EXPECT_TRUE(strcmp(ATTEST_RESET_EXPECT_CHAP, challenge->challenge) == 0); + FREE_CHALLENGE_RESULT(challenge); + } + // 恢复环境 + DestroySysData(); + EXPECT_TRUE(StrdupDevInfo(VERSION_ID) == NULL); +} + +/* + * @tc.name: TestSendResetMsg001 + * @tc.desc: Test send reset msg. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestSendResetMsg001, TestSize.Level1) +{ + // 初始化环境 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + (void)InitNetworkServerInfo(); + (void)D2CConnect(); + + g_netType = ATTEST_RESET; + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_RESET); + if (reqMsg == NULL) { + return; + } + char* respMsg = NULL; + ret = SendResetMsg(reqMsg, &respMsg); + EXPECT_TRUE((ret == ATTEST_OK) && (respMsg != NULL)); + FREE_DEVICE_PACKET(reqMsg); + if ((ret == ATTEST_OK) && (respMsg != NULL)) { + EXPECT_TRUE(strstr(respMsg, ATTEST_REST_ERROR_EXPECT_RESULT) != nullptr); + free(respMsg); + } + // 恢复环境 + DestroySysData(); + EXPECT_TRUE(StrdupDevInfo(VERSION_ID) == NULL); +} + +/* + * @tc.name: TestSendActiveMsg001 + * @tc.desc: Test send active msg. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestSendActiveMsg001, TestSize.Level1) +{ + // 初始化环境 + int32_t ret = InitSysData(); + EXPECT_TRUE(ret == DEVATTEST_SUCCESS); + + (void)InitNetworkServerInfo(); + (void)D2CConnect(); + + g_netType = ATTEST_ACTIVE; + DevicePacket* reqMsg = TddGenMsg(ATTEST_CASE_ACTIVE); + ASSERT_TRUE(reqMsg != NULL); + + char* respMsg = NULL; + ret = SendActiveMsg(reqMsg, &respMsg); + EXPECT_TRUE((ret == ATTEST_OK) && (respMsg != NULL)); + FREE_DEVICE_PACKET(reqMsg); + if ((ret == ATTEST_OK) && (respMsg != NULL)) { + const char* ATTEST_ACTIVE_EXPECT_RESULT = "{\"errcode\":0}"; + EXPECT_TRUE(strcmp(ATTEST_ACTIVE_EXPECT_RESULT, respMsg) == 0); + free(respMsg); + } + // 恢复环境 + DestroySysData(); + EXPECT_TRUE(StrdupDevInfo(VERSION_ID) == NULL); +} + +/* + * @tc.name: TestQueryAttestStatus001 + * @tc.desc: Test query attest status. + * @tc.type: FUNC + */ +HWTEST_F(AttestTddTest, TestQueryAttestStatus001, TestSize.Level1) +{ + AuthResult *authResult = GetAuthResult(); + if (authResult == nullptr) { + return; + } + int32_t ret = FlushToken(authResult); + EXPECT_TRUE((ret == DEVATTEST_SUCCESS)); + uint8_t authResultCode = ATTEST_RESULT_CODE; + AttestWriteAuthResultCode((char*)&authResultCode, 1); + AttestResultInfo attestResultInfo = { .softwareResultDetail = {-2, -2, -2, -2, -2} }; + attestResultInfo.ticket = NULL; + ret = EntryGetAttestStatus(&attestResultInfo); + EXPECT_TRUE((ret == ATTEST_OK) && (attestResultInfo.authResult == ATTEST_OK)); + EXPECT_TRUE((attestResultInfo.ticket != nullptr)); + if (attestResultInfo.ticket == nullptr) { + return; + } + EXPECT_TRUE(strcmp(attestResultInfo.ticket, ATTEST_MOCK_HAL_TICKET) == 0); +} +} +} \ No newline at end of file diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index f7a3e32..51de9aa 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -14,6 +14,5 @@ import("//test/xts/device_attest_lite/build/devattestconfig.gni") group("unittest") { - testonly = true deps = [ "${devattest_path}/test/tdd/gtest:device_attest_tdd" ] }