diff --git a/include/coap2/coap_dtls_internal.h b/include/coap2/coap_dtls_internal.h index 4d14fa11..3d4bf148 100644 --- a/include/coap2/coap_dtls_internal.h +++ b/include/coap2/coap_dtls_internal.h @@ -327,6 +327,17 @@ void coap_dtls_startup(void); */ void coap_dtls_shutdown(void); +/** + * Get the actual (D)TLS object for the session. + * + * @param session The session. + * @param tls_lib Updated with the library type. + * + * @return The TLS information. + */ +void *coap_dtls_get_tls(const coap_session_t *session, + coap_tls_library_t *tls_lib); + /** @} */ #endif /* COAP_DTLS_INTERNAL_H */ diff --git a/include/coap2/coap_session.h b/include/coap2/coap_session.h index 019a206e..d85dd6c3 100644 --- a/include/coap2/coap_session.h +++ b/include/coap2/coap_session.h @@ -162,15 +162,17 @@ int coap_session_get_ifindex(const coap_session_t *session); * Get the session TLS security ptr (TLS type dependent) * * OpenSSL: SSL* - * GnuTLS: coap_gnutls_env_t* - * Mbed TLS: coap_mbedtls_env_t* - * TinyDTLS: session_t* + * GnuTLS: gnutls_session_t (implicit *) + * Mbed TLS: mbedtls_ssl_context* + * TinyDTLS: struct dtls_context* * * @param session The CoAP session. + * @param tls_lib Updated with the library type. * * @return The session TLS ptr or @c NULL if not set up */ -void *coap_session_get_tls(const coap_session_t *session); +void *coap_session_get_tls(const coap_session_t *session, + coap_tls_library_t *tls_lib); /** * Get the session context diff --git a/man/coap_session.txt.in b/man/coap_session.txt.in index 10067c2c..8e66a719 100644 --- a/man/coap_session.txt.in +++ b/man/coap_session.txt.in @@ -59,7 +59,8 @@ const coap_session_t *_session_);* *coap_session_state_t coap_session_get_state(const coap_session_t *_session_);* -*void *coap_session_get_tls(const coap_session_t *_session_);* +*void *coap_session_get_tls(const coap_session_t *_session_, +coap_tls_library_t *tls_lib);* *coap_session_type_t coap_session_get_type(const coap_session_t *_session_);* @@ -158,13 +159,14 @@ of the _session_. [source, c] ---- OpenSSL: SSL* -GnuTLS: coap_gnutls_env_t* -Mbed TLS: coap_mbedtls_env_t* -TinyDTLS: session_t* +GnuTLS: gnutls_session_t (implicit *) +Mbed TLS: mbedtls_ssl_context* +TinyDTLS: struct dtls_context* ---- The *coap_session_get_tls*() function is used to get the pointer to the TLS -information from the _session_. This is TLS library specific. +information from the _session_. This is TLS library specific. _tls_lib_ is +updated with the underlying (D)TLS library type. [source, c] ---- diff --git a/src/coap_gnutls.c b/src/coap_gnutls.c index 3186911c..d8eb2772 100644 --- a/src/coap_gnutls.c +++ b/src/coap_gnutls.c @@ -379,6 +379,19 @@ void coap_dtls_startup(void) { void coap_dtls_shutdown(void) { } +void * +coap_dtls_get_tls(const coap_session_t *c_session, + coap_tls_library_t *tls_lib) { + if (tls_lib) + *tls_lib = COAP_TLS_LIBRARY_GNUTLS; + if (c_session && c_session->tls) { + const coap_gnutls_env_t *g_env = (const coap_gnutls_env_t *)c_session->tls; + + return g_env->g_session; + } + return NULL; +} + void coap_dtls_set_log_level(int level) { dtls_log_level = level; diff --git a/src/coap_mbedtls.c b/src/coap_mbedtls.c index 8e03c100..44b825a9 100644 --- a/src/coap_mbedtls.c +++ b/src/coap_mbedtls.c @@ -1937,6 +1937,22 @@ void coap_dtls_startup(void) void coap_dtls_shutdown(void) { } +void * +coap_dtls_get_tls(const coap_session_t *c_session, + coap_tls_library_t *tls_lib) { + if (tls_lib) + *tls_lib = COAP_TLS_LIBRARY_MBEDTLS; + if (c_session && c_session->tls) { + coap_mbedtls_env_t *m_env; + + /* To get around const issue */ + memcpy(&m_env, &c_session->tls, sizeof(m_env)); + + return (void *)&m_env->ssl; + } + return NULL; +} + static int keep_log_level = 0; void coap_dtls_set_log_level(int level) diff --git a/src/coap_notls.c b/src/coap_notls.c index 3c36be91..5592cede 100644 --- a/src/coap_notls.c +++ b/src/coap_notls.c @@ -70,6 +70,14 @@ static int dtls_log_level = 0; void coap_dtls_startup(void) { } +void * +coap_dtls_get_tls(const coap_session_t *c_session COAP_UNUSED, + coap_tls_library_t *tls_lib) { + if (tls_lib) + *tls_lib = COAP_TLS_LIBRARY_NOTLS; + return NULL; +} + void coap_dtls_shutdown(void) { } diff --git a/src/coap_openssl.c b/src/coap_openssl.c index 0aad0eee..1855f958 100644 --- a/src/coap_openssl.c +++ b/src/coap_openssl.c @@ -215,6 +215,17 @@ void coap_dtls_shutdown(void) { } } +void * +coap_dtls_get_tls(const coap_session_t *c_session, + coap_tls_library_t *tls_lib) { + if (tls_lib) + *tls_lib = COAP_TLS_LIBRARY_OPENSSL; + if (c_session) { + return c_session->tls; + } + return NULL; +} + static int dtls_log_level = 0; void coap_dtls_set_log_level(int level) { diff --git a/src/coap_session.c b/src/coap_session.c index 16572ae5..53436ab3 100644 --- a/src/coap_session.c +++ b/src/coap_session.c @@ -1218,9 +1218,10 @@ int coap_session_get_ifindex(const coap_session_t *session) { return -1; } -void *coap_session_get_tls(const coap_session_t *session) { +void *coap_session_get_tls(const coap_session_t *session, + coap_tls_library_t *tls_lib) { if (session) - return session->tls; + return coap_dtls_get_tls(session, tls_lib); return NULL; } diff --git a/src/coap_tinydtls.c b/src/coap_tinydtls.c index 62a321c7..b308aec2 100644 --- a/src/coap_tinydtls.c +++ b/src/coap_tinydtls.c @@ -51,6 +51,20 @@ void coap_dtls_startup(void) { void coap_dtls_shutdown(void) { } +void * +coap_dtls_get_tls(const coap_session_t *c_session, + coap_tls_library_t *tls_lib) { + if (tls_lib) + *tls_lib = COAP_TLS_LIBRARY_TINYDTLS; + if (c_session && c_session->context && c_session->context->dtls_context) { + const coap_tiny_context_t *t_context = + (const coap_tiny_context_t *)c_session->context->dtls_context; + + return t_context->dtls_context; + } + return NULL; +} + void coap_dtls_set_log_level(int level) { dtls_set_log_level(level);