Imported Upstream version 1.1.0
[platform/upstream/iotivity.git] / resource / csdk / security / provisioning / src / oxmrandompin.c
index 8e9ad1e..4efc238 100644 (file)
 
 #define TAG "OXM_RandomPIN"
 
-char* CreatePinBasedSelectOxmPayload(OTMContext_t* otmCtx)
+OCStackResult CreatePinBasedSelectOxmPayload(OTMContext_t* otmCtx, uint8_t **payload, size_t *size)
 {
-    if(!otmCtx || !otmCtx->selectedDeviceInfo)
+    if(!otmCtx || !otmCtx->selectedDeviceInfo || !payload || *payload || !size)
     {
-        return NULL;
+        return OC_STACK_INVALID_PARAM;
     }
 
     otmCtx->selectedDeviceInfo->doxm->oxmSel = OIC_RANDOM_DEVICE_PIN;
 
-    OicUuid_t uuidPT = {.id={0}};
-    if (OC_STACK_OK != GetDoxmDeviceID(&uuidPT))
-    {
-        OC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
-        return NULL;
-    }
-    memcpy(otmCtx->selectedDeviceInfo->doxm->owner.id, uuidPT.id, UUID_LENGTH);
-
-    return BinToDoxmJSON(otmCtx->selectedDeviceInfo->doxm);
+    return DoxmToCBORPayload(otmCtx->selectedDeviceInfo->doxm, payload, size);
 }
 
-char* CreatePinBasedOwnerTransferPayload(OTMContext_t* otmCtx)
+OCStackResult CreatePinBasedOwnerTransferPayload(OTMContext_t* otmCtx, uint8_t **payload, size_t *size)
 {
-    if(!otmCtx || !otmCtx->selectedDeviceInfo)
+    if(!otmCtx || !otmCtx->selectedDeviceInfo || !payload || *payload || !size)
     {
-        return NULL;
+        return OC_STACK_INVALID_PARAM;
     }
 
     OicUuid_t uuidPT = {.id={0}};
+    *payload = NULL;
+    *size = 0;
 
     if (OC_STACK_OK != GetDoxmDeviceID(&uuidPT))
     {
-        OC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
-        return NULL;
+        OIC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
+        return OC_STACK_ERROR;
     }
     memcpy(otmCtx->selectedDeviceInfo->doxm->owner.id, uuidPT.id , UUID_LENGTH);
-    otmCtx->selectedDeviceInfo->doxm->owned = true;
 
-    return BinToDoxmJSON(otmCtx->selectedDeviceInfo->doxm);
+    return DoxmToCBORPayload(otmCtx->selectedDeviceInfo->doxm, payload, size);
 }
 
-OCStackResult InputPinCodeCallback(OTMContext_totmCtx)
+OCStackResult InputPinCodeCallback(OTMContext_t *otmCtx)
 {
-    if(!otmCtx || !otmCtx->selectedDeviceInfo)
+    if (!otmCtx || !otmCtx->selectedDeviceInfo)
     {
         return OC_STACK_INVALID_PARAM;
     }
@@ -88,36 +81,34 @@ OCStackResult InputPinCodeCallback(OTMContext_t* otmCtx)
     uint8_t pinData[OXM_RANDOM_PIN_SIZE + 1];
 
     OCStackResult res = InputPin((char*)pinData, OXM_RANDOM_PIN_SIZE + 1);
-    if(OC_STACK_OK != res)
+    if (OC_STACK_OK != res)
     {
-        OC_LOG(ERROR, TAG, "Failed to input PIN");
+        OIC_LOG(ERROR, TAG, "Failed to input PIN");
         return res;
     }
 
-    OicUuid_t deviceUUID = {.id={0}};
-    if (OC_STACK_OK != GetDoxmDeviceID(&deviceUUID))
+    /**
+     * Since PSK will be used directly while PIN based ownership transfer,
+     * Credential should not be saved into SVR.
+     * For this reason, We will use a temporary get_psk_info callback to random PIN OxM.
+     */
+    if(CA_STATUS_OK != CARegisterDTLSCredentialsHandler(GetDtlsPskForRandomPinOxm))
     {
-        OC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
-        return OC_STACK_ERROR;
+        OIC_LOG(ERROR, TAG, "Failed to register DTLS credentials handler for random PIN OxM.");
+        res = OC_STACK_ERROR;
     }
 
-    res = AddTmpPskWithPIN(&otmCtx->selectedDeviceInfo->doxm->deviceID,
-                           SYMMETRIC_PAIR_WISE_KEY,
-                           (char*)pinData, OXM_RANDOM_PIN_SIZE,
-                           1, &deviceUUID, &otmCtx->subIdForPinOxm);
-    if(res != OC_STACK_OK)
-    {
-        OC_LOG_V(ERROR, TAG, "Failed to save the temporal PSK : %d", res);
-    }
+    //Set the device id to derive temporal PSK
+    SetUuidForRandomPinOxm(&(otmCtx->selectedDeviceInfo->doxm->deviceID));
 
     return res;
 }
 
