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 CAResult_t CACreateEndpoint(CATransportFlags_t flags,
133 CATransportAdapter_t adapter,
136 CAEndpoint_t **object)
140 OIC_LOG(ERROR, TAG, "Invalid Parameter");
141 return CA_STATUS_INVALID_PARAM;
144 CAEndpoint_t *endpoint = CACreateEndpointObject(flags, adapter, addr, port);
147 return CA_STATUS_FAILED;
153 void CADestroyEndpoint(CAEndpoint_t *rep)
155 OIC_LOG(DEBUG, TAG, "CADestroyEndpoint");
160 CAResult_t CAGenerateToken(CAToken_t *token, uint8_t tokenLength)
162 OIC_LOG(DEBUG, TAG, "CAGenerateToken");
166 return CA_STATUS_NOT_INITIALIZED;
168 return CAGenerateTokenInternal(token, tokenLength);
171 void CADestroyToken(CAToken_t token)
173 OIC_LOG(DEBUG, TAG, "CADestroyToken");
174 CADestroyTokenInternal(token);
177 CAResult_t CAGetNetworkInformation(CAEndpoint_t **info, uint32_t *size)
179 OIC_LOG(DEBUG, TAG, "CAGetNetworkInformation");
183 return CA_STATUS_NOT_INITIALIZED;
186 return CAGetNetworkInformationInternal(info, size);
189 CAResult_t CASendRequest(const CAEndpoint_t *object,const CARequestInfo_t *requestInfo)
191 OIC_LOG(DEBUG, TAG, "CASendGetRequest");
195 return CA_STATUS_NOT_INITIALIZED;
198 return CADetachRequestMessage(object, requestInfo);
201 CAResult_t CASendNotification(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
203 OIC_LOG(DEBUG, TAG, "CASendNotification");
207 return CA_STATUS_NOT_INITIALIZED;
210 return CADetachResponseMessage(object, responseInfo);
214 CAResult_t CASendResponse(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
216 OIC_LOG(DEBUG, TAG, "CASendResponse");
220 return CA_STATUS_NOT_INITIALIZED;
223 return CADetachResponseMessage(object, responseInfo);
227 CAResult_t CASelectNetwork(const uint32_t interestedNetwork)
229 OIC_LOG_V(DEBUG, TAG, "Selected network : %d", interestedNetwork);
233 return CA_STATUS_NOT_INITIALIZED;
236 CAResult_t res = CA_STATUS_OK;
238 if (interestedNetwork & CA_ADAPTER_IP)
240 res = CAAddNetworkType(CA_ADAPTER_IP);
241 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_IP_ADAPTER) function returns error : %d", res);
243 else if (interestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
245 res = CAAddNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
246 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_RFCOMM_ADAPTER) function returns error : %d", res);
248 else if (interestedNetwork & CA_ADAPTER_GATT_BTLE)
250 res = CAAddNetworkType(CA_ADAPTER_GATT_BTLE);
251 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_GATT_ADAPTER) function returns error : %d", res);
255 res = CA_NOT_SUPPORTED;
261 CAResult_t CAUnSelectNetwork(const uint32_t nonInterestedNetwork)
263 OIC_LOG_V(DEBUG, TAG, "unselected network : %d", nonInterestedNetwork);
267 return CA_STATUS_NOT_INITIALIZED;
270 CAResult_t res = CA_STATUS_OK;
272 if (nonInterestedNetwork & CA_ADAPTER_IP)
274 res = CARemoveNetworkType(CA_ADAPTER_IP);
275 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_IP_ADAPTER) function returns error : %d", res);
277 else if (nonInterestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
279 res = CARemoveNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
280 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_RFCOMM_ADAPTER) function returns error : %d", res);
282 else if (nonInterestedNetwork & CA_ADAPTER_GATT_BTLE)
284 res = CARemoveNetworkType(CA_ADAPTER_GATT_BTLE);
285 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_GATT_ADAPTER) function returns error : %d", res);
289 res = CA_STATUS_FAILED;
295 CAResult_t CAHandleRequestResponse()
297 if (!g_isInitialized)
299 OIC_LOG(ERROR, TAG, "not initialized");
300 return CA_STATUS_NOT_INITIALIZED;
303 CAHandleRequestResponseCallbacks();
310 CAResult_t CASelectCipherSuite(const uint16_t cipher)
312 OIC_LOG_V(DEBUG, TAG, "CASelectCipherSuite");
314 return CADtlsSelectCipherSuite(cipher);
317 CAResult_t CAEnableAnonECDHCipherSuite(const bool enable)
319 OIC_LOG_V(DEBUG, TAG, "CAEnableAnonECDHCipherSuite");
321 return CADtlsEnableAnonECDHCipherSuite(enable);
324 CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
325 const uint8_t* label, const size_t labelLen,
326 const uint8_t* rsrcServerDeviceID, const size_t rsrcServerDeviceIDLen,
327 const uint8_t* provServerDeviceID, const size_t provServerDeviceIDLen,
328 uint8_t* ownerPSK, const size_t ownerPSKSize)
330 OIC_LOG_V(DEBUG, TAG, "IN : CAGenerateOwnerPSK");
332 CAResult_t res = CA_STATUS_OK;
334 //newOwnerLabel and prevOwnerLabe can be NULL
335 if (!endpoint || !label || 0 == labelLen || !ownerPSK || 0 == ownerPSKSize)
337 return CA_STATUS_INVALID_PARAM;
340 res = CADtlsGenerateOwnerPSK(endpoint, label, labelLen,
341 rsrcServerDeviceID, rsrcServerDeviceIDLen,
342 provServerDeviceID, provServerDeviceIDLen,
343 ownerPSK, ownerPSKSize);
344 if (CA_STATUS_OK != res)
346 OIC_LOG_V(ERROR, TAG, "Failed to CAGenerateOwnerPSK : %d", res);
349 OIC_LOG_V(DEBUG, TAG, "OUT : CAGenerateOwnerPSK");
354 CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
356 OIC_LOG_V(DEBUG, TAG, "IN : CAInitiateHandshake");
357 CAResult_t res = CA_STATUS_OK;
361 return CA_STATUS_INVALID_PARAM;
364 res = CADtlsInitiateHandshake(endpoint);
365 if (CA_STATUS_OK != res)
367 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsInitiateHandshake : %d", res);
370 OIC_LOG_V(DEBUG, TAG, "OUT : CAInitiateHandshake");
375 CAResult_t CACloseDtlsSession(const CAEndpoint_t *endpoint)
377 OIC_LOG_V(DEBUG, TAG, "IN : CACloseDtlsSession");
378 CAResult_t res = CA_STATUS_OK;
382 return CA_STATUS_INVALID_PARAM;
385 res = CADtlsClose(endpoint);
386 if (CA_STATUS_OK != res)
388 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsClose : %d", res);
391 OIC_LOG_V(DEBUG, TAG, "OUT : CACloseDtlsSession");
396 #endif /* __WITH_DTLS__ */