X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fsecurity%2Fsrc%2Fpstatresource.c;h=e32c86c5ccf30ba1d4103ce413ca278d26881568;hb=3c093548382bb2542c87a67e6e5fa32552c29cb3;hp=4c71325cb7d3fb27ca94d10ad628fabaaf031b79;hpb=a7c3eeca4a2f4482d6c0879b29f4f4e9130b1874;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/security/src/pstatresource.c b/resource/csdk/security/src/pstatresource.c index 4c71325..e32c86c 100644 --- a/resource/csdk/security/src/pstatresource.c +++ b/resource/csdk/security/src/pstatresource.c @@ -24,6 +24,7 @@ #include "ocstack.h" #include "oic_malloc.h" #include "ocpayload.h" +#include "ocpayloadcbor.h" #include "payload_logging.h" #include "resourcemanager.h" #include "pstatresource.h" @@ -32,7 +33,7 @@ #include "srmresourcestrings.h" #include "srmutility.h" -#define TAG "SRM-PSTAT" +#define TAG "OIC_SRM_PSTAT" /** Default cbor payload size. This value is increased in case of CborErrorOutOfMemory. * The value of payload size is increased until reaching below max cbor size. */ @@ -42,7 +43,10 @@ static const uint16_t CBOR_SIZE = 512; static const uint16_t CBOR_MAX_SIZE = 4400; // PSTAT Map size - Number of mandatory items -static const uint8_t PSTAT_MAP_SIZE = 9; +static const uint8_t PSTAT_MAP_SIZE = 6; + +// Number of writeable property +static const uint8_t WRITEABLE_PROPERTY_SIZE = 3; static OicSecDpom_t gSm = SINGLE_SERVICE_CLIENT_DRIVEN; static OicSecPstat_t gDefaultPstat = @@ -64,6 +68,14 @@ static OicSecPstat_t *gPstat = NULL; static OCResourceHandle gPstatHandle = NULL; +/** + * This method is internal method. + * the param roParsed is optionally used to know whether cborPayload has + * at least read only property value or not. + */ +static OCStackResult CBORPayloadToPstatBin(const uint8_t *cborPayload, const size_t size, + OicSecPstat_t **secPstat, bool *roParsed); + void DeletePstatBinData(OicSecPstat_t* pstat) { if (pstat) @@ -76,7 +88,8 @@ void DeletePstatBinData(OicSecPstat_t* pstat) } } -OCStackResult PstatToCBORPayload(const OicSecPstat_t *pstat, uint8_t **payload, size_t *size) +OCStackResult PstatToCBORPayload(const OicSecPstat_t *pstat, uint8_t **payload, size_t *size, + bool writableOnly) { if (NULL == pstat || NULL == payload || NULL != *payload || NULL == size) { @@ -93,7 +106,7 @@ OCStackResult PstatToCBORPayload(const OicSecPstat_t *pstat, uint8_t **payload, *size = 0; OCStackResult ret = OC_STACK_ERROR; - + size_t pstatMapSize = PSTAT_MAP_SIZE; CborEncoder encoder; CborEncoder pstatMap; char* strUuid = NULL; @@ -104,7 +117,12 @@ OCStackResult PstatToCBORPayload(const OicSecPstat_t *pstat, uint8_t **payload, VERIFY_NON_NULL(TAG, outPayload, ERROR); cbor_encoder_init(&encoder, outPayload, cborLen, 0); - cborEncoderResult = cbor_encoder_create_map(&encoder, &pstatMap, PSTAT_MAP_SIZE); + if (false == writableOnly) + { + pstatMapSize += WRITEABLE_PROPERTY_SIZE; + } + + cborEncoderResult = cbor_encoder_create_map(&encoder, &pstatMap, pstatMapSize); VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Pstat Map."); cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_ISOP_NAME, @@ -113,16 +131,6 @@ OCStackResult PstatToCBORPayload(const OicSecPstat_t *pstat, uint8_t **payload, cborEncoderResult = cbor_encode_boolean(&pstatMap, pstat->isOp); VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding ISOP Name Value."); - cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_DEVICE_ID_NAME, - strlen(OIC_JSON_DEVICE_ID_NAME)); - VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Device Id Tag."); - ret = ConvertUuidToStr(&pstat->deviceID, &strUuid); - VERIFY_SUCCESS(TAG, OC_STACK_OK == ret , ERROR); - cborEncoderResult = cbor_encode_text_string(&pstatMap, strUuid, strlen(strUuid)); - VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Device Id Value."); - OICFree(strUuid); - strUuid = NULL; - cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_CM_NAME, strlen(OIC_JSON_CM_NAME)); VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding CM Name Tag."); @@ -141,21 +149,34 @@ OCStackResult PstatToCBORPayload(const OicSecPstat_t *pstat, uint8_t **payload, cborEncoderResult = cbor_encode_int(&pstatMap, pstat->om); VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding OM Name Value."); - cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_SM_NAME, - strlen(OIC_JSON_SM_NAME)); - VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding SM Name Tag."); - cborEncoderResult = cbor_encode_int(&pstatMap, pstat->sm[0]); - VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding SM Name Value."); - - cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_ROWNERID_NAME, - strlen(OIC_JSON_ROWNERID_NAME)); - VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding ROwner Id Tag."); - ret = ConvertUuidToStr(&pstat->rownerID, &strUuid); - VERIFY_SUCCESS(TAG, OC_STACK_OK == ret , ERROR); - cborEncoderResult = cbor_encode_text_string(&pstatMap, strUuid, strlen(strUuid)); - VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding ROwner Id Value."); - OICFree(strUuid); - strUuid = NULL; + if (false == writableOnly) + { + cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_SM_NAME, + strlen(OIC_JSON_SM_NAME)); + VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding SM Name Tag."); + cborEncoderResult = cbor_encode_int(&pstatMap, pstat->sm[0]); + VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding SM Name Value."); + + cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_DEVICE_ID_NAME, + strlen(OIC_JSON_DEVICE_ID_NAME)); + VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Device Id Tag."); + ret = ConvertUuidToStr(&pstat->deviceID, &strUuid); + VERIFY_SUCCESS(TAG, OC_STACK_OK == ret , ERROR); + cborEncoderResult = cbor_encode_text_string(&pstatMap, strUuid, strlen(strUuid)); + VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Device Id Value."); + OICFree(strUuid); + strUuid = NULL; + + cborEncoderResult = cbor_encode_text_string(&pstatMap, OIC_JSON_ROWNERID_NAME, + strlen(OIC_JSON_ROWNERID_NAME)); + VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding ROwner Id Tag."); + ret = ConvertUuidToStr(&pstat->rownerID, &strUuid); + VERIFY_SUCCESS(TAG, OC_STACK_OK == ret , ERROR); + cborEncoderResult = cbor_encode_text_string(&pstatMap, strUuid, strlen(strUuid)); + VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding ROwner Id Value."); + OICFree(strUuid); + strUuid = NULL; + } //RT -- Mandatory CborEncoder rtArray; @@ -194,7 +215,7 @@ OCStackResult PstatToCBORPayload(const OicSecPstat_t *pstat, uint8_t **payload, if (CborNoError == cborEncoderResult) { - *size = encoder.ptr - outPayload; + *size = cbor_encoder_get_buffer_size(&encoder, outPayload); *payload = outPayload; ret = OC_STACK_OK; } @@ -203,10 +224,11 @@ exit: { // reallocate and try again! OICFree(outPayload); + outPayload = NULL; // Since the allocated initial memory failed, double the memory. - cborLen += encoder.ptr - encoder.end; + cborLen += cbor_encoder_get_buffer_size(&encoder, encoder.end); cborEncoderResult = CborNoError; - ret = PstatToCBORPayload(pstat, payload, &cborLen); + ret = PstatToCBORPayload(pstat, payload, &cborLen, writableOnly); if (OC_STACK_OK == ret) { *size = cborLen; @@ -228,6 +250,12 @@ exit: OCStackResult CBORPayloadToPstat(const uint8_t *cborPayload, const size_t size, OicSecPstat_t **secPstat) { + return CBORPayloadToPstatBin(cborPayload, size, secPstat, NULL); +} + +static OCStackResult CBORPayloadToPstatBin(const uint8_t *cborPayload, const size_t size, + OicSecPstat_t **secPstat, bool *roParsed) +{ if (NULL == cborPayload || NULL == secPstat || NULL != *secPstat || 0 == size) { return OC_STACK_INVALID_PARAM; @@ -258,6 +286,11 @@ OCStackResult CBORPayloadToPstat(const uint8_t *cborPayload, const size_t size, cborFindResult = cbor_value_get_boolean(&pstatMap, &pstat->isOp); VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding isOp Value."); } + else + { + pstat->isOp = gPstat->isOp; + cborFindResult = CborNoError; + } cborFindResult = cbor_value_map_find_value(&pstatCbor, OIC_JSON_DEVICE_ID_NAME, &pstatMap); if (CborNoError == cborFindResult && cbor_value_is_text_string(&pstatMap)) @@ -268,37 +301,84 @@ OCStackResult CBORPayloadToPstat(const uint8_t *cborPayload, const size_t size, VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR); OICFree(strUuid ); strUuid = NULL; + + } + else + { + memcpy(&pstat->deviceID, &gPstat->deviceID, sizeof(OicUuid_t)); + cborFindResult = CborNoError; } cborFindResult = cbor_value_map_find_value(&pstatCbor, OIC_JSON_CM_NAME, &pstatMap); if (CborNoError == cborFindResult && cbor_value_is_integer(&pstatMap)) { - cborFindResult = cbor_value_get_int(&pstatMap, (int *) &pstat->cm); + int cm; + + cborFindResult = cbor_value_get_int(&pstatMap, &cm); VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding CM."); + pstat->cm = (OicSecDpm_t)cm; + } + else + { + pstat->cm = gPstat->cm; + cborFindResult = CborNoError; } cborFindResult = cbor_value_map_find_value(&pstatCbor, OIC_JSON_TM_NAME, &pstatMap); if (CborNoError == cborFindResult && cbor_value_is_integer(&pstatMap)) { - cborFindResult = cbor_value_get_int(&pstatMap, (int *) &pstat->tm); + int tm; + + cborFindResult = cbor_value_get_int(&pstatMap, &tm); VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding TM."); + pstat->tm = (OicSecDpm_t)tm; + } + else + { + pstat->tm = gPstat->tm; + cborFindResult = CborNoError; } cborFindResult = cbor_value_map_find_value(&pstatCbor, OIC_JSON_OM_NAME, &pstatMap); if (CborNoError == cborFindResult && cbor_value_is_integer(&pstatMap)) { - cborFindResult = cbor_value_get_int(&pstatMap, (int *) &pstat->om); + int om; + + cborFindResult = cbor_value_get_int(&pstatMap, &om); VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding OM."); + pstat->om = (OicSecDpom_t)om; + } + else + { + pstat->om = gPstat->om; + cborFindResult = CborNoError; } cborFindResult = cbor_value_map_find_value(&pstatCbor, OIC_JSON_SM_NAME, &pstatMap); if (CborNoError == cborFindResult && cbor_value_is_integer(&pstatMap)) { + int sm; + pstat->smLen = 1; pstat->sm = (OicSecDpom_t*)OICCalloc(pstat->smLen, sizeof(OicSecDpom_t)); - cborFindResult = cbor_value_get_int(&pstatMap, (int *) &pstat->sm[0]); + VERIFY_NON_NULL(TAG, pstat->sm, ERROR); + cborFindResult = cbor_value_get_int(&pstatMap, &sm); VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding SM."); + pstat->sm[0] = (OicSecDpom_t)sm; + if (roParsed) + { + *roParsed = true; + } + } + else + { + VERIFY_NON_NULL(TAG, gPstat, ERROR); + pstat->smLen = gPstat->smLen; + pstat->sm = (OicSecDpom_t*)OICCalloc(pstat->smLen, sizeof(OicSecDpom_t)); + VERIFY_NON_NULL(TAG, pstat->sm, ERROR); + *pstat->sm = *gPstat->sm; + cborFindResult = CborNoError; } cborFindResult = cbor_value_map_find_value(&pstatCbor, OIC_JSON_ROWNERID_NAME, &pstatMap); @@ -311,6 +391,12 @@ OCStackResult CBORPayloadToPstat(const uint8_t *cborPayload, const size_t size, OICFree(strUuid ); strUuid = NULL; } + else + { + VERIFY_NON_NULL(TAG, gPstat, ERROR); + memcpy(pstat->rownerID.id, gPstat->rownerID.id, sizeof(gPstat->rownerID.id)); + cborFindResult = CborNoError; + } *secPstat = pstat; ret = OC_STACK_OK; @@ -337,7 +423,7 @@ static bool UpdatePersistentStorage(OicSecPstat_t *pstat) size_t size = 0; uint8_t *cborPayload = NULL; - OCStackResult ret = PstatToCBORPayload(pstat, &cborPayload, &size); + OCStackResult ret = PstatToCBORPayload(pstat, &cborPayload, &size, false); if (OC_STACK_OK == ret) { if (OC_STACK_OK == UpdateSecureResourceInPS(OIC_JSON_PSTAT_NAME, cborPayload, size)) @@ -379,6 +465,30 @@ static bool ValidateQuery(const char * query) return (bInterfaceQry ? bInterfaceMatch: true); } +#ifdef MULTIPLE_OWNER +bool IsValidPstatAccessForSubOwner(const uint8_t *cborPayload, size_t size) +{ + OicSecPstat_t* pstat = NULL; + bool isValidPstat = true; + + OIC_LOG_BUFFER(DEBUG, TAG, cborPayload, size); + VERIFY_NON_NULL(TAG, cborPayload, ERROR); + VERIFY_SUCCESS(TAG, 0 != size, ERROR); + VERIFY_SUCCESS(TAG, OC_STACK_OK == CBORPayloadToPstat(cborPayload, size, &pstat), ERROR); + VERIFY_NON_NULL(TAG, pstat, ERROR); + + if (RESET & pstat->cm) + { + OIC_LOG(ERROR, TAG, "SubOwner can't reset the server."); + isValidPstat = false; + } + +exit: + DeletePstatBinData(pstat); + return isValidPstat; +} +#endif //MULTIPLE_OWNER + /** * The entity handler determines how to process a GET request. */ @@ -409,7 +519,7 @@ static OCEntityHandlerResult HandlePstatGetRequest (const OCEntityHandlerRequest uint8_t *payload = NULL; if (ehRet == OC_EH_OK) { - if(OC_STACK_OK != PstatToCBORPayload(gPstat, &payload, &size)) + if(OC_STACK_OK != PstatToCBORPayload(gPstat, &payload, &size, false)) { OIC_LOG(WARNING, TAG, "PstatToCBORPayload failed in HandlePstatGetRequest"); } @@ -428,57 +538,109 @@ static OCEntityHandlerResult HandlePstatGetRequest (const OCEntityHandlerRequest * resource or create a new resource. * For pstat, it updates only tm and om. */ -static OCEntityHandlerResult HandlePstatPostRequest(const OCEntityHandlerRequest *ehRequest) +static OCEntityHandlerResult HandlePstatPostRequest(OCEntityHandlerRequest *ehRequest) { OCEntityHandlerResult ehRet = OC_EH_ERROR; OIC_LOG(INFO, TAG, "HandlePstatPostRequest processing POST request"); OicSecPstat_t *pstat = NULL; - static uint16_t prevMsgId = 0; + static uint16_t previousMsgId = 0; + bool isDuplicatedMsg = false; - if (ehRequest->payload) + if (ehRequest->payload && NULL != gPstat) { uint8_t *payload = ((OCSecurityPayload *) ehRequest->payload)->securityData; size_t size = ((OCSecurityPayload *) ehRequest->payload)->payloadSize; VERIFY_NON_NULL(TAG, payload, ERROR); - OCStackResult ret = CBORPayloadToPstat(payload, size, &pstat); + bool roParsed = false; + OCStackResult ret = CBORPayloadToPstatBin(payload, size, &pstat, &roParsed); VERIFY_NON_NULL(TAG, pstat, ERROR); if (OC_STACK_OK == ret) { - if (true == (pstat->cm & RESET) && false == pstat->isOp) + bool validReq = false; + + /* + * message ID is supported for CoAP over UDP only according to RFC 7252 + * So we should check message ID to prevent duplicate request handling in case of OC_ADAPTER_IP. + * In case of other transport adapter, duplicate message check is not required. + */ + if (OC_ADAPTER_IP == ehRequest->devAddr.adapter && + previousMsgId == ehRequest->messageID) { - gPstat->cm = pstat->cm; - OIC_LOG(INFO, TAG, "State changed to Ready for Reset"); + isDuplicatedMsg = true; } - else if (false == (pstat->cm & TAKE_OWNER) && false == pstat->isOp) + + if (true == roParsed) { - gPstat->cm = pstat->cm; - OIC_LOG (INFO, TAG, "State changed to Ready for Provisioning"); + OIC_LOG(ERROR, TAG, "Not acceptable request because of read-only properties"); + ehRet = OC_EH_NOT_ACCEPTABLE; + goto exit; } - else if (false == (pstat->cm & TAKE_OWNER) && true == pstat->isOp) + + //operation mode(om) should be one of supported modes(sm) + for(size_t i = 0; i < gPstat->smLen; i++) { - gPstat->isOp =pstat->isOp; - OIC_LOG (INFO, TAG, "State changed to Ready for Normal Operation"); + if(gPstat->sm[i] == pstat->om) + { + validReq = true; + break; + } } - else + + if(!validReq) { - OIC_LOG(DEBUG, TAG, "Invalid Device provisionig state"); + OIC_LOG_V(ERROR, TAG, "%d is unsupported Operation Mode", (int) pstat->om); + ehRet = OC_EH_BAD_REQ; + goto exit; } - if (pstat->om != MULTIPLE_SERVICE_SERVER_DRIVEN && gPstat) + validReq = false; + + //Currently, IoTivity only supports Single Service Client Directed provisioning + if (pstat->om == SINGLE_SERVICE_CLIENT_DRIVEN) { - /* - * Check if the operation mode is in the supported provisioning services - * operation mode list. - */ - for (size_t i=0; i< gPstat->smLen; i++) + if ((pstat->cm & RESET) && false == pstat->isOp) + { + validReq = true; + OIC_LOG(INFO, TAG, "State changed to Ready for Reset"); + } + else if ((pstat->cm & TAKE_OWNER) && false == pstat->isOp) + { + validReq = true; + OIC_LOG (INFO, TAG, "State changed to Ready for Ownership transfer"); + } + else if (false == (pstat->cm & TAKE_OWNER) && false == pstat->isOp) + { + validReq = true; + OIC_LOG(INFO, TAG, "State changed to Ready for Provisioning"); + } + else if (false == (pstat->cm & TAKE_OWNER) && true == pstat->isOp) { - if(gPstat->sm[i] == pstat->om) - { - gPstat->om = pstat->om; - break; - } + validReq = true; + OIC_LOG (INFO, TAG, "State changed to Ready for Normal Operation"); } + else + { + OIC_LOG(DEBUG, TAG, "Invalid Device provisionig state"); + OIC_LOG_BUFFER(DEBUG, TAG, payload, size); + ehRet = OC_EH_BAD_REQ; + goto exit; + } + } + + if (!validReq) + { + OIC_LOG(DEBUG, TAG, "Bad request for PSTAT"); + ehRet = OC_EH_BAD_REQ; + goto exit; } + + gPstat->isOp = pstat->isOp; + gPstat->om = pstat->om; + gPstat->tm = pstat->tm; + gPstat->cm = pstat->cm; + memcpy(&(gPstat->deviceID), &(pstat->deviceID), sizeof(OicUuid_t)); + memcpy(&(gPstat->rownerID), &(pstat->rownerID), sizeof(OicUuid_t)); + // Convert pstat data into CBOR for update to persistent storage if (UpdatePersistentStorage(gPstat)) { @@ -504,6 +666,7 @@ static OCEntityHandlerResult HandlePstatPostRequest(const OCEntityHandlerRequest } } exit: + if(OC_EH_OK != ehRet) { /* @@ -513,10 +676,20 @@ static OCEntityHandlerResult HandlePstatPostRequest(const OCEntityHandlerRequest const OicSecDoxm_t* doxm = GetDoxmResourceData(); if(doxm) { - if(!doxm->owned && prevMsgId != ehRequest->messageID) + if(!doxm->owned) { - RestoreDoxmToInitState(); - RestorePstatToInitState(); + OIC_LOG(WARNING, TAG, "The operation failed during handle DOXM request"); + + if (!isDuplicatedMsg) + { +#if defined (__WITH_TLS__) || defined(__WITH_DTLS__) + InvokeOtmEventHandler(ehRequest->devAddr.addr, ehRequest->devAddr.port, + NULL, OIC_OTM_ERROR); +#endif + RestoreDoxmToInitState(); + RestorePstatToInitState(); + OIC_LOG(WARNING, TAG, "DOXM will be reverted."); + } } } else @@ -526,7 +699,10 @@ static OCEntityHandlerResult HandlePstatPostRequest(const OCEntityHandlerRequest } else { - prevMsgId = ehRequest->messageID; + if(ehRequest->devAddr.adapter == OC_ADAPTER_IP) + { + previousMsgId = ehRequest->messageID; + } } // Send response payload to request originator @@ -707,7 +883,7 @@ OCStackResult SetPstatRownerId(const OicUuid_t* newROwner) memcpy(prevId.id, gPstat->rownerID.id, sizeof(prevId.id)); memcpy(gPstat->rownerID.id, newROwner->id, sizeof(newROwner->id)); - ret = PstatToCBORPayload(gPstat, &cborPayload, &size); + ret = PstatToCBORPayload(gPstat, &cborPayload, &size, false); VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR); ret = UpdateSecureResourceInPS(OIC_JSON_PSTAT_NAME, cborPayload, size); @@ -744,3 +920,44 @@ OCStackResult GetPstatRownerId(OicUuid_t *rowneruuid) } return retVal; } + +OCStackResult SetPstatSelfOwnership(const OicUuid_t* newROwner) +{ + OCStackResult ret = OC_STACK_ERROR; + uint8_t *cborPayload = NULL; + size_t size = 0; + + if(NULL == gPstat) + { + ret = OC_STACK_NO_RESOURCE; + return ret; + } + + if( newROwner && (false == gPstat->isOp) && (true == (TAKE_OWNER && gPstat->cm)) ) + { + gPstat->cm = (OicSecDpm_t)(gPstat->cm & (~TAKE_OWNER)); + gPstat->isOp = true; + + memcpy(gPstat->deviceID.id, newROwner->id, sizeof(newROwner->id)); + memcpy(gPstat->rownerID.id, newROwner->id, sizeof(newROwner->id)); + + ret = PstatToCBORPayload(gPstat, &cborPayload, &size, false); + VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR); + + ret = UpdateSecureResourceInPS(OIC_JSON_PSTAT_NAME, cborPayload, size); + VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR); + + OICFree(cborPayload); + } + else + { + OIC_LOG(ERROR, TAG, "The state of PSTAT is not Ready For OTM"); + } + + return ret; + +exit: + OICFree(cborPayload); + return ret; +} +