Donatien Garnier / MiniTLS-GPL

Dependents:   MiniTLS-HTTPS-Example

Committer:
MiniTLS
Date:
Mon Jun 09 14:57:54 2014 +0000
Revision:
2:527a66d0a1a9
Change name to MiniTLS and added doc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MiniTLS 2:527a66d0a1a9 1 /*
MiniTLS 2:527a66d0a1a9 2 MiniTLS - A super trimmed down TLS/SSL Library for embedded devices
MiniTLS 2:527a66d0a1a9 3 Author: Donatien Garnier
MiniTLS 2:527a66d0a1a9 4 Copyright (C) 2013-2014 AppNearMe Ltd
MiniTLS 2:527a66d0a1a9 5
MiniTLS 2:527a66d0a1a9 6 This program is free software; you can redistribute it and/or
MiniTLS 2:527a66d0a1a9 7 modify it under the terms of the GNU General Public License
MiniTLS 2:527a66d0a1a9 8 as published by the Free Software Foundation; either version 2
MiniTLS 2:527a66d0a1a9 9 of the License, or (at your option) any later version.
MiniTLS 2:527a66d0a1a9 10
MiniTLS 2:527a66d0a1a9 11 This program is distributed in the hope that it will be useful,
MiniTLS 2:527a66d0a1a9 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
MiniTLS 2:527a66d0a1a9 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
MiniTLS 2:527a66d0a1a9 14 GNU General Public License for more details.
MiniTLS 2:527a66d0a1a9 15
MiniTLS 2:527a66d0a1a9 16 You should have received a copy of the GNU General Public License
MiniTLS 2:527a66d0a1a9 17 along with this program; if not, write to the Free Software
MiniTLS 2:527a66d0a1a9 18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
MiniTLS 2:527a66d0a1a9 19 *//**
MiniTLS 2:527a66d0a1a9 20 * \file tls_socket_defs.h
MiniTLS 2:527a66d0a1a9 21 * \copyright Copyright (c) AppNearMe Ltd 2013
MiniTLS 2:527a66d0a1a9 22 * \author Donatien Garnier
MiniTLS 2:527a66d0a1a9 23 */
MiniTLS 2:527a66d0a1a9 24
MiniTLS 2:527a66d0a1a9 25 #ifndef TLS_SOCKET_DEFS_H_
MiniTLS 2:527a66d0a1a9 26 #define TLS_SOCKET_DEFS_H_
MiniTLS 2:527a66d0a1a9 27
MiniTLS 2:527a66d0a1a9 28 #ifdef __cplusplus
MiniTLS 2:527a66d0a1a9 29 extern "C" {
MiniTLS 2:527a66d0a1a9 30 #endif
MiniTLS 2:527a66d0a1a9 31
MiniTLS 2:527a66d0a1a9 32 #include "core/fwk.h"
MiniTLS 2:527a66d0a1a9 33 #include "inc/minitls_config.h"
MiniTLS 2:527a66d0a1a9 34
MiniTLS 2:527a66d0a1a9 35 typedef struct __tls_socket tls_socket_t;
MiniTLS 2:527a66d0a1a9 36
MiniTLS 2:527a66d0a1a9 37 //We support SSL 3 and TLS 1.0, 1.1 and 1.2
MiniTLS 2:527a66d0a1a9 38
MiniTLS 2:527a66d0a1a9 39 #define TLS_1_2_VERSION_MAJOR 3
MiniTLS 2:527a66d0a1a9 40 #define TLS_1_2_VERSION_MINOR 3
MiniTLS 2:527a66d0a1a9 41
MiniTLS 2:527a66d0a1a9 42 #define TLS_1_1_VERSION_MAJOR 3
MiniTLS 2:527a66d0a1a9 43 #define TLS_1_1_VERSION_MINOR 2
MiniTLS 2:527a66d0a1a9 44
MiniTLS 2:527a66d0a1a9 45 #define TLS_1_0_VERSION_MAJOR 3
MiniTLS 2:527a66d0a1a9 46 #define TLS_1_0_VERSION_MINOR 1
MiniTLS 2:527a66d0a1a9 47
MiniTLS 2:527a66d0a1a9 48 #define SSL_3_VERSION_MAJOR 3
MiniTLS 2:527a66d0a1a9 49 #define SSL_3_VERSION_MINOR 0
MiniTLS 2:527a66d0a1a9 50
MiniTLS 2:527a66d0a1a9 51 typedef enum __tls_handshake_state
MiniTLS 2:527a66d0a1a9 52 {
MiniTLS 2:527a66d0a1a9 53 TLS_HANDSHAKE_INIT = 0,
MiniTLS 2:527a66d0a1a9 54 TLS_HANDSHAKE_HELLO_SENT,
MiniTLS 2:527a66d0a1a9 55 TLS_HANDSHAKE_HELLO_RECEIVED,
MiniTLS 2:527a66d0a1a9 56 TLS_HANDSHAKE_HELLO_RECEIVED_SESSION_RESUMPTION,
MiniTLS 2:527a66d0a1a9 57 TLS_HANDSHAKE_CERTIFICATE_RECEIVED,
MiniTLS 2:527a66d0a1a9 58 TLS_HANDSHAKE_SERVER_KEY_EXCHANGE_RECEIVED,
MiniTLS 2:527a66d0a1a9 59 TLS_HANDSHAKE_CERTIFICATE_REQUEST_RECEIVED,
MiniTLS 2:527a66d0a1a9 60 TLS_HANDSHAKE_HELLO_DONE_RECEIVED,
MiniTLS 2:527a66d0a1a9 61 TLS_HANDSHAKE_CERTIFICATE_SENT,
MiniTLS 2:527a66d0a1a9 62 TLS_HANDSHAKE_CLIENT_KEY_EXCHANGE_SENT,
MiniTLS 2:527a66d0a1a9 63 TLS_HANDSHAKE_CERTIFICATE_VERIFY_SENT,
MiniTLS 2:527a66d0a1a9 64 TLS_HANDSHAKE_FINISHED_SENT,
MiniTLS 2:527a66d0a1a9 65 TLS_HANDSHAKE_FINISHED_RECEIVED,
MiniTLS 2:527a66d0a1a9 66 TLS_HANDSHAKE_FAILED,
MiniTLS 2:527a66d0a1a9 67 TLS_HANDSHAKE_DONE,
MiniTLS 2:527a66d0a1a9 68 } tls_handshake_state_t;
MiniTLS 2:527a66d0a1a9 69
MiniTLS 2:527a66d0a1a9 70 #define HANDSHAKE_RANDOM_SIZE 32
MiniTLS 2:527a66d0a1a9 71 #define HANDSHAKE_MASTER_KEY_SIZE 48
MiniTLS 2:527a66d0a1a9 72
MiniTLS 2:527a66d0a1a9 73 #include "crypto/crypto_md5.h"
MiniTLS 2:527a66d0a1a9 74 #include "crypto/crypto_sha1.h"
MiniTLS 2:527a66d0a1a9 75 #include "crypto/crypto_sha256.h"
MiniTLS 2:527a66d0a1a9 76 #include "crypto/crypto_ecc.h"
MiniTLS 2:527a66d0a1a9 77
MiniTLS 2:527a66d0a1a9 78 struct __tls_handshake
MiniTLS 2:527a66d0a1a9 79 {
MiniTLS 2:527a66d0a1a9 80 tls_socket_t* tls_socket;
MiniTLS 2:527a66d0a1a9 81 tls_handshake_state_t state;
MiniTLS 2:527a66d0a1a9 82 uint8_t random_client[HANDSHAKE_RANDOM_SIZE];
MiniTLS 2:527a66d0a1a9 83 uint8_t random_server[HANDSHAKE_RANDOM_SIZE];
MiniTLS 2:527a66d0a1a9 84
MiniTLS 2:527a66d0a1a9 85 // tls_security_t target_security;
MiniTLS 2:527a66d0a1a9 86
MiniTLS 2:527a66d0a1a9 87 bool certificate_requested;
MiniTLS 2:527a66d0a1a9 88
MiniTLS 2:527a66d0a1a9 89
MiniTLS 2:527a66d0a1a9 90 union
MiniTLS 2:527a66d0a1a9 91 {
MiniTLS 2:527a66d0a1a9 92 #if CRYPTO_ECC
MiniTLS 2:527a66d0a1a9 93 struct {
MiniTLS 2:527a66d0a1a9 94 //Ephemeral key parameters
MiniTLS 2:527a66d0a1a9 95 const crypto_ecc_curve_t* curve;
MiniTLS 2:527a66d0a1a9 96 crypto_ecc_public_key_t server_key; //This is the static key
MiniTLS 2:527a66d0a1a9 97 crypto_ecc_private_key_t client_key;
MiniTLS 2:527a66d0a1a9 98 } ecc;
MiniTLS 2:527a66d0a1a9 99 #endif
MiniTLS 2:527a66d0a1a9 100 #if CRYPTO_RSA
MiniTLS 2:527a66d0a1a9 101 struct {
MiniTLS 2:527a66d0a1a9 102 //No ephemeral key parameters
MiniTLS 2:527a66d0a1a9 103 } rsa;
MiniTLS 2:527a66d0a1a9 104 #endif
MiniTLS 2:527a66d0a1a9 105 } key_exchange;
MiniTLS 2:527a66d0a1a9 106
MiniTLS 2:527a66d0a1a9 107 struct //Cannot use an union as we need to compute hash before knowing which SSL/TLS version to use (ServerHello)
MiniTLS 2:527a66d0a1a9 108 {
MiniTLS 2:527a66d0a1a9 109 #if MINITLS_CFG_PROTOCOL_TLS_1_2
MiniTLS 2:527a66d0a1a9 110 crypto_sha256_t sha256;
MiniTLS 2:527a66d0a1a9 111 #endif
MiniTLS 2:527a66d0a1a9 112 #if (MINITLS_CFG_PROTOCOL_TLS_1_1 || MINITLS_CFG_PROTOCOL_TLS_1_0 || MINITLS_CFG_PROTOCOL_SSL_3)
MiniTLS 2:527a66d0a1a9 113 struct
MiniTLS 2:527a66d0a1a9 114 {
MiniTLS 2:527a66d0a1a9 115 crypto_md5_t md5;
MiniTLS 2:527a66d0a1a9 116 crypto_sha1_t sha1;
MiniTLS 2:527a66d0a1a9 117 } md5_sha1;
MiniTLS 2:527a66d0a1a9 118 #endif
MiniTLS 2:527a66d0a1a9 119 } hash; //Hash of the whole handshake exchange
MiniTLS 2:527a66d0a1a9 120 };
MiniTLS 2:527a66d0a1a9 121
MiniTLS 2:527a66d0a1a9 122 typedef struct __tls_handshake tls_handshake_t;
MiniTLS 2:527a66d0a1a9 123
MiniTLS 2:527a66d0a1a9 124
MiniTLS 2:527a66d0a1a9 125 typedef enum __tls_security
MiniTLS 2:527a66d0a1a9 126 {
MiniTLS 2:527a66d0a1a9 127 TLS_SECURITY_NONE,
MiniTLS 2:527a66d0a1a9 128 TLS_SECURITY_INTIALIZED,
MiniTLS 2:527a66d0a1a9 129 TLS_SECURITY_ACTIVE
MiniTLS 2:527a66d0a1a9 130 } tls_security_state_t;
MiniTLS 2:527a66d0a1a9 131
MiniTLS 2:527a66d0a1a9 132 typedef struct __tls_protocol_version
MiniTLS 2:527a66d0a1a9 133 {
MiniTLS 2:527a66d0a1a9 134 uint8_t major;
MiniTLS 2:527a66d0a1a9 135 uint8_t minor;
MiniTLS 2:527a66d0a1a9 136 } tls_protocol_version_t;
MiniTLS 2:527a66d0a1a9 137
MiniTLS 2:527a66d0a1a9 138
MiniTLS 2:527a66d0a1a9 139 #include "tls_security.h"
MiniTLS 2:527a66d0a1a9 140
MiniTLS 2:527a66d0a1a9 141 #include "crypto/crypto_hmac_sha1.h"
MiniTLS 2:527a66d0a1a9 142 #include "crypto/crypto_aes_128_cbc.h"
MiniTLS 2:527a66d0a1a9 143
MiniTLS 2:527a66d0a1a9 144 struct __tls_record
MiniTLS 2:527a66d0a1a9 145 {
MiniTLS 2:527a66d0a1a9 146 bool handshake_done;
MiniTLS 2:527a66d0a1a9 147
MiniTLS 2:527a66d0a1a9 148 int socket_fd;
MiniTLS 2:527a66d0a1a9 149
MiniTLS 2:527a66d0a1a9 150 int read_timeout;
MiniTLS 2:527a66d0a1a9 151 int write_timeout;
MiniTLS 2:527a66d0a1a9 152 size_t max_fragment_size; //Size to negotiate using RFC extension - supported by GNUTLS but not OpenSSL
MiniTLS 2:527a66d0a1a9 153
MiniTLS 2:527a66d0a1a9 154 tls_protocol_version_t version;
MiniTLS 2:527a66d0a1a9 155 buffer_t buffer;
MiniTLS 2:527a66d0a1a9 156 /*
MiniTLS 2:527a66d0a1a9 157 buffer_t buffer_tx_fragment_header;
MiniTLS 2:527a66d0a1a9 158 buffer_t buffer_tx_iv_header;
MiniTLS 2:527a66d0a1a9 159 */
MiniTLS 2:527a66d0a1a9 160
MiniTLS 2:527a66d0a1a9 161 tls_socket_t* tls_socket;
MiniTLS 2:527a66d0a1a9 162
MiniTLS 2:527a66d0a1a9 163 tls_security_state_t security_rx_state;
MiniTLS 2:527a66d0a1a9 164 tls_security_state_t security_tx_state;
MiniTLS 2:527a66d0a1a9 165
MiniTLS 2:527a66d0a1a9 166 crypto_aes_128_t cipher_rx;
MiniTLS 2:527a66d0a1a9 167 crypto_aes_128_t cipher_tx;
MiniTLS 2:527a66d0a1a9 168
MiniTLS 2:527a66d0a1a9 169 uint64_t sequence_number_rx;
MiniTLS 2:527a66d0a1a9 170 uint64_t sequence_number_tx;
MiniTLS 2:527a66d0a1a9 171
MiniTLS 2:527a66d0a1a9 172 //Keys
MiniTLS 2:527a66d0a1a9 173 uint8_t client_write_mac_key[TLS_HMAC_SHA1_KEY_SIZE];
MiniTLS 2:527a66d0a1a9 174 uint8_t server_write_mac_key[TLS_HMAC_SHA1_KEY_SIZE];
MiniTLS 2:527a66d0a1a9 175 uint8_t client_write_cipher_key[AES_128_KEY_SIZE];
MiniTLS 2:527a66d0a1a9 176 uint8_t server_write_cipher_key[AES_128_KEY_SIZE];
MiniTLS 2:527a66d0a1a9 177 };
MiniTLS 2:527a66d0a1a9 178
MiniTLS 2:527a66d0a1a9 179 typedef struct __tls_record tls_record_t;
MiniTLS 2:527a66d0a1a9 180
MiniTLS 2:527a66d0a1a9 181 typedef enum __tls_content_type
MiniTLS 2:527a66d0a1a9 182 {
MiniTLS 2:527a66d0a1a9 183 TLS_CHANGE_CIPHER_SPEC = 20,
MiniTLS 2:527a66d0a1a9 184 TLS_ALERT = 21,
MiniTLS 2:527a66d0a1a9 185 TLS_HANDSHAKE = 22,
MiniTLS 2:527a66d0a1a9 186 TLS_APPLICATION_DATA = 23,
MiniTLS 2:527a66d0a1a9 187 __TLS_MAX = 255
MiniTLS 2:527a66d0a1a9 188 } tls_content_type_t;
MiniTLS 2:527a66d0a1a9 189
MiniTLS 2:527a66d0a1a9 190 #define SESSION_ID_MAX_SIZE 32
MiniTLS 2:527a66d0a1a9 191
MiniTLS 2:527a66d0a1a9 192 typedef struct __tls_session
MiniTLS 2:527a66d0a1a9 193 {
MiniTLS 2:527a66d0a1a9 194 uint8_t master_key[HANDSHAKE_MASTER_KEY_SIZE];
MiniTLS 2:527a66d0a1a9 195 size_t session_id_length;
MiniTLS 2:527a66d0a1a9 196 uint8_t session_id[SESSION_ID_MAX_SIZE];
MiniTLS 2:527a66d0a1a9 197 }
MiniTLS 2:527a66d0a1a9 198 tls_session_t;
MiniTLS 2:527a66d0a1a9 199
MiniTLS 2:527a66d0a1a9 200 #include "minitls.h"
MiniTLS 2:527a66d0a1a9 201
MiniTLS 2:527a66d0a1a9 202 typedef struct __tls_socket_event tls_socket_event_t;
MiniTLS 2:527a66d0a1a9 203 typedef struct __tls_socket_event_list tls_socket_event_list_t;
MiniTLS 2:527a66d0a1a9 204 struct __tls_socket
MiniTLS 2:527a66d0a1a9 205 {
MiniTLS 2:527a66d0a1a9 206 tls_record_t record;
MiniTLS 2:527a66d0a1a9 207 tls_handshake_t handshake;
MiniTLS 2:527a66d0a1a9 208 minitls_t* minitls;
MiniTLS 2:527a66d0a1a9 209
MiniTLS 2:527a66d0a1a9 210 //Session info
MiniTLS 2:527a66d0a1a9 211 tls_session_t session;
MiniTLS 2:527a66d0a1a9 212
MiniTLS 2:527a66d0a1a9 213 //Internal sauce
MiniTLS 2:527a66d0a1a9 214 tls_socket_event_t* events;
MiniTLS 2:527a66d0a1a9 215 buffer_t* read_buffer; //Passed by record layer
MiniTLS 2:527a66d0a1a9 216 buffer_t write_buffer;
MiniTLS 2:527a66d0a1a9 217 rtos_mtx_t* mtx;
MiniTLS 2:527a66d0a1a9 218 };
MiniTLS 2:527a66d0a1a9 219
MiniTLS 2:527a66d0a1a9 220 //typedef void (*tls_socket_event_cb_t)(tls_socket_t* socket, bool read, bool write, void* param);
MiniTLS 2:527a66d0a1a9 221 struct __tls_socket_event_list
MiniTLS 2:527a66d0a1a9 222 {
MiniTLS 2:527a66d0a1a9 223 tls_socket_event_t* head;
MiniTLS 2:527a66d0a1a9 224 rtos_sem_t* sem;
MiniTLS 2:527a66d0a1a9 225 };
MiniTLS 2:527a66d0a1a9 226
MiniTLS 2:527a66d0a1a9 227 struct __tls_socket_event
MiniTLS 2:527a66d0a1a9 228 {
MiniTLS 2:527a66d0a1a9 229 tls_socket_t* socket;
MiniTLS 2:527a66d0a1a9 230 bool read;
MiniTLS 2:527a66d0a1a9 231 bool write;
MiniTLS 2:527a66d0a1a9 232 bool fired;
MiniTLS 2:527a66d0a1a9 233 tls_socket_event_list_t* list;
MiniTLS 2:527a66d0a1a9 234 tls_socket_event_t* socket_list_next;
MiniTLS 2:527a66d0a1a9 235 tls_socket_event_t* event_list_next;
MiniTLS 2:527a66d0a1a9 236 };
MiniTLS 2:527a66d0a1a9 237
MiniTLS 2:527a66d0a1a9 238
MiniTLS 2:527a66d0a1a9 239 #ifdef __cplusplus
MiniTLS 2:527a66d0a1a9 240 }
MiniTLS 2:527a66d0a1a9 241 #endif
MiniTLS 2:527a66d0a1a9 242
MiniTLS 2:527a66d0a1a9 243 #endif /* TLS_SOCKET_DEFS_H_ */