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"
38 #include "catcpadapter.h"
41 CAGlobals_t caglobals = { 0 };
43 #define TAG "CA_CONN_MGR"
45 static bool g_isInitialized = false;
48 // CAAdapterNetDTLS will register the callback.
49 // Taking callback all the way through adapters not the right approach, hence calling here.
50 extern void CADTLSSetCredentialsCallback(CAGetDTLSPskCredentialsHandler credCallback);
54 // CAAdapterNetDTLS will register the callback.
55 // Taking callback all the way through adapters not the right approach, hence calling here.
56 extern void CADTLSSetX509CredentialsCallback(CAGetDTLSX509CredentialsHandler credCallback);
57 extern void CADTLSSetCrlCallback(CAGetDTLSCrlHandler crlCallback);
60 CAResult_t CAInitialize()
62 OIC_LOG(DEBUG, TAG, "CAInitialize");
66 if (0 != OCSeedRandom())
68 OIC_LOG(ERROR, TAG, "Seed Random Failed");
71 CAResult_t res = CAInitializeMessageHandler();
72 if (res != CA_STATUS_OK)
74 OIC_LOG(ERROR, TAG, "CAInitialize has failed");
77 g_isInitialized = true;
85 OIC_LOG(DEBUG, TAG, "CATerminate");
89 CATerminateMessageHandler();
90 CATerminateNetworkType();
92 g_isInitialized = false;
96 CAResult_t CAStartListeningServer()
98 OIC_LOG(DEBUG, TAG, "CAStartListeningServer");
102 return CA_STATUS_NOT_INITIALIZED;
105 return CAStartListeningServerAdapters();
108 CAResult_t CAStopListeningServer()
110 OIC_LOG(DEBUG, TAG, "CAStopListeningServer");
114 return CA_STATUS_NOT_INITIALIZED;
117 return CAStopListeningServerAdapters();
120 CAResult_t CAStartDiscoveryServer()
122 OIC_LOG(DEBUG, TAG, "CAStartDiscoveryServer");
126 return CA_STATUS_NOT_INITIALIZED;
129 return CAStartDiscoveryServerAdapters();
132 void CARegisterHandler(CARequestCallback ReqHandler, CAResponseCallback RespHandler,
133 CAErrorCallback ErrorHandler)
135 OIC_LOG(DEBUG, TAG, "CARegisterHandler");
139 OIC_LOG(DEBUG, TAG, "CA is not initialized");
143 CASetInterfaceCallbacks(ReqHandler, RespHandler, ErrorHandler);
147 CAResult_t CARegisterDTLSCredentialsHandler(CAGetDTLSPskCredentialsHandler GetDTLSCredentialsHandler)
149 OIC_LOG(DEBUG, TAG, "CARegisterDTLSCredentialsHandler");
153 return CA_STATUS_NOT_INITIALIZED;
156 CADTLSSetCredentialsCallback(GetDTLSCredentialsHandler);
159 #endif //__WITH_DTLS__
162 CAResult_t CARegisterDTLSX509CredentialsHandler(CAGetDTLSX509CredentialsHandler GetDTLSX509CredentialsHandler)
164 OIC_LOG(DEBUG, TAG, "CARegisterDTLSX509CredentialsHandler");
168 return CA_STATUS_NOT_INITIALIZED;
171 CADTLSSetX509CredentialsCallback(GetDTLSX509CredentialsHandler);
175 CAResult_t CARegisterDTLSCrlHandler(CAGetDTLSCrlHandler GetDTLSCrlHandler)
177 OIC_LOG(DEBUG, TAG, "CARegisterDTLSCrlHandler");
181 return CA_STATUS_NOT_INITIALIZED;
184 CADTLSSetCrlCallback(GetDTLSCrlHandler);
187 #endif //__WITH_X509__
189 CAResult_t CACreateEndpoint(CATransportFlags_t flags,
190 CATransportAdapter_t adapter,
193 CAEndpoint_t **object)
197 OIC_LOG(ERROR, TAG, "Invalid Parameter");
198 return CA_STATUS_INVALID_PARAM;
201 CAEndpoint_t *endpoint = CACreateEndpointObject(flags, adapter, addr, port);
204 return CA_STATUS_FAILED;
210 void CADestroyEndpoint(CAEndpoint_t *rep)
212 OIC_LOG(DEBUG, TAG, "CADestroyEndpoint");
217 CAResult_t CAGenerateToken(CAToken_t *token, uint8_t tokenLength)
219 OIC_LOG(DEBUG, TAG, "CAGenerateToken");
221 return CAGenerateTokenInternal(token, tokenLength);
224 void CADestroyToken(CAToken_t token)
226 OIC_LOG(DEBUG, TAG, "CADestroyToken");
228 CADestroyTokenInternal(token);
230 OIC_LOG(DEBUG, TAG, "OUT");
233 CAResult_t CAGetNetworkInformation(CAEndpoint_t **info, uint32_t *size)
235 OIC_LOG(DEBUG, TAG, "CAGetNetworkInformation");
239 return CA_STATUS_NOT_INITIALIZED;
242 return CAGetNetworkInformationInternal(info, size);
245 CAResult_t CASendRequest(const CAEndpoint_t *object,const CARequestInfo_t *requestInfo)
247 OIC_LOG(DEBUG, TAG, "CASendGetRequest");
251 return CA_STATUS_NOT_INITIALIZED;
254 return CADetachRequestMessage(object, requestInfo);
257 CAResult_t CASendResponse(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
259 OIC_LOG(DEBUG, TAG, "CASendResponse");
263 return CA_STATUS_NOT_INITIALIZED;
266 return CADetachResponseMessage(object, responseInfo);
269 CAResult_t CASelectNetwork(CATransportAdapter_t interestedNetwork)
271 OIC_LOG_V(DEBUG, TAG, "Selected network : %d", interestedNetwork);
275 return CA_STATUS_NOT_INITIALIZED;
278 CAResult_t res = CA_STATUS_OK;
280 if (interestedNetwork & CA_ADAPTER_IP)
282 res = CAAddNetworkType(CA_ADAPTER_IP);
283 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_IP_ADAPTER) function returns result: %d", res);
285 else if (interestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
287 res = CAAddNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
288 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_RFCOMM_ADAPTER) function returns result : %d", res);
290 else if (interestedNetwork & CA_ADAPTER_GATT_BTLE)
292 res = CAAddNetworkType(CA_ADAPTER_GATT_BTLE);
293 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_GATT_ADAPTER) function returns result : %d", res);
297 else if (interestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
299 res = CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS);
300 OIC_LOG_V(DEBUG, TAG,
301 "CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns result : %d", res);
306 else if (interestedNetwork & CA_ADAPTER_TCP)
308 res = CAAddNetworkType(CA_ADAPTER_TCP);
309 OIC_LOG_V(DEBUG, TAG,
310 "CAAddNetworkType(CA_ADAPTER_TCP) function returns result : %d", res);
316 res = CA_NOT_SUPPORTED;
321 CAResult_t CAUnSelectNetwork(CATransportAdapter_t nonInterestedNetwork)
323 OIC_LOG_V(DEBUG, TAG, "unselected network : %d", nonInterestedNetwork);
327 return CA_STATUS_NOT_INITIALIZED;
330 CAResult_t res = CA_STATUS_OK;
332 if (nonInterestedNetwork & CA_ADAPTER_IP)
334 res = CARemoveNetworkType(CA_ADAPTER_IP);
335 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_IP_ADAPTER) function returns result : %d", res);
337 else if (nonInterestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
339 res = CARemoveNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
340 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_RFCOMM_ADAPTER) function returns result : %d", res);
342 else if (nonInterestedNetwork & CA_ADAPTER_GATT_BTLE)
344 res = CARemoveNetworkType(CA_ADAPTER_GATT_BTLE);
345 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_GATT_ADAPTER) function returns result : %d", res);
348 else if (nonInterestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
350 res = CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS);
351 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns result : %d",
358 else if (nonInterestedNetwork & CA_ADAPTER_TCP)
360 res = CARemoveNetworkType(CA_ADAPTER_TCP);
361 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_ADAPTER_TCP) function returns result : %d",
368 res = CA_STATUS_FAILED;
373 CAResult_t CAHandleRequestResponse()
375 if (!g_isInitialized)
377 OIC_LOG(ERROR, TAG, "not initialized");
378 return CA_STATUS_NOT_INITIALIZED;
381 CAHandleRequestResponseCallbacks();
388 CAResult_t CASelectCipherSuite(const uint16_t cipher)
390 OIC_LOG_V(DEBUG, TAG, "CASelectCipherSuite");
392 return CADtlsSelectCipherSuite(cipher);
395 CAResult_t CAEnableAnonECDHCipherSuite(const bool enable)
397 OIC_LOG_V(DEBUG, TAG, "CAEnableAnonECDHCipherSuite");
399 return CADtlsEnableAnonECDHCipherSuite(enable);
402 CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
403 const uint8_t* label, const size_t labelLen,
404 const uint8_t* rsrcServerDeviceID, const size_t rsrcServerDeviceIDLen,
405 const uint8_t* provServerDeviceID, const size_t provServerDeviceIDLen,
406 uint8_t* ownerPSK, const size_t ownerPSKSize)
408 OIC_LOG_V(DEBUG, TAG, "IN : CAGenerateOwnerPSK");
410 CAResult_t res = CA_STATUS_OK;
412 //newOwnerLabel and prevOwnerLabe can be NULL
413 if (!endpoint || !label || 0 == labelLen || !ownerPSK || 0 == ownerPSKSize)
415 return CA_STATUS_INVALID_PARAM;
418 res = CADtlsGenerateOwnerPSK(endpoint, label, labelLen,
419 rsrcServerDeviceID, rsrcServerDeviceIDLen,
420 provServerDeviceID, provServerDeviceIDLen,
421 ownerPSK, ownerPSKSize);
422 if (CA_STATUS_OK != res)
424 OIC_LOG_V(ERROR, TAG, "Failed to CAGenerateOwnerPSK : %d", res);
427 OIC_LOG_V(DEBUG, TAG, "OUT : CAGenerateOwnerPSK");
432 CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
434 OIC_LOG_V(DEBUG, TAG, "IN : CAInitiateHandshake");
435 CAResult_t res = CA_STATUS_OK;
439 return CA_STATUS_INVALID_PARAM;
442 res = CADtlsInitiateHandshake(endpoint);
443 if (CA_STATUS_OK != res)
445 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsInitiateHandshake : %d", res);
448 OIC_LOG_V(DEBUG, TAG, "OUT : CAInitiateHandshake");
453 CAResult_t CACloseDtlsSession(const CAEndpoint_t *endpoint)
455 OIC_LOG_V(DEBUG, TAG, "IN : CACloseDtlsSession");
456 CAResult_t res = CA_STATUS_OK;
460 return CA_STATUS_INVALID_PARAM;
463 res = CADtlsClose(endpoint);
464 if (CA_STATUS_OK != res)
466 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsClose : %d", res);
469 OIC_LOG_V(DEBUG, TAG, "OUT : CACloseDtlsSession");
474 #endif /* __WITH_DTLS__ */