CONPRO-1481 crash while fuzzing with nmap
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / adapter_util / ca_adapter_net_ssl.c
1 /******************************************************************
2  *
3  * Copyright 2016 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  ******************************************************************/
20
21 #define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE
22
23 #ifndef _GNU_SOURCE
24 #define _GNU_SOURCE
25 #endif // _GNU_SOURCE
26
27 #include <stddef.h>
28 #include <stdint.h>
29 #include <stdbool.h>
30 #include "ca_adapter_net_ssl.h"
31 #include "cacommon.h"
32 #include "caadapterutils.h"
33 #include "cainterface.h"
34 #include "caipinterface.h"
35 #include "oic_malloc.h"
36 #include "ocrandom.h"
37 #include "byte_array.h"
38 #include "octhread.h"
39 #include "octypes.h"
40 #include "timer.h"
41
42
43 // headers required for mbed TLS
44 #include "mbedtls/platform.h"
45 #include "mbedtls/ssl.h"
46 #include "mbedtls/entropy.h"
47 #include "mbedtls/ctr_drbg.h"
48 #include "mbedtls/pkcs12.h"
49 #include "mbedtls/ssl_internal.h"
50 #include "mbedtls/net.h"
51 #ifdef __WITH_DTLS__
52 #include "mbedtls/timing.h"
53 #include "mbedtls/ssl_cookie.h"
54 #endif
55 #include "pkix_interface.h"
56
57 #if !defined(NDEBUG) || defined(TB_LOG)
58 #include "mbedtls/debug.h"
59 #include "mbedtls/version.h"
60 #endif
61
62 #ifdef __unix__
63 #include <sys/types.h>
64 #include <sys/stat.h>
65 #include <fcntl.h>
66 #include <unistd.h>
67 #endif
68
69
70 /**
71  * @def MBED_TLS_VERSION_LEN
72  * @brief mbedTLS version string length
73  */
74 #define MBED_TLS_VERSION_LEN (16)
75 /**
76  * @def SEED
77  * @brief Seed for initialization RNG
78  */
79 #define SEED "IOTIVITY_RND"
80 /**
81  * @def UUID_PREFIX
82  * @brief uuid prefix in certificate subject field
83  */
84 #define UUID_PREFIX "uuid:"
85 /**
86  * @def USERID_PREFIX
87  * @brief userid prefix in certificate alternative subject name field
88  */
89 #define USERID_PREFIX "userid:"
90
91 /**
92  * @def NET_SSL_TAG
93  * @brief Logging tag for module name
94  */
95 #define NET_SSL_TAG "OIC_CA_NET_SSL"
96 /**
97  * @def MBED_TLS_TAG
98  * @brief Logging tag for mbedTLS library
99  */
100 #define MBED_TLS_TAG "MBED_TLS"
101 /**
102  * @def MMBED_TLS_DEBUG_LEVEL
103  * @brief Logging level for mbedTLS library
104  */
105 #define MBED_TLS_DEBUG_LEVEL (4)
106
107 /**
108  * @def TLS_MSG_BUF_LEN
109  * @brief Buffer size for TLS record. A single TLS record may be up to 16384 octets in length
110  */
111 #if defined (__TIZENRT__)
112 #define TLS_MSG_BUF_LEN (2048)
113 #else
114 #define TLS_MSG_BUF_LEN (16384)
115 #endif
116
117 /**
118  * @def PSK_LENGTH
119  * @brief PSK keys max length
120  */
121 #define PSK_LENGTH (256/8)
122 /**
123  * @def UUID_LENGTHPSK_LENGTH
124  * @brief Identity max length
125  */
126 #define UUID_LENGTH (128/8)
127 /**
128  * @def UUID_STR_SIZE
129  * @brief Size of string representation RFC4122 based UUID.
130  * 32 chars for hex data and 4 '-' symbols.
131  */
132 #define UUID_STR_SIZE (36)
133
134 /**
135  * @def MASTER_SECRET_LEN
136  * @brief TLS master secret length
137  */
138 #define MASTER_SECRET_LEN (48)
139 /**
140  * @def RANDOM_LEN
141  * @brief TLS client and server random bytes length
142  */
143 #define RANDOM_LEN (32)
144 /**
145  * @def SHA384_MAC_KEY_LENGTH
146  * @brief MAC key length for SHA384 cipher suites
147  */
148 #define SHA384_MAC_KEY_LENGTH (48)
149 /**
150  * @def SHA256_MAC_KEY_LENGTH
151  * @brief MAC key length for SHA256 cipher suites
152  */
153 #define SHA256_MAC_KEY_LENGTH (32)
154 /**
155  * @def CCM_MAC_KEY_LENGTH
156  * @brief MAC key length for CCM cipher suites
157  */
158 #define CCM_MAC_KEY_LENGTH (0)
159 /**
160  * @def AES256_KEY_LENGTH
161  * @brief key material length for AES256 cipher suites
162  */
163 #define AES256_KEY_LENGTH (32)
164 /**
165  * @def AES128_KEY_LENGTH
166  * @brief key material length for AES128 cipher suites
167  */
168 #define AES128_KEY_LENGTH (16)
169 /**
170  * @def GCM_IV_LENGTH
171  * @brief length of nonce for GCM cipher suites
172  */
173 #define GCM_IV_LENGTH (12)
174 /**
175  * @def CCM_IV_LENGTH
176  * @brief length of nonce for CCM cipher suites
177  */
178 #define CCM_IV_LENGTH (4)
179 /**
180  * @def CBC_IV_LENGTH
181  * @brief length of nonce for CBC cipher suites
182  */
183 #define CBC_IV_LENGTH (0)
184
185 /**
186  * @var RETRANSMISSION_TIME
187  * @brief Maximum timeout value (in seconds) to start DTLS retransmission.
188  */
189 #define RETRANSMISSION_TIME 1
190
191 /**@def SSL_CLOSE_NOTIFY(peer, ret)
192  *
193  * Notifies of existing \a peer about closing TLS connection.
194  *
195  * @param[in] peer remote peer
196  * @param[in] ret used internaly
197  */
198 #define SSL_CLOSE_NOTIFY(peer, ret)                                                                \
199 do                                                                                                 \
200 {                                                                                                  \
201     (ret) = mbedtls_ssl_close_notify(&(peer)->ssl);                                                \
202 } while (MBEDTLS_ERR_SSL_WANT_WRITE == (ret))
203
204 /**@def SSL_RES(peer, status)
205  *
206  * Sets SSL result for callback.
207  *
208  * @param[in] peer remote peer
209  */
210 #define SSL_RES(peer, status)                                                                      \
211 if (g_sslCallback)                                                                                 \
212 {                                                                                                  \
213     CAErrorInfo_t errorInfo;                                                                       \
214     errorInfo.result = (status);                                                                   \
215     g_sslCallback(&(peer)->sep.endpoint, &errorInfo);                                              \
216 }
217 /**@def SSL_CHECK_FAIL(peer, ret, str, mutex, error, msg)
218  *
219  * Checks handshake result and send alert if needed.
220  *
221  * @param[in] peer remote peer
222  * @param[in] ret error code
223  * @param[in] str debug string
224  * @param[in] mutex ca mutex
225  * @param[in] error if code does not equal to -1 returns error code
226  * @param[in] msg allert message
227  */
228 #define SSL_CHECK_FAIL(peer, ret, str, mutex, error, msg)                                          \
229 if (0 != (ret) && MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY != (int) (ret) &&                              \
230     MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED != (int) (ret) &&                                        \
231     MBEDTLS_ERR_SSL_WANT_READ != (int) (ret) &&                                                    \
232     MBEDTLS_ERR_SSL_WANT_WRITE != (int) (ret) &&                                                   \
233     MBEDTLS_ERR_SSL_NON_FATAL != (int) (ret) &&                                                    \
234     MBEDTLS_SSL_ALERT_MSG_USER_CANCELED != (int) (ret) &&                                          \
235     MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION != (int) (ret) &&                                       \
236     MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT != (int) (ret) &&                                        \
237     MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY != (int) (ret) &&                                           \
238     MBEDTLS_SSL_ALERT_MSG_NO_CERT != (int) (ret) &&                                                \
239     MBEDTLS_SSL_ALERT_MSG_BAD_CERT != (int) (ret) &&                                               \
240     MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT != (int) (ret) &&                                       \
241     MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED != (int) (ret) &&                                           \
242     MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED != (int) (ret) &&                                           \
243     MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN != (int) (ret) &&                                           \
244     MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK != (int) (ret) &&                                  \
245     MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME != (int) (ret) &&                                      \
246     MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY != (int) (ret) &&                                   \
247     MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL != (int) (ret))                                  \
248 {                                                                                                  \
249     OIC_LOG_V(ERROR, NET_SSL_TAG, "%s: -0x%x", (str), -(ret));                                     \
250     if ((int) MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE != (int) (ret) &&                                \
251         (int) MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO != (int) (ret))                                  \
252     {                                                                                              \
253         mbedtls_ssl_send_alert_message(&(peer)->ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, (msg));        \
254     }                                                                                              \
255     RemovePeerFromList(&(peer)->sep.endpoint);                                                     \
256     if (mutex)                                                                                     \
257     {                                                                                              \
258         oc_mutex_unlock(g_sslContextMutex);                                                        \
259     }                                                                                              \
260     if ((int) MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO != (int)(ret))                                   \
261     {                                                                                              \
262         SSL_RES((peer), CA_DTLS_AUTHENTICATION_FAILURE);                                           \
263     }                                                                                              \
264     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);                                             \
265     if (-1 != (intptr_t)error)                                                                               \
266     {                                                                                              \
267         return (error);                                                                            \
268     }                                                                                              \
269 }
270
271 /**@def CONF_SSL(clientConf, serverConf, fn, ...)
272  *
273  * Calls \a fn for \a clientConf and \a serverConf.
274  *
275  */
276 #define CONF_SSL(clientConf, serverConf, fn, ...) do {                                             \
277 fn((clientConf), __VA_ARGS__);                                                                     \
278 fn((serverConf), __VA_ARGS__);                                                                     \
279 } while (0)
280
281 /** @def CHECK_MBEDTLS_RET(f, ...)
282  * A macro that checks \a f function return code
283  *
284  * If function returns error code it goes to error processing.
285  *
286  * @param[in] f  Function to call
287  */
288 #define CHECK_MBEDTLS_RET(f, ...) do {                                                             \
289 int ret = (f)(__VA_ARGS__);                                                                        \
290 if (0 != ret) {                                                                                    \
291     OIC_LOG_V(ERROR, NET_SSL_TAG, "%s returned -0x%04x\n", __func__, -(ret));                      \
292     goto exit;                                                                                     \
293 } } while (0)
294
295 typedef enum
296 {
297     SSL_RSA_WITH_AES_256_CBC_SHA256,
298     SSL_RSA_WITH_AES_128_GCM_SHA256,
299     SSL_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
300     SSL_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
301     SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
302     SSL_ECDHE_ECDSA_WITH_AES_128_CCM_8,
303     SSL_ECDHE_ECDSA_WITH_AES_128_CCM,
304     SSL_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
305     SSL_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
306     SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
307     SSL_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
308     SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
309     SSL_ECDH_ANON_WITH_AES_128_CBC_SHA256,
310     SSL_CIPHER_MAX
311 } SslCipher_t;
312
313 typedef enum
314 {
315     ADAPTER_CURVE_SECP256R1,
316     ADAPTER_CURVE_MAX
317 } AdapterCurve_t;
318
319 static const int tlsCipher[SSL_CIPHER_MAX][2] =
320 {
321     {MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, 0},
322     {MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, 0},
323     {MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
324     {MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 0},
325     {MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
326     {MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, 0},
327     {MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, 0},
328     {MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, 0},
329     {MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, 0},
330     {MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 0},
331     {MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, 0},
332     {MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, 0},
333     {MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256, 0}
334 };
335
336 static int g_cipherSuitesList[SSL_CIPHER_MAX];
337
338 static int g_ssl_ordered_default_hashes[] = {
339 #if defined(MBEDTLS_SHA256_C)
340     MBEDTLS_MD_SHA256,
341     MBEDTLS_MD_SHA224,
342 #endif
343 #if defined(MBEDTLS_SHA1_C)
344     MBEDTLS_MD_SHA1,
345 #endif
346     MBEDTLS_MD_NONE
347 };
348
349 mbedtls_ecp_group_id curve[ADAPTER_CURVE_MAX][2] =
350 {
351     {MBEDTLS_ECP_DP_SECP256R1, MBEDTLS_ECP_DP_NONE}
352 };
353
354 static PkiInfo_t g_pkiInfo = {{NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}};
355
356 typedef struct  {
357     int code;
358     int alert;
359 } CrtVerifyAlert_t;
360
361 static const CrtVerifyAlert_t crtVerifyAlerts[] = {
362     {MBEDTLS_X509_BADCERT_EXPIRED,       MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED},
363     {MBEDTLS_X509_BADCERT_REVOKED,       MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED},
364     {MBEDTLS_X509_BADCERT_CN_MISMATCH,   MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN},
365     {MBEDTLS_X509_BADCERT_NOT_TRUSTED,   MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA},
366     {MBEDTLS_X509_BADCRL_NOT_TRUSTED,    MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA},
367     {MBEDTLS_X509_BADCRL_EXPIRED,        MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY},
368     {MBEDTLS_X509_BADCERT_MISSING,       MBEDTLS_SSL_ALERT_MSG_NO_CERT},
369     {MBEDTLS_X509_BADCERT_SKIP_VERIFY,   MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY},
370     {MBEDTLS_X509_BADCERT_OTHER,         MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR},
371     {MBEDTLS_X509_BADCERT_FUTURE,        MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
372     {MBEDTLS_X509_BADCRL_FUTURE,         MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY},
373     {MBEDTLS_X509_BADCERT_KEY_USAGE,     MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
374     {MBEDTLS_X509_BADCERT_EXT_KEY_USAGE, MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
375     {MBEDTLS_X509_BADCERT_NS_CERT_TYPE,  MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
376     {MBEDTLS_X509_BADCERT_BAD_MD,        MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
377     {MBEDTLS_X509_BADCERT_BAD_PK,        MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
378     {MBEDTLS_X509_BADCERT_BAD_KEY,       MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
379     {MBEDTLS_X509_BADCRL_BAD_MD,         MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
380     {MBEDTLS_X509_BADCRL_BAD_PK,         MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
381     {MBEDTLS_X509_BADCRL_BAD_KEY,        MBEDTLS_SSL_ALERT_MSG_BAD_CERT},
382     {0, 0}
383 };
384
385 static int GetAlertCode(uint32_t flags)
386 {
387     const CrtVerifyAlert_t *cur;
388
389     for (cur = crtVerifyAlerts; cur->alert != 0 ; cur++)
390     {
391         if (flags & cur->code)
392         {
393             return cur->alert;
394         }
395     }
396     return 0;
397 }
398
399 #if !defined(NDEBUG) || defined(TB_LOG)
400 /**
401  * Pass a message to the OIC logger.
402  *
403  * @param[in] ctx  opaque context for the callback
404  * @param[in] level  debug level
405  * @param[in] file  file name
406  * @param[in] line  line number
407  * @param[in] str  message
408  */
409 static void DebugSsl(void *ctx, int level, const char *file, int line, const char *str)
410 {
411     ((void) level);
412     ((void) file);
413     ((void) line);
414     ((void) ctx);
415
416     OIC_LOG_V(DEBUG, MBED_TLS_TAG, "%s", str);
417 }
418 #endif
419
420 #if defined(_WIN32) || defined (__TIZENRT__)
421 /*
422  * Finds the first occurrence of the byte string s in byte string l.
423  */
424
425 static void * memmem(const void *l, size_t lLen, const void *s, size_t sLen)
426 {
427     char *cur;
428     char *last;
429     const char *cl = (const char *)l;
430     const char *cs = (const char *)s;
431
432     if (lLen == 0 || sLen == 0)
433     {
434         return NULL;
435     }
436     if (lLen < sLen)
437     {
438         return NULL;
439     }
440     if (sLen == 1)
441     {
442         return (void *)memchr(l, (int)*cs, lLen);
443     }
444
445     last = (char *)cl + lLen - sLen;
446
447     for (cur = (char *)cl; cur <= last; cur++)
448     {
449         if (cur[0] == cs[0] && memcmp(cur, cs, sLen) == 0)
450         {
451             return cur;
452         }
453     }
454     return NULL;
455 }
456 #endif
457 /**
458  * structure to holds the information of cache message and address info.
459  */
460 typedef ByteArray_t SslCacheMessage_t;
461
462
463 /**
464  * Data structure for holding the send and recv callbacks.
465  */
466 typedef struct TlsCallBacks
467 {
468     CAPacketReceivedCallback recvCallback;  /**< Callback used to send data to upper layer. */
469     CAPacketSendCallback sendCallback;      /**< Callback used to send data to socket layer. */
470 } SslCallbacks_t;
471
472 /**
473  * Data structure for holding the mbedTLS interface related info.
474  */
475 typedef struct SslContext
476 {
477     u_arraylist_t *peerList;         /**< peer list which holds the mapping between
478                                               peer id, it's n/w address and mbedTLS context. */
479     mbedtls_entropy_context entropy;
480     mbedtls_ctr_drbg_context rnd;
481     mbedtls_x509_crt ca;
482     mbedtls_x509_crt crt;
483     mbedtls_pk_context pkey;
484
485     mbedtls_ssl_config clientTlsConf;
486     mbedtls_ssl_config serverTlsConf;
487     mbedtls_ssl_config clientDtlsConf;
488     mbedtls_ssl_config serverDtlsConf;
489
490     SslCipher_t cipher;
491     SslCallbacks_t adapterCallbacks[MAX_SUPPORTED_ADAPTERS];
492     mbedtls_x509_crl crl;
493     bool cipherFlag[2];
494     int selectedCipher;
495
496 #ifdef __WITH_DTLS__
497     mbedtls_ssl_cookie_ctx cookieCtx;
498     int timerId;
499 #endif
500 } SslContext_t;
501
502 /**
503  * @var g_caSslContext
504  * @brief global context which holds tls context and cache list information.
505  */
506 static SslContext_t * g_caSslContext = NULL;
507
508 static SslExportKeysCallback_t gTlsExportKeysCallback = NULL;
509
510 static SslExportKeysCallback_t gDtlsExportKeysCallback = NULL;
511
512 /**
513  * @var g_getCredentialsCallback
514  * @brief callback to get TLS credentials (same as for DTLS)
515  */
516 static CAgetPskCredentialsHandler g_getCredentialsCallback = NULL;
517 /**
518  * @var g_getCerdentilTypesCallback
519  * @brief callback to get different credential types from SRM
520  */
521 static CAgetCredentialTypesHandler g_getCredentialTypesCallback = NULL;
522 /**
523  * @var g_getPkixInfoCallback
524  *
525  * @brief callback to get X.509-based Public Key Infrastructure
526  */
527 static CAgetPkixInfoHandler g_getPkixInfoCallback = NULL;
528
529 /**
530  * Callback to inform in case of client's certificate absence
531  */
532 static CertificateVerificationCallback_t g_CertificateVerificationCallback = NULL;
533
534 /**
535  * @var g_setupPkContextCallback
536  *
537  * @brief callback to setup PK context handler for H/W based Public Key Infrastructure
538  */
539 static CAsetupPkContextHandler g_setupPkContextCallback = NULL;
540
541 /**
542  * @var g_dtlsContextMutex
543  * @brief Mutex to synchronize access to g_caSslContext.
544  */
545 static oc_mutex g_sslContextMutex = NULL;
546
547 /**
548  * @var g_sslCallback
549  * @brief callback to deliver the TLS handshake result
550  */
551 static CAErrorCallback g_sslCallback = NULL;
552
553 /**
554  * Data structure for PeerCertCallback.
555  */
556 typedef struct
557 {
558     PeerCertCallback cb;
559     void *ctx;
560 } PeerCertCallback_t;
561
562 /**
563  * @var g_peerCertCallback
564  *
565  * @brief callback to utilize peer certificate information
566  */
567 static PeerCertCallback_t g_peerCertCallback = {NULL, NULL};
568
569 /**
570  * @var g_decryptBuffer
571  * @brief decrypt buffer which will be used for decryption
572  */
573 static uint8_t *g_decryptBuffer = NULL;
574
575 /**
576  * Data structure for holding the data to be received.
577  */
578 typedef struct SslRecBuf
579 {
580     uint8_t * buff;
581     size_t len;
582     size_t loaded;
583 } SslRecBuf_t;
584 /**
585  * Data structure for holding the data related to endpoint
586  * and TLS session.
587  */
588 typedef struct SslEndPoint
589 {
590     mbedtls_ssl_context ssl;
591     CASecureEndpoint_t sep;
592     u_arraylist_t * cacheList;
593     SslRecBuf_t recBuf;
594     uint8_t master[MASTER_SECRET_LEN];
595     uint8_t random[2*RANDOM_LEN];
596 #ifdef __WITH_DTLS__
597     mbedtls_timing_delay_context timer;
598 #endif // __WITH_DTLS__
599 } SslEndPoint_t;
600
601 void CAsetPskCredentialsCallback(CAgetPskCredentialsHandler credCallback)
602 {
603     // TODO Does this method needs protection of tlsContextMutex?
604     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
605     g_getCredentialsCallback = credCallback;
606     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
607 }
608
609 void CAsetPkixInfoCallback(CAgetPkixInfoHandler infoCallback)
610 {
611     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
612     g_getPkixInfoCallback = infoCallback;
613     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
614 }
615
616 void CAsetSetupPkContextCallback(CAsetupPkContextHandler setupPkCtxCallback)
617 {
618     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
619     g_setupPkContextCallback = setupPkCtxCallback;
620     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
621 }
622
623 void CAsetCredentialTypesCallback(CAgetCredentialTypesHandler credTypesCallback)
624 {
625     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
626     g_getCredentialTypesCallback = credTypesCallback;
627     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
628 }
629
630 void CAsetCertificateVerificationCallback(CertificateVerificationCallback_t certVerifyStatusCallback)
631 {
632     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
633     g_CertificateVerificationCallback = certVerifyStatusCallback;
634     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
635 }
636
637 void CAunsetCertificateVerificationCallback()
638 {
639     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
640     g_CertificateVerificationCallback = NULL;
641     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
642 }
643
644 static int GetAdapterIndex(CATransportAdapter_t adapter)
645 {
646     switch (adapter)
647     {
648         case CA_ADAPTER_IP:
649             return 0;
650         case CA_ADAPTER_TCP:
651             return 1;
652         case CA_ADAPTER_GATT_BTLE:
653             return 2;
654         default:
655             OIC_LOG(ERROR, NET_SSL_TAG, "Unsupported adapter");
656             return -1;
657     }
658 }
659 /**
660  * Write callback.
661  *
662  * @param[in]  tep    TLS endpoint
663  * @param[in]  data    message
664  * @param[in]  dataLen    message length
665  *
666  * @return  message length or -1 on error.
667  */
668 static int SendCallBack(void * tep, const unsigned char * data, size_t dataLen)
669 {
670     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s", __func__);
671     VERIFY_NON_NULL_RET(tep, NET_SSL_TAG, "secure endpoint is NULL", -1);
672     VERIFY_NON_NULL_RET(data, NET_SSL_TAG, "data is NULL", -1);
673     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL", -1);
674     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Data len: %zu", dataLen);
675     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Adapter: %u", ((SslEndPoint_t * )tep)->sep.endpoint.adapter);
676     ssize_t sentLen = 0;
677     int adapterIndex = GetAdapterIndex(((SslEndPoint_t * )tep)->sep.endpoint.adapter);
678     if (0 <= adapterIndex && MAX_SUPPORTED_ADAPTERS > adapterIndex)
679     {
680         CAPacketSendCallback sendCallback = g_caSslContext->adapterCallbacks[adapterIndex].sendCallback;
681         sentLen = sendCallback(&(((SslEndPoint_t * )tep)->sep.endpoint), (const void *) data, dataLen);
682         if (sentLen < 0)
683         {
684             OIC_LOG_V(ERROR, NET_SSL_TAG, "sendCallback() is Failed(%zd)", sentLen);
685             return -1;
686         }
687         else if ((size_t)sentLen != dataLen)
688         {
689             OIC_LOG_V(DEBUG, NET_SSL_TAG,
690                     "Packet was partially sent - total/sent/remained bytes : %zd/%zu/%zu",
691                     sentLen, dataLen, (dataLen - sentLen));
692         }
693     }
694     else
695     {
696         OIC_LOG(ERROR, NET_SSL_TAG, "Unsupported adapter");
697         return -1;
698     }
699
700     OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
701     return sentLen;
702 }
703 /**
704  * Read callback.
705  *
706  * @param[in]  tep    TLS endpoint
707  * @param[in]  data    message
708  * @param[in]  dataLen    message length
709  *
710  * @return  read length
711  */
712 static int RecvCallBack(void * tep, unsigned char * data, size_t dataLen)
713 {
714     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
715     VERIFY_NON_NULL_RET(tep, NET_SSL_TAG, "endpoint is NULL", 0);
716     VERIFY_NON_NULL_RET(data, NET_SSL_TAG, "data is NULL", 0);
717
718     SslRecBuf_t *recBuf = &((SslEndPoint_t *)tep)->recBuf;
719     size_t retLen = (recBuf->len > recBuf->loaded ? recBuf->len - recBuf->loaded : 0);
720     retLen = (retLen < dataLen ? retLen : dataLen);
721
722     memcpy(data, recBuf->buff + recBuf->loaded, retLen);
723     recBuf->loaded += retLen;
724
725     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
726     return (int)retLen;
727 }
728
729 static int CASslExportKeysHandler(void *p_expkey,
730                                 const unsigned char *ms,
731                                 const unsigned char *kb,
732                                 size_t maclen,
733                                 size_t keylen,
734                                 size_t ivlen)
735 {
736     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
737
738     if (NULL == g_caSslContext)
739     {
740         OIC_LOG(ERROR, NET_SSL_TAG, "SSL Context is not initialized.");
741         return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
742     }
743     if (NULL == p_expkey)
744     {
745         OIC_LOG(ERROR, NET_SSL_TAG, "Can not find the protocol information from 'p_expkey'.");
746         return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
747     }
748
749     CASslEkcbProtocol_t* protocol = (CASslEkcbProtocol_t*)p_expkey;
750
751     if (gTlsExportKeysCallback && CA_SSL_EKCB_TLS == (*protocol))
752     {
753         OIC_LOG(DEBUG, NET_SSL_TAG, "Invoking TLS export key callback.");
754         gTlsExportKeysCallback(ms, kb, maclen, keylen, ivlen);
755     }
756     else if (gDtlsExportKeysCallback && CA_SSL_EKCB_DTLS == (*protocol))
757     {
758         OIC_LOG(DEBUG, NET_SSL_TAG, "Invoking DTLS export key callback.");
759         gDtlsExportKeysCallback(ms, kb, maclen, keylen, ivlen);
760     }
761     else
762     {
763         OIC_LOG(ERROR, NET_SSL_TAG, "Failed to Invoke (D)TLS export key callback.");
764         return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
765     }
766
767     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
768     return 0;
769 }
770
771 CAResult_t CASetSslExportKeysCallback(SslExportKeysCallback_t exportKeysCb,
772                                       CASslEkcbProtocol_t protocol, CASslEkcbRole_t role)
773 {
774     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
775     mbedtls_ssl_config* sslConf = NULL;
776     static CASslEkcbProtocol_t protocolCtx = CA_SSL_EKCB_TLS;
777
778     if (CA_SSL_EKCB_TLS != protocol && CA_SSL_EKCB_DTLS != protocol)
779     {
780         OIC_LOG(ERROR, NET_SSL_TAG, "Invaild protocol.");
781         return CA_STATUS_INVALID_PARAM;
782     }
783     if (CA_SSL_EKCB_CLIENT != role && CA_SSL_EKCB_SERVER != role)
784     {
785         OIC_LOG(ERROR, NET_SSL_TAG, "Invaild role.");
786         return CA_STATUS_INVALID_PARAM;
787     }
788
789     OIC_LOG_V(DEBUG, NET_SSL_TAG, "TLS Export Key Callback Type : [%s] [%s]",
790               (CA_SSL_EKCB_TLS == protocol ? "TLS" : "DTLS"),
791               (CA_SSL_EKCB_CLIENT == role ? "Client" : "Server"));
792
793     oc_mutex_lock(g_sslContextMutex);
794     if (NULL == g_caSslContext)
795     {
796         OIC_LOG(ERROR, NET_SSL_TAG, "SSL Context is not initialized.");
797         oc_mutex_unlock(g_sslContextMutex);
798         return CA_STATUS_NOT_INITIALIZED;
799     }
800
801     if (CA_SSL_EKCB_TLS == protocol)
802     {
803         gTlsExportKeysCallback = exportKeysCb;
804         if (CA_SSL_EKCB_CLIENT == role)
805         {
806             sslConf = &g_caSslContext->clientTlsConf;
807         }
808         else
809         {
810             sslConf = &g_caSslContext->serverTlsConf;
811         }
812     }
813     else
814     {
815         gDtlsExportKeysCallback = exportKeysCb;
816         if (CA_SSL_EKCB_CLIENT == role)
817         {
818             sslConf = &g_caSslContext->clientDtlsConf;
819         }
820         else
821         {
822             sslConf = &g_caSslContext->serverDtlsConf;
823         }
824     }
825     protocolCtx = protocol;
826
827     if (NULL == exportKeysCb)
828     {
829         mbedtls_ssl_conf_export_keys_cb(sslConf, NULL, NULL);
830         OIC_LOG(DEBUG, NET_SSL_TAG, "Export key callback unregistered.");
831     }
832     else
833     {
834         mbedtls_ssl_conf_export_keys_cb(sslConf, CASslExportKeysHandler, (void*)(&protocolCtx));
835         OIC_LOG(DEBUG, NET_SSL_TAG, "Export key callback registered.");
836     }
837     oc_mutex_unlock(g_sslContextMutex);
838
839     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
840
841     return CA_STATUS_OK;
842 }
843
844 /**
845  * Parse chain of X.509 certificates.
846  *
847  * @param[out] crt     container for X.509 certificates
848  * @param[in]  data    buffer with X.509 certificates. Certificates may be in either in PEM
849                        or DER format in a jumble, delimiting symbols does not matter.
850  * @param[in]  bufLen  buffer length
851  * @param[in]  errNum  number certificates that failed to parse
852  *
853  * @return  number of successfully parsed certificates or -1 on error
854  */
855 static int ParseChain(mbedtls_x509_crt * crt, unsigned char * buf, size_t bufLen, int * errNum)
856 {
857     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
858     VERIFY_NON_NULL_RET(crt, NET_SSL_TAG, "Param crt is NULL" , -1);
859     VERIFY_NON_NULL_RET(buf, NET_SSL_TAG, "Param buf is NULL" , -1);
860
861     char pemCertHeader[] = {
862         0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52,
863         0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d
864     };
865     char pemCertFooter[] = {
866         0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49,
867         0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d
868     };
869     size_t pemCertHeaderLen = sizeof(pemCertHeader);
870     size_t pemCertFooterLen = sizeof(pemCertFooter);
871
872     size_t len = 0;
873     unsigned char * tmp = NULL;
874     int count = 0;
875     int ret = 0;
876     size_t pos = 0;
877
878     *errNum = 0;
879     while (pos < bufLen)
880     {
881         if (buf[pos] == 0x30 && buf[pos + 1] == 0x82)
882         {
883             tmp = (unsigned char *)buf + pos + 1;
884             CHECK_MBEDTLS_RET(mbedtls_asn1_get_len, &tmp, buf + bufLen, &len);
885             if (pos + len < bufLen)
886             {
887                 ret = mbedtls_x509_crt_parse_der(crt, buf + pos, len + 4);
888                 if (0 == ret)
889                 {
890                     count++;
891                 }
892                 else
893                 {
894                     (*errNum)++;
895                     OIC_LOG_V(ERROR, NET_SSL_TAG, "mbedtls_x509_crt_parse_der returned -0x%04x\n", -(ret));
896                 }
897             }
898             pos += len + 4;
899         }
900         else if ((buf + pos + pemCertHeaderLen < buf + bufLen) &&
901                  (0 == memcmp(buf + pos, pemCertHeader, pemCertHeaderLen)))
902         {
903             void * endPos = NULL;
904             endPos = memmem(&(buf[pos]), bufLen - pos, pemCertFooter, pemCertFooterLen);
905             if (NULL == endPos)
906             {
907                 OIC_LOG(ERROR, NET_SSL_TAG, "Error: end of PEM certificate not found.");
908                 OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
909                 return -1;
910             }
911             len = (char*)endPos - ((char*)buf + pos) + pemCertFooterLen;
912             if (pos + len + 1 <= bufLen)
913             {
914                 char con = buf[pos + len];
915                 buf[pos + len] = 0x00;
916                 ret = mbedtls_x509_crt_parse(crt, buf + pos, len + 1);
917                 if (0 == ret)
918                 {
919                     count++;
920                 }
921                 else
922                 {
923                     (*errNum)++;
924                     OIC_LOG_V(ERROR, NET_SSL_TAG, "mbedtls_x509_crt_parse returned -0x%04x\n", -(ret));
925                 }
926                 buf[pos + len] = con;
927             }
928             else
929             {
930                 unsigned char * lastCert = (unsigned char *)OICMalloc((len + 1) * sizeof(unsigned char));
931                 memcpy(lastCert, buf + pos, len);
932                 lastCert[len] = 0x00;
933                 ret = mbedtls_x509_crt_parse(crt, lastCert, len + 1);
934                 if (0 == ret)
935                 {
936                     count++;
937                 }
938                 else
939                 {
940                     (*errNum)++;
941                     OIC_LOG_V(ERROR, NET_SSL_TAG, "mbedtls_x509_crt_parse returned -0x%04x\n", -(ret));
942                 }
943                 OICFree(lastCert);
944             }
945             pos += len;
946         }
947         else
948         {
949             pos++;
950         }
951     }
952     OIC_LOG_V(INFO, NET_SSL_TAG, "%s successfully parsed %d certificates", __func__, count);
953     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
954     return count;
955
956 exit:
957     return -1;
958 }
959
960 static int VerifyCertificateCallback(void *p_vrfy, mbedtls_x509_crt *crt, int depth,
961         uint32_t *flags)
962 {
963     (void)p_vrfy;
964     char buf[1024] = {0};
965
966     if (0 != *flags) // Invalid Cerificate
967     {
968         int ret;
969         ret = mbedtls_x509_crt_verify_info(buf, sizeof(buf), "", *flags);
970         if (0 < ret)
971         {
972             OIC_LOG_V(ERROR, NET_SSL_TAG, "%s(%d)", buf, *flags);
973         }
974         return 1;
975     }
976
977     if (NULL == g_peerCertCallback.cb)
978     {
979         OIC_LOG(DEBUG, NET_SSL_TAG, "NOT SET g_peerCertCallback");
980         return 0;
981     }
982
983     /*
984      * e.g.
985      * depth = 0 : Own Cert.
986      * depth = 1 : Sub CA Cert.
987      * depth = 2 : Root CA Cert.
988      */
989     OIC_LOG_V(INFO, NET_SSL_TAG, "Depth : %d", depth);
990
991     mbedtls_x509_crt_info(buf, sizeof(buf) - 1, "", crt);
992     OIC_LOG_V(DEBUG, NET_SSL_TAG, "crt : %s", buf);
993
994     return g_peerCertCallback.cb(g_peerCertCallback.ctx, crt, depth);
995 }
996
997 CAResult_t CAsetPeerCertCallback(void *ctx, PeerCertCallback peerCertCallback)
998 {
999 #ifndef __WITH_DTLS__
1000     UNUSED(ctx);
1001     UNUSED(peerCertCallback);
1002     OIC_LOG(ERROR, NET_SSL_TAG, "Not Supported");
1003     return CA_NOT_SUPPORTED;
1004 #endif
1005
1006     if (peerCertCallback)
1007     {
1008         OIC_LOG(DEBUG, NET_SSL_TAG, "SET peerCertCallback");
1009         g_peerCertCallback.cb = peerCertCallback;
1010         g_peerCertCallback.ctx = ctx;
1011     }
1012     else
1013     {
1014         OIC_LOG(DEBUG, NET_SSL_TAG, "UNSET peerCertCallback");
1015         g_peerCertCallback.cb = NULL;
1016         g_peerCertCallback.ctx = NULL;
1017     }
1018     return CA_STATUS_OK;
1019 }
1020
1021 //Loads PKIX related information from SRM
1022 static int InitPKIX(CATransportAdapter_t adapter)
1023 {
1024     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s", __func__);
1025     VERIFY_NON_NULL_RET(g_getPkixInfoCallback, NET_SSL_TAG, "PKIX info callback is NULL", -1);
1026     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL", -1);
1027
1028     mbedtls_x509_crt_free(&g_caSslContext->ca);
1029     mbedtls_x509_crt_free(&g_caSslContext->crt);
1030     mbedtls_pk_free(&g_caSslContext->pkey);
1031     mbedtls_x509_crl_free(&g_caSslContext->crl);
1032
1033     mbedtls_x509_crt_init(&g_caSslContext->ca);
1034     mbedtls_x509_crt_init(&g_caSslContext->crt);
1035     mbedtls_pk_init(&g_caSslContext->pkey);
1036     mbedtls_x509_crl_init(&g_caSslContext->crl);
1037
1038     mbedtls_ssl_config * serverConf = (adapter == CA_ADAPTER_IP ||
1039                                    adapter == CA_ADAPTER_GATT_BTLE ?
1040                                    &g_caSslContext->serverDtlsConf : &g_caSslContext->serverTlsConf);
1041     mbedtls_ssl_config * clientConf = (adapter == CA_ADAPTER_IP ||
1042                                    adapter == CA_ADAPTER_GATT_BTLE ?
1043                                    &g_caSslContext->clientDtlsConf : &g_caSslContext->clientTlsConf);
1044
1045 #ifdef __WITH_DTLS__
1046     /*
1047      * Conf. is initialized in CAinitSslAdapter()
1048      */
1049     mbedtls_ssl_conf_verify(&g_caSslContext->clientDtlsConf, VerifyCertificateCallback, NULL);
1050 #endif
1051
1052     // load pk key, cert, trust chain and crl
1053     if (g_getPkixInfoCallback)
1054     {
1055         OIC_LOG(INFO, NET_SSL_TAG, "g_getPkixInfoCallback will be invoked");
1056         g_getPkixInfoCallback(&g_pkiInfo);
1057     }
1058
1059     // parse own certficate (optional)
1060     int ret;
1061     int errNum;
1062     int count = ParseChain(&g_caSslContext->crt, g_pkiInfo.crt.data, g_pkiInfo.crt.len, &errNum);
1063     if (0 >= count)
1064     {
1065         OIC_LOG(WARNING, NET_SSL_TAG, "Own certificate chain parsing error");
1066         goto required;
1067     }
1068     if (0 != errNum)
1069     {
1070         OIC_LOG_V(WARNING, NET_SSL_TAG, "Own certificate chain parsing error: %d certs failed to parse", errNum);
1071         goto required;
1072     }
1073
1074     // parse private key if hw is not supported (optional)
1075     if(NULL == g_setupPkContextCallback)
1076     {
1077         OIC_LOG(INFO, NET_SSL_TAG, "g_setupPkContextCallback is NULL");
1078         ret =  mbedtls_pk_parse_key(&g_caSslContext->pkey, g_pkiInfo.key.data, g_pkiInfo.key.len,
1079                                                                                    NULL, 0);
1080     }
1081     else
1082     {
1083         OIC_LOG(INFO, NET_SSL_TAG, "g_setupPkContextCallback will be invoked");
1084         // setup hw pk context (optional)
1085         ret = g_setupPkContextCallback(&g_caSslContext->pkey);
1086         if (0 == ret)
1087         {
1088             // setup public parameter
1089             mbedtls_pk_type_t ktype = mbedtls_pk_get_type(&g_caSslContext->pkey);
1090             if (MBEDTLS_PK_ECKEY == ktype || MBEDTLS_PK_ECKEY_DH == ktype
1091                 || MBEDTLS_PK_ECDSA == ktype)
1092             {
1093                 OIC_LOG_V(DEBUG, NET_SSL_TAG, "Copy ecp public param from cert, keytype [%d]", ktype);
1094                 mbedtls_ecp_keypair *eckey = (mbedtls_ecp_keypair*)g_caSslContext->crt.pk.pk_ctx;
1095                 mbedtls_ecdsa_context *ecdsa = (mbedtls_ecdsa_context*)g_caSslContext->pkey.pk_ctx;
1096                 if (ecdsa && eckey)
1097                 {
1098                     ret = mbedtls_ecdsa_from_keypair(ecdsa, eckey);
1099                     if(0 != ret )
1100                     {
1101                         OIC_LOG_V(ERROR, NET_SSL_TAG, "Fail to copy public param [0x%x]", ret);
1102                     }
1103                 }
1104                 else
1105                 {
1106                     OIC_LOG_V(WARNING, NET_SSL_TAG, "key-ctx(%p), cert-ctx(%p)", ecdsa, eckey);
1107                     goto required;
1108                 }
1109             }
1110             else
1111             {
1112                 OIC_LOG_V(INFO, NET_SSL_TAG, "loaded key is not one of eckey type [%d]", ktype);
1113             }
1114         }
1115         else
1116         {
1117             OIC_LOG_V(ERROR, NET_SSL_TAG, "Fail to call g_setupPkContextCallback [%d]", ret);
1118         }
1119     }
1120     if (0 != ret)
1121     {
1122         OIC_LOG(WARNING, NET_SSL_TAG, "Key parsing error");
1123         goto required;
1124     }
1125
1126     ret = mbedtls_ssl_conf_own_cert(serverConf, &g_caSslContext->crt, &g_caSslContext->pkey);
1127     if (0 != ret)
1128     {
1129         OIC_LOG(WARNING, NET_SSL_TAG, "Own certificate parsing error");
1130         goto required;
1131     }
1132     ret = mbedtls_ssl_conf_own_cert(clientConf, &g_caSslContext->crt, &g_caSslContext->pkey);
1133     if(0 != ret)
1134     {
1135         OIC_LOG(WARNING, NET_SSL_TAG, "Own certificate configuration error");
1136         goto required;
1137     }
1138
1139     required:
1140     count = ParseChain(&g_caSslContext->ca, g_pkiInfo.ca.data, g_pkiInfo.ca.len, &errNum);
1141     if(0 >= count)
1142     {
1143         OIC_LOG(WARNING, NET_SSL_TAG, "CA chain in svr db was not parsed");
1144         OIC_LOG(WARNING, NET_SSL_TAG, "    but if working as server, chain not required");
1145         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1146         return -1;
1147     }
1148     if(0 != errNum)
1149     {
1150         OIC_LOG_V(WARNING, NET_SSL_TAG, "CA chain parsing warning: %d certs failed to parse", errNum);
1151     }
1152
1153     ret = mbedtls_x509_crl_parse_der(&g_caSslContext->crl, g_pkiInfo.crl.data, g_pkiInfo.crl.len);
1154     if(0 != ret)
1155     {
1156         OIC_LOG(WARNING, NET_SSL_TAG, "CRL in svr db was not parsed");
1157         CONF_SSL(clientConf, serverConf, mbedtls_ssl_conf_ca_chain, &g_caSslContext->ca, NULL);
1158     }
1159     else
1160     {
1161         CONF_SSL(clientConf, serverConf, mbedtls_ssl_conf_ca_chain,
1162                  &g_caSslContext->ca, &g_caSslContext->crl);
1163     }
1164
1165     OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
1166     return 0;
1167 }
1168
1169 /*
1170  * PSK callback.
1171  *
1172  * @param[in]  notUsed     opaque context
1173  * @param[in]  ssl    mbedTLS context
1174  * @param[in]  desc    identity
1175  * @param[in]  descLen    identity length
1176  *
1177  * @return  0 on success any other return value will result in a denied PSK identity
1178  */
1179 static int GetPskCredentialsCallback(void * notUsed, mbedtls_ssl_context * ssl,
1180                                      const unsigned char * desc, size_t descLen)
1181 {
1182     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1183     VERIFY_NON_NULL_RET(g_getCredentialsCallback, NET_SSL_TAG, "Credential callback s NULL", -1);
1184     VERIFY_NON_NULL_RET(ssl, NET_SSL_TAG, "ssl pointer is NULL", -1);
1185     VERIFY_NON_NULL_RET(desc, NET_SSL_TAG, "desc pointer is NULL", -1);
1186     if (descLen > CA_MAX_ENDPOINT_IDENTITY_LEN)
1187     {
1188         OIC_LOG(ERROR, NET_SSL_TAG, "desc too long!");
1189         return -1;
1190     }
1191     (void) notUsed;
1192     uint8_t keyBuf[PSK_LENGTH] = {0};
1193
1194     // Retrieve the credentials blob from security module
1195     int ret = g_getCredentialsCallback(CA_DTLS_PSK_KEY, desc, descLen, keyBuf, PSK_LENGTH);
1196     if (ret > 0)
1197     {
1198         memcpy(((SslEndPoint_t *) ssl)->sep.identity.id, desc, descLen);
1199         ((SslEndPoint_t *) ssl)->sep.identity.id_length = descLen;
1200         OIC_LOG(DEBUG, NET_SSL_TAG, "PSK:");
1201         OIC_LOG_BUFFER(DEBUG, NET_SSL_TAG, keyBuf, ret);
1202
1203         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1204         return(mbedtls_ssl_set_hs_psk(ssl, keyBuf, ret));
1205     }
1206     OIC_LOG_V(WARNING, NET_SSL_TAG, "Out %s", __func__);
1207     return -1;
1208 }
1209
1210 /**
1211  * Gets session corresponding for endpoint.
1212  *
1213  * @param[in]  peer    remote address
1214  *
1215  * @return  TLS session or NULL
1216  */
1217 static SslEndPoint_t *GetSslPeer(const CAEndpoint_t *peer)
1218 {
1219     uint32_t listIndex = 0;
1220     uint32_t listLength = 0;
1221     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1222     VERIFY_NON_NULL_RET(peer, NET_SSL_TAG, "TLS peer is NULL", NULL);
1223     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL", NULL);
1224
1225     SslEndPoint_t *tep = NULL;
1226     listLength = u_arraylist_length(g_caSslContext->peerList);
1227     for (listIndex = 0; listIndex < listLength; listIndex++)
1228     {
1229         tep = (SslEndPoint_t *) u_arraylist_get(g_caSslContext->peerList, listIndex);
1230         if (NULL == tep)
1231         {
1232             continue;
1233         }
1234
1235         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Compare [%s:%d] and [%s:%d] for %d adapter",
1236                   peer->addr, peer->port, tep->sep.endpoint.addr, tep->sep.endpoint.port,
1237                   peer->adapter);
1238
1239         if((peer->adapter == tep->sep.endpoint.adapter)
1240                 && (0 == strncmp(peer->addr, tep->sep.endpoint.addr, MAX_ADDR_STR_SIZE_CA))
1241                 && (peer->port == tep->sep.endpoint.port || CA_ADAPTER_GATT_BTLE == peer->adapter))
1242         {
1243             OIC_LOG_V(DEBUG, NET_SSL_TAG, "Found Peer:[%s:%d] for %d adapter",
1244                     peer->addr, peer->port, peer->adapter);
1245             OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1246             return tep;
1247         }
1248     }
1249     OIC_LOG_V(INFO, NET_SSL_TAG, "Peer not found:[%s:%d] for %d adapter",
1250             peer->addr, peer->port, peer->adapter);
1251     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1252     return NULL;
1253 }
1254
1255 bool CAIsExistSslPeer(const CAEndpoint_t *peer)
1256 {
1257     oc_mutex_lock(g_sslContextMutex);
1258     if (NULL == g_caSslContext)
1259     {
1260         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
1261         oc_mutex_unlock(g_sslContextMutex);
1262         return false;
1263     }
1264
1265     if (GetSslPeer(peer))
1266     {
1267         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Exist Peer");
1268         oc_mutex_unlock(g_sslContextMutex);
1269         return true;
1270     }
1271     else
1272     {
1273         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Not Exist Peer");
1274         oc_mutex_unlock(g_sslContextMutex);
1275         return false;
1276     }
1277 }
1278
1279 /**
1280  * Gets session corresponding for endpoint.
1281  *
1282  * @param[in]  peer    remote address
1283  *
1284  * @return  TLS session or NULL
1285  */
1286 static SslEndPoint_t *GetSslPeerUsingUuid(const uint8_t *identity, size_t idLength)
1287 {
1288     uint32_t listIndex = 0;
1289     uint32_t listLength = 0;
1290     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1291     VERIFY_NON_NULL_RET(identity, NET_SSL_TAG, "Param identity is NULL", NULL);
1292     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL", NULL);
1293
1294     OIC_LOG(INFO, NET_SSL_TAG, "[Target UUID]");
1295     OIC_LOG_BUFFER(INFO, NET_SSL_TAG, identity, idLength);
1296
1297     SslEndPoint_t *tep = NULL;
1298     listLength = u_arraylist_length(g_caSslContext->peerList);
1299     for (listIndex = 0; listIndex < listLength; listIndex++)
1300     {
1301         tep = (SslEndPoint_t *) u_arraylist_get(g_caSslContext->peerList, listIndex);
1302         if (NULL == tep)
1303         {
1304             continue;
1305         }
1306
1307         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Compare UUID for [%s:%d]",
1308                   tep->sep.endpoint.addr, tep->sep.endpoint.port);
1309
1310         if ((tep->sep.identity.id_length == idLength)
1311             && (0 == memcmp(identity, tep->sep.identity.id, idLength)))
1312         {
1313             OIC_LOG_V(INFO, NET_SSL_TAG, "Found matched UUID in [%s:%d]",
1314                       tep->sep.endpoint.addr, tep->sep.endpoint.port);
1315             OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1316             return tep;
1317         }
1318     }
1319     OIC_LOG(INFO, NET_SSL_TAG, "Peer not found");
1320     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1321     return NULL;
1322 }
1323
1324
1325 #ifdef MULTIPLE_OWNER
1326 /**
1327  * Gets CA secure endpoint info corresponding for endpoint.
1328  *
1329  * @param[in]  peer    remote address
1330  *
1331  * @return  CASecureEndpoint or NULL
1332  */
1333 const CASecureEndpoint_t *GetCASecureEndpointData(const CAEndpoint_t* peer)
1334 {
1335     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1336
1337     // TODO: Added as workaround, need to debug
1338     oc_mutex_unlock(g_sslContextMutex);
1339
1340     oc_mutex_lock(g_sslContextMutex);
1341     if (NULL == g_caSslContext)
1342     {
1343         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
1344         oc_mutex_unlock(g_sslContextMutex);
1345         return NULL;
1346     }
1347
1348     SslEndPoint_t* sslPeer = GetSslPeer(peer);
1349     if(sslPeer)
1350     {
1351         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1352         oc_mutex_unlock(g_sslContextMutex);
1353         return &sslPeer->sep;
1354     }
1355
1356     OIC_LOG(DEBUG, NET_SSL_TAG, "Return NULL");
1357     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1358     oc_mutex_unlock(g_sslContextMutex);
1359     return NULL;
1360 }
1361 #endif
1362
1363 CAResult_t SetCASecureEndpointUuid(const CAEndpoint_t *peer, const char *uuid)
1364 {
1365     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1366     VERIFY_NON_NULL(peer, NET_SSL_TAG, "peer");
1367     VERIFY_NON_NULL(peer, NET_SSL_TAG, "uuid");
1368
1369     oc_mutex_lock(g_sslContextMutex);
1370     SslEndPoint_t *sslPeer = GetSslPeer(peer);
1371     if (NULL == sslPeer)
1372     {
1373         OIC_LOG(ERROR, NET_SSL_TAG, "Peer not found");
1374         oc_mutex_unlock(g_sslContextMutex);
1375         return CA_STATUS_FAILED;
1376     }
1377
1378     OCRandomUuidResult ret = OCConvertStringToUuid(uuid, sslPeer->sep.identity.id);
1379     oc_mutex_unlock(g_sslContextMutex);
1380
1381     if (RAND_UUID_OK != ret)
1382     {
1383         OIC_LOG(ERROR, NET_SSL_TAG, "Failed to convert uuid");
1384         return CA_STATUS_FAILED;
1385     }
1386
1387     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1388
1389     return CA_STATUS_OK;
1390 }
1391
1392 /**
1393  * Deletes cached message.
1394  *
1395  * @param[in]  msg    message
1396  */
1397 static void DeleteCacheMessage(SslCacheMessage_t * msg)
1398 {
1399     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1400     VERIFY_NON_NULL_VOID(msg, NET_SSL_TAG, "msg");
1401
1402     OICFree(msg->data);
1403     OICFree(msg);
1404
1405     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1406 }
1407 /**
1408  * Deletes cached message list.
1409  *
1410  * @param[in] cacheList  list of cached messages
1411  */
1412 static void DeleteCacheList(u_arraylist_t * cacheList)
1413 {
1414     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1415     VERIFY_NON_NULL_VOID(cacheList, NET_SSL_TAG, "cacheList");
1416     uint32_t listIndex = 0;
1417     uint32_t listLength = 0;
1418
1419     listLength = u_arraylist_length(cacheList);
1420     for (listIndex = 0; listIndex < listLength; listIndex++)
1421     {
1422         SslCacheMessage_t * msg = (SslCacheMessage_t *) u_arraylist_get(cacheList, listIndex);
1423         if (NULL != msg)
1424         {
1425             DeleteCacheMessage(msg);
1426         }
1427     }
1428     u_arraylist_free(&cacheList);
1429
1430     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1431 }
1432 /**
1433  * Deletes endpoint with session.
1434  *
1435  * @param[in]  tep    endpoint with session info
1436  */
1437 static void DeleteSslEndPoint(SslEndPoint_t * tep)
1438 {
1439     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1440     VERIFY_NON_NULL_VOID(tep, NET_SSL_TAG, "tep");
1441
1442     mbedtls_ssl_free(&tep->ssl);
1443     DeleteCacheList(tep->cacheList);
1444     OICFree(tep);
1445     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1446 }
1447 /**
1448  * Removes endpoint session from list.
1449  *
1450  * @param[in]  endpoint    remote address
1451  */
1452 static void RemovePeerFromList(const CAEndpoint_t * endpoint)
1453 {
1454     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1455     VERIFY_NON_NULL_VOID(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL");
1456     VERIFY_NON_NULL_VOID(endpoint, NET_SSL_TAG, "endpoint");
1457     uint32_t listLength = u_arraylist_length(g_caSslContext->peerList);
1458     for (uint32_t listIndex = 0; listIndex < listLength; listIndex++)
1459     {
1460         SslEndPoint_t * tep = (SslEndPoint_t *)u_arraylist_get(g_caSslContext->peerList,listIndex);
1461         if (NULL == tep)
1462         {
1463             continue;
1464         }
1465         if(0 == strncmp(endpoint->addr, tep->sep.endpoint.addr, MAX_ADDR_STR_SIZE_CA)
1466                 && (endpoint->port == tep->sep.endpoint.port || CA_ADAPTER_GATT_BTLE == endpoint->adapter))
1467         {
1468             u_arraylist_remove(g_caSslContext->peerList, listIndex);
1469             OIC_LOG_V(INFO, NET_SSL_TAG, "Remove Peer:[%s:%d] for %d adapter",
1470                     endpoint->addr, endpoint->port, endpoint->adapter);
1471             DeleteSslEndPoint(tep);
1472             OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1473             return;
1474         }
1475     }
1476     OIC_LOG_V(INFO, NET_SSL_TAG, "Peer not found:[%s:%d] for %d adapter",
1477             endpoint->addr, endpoint->port, endpoint->adapter);
1478     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1479 }
1480 /**
1481  * Deletes session list.
1482  */
1483 static void DeletePeerList()
1484 {
1485     OIC_LOG_V(DEBUG, NET_SSL_TAG, "%s", __func__);
1486     VERIFY_NON_NULL_VOID(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL");
1487
1488     uint32_t listLength = u_arraylist_length(g_caSslContext->peerList);
1489     for (uint32_t listIndex = 0; listIndex < listLength; listIndex++)
1490     {
1491         SslEndPoint_t * tep = (SslEndPoint_t *)u_arraylist_get(g_caSslContext->peerList,listIndex);
1492         if (NULL == tep)
1493         {
1494             continue;
1495         }
1496         if (MBEDTLS_SSL_HANDSHAKE_OVER == tep->ssl.state)
1497         {
1498             int ret = 0;
1499             do
1500             {
1501                 ret = mbedtls_ssl_close_notify(&tep->ssl);
1502             }
1503             while (MBEDTLS_ERR_SSL_WANT_WRITE == ret);
1504         }
1505         DeleteSslEndPoint(tep);
1506     }
1507     u_arraylist_free(&g_caSslContext->peerList);
1508 }
1509
1510 CAResult_t CAcloseSslConnection(const CAEndpoint_t *endpoint)
1511 {
1512     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s", __func__);
1513     VERIFY_NON_NULL_RET(endpoint, NET_SSL_TAG, "Param endpoint is NULL" , CA_STATUS_INVALID_PARAM);
1514
1515     oc_mutex_lock(g_sslContextMutex);
1516     if (NULL == g_caSslContext)
1517     {
1518         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
1519         oc_mutex_unlock(g_sslContextMutex);
1520         return CA_STATUS_FAILED;
1521     }
1522     SslEndPoint_t * tep = GetSslPeer(endpoint);
1523     if (NULL == tep)
1524     {
1525         OIC_LOG(ERROR, NET_SSL_TAG, "Session does not exist");
1526         oc_mutex_unlock(g_sslContextMutex);
1527         return CA_STATUS_FAILED;
1528     }
1529     /* No error checking, the connection might be closed already */
1530     int ret = 0;
1531     do
1532     {
1533         ret = mbedtls_ssl_close_notify(&tep->ssl);
1534     }
1535     while (MBEDTLS_ERR_SSL_WANT_WRITE == ret);
1536
1537     RemovePeerFromList(&tep->sep.endpoint);
1538     oc_mutex_unlock(g_sslContextMutex);
1539
1540     OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
1541     return CA_STATUS_OK;
1542 }
1543
1544 #ifdef __TIZEN__
1545 CAResult_t CAcloseSslConnectionFreeEndpoint(CAEndpoint_t *endpoint)
1546 {
1547     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s", __func__);
1548     VERIFY_NON_NULL_RET(endpoint, NET_SSL_TAG, "Param endpoint is NULL" , CA_STATUS_INVALID_PARAM);
1549
1550     CAResult_t ret = CAcloseSslConnection(endpoint);
1551     OICFree(endpoint);
1552
1553     OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
1554     return ret;
1555 }
1556 #endif //__TIZEN__
1557
1558 CAResult_t CAcloseSslConnectionUsingUuid(const uint8_t *identity, size_t idLength)
1559 {
1560     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1561     VERIFY_NON_NULL_RET(identity, NET_SSL_TAG, "Param identity is NULL" , CA_STATUS_INVALID_PARAM);
1562
1563     oc_mutex_lock(g_sslContextMutex);
1564     if (NULL == g_caSslContext)
1565     {
1566         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
1567         oc_mutex_unlock(g_sslContextMutex);
1568         return CA_STATUS_FAILED;
1569     }
1570
1571     SslEndPoint_t* tep = GetSslPeerUsingUuid(identity, idLength);
1572     if (NULL == tep)
1573     {
1574         OIC_LOG(ERROR, NET_SSL_TAG, "Session does not exist");
1575         oc_mutex_unlock(g_sslContextMutex);
1576         return CA_STATUS_FAILED;
1577     }
1578
1579     /* No error checking, the connection might be closed already */
1580     int ret = 0;
1581     do
1582     {
1583         ret = mbedtls_ssl_close_notify(&tep->ssl);
1584     }
1585     while (MBEDTLS_ERR_SSL_WANT_WRITE == ret);
1586
1587     RemovePeerFromList(&tep->sep.endpoint);
1588     oc_mutex_unlock(g_sslContextMutex);
1589
1590     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1591     return CA_STATUS_OK;
1592 }
1593
1594 void CAcloseSslConnectionAll(CATransportAdapter_t transportType)
1595 {
1596     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1597     oc_mutex_lock(g_sslContextMutex);
1598     if (NULL == g_caSslContext)
1599     {
1600         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
1601         oc_mutex_unlock(g_sslContextMutex);
1602         return;
1603     }
1604
1605     uint32_t listLength = u_arraylist_length(g_caSslContext->peerList);
1606     OIC_LOG_V(INFO, NET_SSL_TAG,
1607             "Required transport [%d], peer count [%d]", transportType, listLength);
1608     for (uint32_t i = listLength; i > 0; i--)
1609     {
1610         SslEndPoint_t *tep = (SslEndPoint_t *)u_arraylist_get(g_caSslContext->peerList, i - 1);
1611         if (NULL == tep)
1612         {
1613             continue;
1614         }
1615         OIC_LOG_V(INFO, NET_SSL_TAG, "SSL Connection [%s:%d], Transport [%d]",
1616                   tep->sep.endpoint.addr, tep->sep.endpoint.port, tep->sep.endpoint.adapter);
1617
1618         // check transport matching
1619         if (0 == (tep->sep.endpoint.adapter & transportType))
1620         {
1621             OIC_LOG(DEBUG, NET_SSL_TAG, "Skip the un-matched transport session");
1622             continue;
1623         }
1624
1625         // TODO: need to check below code after socket close is ensured.
1626         /*int ret = 0;
1627         do
1628         {
1629             ret = mbedtls_ssl_close_notify(&tep->ssl);
1630         }
1631         while (MBEDTLS_ERR_SSL_WANT_WRITE == ret);*/
1632
1633         // delete from list
1634         u_arraylist_remove(g_caSslContext->peerList, i - 1);
1635         DeleteSslEndPoint(tep);
1636     }
1637     oc_mutex_unlock(g_sslContextMutex);
1638
1639     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1640     return;
1641 }
1642 /**
1643  * Creates session for endpoint.
1644  *
1645  * @param[in]  endpoint    remote address
1646  * @param[in]  config    mbedTLS configuration info
1647  *
1648  * @return  TLS endpoint or NULL
1649  */
1650 static SslEndPoint_t * NewSslEndPoint(const CAEndpoint_t * endpoint, mbedtls_ssl_config * config)
1651 {
1652     SslEndPoint_t * tep = NULL;
1653     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s", __func__);
1654     VERIFY_NON_NULL_RET(endpoint, NET_SSL_TAG, "endpoint", NULL);
1655     VERIFY_NON_NULL_RET(config, NET_SSL_TAG, "config", NULL);
1656     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL", NULL);
1657
1658     tep = (SslEndPoint_t *) OICCalloc(1, sizeof (SslEndPoint_t));
1659     if (NULL == tep)
1660     {
1661         OIC_LOG(ERROR, NET_SSL_TAG, "Malloc failed!");
1662         return NULL;
1663     }
1664
1665     tep->sep.endpoint = *endpoint;
1666     tep->sep.endpoint.flags = (CATransportFlags_t)(tep->sep.endpoint.flags | CA_SECURE);
1667
1668     if(0 != mbedtls_ssl_setup(&tep->ssl, config))
1669     {
1670         OIC_LOG(ERROR, NET_SSL_TAG, "Setup failed");
1671         OICFree(tep);
1672         OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
1673         return NULL;
1674     }
1675
1676     mbedtls_ssl_set_bio(&tep->ssl, tep, SendCallBack, RecvCallBack, NULL);
1677     if (MBEDTLS_SSL_TRANSPORT_DATAGRAM == config->transport)
1678     {
1679         mbedtls_ssl_set_timer_cb(&tep->ssl, &tep->timer,
1680                                   mbedtls_timing_set_delay, mbedtls_timing_get_delay);
1681         if (MBEDTLS_SSL_IS_SERVER == config->endpoint)
1682         {
1683             if (0 != mbedtls_ssl_set_client_transport_id(&tep->ssl,
1684                                     (const unsigned char *) endpoint->addr, sizeof(endpoint->addr)))
1685             {
1686                 OIC_LOG(ERROR, NET_SSL_TAG, "Transport id setup failed!");
1687                 mbedtls_ssl_free(&tep->ssl);
1688                 OICFree(tep);
1689                 OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1690                 return NULL;
1691             }
1692         }
1693     }
1694     tep->cacheList = u_arraylist_create();
1695     if (NULL == tep->cacheList)
1696     {
1697         OIC_LOG(ERROR, NET_SSL_TAG, "cacheList initialization failed!");
1698         mbedtls_ssl_free(&tep->ssl);
1699         OICFree(tep);
1700         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1701         return NULL;
1702     }
1703     OIC_LOG_V(INFO, NET_SSL_TAG, "New [%s role] endpoint added [%s:%d]",
1704             (MBEDTLS_SSL_IS_SERVER==config->endpoint ? "server" : "client"),
1705             endpoint->addr, endpoint->port);
1706     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1707     return tep;
1708 }
1709 /**
1710  * Initializes PSK identity.
1711  *
1712  * @param[out]  config    client/server config to be updated
1713  *
1714  * @return  0 on success or -1 on error
1715  */
1716 static int InitPskIdentity(mbedtls_ssl_config * config)
1717 {
1718     uint8_t keyBuf[PSK_LENGTH] = {0};
1719     uint8_t idBuf[UUID_LENGTH] = {0};
1720     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1721     VERIFY_NON_NULL_RET(config, NET_SSL_TAG, "Param config is NULL" , -1);
1722
1723     //Retrieve PSK identity from SVR DB
1724     if (0 > g_getCredentialsCallback(CA_DTLS_PSK_IDENTITY, NULL, 0, idBuf, UUID_LENGTH))
1725     {
1726         OIC_LOG(ERROR, NET_SSL_TAG, "Identity not found");
1727         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1728         return -1;
1729     }
1730     //Store PSK ideneity in mbedtls_ssl_config
1731     if (0 != mbedtls_ssl_conf_psk(config, keyBuf, PSK_LENGTH, idBuf, UUID_LENGTH))
1732     {
1733         OIC_LOG(ERROR, NET_SSL_TAG, "Identity initialization failed!");
1734         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1735         return -1;
1736     }
1737     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1738     return 0;
1739 }
1740 static void SetupCipher(mbedtls_ssl_config * config, CATransportAdapter_t adapter)
1741 {
1742     int index = 0;
1743     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1744     VERIFY_NON_NULL_VOID(config, NET_SSL_TAG, "Invaild param");
1745     VERIFY_NON_NULL_VOID(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL");
1746     VERIFY_NON_NULL_VOID(g_getCredentialTypesCallback, NET_SSL_TAG, "Param callback is null");
1747
1748     //Resetting cipherFlag
1749     g_caSslContext->cipherFlag[0] = false;
1750     g_caSslContext->cipherFlag[1] = false;
1751
1752     g_getCredentialTypesCallback(g_caSslContext->cipherFlag);
1753     // Retrieve the PSK credential from SRM
1754     if (0 != InitPskIdentity(config))
1755     {
1756         OIC_LOG(ERROR, NET_SSL_TAG, "PSK identity initialization failed!");
1757     }
1758
1759     // Retrieve the Cert credential from SRM
1760     if (true == g_caSslContext->cipherFlag[1])
1761     {
1762         int ret = InitPKIX(adapter);
1763         if (0 != ret)
1764         {
1765             OIC_LOG(ERROR, NET_SSL_TAG, "Failed to init X.509");
1766         }
1767     }
1768
1769     memset(g_cipherSuitesList, 0, sizeof(g_cipherSuitesList));
1770
1771     if (SSL_CIPHER_MAX < g_caSslContext->cipher)
1772     {
1773         OIC_LOG(ERROR, NET_SSL_TAG, "Maximum ciphersuite index exceeded");
1774     }
1775
1776     // Add the preferred ciphersuite first
1777     if (SSL_CIPHER_MAX != g_caSslContext->cipher)
1778     {
1779         g_cipherSuitesList[index] = tlsCipher[g_caSslContext->cipher][0];
1780         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Preferred ciphersuite added");
1781         index++;
1782     }
1783
1784     // Add PSK ciphersuite
1785     if (true == g_caSslContext->cipherFlag[0] &&
1786                 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 != tlsCipher[g_caSslContext->cipher][0])
1787     {
1788        g_cipherSuitesList[index] = MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
1789        OIC_LOG(DEBUG, NET_SSL_TAG, "PSK ciphersuite added");
1790        index++;
1791     }
1792
1793     // Add all certificate ciphersuites
1794     if (true == g_caSslContext->cipherFlag[1])
1795     {
1796         for (unsigned int i = 0; i < SSL_CIPHER_MAX - 1; i++)
1797         {
1798             if (MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 != tlsCipher[i][0] &&
1799                 i != g_caSslContext->cipher)
1800             {
1801                 g_cipherSuitesList[index] = tlsCipher[i][0];
1802                 index ++;
1803             }
1804         }
1805
1806         if (MBEDTLS_SSL_IS_SERVER == config->endpoint)
1807         {
1808             mbedtls_ssl_conf_authmode(config, MBEDTLS_SSL_VERIFY_OPTIONAL);
1809         }
1810     }
1811
1812     OIC_LOG(INFO, NET_SSL_TAG, "Supported ciphersuites:");
1813     for (int i = 0; i < index; i++)
1814     {
1815         OIC_LOG_V(INFO, NET_SSL_TAG, "Ciphersuite %04x", g_cipherSuitesList[i]);
1816     }
1817
1818     mbedtls_ssl_conf_ciphersuites(config, g_cipherSuitesList);
1819
1820     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1821 }
1822 /**
1823  * Initiate TLS handshake with endpoint.
1824  *
1825  * @param[in]  endpoint    remote address
1826  *
1827  * @return  TLS endpoint or NULL
1828  */
1829 static SslEndPoint_t * InitiateTlsHandshake(const CAEndpoint_t *endpoint)
1830 {
1831     int ret = 0;
1832     SslEndPoint_t * tep = NULL;
1833
1834     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s", __func__);
1835     VERIFY_NON_NULL_RET(endpoint, NET_SSL_TAG, "Param endpoint is NULL" , NULL);
1836     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL", NULL);
1837
1838     //Remove previous peer info from peer list.
1839     RemovePeerFromList(endpoint);
1840
1841     mbedtls_ssl_config * config = (endpoint->adapter == CA_ADAPTER_IP ||
1842                                    endpoint->adapter == CA_ADAPTER_GATT_BTLE ?
1843                                    &g_caSslContext->clientDtlsConf : &g_caSslContext->clientTlsConf);
1844     tep = NewSslEndPoint(endpoint, config);
1845     if (NULL == tep)
1846     {
1847         OIC_LOG(ERROR, NET_SSL_TAG, "Malloc failed!");
1848         return NULL;
1849     }
1850
1851     //Load allowed SVR suites from SVR DB
1852     SetupCipher(config, endpoint->adapter);
1853
1854     ret = u_arraylist_add(g_caSslContext->peerList, (void *) tep);
1855     if (!ret)
1856     {
1857         OIC_LOG(ERROR, NET_SSL_TAG, "u_arraylist_add failed!");
1858         DeleteSslEndPoint(tep);
1859         return NULL;
1860     }
1861
1862     while (MBEDTLS_SSL_HANDSHAKE_OVER > tep->ssl.state)
1863     {
1864         ret = mbedtls_ssl_handshake_step(&tep->ssl);
1865         if (MBEDTLS_ERR_SSL_CONN_EOF == ret)
1866         {
1867             break;
1868         }
1869         else if (-1 == ret)
1870         {
1871             OIC_LOG(ERROR, NET_SSL_TAG, "Handshake failed due to socket error");
1872             RemovePeerFromList(&tep->sep.endpoint);
1873             return NULL;
1874         }
1875         SSL_CHECK_FAIL(tep, ret, "Handshake error", 0, NULL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1876     }
1877     OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
1878     return tep;
1879 }
1880 #ifdef __WITH_DTLS__
1881 /**
1882  * Stops DTLS retransmission.
1883  */
1884 static void StopRetransmit()
1885 {
1886     if (g_caSslContext)
1887     {
1888         unregisterTimer(g_caSslContext->timerId);
1889         g_caSslContext->timerId= -1;
1890     }
1891 }
1892 #endif
1893 void CAdeinitSslAdapter()
1894 {
1895     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1896
1897     VERIFY_NON_NULL_VOID(g_caSslContext, NET_SSL_TAG, "context is NULL");
1898     VERIFY_NON_NULL_VOID(g_sslContextMutex, NET_SSL_TAG, "context mutex is NULL");
1899
1900     //Lock tlsContext mutex
1901     oc_mutex_lock(g_sslContextMutex);
1902
1903     // Clear all lists
1904     DeletePeerList();
1905
1906     // De-initialize mbedTLS
1907     mbedtls_x509_crt_free(&g_caSslContext->ca);
1908     mbedtls_x509_crt_free(&g_caSslContext->crt);
1909     mbedtls_pk_free(&g_caSslContext->pkey);
1910     mbedtls_x509_crl_free(&g_caSslContext->crl);
1911 #ifdef __WITH_TLS__
1912     mbedtls_ssl_config_free(&g_caSslContext->clientTlsConf);
1913     mbedtls_ssl_config_free(&g_caSslContext->serverTlsConf);
1914 #endif // __WITH_TLS__
1915 #ifdef __WITH_DTLS__
1916     mbedtls_ssl_config_free(&g_caSslContext->clientDtlsConf);
1917     mbedtls_ssl_config_free(&g_caSslContext->serverDtlsConf);
1918     mbedtls_ssl_cookie_free(&g_caSslContext->cookieCtx);
1919 #endif // __WITH_DTLS__
1920     mbedtls_ctr_drbg_free(&g_caSslContext->rnd);
1921     mbedtls_entropy_free(&g_caSslContext->entropy);
1922 #ifdef __WITH_DTLS__
1923     StopRetransmit();
1924 #endif
1925     // De-initialize tls Context
1926     OICFree(g_caSslContext);
1927     g_caSslContext = NULL;
1928
1929     // Delete decrypt buffer
1930     if (g_decryptBuffer)
1931     {
1932         OICFree(g_decryptBuffer);
1933         g_decryptBuffer = NULL;
1934     }
1935
1936     // Unlock tlsContext mutex and de-initialize it
1937     oc_mutex_unlock(g_sslContextMutex);
1938     oc_mutex_free(g_sslContextMutex);
1939     g_sslContextMutex = NULL;
1940
1941     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s ", __func__);
1942 }
1943
1944 static int InitConfig(mbedtls_ssl_config * conf, int transport, int mode)
1945 {
1946     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
1947     VERIFY_NON_NULL_RET(conf, NET_SSL_TAG, "Param conf is NULL" , -1);
1948     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL Context is NULL", -1);
1949     mbedtls_ssl_config_init(conf);
1950     if (mbedtls_ssl_config_defaults(conf, mode, transport, MBEDTLS_SSL_PRESET_DEFAULT) != 0)
1951     {
1952         OIC_LOG(ERROR, NET_SSL_TAG, "Config initialization failed!");
1953         return -1;
1954     }
1955
1956     mbedtls_ssl_conf_psk_cb(conf, GetPskCredentialsCallback, NULL);
1957     mbedtls_ssl_conf_rng(conf, mbedtls_ctr_drbg_random, &g_caSslContext->rnd);
1958     mbedtls_ssl_conf_curves(conf, curve[ADAPTER_CURVE_SECP256R1]);
1959     mbedtls_ssl_conf_min_version(conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);
1960     mbedtls_ssl_conf_renegotiation(conf, MBEDTLS_SSL_RENEGOTIATION_DISABLED);
1961     mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_REQUIRED);
1962     mbedtls_ssl_conf_sig_hashes(conf, g_ssl_ordered_default_hashes);
1963
1964 #ifdef __WITH_DTLS__
1965     if (MBEDTLS_SSL_TRANSPORT_DATAGRAM == transport &&
1966             MBEDTLS_SSL_IS_SERVER == mode)
1967     {
1968         mbedtls_ssl_conf_dtls_cookies(conf, mbedtls_ssl_cookie_write, mbedtls_ssl_cookie_check,
1969                                       &g_caSslContext->cookieCtx);
1970     }
1971 #endif // __WITH_DTLS__
1972
1973 #if !defined(NDEBUG) || defined(TB_LOG)
1974     mbedtls_ssl_conf_dbg(conf, DebugSsl, NULL);
1975     mbedtls_debug_set_threshold(MBED_TLS_DEBUG_LEVEL);
1976 #endif
1977     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
1978     return 0;
1979 }
1980 #ifdef __WITH_DTLS__
1981 /**
1982  * Starts DTLS retransmission.
1983  */
1984 static int StartRetransmit()
1985 {
1986     uint32_t listIndex = 0;
1987     uint32_t listLength = 0;
1988     SslEndPoint_t *tep = NULL;
1989
1990     oc_mutex_lock(g_sslContextMutex);
1991     if (NULL == g_caSslContext)
1992     {
1993         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL. Stop retransmission");
1994         oc_mutex_unlock(g_sslContextMutex);
1995         return -1;
1996     }
1997     if (g_caSslContext->timerId != -1)
1998     {
1999         //clear previous timer
2000         unregisterTimer(g_caSslContext->timerId);
2001
2002         listLength = u_arraylist_length(g_caSslContext->peerList);
2003
2004         for (listIndex = 0; listIndex < listLength; listIndex++)
2005         {
2006             tep = (SslEndPoint_t *) u_arraylist_get(g_caSslContext->peerList, listIndex);
2007             if (NULL == tep
2008                 || (tep->ssl.conf && MBEDTLS_SSL_TRANSPORT_STREAM == tep->ssl.conf->transport)
2009                 || MBEDTLS_SSL_HANDSHAKE_OVER == tep->ssl.state)
2010             {
2011                 continue;
2012             }
2013             OIC_LOG_V(INFO, NET_SSL_TAG, "peer #%d", (int) listIndex);
2014
2015             int ret = mbedtls_ssl_handshake_step(&tep->ssl);
2016
2017             if (MBEDTLS_ERR_SSL_CONN_EOF != ret)
2018             {
2019                 //start new timer
2020                 registerTimer(RETRANSMISSION_TIME, &g_caSslContext->timerId, (void *) StartRetransmit);
2021                 //unlock & return
2022                 SSL_CHECK_FAIL(tep, ret, "Retransmission", 1, CA_STATUS_FAILED,
2023                 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
2024             }
2025         }
2026     }
2027     //start new timer
2028     registerTimer(RETRANSMISSION_TIME, &g_caSslContext->timerId, (void *) StartRetransmit);
2029     oc_mutex_unlock(g_sslContextMutex);
2030
2031     return 0;
2032 }
2033 #endif
2034
2035 CAResult_t CAinitSslAdapter()
2036 {
2037     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2038     // Initialize mutex for tlsContext
2039     if (NULL == g_sslContextMutex)
2040     {
2041         g_sslContextMutex = oc_mutex_new();
2042         VERIFY_NON_NULL_RET(g_sslContextMutex, NET_SSL_TAG, "malloc failed", CA_MEMORY_ALLOC_FAILED);
2043     }
2044     else
2045     {
2046         OIC_LOG(INFO, NET_SSL_TAG, "Done already!");
2047         return CA_STATUS_OK;
2048     }
2049
2050     // Lock tlsContext mutex and create tlsContext
2051     oc_mutex_lock(g_sslContextMutex);
2052     g_caSslContext = (SslContext_t *)OICCalloc(1, sizeof(SslContext_t));
2053
2054     if (NULL == g_caSslContext)
2055     {
2056         OIC_LOG(ERROR, NET_SSL_TAG, "Context malloc failed");
2057         oc_mutex_unlock(g_sslContextMutex);
2058         oc_mutex_free(g_sslContextMutex);
2059         g_sslContextMutex = NULL;
2060         return CA_MEMORY_ALLOC_FAILED;
2061     }
2062
2063     // Create peer list
2064     g_caSslContext->peerList = u_arraylist_create();
2065
2066     if(NULL == g_caSslContext->peerList)
2067     {
2068         OIC_LOG(ERROR, NET_SSL_TAG, "peerList initialization failed!");
2069         OICFree(g_caSslContext);
2070         g_caSslContext = NULL;
2071         oc_mutex_unlock(g_sslContextMutex);
2072         oc_mutex_free(g_sslContextMutex);
2073         g_sslContextMutex = NULL;
2074         return CA_STATUS_FAILED;
2075     }
2076
2077     /* Initialize TLS library
2078      */
2079 #if !defined(NDEBUG) || defined(TB_LOG)
2080     char version[MBED_TLS_VERSION_LEN];
2081     mbedtls_version_get_string(version);
2082     OIC_LOG_V(INFO, NET_SSL_TAG, "mbed TLS version: %s", version);
2083 #endif
2084
2085     /* Entropy settings
2086      */
2087     mbedtls_entropy_init(&g_caSslContext->entropy);
2088     mbedtls_ctr_drbg_init(&g_caSslContext->rnd);
2089
2090 #ifdef __unix__
2091     unsigned char seed[sizeof(SEED)] = {0};
2092     int urandomFd = -2;
2093     urandomFd = open("/dev/urandom", O_RDONLY);
2094     if(urandomFd == -1)
2095     {
2096         OIC_LOG(ERROR, NET_SSL_TAG, "Fails open /dev/urandom!");
2097         oc_mutex_unlock(g_sslContextMutex);
2098         CAdeinitSslAdapter();
2099         return CA_STATUS_FAILED;
2100     }
2101     if(0 > read(urandomFd, seed, sizeof(seed)))
2102     {
2103         OIC_LOG(ERROR, NET_SSL_TAG, "Fails read from /dev/urandom!");
2104         close(urandomFd);
2105         oc_mutex_unlock(g_sslContextMutex);
2106         CAdeinitSslAdapter();
2107         return CA_STATUS_FAILED;
2108     }
2109     close(urandomFd);
2110
2111 #else
2112     unsigned char * seed = (unsigned char*) SEED;
2113 #endif
2114     if(0 != mbedtls_ctr_drbg_seed(&g_caSslContext->rnd, mbedtls_entropy_func,
2115                                   &g_caSslContext->entropy, seed, sizeof(SEED)))
2116     {
2117         OIC_LOG(ERROR, NET_SSL_TAG, "Seed initialization failed!");
2118         oc_mutex_unlock(g_sslContextMutex);
2119         CAdeinitSslAdapter();
2120         return CA_STATUS_FAILED;
2121     }
2122     mbedtls_ctr_drbg_set_prediction_resistance(&g_caSslContext->rnd, MBEDTLS_CTR_DRBG_PR_OFF);
2123
2124 #ifdef __WITH_TLS__
2125     if (0 != InitConfig(&g_caSslContext->clientTlsConf,
2126                         MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_IS_CLIENT))
2127     {
2128         OIC_LOG(ERROR, NET_SSL_TAG, "Client config initialization failed!");
2129         oc_mutex_unlock(g_sslContextMutex);
2130         CAdeinitSslAdapter();
2131         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2132         return CA_STATUS_FAILED;
2133     }
2134
2135     if (0 != InitConfig(&g_caSslContext->serverTlsConf,
2136                         MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_IS_SERVER))
2137     {
2138         OIC_LOG(ERROR, NET_SSL_TAG, "Server config initialization failed!");
2139         oc_mutex_unlock(g_sslContextMutex);
2140         CAdeinitSslAdapter();
2141         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2142         return CA_STATUS_FAILED;
2143     }
2144 #endif // __WITH_TLS__
2145 #ifdef __WITH_DTLS__
2146     mbedtls_ssl_cookie_init(&g_caSslContext->cookieCtx);
2147     if (0 != mbedtls_ssl_cookie_setup(&g_caSslContext->cookieCtx, mbedtls_ctr_drbg_random,
2148                                       &g_caSslContext->rnd))
2149     {
2150         OIC_LOG(ERROR, NET_SSL_TAG, "Cookie setup failed!");
2151         oc_mutex_unlock(g_sslContextMutex);
2152         CAdeinitSslAdapter();
2153         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2154         return CA_STATUS_FAILED;
2155     }
2156
2157     if (0 != InitConfig(&g_caSslContext->clientDtlsConf,
2158                         MBEDTLS_SSL_TRANSPORT_DATAGRAM, MBEDTLS_SSL_IS_CLIENT))
2159     {
2160         OIC_LOG(ERROR, NET_SSL_TAG, "Client config initialization failed!");
2161         oc_mutex_unlock(g_sslContextMutex);
2162         CAdeinitSslAdapter();
2163         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2164         return CA_STATUS_FAILED;
2165     }
2166
2167     if (0 != InitConfig(&g_caSslContext->serverDtlsConf,
2168                         MBEDTLS_SSL_TRANSPORT_DATAGRAM, MBEDTLS_SSL_IS_SERVER))
2169     {
2170         OIC_LOG(ERROR, NET_SSL_TAG, "Server config initialization failed!");
2171         oc_mutex_unlock(g_sslContextMutex);
2172         CAdeinitSslAdapter();
2173         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2174         return CA_STATUS_FAILED;
2175     }
2176 #endif // __WITH_DTLS__
2177
2178     // set default cipher
2179     g_caSslContext->cipher = SSL_CIPHER_MAX;
2180
2181     // init X.509
2182     mbedtls_x509_crt_init(&g_caSslContext->ca);
2183     mbedtls_x509_crt_init(&g_caSslContext->crt);
2184     mbedtls_pk_init(&g_caSslContext->pkey);
2185     mbedtls_x509_crl_init(&g_caSslContext->crl);
2186
2187 #ifdef __WITH_DTLS__
2188     g_caSslContext->timerId = -1;
2189 #endif
2190
2191     // create decrypt buffer
2192     g_decryptBuffer = (uint8_t *)OICCalloc(1, TLS_MSG_BUF_LEN);
2193     if (NULL == g_decryptBuffer)
2194     {
2195         OIC_LOG(ERROR, NET_SSL_TAG, "Decrypt buffer malloc failed");
2196         oc_mutex_unlock(g_sslContextMutex);
2197         CAdeinitSslAdapter();
2198         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2199         return CA_MEMORY_ALLOC_FAILED;
2200     }
2201
2202     oc_mutex_unlock(g_sslContextMutex);
2203 #ifdef __WITH_DTLS__
2204     StartRetransmit();
2205 #endif
2206
2207     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2208     return CA_STATUS_OK;
2209 }
2210
2211 SslCacheMessage_t *  NewCacheMessage(uint8_t * data, size_t dataLen)
2212 {
2213     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2214     VERIFY_NON_NULL_RET(data, NET_SSL_TAG, "Param data is NULL" , NULL);
2215     if (0 == dataLen)
2216     {
2217         OIC_LOG(ERROR, NET_SSL_TAG, "dataLen is equal to zero");
2218         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2219         return NULL;
2220     }
2221     SslCacheMessage_t * message = (SslCacheMessage_t *) OICCalloc(1, sizeof(SslCacheMessage_t));
2222     if (NULL == message)
2223     {
2224         OIC_LOG(ERROR, NET_SSL_TAG, "calloc failed!");
2225         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2226         return NULL;
2227     }
2228
2229     message->data = (uint8_t *)OICCalloc(dataLen, sizeof(uint8_t));
2230     if (NULL == message->data)
2231     {
2232         OIC_LOG(ERROR, NET_SSL_TAG, "calloc failed!");
2233         OICFree(message);
2234         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2235         return NULL;
2236     }
2237     memcpy(message->data, data, dataLen);
2238     message->len = dataLen;
2239     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2240     return message;
2241 }
2242
2243 /* Send data via TLS connection.
2244  */
2245 CAResult_t CAencryptSsl(const CAEndpoint_t *endpoint,
2246                         void *data, uint32_t dataLen)
2247 {
2248     int ret = 0;
2249
2250     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s ", __func__);
2251
2252     VERIFY_NON_NULL_RET(endpoint, NET_SSL_TAG,"Remote address is NULL", CA_STATUS_INVALID_PARAM);
2253     VERIFY_NON_NULL_RET(data, NET_SSL_TAG, "Data is NULL", CA_STATUS_INVALID_PARAM);
2254     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Port %d", endpoint->port);
2255
2256     if (0 == dataLen)
2257     {
2258         OIC_LOG_V(ERROR, NET_SSL_TAG, "dataLen is zero [%d]", dataLen);
2259         return CA_STATUS_FAILED;
2260     }
2261
2262     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Data to be encrypted dataLen [%d]", dataLen);
2263
2264     oc_mutex_lock(g_sslContextMutex);
2265     if(NULL == g_caSslContext)
2266     {
2267         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
2268         oc_mutex_unlock(g_sslContextMutex);
2269         return CA_STATUS_FAILED;
2270     }
2271
2272     SslEndPoint_t * tep = GetSslPeer(endpoint);
2273     if (NULL == tep)
2274     {
2275         tep = InitiateTlsHandshake(endpoint);
2276     }
2277     if (NULL == tep)
2278     {
2279         OIC_LOG(ERROR, NET_SSL_TAG, "TLS handshake failed");
2280         oc_mutex_unlock(g_sslContextMutex);
2281         return CA_STATUS_FAILED;
2282     }
2283
2284     if (MBEDTLS_SSL_HANDSHAKE_OVER == tep->ssl.state)
2285     {
2286         OIC_LOG(INFO, NET_SSL_TAG, "(MBEDTLS_SSL_HANDSHAKE_OVER == tep->ssl.state)");
2287
2288         unsigned char *dataBuf = (unsigned char *)data;
2289         size_t written = 0;
2290
2291         do
2292         {
2293             ret = mbedtls_ssl_write(&tep->ssl, dataBuf, dataLen - written);
2294             if (ret < 0)
2295             {
2296                 if (MBEDTLS_ERR_SSL_WANT_WRITE != ret)
2297                 {
2298                     OIC_LOG_V(ERROR, NET_SSL_TAG, "mbedTLS write failed! returned 0x%x", -ret);
2299                     RemovePeerFromList(&tep->sep.endpoint);
2300                     oc_mutex_unlock(g_sslContextMutex);
2301                     return CA_STATUS_FAILED;
2302                 }
2303                 continue;
2304             }
2305             OIC_LOG_V(DEBUG, NET_SSL_TAG, "mbedTLS write returned with sent bytes[%d]", ret);
2306
2307             dataBuf += ret;
2308             written += ret;
2309         } while (dataLen > written);
2310
2311     }
2312     else
2313     {
2314         SslCacheMessage_t * msg = NewCacheMessage((uint8_t*) data, dataLen);
2315         if (NULL == msg || !u_arraylist_add(tep->cacheList, (void *) msg))
2316         {
2317             OIC_LOG(ERROR, NET_SSL_TAG, "u_arraylist_add failed!");
2318             oc_mutex_unlock(g_sslContextMutex);
2319             return CA_STATUS_FAILED;
2320         }
2321     }
2322
2323     oc_mutex_unlock(g_sslContextMutex);
2324
2325     OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
2326     return CA_STATUS_OK;
2327 }
2328 /**
2329  * Sends cached messages via TLS connection.
2330  *
2331  * @param[in]  tep    remote address with session info
2332  */
2333 static void SendCacheMessages(SslEndPoint_t * tep)
2334 {
2335     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2336     VERIFY_NON_NULL_VOID(tep, NET_SSL_TAG, "Param tep is NULL");
2337
2338     uint32_t listIndex = 0;
2339     uint32_t listLength = 0;
2340     listLength = u_arraylist_length(tep->cacheList);
2341     for (listIndex = 0; listIndex < listLength;)
2342     {
2343         int ret = 0;
2344         SslCacheMessage_t * msg = (SslCacheMessage_t *) u_arraylist_get(tep->cacheList, listIndex);
2345         if (NULL != msg && NULL != msg->data && 0 != msg->len)
2346         {
2347             unsigned char *dataBuf = (unsigned char *)msg->data;
2348             size_t written = 0;
2349
2350             do
2351             {
2352                 ret = mbedtls_ssl_write(&tep->ssl, dataBuf, msg->len - written);
2353                 if (ret < 0)
2354                 {
2355                     if (MBEDTLS_ERR_SSL_WANT_WRITE != ret)
2356                     {
2357                         OIC_LOG_V(ERROR, NET_SSL_TAG, "mbedTLS write failed! returned -0x%x", -ret);
2358                         break;
2359                     }
2360                     continue;
2361                 }
2362                 OIC_LOG_V(DEBUG, NET_SSL_TAG, "mbedTLS write returned with sent bytes[%d]", ret);
2363
2364                 dataBuf += ret;
2365                 written += ret;
2366             } while (msg->len > written);
2367
2368             if (u_arraylist_remove(tep->cacheList, listIndex))
2369             {
2370                 DeleteCacheMessage(msg);
2371                 // Reduce list length by 1 as we removed one element.
2372                 listLength--;
2373             }
2374             else
2375             {
2376                 OIC_LOG(ERROR, NET_SSL_TAG, "u_arraylist_remove failed.");
2377                 break;
2378             }
2379         }
2380         else
2381         {
2382             // Move to the next element
2383             ++listIndex;
2384         }
2385     }
2386     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2387 }
2388
2389 void CAsetSslHandshakeCallback(CAErrorCallback tlsHandshakeCallback)
2390 {
2391     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2392     g_sslCallback = tlsHandshakeCallback;
2393     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2394 }
2395
2396 /**
2397  * Check RFC4122 based UUID
2398  *
2399  * @param uuidString    string representation of UUID
2400  * @return true for success, otherwise false
2401  */
2402 static bool CheckUuidFormat(const char uuidString[UUID_STR_SIZE])
2403 {
2404     // Indexes of '-' symbols in string representation of UUID
2405     static const int dash_idxs[4] = {8,13,18,23};
2406
2407     VERIFY_NON_NULL_RET(uuidString, NET_SSL_TAG, "uuidString is NULL" , false);
2408
2409     // Check for '-' symbols
2410     for (int i = 0; i < 4; i++)
2411     {
2412         if (uuidString[dash_idxs[i]] != '-')
2413         {
2414             return false;
2415         }
2416     }
2417
2418     for (int i = 0; i < UUID_STR_SIZE; i++)
2419     {
2420         // Skip '-' symbols
2421         if (i == dash_idxs[0] || i == dash_idxs[1] || i == dash_idxs[2] || i == dash_idxs[3])
2422         {
2423             continue;
2424         }
2425
2426         if ((uuidString[i] >= 'a' && uuidString[i] <= 'f')
2427                 || (uuidString[i] >= 'A' && uuidString[i] <= 'F')
2428                 || (uuidString[i] >= '0' && uuidString[i] <= '9') )
2429         {
2430             continue;
2431         }
2432
2433         return false;
2434     }
2435
2436     return true;
2437 }
2438
2439 /**
2440  * FindUuid function finds the first entry of RFC4122 based UUID
2441  *
2442  * @param data  pointer to unformatted data
2443  * @param size  data size
2444  *
2445  * @return pointer to string representation of the found UUID if success, otherwise NULL
2446  */
2447 static const char* FindUuid(const char* data, size_t size)
2448 {
2449     const char* result = NULL;
2450
2451     VERIFY_NON_NULL_RET(data, NET_SSL_TAG, "data is NULL" , NULL);
2452     if (size < UUID_STR_SIZE)
2453     {
2454         OIC_LOG(ERROR, NET_SSL_TAG, "Buffer size is too small");
2455         return NULL;
2456     }
2457
2458     const char* currentPtr = data;
2459     int currentSize = size;
2460     while (!result
2461            && (currentPtr = (const char*)memchr((const void*)++currentPtr, '-', currentSize - 1))
2462            && ((currentSize = (size - (currentPtr - data))) >= (UUID_STR_SIZE - 8)))
2463     {
2464         if (currentPtr - data >= 8 && CheckUuidFormat(currentPtr - 8))
2465         {
2466             result = currentPtr - 8;
2467         }
2468     }
2469
2470     return result;
2471 }
2472
2473 /* Read data from TLS connection
2474  */
2475 CAResult_t CAdecryptSsl(const CASecureEndpoint_t *sep, uint8_t *data, uint32_t dataLen)
2476 {
2477     int ret = 0;
2478     OIC_LOG_V(INFO, NET_SSL_TAG, "In %s", __func__);
2479     VERIFY_NON_NULL_RET(sep, NET_SSL_TAG, "endpoint is NULL" , CA_STATUS_INVALID_PARAM);
2480     VERIFY_NON_NULL_RET(data, NET_SSL_TAG, "Param data is NULL" , CA_STATUS_INVALID_PARAM);
2481
2482     if (0 == dataLen)
2483     {
2484         OIC_LOG(ERROR, NET_SSL_TAG, "dataLen is zero");
2485         return CA_STATUS_FAILED;
2486     }
2487
2488     oc_mutex_lock(g_sslContextMutex);
2489     if (NULL == g_caSslContext)
2490     {
2491         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
2492         oc_mutex_unlock(g_sslContextMutex);
2493         return CA_STATUS_FAILED;
2494     }
2495
2496     SslEndPoint_t * peer = GetSslPeer(&sep->endpoint);
2497     if (NULL == peer)
2498     {
2499         mbedtls_ssl_config * config = (sep->endpoint.adapter == CA_ADAPTER_IP ||
2500                                    sep->endpoint.adapter == CA_ADAPTER_GATT_BTLE ?
2501                                    &g_caSslContext->serverDtlsConf : &g_caSslContext->serverTlsConf);
2502         peer = NewSslEndPoint(&sep->endpoint, config);
2503         if (NULL == peer)
2504         {
2505             OIC_LOG(ERROR, NET_SSL_TAG, "Malloc failed!");
2506             oc_mutex_unlock(g_sslContextMutex);
2507             return CA_STATUS_FAILED;
2508         }
2509         //Load allowed TLS suites from SVR DB
2510         SetupCipher(config, sep->endpoint.adapter);
2511
2512         ret = u_arraylist_add(g_caSslContext->peerList, (void *) peer);
2513         if (!ret)
2514         {
2515             OIC_LOG(ERROR, NET_SSL_TAG, "u_arraylist_add failed!");
2516             OICFree(peer);
2517             oc_mutex_unlock(g_sslContextMutex);
2518             return CA_STATUS_FAILED;
2519         }
2520     }
2521
2522     peer->recBuf.buff = data;
2523     peer->recBuf.len = dataLen;
2524     peer->recBuf.loaded = 0;
2525
2526     while (MBEDTLS_SSL_HANDSHAKE_OVER != peer->ssl.state)
2527     {
2528         ret = mbedtls_ssl_handshake_step(&peer->ssl);
2529         if (MBEDTLS_ERR_SSL_CONN_EOF == ret)
2530         {
2531             break;
2532         }
2533
2534         if (MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED == ret)
2535         {
2536             OIC_LOG(DEBUG, NET_SSL_TAG, "Hello verification requested");
2537             mbedtls_ssl_session_reset(&peer->ssl);
2538             mbedtls_ssl_set_client_transport_id(&peer->ssl,
2539                                                 (const unsigned char *) sep->endpoint.addr,
2540                                                  sizeof(sep->endpoint.addr));
2541             ret = mbedtls_ssl_handshake_step(&peer->ssl);
2542         }
2543         uint32_t flags = mbedtls_ssl_get_verify_result(&peer->ssl);
2544         if (0 != flags &&
2545            ((MBEDTLS_SSL_IS_CLIENT == peer->ssl.conf->endpoint) ||
2546             (MBEDTLS_SSL_IS_SERVER == peer->ssl.conf->endpoint && MBEDTLS_X509_BADCERT_MISSING != flags)))
2547         {
2548             OIC_LOG_BUFFER(ERROR, NET_SSL_TAG, (const uint8_t *) &flags, sizeof(flags));
2549             SSL_CHECK_FAIL(peer, flags, "Cert verification failed", 1,
2550                                                      CA_STATUS_FAILED, GetAlertCode(flags));
2551         }
2552         SSL_CHECK_FAIL(peer, ret, "Handshake error", 1, CA_STATUS_FAILED, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
2553         if (MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC == peer->ssl.state)
2554         {
2555             memcpy(peer->master, peer->ssl.session_negotiate->master, sizeof(peer->master));
2556             g_caSslContext->selectedCipher = peer->ssl.session_negotiate->ciphersuite;
2557         }
2558         if (MBEDTLS_SSL_CLIENT_KEY_EXCHANGE == peer->ssl.state)
2559         {
2560             memcpy(peer->random, peer->ssl.handshake->randbytes, sizeof(peer->random));
2561         }
2562
2563         if (MBEDTLS_SSL_HANDSHAKE_OVER == peer->ssl.state)
2564         {
2565             SSL_RES(peer, CA_STATUS_OK);
2566             if (MBEDTLS_SSL_IS_CLIENT == peer->ssl.conf->endpoint)
2567             {
2568                 SendCacheMessages(peer);
2569             }
2570
2571             int selectedCipher = peer->ssl.session->ciphersuite;
2572             OIC_LOG_V(DEBUG, NET_SSL_TAG, "(D)TLS Session is connected via ciphersuite [0x%x]", selectedCipher);
2573             if (MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 != selectedCipher &&
2574                 MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256 != selectedCipher)
2575             {
2576                 const mbedtls_x509_crt * peerCert = mbedtls_ssl_get_peer_cert(&peer->ssl);
2577                 ret = (NULL == peerCert ? -1 : 0);
2578                 if (g_CertificateVerificationCallback)
2579                 {
2580                     uint32_t flags = mbedtls_ssl_get_verify_result(&peer->ssl);
2581                     if (!flags)
2582                     {
2583                         g_CertificateVerificationCallback(CA_CERTIFICATE_VERIFY_SUCCESS_MUTUAL);
2584                     }
2585                     else if (MBEDTLS_X509_BADCERT_MISSING == flags)
2586                     {
2587                         g_CertificateVerificationCallback(CA_CERTIFICATE_VERIFY_NO_CERT);
2588                     }
2589                     else
2590                     {
2591                         g_CertificateVerificationCallback(CA_CERTIFICATE_VERIFY_FAILED);
2592                     }
2593                 }
2594                 //SSL_CHECK_FAIL(peer, ret, "Failed to retrieve cert", 1,
2595                 //                            CA_STATUS_FAILED, MBEDTLS_SSL_ALERT_MSG_NO_CERT);
2596                 if (0 == ret)
2597                 {
2598                     const char* uuidptr = FindUuid((const char*)peerCert->subject_raw.p, peerCert->subject_raw.len);
2599                     if (uuidptr)
2600                     {
2601                         char uuid[UUID_STR_SIZE + 1] = {0};
2602                         strncpy(uuid, uuidptr, UUID_STR_SIZE);
2603                         uuid[UUID_STR_SIZE] = '\0';
2604                         OIC_LOG_V(DEBUG, NET_SSL_TAG, "certificate uuid string: %s" , uuid);
2605                         ret = OCConvertStringToUuid(uuid, peer->sep.identity.id);
2606                         SSL_CHECK_FAIL(peer, ret, "Failed to convert subject", 1,
2607                                               CA_STATUS_FAILED, MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT);
2608                     }
2609                     else
2610                     {
2611                         OIC_LOG(WARNING, NET_SSL_TAG, "uuid not found");
2612                     }
2613                 }
2614             }
2615
2616             if (MBEDTLS_SSL_IS_CLIENT == peer->ssl.conf->endpoint)
2617             {
2618                 SendCacheMessages(peer);
2619             }
2620             mbedtls_ssl_config * config = (sep->endpoint.adapter == CA_ADAPTER_IP ||
2621                                        sep->endpoint.adapter == CA_ADAPTER_GATT_BTLE ?
2622                                        &g_caSslContext->serverDtlsConf : &g_caSslContext->serverTlsConf);
2623
2624             mbedtls_ssl_conf_authmode(config, MBEDTLS_SSL_VERIFY_REQUIRED);
2625
2626             oc_mutex_unlock(g_sslContextMutex);
2627             OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
2628             return CA_STATUS_OK;
2629         }
2630     }
2631
2632     if (MBEDTLS_SSL_HANDSHAKE_OVER == peer->ssl.state)
2633     {
2634         OIC_LOG(INFO, NET_SSL_TAG, "(MBEDTLS_SSL_HANDSHAKE_OVER == peer->ssl.state)");
2635
2636         // flag to read again remained data
2637         bool read_more = false;
2638         do
2639         {
2640             if (NULL == g_decryptBuffer)
2641             {
2642                 OIC_LOG(ERROR, NET_SSL_TAG, "decrypt buffer is NULL");
2643                 oc_mutex_unlock(g_sslContextMutex);
2644                 return CA_STATUS_FAILED;
2645             }
2646             memset(g_decryptBuffer, 0, TLS_MSG_BUF_LEN);
2647             read_more = false;
2648
2649             do
2650             {
2651                 ret = mbedtls_ssl_read(&peer->ssl, g_decryptBuffer, TLS_MSG_BUF_LEN);
2652             } while (MBEDTLS_ERR_SSL_WANT_READ == ret);
2653
2654             if (MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY == ret ||
2655                 // TinyDTLS sends fatal close_notify alert
2656                 (MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE == ret &&
2657                  MBEDTLS_SSL_ALERT_LEVEL_FATAL == peer->ssl.in_msg[0] &&
2658                  MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY == peer->ssl.in_msg[1]))
2659             {
2660                 OIC_LOG(INFO, NET_SSL_TAG, "Connection was closed gracefully");
2661                 RemovePeerFromList(&peer->sep.endpoint);
2662                 oc_mutex_unlock(g_sslContextMutex);
2663                 return CA_STATUS_OK;
2664             }
2665
2666             if (0 > ret)
2667             {
2668                 OIC_LOG_V(ERROR, NET_SSL_TAG, "mbedtls_ssl_read returned -0x%x", -ret);
2669                 //SSL_RES(peer, CA_STATUS_FAILED);
2670                 RemovePeerFromList(&peer->sep.endpoint);
2671                 oc_mutex_unlock(g_sslContextMutex);
2672                 return CA_STATUS_FAILED;
2673             }
2674             else if (0 < ret)
2675             {
2676                 int adapterIndex = GetAdapterIndex(peer->sep.endpoint.adapter);
2677                 if (0 <= adapterIndex && MAX_SUPPORTED_ADAPTERS > adapterIndex)
2678                 {
2679                     CAResult_t res;
2680                     res = g_caSslContext->adapterCallbacks[adapterIndex].recvCallback(&peer->sep,
2681                             g_decryptBuffer, ret);
2682                     if (CA_STATUS_OK != res)
2683                     {
2684                         OIC_LOG(ERROR, NET_SSL_TAG, "recvCallback is failed");
2685                         RemovePeerFromList(&peer->sep.endpoint);
2686                         oc_mutex_unlock(g_sslContextMutex);
2687                         return CA_STATUS_FAILED;
2688                     }
2689
2690                     // check if decrypted data is remained in stream transport
2691                     size_t remained = mbedtls_ssl_get_bytes_avail(&peer->ssl);
2692                     if (0 < remained &&
2693                         MBEDTLS_SSL_TRANSPORT_STREAM == peer->ssl.conf->transport)
2694                     {
2695                         OIC_LOG_V(DEBUG, NET_SSL_TAG, "need to read %zu bytes more", remained);
2696                         read_more = true;
2697                     }
2698                 }
2699                 else
2700                 {
2701                     OIC_LOG(ERROR, NET_SSL_TAG, "Unsuported adapter");
2702                     RemovePeerFromList(&peer->sep.endpoint);
2703                     oc_mutex_unlock(g_sslContextMutex);
2704                     return CA_STATUS_FAILED;
2705                 }
2706             }
2707         } while (read_more);
2708     }
2709
2710     oc_mutex_unlock(g_sslContextMutex);
2711     OIC_LOG_V(INFO, NET_SSL_TAG, "Out %s", __func__);
2712     return CA_STATUS_OK;
2713 }
2714
2715 void CAsetSslAdapterCallbacks(CAPacketReceivedCallback recvCallback,
2716                               CAPacketSendCallback sendCallback,
2717                               CATransportAdapter_t type)
2718 {
2719     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2720     VERIFY_NON_NULL_VOID(sendCallback, NET_SSL_TAG, "sendCallback is NULL");
2721     VERIFY_NON_NULL_VOID(recvCallback, NET_SSL_TAG, "recvCallback is NULL");
2722     oc_mutex_lock(g_sslContextMutex);
2723     if (NULL == g_caSslContext)
2724     {
2725         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
2726         oc_mutex_unlock(g_sslContextMutex);
2727         return;
2728     }
2729
2730     switch (type)
2731     {
2732         case CA_ADAPTER_IP:
2733             g_caSslContext->adapterCallbacks[0].recvCallback = recvCallback;
2734             g_caSslContext->adapterCallbacks[0].sendCallback = sendCallback;
2735             break;
2736         case CA_ADAPTER_TCP:
2737             g_caSslContext->adapterCallbacks[1].recvCallback = recvCallback;
2738             g_caSslContext->adapterCallbacks[1].sendCallback = sendCallback;
2739             break;
2740         case CA_ADAPTER_GATT_BTLE:
2741             g_caSslContext->adapterCallbacks[2].recvCallback = recvCallback;
2742             g_caSslContext->adapterCallbacks[2].sendCallback = sendCallback;
2743             break;
2744         default:
2745             OIC_LOG_V(ERROR, NET_SSL_TAG, "Unsupported adapter: %d", type);
2746     }
2747
2748     oc_mutex_unlock(g_sslContextMutex);
2749     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2750 }
2751 /**
2752  * Gets index of the TLS ciphersuite in the SslCipher_t enum.
2753  *
2754  * @param[in]  cipher    TLS chiphersuite code
2755  *
2756  * @return   corresponding enum
2757  */
2758
2759 static SslCipher_t GetCipherIndex(const uint32_t cipher)
2760 {
2761     switch(cipher)
2762     {
2763         case MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256:
2764         {
2765             return SSL_RSA_WITH_AES_256_CBC_SHA256;
2766         }
2767         case MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256:
2768         {
2769             return SSL_RSA_WITH_AES_128_GCM_SHA256;
2770         }
2771         case MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
2772         {
2773             return SSL_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
2774         }
2775         case MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
2776         {
2777             return SSL_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
2778         }
2779         case MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
2780         {
2781             return SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
2782         }
2783         case MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
2784         {
2785             return SSL_ECDHE_ECDSA_WITH_AES_128_CCM_8;
2786         }
2787         case MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
2788         {
2789             return SSL_ECDHE_ECDSA_WITH_AES_128_CCM;
2790         }
2791         case MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
2792         {
2793             return SSL_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
2794         }
2795         case MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
2796         {
2797             return SSL_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
2798         }
2799         case MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
2800         {
2801             return SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
2802         }
2803         case MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
2804         {
2805             return SSL_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
2806         }
2807         case MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
2808         {
2809             return SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
2810         }
2811         case MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256:
2812         {
2813             return SSL_ECDH_ANON_WITH_AES_128_CBC_SHA256;
2814         }
2815         default:
2816         {
2817             return SSL_CIPHER_MAX;
2818         }
2819     }
2820 }
2821
2822 CAResult_t CAsetTlsCipherSuite(const uint32_t cipher)
2823 {
2824     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2825     VERIFY_NON_NULL_RET(g_caSslContext, NET_SSL_TAG, "SSL context is not initialized." , CA_STATUS_NOT_INITIALIZED);
2826
2827     SslCipher_t index = GetCipherIndex(cipher);
2828     if (SSL_CIPHER_MAX == index)
2829     {
2830         OIC_LOG(WARNING, NET_SSL_TAG, "Unknown cipher");
2831     }
2832     else
2833     {
2834 #ifdef __WITH_TLS__
2835         CONF_SSL(&g_caSslContext->clientTlsConf, &g_caSslContext->serverTlsConf,
2836         mbedtls_ssl_conf_ciphersuites, tlsCipher[index]);
2837 #endif
2838 #ifdef __WITH_DTLS__
2839         CONF_SSL(&g_caSslContext->clientDtlsConf, &g_caSslContext->serverDtlsConf,
2840         mbedtls_ssl_conf_ciphersuites, tlsCipher[index]);
2841 #endif
2842         OIC_LOG_V(INFO, NET_SSL_TAG, "Selected cipher: 0x%x", cipher);
2843     }
2844     g_caSslContext->cipher = index;
2845
2846     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2847     return CA_STATUS_OK;
2848 }
2849
2850 CAResult_t CAinitiateSslHandshake(const CAEndpoint_t *endpoint)
2851 {
2852     CAResult_t res = CA_STATUS_OK;
2853     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2854     VERIFY_NON_NULL_RET(endpoint, NET_SSL_TAG, "Param endpoint is NULL" , CA_STATUS_INVALID_PARAM);
2855     oc_mutex_lock(g_sslContextMutex);
2856     if (NULL == InitiateTlsHandshake(endpoint))
2857     {
2858         OIC_LOG(ERROR, NET_SSL_TAG, "TLS handshake failed");
2859         res = CA_STATUS_FAILED;
2860     }
2861     oc_mutex_unlock(g_sslContextMutex);
2862     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2863     return res;
2864 }
2865 /**
2866  * Expands the secret into blocks of data according
2867  * to the algorithm specified in section 5 of RFC 4346
2868  *
2869  * This function writes upto @p bufLen bytes into the given output buffer @p buf
2870  *
2871  * @param  key    secret key.
2872  * @param  keyLen    secret key length.
2873  * @param  label    A PRF label.
2874  * @param  labelLen     Actual length of @p label.
2875  * @param  random1    Random seed.
2876  * @param  random1Len     Actual length of @p random1 (may be zero).
2877  * @param  random2     Random seed.
2878  * @param  random2Len    Actual length of @p random2 (may be zero).
2879  * @param  buf    Output buffer for generated random data.
2880  * @param  bufLen    Maximum size of @p buf.
2881  *
2882  * @return The actual number of bytes written to @p buf or @c -1 on error.
2883  */
2884
2885 static int pHash (const unsigned char *key, size_t keyLen,
2886      const unsigned char *label, size_t labelLen,
2887      const unsigned char *random1, size_t random1Len,
2888      const unsigned char *random2, size_t random2Len,
2889      unsigned char *buf, size_t bufLen)
2890 {
2891     unsigned char A[RANDOM_LEN] = {0};
2892     unsigned char tmp[RANDOM_LEN] = {0};
2893     size_t dLen;   /* digest length */
2894     size_t len = 0;   /* result length */
2895
2896     VERIFY_NON_NULL_RET(key, NET_SSL_TAG, "key is NULL", -1);
2897     VERIFY_NON_NULL_RET(label, NET_SSL_TAG, "label is NULL", -1);
2898     VERIFY_NON_NULL_RET(random1, NET_SSL_TAG, "random1 is NULL", -1);
2899     VERIFY_NON_NULL_RET(random2, NET_SSL_TAG, "random2 is NULL", -1);
2900     VERIFY_NON_NULL_RET(buf, NET_SSL_TAG, "buf is NULL", -1);
2901
2902     mbedtls_md_context_t hmacA;
2903     mbedtls_md_context_t hmacP;
2904
2905     mbedtls_md_init(&hmacA);
2906     mbedtls_md_init(&hmacP);
2907
2908     CHECK_MBEDTLS_RET(mbedtls_md_setup, &hmacA, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 1);
2909     CHECK_MBEDTLS_RET(mbedtls_md_setup, &hmacP, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 1);
2910
2911     CHECK_MBEDTLS_RET(mbedtls_md_hmac_starts, &hmacA, key, keyLen );
2912     CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacA, label, labelLen);
2913     CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacA, random1, random1Len);
2914     CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacA, random2, random2Len);
2915     CHECK_MBEDTLS_RET(mbedtls_md_hmac_finish, &hmacA, A);
2916
2917     dLen = RANDOM_LEN;
2918
2919     CHECK_MBEDTLS_RET(mbedtls_md_hmac_starts, &hmacP, key, keyLen);
2920
2921     while (len + dLen < bufLen)
2922     {
2923         CHECK_MBEDTLS_RET(mbedtls_md_hmac_reset, &hmacP);
2924         CHECK_MBEDTLS_RET(mbedtls_md_hmac_starts, &hmacP, key, keyLen);
2925         CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, A, dLen);
2926         CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, label, labelLen);
2927         CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, random1, random1Len);
2928         CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, random2, random2Len);
2929
2930         CHECK_MBEDTLS_RET(mbedtls_md_hmac_finish, &hmacP, tmp);
2931
2932         len += RANDOM_LEN;
2933
2934         memcpy(buf, tmp, dLen);
2935         buf += dLen;
2936
2937         CHECK_MBEDTLS_RET(mbedtls_md_hmac_reset, &hmacA);
2938         CHECK_MBEDTLS_RET(mbedtls_md_hmac_starts, &hmacA, key, keyLen);
2939         CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacA, A, dLen);
2940         CHECK_MBEDTLS_RET(mbedtls_md_hmac_finish, &hmacA, A);
2941     }
2942
2943     CHECK_MBEDTLS_RET(mbedtls_md_hmac_reset, &hmacP);
2944     CHECK_MBEDTLS_RET(mbedtls_md_hmac_starts, &hmacP, key, keyLen);
2945     CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, A, dLen);
2946
2947     CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, label, labelLen);
2948     CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, random1, random1Len);
2949     CHECK_MBEDTLS_RET(mbedtls_md_hmac_update, &hmacP, random2, random2Len);
2950     CHECK_MBEDTLS_RET(mbedtls_md_hmac_finish, &hmacP, tmp);
2951
2952     memcpy(buf, tmp, bufLen - len);
2953
2954     mbedtls_md_free(&hmacA);
2955     mbedtls_md_free(&hmacP);
2956     return bufLen;
2957
2958 exit:
2959     mbedtls_md_free(&hmacA);
2960     mbedtls_md_free(&hmacP);
2961     return -1;
2962 }
2963
2964 CAResult_t CAsslGenerateOwnerPsk(const CAEndpoint_t *endpoint,
2965                             const uint8_t* label, const size_t labelLen,
2966                             const uint8_t* rsrcServerDeviceId, const size_t rsrcServerDeviceIdLen,
2967                             const uint8_t* provServerDeviceId, const size_t provServerDeviceIdLen,
2968                             uint8_t* ownerPsk, const size_t ownerPskSize)
2969 {
2970     OIC_LOG_V(DEBUG, NET_SSL_TAG, "In %s", __func__);
2971     VERIFY_NON_NULL_RET(endpoint, NET_SSL_TAG, "endpoint is NULL", CA_STATUS_INVALID_PARAM);
2972     VERIFY_NON_NULL_RET(label, NET_SSL_TAG, "label is NULL", CA_STATUS_INVALID_PARAM);
2973     VERIFY_NON_NULL_RET(rsrcServerDeviceId, NET_SSL_TAG, "rsrcId is NULL", CA_STATUS_INVALID_PARAM);
2974     VERIFY_NON_NULL_RET(provServerDeviceId, NET_SSL_TAG, "provId is NULL", CA_STATUS_INVALID_PARAM);
2975     VERIFY_NON_NULL_RET(ownerPsk, NET_SSL_TAG, "ownerPSK is NULL", CA_STATUS_INVALID_PARAM);
2976
2977     oc_mutex_lock(g_sslContextMutex);
2978     if (NULL == g_caSslContext)
2979     {
2980         OIC_LOG(ERROR, NET_SSL_TAG, "Context is NULL");
2981         oc_mutex_unlock(g_sslContextMutex);
2982         OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
2983         return CA_STATUS_FAILED;
2984     }
2985     SslEndPoint_t * tep = GetSslPeer(endpoint);
2986     if (NULL == tep)
2987     {
2988         OIC_LOG(ERROR, NET_SSL_TAG, "Session does not exist");
2989         oc_mutex_unlock(g_sslContextMutex);
2990         return CA_STATUS_FAILED;
2991     }
2992
2993     // keyBlockLen set up according to OIC 1.1 Security Specification Section 7.3.2
2994     int macKeyLen = 0;
2995     int ivSize = 0;
2996     int keySize = 0;
2997     int keyBlockLen = 0;
2998     if (MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256 == g_caSslContext->selectedCipher ||
2999         MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 == g_caSslContext->selectedCipher ||
3000         MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 == g_caSslContext->selectedCipher ||
3001         MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 == g_caSslContext->selectedCipher)
3002     {
3003         // 2 * ( 32 + 0 + 16 ) = 96
3004         macKeyLen = SHA256_MAC_KEY_LENGTH;
3005         ivSize = CBC_IV_LENGTH;
3006         keySize = AES128_KEY_LENGTH;
3007     }
3008     else if (MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM == g_caSslContext->selectedCipher ||
3009              MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 == g_caSslContext->selectedCipher)
3010     {
3011         // 2 * ( 0 + 4 + 16 ) = 40
3012         macKeyLen = CCM_MAC_KEY_LENGTH;
3013         ivSize = CCM_IV_LENGTH;
3014         keySize = AES128_KEY_LENGTH;
3015     }
3016     else if (MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 == g_caSslContext->selectedCipher)
3017     {
3018         // 2 * ( 32 + 12 + 16 ) = 120
3019         macKeyLen = SHA256_MAC_KEY_LENGTH;
3020         ivSize = GCM_IV_LENGTH;
3021         keySize = AES128_KEY_LENGTH;
3022     }
3023     else if (MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 == g_caSslContext->selectedCipher)
3024     {
3025         // 2 * ( 32 + 0 + 32 ) = 128
3026         macKeyLen = SHA256_MAC_KEY_LENGTH;
3027         ivSize = CBC_IV_LENGTH;
3028         keySize = AES256_KEY_LENGTH;
3029     }
3030     else if (MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 == g_caSslContext->selectedCipher)
3031     {
3032         // 2 * ( 48 + 0 + 32 ) = 160
3033         macKeyLen = SHA384_MAC_KEY_LENGTH;
3034         ivSize = CBC_IV_LENGTH;
3035         keySize = AES256_KEY_LENGTH;
3036     }
3037     else if (MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 == g_caSslContext->selectedCipher)
3038     {
3039         // 2 * ( 48 + 12 + 32 ) = 184
3040         macKeyLen = SHA384_MAC_KEY_LENGTH;
3041         ivSize = GCM_IV_LENGTH;
3042         keySize = AES256_KEY_LENGTH;
3043     }
3044     else if (MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 == g_caSslContext->selectedCipher)
3045     {
3046         // 2 * ( 48 + 12 + 32 ) = 184
3047         macKeyLen = SHA256_MAC_KEY_LENGTH;
3048         ivSize = GCM_IV_LENGTH;
3049         keySize = AES128_KEY_LENGTH;
3050     }
3051     keyBlockLen = 2 * (macKeyLen + keySize + ivSize);
3052
3053     uint8_t * keyblock = (uint8_t *)OICMalloc(keyBlockLen);
3054     if (NULL == keyblock)
3055     {
3056         OIC_LOG(ERROR, NET_SSL_TAG, "Failed to OICMalloc for keyblock");
3057         oc_mutex_unlock(g_sslContextMutex);
3058         return CA_STATUS_FAILED;
3059     }
3060
3061     // "key expansion"
3062     uint8_t lab[] = {0x6b, 0x65, 0x79, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e};
3063     int ret = pHash(tep->master, sizeof(tep->master), lab, sizeof(lab),
3064                     (tep->random) + RANDOM_LEN, RANDOM_LEN, tep->random, RANDOM_LEN,
3065                     keyblock, keyBlockLen);
3066     if (-1 == ret)
3067     {
3068         OIC_LOG(ERROR, NET_SSL_TAG, "PSK not generated");
3069         OICFree(keyblock);
3070         oc_mutex_unlock(g_sslContextMutex);
3071         return CA_STATUS_FAILED;
3072     }
3073
3074     ret = pHash(keyblock, keyBlockLen, label, labelLen,
3075                 rsrcServerDeviceId, rsrcServerDeviceIdLen,
3076                 provServerDeviceId, provServerDeviceIdLen,
3077                 ownerPsk, ownerPskSize);
3078     if (-1 == ret)
3079     {
3080         OIC_LOG(ERROR, NET_SSL_TAG, "PSK not generated");
3081         OICFree(keyblock);
3082         oc_mutex_unlock(g_sslContextMutex);
3083         return CA_STATUS_FAILED;
3084     }
3085
3086     OICFree(keyblock);
3087     oc_mutex_unlock(g_sslContextMutex);
3088
3089     OIC_LOG_V(DEBUG, NET_SSL_TAG, "Out %s", __func__);
3090     return CA_STATUS_OK;
3091 }