Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
tls.h
00001 /** 00002 * @file tls.h 00003 * @brief TLS (Transport Layer Security) 00004 * 00005 * @section License 00006 * 00007 * Copyright (C) 2010-2017 Oryx Embedded SARL. All rights reserved. 00008 * 00009 * This file is part of CycloneSSL Open. 00010 * 00011 * This program is free software; you can redistribute it and/or 00012 * modify it under the terms of the GNU General Public License 00013 * as published by the Free Software Foundation; either version 2 00014 * of the License, or (at your option) any later version. 00015 * 00016 * This program is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU General Public License 00022 * along with this program; if not, write to the Free Software Foundation, 00023 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00024 * 00025 * @author Oryx Embedded SARL (www.oryx-embedded.com) 00026 * @version 1.7.6 00027 **/ 00028 00029 #ifndef _TLS_H 00030 #define _TLS_H 00031 00032 //Dependencies 00033 #include "os_port.h" 00034 #include "crypto.h" 00035 #include "tls_config.h" 00036 #include "hmac.h" 00037 #include "rsa.h" 00038 #include "dsa.h" 00039 #include "ecdsa.h" 00040 #include "dh.h" 00041 #include "ecdh.h" 00042 #include "cipher_mode_gcm.h" 00043 00044 //TLS version numbers 00045 #define SSL_VERSION_3_0 0x0300 00046 #define TLS_VERSION_1_0 0x0301 00047 #define TLS_VERSION_1_1 0x0302 00048 #define TLS_VERSION_1_2 0x0303 00049 00050 //Enable SSL/TLS support 00051 #ifndef TLS_SUPPORT 00052 #define TLS_SUPPORT ENABLED 00053 #elif (TLS_SUPPORT != ENABLED && TLS_SUPPORT != DISABLED) 00054 #error TLS_SUPPORT parameter is not valid 00055 #endif 00056 00057 //Client mode of operation 00058 #ifndef TLS_CLIENT_SUPPORT 00059 #define TLS_CLIENT_SUPPORT ENABLED 00060 #elif (TLS_CLIENT_SUPPORT != ENABLED && TLS_CLIENT_SUPPORT != DISABLED) 00061 #error TLS_CLIENT_SUPPORT parameter is not valid 00062 #endif 00063 00064 //Server mode of operation 00065 #ifndef TLS_SERVER_SUPPORT 00066 #define TLS_SERVER_SUPPORT ENABLED 00067 #elif (TLS_SERVER_SUPPORT != ENABLED && TLS_SERVER_SUPPORT != DISABLED) 00068 #error TLS_SERVER_SUPPORT parameter is not valid 00069 #endif 00070 00071 //Minimum version that can be negotiated 00072 #ifndef TLS_MIN_VERSION 00073 #define TLS_MIN_VERSION TLS_VERSION_1_0 00074 #elif (TLS_MIN_VERSION < SSL_VERSION_3_0) 00075 #error TLS_MIN_VERSION parameter is not valid 00076 #endif 00077 00078 //Maximum version that can be negotiated 00079 #ifndef TLS_MAX_VERSION 00080 #define TLS_MAX_VERSION TLS_VERSION_1_2 00081 #elif (TLS_MAX_VERSION > TLS_VERSION_1_2 || TLS_MAX_VERSION < TLS_MIN_VERSION) 00082 #error TLS_MAX_VERSION parameter is not valid 00083 #endif 00084 00085 //Session resumption mechanism 00086 #ifndef TLS_SESSION_RESUME_SUPPORT 00087 #define TLS_SESSION_RESUME_SUPPORT ENABLED 00088 #elif (TLS_SESSION_RESUME_SUPPORT != ENABLED && TLS_SESSION_RESUME_SUPPORT != DISABLED) 00089 #error TLS_SESSION_RESUME_SUPPORT parameter is not valid 00090 #endif 00091 00092 //Lifetime of session cache entries 00093 #ifndef TLS_SESSION_CACHE_LIFETIME 00094 #define TLS_SESSION_CACHE_LIFETIME 3600000 00095 #elif (TLS_SESSION_CACHE_LIFETIME < 1000) 00096 #error TLS_SESSION_CACHE_LIFETIME parameter is not valid 00097 #endif 00098 00099 //SNI (Server Name Indication) extension 00100 #ifndef TLS_SNI_SUPPORT 00101 #define TLS_SNI_SUPPORT ENABLED 00102 #elif (TLS_SNI_SUPPORT != ENABLED && TLS_SNI_SUPPORT != DISABLED) 00103 #error TLS_SNI_SUPPORT parameter is not valid 00104 #endif 00105 00106 //ALPN (Application-Layer Protocol Negotiation) extension 00107 #ifndef TLS_ALPN_SUPPORT 00108 #define TLS_ALPN_SUPPORT DISABLED 00109 #elif (TLS_ALPN_SUPPORT != ENABLED && TLS_ALPN_SUPPORT != DISABLED) 00110 #error TLS_ALPN_SUPPORT parameter is not valid 00111 #endif 00112 00113 //Maximum number of certificates the end entity can load 00114 #ifndef TLS_MAX_CERTIFICATES 00115 #define TLS_MAX_CERTIFICATES 3 00116 #elif (TLS_MAX_CERTIFICATES < 1) 00117 #error TLS_MAX_CERTIFICATES parameter is not valid 00118 #endif 00119 00120 //RSA key exchange support 00121 #ifndef TLS_RSA_SUPPORT 00122 #define TLS_RSA_SUPPORT ENABLED 00123 #elif (TLS_RSA_SUPPORT != ENABLED && TLS_RSA_SUPPORT != DISABLED) 00124 #error TLS_RSA_SUPPORT parameter is not valid 00125 #endif 00126 00127 //DHE_RSA key exchange support 00128 #ifndef TLS_DHE_RSA_SUPPORT 00129 #define TLS_DHE_RSA_SUPPORT ENABLED 00130 #elif (TLS_DHE_RSA_SUPPORT != ENABLED && TLS_DHE_RSA_SUPPORT != DISABLED) 00131 #error TLS_DHE_RSA_SUPPORT parameter is not valid 00132 #endif 00133 00134 //DHE_DSS key exchange support 00135 #ifndef TLS_DHE_DSS_SUPPORT 00136 #define TLS_DHE_DSS_SUPPORT ENABLED 00137 #elif (TLS_DHE_DSS_SUPPORT != ENABLED && TLS_DHE_DSS_SUPPORT != DISABLED) 00138 #error TLS_DHE_DSS_SUPPORT parameter is not valid 00139 #endif 00140 00141 //DH_anon key exchange support 00142 #ifndef TLS_DH_ANON_SUPPORT 00143 #define TLS_DH_ANON_SUPPORT DISABLED 00144 #elif (TLS_DH_ANON_SUPPORT != ENABLED && TLS_DH_ANON_SUPPORT != DISABLED) 00145 #error TLS_DH_ANON_SUPPORT parameter is not valid 00146 #endif 00147 00148 //ECDHE_RSA key exchange support 00149 #ifndef TLS_ECDHE_RSA_SUPPORT 00150 #define TLS_ECDHE_RSA_SUPPORT ENABLED 00151 #elif (TLS_ECDHE_RSA_SUPPORT != ENABLED && TLS_ECDHE_RSA_SUPPORT != DISABLED) 00152 #error TLS_ECDHE_RSA_SUPPORT parameter is not valid 00153 #endif 00154 00155 //ECDHE_ECDSA key exchange support 00156 #ifndef TLS_ECDHE_ECDSA_SUPPORT 00157 #define TLS_ECDHE_ECDSA_SUPPORT ENABLED 00158 #elif (TLS_ECDHE_ECDSA_SUPPORT != ENABLED && TLS_ECDHE_ECDSA_SUPPORT != DISABLED) 00159 #error TLS_ECDHE_ECDSA_SUPPORT parameter is not valid 00160 #endif 00161 00162 //ECDH_anon key exchange support 00163 #ifndef TLS_ECDH_ANON_SUPPORT 00164 #define TLS_ECDH_ANON_SUPPORT DISABLED 00165 #elif (TLS_ECDH_ANON_SUPPORT != ENABLED && TLS_ECDH_ANON_SUPPORT != DISABLED) 00166 #error TLS_ECDH_ANON_SUPPORT parameter is not valid 00167 #endif 00168 00169 //PSK key exchange support 00170 #ifndef TLS_PSK_SUPPORT 00171 #define TLS_PSK_SUPPORT DISABLED 00172 #elif (TLS_PSK_SUPPORT != ENABLED && TLS_PSK_SUPPORT != DISABLED) 00173 #error TLS_PSK_SUPPORT parameter is not valid 00174 #endif 00175 00176 //RSA_PSK key exchange support 00177 #ifndef TLS_RSA_PSK_SUPPORT 00178 #define TLS_RSA_PSK_SUPPORT DISABLED 00179 #elif (TLS_RSA_PSK_SUPPORT != ENABLED && TLS_RSA_PSK_SUPPORT != DISABLED) 00180 #error TLS_RSA_PSK_SUPPORT parameter is not valid 00181 #endif 00182 00183 //DHE_PSK key exchange support 00184 #ifndef TLS_DHE_PSK_SUPPORT 00185 #define TLS_DHE_PSK_SUPPORT DISABLED 00186 #elif (TLS_DHE_PSK_SUPPORT != ENABLED && TLS_DHE_PSK_SUPPORT != DISABLED) 00187 #error TLS_DHE_PSK_SUPPORT parameter is not valid 00188 #endif 00189 00190 //ECDHE_PSK key exchange support 00191 #ifndef TLS_ECDHE_PSK_SUPPORT 00192 #define TLS_ECDHE_PSK_SUPPORT DISABLED 00193 #elif (TLS_ECDHE_PSK_SUPPORT != ENABLED && TLS_ECDHE_PSK_SUPPORT != DISABLED) 00194 #error TLS_ECDHE_PSK_SUPPORT parameter is not valid 00195 #endif 00196 00197 //RSA signature capability 00198 #ifndef TLS_RSA_SIGN_SUPPORT 00199 #define TLS_RSA_SIGN_SUPPORT ENABLED 00200 #elif (TLS_RSA_SIGN_SUPPORT != ENABLED && TLS_RSA_SIGN_SUPPORT != DISABLED) 00201 #error TLS_RSA_SIGN_SUPPORT parameter is not valid 00202 #endif 00203 00204 //DSA signature capability 00205 #ifndef TLS_DSA_SIGN_SUPPORT 00206 #define TLS_DSA_SIGN_SUPPORT ENABLED 00207 #elif (TLS_DSA_SIGN_SUPPORT != ENABLED && TLS_DSA_SIGN_SUPPORT != DISABLED) 00208 #error TLS_DSA_SIGN_SUPPORT parameter is not valid 00209 #endif 00210 00211 //ECDSA signature capability 00212 #ifndef TLS_ECDSA_SIGN_SUPPORT 00213 #define TLS_ECDSA_SIGN_SUPPORT ENABLED 00214 #elif (TLS_ECDSA_SIGN_SUPPORT != ENABLED && TLS_ECDSA_SIGN_SUPPORT != DISABLED) 00215 #error TLS_ECDSA_SIGN_SUPPORT parameter is not valid 00216 #endif 00217 00218 //Stream cipher support 00219 #ifndef TLS_STREAM_CIPHER_SUPPORT 00220 #define TLS_STREAM_CIPHER_SUPPORT ENABLED 00221 #elif (TLS_STREAM_CIPHER_SUPPORT != ENABLED && TLS_STREAM_CIPHER_SUPPORT != DISABLED) 00222 #error TLS_STREAM_CIPHER_SUPPORT parameter is not valid 00223 #endif 00224 00225 //CBC block cipher support 00226 #ifndef TLS_CBC_CIPHER_SUPPORT 00227 #define TLS_CBC_CIPHER_SUPPORT ENABLED 00228 #elif (TLS_CBC_CIPHER_SUPPORT != ENABLED && TLS_CBC_CIPHER_SUPPORT != DISABLED) 00229 #error TLS_CBC_CIPHER_SUPPORT parameter is not valid 00230 #endif 00231 00232 //CCM AEAD support 00233 #ifndef TLS_CCM_CIPHER_SUPPORT 00234 #define TLS_CCM_CIPHER_SUPPORT ENABLED 00235 #elif (TLS_CCM_CIPHER_SUPPORT != ENABLED && TLS_CCM_CIPHER_SUPPORT != DISABLED) 00236 #error TLS_CCM_CIPHER_SUPPORT parameter is not valid 00237 #endif 00238 00239 //CCM_8 AEAD support 00240 #ifndef TLS_CCM_8_CIPHER_SUPPORT 00241 #define TLS_CCM_8_CIPHER_SUPPORT DISABLED 00242 #elif (TLS_CCM_8_CIPHER_SUPPORT != ENABLED && TLS_CCM_8_CIPHER_SUPPORT != DISABLED) 00243 #error TLS_CCM_8_CIPHER_SUPPORT parameter is not valid 00244 #endif 00245 00246 //GCM AEAD support 00247 #ifndef TLS_GCM_CIPHER_SUPPORT 00248 #define TLS_GCM_CIPHER_SUPPORT ENABLED 00249 #elif (TLS_GCM_CIPHER_SUPPORT != ENABLED && TLS_GCM_CIPHER_SUPPORT != DISABLED) 00250 #error TLS_GCM_CIPHER_SUPPORT parameter is not valid 00251 #endif 00252 00253 //ChaCha20Poly1305 AEAD support 00254 #ifndef TLS_CHACHA20_POLY1305_SUPPORT 00255 #define TLS_CHACHA20_POLY1305_SUPPORT DISABLED 00256 #elif (TLS_CHACHA20_POLY1305_SUPPORT != ENABLED && TLS_CHACHA20_POLY1305_SUPPORT != DISABLED) 00257 #error TLS_CHACHA20_POLY1305_SUPPORT parameter is not valid 00258 #endif 00259 00260 //RC4 cipher support 00261 #ifndef TLS_RC4_SUPPORT 00262 #define TLS_RC4_SUPPORT DISABLED 00263 #elif (TLS_RC4_SUPPORT != ENABLED && TLS_RC4_SUPPORT != DISABLED) 00264 #error TLS_RC4_SUPPORT parameter is not valid 00265 #endif 00266 00267 //IDEA cipher support 00268 #ifndef TLS_IDEA_SUPPORT 00269 #define TLS_IDEA_SUPPORT DISABLED 00270 #elif (TLS_IDEA_SUPPORT != ENABLED && TLS_IDEA_SUPPORT != DISABLED) 00271 #error TLS_IDEA_SUPPORT parameter is not valid 00272 #endif 00273 00274 //DES cipher support 00275 #ifndef TLS_DES_SUPPORT 00276 #define TLS_DES_SUPPORT DISABLED 00277 #elif (TLS_DES_SUPPORT != ENABLED && TLS_DES_SUPPORT != DISABLED) 00278 #error TLS_DES_SUPPORT parameter is not valid 00279 #endif 00280 00281 //Triple DES cipher support 00282 #ifndef TLS_3DES_SUPPORT 00283 #define TLS_3DES_SUPPORT ENABLED 00284 #elif (TLS_3DES_SUPPORT != ENABLED && TLS_3DES_SUPPORT != DISABLED) 00285 #error TLS_3DES_SUPPORT parameter is not valid 00286 #endif 00287 00288 //AES cipher support 00289 #ifndef TLS_AES_SUPPORT 00290 #define TLS_AES_SUPPORT ENABLED 00291 #elif (TLS_AES_SUPPORT != ENABLED && TLS_AES_SUPPORT != DISABLED) 00292 #error TLS_AES_SUPPORT parameter is not valid 00293 #endif 00294 00295 //Camellia cipher support 00296 #ifndef TLS_CAMELLIA_SUPPORT 00297 #define TLS_CAMELLIA_SUPPORT ENABLED 00298 #elif (TLS_CAMELLIA_SUPPORT != ENABLED && TLS_CAMELLIA_SUPPORT != DISABLED) 00299 #error TLS_CAMELLIA_SUPPORT parameter is not valid 00300 #endif 00301 00302 //SEED cipher support 00303 #ifndef TLS_SEED_SUPPORT 00304 #define TLS_SEED_SUPPORT ENABLED 00305 #elif (TLS_SEED_SUPPORT != ENABLED && TLS_SEED_SUPPORT != DISABLED) 00306 #error TLS_SEED_SUPPORT parameter is not valid 00307 #endif 00308 00309 //ARIA cipher support 00310 #ifndef TLS_ARIA_SUPPORT 00311 #define TLS_ARIA_SUPPORT ENABLED 00312 #elif (TLS_ARIA_SUPPORT != ENABLED && TLS_ARIA_SUPPORT != DISABLED) 00313 #error TLS_ARIA_SUPPORT parameter is not valid 00314 #endif 00315 00316 //MD5 hash support 00317 #ifndef TLS_MD5_SUPPORT 00318 #define TLS_MD5_SUPPORT DISABLED 00319 #elif (TLS_MD5_SUPPORT != ENABLED && TLS_MD5_SUPPORT != DISABLED) 00320 #error TLS_MD5_SUPPORT parameter is not valid 00321 #endif 00322 00323 //SHA-1 hash support 00324 #ifndef TLS_SHA1_SUPPORT 00325 #define TLS_SHA1_SUPPORT ENABLED 00326 #elif (TLS_SHA1_SUPPORT != ENABLED && TLS_SHA1_SUPPORT != DISABLED) 00327 #error TLS_SHA1_SUPPORT parameter is not valid 00328 #endif 00329 00330 //SHA-224 hash support 00331 #ifndef TLS_SHA224_SUPPORT 00332 #define TLS_SHA224_SUPPORT ENABLED 00333 #elif (TLS_SHA224_SUPPORT != ENABLED && TLS_SHA224_SUPPORT != DISABLED) 00334 #error TLS_SHA224_SUPPORT parameter is not valid 00335 #endif 00336 00337 //SHA-256 hash support 00338 #ifndef TLS_SHA256_SUPPORT 00339 #define TLS_SHA256_SUPPORT ENABLED 00340 #elif (TLS_SHA256_SUPPORT != ENABLED && TLS_SHA256_SUPPORT != DISABLED) 00341 #error TLS_SHA256_SUPPORT parameter is not valid 00342 #endif 00343 00344 //SHA-384 hash support 00345 #ifndef TLS_SHA384_SUPPORT 00346 #define TLS_SHA384_SUPPORT ENABLED 00347 #elif (TLS_SHA384_SUPPORT != ENABLED && TLS_SHA384_SUPPORT != DISABLED) 00348 #error TLS_SHA384_SUPPORT parameter is not valid 00349 #endif 00350 00351 //SHA-512 hash support 00352 #ifndef TLS_SHA512_SUPPORT 00353 #define TLS_SHA512_SUPPORT ENABLED 00354 #elif (TLS_SHA512_SUPPORT != ENABLED && TLS_SHA512_SUPPORT != DISABLED) 00355 #error TLS_SHA512_SUPPORT parameter is not valid 00356 #endif 00357 00358 //secp160k1 elliptic curve support 00359 #ifndef TLS_SECP160K1_SUPPORT 00360 #define TLS_SECP160K1_SUPPORT DISABLED 00361 #elif (TLS_SECP160K1_SUPPORT != ENABLED && TLS_SECP160K1_SUPPORT != DISABLED) 00362 #error TLS_SECP160K1_SUPPORT parameter is not valid 00363 #endif 00364 00365 //secp160r1 elliptic curve support 00366 #ifndef TLS_SECP160R1_SUPPORT 00367 #define TLS_SECP160R1_SUPPORT DISABLED 00368 #elif (TLS_SECP160R1_SUPPORT != ENABLED && TLS_SECP160R1_SUPPORT != DISABLED) 00369 #error TLS_SECP160R1_SUPPORT parameter is not valid 00370 #endif 00371 00372 //secp160r2 elliptic curve support 00373 #ifndef TLS_SECP160R2_SUPPORT 00374 #define TLS_SECP160R2_SUPPORT DISABLED 00375 #elif (TLS_SECP160R2_SUPPORT != ENABLED && TLS_SECP160R2_SUPPORT != DISABLED) 00376 #error TLS_SECP160R2_SUPPORT parameter is not valid 00377 #endif 00378 00379 //secp192k1 elliptic curve support 00380 #ifndef TLS_SECP192K1_SUPPORT 00381 #define TLS_SECP192K1_SUPPORT DISABLED 00382 #elif (TLS_SECP192K1_SUPPORT != ENABLED && TLS_SECP192K1_SUPPORT != DISABLED) 00383 #error TLS_SECP192K1_SUPPORT parameter is not valid 00384 #endif 00385 00386 //secp192r1 elliptic curve support 00387 #ifndef TLS_SECP192R1_SUPPORT 00388 #define TLS_SECP192R1_SUPPORT ENABLED 00389 #elif (TLS_SECP192R1_SUPPORT != ENABLED && TLS_SECP192R1_SUPPORT != DISABLED) 00390 #error TLS_SECP192R1_SUPPORT parameter is not valid 00391 #endif 00392 00393 //secp224k1 elliptic curve support 00394 #ifndef TLS_SECP224K1_SUPPORT 00395 #define TLS_SECP224K1_SUPPORT DISABLED 00396 #elif (TLS_SECP224K1_SUPPORT != ENABLED && TLS_SECP224K1_SUPPORT != DISABLED) 00397 #error TLS_SECP224K1_SUPPORT parameter is not valid 00398 #endif 00399 00400 //secp224r1 elliptic curve support 00401 #ifndef TLS_SECP224R1_SUPPORT 00402 #define TLS_SECP224R1_SUPPORT ENABLED 00403 #elif (TLS_SECP224R1_SUPPORT != ENABLED && TLS_SECP224R1_SUPPORT != DISABLED) 00404 #error TLS_SECP224R1_SUPPORT parameter is not valid 00405 #endif 00406 00407 //secp256k1 elliptic curve support 00408 #ifndef TLS_SECP256K1_SUPPORT 00409 #define TLS_SECP256K1_SUPPORT DISABLED 00410 #elif (TLS_SECP256K1_SUPPORT != ENABLED && TLS_SECP256K1_SUPPORT != DISABLED) 00411 #error TLS_SECP256K1_SUPPORT parameter is not valid 00412 #endif 00413 00414 //secp256r1 elliptic curve support 00415 #ifndef TLS_SECP256R1_SUPPORT 00416 #define TLS_SECP256R1_SUPPORT ENABLED 00417 #elif (TLS_SECP256R1_SUPPORT != ENABLED && TLS_SECP256R1_SUPPORT != DISABLED) 00418 #error TLS_SECP256R1_SUPPORT parameter is not valid 00419 #endif 00420 00421 //secp384r1 elliptic curve support 00422 #ifndef TLS_SECP384R1_SUPPORT 00423 #define TLS_SECP384R1_SUPPORT ENABLED 00424 #elif (TLS_SECP384R1_SUPPORT != ENABLED && TLS_SECP384R1_SUPPORT != DISABLED) 00425 #error TLS_SECP384R1_SUPPORT parameter is not valid 00426 #endif 00427 00428 //secp521r1 elliptic curve support 00429 #ifndef TLS_SECP521R1_SUPPORT 00430 #define TLS_SECP521R1_SUPPORT ENABLED 00431 #elif (TLS_SECP521R1_SUPPORT != ENABLED && TLS_SECP521R1_SUPPORT != DISABLED) 00432 #error TLS_SECP521R1_SUPPORT parameter is not valid 00433 #endif 00434 00435 //brainpoolP256r1 elliptic curve support 00436 #ifndef TLS_BRAINPOOLP256R1_SUPPORT 00437 #define TLS_BRAINPOOLP256R1_SUPPORT DISABLED 00438 #elif (TLS_BRAINPOOLP256R1_SUPPORT != ENABLED && TLS_BRAINPOOLP256R1_SUPPORT != DISABLED) 00439 #error TLS_BRAINPOOLP256R1_SUPPORT parameter is not valid 00440 #endif 00441 00442 //brainpoolP384r1 elliptic curve support 00443 #ifndef TLS_BRAINPOOLP384R1_SUPPORT 00444 #define TLS_BRAINPOOLP384R1_SUPPORT DISABLED 00445 #elif (TLS_BRAINPOOLP384R1_SUPPORT != ENABLED && TLS_BRAINPOOLP384R1_SUPPORT != DISABLED) 00446 #error TLS_BRAINPOOLP384R1_SUPPORT parameter is not valid 00447 #endif 00448 00449 //brainpoolP512r1 elliptic curve support 00450 #ifndef TLS_BRAINPOOLP512R1_SUPPORT 00451 #define TLS_BRAINPOOLP512R1_SUPPORT DISABLED 00452 #elif (TLS_BRAINPOOLP512R1_SUPPORT != ENABLED && TLS_BRAINPOOLP512R1_SUPPORT != DISABLED) 00453 #error TLS_BRAINPOOLP512R1_SUPPORT parameter is not valid 00454 #endif 00455 00456 //Minimum acceptable size for Diffie-Hellman prime modulus 00457 #ifndef TLS_MIN_DH_MODULUS_SIZE 00458 #define TLS_MIN_DH_MODULUS_SIZE 1024 00459 #elif (TLS_MIN_DH_MODULUS_SIZE < 512) 00460 #error TLS_MIN_DH_MODULUS_SIZE parameter is not valid 00461 #endif 00462 00463 //Maximum acceptable size for Diffie-Hellman prime modulus 00464 #ifndef TLS_MAX_DH_MODULUS_SIZE 00465 #define TLS_MAX_DH_MODULUS_SIZE 4096 00466 #elif (TLS_MAX_DH_MODULUS_SIZE < TLS_MIN_DH_MODULUS_SIZE) 00467 #error TLS_MAX_DH_MODULUS_SIZE parameter is not valid 00468 #endif 00469 00470 //Minimum acceptable size for RSA modulus 00471 #ifndef TLS_MIN_RSA_MODULUS_SIZE 00472 #define TLS_MIN_RSA_MODULUS_SIZE 1024 00473 #elif (TLS_MIN_RSA_MODULUS_SIZE < 512) 00474 #error TLS_MIN_RSA_MODULUS_SIZE parameter is not valid 00475 #endif 00476 00477 //Maximum acceptable size for RSA modulus 00478 #ifndef TLS_MAX_RSA_MODULUS_SIZE 00479 #define TLS_MAX_RSA_MODULUS_SIZE 4096 00480 #elif (TLS_MAX_RSA_MODULUS_SIZE < TLS_MIN_RSA_MODULUS_SIZE) 00481 #error TLS_MAX_RSA_MODULUS_SIZE parameter is not valid 00482 #endif 00483 00484 //Minimum acceptable size for DSA prime modulus 00485 #ifndef TLS_MIN_DSA_MODULUS_SIZE 00486 #define TLS_MIN_DSA_MODULUS_SIZE 1024 00487 #elif (TLS_MIN_DSA_MODULUS_SIZE < 512) 00488 #error TLS_MIN_DSA_MODULUS_SIZE parameter is not valid 00489 #endif 00490 00491 //Maximum acceptable size for DSA prime modulus 00492 #ifndef TLS_MAX_DSA_MODULUS_SIZE 00493 #define TLS_MAX_DSA_MODULUS_SIZE 4096 00494 #elif (TLS_MAX_DSA_MODULUS_SIZE < TLS_MIN_DSA_MODULUS_SIZE) 00495 #error TLS_MAX_DSA_MODULUS_SIZE parameter is not valid 00496 #endif 00497 00498 //Maximum size for premaster secret 00499 #ifndef TLS_MAX_PREMASTER_SECRET_SIZE 00500 #define TLS_MAX_PREMASTER_SECRET_SIZE 256 00501 #elif (TLS_MAX_PREMASTER_SECRET_SIZE < 48) 00502 #error TLS_MAX_PREMASTER_SECRET_SIZE parameter is not valid 00503 #endif 00504 00505 //Memory allocation 00506 #ifndef tlsAllocMem 00507 #define tlsAllocMem(size) osAllocMem(size) 00508 #endif 00509 00510 //Memory deallocation 00511 #ifndef tlsFreeMem 00512 #define tlsFreeMem(p) osFreeMem(p) 00513 #endif 00514 00515 //Bind TLS to a particular socket 00516 #define tlsSetSocket(context, socket) tlsSetIoCallbacks(context, (TlsIoHandle) socket, \ 00517 (TlsIoSendCallback) socketSend, (TlsIoReceiveCallback) socketReceive) 00518 00519 //Maximum plaintext record length 00520 #define TLS_MAX_RECORD_LENGTH 16384 00521 //Data overhead caused by record encryption 00522 #define TLS_MAX_RECORD_OVERHEAD 512 00523 00524 //Forward declaration of TlsContext structure 00525 struct _TlsContext; 00526 #define TlsContext struct _TlsContext 00527 00528 00529 /** 00530 * @brief TLS connection end 00531 **/ 00532 00533 typedef enum 00534 { 00535 TLS_CONNECTION_END_CLIENT = 0, 00536 TLS_CONNECTION_END_SERVER = 1 00537 } TlsConnectionEnd; 00538 00539 00540 /** 00541 * @brief Client authentication mode 00542 **/ 00543 00544 typedef enum 00545 { 00546 TLS_CLIENT_AUTH_NONE = 0, 00547 TLS_CLIENT_AUTH_OPTIONAL = 1, 00548 TLS_CLIENT_AUTH_REQUIRED = 2 00549 } TlsClientAuthMode; 00550 00551 00552 /** 00553 * @brief Flags used by read and write functions 00554 **/ 00555 00556 typedef enum 00557 { 00558 TLS_FLAG_WAIT_ALL = 0x0800, 00559 TLS_FLAG_BREAK_CHAR = 0x1000, 00560 TLS_FLAG_BREAK_CRLF = 0x100A, 00561 TLS_FLAG_WAIT_ACK = 0x2000, 00562 TLS_FLAG_BUFFER = 0x4000 00563 } TlsFlags; 00564 00565 00566 //The TLS_FLAG_BREAK macro causes the read function to stop reading 00567 //data whenever the specified break character is encountered 00568 #define TLS_FLAG_BREAK(c) (TLS_FLAG_BREAK_CHAR | LSB(c)) 00569 00570 00571 /** 00572 * @brief Content type 00573 **/ 00574 00575 typedef enum 00576 { 00577 TLS_TYPE_NONE = 0, 00578 TLS_TYPE_CHANGE_CIPHER_SPEC = 20, 00579 TLS_TYPE_ALERT = 21, 00580 TLS_TYPE_HANDSHAKE = 22, 00581 TLS_TYPE_APPLICATION_DATA = 23, 00582 TLS_TYPE_HEARTBEAT = 24 00583 } TlsContentType; 00584 00585 00586 /** 00587 * @brief Handshake message type 00588 **/ 00589 00590 typedef enum 00591 { 00592 TLS_TYPE_HELLO_REQUEST = 0, 00593 TLS_TYPE_CLIENT_HELLO = 1, 00594 TLS_TYPE_SERVER_HELLO = 2, 00595 TLS_TYPE_HELLO_VERIFY_REQUEST = 3, 00596 TLS_TYPE_NEW_SESSION_TICKET = 4, 00597 TLS_TYPE_CERTIFICATE = 11, 00598 TLS_TYPE_SERVER_KEY_EXCHANGE = 12, 00599 TLS_TYPE_CERTIFICATE_REQUEST = 13, 00600 TLS_TYPE_SERVER_HELLO_DONE = 14, 00601 TLS_TYPE_CERTIFICATE_VERIFY = 15, 00602 TLS_TYPE_CLIENT_KEY_EXCHANGE = 16, 00603 TLS_TYPE_FINISHED = 20, 00604 TLS_TYPE_CERTIFICATE_URL = 21, 00605 TLS_TYPE_CERTIFICATE_STATUS = 22, 00606 TLS_TYPE_SUPPLEMENTAL_DATA = 23 00607 } TlsMessageType; 00608 00609 00610 /** 00611 * @brief Alert level 00612 **/ 00613 00614 typedef enum 00615 { 00616 TLS_ALERT_LEVEL_WARNING = 1, 00617 TLS_ALERT_LEVEL_FATAL = 2, 00618 } TlsAlertLevel; 00619 00620 00621 /** 00622 * @brief Alert description 00623 **/ 00624 00625 typedef enum 00626 { 00627 TLS_ALERT_CLOSE_NOTIFY = 0, 00628 TLS_ALERT_UNEXPECTED_MESSAGE = 10, 00629 TLS_ALERT_BAD_RECORD_MAC = 20, 00630 TLS_ALERT_DECRYPTION_FAILED = 21, 00631 TLS_ALERT_RECORD_OVERFLOW = 22, 00632 TLS_ALERT_DECOMPRESSION_FAILURE = 30, 00633 TLS_ALERT_HANDSHAKE_FAILURE = 40, 00634 TLS_ALERT_NO_CERTIFICATE = 41, 00635 TLS_ALERT_BAD_CERTIFICATE = 42, 00636 TLS_ALERT_UNSUPPORTED_CERTIFICATE = 43, 00637 TLS_ALERT_CERTIFICATE_REVOKED = 44, 00638 TLS_ALERT_CERTIFICATE_EXPIRED = 45, 00639 TLS_ALERT_CERTIFICATE_UNKNOWN = 46, 00640 TLS_ALERT_ILLEGAL_PARAMETER = 47, 00641 TLS_ALERT_UNKNOWN_CA = 48, 00642 TLS_ALERT_ACCESS_DENIED = 49, 00643 TLS_ALERT_DECODE_ERROR = 50, 00644 TLS_ALERT_DECRYPT_ERROR = 51, 00645 TLS_ALERT_EXPORT_RESTRICTION = 60, 00646 TLS_ALERT_PROTOCOL_VERSION = 70, 00647 TLS_ALERT_INSUFFICIENT_SECURITY = 71, 00648 TLS_ALERT_INTERNAL_ERROR = 80, 00649 TLS_ALERT_INAPPROPRIATE_FALLBACK = 86, 00650 TLS_ALERT_USER_CANCELED = 90, 00651 TLS_ALERT_NO_RENEGOTIATION = 100, 00652 TLS_ALERT_UNSUPPORTED_EXTENSION = 110, 00653 TLS_ALERT_CERTIFICATE_UNOBTAINABLE = 111, 00654 TLS_ALERT_UNRECOGNIZED_NAME = 112, 00655 TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE = 113, 00656 TLS_ALERT_BAD_CERTIFICATE_HASH_VALUE = 114, 00657 TLS_ALERT_UNKNOWN_PSK_IDENTITY = 115 00658 } TlsAlertDescription; 00659 00660 00661 /** 00662 * @brief Compression methods 00663 **/ 00664 00665 typedef enum 00666 { 00667 TLS_COMPRESSION_METHOD_NULL = 0, 00668 TLS_COMPRESSION_METHOD_DEFLATE = 1 00669 } TlsCompressionMethodList; 00670 00671 00672 /** 00673 * @brief Key exchange methods 00674 **/ 00675 00676 typedef enum 00677 { 00678 TLS_KEY_EXCH_NONE = 0, 00679 TLS_KEY_EXCH_RSA = 1, 00680 TLS_KEY_EXCH_DH_RSA = 2, 00681 TLS_KEY_EXCH_DHE_RSA = 3, 00682 TLS_KEY_EXCH_DH_DSS = 4, 00683 TLS_KEY_EXCH_DHE_DSS = 5, 00684 TLS_KEY_EXCH_DH_ANON = 6, 00685 TLS_KEY_EXCH_ECDH_RSA = 7, 00686 TLS_KEY_EXCH_ECDHE_RSA = 8, 00687 TLS_KEY_EXCH_ECDH_ECDSA = 9, 00688 TLS_KEY_EXCH_ECDHE_ECDSA = 10, 00689 TLS_KEY_EXCH_ECDH_ANON = 11, 00690 TLS_KEY_EXCH_PSK = 12, 00691 TLS_KEY_EXCH_RSA_PSK = 13, 00692 TLS_KEY_EXCH_DHE_PSK = 14, 00693 TLS_KEY_EXCH_ECDHE_PSK = 15, 00694 TLS_KEY_EXCH_SRP_SHA = 16, 00695 TLS_KEY_EXCH_SRP_SHA_RSA = 17, 00696 TLS_KEY_EXCH_SRP_SHA_DSS = 18 00697 } TlsKeyExchMethod; 00698 00699 00700 /** 00701 * @brief Certificate types 00702 **/ 00703 00704 typedef enum 00705 { 00706 TLS_CERT_NONE = 0, 00707 TLS_CERT_RSA_SIGN = 1, 00708 TLS_CERT_DSS_SIGN = 2, 00709 TLS_CERT_RSA_FIXED_DH = 3, 00710 TLS_CERT_DSS_FIXED_DH = 4, 00711 TLS_CERT_RSA_EPHEMERAL_DH = 5, 00712 TLS_CERT_DSS_EPHEMERAL_DH = 6, 00713 TLS_CERT_FORTEZZA_DMS = 20, 00714 TLS_CERT_ECDSA_SIGN = 64, 00715 TLS_CERT_RSA_FIXED_ECDH = 65, 00716 TLS_CERT_ECDSA_FIXED_ECDH = 66 00717 } TlsCertificateType; 00718 00719 00720 /** 00721 * @brief Hash algorithms 00722 **/ 00723 00724 typedef enum 00725 { 00726 TLS_HASH_ALGO_NONE = 0, 00727 TLS_HASH_ALGO_MD5 = 1, 00728 TLS_HASH_ALGO_SHA1 = 2, 00729 TLS_HASH_ALGO_SHA224 = 3, 00730 TLS_HASH_ALGO_SHA256 = 4, 00731 TLS_HASH_ALGO_SHA384 = 5, 00732 TLS_HASH_ALGO_SHA512 = 6 00733 } TlsHashAlgo; 00734 00735 00736 /** 00737 * @brief Signature algorithms 00738 **/ 00739 00740 typedef enum 00741 { 00742 TLS_SIGN_ALGO_ANONYMOUS = 0, 00743 TLS_SIGN_ALGO_RSA = 1, 00744 TLS_SIGN_ALGO_DSA = 2, 00745 TLS_SIGN_ALGO_ECDSA = 3 00746 } TlsSignatureAlgo; 00747 00748 00749 /** 00750 * @brief TLS extension types 00751 **/ 00752 00753 typedef enum 00754 { 00755 TLS_EXT_SERVER_NAME = 0, 00756 TLS_EXT_MAX_FRAGMENT_LENGTH = 1, 00757 TLS_EXT_CLIENT_CERTIFICATE_URL = 2, 00758 TLS_EXT_TRUSTED_CA_KEYS = 3, 00759 TLS_EXT_TRUNCATED_HMAC = 4, 00760 TLS_EXT_STATUS_REQUEST = 5, 00761 TLS_EXT_USER_MAPPING = 6, 00762 TLS_EXT_CLIENT_AUTHZ = 7, 00763 TLS_EXT_SERVER_AUTHZ = 8, 00764 TLS_EXT_CERT_TYPE = 9, 00765 TLS_EXT_ELLIPTIC_CURVES = 10, 00766 TLS_EXT_EC_POINT_FORMATS = 11, 00767 TLS_EXT_SRP = 12, 00768 TLS_EXT_SIGNATURE_ALGORITHMS = 13, 00769 TLS_EXT_USE_SRTP = 14, 00770 TLS_EXT_HEARTBEAT = 15, 00771 TLS_EXT_ALPN = 16, 00772 TLS_EXT_SESSION_TICKET = 35, 00773 TLS_EXT_RENEGOTIATION_INFO = 65281 00774 } TlsExtensionType; 00775 00776 00777 /** 00778 * @brief Name type 00779 **/ 00780 00781 typedef enum 00782 { 00783 TLS_NAME_TYPE_HOSTNAME = 0 00784 } TlsNameType; 00785 00786 00787 /** 00788 * @brief EC named curves 00789 **/ 00790 00791 typedef enum 00792 { 00793 TLS_EC_CURVE_NONE = 0, 00794 TLS_EC_CURVE_SECT163K1 = 1, //RFC 4492 00795 TLS_EC_CURVE_SECT163R1 = 2, //RFC 4492 00796 TLS_EC_CURVE_SECT163R2 = 3, //RFC 4492 00797 TLS_EC_CURVE_SECT193R1 = 4, //RFC 4492 00798 TLS_EC_CURVE_SECT193R2 = 5, //RFC 4492 00799 TLS_EC_CURVE_SECT233K1 = 6, //RFC 4492 00800 TLS_EC_CURVE_SECT233R1 = 7, //RFC 4492 00801 TLS_EC_CURVE_SECT239K1 = 8, //RFC 4492 00802 TLS_EC_CURVE_SECT283K1 = 9, //RFC 4492 00803 TLS_EC_CURVE_SECT283R1 = 10, //RFC 4492 00804 TLS_EC_CURVE_SECT409K1 = 11, //RFC 4492 00805 TLS_EC_CURVE_SECT409R1 = 12, //RFC 4492 00806 TLS_EC_CURVE_SECT571K1 = 13, //RFC 4492 00807 TLS_EC_CURVE_SECT571R1 = 14, //RFC 4492 00808 TLS_EC_CURVE_SECP160K1 = 15, //RFC 4492 00809 TLS_EC_CURVE_SECP160R1 = 16, //RFC 4492 00810 TLS_EC_CURVE_SECP160R2 = 17, //RFC 4492 00811 TLS_EC_CURVE_SECP192K1 = 18, //RFC 4492 00812 TLS_EC_CURVE_SECP192R1 = 19, //RFC 4492 00813 TLS_EC_CURVE_SECP224K1 = 20, //RFC 4492 00814 TLS_EC_CURVE_SECP224R1 = 21, //RFC 4492 00815 TLS_EC_CURVE_SECP256K1 = 22, //RFC 4492 00816 TLS_EC_CURVE_SECP256R1 = 23, //RFC 4492 00817 TLS_EC_CURVE_SECP384R1 = 24, //RFC 4492 00818 TLS_EC_CURVE_SECP521R1 = 25, //RFC 4492 00819 TLS_EC_CURVE_BRAINPOOLP256R1 = 26, //RFC 7027 00820 TLS_EC_CURVE_BRAINPOOLP384R1 = 27, //RFC 7027 00821 TLS_EC_CURVE_BRAINPOOLP512R1 = 28, //RFC 7027 00822 TLS_EC_CURVE_ECDH_X25519 = 29, //RFC draft 00823 TLS_EC_CURVE_ECDH_X448 = 30, //RFC draft 00824 TLS_EC_CURVE_FFDHE2048 = 256, //RFC 7919 00825 TLS_EC_CURVE_FFDHE3072 = 257, //RFC 7919 00826 TLS_EC_CURVE_FFDHE4096 = 258, //RFC 7919 00827 TLS_EC_CURVE_FFDHE6144 = 259, //RFC 7919 00828 TLS_EC_CURVE_FFDHE8192 = 260, //RFC 7919 00829 TLS_EC_CURVE_ARBITRARY_EXPLICIT_PRIME = 65281, //RFC 4492 00830 TLS_EC_CURVE_ARBITRARY_EXPLICIT_CHAR2 = 65282 //RFC 4492 00831 } TlsEcNamedCurve; 00832 00833 00834 /** 00835 * @brief EC point formats 00836 **/ 00837 00838 typedef enum 00839 { 00840 TLS_EC_POINT_FORMAT_UNCOMPRESSED = 0, 00841 TLS_EC_POINT_FORMAT_ANSIX962_COMPRESSED_PRIME = 1, 00842 TLS_EC_POINT_FORMAT_ANSIX962_COMPRESSED_CHAR2 = 2 00843 } TlsEcPointFormat; 00844 00845 00846 /** 00847 * @brief EC curve types 00848 **/ 00849 00850 typedef enum 00851 { 00852 TLS_EC_CURVE_TYPE_EXPLICIT_PRIME = 1, 00853 TLS_EC_CURVE_TYPE_EXPLICIT_CHAR2 = 2, 00854 TLS_EC_CURVE_TYPE_NAMED_CURVE = 3 00855 } TlsEcCurveType; 00856 00857 00858 /** 00859 * @brief TLS FSM states 00860 **/ 00861 00862 typedef enum 00863 { 00864 TLS_STATE_INIT = 0, 00865 TLS_STATE_CLIENT_HELLO = 1, 00866 TLS_STATE_SERVER_HELLO = 2, 00867 TLS_STATE_SERVER_CERTIFICATE = 3, 00868 TLS_STATE_SERVER_KEY_EXCHANGE = 4, 00869 TLS_STATE_CERTIFICATE_REQUEST = 5, 00870 TLS_STATE_SERVER_HELLO_DONE = 6, 00871 TLS_STATE_CLIENT_CERTIFICATE = 7, 00872 TLS_STATE_CLIENT_KEY_EXCHANGE = 8, 00873 TLS_STATE_CERTIFICATE_VERIFY = 9, 00874 TLS_STATE_CLIENT_CHANGE_CIPHER_SPEC = 10, 00875 TLS_STATE_CLIENT_FINISHED = 11, 00876 TLS_STATE_SERVER_CHANGE_CIPHER_SPEC = 12, 00877 TLS_STATE_SERVER_FINISHED = 13, 00878 TLS_STATE_APPLICATION_DATA = 14, 00879 TLS_STATE_CLOSING = 15, 00880 TLS_STATE_CLOSED = 16 00881 } TlsState; 00882 00883 00884 //CodeWarrior or Win32 compiler? 00885 #if defined(__CWCC__) || defined(_WIN32) 00886 #pragma pack(push, 1) 00887 #endif 00888 00889 00890 /** 00891 * @brief Random structure 00892 **/ 00893 00894 typedef __start_packed struct 00895 { 00896 uint32_t gmtUnixTime; //0-3 00897 uint8_t randomBytes[28]; //4-31 00898 } __end_packed TlsRandom; 00899 00900 00901 /** 00902 * @brief Cipher suite 00903 **/ 00904 00905 typedef uint16_t TlsCipherSuite; 00906 00907 00908 /** 00909 * @brief Cipher suites 00910 **/ 00911 00912 typedef __start_packed struct 00913 { 00914 uint16_t length; //0-1 00915 uint16_t value[]; //2 00916 } __end_packed TlsCipherSuites; 00917 00918 00919 /** 00920 * @brief Compression method 00921 **/ 00922 00923 typedef uint8_t TlsCompressionMethod; 00924 00925 00926 /** 00927 * @brief Compression methods 00928 **/ 00929 00930 typedef __start_packed struct 00931 { 00932 uint8_t length; //0 00933 uint8_t value[]; //1 00934 } __end_packed TlsCompressionMethods; 00935 00936 00937 /** 00938 * @brief Signature algorithm 00939 **/ 00940 00941 typedef __start_packed struct 00942 { 00943 uint8_t hash; //0 00944 uint8_t signature; //1 00945 } __end_packed TlsSignHashAlgo; 00946 00947 00948 /** 00949 * @brief List of signature algorithms 00950 **/ 00951 00952 typedef __start_packed struct 00953 { 00954 uint16_t length; //0-1 00955 TlsSignHashAlgo value[]; //2 00956 } __end_packed TlsSignHashAlgos; 00957 00958 00959 /** 00960 * @brief List of certificate authorities 00961 **/ 00962 00963 typedef __start_packed struct 00964 { 00965 uint16_t length; //0-1 00966 uint8_t value[]; //2 00967 } __end_packed TlsCertAuthorities; 00968 00969 00970 /** 00971 * @brief TLS extension 00972 **/ 00973 00974 typedef __start_packed struct 00975 { 00976 uint16_t type; //0-1 00977 uint16_t length; //2-3 00978 uint8_t value[]; //4 00979 } __end_packed TlsExtension; 00980 00981 00982 /** 00983 * @brief List of TLS extensions 00984 **/ 00985 00986 typedef __start_packed struct 00987 { 00988 uint16_t length; //0-1 00989 uint8_t value[]; //2 00990 } __end_packed TlsExtensions; 00991 00992 00993 /** 00994 * @brief Server name 00995 **/ 00996 00997 typedef __start_packed struct 00998 { 00999 uint8_t type; //0 01000 uint16_t length; //1-2 01001 char_t hostname[]; //2 01002 } __end_packed TlsServerName; 01003 01004 01005 /** 01006 * @brief List of server names 01007 **/ 01008 01009 typedef __start_packed struct 01010 { 01011 uint16_t length; //0-1 01012 uint8_t value[]; //2 01013 } __end_packed TlsServerNameList; 01014 01015 01016 /** 01017 * @brief Protocol name 01018 **/ 01019 01020 typedef __start_packed struct 01021 { 01022 uint8_t length; //0 01023 char_t value[]; //1 01024 } __end_packed TlsProtocolName; 01025 01026 01027 /** 01028 * @brief List of protocol names 01029 **/ 01030 01031 typedef __start_packed struct 01032 { 01033 uint16_t length; //0-1 01034 uint8_t value[]; //2 01035 } __end_packed TlsProtocolNameList; 01036 01037 01038 /** 01039 * @brief List of supported elliptic curves 01040 **/ 01041 01042 typedef __start_packed struct 01043 { 01044 uint16_t length; //0-1 01045 uint16_t value[]; //2 01046 } __end_packed TlsEllipticCurveList; 01047 01048 01049 /** 01050 * @brief List of supported EC point formats 01051 **/ 01052 01053 typedef __start_packed struct 01054 { 01055 uint8_t length; //0 01056 uint8_t value[]; //1 01057 } __end_packed TlsEcPointFormatList; 01058 01059 01060 /** 01061 * @brief PSK identity 01062 **/ 01063 01064 typedef __start_packed struct 01065 { 01066 uint16_t length; //0-1 01067 uint8_t value[]; //2 01068 } __end_packed TlsPskIdentity; 01069 01070 01071 /** 01072 * @brief PSK identity hint 01073 **/ 01074 01075 typedef __start_packed struct 01076 { 01077 uint16_t length; //0-1 01078 uint8_t value[]; //2 01079 } __end_packed TlsPskIdentityHint; 01080 01081 01082 /** 01083 * @brief Digitally-signed element (SSL 3.0, TLS 1.0 and TLS 1.1) 01084 **/ 01085 01086 typedef __start_packed struct 01087 { 01088 uint16_t length; //0-1 01089 uint8_t value[]; //2 01090 } __end_packed TlsDigitalSignature; 01091 01092 01093 /** 01094 * @brief Digitally-signed element (TLS 1.2) 01095 **/ 01096 01097 typedef __start_packed struct 01098 { 01099 TlsSignHashAlgo algorithm; //0-1 01100 uint16_t length; //2-3 01101 uint8_t value[]; //4 01102 } __end_packed TlsDigitalSignature2; 01103 01104 01105 /** 01106 * @brief General format of TLS records 01107 **/ 01108 01109 typedef __start_packed struct 01110 { 01111 uint8_t type; //0 01112 uint16_t version; //1-2 01113 uint16_t length; //3-4 01114 uint8_t data[]; //5 01115 } __end_packed TlsRecord; 01116 01117 01118 /** 01119 * @brief Handshake message 01120 **/ 01121 01122 typedef __start_packed struct 01123 { 01124 uint8_t msgType; //0 01125 uint8_t length[3]; //1-3 01126 uint8_t data[]; //4 01127 } __end_packed TlsHandshake; 01128 01129 01130 /** 01131 * @brief ClientHello message 01132 **/ 01133 01134 typedef __start_packed struct 01135 { 01136 uint8_t msgType; //0 01137 uint8_t length[3]; //1-3 01138 uint16_t clientVersion; //4-5 01139 TlsRandom random; //6-37 01140 uint8_t sessionIdLength; //38 01141 uint8_t sessionId[]; //39 01142 } __end_packed TlsClientHello; 01143 01144 01145 /** 01146 * @brief ServerHello message 01147 **/ 01148 01149 typedef __start_packed struct 01150 { 01151 uint8_t msgType; //0 01152 uint8_t length[3]; //1-3 01153 uint16_t serverVersion; //4-5 01154 TlsRandom random; //6-37 01155 uint8_t sessionIdLength; //38 01156 uint8_t sessionId[]; //39 01157 } __end_packed TlsServerHello; 01158 01159 01160 /** 01161 * @brief Certificate message 01162 **/ 01163 01164 typedef __start_packed struct 01165 { 01166 uint8_t msgType; //0 01167 uint8_t length[3]; //1-3 01168 uint8_t certificateListLength[3]; //4-6 01169 uint8_t certificateList[]; //7 01170 } __end_packed TlsCertificate; 01171 01172 01173 /** 01174 * @brief ServerKeyExchange message 01175 **/ 01176 01177 typedef __start_packed struct 01178 { 01179 uint8_t msgType; //0 01180 uint8_t length[3]; //1-3 01181 uint8_t data[]; //4 01182 } __end_packed TlsServerKeyExchange; 01183 01184 01185 /** 01186 * @brief CertificateRequest message 01187 **/ 01188 01189 typedef __start_packed struct 01190 { 01191 uint8_t msgType; //0 01192 uint8_t length[3]; //1-3 01193 uint8_t certificateTypesLength; //4 01194 uint8_t certificateTypes[]; //5 01195 } __end_packed TlsCertificateRequest; 01196 01197 01198 /** 01199 * @brief ServerHelloDone message 01200 **/ 01201 01202 typedef __start_packed struct 01203 { 01204 uint8_t msgType; //0 01205 uint8_t length[3]; //1-3 01206 } __end_packed TlsServerHelloDone; 01207 01208 01209 /** 01210 * @brief ClientKeyExchange message 01211 **/ 01212 01213 typedef __start_packed struct 01214 { 01215 uint8_t msgType; //0 01216 uint8_t length[3]; //1-3 01217 uint8_t data[]; //4 01218 } __end_packed TlsClientKeyExchange; 01219 01220 01221 /** 01222 * @brief CertificateVerify message 01223 **/ 01224 01225 typedef __start_packed struct 01226 { 01227 uint8_t msgType; //0 01228 uint8_t length[3]; //1-3 01229 uint8_t signature[]; //4 01230 } __end_packed TlsCertificateVerify; 01231 01232 01233 /** 01234 * @brief Finished message 01235 **/ 01236 01237 typedef __start_packed struct 01238 { 01239 uint8_t msgType; //0 01240 uint8_t length[3]; //1-3 01241 uint8_t verifyData[]; //4 01242 } __end_packed TlsFinished; 01243 01244 01245 /** 01246 * @brief ChangeCipherSpec message 01247 **/ 01248 01249 typedef __start_packed struct 01250 { 01251 uint8_t type; //0 01252 } __end_packed TlsChangeCipherSpec; 01253 01254 01255 /** 01256 * @brief Alert message 01257 **/ 01258 01259 typedef __start_packed struct 01260 { 01261 uint8_t level; //0 01262 uint8_t description; //1 01263 } __end_packed TlsAlert; 01264 01265 01266 //CodeWarrior or Win32 compiler? 01267 #if defined(__CWCC__) || defined(_WIN32) 01268 #pragma pack(pop) 01269 #endif 01270 01271 01272 /** 01273 * @brief Sequence number 01274 **/ 01275 01276 typedef uint8_t TlsSequenceNumber[8]; 01277 01278 01279 /** 01280 * @brief Handle for I/O operations 01281 **/ 01282 01283 typedef void *TlsIoHandle; 01284 01285 01286 /** 01287 * @brief Send callback function 01288 **/ 01289 01290 typedef error_t (*TlsIoSendCallback)(TlsIoHandle handle, 01291 const void *data, size_t length, size_t *written, uint_t flags); 01292 01293 01294 /** 01295 * @brief Receive callback function 01296 **/ 01297 01298 typedef error_t (*TlsIoReceiveCallback)(TlsIoHandle handle, 01299 void *data, size_t size, size_t *received, uint_t flags); 01300 01301 01302 /** 01303 * @brief Pre-shared key callback function 01304 **/ 01305 01306 typedef error_t (*TlsPskCallback)(TlsContext *context, 01307 const char_t *pskIdentity); 01308 01309 01310 /** 01311 * @brief Structure describing a cipher suite 01312 **/ 01313 01314 typedef struct 01315 { 01316 uint16_t identifier; 01317 const char_t *name; 01318 TlsKeyExchMethod keyExchMethod; 01319 const CipherAlgo *cipherAlgo; 01320 CipherMode cipherMode; 01321 const HashAlgo *hashAlgo; 01322 const HashAlgo *prfHashAlgo; 01323 uint8_t macKeyLen; 01324 uint8_t encKeyLen; 01325 uint8_t fixedIvLen; 01326 uint8_t recordIvLen; 01327 uint8_t authTagLen; 01328 uint8_t verifyDataLen; 01329 } TlsCipherSuiteInfo; 01330 01331 01332 /** 01333 * @brief TLS session 01334 **/ 01335 01336 typedef struct 01337 { 01338 uint8_t id[32]; ///<Session identifier 01339 size_t idLength; ///<Length of the session identifier 01340 systime_t timestamp; ///<Time stamp to manage entry lifetime 01341 uint16_t cipherSuite; ///<Cipher suite identifier 01342 uint8_t compressionMethod; ///<Compression method 01343 uint8_t masterSecret[48]; ///<Master secret 01344 } TlsSession; 01345 01346 01347 /** 01348 * @brief Session cache 01349 **/ 01350 01351 typedef struct 01352 { 01353 OsMutex mutex; ///<Mutex preventing simultaneous access to the cache 01354 uint_t size; ///<Maximum number of entries 01355 TlsSession sessions[]; ///<Cache entries 01356 } TlsCache; 01357 01358 01359 /** 01360 * @brief Certificate descriptor 01361 **/ 01362 01363 typedef struct 01364 { 01365 const char_t *certChain; ///<End entity certificate chain (PEM format) 01366 size_t certChainLength; ///<Length of the certificate chain 01367 const char_t *privateKey; ///<Private key (PEM format) 01368 size_t privateKeyLength; ///<Length of the private key 01369 TlsCertificateType type; ///<End entity certificate type 01370 TlsSignatureAlgo signAlgo; ///<Signature algorithm used to sign the end entity certificate 01371 TlsHashAlgo hashAlgo; ///<Hash algorithm used to sign the end entity certificate 01372 TlsEcNamedCurve namedCurve; ///<Named curve used to generate the EC public key 01373 } TlsCertDesc; 01374 01375 01376 /** 01377 * @brief TLS context 01378 * 01379 * An opaque data structure that represents a TLS connection 01380 * 01381 **/ 01382 01383 struct _TlsContext 01384 { 01385 TlsState state; ///<TLS handshake finite state machine 01386 TlsConnectionEnd entity; ///<Client or server operation 01387 01388 TlsIoHandle handle; ///<Handle for I/O operations 01389 TlsIoSendCallback sendCallback; ///<Send callback function 01390 TlsIoReceiveCallback receiveCallback; ///<Receive callback function 01391 const PrngAlgo *prngAlgo; ///<Pseudo-random number generator to be used 01392 void *prngContext; ///<Pseudo-random number generator context 01393 01394 const uint16_t *cipherSuites; ///<List of supported cipher suites 01395 uint_t numCipherSuites; ///<Number of cipher suites in the list 01396 01397 char_t *serverName; ///<Fully qualified DNS hostname of the server 01398 01399 #if (TLS_ALPN_SUPPORT == ENABLED) 01400 char_t *protocolList; ///<List of supported ALPN protocols 01401 #endif 01402 01403 #if (TLS_PSK_SUPPORT == ENABLED || TLS_RSA_PSK_SUPPORT == ENABLED || \ 01404 TLS_DHE_PSK_SUPPORT == ENABLED || TLS_ECDHE_PSK_SUPPORT == ENABLED) 01405 char_t *psk; ///<Pre-shared key 01406 size_t pskLen; ///<Length of the pre-shared key, in bytes 01407 char_t *pskIdentity; ///<PSK identity 01408 char_t *pskIdentityHint; ///<PSK identity hint 01409 TlsPskCallback pskCallback; ///<PSK callback function 01410 #endif 01411 01412 #if (TLS_DH_ANON_SUPPORT == ENABLED || TLS_DHE_RSA_SUPPORT == ENABLED || \ 01413 TLS_DHE_DSS_SUPPORT == ENABLED || TLS_DHE_PSK_SUPPORT == ENABLED) 01414 DhContext dhContext; ///<Diffie-Hellman context 01415 #endif 01416 01417 #if (TLS_ECDH_ANON_SUPPORT == ENABLED || TLS_ECDHE_RSA_SUPPORT == ENABLED || \ 01418 TLS_ECDHE_ECDSA_SUPPORT == ENABLED || TLS_ECDHE_PSK_SUPPORT == ENABLED) 01419 EcdhContext ecdhContext; ///<ECDH context 01420 #endif 01421 01422 TlsCertDesc certs[TLS_MAX_CERTIFICATES]; //End entity certificates 01423 uint_t numCerts; //Number of certificates available 01424 TlsCertDesc *cert; //Pointer to the currently selected certificate 01425 01426 const char_t *trustedCaList; ///<List of trusted CA (PEM format) 01427 size_t trustedCaListLen; ///<Number of trusted CA in the list 01428 01429 TlsCertificateType peerCertType; ///<Peer's certificate type 01430 01431 #if (TLS_RSA_SIGN_SUPPORT == ENABLED || TLS_RSA_SUPPORT == ENABLED || \ 01432 TLS_DHE_RSA_SUPPORT == ENABLED || TLS_ECDHE_RSA_SUPPORT == ENABLED) 01433 RsaPublicKey peerRsaPublicKey; ///<Peer's RSA public key 01434 #endif 01435 01436 #if (TLS_DSA_SIGN_SUPPORT == ENABLED || TLS_DHE_DSS_SUPPORT == ENABLED) 01437 DsaPublicKey peerDsaPublicKey; ///<Peer's DSA public key 01438 #endif 01439 01440 #if (TLS_ECDSA_SIGN_SUPPORT == ENABLED || TLS_ECDHE_ECDSA_SUPPORT == ENABLED) 01441 EcDomainParameters peerEcParams; ///<Peer's EC domain parameters 01442 EcPoint peerEcPublicKey; ///<Peer's EC public key 01443 #endif 01444 01445 TlsCache *cache; ///<TLS session cache 01446 01447 uint8_t sessionId[32]; ///<Session identifier 01448 size_t sessionIdLen; ///<Length of the session identifier 01449 01450 uint16_t clientVersion; ///<Latest version supported by the client 01451 uint16_t version; ///<Negotiated TLS version 01452 uint16_t cipherSuite; ///<Negotiated cipher suite 01453 uint8_t compressionMethod; ///<Negotiated compression algorithm 01454 uint16_t namedCurve; ///<Named curve 01455 01456 TlsHashAlgo signHashAlgo; ///<Hash algorithm used for signing 01457 TlsKeyExchMethod keyExchMethod; ///<Key exchange method 01458 const CipherAlgo *cipherAlgo; ///<Bulk cipher algorithm 01459 CipherMode cipherMode; ///<Cipher mode of operation 01460 const HashAlgo *hashAlgo; ///<Hash algorithm for MAC operations 01461 const HashAlgo *prfHashAlgo; ///<Hash algorithm for PRF operations 01462 size_t macKeyLen; ///<Number of bytes that are used for generating MAC keys 01463 size_t encKeyLen; ///<Number of bytes that are used for generating encryption keys 01464 size_t fixedIvLen; ///<Amount of data needed to be generated for the IV 01465 size_t recordIvLen; ///<Length of the IV 01466 size_t authTagLen; ///<Length of the authentication tag 01467 size_t verifyDataLen; ///<Length of the verify data 01468 01469 //#if (TLS_MAX_VERSION >= SSL_VERSION_3_0 && TLS_MIN_VERSION <= TLS_VERSION_1_1) 01470 Md5Context *handshakeMd5Context; ///<MD5 context used to compute verify data 01471 Sha1Context *handshakeSha1Context; ///<SHA-1 context used to compute verify data 01472 //#endif 01473 01474 //#if (TLS_MAX_VERSION >= TLS_VERSION_1_2 && TLS_MIN_VERSION <= TLS_VERSION_1_2) 01475 HashContext *handshakeHashContext; ///<Hash context used to compute verify data (TLS 1.2) 01476 //#endif 01477 01478 uint8_t verifyData[64]; ///<Verify data 01479 01480 bool_t ecPointFormatExtFound; ///<The EcPointFormats extension has been received 01481 01482 TlsClientAuthMode clientAuthMode; ///<Client authentication mode 01483 bool_t clientCertRequested; ///<This flag tells whether the client certificate is requested 01484 01485 bool_t resume; ///<The connection is established by resuming a session 01486 bool_t changeCipherSpecSent; ///<A ChangeCipherSpec message has been sent 01487 bool_t changeCipherSpecReceived; ///<A ChangeCipherSpec message has been received from the peer 01488 bool_t fatalAlertSent; ///<A fatal alert message has been sent 01489 bool_t fatalAlertReceived; ///<A fatal alert message has been received from the peer 01490 bool_t closeNotifySent; ///<A closure alert has been sent 01491 bool_t closeNotifyReceived; ///<A closure alert has been received from the peer 01492 01493 HmacContext hmacContext; ///<HMAC context 01494 void *writeCipherContext; ///<Bulk cipher context for write operations 01495 void *readCipherContext; ///<Bulk cipher context for read operations 01496 #if (TLS_GCM_CIPHER_SUPPORT == ENABLED) 01497 GcmContext *writeGcmContext; ///<GCM context for write operations 01498 GcmContext *readGcmContext; ///<GCM context for read operations 01499 #endif 01500 01501 uint8_t *txBuffer; ///<TX buffer 01502 size_t txBufferSize; ///<TX buffer size 01503 TlsContentType txBufferType; ///<Type of data that resides in the TX buffer 01504 size_t txBufferLen; ///<Number of bytes that are pending to be sent 01505 size_t txBufferPos; ///<Current position in TX buffer 01506 size_t txRecordMaxLen; ///<Maximum plaintext fragment length 01507 size_t txRecordLen; ///<Length of the TLS record 01508 size_t txRecordPos; ///<Current position in the TLS record 01509 01510 uint8_t *rxBuffer; ///<RX buffer 01511 size_t rxBufferSize; ///<RX buffer size 01512 TlsContentType rxBufferType; ///<Type of data that resides in the RX buffer 01513 size_t rxBufferLen; ///<Number of bytes available for reading 01514 size_t rxBufferPos; ///<Current position in RX buffer 01515 size_t rxRecordMaxLen; ///<Maximum plaintext fragment length 01516 size_t rxRecordLen; ///<Length of the TLS record 01517 size_t rxRecordPos; ///<Current position in the TLS record 01518 01519 union 01520 { 01521 struct 01522 { 01523 TlsRandom clientRandom; ///<Client random value 01524 TlsRandom serverRandom; ///<Server random value 01525 }; 01526 uint8_t random[64]; 01527 }; 01528 01529 uint8_t premasterSecret[TLS_MAX_PREMASTER_SECRET_SIZE]; ///<Premaster secret 01530 size_t premasterSecretLen; ///<Length of the premaster secret 01531 uint8_t masterSecret[48]; ///<Master secret 01532 uint8_t keyBlock[192]; ///<Key material 01533 uint8_t *writeMacKey; ///<Write MAC key 01534 uint8_t *readMacKey; ///<Read MAC key 01535 uint8_t *writeEncKey; ///<Encryption key that serves for write operations 01536 uint8_t *readEncKey; ///<Encryption key that serves for read operations 01537 uint8_t *writeIv; ///<Write IV 01538 uint8_t *readIv; ///<Read IV 01539 01540 TlsSequenceNumber writeSeqNum; ///<Write sequence number 01541 TlsSequenceNumber readSeqNum; ///<Read sequence number 01542 }; 01543 01544 01545 //TLS application programming interface (API) 01546 TlsContext *tlsInit(void); 01547 01548 error_t tlsSetIoCallbacks(TlsContext *context, TlsIoHandle handle, 01549 TlsIoSendCallback sendCallback, TlsIoReceiveCallback receiveCallback); 01550 01551 error_t tlsSetConnectionEnd(TlsContext *context, TlsConnectionEnd entity); 01552 error_t tlsSetPrng(TlsContext *context, const PrngAlgo *prngAlgo, void *prngContext); 01553 error_t tlsSetServerName(TlsContext *context, const char_t *serverName); 01554 error_t tlsSetCache(TlsContext *context, TlsCache *cache); 01555 error_t tlsSetClientAuthMode(TlsContext *context, TlsClientAuthMode mode); 01556 01557 error_t tlsSetBufferSize(TlsContext *context, 01558 size_t txBufferSize, size_t rxBufferSize); 01559 01560 error_t tlsSetCipherSuites(TlsContext *context, 01561 const uint16_t *cipherSuites, uint_t length); 01562 01563 error_t tlsSetDhParameters(TlsContext *context, 01564 const char_t *params, size_t length); 01565 01566 error_t tlsSetAlpnProtocolList(TlsContext *context, const char_t *protocolList); 01567 const char_t *tlsGetAlpnProtocol(TlsContext *context); 01568 01569 error_t tlsSetPsk(TlsContext *context, const uint8_t *psk, size_t pskLength); 01570 error_t tlsSetPskIdentity(TlsContext *context, const char_t *pskIdentity); 01571 error_t tlsSetPskIdentityHint(TlsContext *context, const char_t *pskIdentityHint); 01572 error_t tlsSetPskCallback(TlsContext *context, TlsPskCallback pskCallback); 01573 01574 error_t tlsSetTrustedCaList(TlsContext *context, 01575 const char_t *trustedCaList, size_t length); 01576 01577 error_t tlsAddCertificate(TlsContext *context, const char_t *certChain, 01578 size_t certChainLength, const char_t *privateKey, size_t privateKeyLength); 01579 01580 error_t tlsConnect(TlsContext *context); 01581 01582 error_t tlsWrite(TlsContext *context, const void *data, 01583 size_t length, size_t *written, uint_t flags); 01584 01585 error_t tlsRead(TlsContext *context, void *data, 01586 size_t size, size_t *received, uint_t flags); 01587 01588 error_t tlsShutdown(TlsContext *context); 01589 error_t tlsShutdownEx(TlsContext *context, bool_t waitForCloseNotify); 01590 01591 void tlsFree(TlsContext *context); 01592 01593 error_t tlsSaveSession(const TlsContext *context, TlsSession *session); 01594 error_t tlsRestoreSession(TlsContext *context, const TlsSession *session); 01595 01596 TlsCache *tlsInitCache(uint_t size); 01597 void tlsFreeCache(TlsCache *cache); 01598 01599 #endif 01600
Generated on Tue Jul 12 2022 17:10:17 by
1.7.2