1 /* *****************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * *****************************************************************/
24 #include "securevirtualresourcetypes.h"
25 #include "doxmresource.h"
26 #include "credresource.h"
28 #include "cainterface.h"
30 #include "oic_malloc.h"
35 #include "oxmrandompin.h"
36 #include "ownershiptransfermanager.h"
37 #include "pinoxmcommon.h"
39 #define TAG "OXM_RandomPIN"
41 OCStackResult CreatePinBasedSelectOxmPayload(OTMContext_t* otmCtx, uint8_t **payload, size_t *size)
45 if(!otmCtx || !otmCtx->selectedDeviceInfo || !payload || *payload || !size)
47 return OC_STACK_INVALID_PARAM;
50 otmCtx->selectedDeviceInfo->doxm->oxmSel = OIC_RANDOM_DEVICE_PIN;
52 return DoxmToCBORPayload(otmCtx->selectedDeviceInfo->doxm, payload, size);
55 OCStackResult CreatePinBasedOwnerTransferPayload(OTMContext_t* otmCtx, uint8_t **payload, size_t *size)
57 if(!otmCtx || !otmCtx->selectedDeviceInfo || !payload || *payload || !size)
59 return OC_STACK_INVALID_PARAM;
62 OicUuid_t uuidPT = {.id={0}};
66 if (OC_STACK_OK != GetDoxmDeviceID(&uuidPT))
68 OIC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
69 return OC_STACK_ERROR;
71 memcpy(otmCtx->selectedDeviceInfo->doxm->owner.id, uuidPT.id , UUID_LENGTH);
73 return DoxmToCBORPayload(otmCtx->selectedDeviceInfo->doxm, payload, size);
76 OCStackResult InputPinCodeCallback(OTMContext_t *otmCtx)
78 if (!otmCtx || !otmCtx->selectedDeviceInfo)
80 return OC_STACK_INVALID_PARAM;
83 uint8_t pinData[OXM_RANDOM_PIN_SIZE + 1];
85 OCStackResult res = InputPin((char*)pinData, OXM_RANDOM_PIN_SIZE + 1);
86 if (OC_STACK_OK != res)
88 OIC_LOG(ERROR, TAG, "Failed to input PIN");
93 * Since PSK will be used directly while PIN based ownership transfer,
94 * Credential should not be saved into SVR.
95 * For this reason, We will use a temporary get_psk_info callback to random PIN OxM.
97 if(CA_STATUS_OK != CARegisterDTLSCredentialsHandler(GetDtlsPskForRandomPinOxm))
99 OIC_LOG(ERROR, TAG, "Failed to register DTLS credentials handler for random PIN OxM.");
100 res = OC_STACK_ERROR;
103 //Set the device id to derive temporal PSK
104 SetUuidForRandomPinOxm(&(otmCtx->selectedDeviceInfo->doxm->deviceID));
109 OCStackResult CreateSecureSessionRandomPinCallback(OTMContext_t* otmCtx)
111 OIC_LOG(INFO, TAG, "IN CreateSecureSessionRandomPinCallbak");
113 if (!otmCtx || !otmCtx->selectedDeviceInfo)
115 return OC_STACK_INVALID_PARAM;
118 CAResult_t caresult = CAEnableAnonECDHCipherSuite(false);
119 if (CA_STATUS_OK != caresult)
121 OIC_LOG_V(ERROR, TAG, "Unable to disable anon cipher suite");
122 return OC_STACK_ERROR;
124 OIC_LOG(INFO, TAG, "Anonymous cipher suite disabled.");
126 caresult = CASelectCipherSuite(TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256);
127 if (CA_STATUS_OK != caresult)
129 OIC_LOG_V(ERROR, TAG, "Failed to select TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256");
130 return OC_STACK_ERROR;
132 OIC_LOG(INFO, TAG, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256 cipher suite selected.");
134 OCProvisionDev_t* selDevInfo = otmCtx->selectedDeviceInfo;
135 CAEndpoint_t *endpoint = (CAEndpoint_t *)OICCalloc(1, sizeof (CAEndpoint_t));
136 if (NULL == endpoint)
138 return OC_STACK_NO_MEMORY;
140 memcpy(endpoint,&selDevInfo->endpoint,sizeof(CAEndpoint_t));
141 endpoint->port = selDevInfo->securePort;
142 caresult = CAInitiateHandshake(endpoint);
144 if (CA_STATUS_OK != caresult)
146 OIC_LOG_V(ERROR, TAG, "DTLS handshake failure.");
147 return OC_STACK_ERROR;
150 OIC_LOG(INFO, TAG, "OUT CreateSecureSessionRandomPinCallbak");