Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /**
  2.  * \file net_sockets.h
  3.  *
  4.  * \brief   Network sockets abstraction layer to integrate Mbed TLS into a
  5.  *          BSD-style sockets API.
  6.  *
  7.  *          The network sockets module provides an example integration of the
  8.  *          Mbed TLS library into a BSD sockets implementation. The module is
  9.  *          intended to be an example of how Mbed TLS can be integrated into a
  10.  *          networking stack, as well as to be Mbed TLS's network integration
  11.  *          for its supported platforms.
  12.  *
  13.  *          The module is intended only to be used with the Mbed TLS library and
  14.  *          is not intended to be used by third party application software
  15.  *          directly.
  16.  *
  17.  *          The supported platforms are as follows:
  18.  *              * Microsoft Windows and Windows CE
  19.  *              * POSIX/Unix platforms including Linux, OS X
  20.  *
  21.  */
  22. /*
  23.  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  24.  *  SPDX-License-Identifier: GPL-2.0
  25.  *
  26.  *  This program is free software; you can redistribute it and/or modify
  27.  *  it under the terms of the GNU General Public License as published by
  28.  *  the Free Software Foundation; either version 2 of the License, or
  29.  *  (at your option) any later version.
  30.  *
  31.  *  This program is distributed in the hope that it will be useful,
  32.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  33.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  34.  *  GNU General Public License for more details.
  35.  *
  36.  *  You should have received a copy of the GNU General Public License along
  37.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  38.  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  39.  *
  40.  *  This file is part of mbed TLS (https://tls.mbed.org)
  41.  */
  42. #ifndef MBEDTLS_NET_SOCKETS_H
  43. #define MBEDTLS_NET_SOCKETS_H
  44.  
  45. #if !defined(MBEDTLS_CONFIG_FILE)
  46. #include "config.h"
  47. #else
  48. #include MBEDTLS_CONFIG_FILE
  49. #endif
  50.  
  51. #include "ssl.h"
  52.  
  53. #include <stddef.h>
  54. #include <stdint.h>
  55.  
  56. #define MBEDTLS_ERR_NET_SOCKET_FAILED                     -0x0042  /**< Failed to open a socket. */
  57. #define MBEDTLS_ERR_NET_CONNECT_FAILED                    -0x0044  /**< The connection to the given server / port failed. */
  58. #define MBEDTLS_ERR_NET_BIND_FAILED                       -0x0046  /**< Binding of the socket failed. */
  59. #define MBEDTLS_ERR_NET_LISTEN_FAILED                     -0x0048  /**< Could not listen on the socket. */
  60. #define MBEDTLS_ERR_NET_ACCEPT_FAILED                     -0x004A  /**< Could not accept the incoming connection. */
  61. #define MBEDTLS_ERR_NET_RECV_FAILED                       -0x004C  /**< Reading information from the socket failed. */
  62. #define MBEDTLS_ERR_NET_SEND_FAILED                       -0x004E  /**< Sending information through the socket failed. */
  63. #define MBEDTLS_ERR_NET_CONN_RESET                        -0x0050  /**< Connection was reset by peer. */
  64. #define MBEDTLS_ERR_NET_UNKNOWN_HOST                      -0x0052  /**< Failed to get an IP address for the given hostname. */
  65. #define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL                  -0x0043  /**< Buffer is too small to hold the data. */
  66. #define MBEDTLS_ERR_NET_INVALID_CONTEXT                   -0x0045  /**< The context is invalid, eg because it was free()ed. */
  67. #define MBEDTLS_ERR_NET_POLL_FAILED                       -0x0047  /**< Polling the net context failed. */
  68. #define MBEDTLS_ERR_NET_BAD_INPUT_DATA                    -0x0049  /**< Input invalid. */
  69.  
  70. #define MBEDTLS_NET_LISTEN_BACKLOG         10 /**< The backlog that listen() should use. */
  71.  
  72. #define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */
  73. #define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */
  74.  
  75. #define MBEDTLS_NET_POLL_READ  1 /**< Used in \c mbedtls_net_poll to check for pending data  */
  76. #define MBEDTLS_NET_POLL_WRITE 2 /**< Used in \c mbedtls_net_poll to check if write possible */
  77.  
  78. #ifdef __cplusplus
  79. extern "C" {
  80. #endif
  81.  
  82. /**
  83.  * Wrapper type for sockets.
  84.  *
  85.  * Currently backed by just a file descriptor, but might be more in the future
  86.  * (eg two file descriptors for combined IPv4 + IPv6 support, or additional
  87.  * structures for hand-made UDP demultiplexing).
  88.  */
  89. typedef struct mbedtls_net_context
  90. {
  91.     int fd;             /**< The underlying file descriptor                 */
  92. }
  93. mbedtls_net_context;
  94.  
  95. /**
  96.  * \brief          Initialize a context
  97.  *                 Just makes the context ready to be used or freed safely.
  98.  *
  99.  * \param ctx      Context to initialize
  100.  */
  101. void mbedtls_net_init( mbedtls_net_context *ctx );
  102.  
  103. /**
  104.  * \brief          Initiate a connection with host:port in the given protocol
  105.  *
  106.  * \param ctx      Socket to use
  107.  * \param host     Host to connect to
  108.  * \param port     Port to connect to
  109.  * \param proto    Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP
  110.  *
  111.  * \return         0 if successful, or one of:
  112.  *                      MBEDTLS_ERR_NET_SOCKET_FAILED,
  113.  *                      MBEDTLS_ERR_NET_UNKNOWN_HOST,
  114.  *                      MBEDTLS_ERR_NET_CONNECT_FAILED
  115.  *
  116.  * \note           Sets the socket in connected mode even with UDP.
  117.  */
  118. int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto );
  119.  
  120. /**
  121.  * \brief          Create a receiving socket on bind_ip:port in the chosen
  122.  *                 protocol. If bind_ip == NULL, all interfaces are bound.
  123.  *
  124.  * \param ctx      Socket to use
  125.  * \param bind_ip  IP to bind to, can be NULL
  126.  * \param port     Port number to use
  127.  * \param proto    Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP
  128.  *
  129.  * \return         0 if successful, or one of:
  130.  *                      MBEDTLS_ERR_NET_SOCKET_FAILED,
  131.  *                      MBEDTLS_ERR_NET_BIND_FAILED,
  132.  *                      MBEDTLS_ERR_NET_LISTEN_FAILED
  133.  *
  134.  * \note           Regardless of the protocol, opens the sockets and binds it.
  135.  *                 In addition, make the socket listening if protocol is TCP.
  136.  */
  137. /*int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto );*/
  138.  
  139. /**
  140.  * \brief           Accept a connection from a remote client
  141.  *
  142.  * \param bind_ctx  Relevant socket
  143.  * \param client_ctx Will contain the connected client socket
  144.  * \param client_ip Will contain the client IP address, can be NULL
  145.  * \param buf_size  Size of the client_ip buffer
  146.  * \param ip_len    Will receive the size of the client IP written,
  147.  *                  can be NULL if client_ip is null
  148.  *
  149.  * \return          0 if successful, or
  150.  *                  MBEDTLS_ERR_NET_ACCEPT_FAILED, or
  151.  *                  MBEDTLS_ERR_NET_BUFFER_TOO_SMALL if buf_size is too small,
  152.  *                  MBEDTLS_ERR_SSL_WANT_READ if bind_fd was set to
  153.  *                  non-blocking and accept() would block.
  154.  */
  155. /*int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
  156.                         mbedtls_net_context *client_ctx,
  157.                         void *client_ip, size_t buf_size, size_t *ip_len );*/
  158.  
  159. /**
  160.  * \brief          Check and wait for the context to be ready for read/write
  161.  *
  162.  * \param ctx      Socket to check
  163.  * \param rw       Bitflag composed of MBEDTLS_NET_POLL_READ and
  164.  *                 MBEDTLS_NET_POLL_WRITE specifying the events
  165.  *                 to wait for:
  166.  *                 - If MBEDTLS_NET_POLL_READ is set, the function
  167.  *                   will return as soon as the net context is available
  168.  *                   for reading.
  169.  *                 - If MBEDTLS_NET_POLL_WRITE is set, the function
  170.  *                   will return as soon as the net context is available
  171.  *                   for writing.
  172.  * \param timeout  Maximal amount of time to wait before returning,
  173.  *                 in milliseconds. If \c timeout is zero, the
  174.  *                 function returns immediately. If \c timeout is
  175.  *                 -1u, the function blocks potentially indefinitely.
  176.  *
  177.  * \return         Bitmask composed of MBEDTLS_NET_POLL_READ/WRITE
  178.  *                 on success or timeout, or a negative return code otherwise.
  179.  */
  180. /*int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout );*/
  181.  
  182. /**
  183.  * \brief          Set the socket blocking
  184.  *
  185.  * \param ctx      Socket to set
  186.  *
  187.  * \return         0 if successful, or a non-zero error code
  188.  */
  189. /*int mbedtls_net_set_block( mbedtls_net_context *ctx );*/
  190.  
  191. /**
  192.  * \brief          Set the socket non-blocking
  193.  *
  194.  * \param ctx      Socket to set
  195.  *
  196.  * \return         0 if successful, or a non-zero error code
  197.  */
  198. /*int mbedtls_net_set_nonblock( mbedtls_net_context *ctx );*/
  199.  
  200. /**
  201.  * \brief          Portable usleep helper
  202.  *
  203.  * \param usec     Amount of microseconds to sleep
  204.  *
  205.  * \note           Real amount of time slept will not be less than
  206.  *                 select()'s timeout granularity (typically, 10ms).
  207.  */
  208. /*void mbedtls_net_usleep( unsigned long usec );*/
  209.  
  210. /**
  211.  * \brief          Read at most 'len' characters. If no error occurs,
  212.  *                 the actual amount read is returned.
  213.  *
  214.  * \param ctx      Socket
  215.  * \param buf      The buffer to write to
  216.  * \param len      Maximum length of the buffer
  217.  *
  218.  * \return         the number of bytes received,
  219.  *                 or a non-zero error code; with a non-blocking socket,
  220.  *                 MBEDTLS_ERR_SSL_WANT_READ indicates read() would block.
  221.  */
  222. int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len );
  223.  
  224. /**
  225.  * \brief          Write at most 'len' characters. If no error occurs,
  226.  *                 the actual amount read is returned.
  227.  *
  228.  * \param ctx      Socket
  229.  * \param buf      The buffer to read from
  230.  * \param len      The length of the buffer
  231.  *
  232.  * \return         the number of bytes sent,
  233.  *                 or a non-zero error code; with a non-blocking socket,
  234.  *                 MBEDTLS_ERR_SSL_WANT_WRITE indicates write() would block.
  235.  */
  236. int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len );
  237.  
  238. /**
  239.  * \brief          Read at most 'len' characters, blocking for at most
  240.  *                 'timeout' seconds. If no error occurs, the actual amount
  241.  *                 read is returned.
  242.  *
  243.  * \param ctx      Socket
  244.  * \param buf      The buffer to write to
  245.  * \param len      Maximum length of the buffer
  246.  * \param timeout  Maximum number of milliseconds to wait for data
  247.  *                 0 means no timeout (wait forever)
  248.  *
  249.  * \return         the number of bytes received,
  250.  *                 or a non-zero error code:
  251.  *                 MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out,
  252.  *                 MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal.
  253.  *
  254.  * \note           This function will block (until data becomes available or
  255.  *                 timeout is reached) even if the socket is set to
  256.  *                 non-blocking. Handling timeouts with non-blocking reads
  257.  *                 requires a different strategy.
  258.  */
  259. /*int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len,
  260.                       uint32_t timeout );*/
  261.  
  262. /**
  263.  * \brief          Gracefully shutdown the connection and free associated data
  264.  *
  265.  * \param ctx      The context to free
  266.  */
  267. void mbedtls_net_free( mbedtls_net_context *ctx );
  268.  
  269. #ifdef __cplusplus
  270. }
  271. #endif
  272.  
  273. #endif /* net_sockets.h */
  274.