Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**
  2.  * \file ssl.h
  3.  *
  4.  * \brief SSL/TLS functions.
  5.  *
  6.  *  Copyright (C) 2006-2012, Brainspark B.V.
  7.  *
  8.  *  This file is part of PolarSSL (http://www.polarssl.org)
  9.  *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
  10.  *
  11.  *  All rights reserved.
  12.  *
  13.  *  This program is free software; you can redistribute it and/or modify
  14.  *  it under the terms of the GNU General Public License as published by
  15.  *  the Free Software Foundation; either version 2 of the License, or
  16.  *  (at your option) any later version.
  17.  *
  18.  *  This program is distributed in the hope that it will be useful,
  19.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  *  GNU General Public License for more details.
  22.  *
  23.  *  You should have received a copy of the GNU General Public License along
  24.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  25.  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  26.  */
  27. #ifndef POLARSSL_SSL_H
  28. #define POLARSSL_SSL_H
  29.  
  30. #include <time.h>
  31.  
  32. #include "net.h"
  33. #include "rsa.h"
  34. #include "md5.h"
  35. #include "sha1.h"
  36. #include "sha2.h"
  37. #include "sha4.h"
  38. #include "x509.h"
  39. #include "config.h"
  40.  
  41. #if defined(POLARSSL_DHM_C)
  42. #include "dhm.h"
  43. #endif
  44.  
  45. #if defined(POLARSSL_ZLIB_SUPPORT)
  46. #include "zlib.h"
  47. #endif
  48.  
  49. #if defined(_MSC_VER) && !defined(inline)
  50. #define inline _inline
  51. #else
  52. #if defined(__ARMCC_VERSION) && !defined(inline)
  53. #define inline __inline
  54. #endif /* __ARMCC_VERSION */
  55. #endif /*_MSC_VER */
  56.  
  57. /*
  58.  * SSL Error codes
  59.  */
  60. #define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE               -0x7080  /**< The requested feature is not available. */
  61. #define POLARSSL_ERR_SSL_BAD_INPUT_DATA                    -0x7100  /**< Bad input parameters to function. */
  62. #define POLARSSL_ERR_SSL_INVALID_MAC                       -0x7180  /**< Verification of the message MAC failed. */
  63. #define POLARSSL_ERR_SSL_INVALID_RECORD                    -0x7200  /**< An invalid SSL record was received. */
  64. #define POLARSSL_ERR_SSL_CONN_EOF                          -0x7280  /**< The connection indicated an EOF. */
  65. #define POLARSSL_ERR_SSL_UNKNOWN_CIPHER                    -0x7300  /**< An unknown cipher was received. */
  66. #define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN                  -0x7380  /**< The server has no ciphersuites in common with the client. */
  67. #define POLARSSL_ERR_SSL_NO_SESSION_FOUND                  -0x7400  /**< No session to recover was found. */
  68. #define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE             -0x7480  /**< No client certification received from the client, but required by the authentication mode. */
  69. #define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE             -0x7500  /**< Our own certificate(s) is/are too large to send in an SSL message.*/
  70. #define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED              -0x7580  /**< The own certificate is not set, but needed by the server. */
  71. #define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED              -0x7600  /**< The own private key is not set, but needed. */
  72. #define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED                 -0x7680  /**< No CA Chain is set, but required to operate. */
  73. #define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE                -0x7700  /**< An unexpected message was received from our peer. */
  74. #define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE               -0x7780  /**< A fatal alert message was received from our peer. */
  75. #define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED                -0x7800  /**< Verification of our peer failed. */
  76. #define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY                 -0x7880  /**< The peer notified us that the connection is going to be closed. */
  77. #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO               -0x7900  /**< Processing of the ClientHello handshake message failed. */
  78. #define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO               -0x7980  /**< Processing of the ServerHello handshake message failed. */
  79. #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE                -0x7A00  /**< Processing of the Certificate handshake message failed. */
  80. #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST        -0x7A80  /**< Processing of the CertificateRequest handshake message failed. */
  81. #define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE        -0x7B00  /**< Processing of the ServerKeyExchange handshake message failed. */
  82. #define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE          -0x7B80  /**< Processing of the ServerHelloDone handshake message failed. */
  83. #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE        -0x7C00  /**< Processing of the ClientKeyExchange handshake message failed. */
  84. #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_RP -0x7C80  /**< Processing of the ClientKeyExchange handshake message failed in DHM Read Public. */
  85. #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_CS -0x7D00  /**< Processing of the ClientKeyExchange handshake message failed in DHM Calculate Secret. */
  86. #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY         -0x7D80  /**< Processing of the CertificateVerify handshake message failed. */
  87. #define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC         -0x7E00  /**< Processing of the ChangeCipherSpec handshake message failed. */
  88. #define POLARSSL_ERR_SSL_BAD_HS_FINISHED                   -0x7E80  /**< Processing of the Finished handshake message failed. */
  89. #define POLARSSL_ERR_SSL_MALLOC_FAILED                     -0x7F00  /**< Memory allocation failed */
  90. #define POLARSSL_ERR_SSL_HW_ACCEL_FAILED                   -0x7F80  /**< Hardware acceleration function returned with error */
  91. #define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH              -0x6F80  /**< Hardware acceleration function skipped / left alone data */
  92. #define POLARSSL_ERR_SSL_COMPRESSION_FAILED                -0x6F00  /**< Processing of the compression / decompression failed */
  93. #define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION           -0x6E80  /**< Handshake protocol not within min/max boundaries */
  94.  
  95. /*
  96.  * Various constants
  97.  */
  98. #define SSL_MAJOR_VERSION_3             3
  99. #define SSL_MINOR_VERSION_0             0   /*!< SSL v3.0 */
  100. #define SSL_MINOR_VERSION_1             1   /*!< TLS v1.0 */
  101. #define SSL_MINOR_VERSION_2             2   /*!< TLS v1.1 */
  102. #define SSL_MINOR_VERSION_3             3   /*!< TLS v1.2 */
  103.  
  104. #define SSL_IS_CLIENT                   0
  105. #define SSL_IS_SERVER                   1
  106. #define SSL_COMPRESS_NULL               0
  107. #define SSL_COMPRESS_DEFLATE            1
  108.  
  109. #define SSL_VERIFY_NONE                 0
  110. #define SSL_VERIFY_OPTIONAL             1
  111. #define SSL_VERIFY_REQUIRED             2
  112.  
  113. #define SSL_INITIAL_HANDSHAKE           0
  114. #define SSL_RENEGOTIATION               1
  115.  
  116. #define SSL_LEGACY_RENEGOTIATION        0
  117. #define SSL_SECURE_RENEGOTIATION        1
  118.  
  119. #define SSL_RENEGOTIATION_DISABLED      0
  120. #define SSL_RENEGOTIATION_ENABLED       1
  121.  
  122. #define SSL_LEGACY_NO_RENEGOTIATION     0
  123. #define SSL_LEGACY_ALLOW_RENEGOTIATION  1
  124. #define SSL_LEGACY_BREAK_HANDSHAKE      2
  125.  
  126. #define SSL_MAX_CONTENT_LEN         16384
  127.  
  128. /*
  129.  * Allow an extra 512 bytes for the record header
  130.  * and encryption overhead (counter + MAC + padding)
  131.  * and allow for a maximum of 1024 of compression expansion if
  132.  * enabled.
  133.  */
  134. #if defined(POLARSSL_ZLIB_SUPPORT)
  135. #define SSL_COMPRESSION_ADD          1024
  136. #else
  137. #define SSL_COMPRESSION_ADD             0
  138. #endif
  139.  
  140. #define SSL_BUFFER_LEN (SSL_MAX_CONTENT_LEN + SSL_COMPRESSION_ADD + 512)
  141.  
  142. /*
  143.  * Supported ciphersuites (Official IANA names)
  144.  */
  145. #define TLS_RSA_WITH_NULL_MD5                    0x01   /**< Weak! */
  146. #define TLS_RSA_WITH_NULL_SHA                    0x02   /**< Weak! */
  147. #define TLS_RSA_WITH_NULL_SHA256                 0x3B   /**< Weak! */
  148. #define TLS_RSA_WITH_DES_CBC_SHA                 0x09   /**< Weak! Not in TLS 1.2 */
  149. #define TLS_DHE_RSA_WITH_DES_CBC_SHA             0x15   /**< Weak! Not in TLS 1.2 */
  150.  
  151. #define TLS_RSA_WITH_RC4_128_MD5                 0x04
  152. #define TLS_RSA_WITH_RC4_128_SHA                 0x05
  153.  
  154. #define TLS_RSA_WITH_3DES_EDE_CBC_SHA            0x0A
  155. #define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA        0x16
  156.  
  157. #define TLS_RSA_WITH_AES_128_CBC_SHA             0x2F
  158. #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA         0x33
  159. #define TLS_RSA_WITH_AES_256_CBC_SHA             0x35
  160. #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA         0x39
  161. #define TLS_RSA_WITH_AES_128_CBC_SHA256          0x3C   /**< TLS 1.2 */
  162. #define TLS_RSA_WITH_AES_256_CBC_SHA256          0x3D   /**< TLS 1.2 */
  163. #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256      0x67   /**< TLS 1.2 */
  164. #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256      0x6B   /**< TLS 1.2 */
  165.  
  166. #define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA        0x41
  167. #define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA    0x45
  168. #define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA        0x84
  169. #define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA    0x88
  170. #define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256     0xBA   /**< TLS 1.2 */
  171. #define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE   /**< TLS 1.2 */
  172. #define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256     0xC0   /**< TLS 1.2 */
  173. #define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4   /**< TLS 1.2 */
  174.  
  175. #define TLS_RSA_WITH_AES_128_GCM_SHA256          0x9C
  176. #define TLS_RSA_WITH_AES_256_GCM_SHA384          0x9D
  177. #define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256      0x9E
  178. #define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384      0x9F
  179.  
  180. #define SSL_EMPTY_RENEGOTIATION_INFO    0xFF   /**< renegotiation info ext */
  181.  
  182. /*
  183.  * Supported Signature and Hash algorithms (For TLS 1.2)
  184.  */
  185. #define SSL_HASH_NONE                0
  186. #define SSL_HASH_MD5                 1
  187. #define SSL_HASH_SHA1                2
  188. #define SSL_HASH_SHA224              3
  189. #define SSL_HASH_SHA256              4
  190. #define SSL_HASH_SHA384              5
  191. #define SSL_HASH_SHA512              6
  192.  
  193. #define SSL_SIG_RSA                  1
  194.  
  195. /*
  196.  * Client Certificate Types
  197.  */
  198. #define SSL_CERT_TYPE_RSA_SIGN       1
  199.  
  200. /*
  201.  * Message, alert and handshake types
  202.  */
  203. #define SSL_MSG_CHANGE_CIPHER_SPEC     20
  204. #define SSL_MSG_ALERT                  21
  205. #define SSL_MSG_HANDSHAKE              22
  206. #define SSL_MSG_APPLICATION_DATA       23
  207.  
  208. #define SSL_ALERT_LEVEL_WARNING         1
  209. #define SSL_ALERT_LEVEL_FATAL           2
  210.  
  211. #define SSL_ALERT_MSG_CLOSE_NOTIFY           0  /* 0x00 */
  212. #define SSL_ALERT_MSG_UNEXPECTED_MESSAGE    10  /* 0x0A */
  213. #define SSL_ALERT_MSG_BAD_RECORD_MAC        20  /* 0x14 */
  214. #define SSL_ALERT_MSG_DECRYPTION_FAILED     21  /* 0x15 */
  215. #define SSL_ALERT_MSG_RECORD_OVERFLOW       22  /* 0x16 */
  216. #define SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30  /* 0x1E */
  217. #define SSL_ALERT_MSG_HANDSHAKE_FAILURE     40  /* 0x28 */
  218. #define SSL_ALERT_MSG_NO_CERT               41  /* 0x29 */
  219. #define SSL_ALERT_MSG_BAD_CERT              42  /* 0x2A */
  220. #define SSL_ALERT_MSG_UNSUPPORTED_CERT      43  /* 0x2B */
  221. #define SSL_ALERT_MSG_CERT_REVOKED          44  /* 0x2C */
  222. #define SSL_ALERT_MSG_CERT_EXPIRED          45  /* 0x2D */
  223. #define SSL_ALERT_MSG_CERT_UNKNOWN          46  /* 0x2E */
  224. #define SSL_ALERT_MSG_ILLEGAL_PARAMETER     47  /* 0x2F */
  225. #define SSL_ALERT_MSG_UNKNOWN_CA            48  /* 0x30 */
  226. #define SSL_ALERT_MSG_ACCESS_DENIED         49  /* 0x31 */
  227. #define SSL_ALERT_MSG_DECODE_ERROR          50  /* 0x32 */
  228. #define SSL_ALERT_MSG_DECRYPT_ERROR         51  /* 0x33 */
  229. #define SSL_ALERT_MSG_EXPORT_RESTRICTION    60  /* 0x3C */
  230. #define SSL_ALERT_MSG_PROTOCOL_VERSION      70  /* 0x46 */
  231. #define SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71  /* 0x47 */
  232. #define SSL_ALERT_MSG_INTERNAL_ERROR        80  /* 0x50 */
  233. #define SSL_ALERT_MSG_USER_CANCELED         90  /* 0x5A */
  234. #define SSL_ALERT_MSG_NO_RENEGOTIATION     100  /* 0x64 */
  235. #define SSL_ALERT_MSG_UNSUPPORTED_EXT      110  /* 0x6E */
  236. #define SSL_ALERT_MSG_UNRECOGNIZED_NAME    112  /* 0x70 */
  237.  
  238. #define SSL_HS_HELLO_REQUEST            0
  239. #define SSL_HS_CLIENT_HELLO             1
  240. #define SSL_HS_SERVER_HELLO             2
  241. #define SSL_HS_CERTIFICATE             11
  242. #define SSL_HS_SERVER_KEY_EXCHANGE     12
  243. #define SSL_HS_CERTIFICATE_REQUEST     13
  244. #define SSL_HS_SERVER_HELLO_DONE       14
  245. #define SSL_HS_CERTIFICATE_VERIFY      15
  246. #define SSL_HS_CLIENT_KEY_EXCHANGE     16
  247. #define SSL_HS_FINISHED                20
  248.  
  249. /*
  250.  * TLS extensions
  251.  */
  252. #define TLS_EXT_SERVERNAME              0
  253. #define TLS_EXT_SERVERNAME_HOSTNAME     0
  254.  
  255. #define TLS_EXT_SIG_ALG                13
  256.  
  257. #define TLS_EXT_RENEGOTIATION_INFO 0xFF01
  258.  
  259.  
  260. /*
  261.  * Generic function pointers for allowing external RSA private key
  262.  * implementations.
  263.  */
  264. typedef int (*rsa_decrypt_func)( void *ctx, int mode, size_t *olen,
  265.                         const unsigned char *input, unsigned char *output,
  266.                         size_t output_max_len );
  267. typedef int (*rsa_sign_func)( void *ctx,
  268.                      int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
  269.                      int mode, int hash_id, unsigned int hashlen,
  270.                      const unsigned char *hash, unsigned char *sig );
  271. typedef size_t (*rsa_key_len_func)( void *ctx );
  272.  
  273. /*
  274.  * SSL state machine
  275.  */
  276. typedef enum
  277. {
  278.     SSL_HELLO_REQUEST,
  279.     SSL_CLIENT_HELLO,
  280.     SSL_SERVER_HELLO,
  281.     SSL_SERVER_CERTIFICATE,
  282.     SSL_SERVER_KEY_EXCHANGE,
  283.     SSL_CERTIFICATE_REQUEST,
  284.     SSL_SERVER_HELLO_DONE,
  285.     SSL_CLIENT_CERTIFICATE,
  286.     SSL_CLIENT_KEY_EXCHANGE,
  287.     SSL_CERTIFICATE_VERIFY,
  288.     SSL_CLIENT_CHANGE_CIPHER_SPEC,
  289.     SSL_CLIENT_FINISHED,
  290.     SSL_SERVER_CHANGE_CIPHER_SPEC,
  291.     SSL_SERVER_FINISHED,
  292.     SSL_FLUSH_BUFFERS,
  293.     SSL_HANDSHAKE_WRAPUP,
  294.     SSL_HANDSHAKE_OVER
  295. }
  296. ssl_states;
  297.  
  298. typedef struct _ssl_session ssl_session;
  299. typedef struct _ssl_context ssl_context;
  300. typedef struct _ssl_transform ssl_transform;
  301. typedef struct _ssl_handshake_params ssl_handshake_params;
  302.  
  303. /*
  304.  * This structure is used for storing current session data.
  305.  */
  306. struct _ssl_session
  307. {
  308.     time_t start;               /*!< starting time      */
  309.     int ciphersuite;            /*!< chosen ciphersuite */
  310.     int compression;            /*!< chosen compression */
  311.     size_t length;              /*!< session id length  */
  312.     unsigned char id[32];       /*!< session identifier */
  313.     unsigned char master[48];   /*!< the master secret  */
  314.     x509_cert *peer_cert;       /*!< peer X.509 cert chain */
  315. };
  316.  
  317. /*
  318.  * This structure contains a full set of runtime transform parameters
  319.  * either in negotiation or active.
  320.  */
  321. struct _ssl_transform
  322. {
  323.     /*
  324.      * Session specific crypto layer
  325.      */
  326.     unsigned int keylen;                /*!<  symmetric key length    */
  327.     size_t minlen;                      /*!<  min. ciphertext length  */
  328.     size_t ivlen;                       /*!<  IV length               */
  329.     size_t fixed_ivlen;                 /*!<  Fixed part of IV (AEAD) */
  330.     size_t maclen;                      /*!<  MAC length              */
  331.  
  332.     unsigned char iv_enc[16];           /*!<  IV (encryption)         */
  333.     unsigned char iv_dec[16];           /*!<  IV (decryption)         */
  334.  
  335.     unsigned char mac_enc[32];          /*!<  MAC (encryption)        */
  336.     unsigned char mac_dec[32];          /*!<  MAC (decryption)        */
  337.  
  338.     uint32_t ctx_enc[136];              /*!<  encryption context      */
  339.     uint32_t ctx_dec[136];              /*!<  decryption context      */
  340.  
  341.     /*
  342.      * Session specific compression layer
  343.      */
  344. #if defined(POLARSSL_ZLIB_SUPPORT)
  345.     z_stream ctx_deflate;               /*!<  compression context     */
  346.     z_stream ctx_inflate;               /*!<  decompression context   */
  347. #endif
  348. };
  349.  
  350. /*
  351.  * This structure contains the parameters only needed during handshake.
  352.  */
  353. struct _ssl_handshake_params
  354. {
  355.     /*
  356.      * Handshake specific crypto variables
  357.      */
  358.     int sig_alg;                        /*!<  Signature algorithm     */
  359.     int cert_type;                      /*!<  Requested cert type     */
  360.     int verify_sig_alg;                 /*!<  Signature algorithm for verify */
  361. #if defined(POLARSSL_DHM_C)
  362.     dhm_context dhm_ctx;                /*!<  DHM key exchange        */
  363. #endif
  364.  
  365.     /*
  366.      * Checksum contexts
  367.      */
  368.      md5_context fin_md5;
  369.     sha1_context fin_sha1;
  370.     sha2_context fin_sha2;
  371.     sha4_context fin_sha4;
  372.  
  373.     void (*update_checksum)(ssl_context *, unsigned char *, size_t);
  374.     void (*calc_verify)(ssl_context *, unsigned char *);
  375.     void (*calc_finished)(ssl_context *, unsigned char *, int);
  376.     int  (*tls_prf)(unsigned char *, size_t, char *,
  377.                     unsigned char *, size_t,
  378.                     unsigned char *, size_t);
  379.  
  380.     size_t pmslen;                      /*!<  premaster length        */
  381.  
  382.     unsigned char randbytes[64];        /*!<  random bytes            */
  383.     unsigned char premaster[POLARSSL_MPI_MAX_SIZE];
  384.                                         /*!<  premaster secret        */
  385.  
  386.     int resume;                         /*!<  session resume indicator*/
  387. };
  388.  
  389. struct _ssl_context
  390. {
  391.     /*
  392.      * Miscellaneous
  393.      */
  394.     int state;                  /*!< SSL handshake: current state     */
  395.     int renegotiation;          /*!< Initial or renegotiation         */
  396.  
  397.     int major_ver;              /*!< equal to  SSL_MAJOR_VERSION_3    */
  398.     int minor_ver;              /*!< either 0 (SSL3) or 1 (TLS1.0)    */
  399.  
  400.     int max_major_ver;          /*!< max. major version from client   */
  401.     int max_minor_ver;          /*!< max. minor version from client   */
  402.     int min_major_ver;          /*!< min. major version accepted      */
  403.     int min_minor_ver;          /*!< min. minor version accepted      */
  404.  
  405.     /*
  406.      * Callbacks (RNG, debug, I/O, verification)
  407.      */
  408.     int  (*f_rng)(void *, unsigned char *, size_t);
  409.     void (*f_dbg)(void *, int, const char *);
  410.     int (*f_recv)(void *, unsigned char *, size_t);
  411.     int (*f_send)(void *, const unsigned char *, size_t);
  412.     int (*f_vrfy)(void *, x509_cert *, int, int *);
  413.     int (*f_get_cache)(void *, ssl_session *);
  414.     int (*f_set_cache)(void *, const ssl_session *);
  415.     int (*f_sni)(void *, ssl_context *, const unsigned char *, size_t);
  416.  
  417.     void *p_rng;                /*!< context for the RNG function     */
  418.     void *p_dbg;                /*!< context for the debug function   */
  419.     void *p_recv;               /*!< context for reading operations   */
  420.     void *p_send;               /*!< context for writing operations   */
  421.     void *p_vrfy;               /*!< context for verification         */
  422.     void *p_get_cache;          /*!< context for cache retrieval      */
  423.     void *p_set_cache;          /*!< context for cache store          */
  424.     void *p_sni;                /*!< context for SNI extension        */
  425.     void *p_hw_data;            /*!< context for HW acceleration      */
  426.  
  427.     /*
  428.      * Session layer
  429.      */
  430.     ssl_session *session_in;            /*!<  current session data (in)   */
  431.     ssl_session *session_out;           /*!<  current session data (out)  */
  432.     ssl_session *session;               /*!<  negotiated session data     */
  433.     ssl_session *session_negotiate;     /*!<  session data in negotiation */
  434.  
  435.     ssl_handshake_params *handshake;    /*!<  params required only during
  436.                                               the handshake process        */
  437.  
  438.     /*
  439.      * Record layer transformations
  440.      */
  441.     ssl_transform *transform_in;        /*!<  current transform params (in)   */
  442.     ssl_transform *transform_out;       /*!<  current transform params (in)   */
  443.     ssl_transform *transform;           /*!<  negotiated transform params     */
  444.     ssl_transform *transform_negotiate; /*!<  transform params in negotiation */
  445.  
  446.     /*
  447.      * Record layer (incoming data)
  448.      */
  449.     unsigned char *in_ctr;      /*!< 64-bit incoming message counter  */
  450.     unsigned char *in_hdr;      /*!< 5-byte record header (in_ctr+8)  */
  451.     unsigned char *in_msg;      /*!< the message contents (in_hdr+5)  */
  452.     unsigned char *in_offt;     /*!< read offset in application data  */
  453.  
  454.     int in_msgtype;             /*!< record header: message type      */
  455.     size_t in_msglen;           /*!< record header: message length    */
  456.     size_t in_left;             /*!< amount of data read so far       */
  457.  
  458.     size_t in_hslen;            /*!< current handshake message length */
  459.     int nb_zero;                /*!< # of 0-length encrypted messages */
  460.  
  461.     /*
  462.      * Record layer (outgoing data)
  463.      */
  464.     unsigned char *out_ctr;     /*!< 64-bit outgoing message counter  */
  465.     unsigned char *out_hdr;     /*!< 5-byte record header (out_ctr+8) */
  466.     unsigned char *out_msg;     /*!< the message contents (out_hdr+32)*/
  467.  
  468.     int out_msgtype;            /*!< record header: message type      */
  469.     size_t out_msglen;          /*!< record header: message length    */
  470.     size_t out_left;            /*!< amount of data not yet written   */
  471.  
  472.     /*
  473.      * PKI layer
  474.      */
  475.     void *rsa_key;                      /*!<  own RSA private key     */
  476.     rsa_decrypt_func rsa_decrypt;       /*!<  function for RSA decrypt*/
  477.     rsa_sign_func rsa_sign;             /*!<  function for RSA sign   */
  478.     rsa_key_len_func rsa_key_len;       /*!<  function for RSA key len*/
  479.  
  480.     x509_cert *own_cert;                /*!<  own X.509 certificate   */
  481.     x509_cert *ca_chain;                /*!<  own trusted CA chain    */
  482.     x509_crl *ca_crl;                   /*!<  trusted CA CRLs         */
  483.     const char *peer_cn;                /*!<  expected peer CN        */
  484.  
  485.     /*
  486.      * User settings
  487.      */
  488.     int endpoint;                       /*!<  0: client, 1: server    */
  489.     int authmode;                       /*!<  verification mode       */
  490.     int client_auth;                    /*!<  flag for client auth.   */
  491.     int verify_result;                  /*!<  verification result     */
  492.     int disable_renegotiation;          /*!<  enable/disable renegotiation   */
  493.     int allow_legacy_renegotiation;     /*!<  allow legacy renegotiation     */
  494.     const int *ciphersuites;            /*!<  allowed ciphersuites    */
  495.  
  496. #if defined(POLARSSL_DHM_C)
  497.     mpi dhm_P;                          /*!<  prime modulus for DHM   */
  498.     mpi dhm_G;                          /*!<  generator for DHM       */
  499. #endif
  500.  
  501.     /*
  502.      * TLS extensions
  503.      */
  504.     unsigned char *hostname;
  505.     size_t         hostname_len;
  506.  
  507.     /*
  508.      * Secure renegotiation
  509.      */
  510.     int secure_renegotiation;           /*!<  does peer support legacy or
  511.                                               secure renegotiation           */
  512.     size_t verify_data_len;             /*!<  length of verify data stored   */
  513.     char own_verify_data[36];           /*!<  previous handshake verify data */
  514.     char peer_verify_data[36];          /*!<  previous handshake verify data */
  515. };
  516.  
  517. #ifdef __cplusplus
  518. extern "C" {
  519. #endif
  520.  
  521. extern const int ssl_default_ciphersuites[];
  522.  
  523. #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
  524. extern int (*ssl_hw_record_init)(ssl_context *ssl,
  525.                 const unsigned char *key_enc, const unsigned char *key_dec,
  526.                 const unsigned char *iv_enc,  const unsigned char *iv_dec,
  527.                 const unsigned char *mac_enc, const unsigned char *mac_dec);
  528. extern int (*ssl_hw_record_reset)(ssl_context *ssl);
  529. extern int (*ssl_hw_record_write)(ssl_context *ssl);
  530. extern int (*ssl_hw_record_read)(ssl_context *ssl);
  531. extern int (*ssl_hw_record_finish)(ssl_context *ssl);
  532. #endif
  533.  
  534. /**
  535.  * \brief Returns the list of ciphersuites supported by the SSL/TLS module.
  536.  *
  537.  * \return              a statically allocated array of ciphersuites, the last
  538.  *                      entry is 0.
  539.  */
  540. static inline const int *ssl_list_ciphersuites( void )
  541. {
  542.     return ssl_default_ciphersuites;
  543. }
  544.  
  545. /**
  546.  * \brief               Return the name of the ciphersuite associated with the given
  547.  *                      ID
  548.  *
  549.  * \param ciphersuite_id SSL ciphersuite ID
  550.  *
  551.  * \return              a string containing the ciphersuite name
  552.  */
  553. const char *ssl_get_ciphersuite_name( const int ciphersuite_id );
  554.  
  555. /**
  556.  * \brief               Return the ID of the ciphersuite associated with the given
  557.  *                      name
  558.  *
  559.  * \param ciphersuite_name SSL ciphersuite name
  560.  *
  561.  * \return              the ID with the ciphersuite or 0 if not found
  562.  */
  563. int ssl_get_ciphersuite_id( const char *ciphersuite_name );
  564.  
  565. /**
  566.  * \brief          Initialize an SSL context
  567.  *
  568.  * \param ssl      SSL context
  569.  *
  570.  * \return         0 if successful, or POLARSSL_ERR_SSL_MALLOC_FAILED if
  571.  *                 memory allocation failed
  572.  */
  573. int ssl_init( ssl_context *ssl );
  574.  
  575. /**
  576.  * \brief          Reset an already initialized SSL context for re-use
  577.  *                 while retaining application-set variables, function
  578.  *                 pointers and data.
  579.  *
  580.  * \param ssl      SSL context
  581.  * \return         0 if successful, or POLASSL_ERR_SSL_MALLOC_FAILED,
  582.                    POLARSSL_ERR_SSL_HW_ACCEL_FAILED or
  583.  *                 POLARSSL_ERR_SSL_COMPRESSION_FAILED
  584.  */
  585. int ssl_session_reset( ssl_context *ssl );
  586.  
  587. /**
  588.  * \brief          Set the current endpoint type
  589.  *
  590.  * \param ssl      SSL context
  591.  * \param endpoint must be SSL_IS_CLIENT or SSL_IS_SERVER
  592.  */
  593. void ssl_set_endpoint( ssl_context *ssl, int endpoint );
  594.  
  595. /**
  596.  * \brief          Set the certificate verification mode
  597.  *
  598.  * \param ssl      SSL context
  599.  * \param authmode can be:
  600.  *
  601.  *  SSL_VERIFY_NONE:      peer certificate is not checked (default),
  602.  *                        this is insecure and SHOULD be avoided.
  603.  *
  604.  *  SSL_VERIFY_OPTIONAL:  peer certificate is checked, however the
  605.  *                        handshake continues even if verification failed;
  606.  *                        ssl_get_verify_result() can be called after the
  607.  *                        handshake is complete.
  608.  *
  609.  *  SSL_VERIFY_REQUIRED:  peer *must* present a valid certificate,
  610.  *                        handshake is aborted if verification failed.
  611.  */
  612. void ssl_set_authmode( ssl_context *ssl, int authmode );
  613.  
  614. /**
  615.  * \brief          Set the verification callback (Optional).
  616.  *
  617.  *                 If set, the verify callback is called for each
  618.  *                 certificate in the chain. For implementation
  619.  *                 information, please see \c x509parse_verify()
  620.  *
  621.  * \param ssl      SSL context
  622.  * \param f_vrfy   verification function
  623.  * \param p_vrfy   verification parameter
  624.  */
  625. void ssl_set_verify( ssl_context *ssl,
  626.                      int (*f_vrfy)(void *, x509_cert *, int, int *),
  627.                      void *p_vrfy );
  628.  
  629. /**
  630.  * \brief          Set the random number generator callback
  631.  *
  632.  * \param ssl      SSL context
  633.  * \param f_rng    RNG function
  634.  * \param p_rng    RNG parameter
  635.  */
  636. void ssl_set_rng( ssl_context *ssl,
  637.                   int (*f_rng)(void *, unsigned char *, size_t),
  638.                   void *p_rng );
  639.  
  640. /**
  641.  * \brief          Set the debug callback
  642.  *
  643.  * \param ssl      SSL context
  644.  * \param f_dbg    debug function
  645.  * \param p_dbg    debug parameter
  646.  */
  647. void ssl_set_dbg( ssl_context *ssl,
  648.                   void (*f_dbg)(void *, int, const char *),
  649.                   void  *p_dbg );
  650.  
  651. /**
  652.  * \brief          Set the underlying BIO read and write callbacks
  653.  *
  654.  * \param ssl      SSL context
  655.  * \param f_recv   read callback
  656.  * \param p_recv   read parameter
  657.  * \param f_send   write callback
  658.  * \param p_send   write parameter
  659.  */
  660. void ssl_set_bio( ssl_context *ssl,
  661.         int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
  662.         int (*f_send)(void *, const unsigned char *, size_t), void *p_send );
  663.  
  664. /**
  665.  * \brief          Set the session cache callbacks (server-side only)
  666.  *                 If not set, no session resuming is done.
  667.  *
  668.  *                 The session cache has the responsibility to check for stale
  669.  *                 entries based on timeout. See RFC 5246 for recommendations.
  670.  *
  671.  *                 Warning: session.peer_cert is cleared by the SSL/TLS layer on
  672.  *                 connection shutdown, so do not cache the pointer! Either set
  673.  *                 it to NULL or make a full copy of the certificate.
  674.  *
  675.  *                 The get callback is called once during the initial handshake
  676.  *                 to enable session resuming. The get function has the
  677.  *                 following parameters: (void *parameter, ssl_session *session)
  678.  *                 If a valid entry is found, it should fill the master of
  679.  *                 the session object with the cached values and return 0,
  680.  *                 return 1 otherwise. Optionally peer_cert can be set as well
  681.  *                 if it is properly present in cache entry.
  682.  *
  683.  *                 The set callback is called once during the initial handshake
  684.  *                 to enable session resuming after the entire handshake has
  685.  *                 been finished. The set function has the following parameters:
  686.  *                 (void *parameter, const ssl_session *session). The function
  687.  *                 should create a cache entry for future retrieval based on
  688.  *                 the data in the session structure and should keep in mind
  689.  *                 that the ssl_session object presented (and all its referenced
  690.  *                 data) is cleared by the SSL/TLS layer when the connection is
  691.  *                 terminated. It is recommended to add metadata to determine if
  692.  *                 an entry is still valid in the future. Return 0 if
  693.  *                 successfully cached, return 1 otherwise.
  694.  *
  695.  * \param ssl            SSL context
  696.  * \param f_get_cache    session get callback
  697.  * \param p_get_cache    session get parameter
  698.  * \param f_set_cache    session set callback
  699.  * \param p_set_cache    session set parameter
  700.  */
  701. void ssl_set_session_cache( ssl_context *ssl,
  702.         int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
  703.         int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache );
  704.  
  705. /**
  706.  * \brief          Request resumption of session (client-side only)
  707.  *                 Session data is copied from presented session structure.
  708.  *
  709.  *                 Warning: session.peer_cert is cleared by the SSL/TLS layer on
  710.  *                 connection shutdown, so do not cache the pointer! Either set
  711.  *                 it to NULL or make a full copy of the certificate when
  712.  *                 storing the session for use in this function.
  713.  *
  714.  * \param ssl      SSL context
  715.  * \param session  session context
  716.  */
  717. void ssl_set_session( ssl_context *ssl, const ssl_session *session );
  718.  
  719. /**
  720.  * \brief               Set the list of allowed ciphersuites
  721.  *
  722.  * \param ssl           SSL context
  723.  * \param ciphersuites  0-terminated list of allowed ciphersuites
  724.  */
  725. void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites );
  726.  
  727. /**
  728.  * \brief          Set the data required to verify peer certificate
  729.  *
  730.  * \param ssl      SSL context
  731.  * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs)
  732.  * \param ca_crl   trusted CA CRLs
  733.  * \param peer_cn  expected peer CommonName (or NULL)
  734.  */
  735. void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
  736.                        x509_crl *ca_crl, const char *peer_cn );
  737.  
  738. /**
  739.  * \brief          Set own certificate chain and private key
  740.  *
  741.  *                 Note: own_cert should contain IN order from the bottom
  742.  *                 up your certificate chain. The top certificate (self-signed)
  743.  *                 can be omitted.
  744.  *
  745.  * \param ssl      SSL context
  746.  * \param own_cert own public certificate chain
  747.  * \param rsa_key  own private RSA key
  748.  */
  749. void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
  750.                        rsa_context *rsa_key );
  751.  
  752. /**
  753.  * \brief          Set own certificate and alternate non-PolarSSL private
  754.  *                 key and handling callbacks, such as the PKCS#11 wrappers
  755.  *                 or any other external private key handler.
  756.  *                 (see the respective RSA functions in rsa.h for documentation
  757.  *                 of the callback parameters, with the only change being
  758.  *                 that the rsa_context * is a void * in the callbacks)
  759.  *
  760.  *                 Note: own_cert should contain IN order from the bottom
  761.  *                 up your certificate chain. The top certificate (self-signed)
  762.  *                 can be omitted.
  763.  *
  764.  * \param ssl      SSL context
  765.  * \param own_cert own public certificate chain
  766.  * \param rsa_key  alternate implementation private RSA key
  767.  * \param rsa_decrypt_func  alternate implementation of \c rsa_pkcs1_decrypt()
  768.  * \param rsa_sign_func     alternate implementation of \c rsa_pkcs1_sign()
  769.  * \param rsa_key_len_func  function returning length of RSA key in bytes
  770.  */
  771. void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
  772.                            void *rsa_key,
  773.                            rsa_decrypt_func rsa_decrypt,
  774.                            rsa_sign_func rsa_sign,
  775.                            rsa_key_len_func rsa_key_len );
  776.  
  777. #if defined(POLARSSL_DHM_C)
  778. /**
  779.  * \brief          Set the Diffie-Hellman public P and G values,
  780.  *                 read as hexadecimal strings (server-side only)
  781.  *                 (Default: POLARSSL_DHM_RFC5114_MODP_1024_[PG])
  782.  *
  783.  * \param ssl      SSL context
  784.  * \param dhm_P    Diffie-Hellman-Merkle modulus
  785.  * \param dhm_G    Diffie-Hellman-Merkle generator
  786.  *
  787.  * \return         0 if successful
  788.  */
  789. int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G );
  790.  
  791. /**
  792.  * \brief          Set the Diffie-Hellman public P and G values,
  793.  *                 read from existing context (server-side only)
  794.  *
  795.  * \param ssl      SSL context
  796.  * \param dhm_ctx  Diffie-Hellman-Merkle context
  797.  *
  798.  * \return         0 if successful
  799.  */
  800. int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx );
  801. #endif
  802.  
  803. /**
  804.  * \brief          Set hostname for ServerName TLS extension
  805.  *                 (client-side only)
  806.  *                
  807.  *
  808.  * \param ssl      SSL context
  809.  * \param hostname the server hostname
  810.  *
  811.  * \return         0 if successful or POLARSSL_ERR_SSL_MALLOC_FAILED
  812.  */
  813. int ssl_set_hostname( ssl_context *ssl, const char *hostname );
  814.  
  815. /**
  816.  * \brief          Set server side ServerName TLS extension callback
  817.  *                 (optional, server-side only).
  818.  *
  819.  *                 If set, the ServerName callback is called whenever the
  820.  *                 server receives a ServerName TLS extension from the client
  821.  *                 during a handshake. The ServerName callback has the
  822.  *                 following parameters: (void *parameter, ssl_context *ssl,
  823.  *                 const unsigned char *hostname, size_t len). If a suitable
  824.  *                 certificate is found, the callback should set the
  825.  *                 certificate and key to use with ssl_set_own_cert() (and
  826.  *                 possibly adjust the CA chain as well) and return 0. The
  827.  *                 callback should return -1 to abort the handshake at this
  828.  *                 point.
  829.  *
  830.  * \param ssl      SSL context
  831.  * \param f_sni    verification function
  832.  * \param p_sni    verification parameter
  833.  */
  834. void ssl_set_sni( ssl_context *ssl,
  835.                   int (*f_sni)(void *, ssl_context *, const unsigned char *,
  836.                                size_t),
  837.                   void *p_sni );
  838.  
  839. /**
  840.  * \brief          Set the maximum supported version sent from the client side
  841.  *
  842.  * \param ssl      SSL context
  843.  * \param major    Major version number (only SSL_MAJOR_VERSION_3 supported)
  844.  * \param minor    Minor version number (SSL_MINOR_VERSION_0,
  845.  *                 SSL_MINOR_VERSION_1 and SSL_MINOR_VERSION_2,
  846.  *                 SSL_MINOR_VERSION_3 supported)
  847.  */
  848. void ssl_set_max_version( ssl_context *ssl, int major, int minor );
  849.  
  850.  
  851. /**
  852.  * \brief          Set the minimum accepted SSL/TLS protocol version
  853.  *                 (Default: SSL_MAJOR_VERSION_3, SSL_MINOR_VERSION_0)
  854.  *
  855.  * \param ssl      SSL context
  856.  * \param major    Major version number (only SSL_MAJOR_VERSION_3 supported)
  857.  * \param minor    Minor version number (SSL_MINOR_VERSION_0,
  858.  *                 SSL_MINOR_VERSION_1 and SSL_MINOR_VERSION_2,
  859.  *                 SSL_MINOR_VERSION_3 supported)
  860.  */
  861. void ssl_set_min_version( ssl_context *ssl, int major, int minor );
  862.  
  863. /**
  864.  * \brief          Enable / Disable renegotiation support for connection when
  865.  *                 initiated by peer
  866.  *                 (Default: SSL_RENEGOTIATION_DISABLED)
  867.  *
  868.  *                 Note: A server with support enabled is more vulnerable for a
  869.  *                 resource DoS by a malicious client. You should enable this on
  870.  *                 a client to enable server-initiated renegotiation.
  871.  *
  872.  * \param ssl      SSL context
  873.  * \param renegotiation     Enable or disable (SSL_RENEGOTIATION_ENABLED or
  874.  *                                             SSL_RENEGOTIATION_DISABLED)
  875.  */
  876. void ssl_set_renegotiation( ssl_context *ssl, int renegotiation );
  877.  
  878. /**
  879.  * \brief          Prevent or allow legacy renegotiation.
  880.  *                 (Default: SSL_LEGACY_NO_RENEGOTIATION)
  881.  *                
  882.  *                 SSL_LEGACY_NO_RENEGOTIATION allows connections to
  883.  *                 be established even if the peer does not support
  884.  *                 secure renegotiation, but does not allow renegotiation
  885.  *                 to take place if not secure.
  886.  *                 (Interoperable and secure option)
  887.  *
  888.  *                 SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations
  889.  *                 with non-upgraded peers. Allowing legacy renegotiation
  890.  *                 makes the connection vulnerable to specific man in the
  891.  *                 middle attacks. (See RFC 5746)
  892.  *                 (Most interoperable and least secure option)
  893.  *
  894.  *                 SSL_LEGACY_BREAK_HANDSHAKE breaks off connections
  895.  *                 if peer does not support secure renegotiation. Results
  896.  *                 in interoperability issues with non-upgraded peers
  897.  *                 that do not support renegotiation altogether.
  898.  *                 (Most secure option, interoperability issues)
  899.  *
  900.  * \param ssl      SSL context
  901.  * \param allow_legacy  Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION,
  902.  *                                        SSL_ALLOW_LEGACY_RENEGOTIATION or
  903.  *                                        SSL_LEGACY_BREAK_HANDSHAKE)
  904.  */
  905. void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy );
  906.  
  907. /**
  908.  * \brief          Return the number of data bytes available to read
  909.  *
  910.  * \param ssl      SSL context
  911.  *
  912.  * \return         how many bytes are available in the read buffer
  913.  */
  914. size_t ssl_get_bytes_avail( const ssl_context *ssl );
  915.  
  916. /**
  917.  * \brief          Return the result of the certificate verification
  918.  *
  919.  * \param ssl      SSL context
  920.  *
  921.  * \return         0 if successful, or a combination of:
  922.  *                      BADCERT_EXPIRED
  923.  *                      BADCERT_REVOKED
  924.  *                      BADCERT_CN_MISMATCH
  925.  *                      BADCERT_NOT_TRUSTED
  926.  */
  927. int ssl_get_verify_result( const ssl_context *ssl );
  928.  
  929. /**
  930.  * \brief          Return the name of the current ciphersuite
  931.  *
  932.  * \param ssl      SSL context
  933.  *
  934.  * \return         a string containing the ciphersuite name
  935.  */
  936. const char *ssl_get_ciphersuite( const ssl_context *ssl );
  937.  
  938. /**
  939.  * \brief          Return the current SSL version (SSLv3/TLSv1/etc)
  940.  *
  941.  * \param ssl      SSL context
  942.  *
  943.  * \return         a string containing the SSL version
  944.  */
  945. const char *ssl_get_version( const ssl_context *ssl );
  946.  
  947. /**
  948.  * \brief          Return the peer certificate from the current connection
  949.  *
  950.  *                 Note: Can be NULL in case no certificate was sent during
  951.  *                 the handshake. Different calls for the same connection can
  952.  *                 return the same or different pointers for the same
  953.  *                 certificate and even a different certificate altogether.
  954.  *                 The peer cert CAN change in a single connection if
  955.  *                 renegotiation is performed.
  956.  *
  957.  * \param ssl      SSL context
  958.  *
  959.  * \return         the current peer certificate
  960.  */
  961. const x509_cert *ssl_get_peer_cert( const ssl_context *ssl );
  962.  
  963. /**
  964.  * \brief          Perform the SSL handshake
  965.  *
  966.  * \param ssl      SSL context
  967.  *
  968.  * \return         0 if successful, POLARSSL_ERR_NET_WANT_READ,
  969.  *                 POLARSSL_ERR_NET_WANT_WRITE, or a specific SSL error code.
  970.  */
  971. int ssl_handshake( ssl_context *ssl );
  972.  
  973. /**
  974.  * \brief          Perform a single step of the SSL handshake
  975.  *
  976.  *                 Note: the state of the context (ssl->state) will be at
  977.  *                 the following state after execution of this function.
  978.  *                 Do not call this function if state is SSL_HANDSHAKE_OVER.
  979.  *
  980.  * \param ssl      SSL context
  981.  *
  982.  * \return         0 if successful, POLARSSL_ERR_NET_WANT_READ,
  983.  *                 POLARSSL_ERR_NET_WANT_WRITE, or a specific SSL error code.
  984.  */
  985. int ssl_handshake_step( ssl_context *ssl );
  986.  
  987. /**
  988.  * \brief          Perform an SSL renegotiation on the running connection
  989.  *
  990.  * \param ssl      SSL context
  991.  *
  992.  * \return         0 if succesful, or any ssl_handshake() return value.
  993.  */
  994. int ssl_renegotiate( ssl_context *ssl );
  995.  
  996. /**
  997.  * \brief          Read at most 'len' application data bytes
  998.  *
  999.  * \param ssl      SSL context
  1000.  * \param buf      buffer that will hold the data
  1001.  * \param len      how many bytes must be read
  1002.  *
  1003.  * \return         This function returns the number of bytes read, 0 for EOF,
  1004.  *                 or a negative error code.
  1005.  */
  1006. int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len );
  1007.  
  1008. /**
  1009.  * \brief          Write exactly 'len' application data bytes
  1010.  *
  1011.  * \param ssl      SSL context
  1012.  * \param buf      buffer holding the data
  1013.  * \param len      how many bytes must be written
  1014.  *
  1015.  * \return         This function returns the number of bytes written,
  1016.  *                 or a negative error code.
  1017.  *
  1018.  * \note           When this function returns POLARSSL_ERR_NET_WANT_WRITE,
  1019.  *                 it must be called later with the *same* arguments,
  1020.  *                 until it returns a positive value.
  1021.  */
  1022. int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len );
  1023.  
  1024. /**
  1025.  * \brief           Send an alert message
  1026.  *
  1027.  * \param ssl       SSL context
  1028.  * \param level     The alert level of the message
  1029.  *                  (SSL_ALERT_LEVEL_WARNING or SSL_ALERT_LEVEL_FATAL)
  1030.  * \param message   The alert message (SSL_ALERT_MSG_*)
  1031.  *
  1032.  * \return          0 if successful, or a specific SSL error code.
  1033.  */
  1034. int ssl_send_alert_message( ssl_context *ssl,
  1035.                             unsigned char level,
  1036.                             unsigned char message );
  1037. /**
  1038.  * \brief          Notify the peer that the connection is being closed
  1039.  *
  1040.  * \param ssl      SSL context
  1041.  */
  1042. int ssl_close_notify( ssl_context *ssl );
  1043.  
  1044. /**
  1045.  * \brief          Free referenced items in an SSL context and clear memory
  1046.  *
  1047.  * \param ssl      SSL context
  1048.  */
  1049. void ssl_free( ssl_context *ssl );
  1050.  
  1051. /**
  1052.  * \brief          Free referenced items in an SSL session including the
  1053.  *                 peer certificate and clear memory
  1054.  *
  1055.  * \param session  SSL session
  1056.  */
  1057. void ssl_session_free( ssl_session *session );
  1058.  
  1059. /**
  1060.  * \brief           Free referenced items in an SSL transform context and clear
  1061.  *                  memory
  1062.  *
  1063.  * \param transform SSL transform context
  1064.  */
  1065. void ssl_transform_free( ssl_transform *transform );
  1066.  
  1067. /**
  1068.  * \brief           Free referenced items in an SSL handshake context and clear
  1069.  *                  memory
  1070.  *
  1071.  * \param handshake SSL handshake context
  1072.  */
  1073. void ssl_handshake_free( ssl_handshake_params *handshake );
  1074.  
  1075. /*
  1076.  * Internal functions (do not call directly)
  1077.  */
  1078. int ssl_handshake_client_step( ssl_context *ssl );
  1079. int ssl_handshake_server_step( ssl_context *ssl );
  1080. void ssl_handshake_wrapup( ssl_context *ssl );
  1081.  
  1082. int ssl_send_fatal_handshake_failure( ssl_context *ssl );
  1083.  
  1084. int ssl_derive_keys( ssl_context *ssl );
  1085.  
  1086. int ssl_read_record( ssl_context *ssl );
  1087. /**
  1088.  * \return         0 if successful, POLARSSL_ERR_SSL_CONN_EOF on EOF or
  1089.  *                 another negative error code.
  1090.  */
  1091. int ssl_fetch_input( ssl_context *ssl, size_t nb_want );
  1092.  
  1093. int ssl_write_record( ssl_context *ssl );
  1094. int ssl_flush_output( ssl_context *ssl );
  1095.  
  1096. int ssl_parse_certificate( ssl_context *ssl );
  1097. int ssl_write_certificate( ssl_context *ssl );
  1098.  
  1099. int ssl_parse_change_cipher_spec( ssl_context *ssl );
  1100. int ssl_write_change_cipher_spec( ssl_context *ssl );
  1101.  
  1102. int ssl_parse_finished( ssl_context *ssl );
  1103. int ssl_write_finished( ssl_context *ssl );
  1104.  
  1105. void ssl_optimize_checksum( ssl_context *ssl, int ciphersuite );
  1106.  
  1107. #ifdef __cplusplus
  1108. }
  1109. #endif
  1110.  
  1111. #endif /* ssl.h */
  1112.