summaryrefslogtreecommitdiff
path: root/components/net/sal_socket/impl
diff options
context:
space:
mode:
authorchenyong <[email protected]>2018-11-15 14:39:31 +0800
committerchenyong <[email protected]>2018-11-15 14:48:20 +0800
commitbeaff7c09d4ae925f3d0269dc42a929468fd3745 (patch)
tree3449a62f0f200c6751728fdbd904e05957350981 /components/net/sal_socket/impl
parent1353a41183a47b87ce9847532dfab6123d36d5d9 (diff)
[net][sal] Add SAL components TLS features support
Signed-off-by: chenyong <[email protected]>
Diffstat (limited to 'components/net/sal_socket/impl')
-rw-r--r--components/net/sal_socket/impl/af_inet_at.c23
-rw-r--r--components/net/sal_socket/impl/af_inet_lwip.c24
-rw-r--r--components/net/sal_socket/impl/proto_mbedtls.c239
3 files changed, 268 insertions, 18 deletions
diff --git a/components/net/sal_socket/impl/af_inet_at.c b/components/net/sal_socket/impl/af_inet_at.c
index c064283a61..90d1537967 100644
--- a/components/net/sal_socket/impl/af_inet_at.c
+++ b/components/net/sal_socket/impl/af_inet_at.c
@@ -62,7 +62,7 @@ static int at_poll(struct dfs_fd *file, struct rt_pollreq *req)
}
#endif
-static const struct proto_ops at_inet_stream_ops =
+static const struct sal_socket_ops at_socket_ops =
{
at_socket,
at_closesocket,
@@ -90,25 +90,30 @@ static int at_create(struct sal_socket *socket, int type, int protocol)
//TODO Check type & protocol
- socket->ops = &at_inet_stream_ops;
+ socket->ops = &at_socket_ops;
return 0;
}
-static const struct proto_family at_inet_family_ops = {
- "at",
- AF_AT,
- AF_INET,
- at_create,
+static struct sal_proto_ops at_proto_ops =
+{
at_gethostbyname,
NULL,
- at_freeaddrinfo,
at_getaddrinfo,
+ at_freeaddrinfo,
+};
+
+static const struct sal_proto_family at_inet_family =
+{
+ AF_AT,
+ AF_INET,
+ at_create,
+ &at_proto_ops,
};
int at_inet_init(void)
{
- sal_proto_family_register(&at_inet_family_ops);
+ sal_proto_family_register(&at_inet_family);
return 0;
}
diff --git a/components/net/sal_socket/impl/af_inet_lwip.c b/components/net/sal_socket/impl/af_inet_lwip.c
index 9e726c87e9..0826b052ab 100644
--- a/components/net/sal_socket/impl/af_inet_lwip.c
+++ b/components/net/sal_socket/impl/af_inet_lwip.c
@@ -259,7 +259,8 @@ static int inet_poll(struct dfs_fd *file, struct rt_pollreq *req)
}
#endif
-static const struct proto_ops lwip_inet_stream_ops = {
+static const struct sal_socket_ops lwip_socket_ops =
+{
inet_socket,
lwip_close,
lwip_bind,
@@ -286,25 +287,30 @@ static int inet_create(struct sal_socket *socket, int type, int protocol)
//TODO Check type & protocol
- socket->ops = &lwip_inet_stream_ops;
+ socket->ops = &lwip_socket_ops;
return 0;
}
-static const struct proto_family lwip_inet_family_ops = {
- "lwip",
- AF_INET,
- AF_INET,
- inet_create,
+static struct sal_proto_ops lwip_proto_ops =
+{
lwip_gethostbyname,
lwip_gethostbyname_r,
- lwip_freeaddrinfo,
lwip_getaddrinfo,
+ lwip_freeaddrinfo,
+};
+
+static const struct sal_proto_family lwip_inet_family =
+{
+ AF_INET,
+ AF_INET,
+ inet_create,
+ &lwip_proto_ops,
};
int lwip_inet_init(void)
{
- sal_proto_family_register(&lwip_inet_family_ops);
+ sal_proto_family_register(&lwip_inet_family);
return 0;
}
diff --git a/components/net/sal_socket/impl/proto_mbedtls.c b/components/net/sal_socket/impl/proto_mbedtls.c
new file mode 100644
index 0000000000..8ed9f67ff1
--- /dev/null
+++ b/components/net/sal_socket/impl/proto_mbedtls.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-11-12 ChenYong First version
+ */
+
+#include <rtthread.h>
+
+#ifdef RT_USING_DFS
+#include <dfs_posix.h>
+#endif
+
+#ifdef SAL_USING_TLS
+#include <sal_tls.h>
+#endif
+#include <netdb.h>
+#include <sal.h>
+
+#ifdef SAL_USING_TLS
+
+#if !defined(MBEDTLS_CONFIG_FILE)
+#include <mbedtls/config.h>
+#else
+#include MBEDTLS_CONFIG_FILE
+#endif
+
+#include <tls_certificate.h>
+#include <tls_client.h>
+
+#ifndef SAL_MEBDTLS_BUFFER_LEN
+#define SAL_MEBDTLS_BUFFER_LEN 1024
+#endif
+
+static void *mebdtls_socket(int socket)
+{
+ MbedTLSSession *session = RT_NULL;
+ char *pers = "mbedtls";
+
+ if (socket < 0)
+ {
+ return RT_NULL;
+ }
+
+ session = (MbedTLSSession *) tls_calloc(1, sizeof(MbedTLSSession));
+ if (session == RT_NULL)
+ {
+ return RT_NULL;
+ }
+
+ session->buffer_len = SAL_MEBDTLS_BUFFER_LEN;
+ session->buffer = tls_calloc(1, session->buffer_len);
+ if (session->buffer == RT_NULL)
+ {
+ tls_free(session);
+ session = RT_NULL;
+
+ return RT_NULL;
+ }
+
+ /* initialize TLS Client sesison */
+ if (mbedtls_client_init(session, (void *) pers, rt_strlen(pers)) != RT_EOK)
+ {
+ mbedtls_client_close(session);
+ return RT_NULL;
+ }
+ session->server_fd.fd = socket;
+
+ return (void *)session;
+}
+
+int mbedtls_net_send_cb(void *ctx, const unsigned char *buf, size_t len)
+{
+ struct sal_socket *sock;
+ int socket, ret;
+
+ RT_ASSERT(ctx);
+ RT_ASSERT(buf);
+
+ socket = ((mbedtls_net_context *) ctx)->fd;
+ sock = sal_get_socket(socket);
+ if (sock == RT_NULL)
+ {
+ return -1;
+ }
+
+ /* Register scoket sendto option to TLS send data callback */
+ ret = sock->ops->sendto((int) sock->user_data, (void *)buf, len, 0, RT_NULL, RT_NULL);
+ if (ret < 0)
+ {
+#ifdef RT_USING_DFS
+ if ((fcntl(socket, F_GETFL) & O_NONBLOCK) == O_NONBLOCK)
+ return MBEDTLS_ERR_SSL_WANT_WRITE;
+#endif
+ if (errno == ECONNRESET)
+ return MBEDTLS_ERR_NET_CONN_RESET;
+ if ( errno == EINTR)
+ return MBEDTLS_ERR_SSL_WANT_READ;
+
+ return MBEDTLS_ERR_NET_SEND_FAILED ;
+ }
+
+ return ret;
+}
+
+int mbedtls_net_recv_cb( void *ctx, unsigned char *buf, size_t len)
+{
+ struct sal_socket *sock;
+ int socket, ret;
+
+ RT_ASSERT(ctx);
+ RT_ASSERT(buf);
+
+ socket = ((mbedtls_net_context *) ctx)->fd;
+ sock = sal_get_socket(socket);
+ if (sock == RT_NULL)
+ {
+ return -1;
+ }
+
+ /* Register scoket recvfrom option to TLS recv data callback */
+ ret = sock->ops->recvfrom((int) sock->user_data, (void *)buf, len, 0, RT_NULL, RT_NULL);
+ if (ret < 0)
+ {
+#ifdef RT_USING_DFS
+ if ((fcntl(socket, F_GETFL) & O_NONBLOCK) == O_NONBLOCK)
+ return MBEDTLS_ERR_SSL_WANT_WRITE;
+#endif
+ if (errno == ECONNRESET)
+ return MBEDTLS_ERR_NET_CONN_RESET;
+ if ( errno == EINTR)
+ return MBEDTLS_ERR_SSL_WANT_READ;
+
+ return MBEDTLS_ERR_NET_RECV_FAILED ;
+ }
+
+ return ret;
+}
+
+static int mbedtls_connect(void *sock)
+{
+ MbedTLSSession *session = RT_NULL;
+ int ret = 0;
+
+ RT_ASSERT(sock);
+
+ session = (MbedTLSSession *) sock;
+
+ /* Set the SSL Configure infromation */
+ ret = mbedtls_client_context(session);
+ if (ret < 0)
+ {
+ goto __exit;
+ }
+
+ /* Set the underlying BIO callbacks for write, read and read-with-timeout. */
+ mbedtls_ssl_set_bio(&session->ssl, &session->server_fd, mbedtls_net_send_cb, mbedtls_net_recv_cb, RT_NULL);
+
+ while ((ret = mbedtls_ssl_handshake(&session->ssl)) != 0)
+ {
+ if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE)
+ {
+ goto __exit;
+ }
+ }
+
+ /* Return the result of the certificate verification */
+ ret = mbedtls_ssl_get_verify_result(&session->ssl);
+ if (ret != 0)
+ {
+ rt_memset(session->buffer, 0x00, session->buffer_len);
+ mbedtls_x509_crt_verify_info((char *)session->buffer, session->buffer_len, " ! ", ret);
+ goto __exit;
+ }
+
+ return ret;
+
+__exit:
+ if (session)
+ {
+ mbedtls_client_close(session);
+ }
+
+ return ret;
+}
+
+static int mbedtls_closesocket(void *sock)
+{
+ struct sal_socket *ssock;
+ int socket;
+
+ if (sock == RT_NULL)
+ {
+ return 0;
+ }
+
+ socket = ((MbedTLSSession *) sock)->server_fd.fd;
+ ssock = sal_get_socket(socket);
+ if (ssock == RT_NULL)
+ {
+ return -1;
+ }
+
+ /* Close TLS client session, and clean user-data in SAL socket */
+ mbedtls_client_close((MbedTLSSession *) sock);
+ ssock->user_data_tls = RT_NULL;
+
+ return 0;
+}
+
+static const struct sal_proto_tls_ops mbedtls_proto_ops=
+{
+ RT_NULL,
+ mebdtls_socket,
+ mbedtls_connect,
+ (int (*)(void *sock, const void *data, size_t size)) mbedtls_client_write,
+ (int (*)(void *sock, void *mem, size_t len)) mbedtls_client_read,
+ mbedtls_closesocket,
+};
+
+static const struct sal_proto_tls mbedtls_proto =
+{
+ "mbedtls",
+ &mbedtls_proto_ops,
+};
+
+int sal_mbedtls_proto_init(void)
+{
+ /* register MbedTLS protocol options to SAL */
+ sal_proto_tls_register(&mbedtls_proto);
+
+ return 0;
+}
+INIT_COMPONENT_EXPORT(sal_mbedtls_proto_init);
+
+#endif /* SAL_USING_TLS */