1 /******************************************************************
3 * Copyright 2014 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 ******************************************************************/
26 #include "cainterface.h"
27 #include "caremotehandler.h"
28 #include "camessagehandler.h"
29 #include "caprotocolmessage.h"
30 #include "canetworkconfigurator.h"
31 #include "cainterfacecontroller.h"
34 #include "caadapternetdtls.h"
37 CAGlobals_t caglobals;
41 static bool g_isInitialized = false;
44 // CAAdapterNetDTLS will register the callback.
45 // Taking callback all the way through adapters not the right approach, hence calling here.
46 extern void CADTLSSetCredentialsCallback(CAGetDTLSCredentialsHandler credCallback);
49 CAResult_t CAInitialize()
51 OIC_LOG(DEBUG, TAG, "CAInitialize");
55 CAResult_t res = CAInitializeMessageHandler();
56 if (res != CA_STATUS_OK)
58 OIC_LOG(ERROR, TAG, "CAInitialize has failed");
61 g_isInitialized = true;
68 OIC_LOG(DEBUG, TAG, "CATerminate");
72 CATerminateMessageHandler();
73 CATerminateNetworkType();
75 g_isInitialized = false;
79 CAResult_t CAStartListeningServer()
81 OIC_LOG(DEBUG, TAG, "CAStartListeningServer");
85 return CA_STATUS_NOT_INITIALIZED;
88 return CAStartListeningServerAdapters();
91 CAResult_t CAStartDiscoveryServer()
93 OIC_LOG(DEBUG, TAG, "CAStartDiscoveryServer");
97 return CA_STATUS_NOT_INITIALIZED;
100 return CAStartDiscoveryServerAdapters();
103 void CARegisterHandler(CARequestCallback ReqHandler, CAResponseCallback RespHandler,
104 CAErrorCallback ErrorHandler)
106 OIC_LOG(DEBUG, TAG, "CARegisterHandler");
110 OIC_LOG(DEBUG, TAG, "CA is not initialized");
114 CASetInterfaceCallbacks(ReqHandler, RespHandler, ErrorHandler);
118 CAResult_t CARegisterDTLSCredentialsHandler(CAGetDTLSCredentialsHandler GetDTLSCredentialsHandler)
120 OIC_LOG(DEBUG, TAG, "CARegisterDTLSCredentialsHandler");
124 return CA_STATUS_NOT_INITIALIZED;
127 CADTLSSetCredentialsCallback(GetDTLSCredentialsHandler);
130 #endif //__WITH_DTLS__
132 void CADestroyEndpoint(CAEndpoint_t *rep)
134 OIC_LOG(DEBUG, TAG, "CADestroyEndpoint");
136 CADestroyEndpointInternal(rep);
139 CAResult_t CAGenerateToken(CAToken_t *token, uint8_t tokenLength)
141 OIC_LOG(DEBUG, TAG, "CAGenerateToken");
145 return CA_STATUS_NOT_INITIALIZED;
147 return CAGenerateTokenInternal(token, tokenLength);
150 void CADestroyToken(CAToken_t token)
152 OIC_LOG(DEBUG, TAG, "CADestroyToken");
153 CADestroyTokenInternal(token);
156 CAResult_t CAGetNetworkInformation(CAEndpoint_t **info, uint32_t *size)
158 OIC_LOG(DEBUG, TAG, "CAGetNetworkInformation");
162 return CA_STATUS_NOT_INITIALIZED;
165 return CAGetNetworkInformationInternal(info, size);
168 CAResult_t CASendRequest(const CAEndpoint_t *object,const CARequestInfo_t *requestInfo)
170 OIC_LOG(DEBUG, TAG, "CASendGetRequest");
174 return CA_STATUS_NOT_INITIALIZED;
177 return CADetachRequestMessage(object, requestInfo);
180 CAResult_t CASendNotification(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
182 OIC_LOG(DEBUG, TAG, "CASendNotification");
186 return CA_STATUS_NOT_INITIALIZED;
189 return CADetachResponseMessage(object, responseInfo);
193 CAResult_t CASendResponse(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
195 OIC_LOG(DEBUG, TAG, "CASendResponse");
199 return CA_STATUS_NOT_INITIALIZED;
202 return CADetachResponseMessage(object, responseInfo);
206 CAResult_t CASelectNetwork(const uint32_t interestedNetwork)
208 OIC_LOG_V(DEBUG, TAG, "Selected network : %d", interestedNetwork);
212 return CA_STATUS_NOT_INITIALIZED;
215 CAResult_t res = CA_STATUS_OK;
217 if (interestedNetwork & CA_ADAPTER_IP)
219 res = CAAddNetworkType(CA_ADAPTER_IP);
220 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_IP_ADAPTER) function returns error : %d", res);
222 else if (interestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
224 res = CAAddNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
225 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_RFCOMM_ADAPTER) function returns error : %d", res);
227 else if (interestedNetwork & CA_ADAPTER_GATT_BTLE)
229 res = CAAddNetworkType(CA_ADAPTER_GATT_BTLE);
230 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_GATT_ADAPTER) function returns error : %d", res);
234 res = CA_NOT_SUPPORTED;
240 CAResult_t CAUnSelectNetwork(const uint32_t nonInterestedNetwork)
242 OIC_LOG_V(DEBUG, TAG, "unselected network : %d", nonInterestedNetwork);
246 return CA_STATUS_NOT_INITIALIZED;
249 CAResult_t res = CA_STATUS_OK;
251 if (nonInterestedNetwork & CA_ADAPTER_IP)
253 res = CARemoveNetworkType(CA_ADAPTER_IP);
254 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_IP_ADAPTER) function returns error : %d", res);
256 else if (nonInterestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
258 res = CARemoveNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
259 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_RFCOMM_ADAPTER) function returns error : %d", res);
261 else if (nonInterestedNetwork & CA_ADAPTER_GATT_BTLE)
263 res = CARemoveNetworkType(CA_ADAPTER_GATT_BTLE);
264 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_GATT_ADAPTER) function returns error : %d", res);
268 res = CA_STATUS_FAILED;
274 CAResult_t CAHandleRequestResponse()
276 OIC_LOG(DEBUG, TAG, "CAHandleRequestResponse");
278 if (!g_isInitialized)
280 OIC_LOG(ERROR, TAG, "not initialized");
281 return CA_STATUS_NOT_INITIALIZED;
284 CAHandleRequestResponseCallbacks();
291 CAResult_t CASelectCipherSuite(const uint16_t cipher)
293 OIC_LOG_V(DEBUG, TAG, "CASelectCipherSuite");
295 return CADtlsSelectCipherSuite(cipher);
298 CAResult_t CAEnableAnonECDHCipherSuite(const bool enable)
300 OIC_LOG_V(DEBUG, TAG, "CAEnableAnonECDHCipherSuite");
302 return CADtlsEnableAnonECDHCipherSuite(enable);
305 CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
306 const uint8_t* label, const size_t labelLen,
307 const uint8_t* rsrcServerDeviceID, const size_t rsrcServerDeviceIDLen,
308 const uint8_t* provServerDeviceID, const size_t provServerDeviceIDLen,
309 uint8_t* ownerPSK, const size_t ownerPSKSize)
311 OIC_LOG_V(DEBUG, TAG, "IN : CAGenerateOwnerPSK");
313 CAResult_t res = CA_STATUS_OK;
315 //newOwnerLabel and prevOwnerLabe can be NULL
316 if (!endpoint || !label || 0 == labelLen || !ownerPSK || 0 == ownerPSKSize)
318 return CA_STATUS_INVALID_PARAM;
321 res = CADtlsGenerateOwnerPSK(endpoint, label, labelLen,
322 rsrcServerDeviceID, rsrcServerDeviceIDLen,
323 provServerDeviceID, provServerDeviceIDLen,
324 ownerPSK, ownerPSKSize);
325 if (CA_STATUS_OK != res)
327 OIC_LOG_V(ERROR, TAG, "Failed to CAGenerateOwnerPSK : %d", res);
330 OIC_LOG_V(DEBUG, TAG, "OUT : CAGenerateOwnerPSK");
335 CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
337 OIC_LOG_V(DEBUG, TAG, "IN : CAInitiateHandshake");
338 CAResult_t res = CA_STATUS_OK;
342 return CA_STATUS_INVALID_PARAM;
345 res = CADtlsInitiateHandshake(endpoint);
346 if (CA_STATUS_OK != res)
348 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsInitiateHandshake : %d", res);
351 OIC_LOG_V(DEBUG, TAG, "OUT : CAInitiateHandshake");
356 CAResult_t CACloseDtlsSession(const CAEndpoint_t *endpoint)
358 OIC_LOG_V(DEBUG, TAG, "IN : CACloseDtlsSession");
359 CAResult_t res = CA_STATUS_OK;
363 return CA_STATUS_INVALID_PARAM;
366 res = CADtlsClose(endpoint);
367 if (CA_STATUS_OK != res)
369 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsClose : %d", res);
372 OIC_LOG_V(DEBUG, TAG, "OUT : CACloseDtlsSession");
377 #endif /* __WITH_DTLS__ */