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 * *****************************************************************/
23 #include "securevirtualresourcetypes.h"
24 #include "doxmresource.h"
26 #include "cainterface.h"
27 #include "oic_malloc.h"
30 #include "ownershiptransfermanager.h"
32 #define TAG "OIC_OXM_JustWorks"
34 OCStackResult CreateJustWorksSelectOxmPayload(OTMContext_t *otmCtx, uint8_t **payload, size_t *size)
36 if (!otmCtx || !otmCtx->selectedDeviceInfo || !payload || *payload || !size)
38 return OC_STACK_INVALID_PARAM;
41 otmCtx->selectedDeviceInfo->doxm->oxmSel = OIC_JUST_WORKS;
45 return DoxmToCBORPayload(otmCtx->selectedDeviceInfo->doxm, payload, size, true);
48 OCStackResult CreateJustWorksOwnerTransferPayload(OTMContext_t* otmCtx, uint8_t **payload, size_t *size)
50 if (!otmCtx || !otmCtx->selectedDeviceInfo || !payload || *payload || !size)
52 return OC_STACK_INVALID_PARAM;
55 OicUuid_t uuidPT = {.id={0}};
57 if (OC_STACK_OK != GetDoxmDeviceID(&uuidPT))
59 OIC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
60 return OC_STACK_ERROR;
62 memcpy(otmCtx->selectedDeviceInfo->doxm->owner.id, uuidPT.id , UUID_LENGTH);
67 return DoxmToCBORPayload(otmCtx->selectedDeviceInfo->doxm, payload, size, true);
70 OCStackResult LoadSecretJustWorksCallback(OTMContext_t* UNUSED_PARAM)
72 //In case of 'just works', secret data not required
77 OCStackResult CreateSecureSessionJustWorksCallback(OTMContext_t* otmCtx)
79 OIC_LOG(INFO, TAG, "IN CreateSecureSessionJustWorksCallback");
80 if (!otmCtx || !otmCtx->selectedDeviceInfo)
82 return OC_STACK_INVALID_PARAM;
85 CAResult_t caresult = CAEnableAnonECDHCipherSuite(true);
86 if (CA_STATUS_OK != caresult)
88 OIC_LOG_V(ERROR, TAG, "Unable to enable anon cipher suite");
89 return OC_STACK_ERROR;
91 OIC_LOG(INFO, TAG, "Anonymous cipher suite Enabled.");
93 caresult = CASelectCipherSuite(MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256, otmCtx->selectedDeviceInfo->endpoint.adapter);
94 if (CA_STATUS_OK != caresult)
96 OIC_LOG_V(ERROR, TAG, "Failed to select TLS_ECDH_anon_WITH_AES_128_CBC_SHA256");
97 caresult = CAEnableAnonECDHCipherSuite(false);
98 if (CA_STATUS_OK != caresult)
100 OIC_LOG_V(ERROR, TAG, "Unable to enable anon cipher suite");
104 OIC_LOG(INFO, TAG, "Anonymous cipher suite Disabled.");
106 return OC_STACK_ERROR;
108 OIC_LOG(INFO, TAG, "TLS_ECDH_anon_WITH_AES_128_CBC_SHA256 cipher suite selected.");
110 OCProvisionDev_t *selDevInfo = otmCtx->selectedDeviceInfo;
111 CAEndpoint_t endpoint;
112 memcpy(&endpoint, &selDevInfo->endpoint, sizeof(CAEndpoint_t));
114 if(CA_ADAPTER_IP == endpoint.adapter)
116 endpoint.port = selDevInfo->securePort;
117 caresult = CAInitiateHandshake(&endpoint);
119 else if (CA_ADAPTER_GATT_BTLE == endpoint.adapter)
121 caresult = CAInitiateHandshake(&endpoint);
126 endpoint.port = selDevInfo->tcpPort;
127 caresult = CAinitiateSslHandshake(&endpoint);
130 if (CA_STATUS_OK != caresult)
132 OIC_LOG_V(ERROR, TAG, "DTLS/TLS handshake failure.");
133 return OC_STACK_ERROR;
136 OIC_LOG(INFO, TAG, "OUT CreateSecureSessionJustWorksCallback");
140 OCStackResult CreateMVJustWorksSelectOxmPayload(OTMContext_t *otmCtx, uint8_t **cborPayload,
143 if (!otmCtx || !otmCtx->selectedDeviceInfo || !cborPayload || *cborPayload || !cborSize)
145 return OC_STACK_INVALID_PARAM;
148 otmCtx->selectedDeviceInfo->doxm->oxmSel = OIC_MV_JUST_WORKS;
152 return DoxmToCBORPayload(otmCtx->selectedDeviceInfo->doxm, cborPayload, cborSize, true);