10 #include "coap_config.h" 12 #ifdef HAVE_LIBTINYDTLS 20 #undef PACKAGE_BUGREPORT 23 #undef PACKAGE_TARNAME 25 #undef PACKAGE_VERSION 29 #include <dtls_debug.h> 31 static dtls_tick_t dtls_tick_0 = 0;
41 dtls_ticks(&dtls_tick_0);
47 dtls_set_log_level(level);
52 return dtls_get_log_level();
55 static void get_session_addr(
const session_t *s,
coap_address_t *a) {
60 if (s->addr.sa.sa_family == AF_INET6) {
63 }
else if (s->addr.sa.sa_family == AF_INET) {
67 a->
size = (socklen_t)s->size;
73 static void put_session_addr(
const coap_address_t *a, session_t *s) {
75 s->size = (
unsigned char)
sizeof(s->addr);
79 if (a->
addr.
sa.sa_family == AF_INET6) {
80 s->
size = (socklen_t)
sizeof(s->addr.sin6);
82 }
else if (a->
addr.
sa.sa_family == AF_INET) {
83 s->size = (socklen_t)
sizeof(s->addr.sin);
86 s->size = (socklen_t)a->
size;
94 session_t *dtls_session, uint8 *data,
size_t len) {
99 get_session_addr(dtls_session, &remote_addr);
109 dtls_application_data(
struct dtls_context_t *dtls_context,
110 session_t *dtls_session, uint8 *data,
size_t len) {
115 get_session_addr(dtls_session, &remote_addr);
119 "dropped message that was received on invalid interface\n");
126 static int coap_event_dtls = 0;
129 dtls_event(
struct dtls_context_t *dtls_context,
130 session_t *dtls_session,
131 dtls_alert_level_t level,
136 if (level == DTLS_ALERT_LEVEL_FATAL)
141 case DTLS_ALERT_CLOSE_NOTIFY:
146 case DTLS_EVENT_CONNECTED:
151 case DTLS_EVENT_RENEGOTIATE:
167 get_psk_info(
struct dtls_context_t *dtls_context,
168 const session_t *dtls_session,
169 dtls_credentials_type_t type,
170 const uint8_t *
id,
size_t id_len,
171 unsigned char *result,
size_t result_length) {
174 int fatal_error = DTLS_ALERT_INTERNAL_ERROR;
175 size_t identity_length;
176 static int client = 0;
178 static size_t psk_len = 0;
182 if (type == DTLS_PSK_KEY && client) {
183 if (psk_len > result_length) {
187 memcpy(result, psk, psk_len);
194 get_session_addr(dtls_session, &remote_addr);
202 case DTLS_PSK_IDENTITY:
211 psk_len = coap_context->
get_client_psk(coap_session, (
const uint8_t*)
id, id_len, (
uint8_t*)result, &identity_length, result_length, psk,
sizeof(psk));
214 fatal_error = DTLS_ALERT_CLOSE_NOTIFY;
218 return (
int)identity_length;
238 return dtls_alert_fatal_create(fatal_error);
241 static dtls_handler_t cb = {
243 .read = dtls_application_data,
245 .get_psk_info = get_psk_info,
247 .get_ecdsa_key = NULL,
248 .verify_ecdsa_key = NULL
254 struct dtls_context_t *dtls_context = dtls_new_context(coap_context);
257 dtls_set_handler(dtls_context, &cb);
267 struct dtls_context_t *dtls_context = (
struct dtls_context_t *)handle;
268 dtls_free_context(dtls_context);
274 session_t *dtls_session =
coap_malloc_type(COAP_DTLS_SESSION,
sizeof(session_t));
279 dtls_session_init(dtls_session);
280 put_session_addr(&session->
remote_addr, dtls_session);
281 dtls_session->ifindex = session->
ifindex;
306 dtls_session) >= 0) {
330 if (coap_session->
tls) {
331 dtls_peer_t *peer = dtls_get_peer(ctx, (session_t *)coap_session->
tls);
333 dtls_reset_peer(ctx, peer);
335 dtls_close(ctx, (session_t *)coap_session->
tls);
338 coap_session->
tls = NULL;
352 coap_event_dtls = -1;
354 memcpy (&data_rw, &data,
sizeof(data_rw));
356 (session_t *)session->
tls, data_rw, data_len);
361 if (coap_event_dtls >= 0) {
377 clock_time_t next = 0;
378 dtls_check_retransmit((
struct dtls_context_t *)dtls_context, &next);
399 session_t *dtls_session = (session_t *)session->
tls;
403 coap_event_dtls = -1;
405 memcpy (&data_rw, &data,
sizeof(data_rw));
406 err = dtls_handle_message(
408 dtls_session, data_rw, (
int)data_len);
414 if (coap_event_dtls >= 0) {
430 session_t dtls_session;
431 struct dtls_context_t *dtls_context =
435 dtls_session_init(&dtls_session);
436 put_session_addr(&session->
remote_addr, &dtls_session);
437 dtls_session.ifindex = session->
ifindex;
439 memcpy (&data_rw, &data,
sizeof(data_rw));
440 int res = dtls_handle_message(dtls_context, &dtls_session,
441 data_rw, (
int)data_len);
443 if (dtls_get_peer(dtls_context, &dtls_session))
457 #define UNUSED __attribute__((unused)) 469 const char *vers = dtls_package_version();
473 long int p1, p2 = 0, p3 = 0;
476 p1 = strtol(vers, &endptr, 10);
477 if (*endptr ==
'.') {
478 p2 = strtol(endptr+1, &endptr, 10);
479 if (*endptr ==
'.') {
480 p3 = strtol(endptr+1, &endptr, 10);
483 version.
version = (p1 << 16) | (p2 << 8) | p3;
500 const char *ca_file UNUSED,
501 const char *ca_path UNUSED
508 const char *hint UNUSED,
533 size_t data_len UNUSED
540 size_t data_len UNUSED
553 #pragma GCC diagnostic ignored "-Wunused-function" void coap_dtls_set_log_level(int level)
Sets the log level to the specified value.
int coap_dtls_hello(coap_session_t *session UNUSED, const uint8_t *data UNUSED, size_t data_len UNUSED)
void coap_tls_free_session(coap_session_t *coap_session UNUSED)
struct coap_context_t * context
session's context
void * tls
security parameters
int coap_dtls_receive(coap_session_t *session UNUSED, const uint8_t *data UNUSED, size_t data_len UNUSED)
multi-purpose address abstraction
int coap_dtls_context_check_keys_enabled(coap_context_t *ctx UNUSED)
#define COAP_EVENT_DTLS_RENEGOTIATE
ssize_t coap_tls_read(coap_session_t *session UNUSED, uint8_t *data UNUSED, size_t data_len UNUSED)
int coap_dtls_get_log_level(void)
Returns the current log level.
void * coap_dtls_new_client_session(coap_session_t *session UNUSED)
int coap_dtls_is_supported(void)
Check whether DTLS is available.
int coap_dtls_context_set_pki(coap_context_t *ctx UNUSED, coap_dtls_pki_t *setup_data UNUSED, coap_dtls_role_t role UNUSED)
void * coap_tls_new_server_session(coap_session_t *session UNUSED, int *connected UNUSED)
ssize_t coap_tls_write(coap_session_t *session UNUSED, const uint8_t *data UNUSED, size_t data_len UNUSED)
ssize_t coap_session_send(coap_session_t *session, const uint8_t *data, size_t datalen)
Function interface for datagram data transmission.
coap_session_t * coap_session_get_by_peer(coap_context_t *ctx, const coap_address_t *remote_addr, int ifindex)
uint64_t version
(D)TLS runtime Library Version
size_t(* get_client_psk)(const coap_session_t *session, const uint8_t *hint, size_t hint_len, uint8_t *identity, size_t *identity_len, size_t max_identity_len, uint8_t *psk, size_t max_psk_len)
void coap_dtls_free_session(coap_dtls_session_t *session UNUSED)
void * coap_tls_new_client_session(coap_session_t *session UNUSED, int *connected UNUSED)
int coap_tls_is_supported(void)
Check whether TLS is available.
#define COAP_TICKS_PER_SECOND
Use ms resolution on POSIX systems.
struct coap_dtls_session_t * coap_dtls_new_session(const coap_endpoint_t *local_interface UNUSED, const coap_address_t *remote UNUSED)
coap_tls_version_t * coap_get_tls_library_version(void)
Determine the type and version of the underlying (D)TLS library.
coap_address_t remote_addr
remote address and port
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
unsigned int coap_dtls_get_overhead(coap_session_t *session UNUSED)
#define COAP_TLS_LIBRARY_TINYDTLS
Using TinyDTLS library.
Representation of network addresses.
void coap_ticks(coap_tick_t *t)
Sets t to the internal time with COAP_TICKS_PER_SECOND resolution.
The structure used for returning the underlying (D)TLS library information.
#define COAP_EVENT_DTLS_CLOSED
(D)TLS events for COAP_PROTO_DTLS and COAP_PROTO_TLS
int coap_handle_dgram(coap_context_t *ctx, coap_session_t *session, uint8_t *msg, size_t msg_len)
Parses and interprets a CoAP datagram with context ctx.
int coap_dtls_context_set_psk(coap_context_t *ctx UNUSED, const char *hint UNUSED, coap_dtls_role_t role UNUSED)
int ifindex
interface index
size_t(* get_server_hint)(const coap_session_t *session, uint8_t *hint, size_t max_hint_len)
#define COAP_EVENT_DTLS_ERROR
#define COAP_EVENT_DTLS_CONNECTED
int coap_handle_event(coap_context_t *context, coap_event_t event, coap_session_t *session)
Invokes the event handler of context for the given event and data.
static ssize_t dtls_send_to_peer(gnutls_transport_ptr_t context, const void *send_buffer, size_t send_buffer_length)
void * coap_dtls_new_server_session(coap_session_t *session UNUSED)
void coap_session_connected(coap_session_t *session)
Notify session that it has just connected or reconnected.
void coap_dtls_free_context(struct coap_dtls_context_t *dtls_context)
The structure used for defining the PKI setup data to be used.
int coap_dtls_context_set_pki_root_cas(struct coap_context_t *ctx UNUSED, const char *ca_file UNUSED, const char *ca_path UNUSED)
struct coap_dtls_context_t * coap_dtls_new_context(struct coap_context_t *coap_context UNUSED)
coap_tick_t coap_dtls_get_timeout(coap_session_t *session UNUSED)
size_t(* get_server_psk)(const coap_session_t *session, const uint8_t *identity, size_t identity_len, uint8_t *psk, size_t max_psk_len)
void * coap_malloc_type(coap_memory_tag_t type, size_t size)
Allocates a chunk of size bytes and returns a pointer to the newly allocated memory.
void coap_dtls_handle_timeout(coap_session_t *session UNUSED)
void coap_dtls_startup(void)
Initialize the underlying (D)TLS Library layer.
int coap_dtls_send(struct coap_context_t *coap_context UNUSED, struct coap_dtls_session_t *session UNUSED, const unsigned char *data UNUSED, size_t data_len UNUSED)
void coap_session_disconnected(coap_session_t *session, coap_nack_reason_t reason)
Notify session that it has failed.
#define coap_log(level,...)
Logging function.
union coap_address_t::@0 addr
socklen_t size
size of addr
void coap_free_type(coap_memory_tag_t type, void *p)
Releases the memory that was allocated by coap_malloc_type().
coap_tick_t coap_dtls_get_context_timeout(void *dtls_context UNUSED)
uint64_t built_version
(D)TLS Built against Library Version
void coap_dtls_session_update_mtu(coap_session_t *session UNUSED)
The CoAP stack's global state is stored in a coap_context_t object.
int coap_dtls_is_context_timeout(void)
Check if timeout is handled per CoAP session or per CoAP context.