279 lines
6.0 KiB
C
Executable File
279 lines
6.0 KiB
C
Executable File
#include "sl_tls.h"
|
||
|
||
#include "lwip/sockets.h"
|
||
#include "lwip/ip_addr.h"
|
||
#include "lwip/inet.h"
|
||
#include <os/str.h>
|
||
#include <string.h>
|
||
|
||
extern void bk_printf(const char *fmt, ...);
|
||
|
||
|
||
MbedTLSSession * sl_ssl_handle_create(void)
|
||
{
|
||
MbedTLSSession *tls_session = TLS_NULL;
|
||
|
||
tls_session = (MbedTLSSession *)tls_malloc(sizeof(MbedTLSSession));
|
||
if(!tls_session)
|
||
{
|
||
bk_printf("no memory for at_tls_session struct\n");
|
||
return NULL;
|
||
}
|
||
memset(tls_session,0,sizeof(MbedTLSSession));
|
||
|
||
return tls_session;
|
||
}
|
||
|
||
int sl_ssl_connect_create(MbedTLSSession *session)
|
||
{
|
||
char *pers = "beken";
|
||
int ret = 0;
|
||
|
||
if((ret = mbedtls_client_init(session, (void *)pers, strlen(pers))) != 0)
|
||
{
|
||
bk_printf("MbedTLSClientInit err return : -0x%x\r\n", -ret);
|
||
goto __exit;
|
||
}
|
||
|
||
if((ret = mbedtls_client_context(session)) < 0)
|
||
{
|
||
bk_printf("MbedTLSCLlientContext err return : -0x%x\r\n", -ret);
|
||
goto __exit;
|
||
}
|
||
|
||
if((ret = mbedtls_client_connect(session)) != 0)
|
||
{
|
||
bk_printf("MbedTLSCLlientConnect err return : -0x%x\r\n", -ret);
|
||
goto __exit;
|
||
}
|
||
|
||
return 0;
|
||
|
||
__exit:
|
||
mbedtls_client_close(session);
|
||
return -1;
|
||
}
|
||
|
||
|
||
MbedTLSSession * ssl_create(char *url,char *port)
|
||
{
|
||
MbedTLSSession *tls_session = NULL;
|
||
|
||
if(!url && !port)
|
||
return NULL;
|
||
|
||
bk_printf("[SSL]ssl create session,url:%s,port:%s\r\n",url,port);
|
||
tls_session = sl_ssl_handle_create();
|
||
if(tls_session == NULL)
|
||
{
|
||
bk_printf("[SSL]%s %d error\r\n",__FUNCTION__,__LINE__);
|
||
return NULL;
|
||
}
|
||
|
||
tls_session->host = os_strdup(url); ///os_strdup(DEFAULT_MBEDTLS_WEB_SERVER);
|
||
if(tls_session->host == NULL)
|
||
{
|
||
bk_printf("no memory for tls_session->host malloc\n");
|
||
goto err_exit;
|
||
}
|
||
|
||
tls_session->port = os_strdup(port);///os_strdup(DEFAULT_MBEDTLS_WEB_PORT);
|
||
if(tls_session->port == NULL)
|
||
{
|
||
bk_printf("no memory for tls_session->port malloc\n");
|
||
goto err_exit;
|
||
}
|
||
|
||
tls_session->buffer_len = DEFAULT_MBEDTLS_READ_BUFFER;
|
||
tls_session->buffer = tls_malloc(tls_session->buffer_len);
|
||
if(tls_session->buffer == NULL)
|
||
{
|
||
bk_printf("no memory for tls_session->buffer malloc\n");
|
||
goto err_exit;
|
||
}
|
||
|
||
if(sl_ssl_connect_create(tls_session) != 0)
|
||
{
|
||
tls_session = NULL;
|
||
goto error;
|
||
}
|
||
|
||
return tls_session;
|
||
err_exit:
|
||
if((tls_session)&&(tls_session->host != NULL)) {
|
||
tls_free(tls_session->host);
|
||
tls_session->host = NULL;
|
||
}
|
||
if((tls_session)&&(tls_session->port != NULL)) {
|
||
tls_free(tls_session->port);
|
||
tls_session->port = NULL;
|
||
}
|
||
if((tls_session)&&(tls_session->buffer)) {
|
||
tls_free(tls_session->buffer);
|
||
tls_session->buffer = NULL;
|
||
}
|
||
if(tls_session){
|
||
tls_free(tls_session);
|
||
tls_session = NULL;
|
||
}
|
||
goto error;
|
||
return NULL;
|
||
error:
|
||
return NULL;
|
||
}
|
||
|
||
int ssl_txdat_sender(MbedTLSSession *tls_session,int len,char *data)
|
||
{
|
||
int ret;
|
||
int offset = 0,sd_len = 0,wr_len = 0;
|
||
int max_len = 512;
|
||
unsigned int cur_time,p_time;
|
||
|
||
if( data && len)
|
||
{
|
||
if( tls_session)
|
||
{
|
||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||
max_len = mbedtls_ssl_get_max_frag_len( &tls_session->ssl );
|
||
max_len = min(1024,max_len);
|
||
#endif
|
||
///bk_printf("[AS]frag len:%d,mlen:%d\r\n",max_len,len);
|
||
sd_len = len;
|
||
p_time = rtos_get_time();
|
||
|
||
do
|
||
{
|
||
if((sd_len - offset) > max_len)
|
||
{
|
||
wr_len = max_len;
|
||
}
|
||
else
|
||
{
|
||
wr_len = (sd_len - offset);
|
||
}
|
||
|
||
cur_time = rtos_get_time();
|
||
///bk_printf("[ssl]cur_time:%d ms\r\n",cur_time);
|
||
if((cur_time - p_time) > (18 * 1000))
|
||
{
|
||
bk_printf("[%d]ssl send timeout\r\n",__LINE__);
|
||
goto retu;
|
||
}
|
||
|
||
while((ret = mbedtls_client_write(tls_session, (unsigned char*)(data + offset), wr_len)) <= 0)
|
||
{
|
||
if(MBEDTLS_ERR_NET_SEND_FAILED == ret)
|
||
{
|
||
bk_printf("mbedtls_client_write fialed\r\n");
|
||
goto retu;
|
||
}
|
||
if(ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE)
|
||
{
|
||
bk_printf("mbedtls_ssl_write returned -0x%x\r\n", -ret);
|
||
goto __exit;
|
||
}
|
||
rtos_delay_milliseconds(10);
|
||
}
|
||
offset += (ret > 0)?ret:0;
|
||
}while(offset < len);
|
||
retu:
|
||
return offset;
|
||
}
|
||
}
|
||
|
||
return -1;
|
||
__exit:
|
||
return -1;
|
||
}
|
||
|
||
int ssl_read_data(MbedTLSSession *session,unsigned char *msg,unsigned int mlen,unsigned int timeout_ms)
|
||
{
|
||
int len;
|
||
int ret;
|
||
fd_set readfds;
|
||
struct timeval timeout;
|
||
do
|
||
{
|
||
if(mbedtls_ssl_get_bytes_avail(&session->ssl) == 0)
|
||
{
|
||
#if 1
|
||
FD_ZERO( &readfds );
|
||
FD_SET( session->server_fd.fd, &readfds );
|
||
|
||
if(timeout_ms < 0xFFFFFFFFU)
|
||
{
|
||
if(timeout_ms != 0)
|
||
{
|
||
timeout.tv_sec = timeout_ms/1000;
|
||
timeout.tv_usec = (timeout_ms%1000) * 1000;
|
||
}
|
||
else
|
||
{
|
||
timeout.tv_sec = 0;
|
||
timeout.tv_usec = 1000;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
timeout.tv_sec = 0;
|
||
timeout.tv_usec = 0;
|
||
}
|
||
ret = select( session->server_fd.fd+1, &readfds, NULL, NULL, &timeout);
|
||
if( ret <= -1 )
|
||
{ ///-1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
bk_printf("[TLS]select error:%d\r\n",ret);
|
||
return -1;
|
||
}
|
||
else if( 0 == ret )
|
||
{
|
||
///0 <20><><EFBFBD><EFBFBD>ʱ
|
||
///bk_printf("[TLS]read select timeout(%d)\r\n",timeout_ms);
|
||
return 0;
|
||
}
|
||
if (!FD_ISSET( session->server_fd.fd, &readfds ) ) /*one client has data*/
|
||
{
|
||
return 0;
|
||
}
|
||
#endif
|
||
}
|
||
if(mlen == 0)
|
||
{
|
||
return 0;
|
||
}
|
||
len = (session->buffer_len > mlen)?mlen:session->buffer_len;
|
||
ret = mbedtls_client_read(session, (unsigned char *)session->buffer, len);
|
||
if(ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if(ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)
|
||
{
|
||
bk_printf("[AS]MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY\r\n");
|
||
return -1;
|
||
}
|
||
|
||
if(ret == 0)
|
||
{
|
||
bk_printf("[AS]connection closed\n");
|
||
return -1;
|
||
}
|
||
|
||
if(ret < 0)
|
||
{
|
||
bk_printf("[AS]mbedtls_ssl_read returned -0x%x\r\n", -ret);
|
||
return -1;
|
||
}
|
||
}while(0);
|
||
len = ret;
|
||
memcpy(msg,session->buffer,len);
|
||
|
||
return len;
|
||
}
|
||
|
||
int ssl_close(MbedTLSSession *session)
|
||
{
|
||
return mbedtls_client_close(session);
|
||
}
|
||
|