#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_t* otmCtx)
+OCStackResult InputPinCodeCallback(OTMContext_t *otmCtx)
{
- if(!otmCtx || !otmCtx->selectedDeviceInfo)
+ if (!otmCtx || !otmCtx->selectedDeviceInfo)
{
return OC_STACK_INVALID_PARAM;
}
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;
}
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;
}
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;
}