1#include <dtls.h>2#include <dtls_debug.h>3#include <string.h>4#include <unistd.h>5#include <string.h>6#include <errno.h>78#include <sys/types.h>9#include <sys/socket.h>1011#include "dat.h"12#include "fns.h"1314static int15dwrite(struct dtls_context_t *ctx, session_t *sess, uint8 *data, size_t len)16{17 struct dctx *dctx;1819 dctx = dtls_get_app_data(ctx);20 return sendto(dctx->dfd, data, len, MSG_DONTWAIT,21 &sess->addr.sa, sess->size);22}2324static int25dread(struct dtls_context_t *ctx, session_t *sess, uint8 *data, size_t len)26{27 (void)sess;28 struct dctx *dctx;2930 dctx = dtls_get_app_data(ctx);31 if (smode) {32 /* in server mode connect(3) is called on the UDP socket up33 * on creation thus we don't need to specify an address. */34 if (send(dctx->ufd, data, len, MSG_DONTWAIT) == -1)35 dtls_alert("send failed in dread: %s\n", strerror(errno));36 } else {37 /* in client mode csess should contain the address of38 * the client from which we last received a datagram. */39 if (csess.size <= 0) {40 dtls_alert("Didn't receive a datagram from a client yet, "41 "discarding received DTLS message\n");42 return 0;43 }4445 if (sendto(dctx->ufd, data, len, MSG_DONTWAIT,46 &csess.addr.sa, csess.size) == -1)47 dtls_alert("sendto failed in dread: %s\n", strerror(errno));48 }4950 /* I have no idea why this function prototype has a return value51 * `tests/dtls-client.c` returns 0 here so lets do that as well. */52 return 0;53}5455static int56dpsk(struct dtls_context_t *ctx, const session_t *sess, dtls_credentials_type_t type,57 const unsigned char *id, size_t ilen, unsigned char *res, size_t rlen)58{59 (void)sess;60 void *ptr;61 size_t len;62 struct dctx *dctx;6364 dctx = dtls_get_app_data(ctx);65 switch (type) {66 case DTLS_PSK_HINT:67 case DTLS_PSK_IDENTITY:68 ptr = dctx->id;69 len = strlen((char*)dctx->id);70 break;71 case DTLS_PSK_KEY:72 ptr = dctx->key;73 len = strlen((char*)dctx->key);7475 if (xmemcmp((void*)id, ilen, dctx->id, len)) {76 dtls_warn("Received request for unknown ID\n");77 return dtls_alert_fatal_create(DTLS_ALERT_ILLEGAL_PARAMETER);78 }79 break;80 default:81 dtls_warn("Unsupported request type: %d\n", type);82 break;83 }8485 if (len > rlen) {86 dtls_warn("Buffer to small for request type: %d\n", type);87 return dtls_alert_fatal_create(DTLS_ALERT_INTERNAL_ERROR);88 }8990 memcpy(res, ptr, len);91 return len;92}9394dtls_handler_t dtlscb = {95 .write = dwrite,96 .read = dread,97 .event = NULL,98 .get_psk_info = dpsk99};