12 #ifdef HAVE_LIBTINYDTLS
15 #undef PACKAGE_BUGREPORT
18 #undef PACKAGE_TARNAME
20 #undef PACKAGE_VERSION
24 #include <dtls_debug.h>
26 static dtls_tick_t dtls_tick_0 = 0;
36 dtls_ticks(&dtls_tick_0);
42 dtls_set_log_level(level);
47 return dtls_get_log_level();
50 static void get_session_addr(
const session_t *s,
coap_address_t *a) {
55 if (s->addr.sa.sa_family == AF_INET6) {
58 }
else if (s->addr.sa.sa_family == AF_INET) {
62 a->
size = (socklen_t)s->size;
68 static void put_session_addr(
const coap_address_t *a, session_t *s) {
70 s->size = (
unsigned char)
sizeof(s->addr);
74 if (a->
addr.
sa.sa_family == AF_INET6) {
75 s->
size = (socklen_t)
sizeof(s->addr.sin6);
77 }
else if (a->
addr.
sa.sa_family == AF_INET) {
78 s->size = (socklen_t)
sizeof(s->addr.sin);
81 s->size = (socklen_t)a->
size;
88 dtls_send_to_peer(
struct dtls_context_t *dtls_context,
89 session_t *dtls_session, uint8 *data,
size_t len) {
94 get_session_addr(dtls_session, &remote_addr);
104 dtls_application_data(
struct dtls_context_t *dtls_context,
105 session_t *dtls_session, uint8 *data,
size_t len) {
110 get_session_addr(dtls_session, &remote_addr);
114 "dropped message that was received on invalid interface\n");
121 static int coap_event_dtls = 0;
124 dtls_event(
struct dtls_context_t *dtls_context,
125 session_t *dtls_session,
126 dtls_alert_level_t level,
131 if (level == DTLS_ALERT_LEVEL_FATAL)
136 case DTLS_ALERT_CLOSE_NOTIFY:
141 case DTLS_EVENT_CONNECTED:
146 case DTLS_EVENT_RENEGOTIATE:
162 get_psk_info(
struct dtls_context_t *dtls_context,
163 const session_t *dtls_session,
164 dtls_credentials_type_t type,
165 const uint8_t *
id,
size_t id_len,
166 unsigned char *result,
size_t result_length) {
169 int fatal_error = DTLS_ALERT_INTERNAL_ERROR;
170 size_t identity_length;
171 static int client = 0;
173 static size_t psk_len = 0;
177 if (type == DTLS_PSK_KEY && client) {
178 if (psk_len > result_length) {
182 memcpy(result, psk, psk_len);
189 get_session_addr(dtls_session, &remote_addr);
197 case DTLS_PSK_IDENTITY:
206 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));
209 fatal_error = DTLS_ALERT_CLOSE_NOTIFY;
213 return (
int)identity_length;
233 return dtls_alert_fatal_create(fatal_error);
236 static dtls_handler_t cb = {
237 .write = dtls_send_to_peer,
238 .read = dtls_application_data,
240 .get_psk_info = get_psk_info,
242 .get_ecdsa_key = NULL,
243 .verify_ecdsa_key = NULL
249 struct dtls_context_t *dtls_context = dtls_new_context(coap_context);
252 dtls_set_handler(dtls_context, &cb);
262 struct dtls_context_t *dtls_context = (
struct dtls_context_t *)handle;
263 dtls_free_context(dtls_context);
269 session_t *dtls_session =
coap_malloc_type(COAP_DTLS_SESSION,
sizeof(session_t));
274 dtls_session_init(dtls_session);
276 dtls_session->ifindex = session->
ifindex;
284 return coap_dtls_new_session(session);
289 session_t *dtls_session = coap_dtls_new_session(session);
301 dtls_session) >= 0) {
324 struct dtls_context_t *ctx;
325 if (coap_session->
context == NULL)
328 if (coap_session->
tls && ctx) {
329 dtls_peer_t *peer = dtls_get_peer(ctx, (session_t *)coap_session->
tls);
331 dtls_reset_peer(ctx, peer);
333 dtls_close(ctx, (session_t *)coap_session->
tls);
336 coap_session->
tls = NULL;
351 coap_event_dtls = -1;
353 memcpy (&data_rw, &data,
sizeof(data_rw));
355 (session_t *)session->
tls, data_rw, data_len);
360 if (coap_event_dtls >= 0) {
378 clock_time_t next = 0;
379 dtls_check_retransmit((
struct dtls_context_t *)dtls_context, &next);
401 session_t *dtls_session = (session_t *)session->
tls;
405 coap_event_dtls = -1;
407 memcpy (&data_rw, &data,
sizeof(data_rw));
408 err = dtls_handle_message(
410 dtls_session, data_rw, (
int)data_len);
416 if (coap_event_dtls >= 0) {
434 session_t dtls_session;
435 struct dtls_context_t *dtls_context =
439 dtls_session_init(&dtls_session);
441 dtls_session.ifindex = session->
ifindex;
443 memcpy (&data_rw, &data,
sizeof(data_rw));
444 int res = dtls_handle_message(dtls_context, &dtls_session,
445 data_rw, (
int)data_len);
447 if (dtls_get_peer(dtls_context, &dtls_session))
461 #define UNUSED __attribute__((unused))
473 const char *vers = dtls_package_version();
477 long int p1, p2 = 0, p3 = 0;
480 p1 = strtol(vers, &endptr, 10);
481 if (*endptr ==
'.') {
482 p2 = strtol(endptr+1, &endptr, 10);
483 if (*endptr ==
'.') {
484 p3 = strtol(endptr+1, &endptr, 10);
487 version.
version = (p1 << 16) | (p2 << 8) | p3;
504 const char *ca_file
UNUSED,
505 const char *ca_path
UNUSED
557 #pragma GCC diagnostic ignored "-Wunused-function"