-OCStackResult CreateSecureSessionRandomPinCallbak(OTMContext_t* otmCtx)
+OCStackResult CreateSecureSessionRandomPinCallback(OTMContext_t* otmCtx)
 {
-    OC_LOG(INFO, TAG, "IN CreateSecureSessionRandomPinCallbak");
+    OIC_LOG(INFO, TAG, "IN CreateSecureSessionRandomPinCallbak");
 
-    if(!otmCtx || !otmCtx->selectedDeviceInfo)
+    if (!otmCtx || !otmCtx->selectedDeviceInfo)
     {
         return OC_STACK_INVALID_PARAM;
     }
@@ -125,23 +116,22 @@ OCStackResult CreateSecureSessionRandomPinCallbak(OTMContext_t* otmCtx)
     CAResult_t caresult = CAEnableAnonECDHCipherSuite(false);
     if (CA_STATUS_OK != caresult)
     {
-        OC_LOG_V(ERROR, TAG, "Unable to disable anon cipher suite");
+        OIC_LOG_V(ERROR, TAG, "Unable to disable anon cipher suite");
         return OC_STACK_ERROR;
     }
-    OC_LOG(INFO, TAG, "Anonymous cipher suite disabled.");
+    OIC_LOG(INFO, TAG, "Anonymous cipher suite disabled.");
 
     caresult  = CASelectCipherSuite(TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256);
     if (CA_STATUS_OK != caresult)
     {
-        OC_LOG_V(ERROR, TAG, "Failed to select TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256");
+        OIC_LOG_V(ERROR, TAG, "Failed to select TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256");
         return OC_STACK_ERROR;
     }
-    OC_LOG(INFO, TAG, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256 cipher suite selected.");
-
+    OIC_LOG(INFO, TAG, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256 cipher suite selected.");
 
     OCProvisionDev_t* selDevInfo = otmCtx->selectedDeviceInfo;
     CAEndpoint_t *endpoint = (CAEndpoint_t *)OICCalloc(1, sizeof (CAEndpoint_t));
-    if(NULL == endpoint)
+    if (NULL == endpoint)
     {
         return OC_STACK_NO_MEMORY;
     }
@@ -151,11 +141,11 @@ OCStackResult CreateSecureSessionRandomPinCallbak(OTMContext_t* otmCtx)
     OICFree(endpoint);
     if (CA_STATUS_OK != caresult)
     {
-        OC_LOG_V(ERROR, TAG, "DTLS handshake failure.");
+        OIC_LOG_V(ERROR, TAG, "DTLS handshake failure.");
         return OC_STACK_ERROR;
     }
 
-    OC_LOG(INFO, TAG, "OUT CreateSecureSessionRandomPinCallbak");
+    OIC_LOG(INFO, TAG, "OUT CreateSecureSessionRandomPinCallbak");
 
     return OC_STACK_OK;
 }