mirror of https://github.com/wolfSSL/wolfssl.git
commit
c7dde6c682
|
@ -1412,6 +1412,15 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
|
|||
#error Micrium port does not support DTLS session export yet
|
||||
#endif
|
||||
#endif
|
||||
#elif defined WOLFSSL_UIP
|
||||
ctx->CBIORecv = uIPReceive;
|
||||
ctx->CBIOSend = uIPSend;
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (method->version.major == DTLS_MAJOR) {
|
||||
ctx->CBIOSendTo = uIPSendTo;
|
||||
ctx->CBIORecvFrom = uIPRecvFrom;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
ctx->CBIORecv = EmbedReceive;
|
||||
ctx->CBIOSend = EmbedSend;
|
||||
|
|
95
src/wolfio.c
95
src/wolfio.c
|
@ -2068,4 +2068,99 @@ void wolfSSL_SetIO_Mynewt(WOLFSSL* ssl, struct mn_socket* mnSocket, struct mn_so
|
|||
|
||||
#endif /* defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP) */
|
||||
|
||||
#ifdef WOLFSSL_UIP
|
||||
#include <uip.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* uIP TCP/IP port, using the native tcp/udp socket api.
|
||||
* TCP and UDP are currently supported with the callbacks below.
|
||||
*
|
||||
*/
|
||||
/* The uIP tcp send callback
|
||||
* return : bytes sent, or error
|
||||
*/
|
||||
int uIPSend(WOLFSSL* ssl, char* buf, int sz, void* _ctx)
|
||||
{
|
||||
uip_wolfssl_ctx *ctx = (struct uip_wolfssl_ctx *)_ctx;
|
||||
int ret;
|
||||
unsigned int max_sendlen;
|
||||
int total_written = 0;
|
||||
(void)ssl;
|
||||
do {
|
||||
unsigned int bytes_left = sz - total_written;
|
||||
max_sendlen = tcp_socket_max_sendlen(&ctx->conn.tcp);
|
||||
if (bytes_left > max_sendlen) {
|
||||
printf("Send limited by buffer\r\n");
|
||||
bytes_left = max_sendlen;
|
||||
}
|
||||
if (bytes_left == 0) {
|
||||
printf("Buffer full!\r\n");
|
||||
break;
|
||||
}
|
||||
ret = tcp_socket_send(&ctx->conn.tcp, (unsigned char *)buf + total_written, bytes_left);
|
||||
if (ret <= 0)
|
||||
break;
|
||||
total_written += ret;
|
||||
} while(total_written < sz);
|
||||
return total_written;
|
||||
}
|
||||
|
||||
int uIPSendTo(WOLFSSL* ssl, char* buf, int sz, void* _ctx)
|
||||
{
|
||||
uip_wolfssl_ctx *ctx = (struct uip_wolfssl_ctx *)_ctx;
|
||||
int ret = 0;
|
||||
(void)ssl;
|
||||
ret = udp_socket_sendto(&ctx->conn.udp, (unsigned char *)buf, sz, &ctx->peer_addr, ctx->peer_port );
|
||||
if (ret <= 0)
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* The uIP uTCP/IP receive callback
|
||||
* return : nb bytes read, or error
|
||||
*/
|
||||
int uIPReceive(WOLFSSL *ssl, char *buf, int sz, void *_ctx)
|
||||
{
|
||||
uip_wolfssl_ctx *ctx = (uip_wolfssl_ctx *)_ctx;
|
||||
if (!ctx || !ctx->ssl_rx_databuf)
|
||||
return -1;
|
||||
(void)ssl;
|
||||
if (ctx->ssl_rb_len > 0) {
|
||||
if (sz > ctx->ssl_rb_len - ctx->ssl_rb_off)
|
||||
sz = ctx->ssl_rb_len - ctx->ssl_rb_off;
|
||||
XMEMCPY(buf, ctx->ssl_rx_databuf + ctx->ssl_rb_off, sz);
|
||||
ctx->ssl_rb_off += sz;
|
||||
if (ctx->ssl_rb_off >= ctx->ssl_rb_len) {
|
||||
ctx->ssl_rb_len = 0;
|
||||
ctx->ssl_rb_off = 0;
|
||||
}
|
||||
return sz;
|
||||
} else {
|
||||
return WOLFSSL_CBIO_ERR_WANT_READ;
|
||||
}
|
||||
}
|
||||
|
||||
/* uIP DTLS Generate Cookie callback
|
||||
* return : number of bytes copied into buf, or error
|
||||
*/
|
||||
int uIPGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *_ctx)
|
||||
{
|
||||
uip_wolfssl_ctx *ctx = (uip_wolfssl_ctx *)ctx;
|
||||
byte token[32];
|
||||
byte digest[WC_SHA_DIGEST_SIZE];
|
||||
int ret = 0;
|
||||
XMEMSET(token, 0, sizeof(token));
|
||||
XMEMCPY(token, &ctx->peer_addr, sizeof(uip_ipaddr_t));
|
||||
XMEMCPY(token + sizeof(uip_ipaddr_t), &ctx->peer_port, sizeof(word16));
|
||||
ret = wc_ShaHash(token, sizeof(uip_ipaddr_t) + sizeof(word16), digest);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
if (sz > WC_SHA_DIGEST_SIZE)
|
||||
sz = WC_SHA_DIGEST_SIZE;
|
||||
XMEMCPY(buf, digest, sz);
|
||||
return sz;
|
||||
}
|
||||
|
||||
#endif /* WOLFSSL_UIP */
|
||||
|
||||
#endif /* WOLFCRYPT_ONLY */
|
||||
|
|
|
@ -1938,7 +1938,8 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
|||
defined(WOLFSSL_uITRON4) || defined(WOLFSSL_uTKERNEL2) || \
|
||||
defined(WOLFSSL_LPC43xx) || defined(WOLFSSL_STM32F2xx) || \
|
||||
defined(MBED) || defined(WOLFSSL_EMBOS) || \
|
||||
defined(WOLFSSL_GENSEED_FORTEST) || defined(WOLFSSL_CHIBIOS)
|
||||
defined(WOLFSSL_GENSEED_FORTEST) || defined(WOLFSSL_CHIBIOS) || \
|
||||
defined(WOLFSSL_CONTIKI)
|
||||
|
||||
/* these platforms do not have a default random seed and
|
||||
you'll need to implement your own wc_GenerateSeed or define via
|
||||
|
@ -2038,6 +2039,5 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
|||
#endif
|
||||
|
||||
/* End wc_GenerateSeed */
|
||||
|
||||
#endif /* WC_NO_RNG */
|
||||
#endif /* HAVE_FIPS */
|
||||
|
|
|
@ -1669,7 +1669,7 @@ WOLFSSL_API int wolfSSL_make_eap_keys(WOLFSSL*, void* key, unsigned int len,
|
|||
#elif !defined(WOLFSSL_MDK_ARM) && !defined(WOLFSSL_IAR_ARM) && \
|
||||
!defined(WOLFSSL_PICOTCP) && !defined(WOLFSSL_ROWLEY_ARM) && \
|
||||
!defined(WOLFSSL_EMBOS) && !defined(WOLFSSL_FROSTED) && \
|
||||
!defined(WOLFSSL_CHIBIOS)
|
||||
!defined(WOLFSSL_CHIBIOS) && !defined(WOLFSSL_CONTIKI)
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
/* allow writev style writing */
|
||||
|
|
|
@ -224,6 +224,22 @@
|
|||
#define NO_FILESYSTEM
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_CONTIKI)
|
||||
#include <contiki.h>
|
||||
#define WOLFSSL_UIP
|
||||
#define NO_WOLFSSL_MEMORY
|
||||
#define NO_WRITEV
|
||||
#define SINGLE_THREADED
|
||||
#define WOLFSSL_USER_IO
|
||||
#define NO_FILESYSTEM
|
||||
#define CUSTOM_RAND_TYPE uint16_t
|
||||
#define CUSTOM_RAND_GENERATE random_rand
|
||||
static inline unsigned int LowResTimer(void)
|
||||
{
|
||||
return clock_seconds();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_IAR_ARM) || defined(WOLFSSL_ROWLEY_ARM)
|
||||
#define NO_MAIN_DRIVER
|
||||
#define SINGLE_THREADED
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
|
||||
#if !defined(WOLFSSL_USER_IO)
|
||||
/* Micrium uses NetSock I/O callbacks in wolfio.c */
|
||||
#if !defined(USE_WOLFSSL_IO) && !defined(MICRIUM)
|
||||
#if !defined(USE_WOLFSSL_IO) && !defined(MICRIUM) && !defined(WOLFSSL_CONTIKI)
|
||||
#define USE_WOLFSSL_IO
|
||||
#endif
|
||||
#endif
|
||||
|
@ -122,7 +122,7 @@
|
|||
#elif defined(EBSNET)
|
||||
#include "rtipapi.h" /* errno */
|
||||
#include "socket.h"
|
||||
#elif !defined(DEVKITPRO) && !defined(WOLFSSL_PICOTCP)
|
||||
#elif !defined(DEVKITPRO) && !defined(WOLFSSL_PICOTCP) && !defined(WOLFSSL_CONTIKI)
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
@ -423,6 +423,39 @@ WOLFSSL_API void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags);
|
|||
struct mn_sockaddr_in* mnSockAddrIn);
|
||||
#endif /* defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP) */
|
||||
|
||||
#ifdef WOLFSSL_UIP
|
||||
|
||||
struct uip_wolfssl_ctx {
|
||||
union socket_connector {
|
||||
struct tcp_socket tcp;
|
||||
struct udp_socket udp;
|
||||
} conn;
|
||||
WOLFSSL_CTX *ctx;
|
||||
WOLFSSL *ssl;
|
||||
uint8_t *input_databuf;
|
||||
uint8_t *output_databuf;
|
||||
uint8_t *ssl_rx_databuf;
|
||||
int ssl_rb_len;
|
||||
int ssl_rb_off;
|
||||
struct process *process;
|
||||
tcp_socket_data_callback_t input_callback;
|
||||
tcp_socket_event_callback_t event_callback;
|
||||
int closing;
|
||||
uip_ipaddr_t peer_addr;
|
||||
uint16_t peer_port;
|
||||
};
|
||||
|
||||
typedef struct uip_wolfssl_ctx uip_wolfssl_ctx;
|
||||
|
||||
WOLFSSL_LOCAL int uIPSend(WOLFSSL* ssl, char* buf, int sz, void* ctx);
|
||||
WOLFSSL_LOCAL int uIPReceive(WOLFSSL* ssl, char* buf, int sz,
|
||||
void* ctx);
|
||||
WOLFSSL_LOCAL int uIPReceiveFrom(WOLFSSL* ssl, char* buf, int sz,
|
||||
void* ctx);
|
||||
WOLFSSL_LOCAL int uIPSendTo(WOLFSSL* ssl, char* buf, int sz, void* ctx);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSL_DTLS
|
||||
typedef int (*CallbackGenCookie)(WOLFSSL* ssl, unsigned char* buf, int sz,
|
||||
void* ctx);
|
||||
|
|
Loading…
Reference in New Issue