svace fixes
[platform/upstream/iotivity.git] / resource / csdk / security / provisioning / src / ownershiptransfermanager.c
index a483e7a..4a9021a 100644 (file)
@@ -104,7 +104,8 @@ static uint8_t g_OxmAllowStatus[OXM_IDX_COUNT] = {ALLOWED_OXM, ALLOWED_OXM, ALLO
                                                   NOT_ALLOWED_OXM};
 #endif
 
-static OTMSelectMethodCallback g_selectOTMCB = NULL;
+static OicSecOxm_t selectOTMcb_default(const OicSecOxm_t* otmList, const uint32_t len);
+static OTMSelectMethodCallback g_selectOTMCB = selectOTMcb_default;
 
 OCStackResult OTMSetOTCallback(OicSecOxm_t oxm, OTMCallbackData_t* callbacks)
 {
@@ -224,6 +225,29 @@ static OxmAllowTableIdx_t GetOxmAllowTableIdx(OicSecOxm_t oxm)
     }
 }
 
+OicSecOxm_t selectOTMcb_default(const OicSecOxm_t* otmList, const uint32_t len)
+{
+    OIC_LOG(INFO, TAG, "IN selectOTMcb_default");
+    OicSecOxm_t ret = -1;
+    VERIFY_NON_NULL(TAG, otmList, ERROR);
+    VERIFY_SUCCESS(TAG, (len > 0), ERROR);
+
+    ret = otmList[len-1];
+
+    for (size_t i = 0; i < len; i++)
+    {
+        if (OIC_RANDOM_DEVICE_PIN == otmList[i])
+        {
+            ret = OIC_RANDOM_DEVICE_PIN;
+            break;
+        }
+    }
+
+exit:
+    OIC_LOG(INFO, TAG, "OUT selectOTMcb_default");
+    return ret;
+}
+
 /**
  * Function to select appropriate  provisioning method.
  *
@@ -829,7 +853,12 @@ static OCStackResult SaveOwnerPSK(OCProvisionDev_t *selectedDeviceInfo)
 
         OICFree( cred->privateData.data );
         cred->privateData.data = (uint8_t *)OICCalloc(1, outSize + 1);
-        VERIFY_NON_NULL(TAG, cred->privateData.data, ERROR);
+        if (cred->privateData.data == NULL)
+            {
+                OICFree(b64Buf);
+                res = OC_STACK_ERROR;
+                goto exit;
+            }
 
         strncpy((char*)(cred->privateData.data), b64Buf, outSize);
         cred->privateData.data[outSize] = '\0';
@@ -1500,6 +1529,7 @@ static OCStackApplicationResult ReadyForNomalStatusHandler(void *ctx, OCDoHandle
     if (OC_STACK_RESOURCE_CHANGED == clientResponse->result)
     {
         OIC_LOG(INFO, TAG, "Device state is in Ready for Normal Operation.");
+        OTMStop(&otmCtx->selectedDeviceInfo->doxm->deviceID);
         OCStackResult res = PDMSetDeviceState(&otmCtx->selectedDeviceInfo->doxm->deviceID,
                                               PDM_DEVICE_ACTIVE);
          if (OC_STACK_OK == res)
@@ -1560,6 +1590,7 @@ static OCStackResult PostOwnerCredential(OTMContext_t* otmCtx)
     if(!ownerCredential)
     {
         OIC_LOG(ERROR, TAG, "Can not find OwnerPSK.");
+        OICFree(secPayload);
         return OC_STACK_NO_RESOURCE;
     }
 
@@ -2169,6 +2200,19 @@ static OCStackResult StartOwnershipTransfer(void* ctx, OCProvisionDev_t* selecte
         memcpy(&(selectedDevice->doxm->owner), &emptyOwner, sizeof(OicUuid_t));
     }
 
+    OicUuid_t ownerUuid = {0};
+    GetDoxmDevOwnerId(&ownerUuid);
+
+    res = OTMStart(&selectedDevice->doxm->deviceID, &ownerUuid);
+    if(OC_STACK_OK != res)
+    {
+        if(OC_STACK_DUPLICATE_UUID == res)
+        {
+            return res;
+        }
+        OIC_LOG_V(ERROR, TAG, "%s OTMStart error : %d", __func__, res);
+    }
+
     //Setup PDM to perform the OTM, PDM will be cleanup if necessary.
     res = SetupPDM(selectedDevice);
     if(OC_STACK_OK != res)
@@ -2231,6 +2275,19 @@ static OCStackResult StartCustomOwnershipTransfer(void* ctx, OCProvisionDev_t* s
     OTMContext_t* otmCtx = (OTMContext_t*)ctx;
     otmCtx->selectedDeviceInfo = selectedDevice;
 
+    OicUuid_t ownerUuid = {0};
+    GetDoxmDevOwnerId(&ownerUuid);
+
+    res = OTMStart(&selectedDevice->doxm->deviceID, &ownerUuid);
+    if(OC_STACK_OK != res)
+    {
+        if(OC_STACK_DUPLICATE_UUID == res)
+        {
+            return res;
+        }
+        OIC_LOG_V(ERROR, TAG, "%s OTMStart error : %d", __func__, res);
+    }
+
     //Setup PDM to perform the OTM, PDM will be cleanup if necessary.
     res = SetupPDM(selectedDevice);
     if(OC_STACK_OK != res)