20#ifdef HAVE_LIBTINYDTLS
23#undef PACKAGE_BUGREPORT
30#include <tinydtls/tinydtls.h>
31#include <tinydtls/dtls.h>
32#include <tinydtls/dtls_debug.h>
34typedef struct coap_tiny_context_t {
35 struct dtls_context_t *dtls_context;
44static dtls_tick_t dtls_tick_0 = 0;
54 dtls_ticks(&dtls_tick_0);
67 const coap_tiny_context_t *t_context =
70 return t_context->dtls_context;
77 dtls_set_log_level(level);
82 return dtls_get_log_level();
85static void get_session_addr(
const session_t *s,
coap_address_t *a) {
90 if (s->addr.sa.sa_family == AF_INET6) {
93 }
else if (s->addr.sa.sa_family == AF_INET) {
97 a->
size = (socklen_t)s->size;
103static void put_session_addr(
const coap_address_t *a, session_t *s) {
105 s->size = (
unsigned char)
sizeof(s->addr);
109 if (a->
addr.
sa.sa_family == AF_INET6) {
110 s->
size = (socklen_t)
sizeof(s->addr.sin6);
112 }
else if (a->
addr.
sa.sa_family == AF_INET) {
113 s->size = (socklen_t)
sizeof(s->addr.sin);
116 s->size = (socklen_t)a->
size;
123dtls_send_to_peer(
struct dtls_context_t *dtls_context,
124 session_t *dtls_session, uint8 *data,
size_t len) {
125 coap_tiny_context_t *t_context =
126 (coap_tiny_context_t *)dtls_get_app_data(dtls_context);
127 coap_context_t *coap_context = t_context ? t_context->coap_context : NULL;
131 assert(coap_context);
132 get_session_addr(dtls_session, &remote_addr);
142dtls_application_data(
struct dtls_context_t *dtls_context,
143 session_t *dtls_session, uint8 *data,
size_t len) {
144 coap_tiny_context_t *t_context =
145 (coap_tiny_context_t *)dtls_get_app_data(dtls_context);
146 coap_context_t *coap_context = t_context ? t_context->coap_context : NULL;
150 assert(coap_context);
151 get_session_addr(dtls_session, &remote_addr);
155 "dropped message that was received on invalid interface\n");
162static int coap_event_dtls = 0;
165dtls_event(
struct dtls_context_t *dtls_context,
166 session_t *dtls_session,
167 dtls_alert_level_t level,
172 if (level == DTLS_ALERT_LEVEL_FATAL)
177 case DTLS_ALERT_CLOSE_NOTIFY:
182 case DTLS_EVENT_CONNECTED:
187 case DTLS_EVENT_RENEGOTIATE:
203get_psk_info(
struct dtls_context_t *dtls_context,
204 const session_t *dtls_session,
205 dtls_credentials_type_t type,
206 const uint8_t *
id,
size_t id_len,
207 unsigned char *result,
size_t result_length) {
209 coap_tiny_context_t *t_context =
210 (coap_tiny_context_t *)dtls_get_app_data(dtls_context);
211 coap_context_t *coap_context = t_context ? t_context->coap_context : NULL;
213 int fatal_error = DTLS_ALERT_INTERNAL_ERROR;
215#if COAP_CLIENT_SUPPORT
221#if COAP_SERVER_SUPPORT
226 assert(coap_context);
227 get_session_addr(dtls_session, &remote_addr);
235 case DTLS_PSK_IDENTITY:
237#if COAP_CLIENT_SUPPORT
249 id ? (
const char*)
id :
"");
261 psk_identity = &cpsk_info->
identity;
272 if (psk_identity == NULL) {
274 fatal_error = DTLS_ALERT_CLOSE_NOTIFY;
277 if (psk_identity->
length > result_length) {
279 "psk_identity too large, truncated to %zd bytes\n",
284 result_length = psk_identity->
length;
286 memcpy(result, psk_identity->
s, result_length);
287 return result_length;
293#if COAP_CLIENT_SUPPORT
296 if (psk_key == NULL) {
298 fatal_error = DTLS_ALERT_CLOSE_NOTIFY;
301 if (psk_key->
length > result_length) {
303 "psk_key too large, truncated to %zd bytes\n",
308 result_length = psk_key->
length;
310 memcpy(result, psk_key->
s, result_length);
311 return result_length;
314#if COAP_SERVER_SUPPORT
318 lidentity.
length =
id ? id_len : 0;
319 lidentity.
s =
id ? (
const uint8_t*)
id : (
const uint8_t *)
"";
326 (
int)lidentity.
length, lidentity.
s);
338 if (psk_key == NULL) {
344 if (psk_key->
length > result_length) {
346 "psk_key too large, truncated to %zd bytes\n",
351 result_length = psk_key->
length;
353 memcpy(result, psk_key->
s, result_length);
354 return result_length;
360#if COAP_SERVER_SUPPORT
362 if (psk_hint == NULL)
364 if (psk_hint->
length > result_length) {
366 "psk_hint too large, truncated to %zd bytes\n",
371 result_length = psk_hint->
length;
373 memcpy(result, psk_hint->
s, result_length);
374 return result_length;
384 return dtls_alert_fatal_create(fatal_error);
389get_ecdsa_key(
struct dtls_context_t *dtls_context,
391 const dtls_ecdsa_key_t **result) {
392 static dtls_ecdsa_key_t ecdsa_key;
393 coap_tiny_context_t *t_context =
394 (coap_tiny_context_t *)dtls_get_app_data(dtls_context);
396 ecdsa_key.curve = DTLS_ECDH_CURVE_SECP256R1;
397 ecdsa_key.priv_key = t_context->priv_key->s;
398 ecdsa_key.pub_key_x = t_context->pub_key->s;
399 ecdsa_key.pub_key_y = &t_context->pub_key->s[DTLS_EC_KEY_SIZE];
401 *result = &ecdsa_key;
406static const unsigned char cert_asn1_header[] = {
410 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01,
412 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07,
416#define DTLS_CE_LENGTH (sizeof(cert_asn1_header) + key_size + key_size)
419verify_ecdsa_key(
struct dtls_context_t *dtls_context
COAP_UNUSED,
421 const uint8_t *other_pub_x,
422 const uint8_t *other_pub_y,
424 coap_tiny_context_t *t_context =
425 (coap_tiny_context_t *)dtls_get_app_data(dtls_context);
426 if (t_context && t_context->setup_data.validate_cn_call_back) {
429 uint8 buf[DTLS_CE_LENGTH];
438 memcpy(p, &cert_asn1_header,
sizeof(cert_asn1_header));
439 p +=
sizeof(cert_asn1_header);
441 memcpy(p, other_pub_x, key_size);
444 memcpy(p, other_pub_y, key_size);
447 assert(p <= (buf +
sizeof(buf)));
449 get_session_addr(dtls_session, &remote_addr);
451 &remote_addr, dtls_session->ifindex);
455 buf, p-buf, c_session, 0, 1, t_context->setup_data.cn_call_back_arg)) {
461static dtls_handler_t ec_cb = {
462 .write = dtls_send_to_peer,
463 .read = dtls_application_data,
465 .get_psk_info = NULL,
466 .get_ecdsa_key = get_ecdsa_key,
467 .verify_ecdsa_key = verify_ecdsa_key
471static dtls_handler_t psk_cb = {
472 .write = dtls_send_to_peer,
473 .read = dtls_application_data,
475 .get_psk_info = get_psk_info,
477 .get_ecdsa_key = NULL,
478 .verify_ecdsa_key = NULL
484 coap_tiny_context_t *t_context =
coap_malloc(
sizeof(coap_tiny_context_t));
485 struct dtls_context_t *dtls_context = t_context ? dtls_new_context(t_context) : NULL;
488 memset(t_context, 0,
sizeof(coap_tiny_context_t));
489 t_context->coap_context = coap_context;
491 dtls_set_handler(dtls_context, &psk_cb);
504 coap_tiny_context_t *t_context = (coap_tiny_context_t *)handle;
506 if (t_context->priv_key) {
508 t_context->priv_key = NULL;
510 if (t_context->pub_key) {
512 t_context->pub_key = NULL;
515 if (t_context->dtls_context)
516 dtls_free_context(t_context->dtls_context);
523 session_t *dtls_session =
coap_malloc_type(COAP_DTLS_SESSION,
sizeof(session_t));
528 dtls_session_init(dtls_session);
530 dtls_session->ifindex = session->
ifindex;
537#if COAP_SERVER_SUPPORT
539 return coap_dtls_new_session(session);
543#if COAP_CLIENT_SUPPORT
547 dtls_context_t *dtls_context = t_context ? t_context->dtls_context : NULL;
548 session_t *dtls_session = dtls_context ? coap_dtls_new_session(session) : NULL;
553 dtls_get_peer(dtls_context, dtls_session);
559 if (dtls_connect(dtls_context, dtls_session) >= 0) {
561 dtls_get_peer(dtls_context, dtls_session);
582 coap_tiny_context_t *t_context =
584 dtls_context_t *dtls_context = t_context ? t_context->dtls_context : NULL;
586 if (dtls_context == NULL)
588 if (coap_session->
tls && dtls_context) {
589 dtls_peer_t *peer = dtls_get_peer(dtls_context, (session_t *)coap_session->
tls);
591 dtls_reset_peer(dtls_context, peer);
593 dtls_close(dtls_context, (session_t *)coap_session->
tls);
596 coap_session->
tls = NULL;
609 dtls_context_t *dtls_context = t_context ? t_context->dtls_context : NULL;
611 assert(dtls_context);
614 coap_event_dtls = -1;
616 memcpy (&data_rw, &data,
sizeof(data_rw));
617 res = dtls_write(dtls_context,
618 (session_t *)session->
tls, data_rw, data_len);
623 if (coap_event_dtls >= 0) {
641 clock_time_t next = 0;
642 coap_tiny_context_t *t_context = (coap_tiny_context_t *)tiny_context;
643 dtls_context_t *dtls_context = t_context ? t_context->dtls_context : NULL;
645 dtls_check_retransmit(dtls_context, &next);
672 session_t *dtls_session = (session_t *)session->
tls;
676 dtls_context_t *dtls_context = t_context ? t_context->dtls_context : NULL;
678 assert(dtls_context);
679 coap_event_dtls = -1;
681 memcpy (&data_rw, &data,
sizeof(data_rw));
682 err = dtls_handle_message(dtls_context, dtls_session, data_rw, (
int)data_len);
688 if (coap_event_dtls >= 0) {
701#if COAP_SERVER_SUPPORT
707 session_t dtls_session;
709 dtls_context_t *dtls_context = t_context ? t_context->dtls_context : NULL;
712 assert(dtls_context);
713 dtls_session_init(&dtls_session);
715 dtls_session.ifindex = session->
ifindex;
717 memcpy (&data_rw, &data,
sizeof(data_rw));
718 int res = dtls_handle_message(dtls_context, &dtls_session,
719 data_rw, (
int)data_len);
721 if (dtls_get_peer(dtls_context, &dtls_session))
742 const char *vers = dtls_package_version();
746 long int p1, p2 = 0, p3 = 0;
749 p1 = strtol(vers, &endptr, 10);
750 if (*endptr ==
'.') {
751 p2 = strtol(endptr+1, &endptr, 10);
752 if (*endptr ==
'.') {
753 p3 = strtol(endptr+1, &endptr, 10);
756 version.
version = (p1 << 16) | (p2 << 8) | p3;
764static const uint8_t b64_6[256] =
766 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
767 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
769 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
771 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
773 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
775 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
777 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
779 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
780 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
781 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
782 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
783 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
784 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
785 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
786 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
787 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
792pem_base64_decode (
const uint8_t *data,
size_t size)
795 size_t nbytesdecoded;
800 size_t nb64bytes = 0;
802 for (i = 0; i < size; i++) {
810 if (b64_6[data[i]] == 64)
812 tbuf[nb64bytes++] = data[i];
818 nbytesdecoded = ((nb64bytes + 3) / 4) * 3;
826 while (nb64bytes > 4) {
827 *(out++) = b64_6[ptr[0]] << 2 | b64_6[ptr[1]] >> 4;
828 *(out++) = b64_6[ptr[1]] << 4 | b64_6[ptr[2]] >> 2;
829 *(out++) = b64_6[ptr[2]] << 6 | b64_6[ptr[3]];
836 *(out++) = b64_6[ptr[0]] << 2 | b64_6[ptr[1]] >> 4;
839 *(out++) = b64_6[ptr[1]] << 4 | b64_6[ptr[2]] >> 2;
842 *(out++) = b64_6[ptr[2]] << 6 | b64_6[ptr[3]];
845 decoded->
length = nbytesdecoded - ((4 - nb64bytes) & 3);
850typedef coap_binary_t * (*asn1_callback)(
const uint8_t *data,
size_t size);
853asn1_verify_privkey(
const uint8_t *data,
size_t size)
857 if (size - 1 == DTLS_EC_KEY_SIZE && *data ==
'\000') {
863 if (size != DTLS_EC_KEY_SIZE)
870asn1_verify_pubkey(
const uint8_t *data,
size_t size)
876 if (size - 2 != 2 * DTLS_EC_KEY_SIZE)
883asn1_verify_curve(
const uint8_t *data,
size_t size)
885 static uint8_t prime256v1_oid[] =
887 { 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07 };
890 if (size !=
sizeof(prime256v1_oid) ||
891 memcmp(data, prime256v1_oid, size) != 0)
898asn1_verify_pkcs8_version(
const uint8_t *data,
size_t size)
901 if (size != 1 || *data != 0)
908asn1_verify_ec_identifier(
const uint8_t *data,
size_t size)
910 static uint8_t ec_public_key_oid[] =
912 { 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01 };
915 if (size !=
sizeof(ec_public_key_oid) ||
916 memcmp(data, ec_public_key_oid, size) != 0)
923asn1_verify_ec_key(
const uint8_t *data,
size_t size)
934asn1_derive_keys(coap_tiny_context_t *t_context,
935 const uint8_t *priv_data,
size_t priv_len,
936 const uint8_t *pub_data,
size_t pub_len,
942 priv_len, asn1_verify_privkey);
943 if (!t_context->priv_key) {
948 if (t_context->priv_key->length - 1 == DTLS_EC_KEY_SIZE &&
949 t_context->priv_key->s[0] ==
'\000') {
950 t_context->priv_key->length--;
951 t_context->priv_key->s++;
961 t_context->priv_key = NULL;
969 if (!t_context->pub_key) {
972 t_context->priv_key = NULL;
976 t_context->pub_key->s += 2;
977 t_context->pub_key->length -= 2;
978 dtls_set_handler(t_context->dtls_context, &ec_cb);
983ec_abstract_pkcs8_asn1(
const uint8_t *asn1_ptr,
size_t asn1_length)
988 asn1_verify_pkcs8_version);
995 asn1_verify_ec_identifier);
1009 asn1_verify_ec_key);
1014pem_decode_mem_asn1(
const char *begstr,
const uint8_t *str)
1016 char *bcp = str ? strstr((
const char*)str, begstr) : NULL;
1017 char *tcp = bcp ? strstr(bcp,
"-----END ") : NULL;
1020 bcp += strlen(begstr);
1021 return pem_base64_decode ((
const uint8_t *)bcp, tcp - bcp);
1034 coap_tiny_context_t *t_context;
1053 if (t_context->priv_key) {
1055 t_context->priv_key = NULL;
1057 if (t_context->pub_key) {
1059 t_context->pub_key = NULL;
1061 t_context->setup_data = *setup_data;
1074 asn1_priv = pem_decode_mem_asn1(
"-----BEGIN EC PRIVATE KEY-----",
1077 asn1_priv = pem_decode_mem_asn1(
"-----BEGIN PRIVATE KEY-----",
1083 asn1_temp = ec_abstract_pkcs8_asn1(asn1_priv->
s, asn1_priv->
length);
1090 asn1_priv = asn1_temp;
1093 asn1_pub = pem_decode_mem_asn1(
1094 "-----BEGIN PUBLIC KEY-----",
1097 asn1_pub = pem_decode_mem_asn1(
"-----BEGIN EC PRIVATE KEY-----",
1100 asn1_pub = pem_decode_mem_asn1(
"-----BEGIN PRIVATE KEY-----",
1107 asn1_temp = ec_abstract_pkcs8_asn1(asn1_pub->
s, asn1_pub->
length);
1115 asn1_pub = asn1_temp;
1119 if (!asn1_derive_keys(t_context, asn1_priv->
s, asn1_priv->
length,
1120 asn1_pub->
s, asn1_pub->
length, is_pkcs8)) {
1139 asn1_temp = ec_abstract_pkcs8_asn1(
1143 private_key = asn1_temp->
s;
1144 private_key_len = asn1_temp->
length;
1150 if (!asn1_derive_keys(t_context,
1162 if (!asn1_derive_keys(t_context,
1198#if COAP_CLIENT_SUPPORT
1210#if COAP_SERVER_SUPPORT
1220 "CoAP Server with TinyDTLS does not support SNI selection\n");
1233#if !COAP_DISABLE_TCP
1234#if COAP_CLIENT_SUPPORT
1240#if COAP_SERVER_SUPPORT
1264#if COAP_SERVER_SUPPORT
1267 dtls_sha256_ctx *digest_ctx =
coap_malloc(
sizeof(dtls_sha256_ctx));
1270 dtls_sha256_init(digest_ctx);
1283 const uint8_t *data,
1285 dtls_sha256_update(digest_ctx, data, data_len);
1293 dtls_sha256_final((uint8_t*)digest_buffer, digest_ctx);
1306#pragma GCC diagnostic ignored "-Wunused-function"
Pulls together all the internal only header files.
int coap_dtls_context_set_pki(coap_context_t *ctx COAP_UNUSED, const coap_dtls_pki_t *setup_data COAP_UNUSED, const coap_dtls_role_t role COAP_UNUSED)
coap_tick_t coap_dtls_get_timeout(coap_session_t *session COAP_UNUSED, coap_tick_t now COAP_UNUSED)
int coap_dtls_send(coap_session_t *session COAP_UNUSED, const uint8_t *data COAP_UNUSED, size_t data_len COAP_UNUSED)
ssize_t coap_tls_read(coap_session_t *session COAP_UNUSED, uint8_t *data COAP_UNUSED, size_t data_len COAP_UNUSED)
coap_tick_t coap_dtls_get_context_timeout(void *dtls_context COAP_UNUSED)
int coap_dtls_receive(coap_session_t *session COAP_UNUSED, const uint8_t *data COAP_UNUSED, size_t data_len COAP_UNUSED)
void * coap_dtls_get_tls(const coap_session_t *c_session COAP_UNUSED, coap_tls_library_t *tls_lib)
unsigned int coap_dtls_get_overhead(coap_session_t *session COAP_UNUSED)
int coap_dtls_context_check_keys_enabled(coap_context_t *ctx COAP_UNUSED)
ssize_t coap_tls_write(coap_session_t *session COAP_UNUSED, const uint8_t *data COAP_UNUSED, size_t data_len COAP_UNUSED)
void coap_dtls_session_update_mtu(coap_session_t *session COAP_UNUSED)
int coap_dtls_context_set_pki_root_cas(coap_context_t *ctx COAP_UNUSED, const char *ca_file COAP_UNUSED, const char *ca_path COAP_UNUSED)
int coap_dtls_handle_timeout(coap_session_t *session COAP_UNUSED)
void coap_dtls_free_context(void *handle COAP_UNUSED)
void coap_dtls_free_session(coap_session_t *coap_session COAP_UNUSED)
void * coap_dtls_new_context(coap_context_t *coap_context COAP_UNUSED)
void coap_tls_free_session(coap_session_t *coap_session COAP_UNUSED)
coap_session_t * coap_session_get_by_peer(const coap_context_t *ctx, const coap_address_t *remote_addr, int ifindex)
coap_binary_t * get_asn1_tag(coap_asn1_tag_t ltag, const uint8_t *ptr, size_t tlen, asn1_validate validate)
Get the asn1 tag and data from the current ptr.
void coap_digest_free(coap_digest_ctx_t *digest_ctx)
Free off coap_digest_ctx_t.
int coap_digest_final(coap_digest_ctx_t *digest_ctx, coap_digest_t *digest_buffer)
Finalize the coap_digest information into the provided digest_buffer.
int coap_digest_update(coap_digest_ctx_t *digest_ctx, const uint8_t *data, size_t data_len)
Update the coap_digest information with the next chunk of data.
coap_digest_ctx_t * coap_digest_setup(void)
Initialize a coap_digest.
void coap_ticks(coap_tick_t *t)
Sets t to the internal time with COAP_TICKS_PER_SECOND resolution.
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
#define COAP_TICKS_PER_SECOND
Use ms resolution on POSIX systems.
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_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.
const coap_bin_const_t * coap_get_session_client_psk_identity(const coap_session_t *session)
Get the current client's PSK identity.
void coap_dtls_startup(void)
Initialize the underlying (D)TLS Library layer.
void * coap_dtls_new_client_session(coap_session_t *coap_session)
Create a new client-side session.
void * coap_tls_new_client_session(coap_session_t *coap_session, int *connected)
Create a new TLS client-side session.
void * coap_tls_new_server_session(coap_session_t *coap_session, int *connected)
Create a TLS new server-side session.
void * coap_dtls_new_server_session(coap_session_t *coap_session)
Create a new DTLS server-side session.
int coap_dtls_hello(coap_session_t *coap_session, const uint8_t *data, size_t data_len)
Handling client HELLO messages from a new candiate peer.
int coap_dtls_is_context_timeout(void)
Check if timeout is handled per CoAP session or per CoAP context.
int coap_dtls_context_set_cpsk(coap_context_t *coap_context, coap_dtls_cpsk_t *setup_data)
Set the DTLS context's default client PSK information.
int coap_dtls_context_set_spsk(coap_context_t *coap_context, coap_dtls_spsk_t *setup_data)
Set the DTLS context's default server PSK information.
void coap_dtls_shutdown(void)
Close down the underlying (D)TLS Library layer.
const coap_bin_const_t * coap_get_session_client_psk_key(const coap_session_t *coap_session)
Get the current client's PSK key.
const coap_bin_const_t * coap_get_session_server_psk_key(const coap_session_t *coap_session)
Get the current server's PSK key.
const coap_bin_const_t * coap_get_session_server_psk_hint(const coap_session_t *coap_session)
Get the current server's PSK identity hint.
coap_tls_version_t * coap_get_tls_library_version(void)
Determine the type and version of the underlying (D)TLS library.
int coap_tls_is_supported(void)
Check whether TLS is available.
#define COAP_DTLS_PKI_SETUP_VERSION
Latest PKI setup version.
#define COAP_DTLS_RPK_CERT_CN
int coap_dtls_is_supported(void)
Check whether DTLS is available.
@ COAP_PKI_KEY_PKCS11
The PKI key type is PKCS11 (DER)
@ COAP_PKI_KEY_PEM_BUF
The PKI key type is PEM buffer.
@ COAP_PKI_KEY_PEM
The PKI key type is PEM file.
@ COAP_PKI_KEY_ASN1
The PKI key type is ASN.1 (DER) buffer.
@ COAP_ASN1_PKEY_EC
EC type.
@ COAP_TLS_LIBRARY_TINYDTLS
Using TinyDTLS library.
@ COAP_EVENT_DTLS_CLOSED
Triggerred when (D)TLS session closed.
@ COAP_EVENT_DTLS_CONNECTED
Triggered when (D)TLS session connected.
@ COAP_EVENT_DTLS_RENEGOTIATE
Triggered when (D)TLS session renegotiated.
@ COAP_EVENT_DTLS_ERROR
Triggered when (D)TLS error occurs.
void coap_dtls_set_log_level(int level)
Sets the (D)TLS logging level to the specified level.
int coap_dtls_get_log_level(void)
Get the current (D)TLS logging.
#define coap_log(level,...)
Logging function.
int coap_session_refresh_psk_hint(coap_session_t *session, const coap_bin_const_t *psk_hint)
Refresh the session's current Identity Hint (PSK).
ssize_t coap_session_send(coap_session_t *session, const uint8_t *data, size_t datalen)
Function interface for datagram data transmission.
int coap_session_refresh_psk_key(coap_session_t *session, const coap_bin_const_t *psk_key)
Refresh the session's current pre-shared key (PSK).
void coap_session_connected(coap_session_t *session)
Notify session that it has just connected or reconnected.
int coap_session_refresh_psk_identity(coap_session_t *session, const coap_bin_const_t *psk_identity)
Refresh the session's current pre-shared identity (PSK).
void coap_session_disconnected(coap_session_t *session, coap_nack_reason_t reason)
Notify session that it has failed.
@ COAP_SESSION_TYPE_CLIENT
client-side
coap_binary_t * coap_new_binary(size_t size)
Returns a new binary object with at least size bytes storage allocated.
void coap_delete_binary(coap_binary_t *s)
Deletes the given coap_binary_t object and releases any memory allocated.
COAP_STATIC_INLINE void coap_free(void *object)
Wrapper function to coap_free_type() for backwards compatibility.
COAP_STATIC_INLINE void * coap_malloc(size_t size)
Wrapper function to coap_malloc_type() for backwards compatibility.
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_free_type(coap_memory_tag_t type, void *p)
Releases the memory that was allocated by coap_malloc_type().
coap_address_t remote
remote address and port
multi-purpose address abstraction
socklen_t size
size of addr
union coap_address_t::@0 addr
CoAP binary data definition with const data.
size_t length
length of binary data
const uint8_t * s
read-only binary data
CoAP binary data definition.
size_t length
length of binary data
The CoAP stack's global state is stored in a coap_context_t object.
coap_dtls_spsk_t spsk_setup_data
Contains the initial PSK server setup data.
The structure that holds the Client PSK information.
coap_bin_const_t identity
The structure used for defining the Client PSK setup data to be used.
void * ih_call_back_arg
Passed in to the Identity Hint callback function.
coap_dtls_ih_callback_t validate_ih_call_back
Identity Hint check callback function.
union coap_dtls_key_t::@2 key
coap_pki_key_pem_buf_t pem_buf
for PEM memory keys
coap_pki_key_t key_type
key format type
coap_pki_key_asn1_t asn1
for ASN.1 (DER) memory keys
The structure used for defining the PKI setup data to be used.
uint8_t is_rpk_not_cert
1 is RPK instead of Public Certificate.
coap_dtls_key_t pki_key
PKI key definition.
The structure used for defining the Server PSK setup data to be used.
coap_dtls_psk_sni_callback_t validate_sni_call_back
SNI check callback function.
coap_dtls_id_callback_t validate_id_call_back
Identity check callback function.
void * id_call_back_arg
Passed in to the Identity callback function.
const uint8_t * private_key
ASN1 (DER) Private Key.
coap_asn1_privatekey_type_t private_key_type
Private Key Type.
size_t public_cert_len
ASN1 Public Cert length.
size_t private_key_len
ASN1 Private Key length.
const uint8_t * public_cert
ASN1 (DER) Public Cert, or Public Key if RPK.
const uint8_t * private_key
PEM buffer Private Key If RPK and 'EC PRIVATE KEY' this can be used for both the public_cert and priv...
const uint8_t * public_cert
PEM buffer Public Cert, or Public Key if RPK.
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...
coap_addr_tuple_t addr_info
key: remote/local address info
coap_dtls_cpsk_t cpsk_setup_data
client provided PSK initial setup data
void * tls
security parameters
coap_session_type_t type
client or server side socket
coap_context_t * context
session's context
int ifindex
interface index
CoAP string data definition with const data.
const uint8_t * s
read-only string data
size_t length
length of string
The structure used for returning the underlying (D)TLS library information.
uint64_t built_version
(D)TLS Built against Library Version
coap_tls_library_t type
Library type.
uint64_t version
(D)TLS runtime Library Version