mirror of https://github.com/ARMmbed/mbed-os.git
commit
194525f670
|
@ -64,6 +64,9 @@ typedef struct secure_session {
|
||||||
coap_security_t *sec_handler; //owned
|
coap_security_t *sec_handler; //owned
|
||||||
internal_socket_t *parent; //not owned
|
internal_socket_t *parent; //not owned
|
||||||
|
|
||||||
|
uint8_t remote_address[16];
|
||||||
|
uint16_t remote_port;
|
||||||
|
|
||||||
secure_timer_t timer;
|
secure_timer_t timer;
|
||||||
|
|
||||||
session_state_t session_state;
|
session_state_t session_state;
|
||||||
|
@ -72,7 +75,7 @@ typedef struct secure_session {
|
||||||
} secure_session_t;
|
} secure_session_t;
|
||||||
|
|
||||||
static NS_LIST_DEFINE(secure_session_list, secure_session_t, link);
|
static NS_LIST_DEFINE(secure_session_list, secure_session_t, link);
|
||||||
static int send_to_socket(int8_t socket_id, const uint8_t *address_ptr, uint16_t port, const uint8_t source_addr[static 16], const void *buf, size_t len);
|
static int send_to_socket(int8_t socket_id, void *handle, const void *buf, size_t len);
|
||||||
static int receive_from_socket(int8_t socket_id, unsigned char *buf, size_t len);
|
static int receive_from_socket(int8_t socket_id, unsigned char *buf, size_t len);
|
||||||
static void start_timer(int8_t timer_id, uint32_t int_ms, uint32_t fin_ms);
|
static void start_timer(int8_t timer_id, uint32_t int_ms, uint32_t fin_ms);
|
||||||
static int timer_status(int8_t timer_id);
|
static int timer_status(int8_t timer_id);
|
||||||
|
@ -146,8 +149,10 @@ static secure_session_t *secure_session_create(internal_socket_t *parent, const
|
||||||
timer_id++;
|
timer_id++;
|
||||||
}
|
}
|
||||||
this->timer.id = timer_id;
|
this->timer.id = timer_id;
|
||||||
|
memcpy(this->remote_address, address_ptr, 16);
|
||||||
|
this->remote_port = port;
|
||||||
|
|
||||||
this->sec_handler = coap_security_create(parent->listen_socket, this->timer.id, address_ptr, port, ECJPAKE,
|
this->sec_handler = coap_security_create(parent->listen_socket, this->timer.id, this, ECJPAKE,
|
||||||
&send_to_socket, &receive_from_socket, &start_timer, &timer_status);
|
&send_to_socket, &receive_from_socket, &start_timer, &timer_status);
|
||||||
if( !this->sec_handler ){
|
if( !this->sec_handler ){
|
||||||
ns_dyn_mem_free(this);
|
ns_dyn_mem_free(this);
|
||||||
|
@ -178,8 +183,8 @@ static secure_session_t *secure_session_find(internal_socket_t *parent, const ui
|
||||||
secure_session_t *this = NULL;
|
secure_session_t *this = NULL;
|
||||||
ns_list_foreach(secure_session_t, cur_ptr, &secure_session_list) {
|
ns_list_foreach(secure_session_t, cur_ptr, &secure_session_list) {
|
||||||
if( cur_ptr->sec_handler ){
|
if( cur_ptr->sec_handler ){
|
||||||
if (cur_ptr->parent == parent && cur_ptr->sec_handler->_remote_port == port &&
|
if (cur_ptr->parent == parent && cur_ptr->remote_port == port &&
|
||||||
memcmp(cur_ptr->sec_handler->_remote_address, address_ptr, 16) == 0) {
|
memcmp(cur_ptr->remote_address, address_ptr, 16) == 0) {
|
||||||
this = cur_ptr;
|
this = cur_ptr;
|
||||||
// hack_save_remote_address(address_ptr, port);
|
// hack_save_remote_address(address_ptr, port);
|
||||||
break;
|
break;
|
||||||
|
@ -219,7 +224,11 @@ static internal_socket_t *int_socket_create(uint16_t listen_port, bool use_ephem
|
||||||
if( !is_secure ){
|
if( !is_secure ){
|
||||||
this->listen_socket = socket_open(SOCKET_UDP, listen_port, recv_sckt_msg);
|
this->listen_socket = socket_open(SOCKET_UDP, listen_port, recv_sckt_msg);
|
||||||
}else{
|
}else{
|
||||||
|
#ifdef COAP_SECURITY_AVAILABLE
|
||||||
this->listen_socket = socket_open(SOCKET_UDP, listen_port, secure_recv_sckt_msg);
|
this->listen_socket = socket_open(SOCKET_UDP, listen_port, secure_recv_sckt_msg);
|
||||||
|
#else
|
||||||
|
tr_err("Secure CoAP unavailable - SSL library not configured, possibly due to lack of entropy source");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
// Socket create failed
|
// Socket create failed
|
||||||
if(this->listen_socket < 0){
|
if(this->listen_socket < 0){
|
||||||
|
@ -329,15 +338,16 @@ static int8_t send_to_real_socket(int8_t socket_id, const ns_address_t *address,
|
||||||
return socket_sendmsg(socket_id, &msghdr, 0);
|
return socket_sendmsg(socket_id, &msghdr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_to_socket(int8_t socket_id, const uint8_t *address_ptr, uint16_t port, const uint8_t source_addr[static 16], const void *buf, size_t len)
|
static int send_to_socket(int8_t socket_id, void *handle, const void *buf, size_t len)
|
||||||
{
|
{
|
||||||
|
secure_session_t *session = handle;
|
||||||
internal_socket_t *sock = int_socket_find_by_socket_id(socket_id);
|
internal_socket_t *sock = int_socket_find_by_socket_id(socket_id);
|
||||||
if(!sock){
|
if(!sock){
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(!sock->real_socket){
|
if(!sock->real_socket){
|
||||||
// Send to virtual socket cb
|
// Send to virtual socket cb
|
||||||
int ret = sock->parent->_send_cb(sock->listen_socket, address_ptr, port, buf, len);
|
int ret = sock->parent->_send_cb(sock->listen_socket, session->remote_address, session->remote_port, buf, len);
|
||||||
if( ret < 0 )
|
if( ret < 0 )
|
||||||
return ret;
|
return ret;
|
||||||
return len;
|
return len;
|
||||||
|
@ -353,7 +363,7 @@ static int send_to_socket(int8_t socket_id, const uint8_t *address_ptr, uint16_t
|
||||||
//For some reason socket_sendto returns 0 in success, while other socket impls return number of bytes sent!!!
|
//For some reason socket_sendto returns 0 in success, while other socket impls return number of bytes sent!!!
|
||||||
//TODO: check if address_ptr is valid and use that instead if it is
|
//TODO: check if address_ptr is valid and use that instead if it is
|
||||||
|
|
||||||
int8_t ret = send_to_real_socket(sock->listen_socket, &sock->dest_addr, source_addr, buf, len);
|
int8_t ret = send_to_real_socket(sock->listen_socket, &sock->dest_addr, session->remote_address, buf, len);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -536,8 +546,8 @@ static void secure_recv_sckt_msg(void *cb_res)
|
||||||
}
|
}
|
||||||
session->last_contact_time = coap_service_get_internal_timer_ticks();
|
session->last_contact_time = coap_service_get_internal_timer_ticks();
|
||||||
// Start handshake
|
// Start handshake
|
||||||
if (!session->sec_handler->_is_started) {
|
if (!coap_security_handler_is_started(session->sec_handler) ){
|
||||||
uint8_t *pw = (uint8_t *)ns_dyn_mem_alloc(64);
|
uint8_t *pw = ns_dyn_mem_alloc(64);
|
||||||
uint8_t pw_len;
|
uint8_t pw_len;
|
||||||
if( sock->parent->_get_password_cb && 0 == sock->parent->_get_password_cb(sock->listen_socket, src_address.address, src_address.identifier, pw, &pw_len)){
|
if( sock->parent->_get_password_cb && 0 == sock->parent->_get_password_cb(sock->listen_socket, src_address.address, src_address.identifier, pw, &pw_len)){
|
||||||
//TODO: get_password_cb should support certs and PSK also
|
//TODO: get_password_cb should support certs and PSK also
|
||||||
|
@ -560,7 +570,7 @@ static void secure_recv_sckt_msg(void *cb_res)
|
||||||
if( sock->parent->_security_done_cb ){
|
if( sock->parent->_security_done_cb ){
|
||||||
sock->parent->_security_done_cb(sock->listen_socket, src_address.address,
|
sock->parent->_security_done_cb(sock->listen_socket, src_address.address,
|
||||||
src_address.identifier,
|
src_address.identifier,
|
||||||
session->sec_handler->_keyblk.value);
|
(void *)coap_security_handler_keyblock(session->sec_handler));
|
||||||
}
|
}
|
||||||
} else if (ret < 0){
|
} else if (ret < 0){
|
||||||
// error handling
|
// error handling
|
||||||
|
@ -641,8 +651,8 @@ int coap_connection_handler_virtual_recv(coap_conn_handler_t *handler, uint8_t a
|
||||||
|
|
||||||
session->last_contact_time = coap_service_get_internal_timer_ticks();
|
session->last_contact_time = coap_service_get_internal_timer_ticks();
|
||||||
|
|
||||||
if (!session->sec_handler->_is_started) {
|
if (!coap_security_handler_is_started(session->sec_handler)) {
|
||||||
uint8_t *pw = (uint8_t *)ns_dyn_mem_alloc(64);
|
uint8_t *pw = ns_dyn_mem_alloc(64);
|
||||||
uint8_t pw_len;
|
uint8_t pw_len;
|
||||||
if (sock->parent->_get_password_cb && 0 == sock->parent->_get_password_cb(sock->listen_socket, address, port, pw, &pw_len)) {
|
if (sock->parent->_get_password_cb && 0 == sock->parent->_get_password_cb(sock->listen_socket, address, port, pw, &pw_len)) {
|
||||||
//TODO: get_password_cb should support certs and PSK also
|
//TODO: get_password_cb should support certs and PSK also
|
||||||
|
@ -665,7 +675,7 @@ int coap_connection_handler_virtual_recv(coap_conn_handler_t *handler, uint8_t a
|
||||||
if( handler->_security_done_cb ){
|
if( handler->_security_done_cb ){
|
||||||
handler->_security_done_cb(sock->listen_socket,
|
handler->_security_done_cb(sock->listen_socket,
|
||||||
address, port,
|
address, port,
|
||||||
session->sec_handler->_keyblk.value);
|
(void *)coap_security_handler_keyblock(session->sec_handler));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -807,7 +817,7 @@ int coap_connection_handler_send_data(coap_conn_handler_t *handler, const ns_add
|
||||||
memcpy( handler->socket->dest_addr.address, dest_addr->address, 16 );
|
memcpy( handler->socket->dest_addr.address, dest_addr->address, 16 );
|
||||||
handler->socket->dest_addr.identifier = dest_addr->identifier;
|
handler->socket->dest_addr.identifier = dest_addr->identifier;
|
||||||
handler->socket->dest_addr.type = dest_addr->type;
|
handler->socket->dest_addr.type = dest_addr->type;
|
||||||
uint8_t *pw = (uint8_t *)ns_dyn_mem_alloc(64);
|
uint8_t *pw = ns_dyn_mem_alloc(64);
|
||||||
if (!pw) {
|
if (!pw) {
|
||||||
//todo: free secure session?
|
//todo: free secure session?
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -6,19 +6,54 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "coap_security_handler.h"
|
||||||
|
|
||||||
|
#ifdef COAP_SECURITY_AVAILABLE
|
||||||
|
|
||||||
#include "mbedtls/sha256.h"
|
#include "mbedtls/sha256.h"
|
||||||
#include "mbedtls/error.h"
|
#include "mbedtls/error.h"
|
||||||
#include "mbedtls/platform.h"
|
#include "mbedtls/platform.h"
|
||||||
#include "mbedtls/ssl_cookie.h"
|
#include "mbedtls/ssl_cookie.h"
|
||||||
|
#include "mbedtls/entropy.h"
|
||||||
#include "mbedtls/entropy_poll.h"
|
#include "mbedtls/entropy_poll.h"
|
||||||
#include "mbedtls/ssl.h"
|
#include "mbedtls/ctr_drbg.h"
|
||||||
|
#include "mbedtls/ssl_ciphersuites.h"
|
||||||
|
|
||||||
#include "ns_trace.h"
|
#include "ns_trace.h"
|
||||||
#include "nsdynmemLIB.h"
|
#include "nsdynmemLIB.h"
|
||||||
#include "coap_connection_handler.h"
|
#include "coap_connection_handler.h"
|
||||||
#include "coap_security_handler.h"
|
|
||||||
#include "randLIB.h"
|
#include "randLIB.h"
|
||||||
#include "mbedtls/ssl_ciphersuites.h"
|
|
||||||
#include "socket_api.h"
|
struct coap_security_s {
|
||||||
|
mbedtls_ssl_config _conf;
|
||||||
|
mbedtls_ssl_context _ssl;
|
||||||
|
|
||||||
|
mbedtls_ctr_drbg_context _ctr_drbg;
|
||||||
|
mbedtls_entropy_context _entropy;
|
||||||
|
bool _is_started;
|
||||||
|
simple_cookie_t _cookie;
|
||||||
|
key_block_t _keyblk;
|
||||||
|
|
||||||
|
SecureConnectionMode _conn_mode;
|
||||||
|
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
||||||
|
mbedtls_x509_crt _cacert;
|
||||||
|
mbedtls_x509_crt _owncert;
|
||||||
|
#endif
|
||||||
|
mbedtls_pk_context _pkey;
|
||||||
|
|
||||||
|
uint8_t _pw[64];
|
||||||
|
uint8_t _pw_len;
|
||||||
|
|
||||||
|
bool _is_blocking;
|
||||||
|
int8_t _socket_id;
|
||||||
|
int8_t _timer_id;
|
||||||
|
void *_handle;
|
||||||
|
send_cb *_send_cb;
|
||||||
|
receive_cb *_receive_cb;
|
||||||
|
start_timer_cb *_start_timer_cb;
|
||||||
|
timer_status_cb *_timer_status_cb;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
const int ECJPAKE_SUITES[] = {
|
const int ECJPAKE_SUITES[] = {
|
||||||
|
@ -78,6 +113,16 @@ static int coap_security_handler_init(coap_security_t *sec){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool coap_security_handler_is_started(const coap_security_t *sec)
|
||||||
|
{
|
||||||
|
return sec->_is_started;
|
||||||
|
}
|
||||||
|
|
||||||
|
const void *coap_security_handler_keyblock(const coap_security_t *sec)
|
||||||
|
{
|
||||||
|
return sec->_keyblk.value;
|
||||||
|
}
|
||||||
|
|
||||||
static void coap_security_handler_reset(coap_security_t *sec){
|
static void coap_security_handler_reset(coap_security_t *sec){
|
||||||
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
||||||
mbedtls_x509_crt_free(&sec->_cacert);
|
mbedtls_x509_crt_free(&sec->_cacert);
|
||||||
|
@ -93,13 +138,13 @@ static void coap_security_handler_reset(coap_security_t *sec){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, const uint8_t *address_ptr, uint16_t port, SecureConnectionMode mode,
|
coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, void *handle, SecureConnectionMode mode,
|
||||||
send_cb *socket_cb,
|
send_cb *socket_cb,
|
||||||
receive_cb *receive_data_cb,
|
receive_cb *receive_data_cb,
|
||||||
start_timer_cb *timer_start_cb,
|
start_timer_cb *timer_start_cb,
|
||||||
timer_status_cb *timer_stat_cb)
|
timer_status_cb *timer_stat_cb)
|
||||||
{
|
{
|
||||||
if (!address_ptr || socket_cb == NULL || receive_data_cb == NULL || timer_start_cb == NULL || timer_stat_cb == NULL) {
|
if (socket_cb == NULL || receive_data_cb == NULL || timer_start_cb == NULL || timer_stat_cb == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
coap_security_t *this = ns_dyn_mem_alloc(sizeof(coap_security_t));
|
coap_security_t *this = ns_dyn_mem_alloc(sizeof(coap_security_t));
|
||||||
|
@ -111,8 +156,7 @@ coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, const u
|
||||||
ns_dyn_mem_free(this);
|
ns_dyn_mem_free(this);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
this->_remote_port = port;
|
this->_handle = handle;
|
||||||
memcpy(this->_remote_address, address_ptr, 16);
|
|
||||||
this->_conn_mode = mode;
|
this->_conn_mode = mode;
|
||||||
memset(this->_pw, 0, 64);
|
memset(this->_pw, 0, 64);
|
||||||
this->_pw_len = 0;
|
this->_pw_len = 0;
|
||||||
|
@ -552,7 +596,7 @@ static int get_timer(void *sec_obj)
|
||||||
|
|
||||||
int f_send( void *ctx, const unsigned char *buf, size_t len){
|
int f_send( void *ctx, const unsigned char *buf, size_t len){
|
||||||
coap_security_t *sec = (coap_security_t *)ctx;
|
coap_security_t *sec = (coap_security_t *)ctx;
|
||||||
return sec->_send_cb(sec->_socket_id, sec->_remote_address, sec->_remote_port, ns_in6addr_any, buf, len);
|
return sec->_send_cb(sec->_socket_id, sec->_handle, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int f_recv(void *ctx, unsigned char *buf, size_t len){
|
int f_recv(void *ctx, unsigned char *buf, size_t len){
|
||||||
|
@ -580,3 +624,5 @@ int entropy_poll( void *ctx, unsigned char *output, size_t len,
|
||||||
ns_dyn_mem_free(c);
|
ns_dyn_mem_free(c);
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // COAP_SECURITY_AVAILABLE
|
||||||
|
|
|
@ -21,11 +21,13 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "mbedtls/platform.h"
|
|
||||||
|
#ifdef NS_USE_EXTERNAL_MBED_TLS
|
||||||
#include "mbedtls/ssl.h"
|
#include "mbedtls/ssl.h"
|
||||||
#include "mbedtls/sha256.h"
|
#ifdef MBEDTLS_SSL_TLS_C
|
||||||
#include "mbedtls/entropy.h"
|
#define COAP_SECURITY_AVAILABLE
|
||||||
#include "mbedtls/ctr_drbg.h"
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#define COOKIE_SIMPLE_LEN 8
|
#define COOKIE_SIMPLE_LEN 8
|
||||||
typedef struct simple_cookie {
|
typedef struct simple_cookie {
|
||||||
|
@ -38,7 +40,7 @@ typedef struct key_block {
|
||||||
unsigned char value[KEY_BLOCK_LEN];
|
unsigned char value[KEY_BLOCK_LEN];
|
||||||
} key_block_t;
|
} key_block_t;
|
||||||
|
|
||||||
typedef int send_cb(int8_t socket_id, const uint8_t *address_ptr, uint16_t port, const uint8_t source_addr[static 16], const void *, size_t);
|
typedef int send_cb(int8_t socket_id, void *handle, const void *buf, size_t);
|
||||||
typedef int receive_cb(int8_t socket_id, unsigned char *, size_t);
|
typedef int receive_cb(int8_t socket_id, unsigned char *, size_t);
|
||||||
typedef void start_timer_cb(int8_t timer_id, uint32_t min, uint32_t fin);
|
typedef void start_timer_cb(int8_t timer_id, uint32_t min, uint32_t fin);
|
||||||
typedef int timer_status_cb(int8_t timer_id);
|
typedef int timer_status_cb(int8_t timer_id);
|
||||||
|
@ -66,40 +68,11 @@ typedef struct {
|
||||||
uint8_t _priv_len;
|
uint8_t _priv_len;
|
||||||
} coap_security_keys_t;
|
} coap_security_keys_t;
|
||||||
|
|
||||||
typedef struct coap_security_s {
|
typedef struct coap_security_s coap_security_t;
|
||||||
mbedtls_ssl_config _conf;
|
|
||||||
mbedtls_ssl_context _ssl;
|
|
||||||
|
|
||||||
mbedtls_ctr_drbg_context _ctr_drbg;
|
#ifdef COAP_SECURITY_AVAILABLE
|
||||||
mbedtls_entropy_context _entropy;
|
|
||||||
bool _is_started;
|
|
||||||
simple_cookie_t _cookie;
|
|
||||||
key_block_t _keyblk;
|
|
||||||
|
|
||||||
SecureConnectionMode _conn_mode;
|
coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, void *handle,
|
||||||
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
|
||||||
mbedtls_x509_crt _cacert;
|
|
||||||
mbedtls_x509_crt _owncert;
|
|
||||||
#endif
|
|
||||||
mbedtls_pk_context _pkey;
|
|
||||||
|
|
||||||
uint8_t _remote_address[16];
|
|
||||||
uint16_t _remote_port;
|
|
||||||
|
|
||||||
uint8_t _pw[64];
|
|
||||||
uint8_t _pw_len;
|
|
||||||
|
|
||||||
bool _is_blocking;
|
|
||||||
int8_t _socket_id;
|
|
||||||
int8_t _timer_id;
|
|
||||||
send_cb *_send_cb;
|
|
||||||
receive_cb *_receive_cb;
|
|
||||||
start_timer_cb *_start_timer_cb;
|
|
||||||
timer_status_cb *_timer_status_cb;
|
|
||||||
|
|
||||||
} coap_security_t;
|
|
||||||
|
|
||||||
coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, const uint8_t *address_ptr, uint16_t port,
|
|
||||||
SecureConnectionMode mode,
|
SecureConnectionMode mode,
|
||||||
send_cb *send_cb,
|
send_cb *send_cb,
|
||||||
receive_cb *receive_cb,
|
receive_cb *receive_cb,
|
||||||
|
@ -120,4 +93,30 @@ int coap_security_send_close_alert(coap_security_t *sec);
|
||||||
|
|
||||||
int coap_security_handler_read(coap_security_t *sec, unsigned char* buffer, size_t len);
|
int coap_security_handler_read(coap_security_t *sec, unsigned char* buffer, size_t len);
|
||||||
|
|
||||||
|
bool coap_security_handler_is_started(const coap_security_t *sec);
|
||||||
|
|
||||||
|
const void *coap_security_handler_keyblock(const coap_security_t *sec);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Dummy definitions, including needed error codes */
|
||||||
|
#define MBEDTLS_ERR_SSL_TIMEOUT (-1)
|
||||||
|
#define MBEDTLS_ERR_SSL_WANT_READ (-2)
|
||||||
|
#define MBEDTLS_ERR_SSL_WANT_WRITE (-3)
|
||||||
|
#define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE (-4)
|
||||||
|
|
||||||
|
#define coap_security_create(socket_id, timer_id, handle, \
|
||||||
|
mode, send_cb, receive_cb, start_timer_cb, timer_status_cb) ((coap_security_t *) 0)
|
||||||
|
#define coap_security_destroy(sec) ((void) 0)
|
||||||
|
#define coap_security_handler_connect(sec, is_server, sock_mode, keys) (-1)
|
||||||
|
#define coap_security_handler_connect_non_blocking(sec, is_server, sock_mode, keys, timeout_min, timeout_max) (-1)
|
||||||
|
#define coap_security_handler_continue_connecting(sec) (-1)
|
||||||
|
#define coap_security_handler_send_message(sec, message, len) (-1)
|
||||||
|
#define coap_security_send_close_alert(sec) (-1)
|
||||||
|
#define coap_security_handler_read(sec, buffer, len) (-1)
|
||||||
|
#define coap_security_handler_is_started(sec) false
|
||||||
|
#define coap_security_handler_keyblock(sec) ((void *) 0)
|
||||||
|
|
||||||
|
#endif /* COAP_SECURITY_AVAILABLE */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -123,10 +123,7 @@ bool test_coap_connection_handler_send_data()
|
||||||
|
|
||||||
connection_handler_destroy(handler);
|
connection_handler_destroy(handler);
|
||||||
|
|
||||||
coap_security_handler_stub.sec_obj = (coap_security_t *)malloc(sizeof(coap_security_t));
|
coap_security_handler_stub.sec_obj = coap_security_handler_stub_alloc();
|
||||||
memset(coap_security_handler_stub.sec_obj, 0, sizeof(coap_security_t));
|
|
||||||
coap_security_handler_stub.sec_obj->_remote_port = 22;
|
|
||||||
memset(coap_security_handler_stub.sec_obj->_remote_address, 1, 16 );
|
|
||||||
|
|
||||||
nsdynmemlib_stub.returnCounter = 1;
|
nsdynmemlib_stub.returnCounter = 1;
|
||||||
handler = connection_handler_create(&receive_from_sock_cb, &send_to_sock_cb, NULL, NULL);
|
handler = connection_handler_create(&receive_from_sock_cb, &send_to_sock_cb, NULL, NULL);
|
||||||
|
@ -200,10 +197,7 @@ bool test_coap_connection_handler_virtual_recv()
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//handler->socket->data still in memory
|
//handler->socket->data still in memory
|
||||||
coap_security_handler_stub.sec_obj = (coap_security_t *)malloc(sizeof(coap_security_t));
|
coap_security_handler_stub.sec_obj = coap_security_handler_stub_alloc();
|
||||||
memset(coap_security_handler_stub.sec_obj, 0, sizeof(coap_security_t));
|
|
||||||
coap_security_handler_stub.sec_obj->_remote_port = 55;
|
|
||||||
memset(coap_security_handler_stub.sec_obj->_remote_address, 4, 16 );
|
|
||||||
|
|
||||||
ns_timer_stub.int8_value = -1;
|
ns_timer_stub.int8_value = -1;
|
||||||
nsdynmemlib_stub.returnCounter = 3;
|
nsdynmemlib_stub.returnCounter = 3;
|
||||||
|
@ -229,8 +223,6 @@ bool test_coap_connection_handler_virtual_recv()
|
||||||
|
|
||||||
nsdynmemlib_stub.returnCounter = 1;
|
nsdynmemlib_stub.returnCounter = 1;
|
||||||
coap_security_handler_stub.int_value = 0;
|
coap_security_handler_stub.int_value = 0;
|
||||||
coap_security_handler_stub.sec_obj->_remote_port = 12;
|
|
||||||
memset(coap_security_handler_stub.sec_obj->_remote_address, 1, 16 );
|
|
||||||
if( 0 != coap_connection_handler_virtual_recv(handler2,buf, 12, &buf, 1) )
|
if( 0 != coap_connection_handler_virtual_recv(handler2,buf, 12, &buf, 1) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -300,11 +292,7 @@ bool test_timer_callbacks()
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//handler->socket->data still in memory
|
//handler->socket->data still in memory
|
||||||
coap_security_handler_stub.sec_obj = (coap_security_t *)malloc(sizeof(coap_security_t));
|
coap_security_handler_stub.sec_obj = coap_security_handler_stub_alloc();
|
||||||
memset(coap_security_handler_stub.sec_obj, 0, sizeof(coap_security_t));
|
|
||||||
coap_security_handler_stub.sec_obj->_remote_port = 55;
|
|
||||||
memset(coap_security_handler_stub.sec_obj->_remote_address, 4, 16 );
|
|
||||||
coap_security_handler_stub.sec_obj->_timer_id = 5;
|
|
||||||
|
|
||||||
ns_timer_stub.int8_value = 0;
|
ns_timer_stub.int8_value = 0;
|
||||||
nsdynmemlib_stub.returnCounter = 3;
|
nsdynmemlib_stub.returnCounter = 3;
|
||||||
|
@ -353,8 +341,7 @@ bool test_socket_api_callbacks()
|
||||||
socket_callback_t *sckt_data = (socket_callback_t *)malloc(sizeof(socket_callback_t));
|
socket_callback_t *sckt_data = (socket_callback_t *)malloc(sizeof(socket_callback_t));
|
||||||
memset(sckt_data, 0, sizeof(socket_callback_t));
|
memset(sckt_data, 0, sizeof(socket_callback_t));
|
||||||
|
|
||||||
coap_security_handler_stub.sec_obj = (coap_security_t *)malloc(sizeof(coap_security_t));
|
coap_security_handler_stub.sec_obj = coap_security_handler_stub_alloc();
|
||||||
memset(coap_security_handler_stub.sec_obj, 0, sizeof(coap_security_t));
|
|
||||||
|
|
||||||
socket_api_stub.int8_value = 0;
|
socket_api_stub.int8_value = 0;
|
||||||
nsdynmemlib_stub.returnCounter = 1;
|
nsdynmemlib_stub.returnCounter = 1;
|
||||||
|
@ -433,8 +420,7 @@ bool test_security_callbacks()
|
||||||
socket_callback_t *sckt_data = (socket_callback_t *)malloc(sizeof(socket_callback_t));
|
socket_callback_t *sckt_data = (socket_callback_t *)malloc(sizeof(socket_callback_t));
|
||||||
memset(sckt_data, 0, sizeof(socket_callback_t));
|
memset(sckt_data, 0, sizeof(socket_callback_t));
|
||||||
|
|
||||||
coap_security_handler_stub.sec_obj = (coap_security_t *)malloc(sizeof(coap_security_t));
|
coap_security_handler_stub.sec_obj = coap_security_handler_stub_alloc();
|
||||||
memset(coap_security_handler_stub.sec_obj, 0, sizeof(coap_security_t));
|
|
||||||
|
|
||||||
nsdynmemlib_stub.returnCounter = 1;
|
nsdynmemlib_stub.returnCounter = 1;
|
||||||
coap_conn_handler_t *handler = connection_handler_create(&receive_from_sock_cb, &send_to_sock_cb, NULL, NULL);
|
coap_conn_handler_t *handler = connection_handler_create(&receive_from_sock_cb, &send_to_sock_cb, NULL, NULL);
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
#include "mbedtls_stub.h"
|
#include "mbedtls_stub.h"
|
||||||
#include "mbedtls/ssl.h"
|
#include "mbedtls/ssl.h"
|
||||||
|
|
||||||
static int send_to_socket(int8_t socket_id, uint8_t *address_ptr, uint16_t port, const unsigned char *buf, size_t len)
|
static int send_to_socket(int8_t socket_id, void *handle, const unsigned char *buf, size_t len)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,27 +30,26 @@ static int timer_status_callback(int8_t timer_id)
|
||||||
|
|
||||||
bool test_thread_security_create()
|
bool test_thread_security_create()
|
||||||
{
|
{
|
||||||
uint8_t buf[16];
|
if( NULL != coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, NULL) )
|
||||||
if( NULL != coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, NULL) )
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if( NULL != coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback) )
|
if( NULL != coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
nsdynmemlib_stub.returnCounter = 1;
|
nsdynmemlib_stub.returnCounter = 1;
|
||||||
mbedtls_stub.expected_int = -1;
|
mbedtls_stub.expected_int = -1;
|
||||||
if( NULL != coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback) )
|
if( NULL != coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mbedtls_stub.expected_int = 0;
|
mbedtls_stub.expected_int = 0;
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = -1;
|
mbedtls_stub.crt_expected_int = -1;
|
||||||
if( NULL != coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback) )
|
if( NULL != coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = 0;
|
mbedtls_stub.crt_expected_int = 0;
|
||||||
coap_security_t *handle = coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
coap_security_t *handle = coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
||||||
if( NULL == handle )
|
if( NULL == handle )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -61,10 +60,9 @@ bool test_thread_security_create()
|
||||||
|
|
||||||
bool test_thread_security_destroy()
|
bool test_thread_security_destroy()
|
||||||
{
|
{
|
||||||
uint8_t buf[16];
|
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = 0;
|
mbedtls_stub.crt_expected_int = 0;
|
||||||
coap_security_t *handle = coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
coap_security_t *handle = coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
||||||
if( NULL == handle )
|
if( NULL == handle )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -74,10 +72,9 @@ bool test_thread_security_destroy()
|
||||||
|
|
||||||
bool test_coap_security_handler_connect()
|
bool test_coap_security_handler_connect()
|
||||||
{
|
{
|
||||||
uint8_t buf[16];
|
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = 0;
|
mbedtls_stub.crt_expected_int = 0;
|
||||||
coap_security_t *handle = coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
coap_security_t *handle = coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
||||||
if( NULL == handle )
|
if( NULL == handle )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -176,10 +173,9 @@ bool test_coap_security_handler_connect()
|
||||||
|
|
||||||
bool test_coap_security_handler_continue_connecting()
|
bool test_coap_security_handler_continue_connecting()
|
||||||
{
|
{
|
||||||
uint8_t buf[16];
|
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = 0;
|
mbedtls_stub.crt_expected_int = 0;
|
||||||
coap_security_t *handle = coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
coap_security_t *handle = coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
||||||
if( NULL == handle )
|
if( NULL == handle )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -224,10 +220,9 @@ bool test_coap_security_handler_continue_connecting()
|
||||||
|
|
||||||
bool test_coap_security_handler_send_message()
|
bool test_coap_security_handler_send_message()
|
||||||
{
|
{
|
||||||
uint8_t buf[16];
|
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = 0;
|
mbedtls_stub.crt_expected_int = 0;
|
||||||
coap_security_t *handle = coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
coap_security_t *handle = coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
||||||
if( NULL == handle )
|
if( NULL == handle )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -245,10 +240,9 @@ bool test_coap_security_handler_send_message()
|
||||||
|
|
||||||
bool test_thread_security_send_close_alert()
|
bool test_thread_security_send_close_alert()
|
||||||
{
|
{
|
||||||
uint8_t buf[16];
|
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = 0;
|
mbedtls_stub.crt_expected_int = 0;
|
||||||
coap_security_t *handle = coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
coap_security_t *handle = coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
||||||
if( NULL == handle )
|
if( NULL == handle )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -265,10 +259,9 @@ bool test_thread_security_send_close_alert()
|
||||||
|
|
||||||
bool test_coap_security_handler_read()
|
bool test_coap_security_handler_read()
|
||||||
{
|
{
|
||||||
uint8_t buf[16];
|
|
||||||
nsdynmemlib_stub.returnCounter = 2;
|
nsdynmemlib_stub.returnCounter = 2;
|
||||||
mbedtls_stub.crt_expected_int = 0;
|
mbedtls_stub.crt_expected_int = 0;
|
||||||
coap_security_t *handle = coap_security_create(1,2,&buf,12,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
coap_security_t *handle = coap_security_create(1,2,NULL,ECJPAKE,&send_to_socket, &receive_from_socket, &start_timer_callback, &timer_status_callback);
|
||||||
if( NULL == handle )
|
if( NULL == handle )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ INCLUDE_DIRS =\
|
||||||
$(CPPUTEST_HOME)/include\
|
$(CPPUTEST_HOME)/include\
|
||||||
|
|
||||||
CPPUTESTFLAGS = -D__thumb2__ -w
|
CPPUTESTFLAGS = -D__thumb2__ -w
|
||||||
CPPUTEST_CFLAGS += -std=gnu99
|
CPPUTEST_CFLAGS += -std=gnu99 -DNS_USE_EXTERNAL_MBED_TLS
|
||||||
|
|
||||||
#if you need to use -std=c++11 or c++0x you need to uncomment this
|
#if you need to use -std=c++11 or c++0x you need to uncomment this
|
||||||
#CPPUTESTFLAGS += -DCPPUTEST_STD_CPP_LIB_DISABLED
|
#CPPUTESTFLAGS += -DCPPUTEST_STD_CPP_LIB_DISABLED
|
||||||
|
|
|
@ -12,9 +12,12 @@
|
||||||
|
|
||||||
thread_sec_def coap_security_handler_stub;
|
thread_sec_def coap_security_handler_stub;
|
||||||
|
|
||||||
coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, const uint8_t *address_ptr, uint16_t port,
|
struct coap_security_s {
|
||||||
SecureConnectionMode mode,
|
bool _is_started;
|
||||||
int (*send_cb)(int8_t socket_id, const uint8_t *address_ptr, uint16_t port, const uint8_t source_addr[static 16], const void *, size_t),
|
};
|
||||||
|
|
||||||
|
coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, void *handle, SecureConnectionMode mode,
|
||||||
|
int (*send_cb)(int8_t socket_id, void *handle, const void *, size_t),
|
||||||
int (*receive_cb)(int8_t socket_id, unsigned char *, size_t),
|
int (*receive_cb)(int8_t socket_id, unsigned char *, size_t),
|
||||||
void (*start_timer_cb)(int8_t timer_id, uint32_t min, uint32_t fin),
|
void (*start_timer_cb)(int8_t timer_id, uint32_t min, uint32_t fin),
|
||||||
int (*timer_status_cb)(int8_t timer_id))
|
int (*timer_status_cb)(int8_t timer_id))
|
||||||
|
@ -26,6 +29,12 @@ coap_security_t *coap_security_create(int8_t socket_id, int8_t timer_id, const u
|
||||||
return coap_security_handler_stub.sec_obj;
|
return coap_security_handler_stub.sec_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
coap_security_t *coap_security_handler_stub_alloc(void)
|
||||||
|
{
|
||||||
|
return calloc(1, sizeof(coap_security_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void coap_security_destroy(coap_security_t *sec)
|
void coap_security_destroy(coap_security_t *sec)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -73,3 +82,13 @@ int coap_security_handler_read(coap_security_t *sec, unsigned char* buffer, size
|
||||||
}
|
}
|
||||||
return coap_security_handler_stub.int_value;
|
return coap_security_handler_stub.int_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool coap_security_handler_is_started(const coap_security_t *sec)
|
||||||
|
{
|
||||||
|
return sec->_is_started;
|
||||||
|
}
|
||||||
|
|
||||||
|
const void *coap_security_handler_keyblock(const coap_security_t *sec)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -35,4 +35,6 @@ typedef struct tsh{
|
||||||
|
|
||||||
extern thread_sec_def coap_security_handler_stub;
|
extern thread_sec_def coap_security_handler_stub;
|
||||||
|
|
||||||
|
coap_security_t *coap_security_handler_stub_alloc(void);
|
||||||
|
|
||||||
#endif //__COAP_SECURITY_HANDLER_STUB_H__
|
#endif //__COAP_SECURITY_HANDLER_STUB_H__
|
||||||
|
|
Loading…
Reference in New Issue