188 lines
5.7 KiB
C
188 lines
5.7 KiB
C
/*
|
|
* Copyright (c) 2017, RISE SICS AB.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the copyright holder nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/**
|
|
* \file
|
|
* DTLS support for CoAP
|
|
* \author
|
|
* Niclas Finne <nfi@sics.se>
|
|
* Joakim Eriksson <joakime@sics.se>
|
|
*/
|
|
|
|
#include "dtls-support.h"
|
|
#include "lib/random.h"
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
|
|
/* Log configuration */
|
|
#define LOG_MODULE "dtls"
|
|
#define LOG_LEVEL LOG_LEVEL_DTLS
|
|
#include "dtls-log.h"
|
|
#include "coap-log.h"
|
|
|
|
static dtls_context_t the_dtls_context;
|
|
static dtls_cipher_context_t cipher_context;
|
|
static uint8_t lock_context = 0;
|
|
/*---------------------------------------------------------------------------*/
|
|
dtls_context_t *
|
|
dtls_context_acquire(void)
|
|
{
|
|
if(lock_context) {
|
|
return NULL;
|
|
}
|
|
lock_context = 1;
|
|
LOG_DBG("Allocated context\n");
|
|
return &the_dtls_context;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_context_release(dtls_context_t *context)
|
|
{
|
|
if(context == &the_dtls_context) {
|
|
lock_context = 0;
|
|
}
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
dtls_cipher_context_t *
|
|
dtls_cipher_context_acquire(void)
|
|
{
|
|
return &cipher_context;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_cipher_context_release(dtls_cipher_context_t *c)
|
|
{
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_ticks(dtls_tick_t *t)
|
|
{
|
|
*t = clock_time();
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
int
|
|
dtls_fill_random(uint8_t *buf, size_t len)
|
|
{
|
|
int i;
|
|
if(buf) {
|
|
for(i = 0; i < len; i++) {
|
|
buf[i] = random_rand() & 0xff;
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* message retransmission */
|
|
/*---------------------------------------------------------------------------*/
|
|
static void
|
|
dtls_retransmit_callback(void *ptr)
|
|
{
|
|
dtls_context_t *ctx;
|
|
clock_time_t now;
|
|
clock_time_t next;
|
|
|
|
ctx = ptr;
|
|
now = clock_time();
|
|
/* Just one retransmission per timer scheduling */
|
|
dtls_check_retransmit(ctx, &next, 0);
|
|
|
|
/* need to set timer to some value even if no nextpdu is available */
|
|
if(next != 0) {
|
|
ctimer_set(&ctx->support.retransmit_timer,
|
|
next <= now ? 1 : next - now,
|
|
dtls_retransmit_callback, ctx);
|
|
}
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_set_retransmit_timer(dtls_context_t *ctx, unsigned int timeout)
|
|
{
|
|
ctimer_set(&ctx->support.retransmit_timer, timeout,
|
|
dtls_retransmit_callback, ctx);
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_session_init(session_t *sess)
|
|
{
|
|
memset(sess, 0, sizeof(session_t));
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
int
|
|
dtls_session_equals(const session_t *a, const session_t *b)
|
|
{
|
|
coap_endpoint_t *e1 = (coap_endpoint_t *)a;
|
|
coap_endpoint_t *e2 = (coap_endpoint_t *)b;
|
|
|
|
if(LOG_DBG_ENABLED) {
|
|
LOG_DBG(" **** EP:");
|
|
LOG_DBG_COAP_EP(e1);
|
|
LOG_DBG_(" =?= ");
|
|
LOG_DBG_COAP_EP(e2);
|
|
LOG_DBG_(" => %d\n", coap_endpoint_cmp(e1, e2));
|
|
}
|
|
|
|
return coap_endpoint_cmp(e1, e2);
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void *
|
|
dtls_session_get_address(const session_t *a)
|
|
{
|
|
/* improve this to only contain the addressing info */
|
|
return (void *)a;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
int dtls_session_get_address_size(const session_t *a)
|
|
{
|
|
/* improve this to only contain the addressing info */
|
|
return sizeof(session_t);
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_session_print(const session_t *a)
|
|
{
|
|
coap_endpoint_print((const coap_endpoint_t *)a);
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_session_log(const session_t *a)
|
|
{
|
|
coap_endpoint_log((const coap_endpoint_t *)a);
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
dtls_support_init(void)
|
|
{
|
|
LOG_INFO("init\n");
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|