This is a port of cyaSSL 2.7.0.

Dependents:   CyaSSL_DTLS_Cellular CyaSSL_DTLS_Ethernet

Committer:
ashleymills
Date:
Thu Sep 05 15:55:50 2013 +0000
Revision:
1:c0ce1562443a
Parent:
0:714293de3836
Nothing;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:714293de3836 1 /* internal.h
ashleymills 0:714293de3836 2 *
ashleymills 0:714293de3836 3 * Copyright (C) 2006-2013 wolfSSL Inc.
ashleymills 0:714293de3836 4 *
ashleymills 0:714293de3836 5 * This file is part of CyaSSL.
ashleymills 0:714293de3836 6 *
ashleymills 0:714293de3836 7 * CyaSSL is free software; you can redistribute it and/or modify
ashleymills 0:714293de3836 8 * it under the terms of the GNU General Public License as published by
ashleymills 0:714293de3836 9 * the Free Software Foundation; either version 2 of the License, or
ashleymills 0:714293de3836 10 * (at your option) any later version.
ashleymills 0:714293de3836 11 *
ashleymills 0:714293de3836 12 * CyaSSL is distributed in the hope that it will be useful,
ashleymills 0:714293de3836 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ashleymills 0:714293de3836 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ashleymills 0:714293de3836 15 * GNU General Public License for more details.
ashleymills 0:714293de3836 16 *
ashleymills 0:714293de3836 17 * You should have received a copy of the GNU General Public License
ashleymills 0:714293de3836 18 * along with this program; if not, write to the Free Software
ashleymills 0:714293de3836 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
ashleymills 0:714293de3836 20 */
ashleymills 0:714293de3836 21
ashleymills 0:714293de3836 22
ashleymills 0:714293de3836 23 #ifndef CYASSL_INT_H
ashleymills 0:714293de3836 24 #define CYASSL_INT_H
ashleymills 0:714293de3836 25
ashleymills 0:714293de3836 26
ashleymills 0:714293de3836 27 #include <cyassl/ctaocrypt/types.h>
ashleymills 0:714293de3836 28 #include <cyassl/ssl.h>
ashleymills 0:714293de3836 29 #include <cyassl/crl.h>
ashleymills 0:714293de3836 30 #include <cyassl/ctaocrypt/random.h>
ashleymills 0:714293de3836 31 #include <cyassl/ctaocrypt/des3.h>
ashleymills 0:714293de3836 32 #include <cyassl/ctaocrypt/hc128.h>
ashleymills 0:714293de3836 33 #include <cyassl/ctaocrypt/rabbit.h>
ashleymills 0:714293de3836 34 #include <cyassl/ctaocrypt/asn.h>
ashleymills 0:714293de3836 35 #include <cyassl/ctaocrypt/md5.h>
ashleymills 0:714293de3836 36 #include <cyassl/ctaocrypt/sha.h>
ashleymills 0:714293de3836 37 #include <cyassl/ctaocrypt/aes.h>
ashleymills 0:714293de3836 38 #include <cyassl/ctaocrypt/camellia.h>
ashleymills 0:714293de3836 39 #include <cyassl/ctaocrypt/logging.h>
ashleymills 0:714293de3836 40 #ifndef NO_RC4
ashleymills 0:714293de3836 41 #include <cyassl/ctaocrypt/arc4.h>
ashleymills 0:714293de3836 42 #endif
ashleymills 0:714293de3836 43 #ifdef HAVE_ECC
ashleymills 0:714293de3836 44 #include <cyassl/ctaocrypt/ecc.h>
ashleymills 0:714293de3836 45 #endif
ashleymills 0:714293de3836 46 #ifndef NO_SHA256
ashleymills 0:714293de3836 47 #include <cyassl/ctaocrypt/sha256.h>
ashleymills 0:714293de3836 48 #endif
ashleymills 0:714293de3836 49 #ifdef HAVE_OCSP
ashleymills 0:714293de3836 50 #include <cyassl/ocsp.h>
ashleymills 0:714293de3836 51 #endif
ashleymills 0:714293de3836 52 #ifdef CYASSL_SHA512
ashleymills 0:714293de3836 53 #include <cyassl/ctaocrypt/sha512.h>
ashleymills 0:714293de3836 54 #endif
ashleymills 0:714293de3836 55
ashleymills 0:714293de3836 56 #ifdef HAVE_AESGCM
ashleymills 0:714293de3836 57 #include <cyassl/ctaocrypt/sha512.h>
ashleymills 0:714293de3836 58 #endif
ashleymills 0:714293de3836 59
ashleymills 0:714293de3836 60 #ifdef CYASSL_RIPEMD
ashleymills 0:714293de3836 61 #include <cyassl/ctaocrypt/ripemd.h>
ashleymills 0:714293de3836 62 #endif
ashleymills 0:714293de3836 63
ashleymills 0:714293de3836 64 #ifdef CYASSL_CALLBACKS
ashleymills 0:714293de3836 65 #include <cyassl/callbacks.h>
ashleymills 0:714293de3836 66 #include <signal.h>
ashleymills 0:714293de3836 67 #endif
ashleymills 0:714293de3836 68
ashleymills 0:714293de3836 69 #ifdef USE_WINDOWS_API
ashleymills 0:714293de3836 70 #ifdef CYASSL_GAME_BUILD
ashleymills 0:714293de3836 71 #include "system/xtl.h"
ashleymills 0:714293de3836 72 #else
ashleymills 0:714293de3836 73 #if defined(_WIN32_WCE) || defined(WIN32_LEAN_AND_MEAN)
ashleymills 0:714293de3836 74 /* On WinCE winsock2.h must be included before windows.h */
ashleymills 0:714293de3836 75 #include <winsock2.h>
ashleymills 0:714293de3836 76 #endif
ashleymills 0:714293de3836 77 #include <windows.h>
ashleymills 0:714293de3836 78 #endif
ashleymills 0:714293de3836 79 #elif defined(THREADX)
ashleymills 0:714293de3836 80 #ifndef SINGLE_THREADED
ashleymills 0:714293de3836 81 #include "tx_api.h"
ashleymills 0:714293de3836 82 #endif
ashleymills 0:714293de3836 83 #elif defined(MICRIUM)
ashleymills 0:714293de3836 84 /* do nothing, just don't pick Unix */
ashleymills 0:714293de3836 85 #elif defined(FREERTOS) || defined(CYASSL_SAFERTOS)
ashleymills 0:714293de3836 86 /* do nothing */
ashleymills 0:714293de3836 87 #elif defined(EBSNET)
ashleymills 0:714293de3836 88 /* do nothing */
ashleymills 0:714293de3836 89 #elif defined(FREESCALE_MQX)
ashleymills 0:714293de3836 90 /* do nothing */
ashleymills 0:714293de3836 91 #elif defined(CYASSL_MDK_ARM)
ashleymills 0:714293de3836 92 #include <rtl.h>
ashleymills 0:714293de3836 93 #else
ashleymills 0:714293de3836 94 #ifndef SINGLE_THREADED
ashleymills 0:714293de3836 95 #define CYASSL_PTHREADS
ashleymills 0:714293de3836 96 #include <pthread.h>
ashleymills 0:714293de3836 97 #endif
ashleymills 0:714293de3836 98 #if defined(OPENSSL_EXTRA) || defined(GOAHEAD_WS)
ashleymills 0:714293de3836 99 #include <unistd.h> /* for close of BIO */
ashleymills 0:714293de3836 100 #endif
ashleymills 0:714293de3836 101 #endif
ashleymills 0:714293de3836 102
ashleymills 0:714293de3836 103 #ifdef HAVE_LIBZ
ashleymills 0:714293de3836 104 #include "zlib.h"
ashleymills 0:714293de3836 105 #endif
ashleymills 0:714293de3836 106
ashleymills 0:714293de3836 107 #ifdef _MSC_VER
ashleymills 0:714293de3836 108 /* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */
ashleymills 0:714293de3836 109 #pragma warning(disable: 4996)
ashleymills 0:714293de3836 110 #endif
ashleymills 0:714293de3836 111
ashleymills 0:714293de3836 112 #ifdef NO_AES
ashleymills 0:714293de3836 113 #if !defined (ALIGN16)
ashleymills 0:714293de3836 114 #define ALIGN16
ashleymills 0:714293de3836 115 #endif
ashleymills 0:714293de3836 116 #endif
ashleymills 0:714293de3836 117
ashleymills 0:714293de3836 118 #ifdef NO_SHA
ashleymills 0:714293de3836 119 #define SHA_DIGEST_SIZE 20
ashleymills 0:714293de3836 120 #endif
ashleymills 0:714293de3836 121
ashleymills 0:714293de3836 122 #ifdef NO_SHA256
ashleymills 0:714293de3836 123 #define SHA256_DIGEST_SIZE 32
ashleymills 0:714293de3836 124 #endif
ashleymills 0:714293de3836 125
ashleymills 0:714293de3836 126
ashleymills 0:714293de3836 127 #ifdef __cplusplus
ashleymills 0:714293de3836 128 extern "C" {
ashleymills 0:714293de3836 129 #endif
ashleymills 0:714293de3836 130
ashleymills 0:714293de3836 131
ashleymills 0:714293de3836 132 #ifdef USE_WINDOWS_API
ashleymills 0:714293de3836 133 typedef unsigned int SOCKET_T;
ashleymills 0:714293de3836 134 #else
ashleymills 0:714293de3836 135 typedef int SOCKET_T;
ashleymills 0:714293de3836 136 #endif
ashleymills 0:714293de3836 137
ashleymills 0:714293de3836 138
ashleymills 0:714293de3836 139 typedef byte word24[3];
ashleymills 0:714293de3836 140
ashleymills 0:714293de3836 141 /* used by ssl.c and cyassl_int.c */
ashleymills 0:714293de3836 142 void c32to24(word32 in, word24 out);
ashleymills 0:714293de3836 143
ashleymills 0:714293de3836 144 /* Define or comment out the cipher suites you'd like to be compiled in
ashleymills 0:714293de3836 145 make sure to use at least one BUILD_SSL_xxx or BUILD_TLS_xxx is defined
ashleymills 0:714293de3836 146
ashleymills 0:714293de3836 147 When adding cipher suites, add name to cipher_names, idx to cipher_name_idx
ashleymills 0:714293de3836 148 */
ashleymills 0:714293de3836 149 #if !defined(NO_RSA) && !defined(NO_RC4)
ashleymills 0:714293de3836 150 #if !defined(NO_SHA)
ashleymills 0:714293de3836 151 #define BUILD_SSL_RSA_WITH_RC4_128_SHA
ashleymills 0:714293de3836 152 #endif
ashleymills 0:714293de3836 153 #if !defined(NO_MD5)
ashleymills 0:714293de3836 154 #define BUILD_SSL_RSA_WITH_RC4_128_MD5
ashleymills 0:714293de3836 155 #endif
ashleymills 0:714293de3836 156 #if !defined(NO_TLS) && defined(HAVE_NTRU) && !defined(NO_SHA)
ashleymills 0:714293de3836 157 #define BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
ashleymills 0:714293de3836 158 #endif
ashleymills 0:714293de3836 159 #endif
ashleymills 0:714293de3836 160
ashleymills 0:714293de3836 161 #if !defined(NO_RSA) && !defined(NO_DES3)
ashleymills 0:714293de3836 162 #if !defined(NO_SHA)
ashleymills 0:714293de3836 163 #define BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
ashleymills 0:714293de3836 164 #if !defined(NO_TLS) && defined(HAVE_NTRU)
ashleymills 0:714293de3836 165 #define BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
ashleymills 0:714293de3836 166 #endif
ashleymills 0:714293de3836 167 #endif
ashleymills 0:714293de3836 168 #endif
ashleymills 0:714293de3836 169
ashleymills 0:714293de3836 170 #if !defined(NO_RSA) && !defined(NO_AES) && !defined(NO_TLS)
ashleymills 0:714293de3836 171 #if !defined(NO_SHA)
ashleymills 0:714293de3836 172 #define BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 173 #define BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 174 #if defined(HAVE_NTRU)
ashleymills 0:714293de3836 175 #define BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 176 #define BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 177 #endif
ashleymills 0:714293de3836 178 #endif
ashleymills 0:714293de3836 179 #if !defined (NO_SHA256)
ashleymills 0:714293de3836 180 #define BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
ashleymills 0:714293de3836 181 #define BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
ashleymills 0:714293de3836 182 #endif
ashleymills 0:714293de3836 183 #if defined (HAVE_AESGCM)
ashleymills 0:714293de3836 184 #define BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
ashleymills 0:714293de3836 185 #if defined (CYASSL_SHA384)
ashleymills 0:714293de3836 186 #define BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
ashleymills 0:714293de3836 187 #endif
ashleymills 0:714293de3836 188 #endif
ashleymills 0:714293de3836 189 #if defined (HAVE_AESCCM)
ashleymills 0:714293de3836 190 #define BUILD_TLS_RSA_WITH_AES_128_CCM_8
ashleymills 0:714293de3836 191 #define BUILD_TLS_RSA_WITH_AES_256_CCM_8
ashleymills 0:714293de3836 192 #endif
ashleymills 0:714293de3836 193 #endif
ashleymills 0:714293de3836 194
ashleymills 0:714293de3836 195 #if defined(HAVE_CAMELLIA) && !defined(NO_TLS)
ashleymills 0:714293de3836 196 #ifndef NO_RSA
ashleymills 0:714293de3836 197 #if !defined(NO_SHA)
ashleymills 0:714293de3836 198 #define BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
ashleymills 0:714293de3836 199 #define BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
ashleymills 0:714293de3836 200 #endif
ashleymills 0:714293de3836 201 #ifndef NO_SHA256
ashleymills 0:714293de3836 202 #define BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
ashleymills 0:714293de3836 203 #define BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
ashleymills 0:714293de3836 204 #endif
ashleymills 0:714293de3836 205 #if !defined(NO_DH) && defined(OPENSSL_EXTRA)
ashleymills 0:714293de3836 206 #if !defined(NO_SHA)
ashleymills 0:714293de3836 207 #define BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
ashleymills 0:714293de3836 208 #define BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
ashleymills 0:714293de3836 209 #endif
ashleymills 0:714293de3836 210 #ifndef NO_SHA256
ashleymills 0:714293de3836 211 #define BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
ashleymills 0:714293de3836 212 #define BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
ashleymills 0:714293de3836 213 #endif
ashleymills 0:714293de3836 214 #endif
ashleymills 0:714293de3836 215 #endif
ashleymills 0:714293de3836 216 #endif
ashleymills 0:714293de3836 217
ashleymills 0:714293de3836 218 #if !defined(NO_PSK) && !defined(NO_AES) && !defined(NO_TLS)
ashleymills 0:714293de3836 219 #if !defined(NO_SHA)
ashleymills 0:714293de3836 220 #define BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 221 #define BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 222 #endif
ashleymills 0:714293de3836 223 #ifndef NO_SHA256
ashleymills 0:714293de3836 224 #define BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
ashleymills 0:714293de3836 225 #ifdef HAVE_AESCCM
ashleymills 0:714293de3836 226 #define BUILD_TLS_PSK_WITH_AES_128_CCM_8
ashleymills 0:714293de3836 227 #define BUILD_TLS_PSK_WITH_AES_256_CCM_8
ashleymills 0:714293de3836 228 #endif
ashleymills 0:714293de3836 229 #endif
ashleymills 0:714293de3836 230 #endif
ashleymills 0:714293de3836 231
ashleymills 0:714293de3836 232 #if !defined(NO_TLS) && defined(HAVE_NULL_CIPHER)
ashleymills 0:714293de3836 233 #if !defined(NO_RSA)
ashleymills 0:714293de3836 234 #if !defined(NO_SHA)
ashleymills 0:714293de3836 235 #define BUILD_TLS_RSA_WITH_NULL_SHA
ashleymills 0:714293de3836 236 #endif
ashleymills 0:714293de3836 237 #ifndef NO_SHA256
ashleymills 0:714293de3836 238 #define BUILD_TLS_RSA_WITH_NULL_SHA256
ashleymills 0:714293de3836 239 #endif
ashleymills 0:714293de3836 240 #endif
ashleymills 0:714293de3836 241 #if !defined(NO_PSK)
ashleymills 0:714293de3836 242 #if !defined(NO_SHA)
ashleymills 0:714293de3836 243 #define BUILD_TLS_PSK_WITH_NULL_SHA
ashleymills 0:714293de3836 244 #endif
ashleymills 0:714293de3836 245 #ifndef NO_SHA256
ashleymills 0:714293de3836 246 #define BUILD_TLS_PSK_WITH_NULL_SHA256
ashleymills 0:714293de3836 247 #endif
ashleymills 0:714293de3836 248 #endif
ashleymills 0:714293de3836 249 #endif
ashleymills 0:714293de3836 250
ashleymills 0:714293de3836 251 #if !defined(NO_HC128) && !defined(NO_RSA) && !defined(NO_TLS)
ashleymills 0:714293de3836 252 #define BUILD_TLS_RSA_WITH_HC_128_CBC_MD5
ashleymills 0:714293de3836 253 #if !defined(NO_SHA)
ashleymills 0:714293de3836 254 #define BUILD_TLS_RSA_WITH_HC_128_CBC_SHA
ashleymills 0:714293de3836 255 #endif
ashleymills 0:714293de3836 256 #endif
ashleymills 0:714293de3836 257
ashleymills 0:714293de3836 258 #if !defined(NO_RABBIT) && !defined(NO_TLS) && !defined(NO_RSA)
ashleymills 0:714293de3836 259 #if !defined(NO_SHA)
ashleymills 0:714293de3836 260 #define BUILD_TLS_RSA_WITH_RABBIT_CBC_SHA
ashleymills 0:714293de3836 261 #endif
ashleymills 0:714293de3836 262 #endif
ashleymills 0:714293de3836 263
ashleymills 0:714293de3836 264 #if !defined(NO_DH) && !defined(NO_AES) && !defined(NO_TLS) && \
ashleymills 0:714293de3836 265 !defined(NO_RSA) && defined(OPENSSL_EXTRA)
ashleymills 0:714293de3836 266 #if !defined(NO_SHA)
ashleymills 0:714293de3836 267 #define BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 268 #define BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 269 #endif
ashleymills 0:714293de3836 270 #if !defined (NO_SHA256)
ashleymills 0:714293de3836 271 #define BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
ashleymills 0:714293de3836 272 #define BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
ashleymills 0:714293de3836 273 #if defined (HAVE_AESGCM)
ashleymills 0:714293de3836 274 #define BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
ashleymills 0:714293de3836 275 #if defined (CYASSL_SHA384)
ashleymills 0:714293de3836 276 #define BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
ashleymills 0:714293de3836 277 #endif
ashleymills 0:714293de3836 278 #endif
ashleymills 0:714293de3836 279 #endif
ashleymills 0:714293de3836 280 #endif
ashleymills 0:714293de3836 281
ashleymills 0:714293de3836 282 #if defined(HAVE_ECC) && !defined(NO_TLS)
ashleymills 0:714293de3836 283 #if !defined(NO_AES)
ashleymills 0:714293de3836 284 #if !defined(NO_SHA)
ashleymills 0:714293de3836 285 #if !defined(NO_RSA)
ashleymills 0:714293de3836 286 #define BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 287 #define BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 288 #define BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 289 #define BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 290 #endif
ashleymills 0:714293de3836 291
ashleymills 0:714293de3836 292 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 293 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 294
ashleymills 0:714293de3836 295 #define BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
ashleymills 0:714293de3836 296 #define BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
ashleymills 0:714293de3836 297 #endif /* NO_SHA */
ashleymills 0:714293de3836 298 #ifndef NO_SHA256
ashleymills 0:714293de3836 299 #if !defined(NO_RSA)
ashleymills 0:714293de3836 300 #define BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
ashleymills 0:714293de3836 301 #define BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
ashleymills 0:714293de3836 302 #endif
ashleymills 0:714293de3836 303 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
ashleymills 0:714293de3836 304 #define BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
ashleymills 0:714293de3836 305 #endif
ashleymills 0:714293de3836 306
ashleymills 0:714293de3836 307 #ifdef CYASSL_SHA384
ashleymills 0:714293de3836 308 #if !defined(NO_RSA)
ashleymills 0:714293de3836 309 #define BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
ashleymills 0:714293de3836 310 #define BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
ashleymills 0:714293de3836 311 #endif
ashleymills 0:714293de3836 312 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
ashleymills 0:714293de3836 313 #define BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
ashleymills 0:714293de3836 314 #endif
ashleymills 0:714293de3836 315
ashleymills 0:714293de3836 316 #if defined (HAVE_AESGCM)
ashleymills 0:714293de3836 317 #if !defined(NO_RSA)
ashleymills 0:714293de3836 318 #define BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
ashleymills 0:714293de3836 319 #define BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
ashleymills 0:714293de3836 320 #if defined(CYASSL_SHA384)
ashleymills 0:714293de3836 321 #define BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
ashleymills 0:714293de3836 322 #define BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
ashleymills 0:714293de3836 323 #endif
ashleymills 0:714293de3836 324 #endif
ashleymills 0:714293de3836 325
ashleymills 0:714293de3836 326 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
ashleymills 0:714293de3836 327 #define BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
ashleymills 0:714293de3836 328
ashleymills 0:714293de3836 329 #if defined(CYASS_SHA384)
ashleymills 0:714293de3836 330 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
ashleymills 0:714293de3836 331 #define BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
ashleymills 0:714293de3836 332 #endif
ashleymills 0:714293de3836 333 #endif
ashleymills 0:714293de3836 334 #if defined (HAVE_AESCCM)
ashleymills 0:714293de3836 335 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
ashleymills 0:714293de3836 336 #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
ashleymills 0:714293de3836 337 #endif
ashleymills 0:714293de3836 338 #endif /* NO_AES */
ashleymills 0:714293de3836 339 #if !defined(NO_RC4)
ashleymills 0:714293de3836 340 #if !defined(NO_SHA)
ashleymills 0:714293de3836 341 #if !defined(NO_RSA)
ashleymills 0:714293de3836 342 #define BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
ashleymills 0:714293de3836 343 #define BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
ashleymills 0:714293de3836 344 #endif
ashleymills 0:714293de3836 345
ashleymills 0:714293de3836 346 #define BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
ashleymills 0:714293de3836 347 #define BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
ashleymills 0:714293de3836 348 #endif
ashleymills 0:714293de3836 349 #endif
ashleymills 0:714293de3836 350 #if !defined(NO_DES3)
ashleymills 0:714293de3836 351 #if !defined(NO_RSA)
ashleymills 0:714293de3836 352 #define BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
ashleymills 0:714293de3836 353 #define BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
ashleymills 0:714293de3836 354 #endif
ashleymills 0:714293de3836 355
ashleymills 0:714293de3836 356 #define BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
ashleymills 0:714293de3836 357 #define BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
ashleymills 0:714293de3836 358 #endif
ashleymills 0:714293de3836 359 #endif
ashleymills 0:714293de3836 360
ashleymills 0:714293de3836 361
ashleymills 0:714293de3836 362 #if defined(BUILD_SSL_RSA_WITH_RC4_128_SHA) || \
ashleymills 0:714293de3836 363 defined(BUILD_SSL_RSA_WITH_RC4_128_MD5)
ashleymills 0:714293de3836 364 #define BUILD_ARC4
ashleymills 0:714293de3836 365 #endif
ashleymills 0:714293de3836 366
ashleymills 0:714293de3836 367 #if defined(BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA)
ashleymills 0:714293de3836 368 #define BUILD_DES3
ashleymills 0:714293de3836 369 #endif
ashleymills 0:714293de3836 370
ashleymills 0:714293de3836 371 #if defined(BUILD_TLS_RSA_WITH_AES_128_CBC_SHA) || \
ashleymills 0:714293de3836 372 defined(BUILD_TLS_RSA_WITH_AES_256_CBC_SHA) || \
ashleymills 0:714293de3836 373 defined(BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
ashleymills 0:714293de3836 374 #undef BUILD_AES
ashleymills 0:714293de3836 375 #define BUILD_AES
ashleymills 0:714293de3836 376 #endif
ashleymills 0:714293de3836 377
ashleymills 0:714293de3836 378 #if defined(BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256) || \
ashleymills 0:714293de3836 379 defined(BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
ashleymills 0:714293de3836 380 #define BUILD_AESGCM
ashleymills 0:714293de3836 381 #endif
ashleymills 0:714293de3836 382
ashleymills 0:714293de3836 383 #if defined(BUILD_TLS_RSA_WITH_HC_128_CBC_SHA) || \
ashleymills 0:714293de3836 384 defined(BUILD_TLS_RSA_WITH_HC_128_CBC_MD5)
ashleymills 0:714293de3836 385 #define BUILD_HC128
ashleymills 0:714293de3836 386 #endif
ashleymills 0:714293de3836 387
ashleymills 0:714293de3836 388 #if defined(BUILD_TLS_RSA_WITH_RABBIT_CBC_SHA)
ashleymills 0:714293de3836 389 #define BUILD_RABBIT
ashleymills 0:714293de3836 390 #endif
ashleymills 0:714293de3836 391
ashleymills 0:714293de3836 392 #ifdef NO_DES3
ashleymills 0:714293de3836 393 #define DES_BLOCK_SIZE 8
ashleymills 0:714293de3836 394 #else
ashleymills 0:714293de3836 395 #undef BUILD_DES3
ashleymills 0:714293de3836 396 #define BUILD_DES3
ashleymills 0:714293de3836 397 #endif
ashleymills 0:714293de3836 398
ashleymills 0:714293de3836 399 #ifdef NO_AES
ashleymills 0:714293de3836 400 #define AES_BLOCK_SIZE 16
ashleymills 0:714293de3836 401 #else
ashleymills 0:714293de3836 402 #undef BUILD_AES
ashleymills 0:714293de3836 403 #define BUILD_AES
ashleymills 0:714293de3836 404 #endif
ashleymills 0:714293de3836 405
ashleymills 0:714293de3836 406 #ifndef NO_RC4
ashleymills 0:714293de3836 407 #undef BUILD_ARC4
ashleymills 0:714293de3836 408 #define BUILD_ARC4
ashleymills 0:714293de3836 409 #endif
ashleymills 0:714293de3836 410
ashleymills 0:714293de3836 411
ashleymills 0:714293de3836 412
ashleymills 0:714293de3836 413 #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
ashleymills 0:714293de3836 414 #define HAVE_AEAD
ashleymills 0:714293de3836 415 #endif
ashleymills 0:714293de3836 416
ashleymills 0:714293de3836 417
ashleymills 0:714293de3836 418 /* actual cipher values, 2nd byte */
ashleymills 0:714293de3836 419 enum {
ashleymills 0:714293de3836 420 TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x39,
ashleymills 0:714293de3836 421 TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x33,
ashleymills 0:714293de3836 422 TLS_RSA_WITH_AES_256_CBC_SHA = 0x35,
ashleymills 0:714293de3836 423 TLS_RSA_WITH_AES_128_CBC_SHA = 0x2F,
ashleymills 0:714293de3836 424 TLS_RSA_WITH_NULL_SHA = 0x02,
ashleymills 0:714293de3836 425 TLS_PSK_WITH_AES_256_CBC_SHA = 0x8d,
ashleymills 0:714293de3836 426 TLS_PSK_WITH_AES_128_CBC_SHA256 = 0xae,
ashleymills 0:714293de3836 427 TLS_PSK_WITH_AES_128_CBC_SHA = 0x8c,
ashleymills 0:714293de3836 428 TLS_PSK_WITH_NULL_SHA256 = 0xb0,
ashleymills 0:714293de3836 429 TLS_PSK_WITH_NULL_SHA = 0x2c,
ashleymills 0:714293de3836 430 SSL_RSA_WITH_RC4_128_SHA = 0x05,
ashleymills 0:714293de3836 431 SSL_RSA_WITH_RC4_128_MD5 = 0x04,
ashleymills 0:714293de3836 432 SSL_RSA_WITH_3DES_EDE_CBC_SHA = 0x0A,
ashleymills 0:714293de3836 433
ashleymills 0:714293de3836 434 /* ECC suites, first byte is 0xC0 (ECC_BYTE) */
ashleymills 0:714293de3836 435 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0x14,
ashleymills 0:714293de3836 436 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0x13,
ashleymills 0:714293de3836 437 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0x0A,
ashleymills 0:714293de3836 438 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0x09,
ashleymills 0:714293de3836 439 TLS_ECDHE_RSA_WITH_RC4_128_SHA = 0x11,
ashleymills 0:714293de3836 440 TLS_ECDHE_ECDSA_WITH_RC4_128_SHA = 0x07,
ashleymills 0:714293de3836 441 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x12,
ashleymills 0:714293de3836 442 TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = 0x08,
ashleymills 0:714293de3836 443 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0x27,
ashleymills 0:714293de3836 444 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0x23,
ashleymills 0:714293de3836 445 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0x28,
ashleymills 0:714293de3836 446 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0x24,
ashleymills 0:714293de3836 447
ashleymills 0:714293de3836 448 /* static ECDH, first byte is 0xC0 (ECC_BYTE) */
ashleymills 0:714293de3836 449 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA = 0x0F,
ashleymills 0:714293de3836 450 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA = 0x0E,
ashleymills 0:714293de3836 451 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA = 0x05,
ashleymills 0:714293de3836 452 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA = 0x04,
ashleymills 0:714293de3836 453 TLS_ECDH_RSA_WITH_RC4_128_SHA = 0x0C,
ashleymills 0:714293de3836 454 TLS_ECDH_ECDSA_WITH_RC4_128_SHA = 0x02,
ashleymills 0:714293de3836 455 TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA = 0x0D,
ashleymills 0:714293de3836 456 TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA = 0x03,
ashleymills 0:714293de3836 457 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 = 0x29,
ashleymills 0:714293de3836 458 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 = 0x25,
ashleymills 0:714293de3836 459 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 = 0x2A,
ashleymills 0:714293de3836 460 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 = 0x26,
ashleymills 0:714293de3836 461
ashleymills 0:714293de3836 462 /* CyaSSL extension - eSTREAM */
ashleymills 0:714293de3836 463 TLS_RSA_WITH_HC_128_CBC_MD5 = 0xFB,
ashleymills 0:714293de3836 464 TLS_RSA_WITH_HC_128_CBC_SHA = 0xFC,
ashleymills 0:714293de3836 465 TLS_RSA_WITH_RABBIT_CBC_SHA = 0xFD,
ashleymills 0:714293de3836 466
ashleymills 0:714293de3836 467 /* CyaSSL extension - NTRU */
ashleymills 0:714293de3836 468 TLS_NTRU_RSA_WITH_RC4_128_SHA = 0xe5,
ashleymills 0:714293de3836 469 TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA = 0xe6,
ashleymills 0:714293de3836 470 TLS_NTRU_RSA_WITH_AES_128_CBC_SHA = 0xe7, /* clases w/ official SHA-256 */
ashleymills 0:714293de3836 471 TLS_NTRU_RSA_WITH_AES_256_CBC_SHA = 0xe8,
ashleymills 0:714293de3836 472
ashleymills 0:714293de3836 473 /* SHA256 */
ashleymills 0:714293de3836 474 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x6b,
ashleymills 0:714293de3836 475 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x67,
ashleymills 0:714293de3836 476 TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x3d,
ashleymills 0:714293de3836 477 TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x3c,
ashleymills 0:714293de3836 478 TLS_RSA_WITH_NULL_SHA256 = 0x3b,
ashleymills 0:714293de3836 479
ashleymills 0:714293de3836 480 /* AES-GCM */
ashleymills 0:714293de3836 481 TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x9c,
ashleymills 0:714293de3836 482 TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x9d,
ashleymills 0:714293de3836 483 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x9e,
ashleymills 0:714293de3836 484 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x9f,
ashleymills 0:714293de3836 485
ashleymills 0:714293de3836 486 /* ECC AES-GCM, first byte is 0xC0 (ECC_BYTE) */
ashleymills 0:714293de3836 487 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0x2b,
ashleymills 0:714293de3836 488 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0x2c,
ashleymills 0:714293de3836 489 TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 = 0x2d,
ashleymills 0:714293de3836 490 TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 = 0x2e,
ashleymills 0:714293de3836 491 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0x2f,
ashleymills 0:714293de3836 492 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0x30,
ashleymills 0:714293de3836 493 TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 = 0x31,
ashleymills 0:714293de3836 494 TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 = 0x32,
ashleymills 0:714293de3836 495
ashleymills 0:714293de3836 496 /* AES-CCM, first byte is 0xC0 but isn't ECC,
ashleymills 0:714293de3836 497 * also, in some of the other AES-CCM suites
ashleymills 0:714293de3836 498 * there will be second byte number conflicts
ashleymills 0:714293de3836 499 * with non-ECC AES-GCM */
ashleymills 0:714293de3836 500 TLS_RSA_WITH_AES_128_CCM_8 = 0xa0,
ashleymills 0:714293de3836 501 TLS_RSA_WITH_AES_256_CCM_8 = 0xa1,
ashleymills 0:714293de3836 502 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xc6, /* Still TBD, made up */
ashleymills 0:714293de3836 503 TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xc7, /* Still TBD, made up */
ashleymills 0:714293de3836 504 TLS_PSK_WITH_AES_128_CCM = 0xa4,
ashleymills 0:714293de3836 505 TLS_PSK_WITH_AES_256_CCM = 0xa5,
ashleymills 0:714293de3836 506 TLS_PSK_WITH_AES_128_CCM_8 = 0xa8,
ashleymills 0:714293de3836 507 TLS_PSK_WITH_AES_256_CCM_8 = 0xa9,
ashleymills 0:714293de3836 508
ashleymills 0:714293de3836 509 TLS_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x41,
ashleymills 0:714293de3836 510 TLS_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x84,
ashleymills 0:714293de3836 511 TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xba,
ashleymills 0:714293de3836 512 TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0xc0,
ashleymills 0:714293de3836 513 TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x45,
ashleymills 0:714293de3836 514 TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x88,
ashleymills 0:714293de3836 515 TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xbe,
ashleymills 0:714293de3836 516 TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0xc4
ashleymills 0:714293de3836 517
ashleymills 0:714293de3836 518 };
ashleymills 0:714293de3836 519
ashleymills 0:714293de3836 520
ashleymills 0:714293de3836 521 #if defined(CYASSL_SHA384)
ashleymills 0:714293de3836 522 #define MAX_DIGEST_SIZE SHA384_DIGEST_SIZE
ashleymills 0:714293de3836 523 #elif !defined(NO_SHA256)
ashleymills 0:714293de3836 524 #define MAX_DIGEST_SIZE SHA256_DIGEST_SIZE
ashleymills 0:714293de3836 525 #elif !defined(NO_MD5) && !defined(NO_SHA)
ashleymills 0:714293de3836 526 #define MAX_DIGEST_SIZE (SHA_DIGEST_SIZE + MD5_DIGEST_SIZE)
ashleymills 0:714293de3836 527 #else
ashleymills 0:714293de3836 528 #error "You have configured the build so there isn't any hashing."
ashleymills 0:714293de3836 529 #endif
ashleymills 0:714293de3836 530
ashleymills 0:714293de3836 531
ashleymills 0:714293de3836 532 enum Misc {
ashleymills 0:714293de3836 533 SERVER_END = 0,
ashleymills 0:714293de3836 534 CLIENT_END,
ashleymills 0:714293de3836 535
ashleymills 0:714293de3836 536 ECC_BYTE = 0xC0, /* ECC first cipher suite byte */
ashleymills 0:714293de3836 537
ashleymills 0:714293de3836 538 SEND_CERT = 1,
ashleymills 0:714293de3836 539 SEND_BLANK_CERT = 2,
ashleymills 0:714293de3836 540
ashleymills 0:714293de3836 541 DTLS_MAJOR = 0xfe, /* DTLS major version number */
ashleymills 0:714293de3836 542 DTLS_MINOR = 0xff, /* DTLS minor version number */
ashleymills 0:714293de3836 543 DTLSv1_2_MINOR = 0xfd, /* DTLS minor version number */
ashleymills 0:714293de3836 544 SSLv3_MAJOR = 3, /* SSLv3 and TLSv1+ major version number */
ashleymills 0:714293de3836 545 SSLv3_MINOR = 0, /* TLSv1 minor version number */
ashleymills 0:714293de3836 546 TLSv1_MINOR = 1, /* TLSv1 minor version number */
ashleymills 0:714293de3836 547 TLSv1_1_MINOR = 2, /* TLSv1_1 minor version number */
ashleymills 0:714293de3836 548 TLSv1_2_MINOR = 3, /* TLSv1_2 minor version number */
ashleymills 0:714293de3836 549 INVALID_BYTE = 0xff, /* Used to initialize cipher specs values */
ashleymills 0:714293de3836 550 NO_COMPRESSION = 0,
ashleymills 0:714293de3836 551 ZLIB_COMPRESSION = 221, /* CyaSSL zlib compression */
ashleymills 0:714293de3836 552 HELLO_EXT_SIG_ALGO = 13, /* ID for the sig_algo hello extension */
ashleymills 0:714293de3836 553 SECRET_LEN = 48, /* pre RSA and all master */
ashleymills 0:714293de3836 554 ENCRYPT_LEN = 512, /* allow 4096 bit static buffer */
ashleymills 0:714293de3836 555 SIZEOF_SENDER = 4, /* clnt or srvr */
ashleymills 0:714293de3836 556 FINISHED_SZ = 36, /* MD5_DIGEST_SIZE + SHA_DIGEST_SIZE */
ashleymills 0:714293de3836 557 MAX_RECORD_SIZE = 16384, /* 2^14, max size by standard */
ashleymills 0:714293de3836 558 MAX_MSG_EXTRA = 38 + MAX_DIGEST_SIZE,
ashleymills 0:714293de3836 559 /* max added to msg, mac + pad from */
ashleymills 0:714293de3836 560 /* RECORD_HEADER_SZ + BLOCK_SZ (pad) + Max
ashleymills 0:714293de3836 561 digest sz + BLOC_SZ (iv) + pad byte (1) */
ashleymills 0:714293de3836 562 MAX_COMP_EXTRA = 1024, /* max compression extra */
ashleymills 0:714293de3836 563 MAX_MTU = 1500, /* max expected MTU */
ashleymills 0:714293de3836 564 MAX_UDP_SIZE = 8192 - 100, /* was MAX_MTU - 100 */
ashleymills 0:714293de3836 565 MAX_DH_SZ = 612, /* 2240 p, pub, g + 2 byte size for each */
ashleymills 0:714293de3836 566 MAX_STR_VERSION = 8, /* string rep of protocol version */
ashleymills 0:714293de3836 567
ashleymills 0:714293de3836 568 PAD_MD5 = 48, /* pad length for finished */
ashleymills 0:714293de3836 569 PAD_SHA = 40, /* pad length for finished */
ashleymills 0:714293de3836 570 MAX_PAD_SIZE = 256, /* maximum length of padding */
ashleymills 0:714293de3836 571 COMPRESS_DUMMY_SIZE = 64, /* compression dummy round size */
ashleymills 0:714293de3836 572 COMPRESS_CONSTANT = 13, /* compression calc constant */
ashleymills 0:714293de3836 573 COMPRESS_UPPER = 55, /* compression calc numerator */
ashleymills 0:714293de3836 574 COMPRESS_LOWER = 64, /* compression calc denominator */
ashleymills 0:714293de3836 575
ashleymills 0:714293de3836 576 PEM_LINE_LEN = 80, /* PEM line max + fudge */
ashleymills 0:714293de3836 577 LENGTH_SZ = 2, /* length field for HMAC, data only */
ashleymills 0:714293de3836 578 VERSION_SZ = 2, /* length of proctocol version */
ashleymills 0:714293de3836 579 SEQ_SZ = 8, /* 64 bit sequence number */
ashleymills 0:714293de3836 580 BYTE3_LEN = 3, /* up to 24 bit byte lengths */
ashleymills 0:714293de3836 581 ALERT_SIZE = 2, /* level + description */
ashleymills 0:714293de3836 582 REQUEST_HEADER = 2, /* always use 2 bytes */
ashleymills 0:714293de3836 583 VERIFY_HEADER = 2, /* always use 2 bytes */
ashleymills 0:714293de3836 584 EXT_ID_SZ = 2, /* always use 2 bytes */
ashleymills 0:714293de3836 585 MAX_DH_SIZE = 513, /* 4096 bit plus possible leading 0 */
ashleymills 0:714293de3836 586
ashleymills 0:714293de3836 587 MAX_SUITE_SZ = 200, /* 100 suites for now! */
ashleymills 0:714293de3836 588 RAN_LEN = 32, /* random length */
ashleymills 0:714293de3836 589 SEED_LEN = RAN_LEN * 2, /* tls prf seed length */
ashleymills 0:714293de3836 590 ID_LEN = 32, /* session id length */
ashleymills 0:714293de3836 591 MAX_COOKIE_LEN = 32, /* max dtls cookie size */
ashleymills 0:714293de3836 592 COOKIE_SZ = 20, /* use a 20 byte cookie */
ashleymills 0:714293de3836 593 SUITE_LEN = 2, /* cipher suite sz length */
ashleymills 0:714293de3836 594 ENUM_LEN = 1, /* always a byte */
ashleymills 0:714293de3836 595 OPAQUE16_LEN = 2, /* always 2 bytes */
ashleymills 0:714293de3836 596 COMP_LEN = 1, /* compression length */
ashleymills 0:714293de3836 597 CURVE_LEN = 2, /* ecc named curve length */
ashleymills 0:714293de3836 598 SERVER_ID_LEN = 20, /* server session id length */
ashleymills 0:714293de3836 599
ashleymills 0:714293de3836 600 HANDSHAKE_HEADER_SZ = 4, /* type + length(3) */
ashleymills 0:714293de3836 601 RECORD_HEADER_SZ = 5, /* type + version + len(2) */
ashleymills 0:714293de3836 602 CERT_HEADER_SZ = 3, /* always 3 bytes */
ashleymills 0:714293de3836 603 REQ_HEADER_SZ = 2, /* cert request header sz */
ashleymills 0:714293de3836 604 HINT_LEN_SZ = 2, /* length of hint size field */
ashleymills 0:714293de3836 605 HELLO_EXT_TYPE_SZ = 2, /* length of a hello extension type */
ashleymills 0:714293de3836 606 HELLO_EXT_SZ = 8, /* total length of the lazy hello extensions */
ashleymills 0:714293de3836 607 HELLO_EXT_LEN = 6, /* length of the lazy hello extensions */
ashleymills 0:714293de3836 608 HELLO_EXT_SIGALGO_SZ = 2, /* length of signature algo extension */
ashleymills 0:714293de3836 609 HELLO_EXT_SIGALGO_MAX = 32, /* number of items in the signature algo list */
ashleymills 0:714293de3836 610
ashleymills 0:714293de3836 611 DTLS_HANDSHAKE_HEADER_SZ = 12, /* normal + seq(2) + offset(3) + length(3) */
ashleymills 0:714293de3836 612 DTLS_RECORD_HEADER_SZ = 13, /* normal + epoch(2) + seq_num(6) */
ashleymills 0:714293de3836 613 DTLS_HANDSHAKE_EXTRA = 8, /* diff from normal */
ashleymills 0:714293de3836 614 DTLS_RECORD_EXTRA = 8, /* diff from normal */
ashleymills 0:714293de3836 615 DTLS_HANDSHAKE_SEQ_SZ = 2, /* handshake header sequence number */
ashleymills 0:714293de3836 616 DTLS_HANDSHAKE_FRAG_SZ = 3, /* fragment offset and length are 24 bit */
ashleymills 0:714293de3836 617 DTLS_POOL_SZ = 5, /* buffers to hold in the retry pool */
ashleymills 0:714293de3836 618
ashleymills 0:714293de3836 619 FINISHED_LABEL_SZ = 15, /* TLS finished label size */
ashleymills 0:714293de3836 620 TLS_FINISHED_SZ = 12, /* TLS has a shorter size */
ashleymills 0:714293de3836 621 MASTER_LABEL_SZ = 13, /* TLS master secret label sz */
ashleymills 0:714293de3836 622 KEY_LABEL_SZ = 13, /* TLS key block expansion sz */
ashleymills 0:714293de3836 623 MAX_PRF_HALF = 128, /* Maximum half secret len */
ashleymills 0:714293de3836 624 MAX_PRF_LABSEED = 128, /* Maximum label + seed len */
ashleymills 0:714293de3836 625 MAX_PRF_DIG = 224, /* Maximum digest len */
ashleymills 0:714293de3836 626 MAX_REQUEST_SZ = 256, /* Maximum cert req len (no auth yet */
ashleymills 0:714293de3836 627 SESSION_FLUSH_COUNT = 256, /* Flush session cache unless user turns off */
ashleymills 0:714293de3836 628
ashleymills 0:714293de3836 629 RC4_KEY_SIZE = 16, /* always 128bit */
ashleymills 0:714293de3836 630 DES_KEY_SIZE = 8, /* des */
ashleymills 0:714293de3836 631 DES3_KEY_SIZE = 24, /* 3 des ede */
ashleymills 0:714293de3836 632 DES_IV_SIZE = DES_BLOCK_SIZE,
ashleymills 0:714293de3836 633 AES_256_KEY_SIZE = 32, /* for 256 bit */
ashleymills 0:714293de3836 634 AES_192_KEY_SIZE = 24, /* for 192 bit */
ashleymills 0:714293de3836 635 AES_IV_SIZE = 16, /* always block size */
ashleymills 0:714293de3836 636 AES_128_KEY_SIZE = 16, /* for 128 bit */
ashleymills 0:714293de3836 637
ashleymills 0:714293de3836 638 AEAD_SEQ_OFFSET = 4, /* Auth Data: Sequence number */
ashleymills 0:714293de3836 639 AEAD_TYPE_OFFSET = 8, /* Auth Data: Type */
ashleymills 0:714293de3836 640 AEAD_VMAJ_OFFSET = 9, /* Auth Data: Major Version */
ashleymills 0:714293de3836 641 AEAD_VMIN_OFFSET = 10, /* Auth Data: Minor Version */
ashleymills 0:714293de3836 642 AEAD_LEN_OFFSET = 11, /* Auth Data: Length */
ashleymills 0:714293de3836 643 AEAD_AUTH_DATA_SZ = 13, /* Size of the data to authenticate */
ashleymills 0:714293de3836 644 AEAD_IMP_IV_SZ = 4, /* Size of the implicit IV */
ashleymills 0:714293de3836 645 AEAD_EXP_IV_SZ = 8, /* Size of the explicit IV */
ashleymills 0:714293de3836 646 AEAD_NONCE_SZ = AEAD_EXP_IV_SZ + AEAD_IMP_IV_SZ,
ashleymills 0:714293de3836 647
ashleymills 0:714293de3836 648 AES_GCM_AUTH_SZ = 16, /* AES-GCM Auth Tag length */
ashleymills 0:714293de3836 649 AES_CCM_16_AUTH_SZ = 16, /* AES-CCM-16 Auth Tag length */
ashleymills 0:714293de3836 650 AES_CCM_8_AUTH_SZ = 8, /* AES-CCM-8 Auth Tag Length */
ashleymills 0:714293de3836 651
ashleymills 0:714293de3836 652 CAMELLIA_128_KEY_SIZE = 16, /* for 128 bit */
ashleymills 0:714293de3836 653 CAMELLIA_192_KEY_SIZE = 24, /* for 192 bit */
ashleymills 0:714293de3836 654 CAMELLIA_256_KEY_SIZE = 32, /* for 256 bit */
ashleymills 0:714293de3836 655 CAMELLIA_IV_SIZE = 16, /* always block size */
ashleymills 0:714293de3836 656
ashleymills 0:714293de3836 657 HC_128_KEY_SIZE = 16, /* 128 bits */
ashleymills 0:714293de3836 658 HC_128_IV_SIZE = 16, /* also 128 bits */
ashleymills 0:714293de3836 659
ashleymills 0:714293de3836 660 RABBIT_KEY_SIZE = 16, /* 128 bits */
ashleymills 0:714293de3836 661 RABBIT_IV_SIZE = 8, /* 64 bits for iv */
ashleymills 0:714293de3836 662
ashleymills 0:714293de3836 663 EVP_SALT_SIZE = 8, /* evp salt size 64 bits */
ashleymills 0:714293de3836 664
ashleymills 0:714293de3836 665 ECDHE_SIZE = 32, /* ECHDE server size defaults to 256 bit */
ashleymills 0:714293de3836 666 MAX_EXPORT_ECC_SZ = 256, /* Export ANS X9.62 max future size */
ashleymills 0:714293de3836 667
ashleymills 0:714293de3836 668 MAX_HELLO_SZ = 128, /* max client or server hello */
ashleymills 0:714293de3836 669 MAX_CERT_VERIFY_SZ = 1024, /* max */
ashleymills 0:714293de3836 670 CLIENT_HELLO_FIRST = 35, /* Protocol + RAN_LEN + sizeof(id_len) */
ashleymills 0:714293de3836 671 MAX_SUITE_NAME = 48, /* maximum length of cipher suite string */
ashleymills 0:714293de3836 672 DEFAULT_TIMEOUT = 500, /* default resumption timeout in seconds */
ashleymills 0:714293de3836 673
ashleymills 0:714293de3836 674 DTLS_TIMEOUT_INIT = 1, /* default timeout init for DTLS receive */
ashleymills 0:714293de3836 675 DTLS_TIMEOUT_MAX = 64, /* default max timeout for DTLS receive */
ashleymills 0:714293de3836 676 DTLS_TIMEOUT_MULTIPLIER = 2, /* default timeout multiplier for DTLS recv */
ashleymills 0:714293de3836 677
ashleymills 0:714293de3836 678 MAX_PSK_ID_LEN = 128, /* max psk identity/hint supported */
ashleymills 0:714293de3836 679 MAX_PSK_KEY_LEN = 64, /* max psk key supported */
ashleymills 0:714293de3836 680
ashleymills 0:714293de3836 681 MAX_CYASSL_FILE_SIZE = 1024 * 1024 * 4, /* 4 mb file size alloc limit */
ashleymills 0:714293de3836 682
ashleymills 0:714293de3836 683 #ifdef FORTRESS
ashleymills 0:714293de3836 684 MAX_EX_DATA = 3, /* allow for three items of ex_data */
ashleymills 0:714293de3836 685 #endif
ashleymills 0:714293de3836 686
ashleymills 0:714293de3836 687 MAX_X509_SIZE = 2048, /* max static x509 buffer size */
ashleymills 0:714293de3836 688 CERT_MIN_SIZE = 256, /* min PEM cert size with header/footer */
ashleymills 0:714293de3836 689 MAX_FILENAME_SZ = 256, /* max file name length */
ashleymills 0:714293de3836 690 FILE_BUFFER_SIZE = 1024, /* default static file buffer size for input,
ashleymills 0:714293de3836 691 will use dynamic buffer if not big enough */
ashleymills 0:714293de3836 692
ashleymills 0:714293de3836 693 MAX_NTRU_PUB_KEY_SZ = 1027, /* NTRU max for now */
ashleymills 0:714293de3836 694 MAX_NTRU_ENCRYPT_SZ = 1027, /* NTRU max for now */
ashleymills 0:714293de3836 695 MAX_NTRU_BITS = 256, /* max symmetric bit strength */
ashleymills 0:714293de3836 696 NO_SNIFF = 0, /* not sniffing */
ashleymills 0:714293de3836 697 SNIFF = 1, /* currently sniffing */
ashleymills 0:714293de3836 698
ashleymills 0:714293de3836 699 HASH_SIG_SIZE = 2, /* default SHA1 RSA */
ashleymills 0:714293de3836 700
ashleymills 0:714293de3836 701 NO_CAVIUM_DEVICE = -2, /* invalid cavium device id */
ashleymills 0:714293de3836 702
ashleymills 0:714293de3836 703 NO_COPY = 0, /* should we copy static buffer for write */
ashleymills 0:714293de3836 704 COPY = 1 /* should we copy static buffer for write */
ashleymills 0:714293de3836 705 };
ashleymills 0:714293de3836 706
ashleymills 0:714293de3836 707
ashleymills 0:714293de3836 708 /* max cert chain peer depth */
ashleymills 0:714293de3836 709 #ifndef MAX_CHAIN_DEPTH
ashleymills 0:714293de3836 710 #define MAX_CHAIN_DEPTH 9
ashleymills 0:714293de3836 711 #endif
ashleymills 0:714293de3836 712
ashleymills 0:714293de3836 713
ashleymills 0:714293de3836 714 /* don't use extra 3/4k stack space unless need to */
ashleymills 0:714293de3836 715 #ifdef HAVE_NTRU
ashleymills 0:714293de3836 716 #define MAX_ENCRYPT_SZ MAX_NTRU_ENCRYPT_SZ
ashleymills 0:714293de3836 717 #else
ashleymills 0:714293de3836 718 #define MAX_ENCRYPT_SZ ENCRYPT_LEN
ashleymills 0:714293de3836 719 #endif
ashleymills 0:714293de3836 720
ashleymills 0:714293de3836 721
ashleymills 0:714293de3836 722 /* states */
ashleymills 0:714293de3836 723 enum states {
ashleymills 0:714293de3836 724 NULL_STATE = 0,
ashleymills 0:714293de3836 725
ashleymills 0:714293de3836 726 SERVER_HELLOVERIFYREQUEST_COMPLETE,
ashleymills 0:714293de3836 727 SERVER_HELLO_COMPLETE,
ashleymills 0:714293de3836 728 SERVER_CERT_COMPLETE,
ashleymills 0:714293de3836 729 SERVER_KEYEXCHANGE_COMPLETE,
ashleymills 0:714293de3836 730 SERVER_HELLODONE_COMPLETE,
ashleymills 0:714293de3836 731 SERVER_FINISHED_COMPLETE,
ashleymills 0:714293de3836 732
ashleymills 0:714293de3836 733 CLIENT_HELLO_COMPLETE,
ashleymills 0:714293de3836 734 CLIENT_KEYEXCHANGE_COMPLETE,
ashleymills 0:714293de3836 735 CLIENT_FINISHED_COMPLETE,
ashleymills 0:714293de3836 736
ashleymills 0:714293de3836 737 HANDSHAKE_DONE
ashleymills 0:714293de3836 738 };
ashleymills 0:714293de3836 739
ashleymills 0:714293de3836 740
ashleymills 0:714293de3836 741 #if defined(__GNUC__)
ashleymills 0:714293de3836 742 #define CYASSL_PACK __attribute__ ((packed))
ashleymills 0:714293de3836 743 #else
ashleymills 0:714293de3836 744 #define CYASSL_PACK
ashleymills 0:714293de3836 745 #endif
ashleymills 0:714293de3836 746
ashleymills 0:714293de3836 747 /* SSL Version */
ashleymills 0:714293de3836 748 typedef struct ProtocolVersion {
ashleymills 0:714293de3836 749 byte major;
ashleymills 0:714293de3836 750 byte minor;
ashleymills 0:714293de3836 751 } CYASSL_PACK ProtocolVersion;
ashleymills 0:714293de3836 752
ashleymills 0:714293de3836 753
ashleymills 0:714293de3836 754 CYASSL_LOCAL ProtocolVersion MakeSSLv3(void);
ashleymills 0:714293de3836 755 CYASSL_LOCAL ProtocolVersion MakeTLSv1(void);
ashleymills 0:714293de3836 756 CYASSL_LOCAL ProtocolVersion MakeTLSv1_1(void);
ashleymills 0:714293de3836 757 CYASSL_LOCAL ProtocolVersion MakeTLSv1_2(void);
ashleymills 0:714293de3836 758
ashleymills 0:714293de3836 759 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 760 CYASSL_LOCAL ProtocolVersion MakeDTLSv1(void);
ashleymills 0:714293de3836 761 CYASSL_LOCAL ProtocolVersion MakeDTLSv1_2(void);
ashleymills 0:714293de3836 762 #endif
ashleymills 0:714293de3836 763
ashleymills 0:714293de3836 764
ashleymills 0:714293de3836 765 enum BIO_TYPE {
ashleymills 0:714293de3836 766 BIO_BUFFER = 1,
ashleymills 0:714293de3836 767 BIO_SOCKET = 2,
ashleymills 0:714293de3836 768 BIO_SSL = 3,
ashleymills 0:714293de3836 769 BIO_MEMORY = 4
ashleymills 0:714293de3836 770 };
ashleymills 0:714293de3836 771
ashleymills 0:714293de3836 772
ashleymills 0:714293de3836 773 /* CyaSSL BIO_METHOD type */
ashleymills 0:714293de3836 774 struct CYASSL_BIO_METHOD {
ashleymills 0:714293de3836 775 byte type; /* method type */
ashleymills 0:714293de3836 776 };
ashleymills 0:714293de3836 777
ashleymills 0:714293de3836 778
ashleymills 0:714293de3836 779 /* CyaSSL BIO type */
ashleymills 0:714293de3836 780 struct CYASSL_BIO {
ashleymills 0:714293de3836 781 byte type; /* method type */
ashleymills 0:714293de3836 782 byte close; /* close flag */
ashleymills 0:714293de3836 783 byte eof; /* eof flag */
ashleymills 0:714293de3836 784 CYASSL* ssl; /* possible associated ssl */
ashleymills 0:714293de3836 785 byte* mem; /* memory buffer */
ashleymills 0:714293de3836 786 int memLen; /* memory buffer length */
ashleymills 0:714293de3836 787 int fd; /* possible file descriptor */
ashleymills 0:714293de3836 788 CYASSL_BIO* prev; /* previous in chain */
ashleymills 0:714293de3836 789 CYASSL_BIO* next; /* next in chain */
ashleymills 0:714293de3836 790 };
ashleymills 0:714293de3836 791
ashleymills 0:714293de3836 792
ashleymills 0:714293de3836 793 /* CyaSSL method type */
ashleymills 0:714293de3836 794 struct CYASSL_METHOD {
ashleymills 0:714293de3836 795 ProtocolVersion version;
ashleymills 0:714293de3836 796 byte side; /* connection side, server or client */
ashleymills 0:714293de3836 797 byte downgrade; /* whether to downgrade version, default no */
ashleymills 0:714293de3836 798 };
ashleymills 0:714293de3836 799
ashleymills 0:714293de3836 800
ashleymills 0:714293de3836 801 /* defautls to client */
ashleymills 0:714293de3836 802 CYASSL_LOCAL void InitSSL_Method(CYASSL_METHOD*, ProtocolVersion);
ashleymills 0:714293de3836 803
ashleymills 0:714293de3836 804 /* for sniffer */
ashleymills 0:714293de3836 805 CYASSL_LOCAL int DoFinished(CYASSL* ssl, const byte* input, word32* inOutIdx,
ashleymills 0:714293de3836 806 int sniff);
ashleymills 0:714293de3836 807 CYASSL_LOCAL int DoApplicationData(CYASSL* ssl, byte* input, word32* inOutIdx);
ashleymills 0:714293de3836 808
ashleymills 0:714293de3836 809
ashleymills 0:714293de3836 810 /* CyaSSL buffer type */
ashleymills 0:714293de3836 811 typedef struct buffer {
ashleymills 0:714293de3836 812 word32 length;
ashleymills 0:714293de3836 813 byte* buffer;
ashleymills 0:714293de3836 814 } buffer;
ashleymills 0:714293de3836 815
ashleymills 0:714293de3836 816
ashleymills 0:714293de3836 817 enum {
ashleymills 0:714293de3836 818 FORCED_FREE = 1,
ashleymills 0:714293de3836 819 NO_FORCED_FREE = 0
ashleymills 0:714293de3836 820 };
ashleymills 0:714293de3836 821
ashleymills 0:714293de3836 822
ashleymills 0:714293de3836 823 /* only use compression extra if using compression */
ashleymills 0:714293de3836 824 #ifdef HAVE_LIBZ
ashleymills 0:714293de3836 825 #define COMP_EXTRA MAX_COMP_EXTRA
ashleymills 0:714293de3836 826 #else
ashleymills 0:714293de3836 827 #define COMP_EXTRA 0
ashleymills 0:714293de3836 828 #endif
ashleymills 0:714293de3836 829
ashleymills 0:714293de3836 830 /* only the sniffer needs space in the buffer for extra MTU record(s) */
ashleymills 0:714293de3836 831 #ifdef CYASSL_SNIFFER
ashleymills 0:714293de3836 832 #define MTU_EXTRA MAX_MTU * 3
ashleymills 0:714293de3836 833 #else
ashleymills 0:714293de3836 834 #define MTU_EXTRA 0
ashleymills 0:714293de3836 835 #endif
ashleymills 0:714293de3836 836
ashleymills 0:714293de3836 837
ashleymills 0:714293de3836 838 /* embedded callbacks require large static buffers, make sure on */
ashleymills 0:714293de3836 839 #ifdef CYASSL_CALLBACKS
ashleymills 0:714293de3836 840 #undef LARGE_STATIC_BUFFERS
ashleymills 0:714293de3836 841 #define LARGE_STATIC_BUFFERS
ashleymills 0:714293de3836 842 #endif
ashleymills 0:714293de3836 843
ashleymills 0:714293de3836 844
ashleymills 0:714293de3836 845 /* give user option to use 16K static buffers */
ashleymills 0:714293de3836 846 #if defined(LARGE_STATIC_BUFFERS)
ashleymills 0:714293de3836 847 #define RECORD_SIZE MAX_RECORD_SIZE
ashleymills 0:714293de3836 848 #else
ashleymills 0:714293de3836 849 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 850 #define RECORD_SIZE MAX_MTU
ashleymills 0:714293de3836 851 #else
ashleymills 0:714293de3836 852 #define RECORD_SIZE 128
ashleymills 0:714293de3836 853 #endif
ashleymills 0:714293de3836 854 #endif
ashleymills 0:714293de3836 855
ashleymills 0:714293de3836 856
ashleymills 0:714293de3836 857 /* user option to turn off 16K output option */
ashleymills 0:714293de3836 858 /* if using small static buffers (default) and SSL_write tries to write data
ashleymills 0:714293de3836 859 larger than the record we have, dynamically get it, unless user says only
ashleymills 0:714293de3836 860 write in static buffer chuncks */
ashleymills 0:714293de3836 861 #ifndef STATIC_CHUNKS_ONLY
ashleymills 0:714293de3836 862 #define OUTPUT_RECORD_SIZE MAX_RECORD_SIZE
ashleymills 0:714293de3836 863 #else
ashleymills 0:714293de3836 864 #define OUTPUT_RECORD_SIZE RECORD_SIZE
ashleymills 0:714293de3836 865 #endif
ashleymills 0:714293de3836 866
ashleymills 0:714293de3836 867 /* CyaSSL input buffer
ashleymills 0:714293de3836 868
ashleymills 0:714293de3836 869 RFC 2246:
ashleymills 0:714293de3836 870
ashleymills 0:714293de3836 871 length
ashleymills 0:714293de3836 872 The length (in bytes) of the following TLSPlaintext.fragment.
ashleymills 0:714293de3836 873 The length should not exceed 2^14.
ashleymills 0:714293de3836 874 */
ashleymills 0:714293de3836 875 #if defined(LARGE_STATIC_BUFFERS)
ashleymills 0:714293de3836 876 #define STATIC_BUFFER_LEN RECORD_HEADER_SZ + RECORD_SIZE + COMP_EXTRA + \
ashleymills 0:714293de3836 877 MTU_EXTRA + MAX_MSG_EXTRA
ashleymills 0:714293de3836 878 #else
ashleymills 0:714293de3836 879 /* zero length arrays may not be supported */
ashleymills 0:714293de3836 880 #define STATIC_BUFFER_LEN 1
ashleymills 0:714293de3836 881 #endif
ashleymills 0:714293de3836 882
ashleymills 0:714293de3836 883 typedef struct {
ashleymills 0:714293de3836 884 word32 length; /* total buffer length used */
ashleymills 0:714293de3836 885 word32 idx; /* idx to part of length already consumed */
ashleymills 0:714293de3836 886 byte* buffer; /* place holder for static or dynamic buffer */
ashleymills 0:714293de3836 887 word32 bufferSize; /* current buffer size */
ashleymills 0:714293de3836 888 ALIGN16 byte staticBuffer[STATIC_BUFFER_LEN];
ashleymills 0:714293de3836 889 byte dynamicFlag; /* dynamic memory currently in use */
ashleymills 0:714293de3836 890 byte offset; /* alignment offset attempt */
ashleymills 0:714293de3836 891 } bufferStatic;
ashleymills 0:714293de3836 892
ashleymills 0:714293de3836 893 /* Cipher Suites holder */
ashleymills 0:714293de3836 894 typedef struct Suites {
ashleymills 0:714293de3836 895 int setSuites; /* user set suites from default */
ashleymills 0:714293de3836 896 byte suites[MAX_SUITE_SZ];
ashleymills 0:714293de3836 897 word16 suiteSz; /* suite length in bytes */
ashleymills 0:714293de3836 898 byte hashSigAlgo[HELLO_EXT_SIGALGO_MAX]; /* sig/algo to offer */
ashleymills 0:714293de3836 899 word16 hashSigAlgoSz; /* SigAlgo extension length in bytes */
ashleymills 0:714293de3836 900 byte hashAlgo; /* selected hash algorithm */
ashleymills 0:714293de3836 901 byte sigAlgo; /* selected sig algorithm */
ashleymills 0:714293de3836 902 } Suites;
ashleymills 0:714293de3836 903
ashleymills 0:714293de3836 904
ashleymills 0:714293de3836 905 CYASSL_LOCAL
ashleymills 0:714293de3836 906 void InitSuites(Suites*, ProtocolVersion,
ashleymills 0:714293de3836 907 byte, byte, byte, byte, byte, byte, int);
ashleymills 0:714293de3836 908 CYASSL_LOCAL
ashleymills 0:714293de3836 909 int SetCipherList(Suites*, const char* list);
ashleymills 0:714293de3836 910
ashleymills 0:714293de3836 911 #ifndef PSK_TYPES_DEFINED
ashleymills 0:714293de3836 912 typedef unsigned int (*psk_client_callback)(CYASSL*, const char*, char*,
ashleymills 0:714293de3836 913 unsigned int, unsigned char*, unsigned int);
ashleymills 0:714293de3836 914 typedef unsigned int (*psk_server_callback)(CYASSL*, const char*,
ashleymills 0:714293de3836 915 unsigned char*, unsigned int);
ashleymills 0:714293de3836 916 #endif /* PSK_TYPES_DEFINED */
ashleymills 0:714293de3836 917
ashleymills 0:714293de3836 918
ashleymills 0:714293de3836 919 #ifndef CYASSL_USER_IO
ashleymills 0:714293de3836 920 /* default IO callbacks */
ashleymills 0:714293de3836 921 CYASSL_LOCAL
ashleymills 0:714293de3836 922 int EmbedReceive(CYASSL *ssl, char *buf, int sz, void *ctx);
ashleymills 0:714293de3836 923 CYASSL_LOCAL
ashleymills 0:714293de3836 924 int EmbedSend(CYASSL *ssl, char *buf, int sz, void *ctx);
ashleymills 0:714293de3836 925
ashleymills 0:714293de3836 926 #ifdef HAVE_OCSP
ashleymills 0:714293de3836 927 CYASSL_LOCAL
ashleymills 0:714293de3836 928 int EmbedOcspLookup(void*, const char*, int, byte*, int, byte**);
ashleymills 0:714293de3836 929 CYASSL_LOCAL
ashleymills 0:714293de3836 930 void EmbedOcspRespFree(void*, byte*);
ashleymills 0:714293de3836 931 #endif
ashleymills 0:714293de3836 932
ashleymills 0:714293de3836 933 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 934 CYASSL_LOCAL
ashleymills 0:714293de3836 935 int EmbedReceiveFrom(CYASSL *ssl, char *buf, int sz, void *ctx);
ashleymills 0:714293de3836 936 CYASSL_LOCAL
ashleymills 0:714293de3836 937 int EmbedSendTo(CYASSL *ssl, char *buf, int sz, void *ctx);
ashleymills 0:714293de3836 938 CYASSL_LOCAL
ashleymills 0:714293de3836 939 int EmbedGenerateCookie(CYASSL* ssl, byte *buf, int sz, void *ctx);
ashleymills 0:714293de3836 940 CYASSL_LOCAL
ashleymills 0:714293de3836 941 int IsUDP(void*);
ashleymills 0:714293de3836 942 #endif /* CYASSL_DTLS */
ashleymills 0:714293de3836 943 #endif /* CYASSL_USER_IO */
ashleymills 0:714293de3836 944
ashleymills 0:714293de3836 945
ashleymills 0:714293de3836 946 /* CyaSSL Cipher type just points back to SSL */
ashleymills 0:714293de3836 947 struct CYASSL_CIPHER {
ashleymills 0:714293de3836 948 CYASSL* ssl;
ashleymills 0:714293de3836 949 };
ashleymills 0:714293de3836 950
ashleymills 0:714293de3836 951
ashleymills 0:714293de3836 952 #ifdef SINGLE_THREADED
ashleymills 0:714293de3836 953 typedef int CyaSSL_Mutex;
ashleymills 0:714293de3836 954 #else /* MULTI_THREADED */
ashleymills 0:714293de3836 955 /* FREERTOS comes first to enable use of FreeRTOS Windows simulator only */
ashleymills 0:714293de3836 956 #ifdef FREERTOS
ashleymills 0:714293de3836 957 typedef xSemaphoreHandle CyaSSL_Mutex;
ashleymills 0:714293de3836 958 #elif defined(CYASSL_SAFERTOS)
ashleymills 0:714293de3836 959 typedef struct CyaSSL_Mutex {
ashleymills 0:714293de3836 960 signed char mutexBuffer[portQUEUE_OVERHEAD_BYTES];
ashleymills 0:714293de3836 961 xSemaphoreHandle mutex;
ashleymills 0:714293de3836 962 } CyaSSL_Mutex;
ashleymills 0:714293de3836 963 #elif defined(USE_WINDOWS_API)
ashleymills 0:714293de3836 964 typedef CRITICAL_SECTION CyaSSL_Mutex;
ashleymills 0:714293de3836 965 #elif defined(CYASSL_PTHREADS)
ashleymills 0:714293de3836 966 typedef pthread_mutex_t CyaSSL_Mutex;
ashleymills 0:714293de3836 967 #elif defined(THREADX)
ashleymills 0:714293de3836 968 typedef TX_MUTEX CyaSSL_Mutex;
ashleymills 0:714293de3836 969 #elif defined(MICRIUM)
ashleymills 0:714293de3836 970 typedef OS_MUTEX CyaSSL_Mutex;
ashleymills 0:714293de3836 971 #elif defined(EBSNET)
ashleymills 0:714293de3836 972 typedef RTP_MUTEX CyaSSL_Mutex;
ashleymills 0:714293de3836 973 #elif defined(FREESCALE_MQX)
ashleymills 0:714293de3836 974 typedef MUTEX_STRUCT CyaSSL_Mutex;
ashleymills 0:714293de3836 975 #elif defined(CYASSL_MDK_ARM)
ashleymills 0:714293de3836 976 typedef OS_MUT CyaSSL_Mutex;
ashleymills 0:714293de3836 977 #else
ashleymills 0:714293de3836 978 #error Need a mutex type in multithreaded mode
ashleymills 0:714293de3836 979 #endif /* USE_WINDOWS_API */
ashleymills 0:714293de3836 980 #endif /* SINGLE_THREADED */
ashleymills 0:714293de3836 981
ashleymills 0:714293de3836 982 CYASSL_LOCAL int InitMutex(CyaSSL_Mutex*);
ashleymills 0:714293de3836 983 CYASSL_LOCAL int FreeMutex(CyaSSL_Mutex*);
ashleymills 0:714293de3836 984 CYASSL_LOCAL int LockMutex(CyaSSL_Mutex*);
ashleymills 0:714293de3836 985 CYASSL_LOCAL int UnLockMutex(CyaSSL_Mutex*);
ashleymills 0:714293de3836 986
ashleymills 0:714293de3836 987 typedef struct OCSP_Entry OCSP_Entry;
ashleymills 0:714293de3836 988
ashleymills 0:714293de3836 989 #ifdef SHA_DIGEST_SIZE
ashleymills 0:714293de3836 990 #define OCSP_DIGEST_SIZE SHA_DIGEST_SIZE
ashleymills 0:714293de3836 991 #else
ashleymills 0:714293de3836 992 #define OCSP_DIGEST_SIZE 160
ashleymills 0:714293de3836 993 #endif
ashleymills 0:714293de3836 994
ashleymills 0:714293de3836 995 #ifdef NO_ASN
ashleymills 0:714293de3836 996 /* no_asn won't have */
ashleymills 0:714293de3836 997 typedef struct CertStatus CertStatus;
ashleymills 0:714293de3836 998 #endif
ashleymills 0:714293de3836 999
ashleymills 0:714293de3836 1000 struct OCSP_Entry {
ashleymills 0:714293de3836 1001 OCSP_Entry* next; /* next entry */
ashleymills 0:714293de3836 1002 byte issuerHash[OCSP_DIGEST_SIZE]; /* issuer hash */
ashleymills 0:714293de3836 1003 byte issuerKeyHash[OCSP_DIGEST_SIZE]; /* issuer public key hash */
ashleymills 0:714293de3836 1004 CertStatus* status; /* OCSP response list */
ashleymills 0:714293de3836 1005 int totalStatus; /* number on list */
ashleymills 0:714293de3836 1006 };
ashleymills 0:714293de3836 1007
ashleymills 0:714293de3836 1008
ashleymills 0:714293de3836 1009 /* CyaSSL OCSP controller */
ashleymills 0:714293de3836 1010 struct CYASSL_OCSP {
ashleymills 0:714293de3836 1011 byte enabled;
ashleymills 0:714293de3836 1012 byte useOverrideUrl;
ashleymills 0:714293de3836 1013 byte useNonce;
ashleymills 0:714293de3836 1014 char overrideUrl[80];
ashleymills 0:714293de3836 1015 OCSP_Entry* ocspList;
ashleymills 0:714293de3836 1016 void* IOCB_OcspCtx;
ashleymills 0:714293de3836 1017 CallbackIOOcsp CBIOOcsp;
ashleymills 0:714293de3836 1018 CallbackIOOcspRespFree CBIOOcspRespFree;
ashleymills 0:714293de3836 1019 };
ashleymills 0:714293de3836 1020
ashleymills 0:714293de3836 1021 #ifndef MAX_DATE_SIZE
ashleymills 0:714293de3836 1022 #define MAX_DATE_SIZE 32
ashleymills 0:714293de3836 1023 #endif
ashleymills 0:714293de3836 1024
ashleymills 0:714293de3836 1025 typedef struct CRL_Entry CRL_Entry;
ashleymills 0:714293de3836 1026
ashleymills 0:714293de3836 1027 #ifdef SHA_DIGEST_SIZE
ashleymills 0:714293de3836 1028 #define CRL_DIGEST_SIZE SHA_DIGEST_SIZE
ashleymills 0:714293de3836 1029 #else
ashleymills 0:714293de3836 1030 #define CRL_DIGEST_SIZE 160
ashleymills 0:714293de3836 1031 #endif
ashleymills 0:714293de3836 1032
ashleymills 0:714293de3836 1033 #ifdef NO_ASN
ashleymills 0:714293de3836 1034 typedef struct RevokedCert RevokedCert;
ashleymills 0:714293de3836 1035 #endif
ashleymills 0:714293de3836 1036
ashleymills 0:714293de3836 1037 /* Complete CRL */
ashleymills 0:714293de3836 1038 struct CRL_Entry {
ashleymills 0:714293de3836 1039 CRL_Entry* next; /* next entry */
ashleymills 0:714293de3836 1040 byte issuerHash[CRL_DIGEST_SIZE]; /* issuer hash */
ashleymills 0:714293de3836 1041 /* byte crlHash[CRL_DIGEST_SIZE]; raw crl data hash */
ashleymills 0:714293de3836 1042 /* restore the hash here if needed for optimized comparisons */
ashleymills 0:714293de3836 1043 byte lastDate[MAX_DATE_SIZE]; /* last date updated */
ashleymills 0:714293de3836 1044 byte nextDate[MAX_DATE_SIZE]; /* next update date */
ashleymills 0:714293de3836 1045 byte lastDateFormat; /* last date format */
ashleymills 0:714293de3836 1046 byte nextDateFormat; /* next date format */
ashleymills 0:714293de3836 1047 RevokedCert* certs; /* revoked cert list */
ashleymills 0:714293de3836 1048 int totalCerts; /* number on list */
ashleymills 0:714293de3836 1049 };
ashleymills 0:714293de3836 1050
ashleymills 0:714293de3836 1051
ashleymills 0:714293de3836 1052 typedef struct CRL_Monitor CRL_Monitor;
ashleymills 0:714293de3836 1053
ashleymills 0:714293de3836 1054 /* CRL directory monitor */
ashleymills 0:714293de3836 1055 struct CRL_Monitor {
ashleymills 0:714293de3836 1056 char* path; /* full dir path, if valid pointer we're using */
ashleymills 0:714293de3836 1057 int type; /* PEM or ASN1 type */
ashleymills 0:714293de3836 1058 };
ashleymills 0:714293de3836 1059
ashleymills 0:714293de3836 1060
ashleymills 0:714293de3836 1061 #ifndef HAVE_CRL
ashleymills 0:714293de3836 1062 typedef struct CYASSL_CRL CYASSL_CRL;
ashleymills 0:714293de3836 1063 #endif
ashleymills 0:714293de3836 1064
ashleymills 0:714293de3836 1065 /* CyaSSL CRL controller */
ashleymills 0:714293de3836 1066 struct CYASSL_CRL {
ashleymills 0:714293de3836 1067 CYASSL_CERT_MANAGER* cm; /* pointer back to cert manager */
ashleymills 0:714293de3836 1068 CRL_Entry* crlList; /* our CRL list */
ashleymills 0:714293de3836 1069 CyaSSL_Mutex crlLock; /* CRL list lock */
ashleymills 0:714293de3836 1070 CRL_Monitor monitors[2]; /* PEM and DER possible */
ashleymills 0:714293de3836 1071 #ifdef HAVE_CRL_MONITOR
ashleymills 0:714293de3836 1072 pthread_t tid; /* monitoring thread */
ashleymills 0:714293de3836 1073 #endif
ashleymills 0:714293de3836 1074 };
ashleymills 0:714293de3836 1075
ashleymills 0:714293de3836 1076
ashleymills 0:714293de3836 1077 #ifdef NO_ASN
ashleymills 0:714293de3836 1078 typedef struct Signer Signer;
ashleymills 0:714293de3836 1079 #endif
ashleymills 0:714293de3836 1080
ashleymills 0:714293de3836 1081
ashleymills 0:714293de3836 1082 #ifndef CA_TABLE_SIZE
ashleymills 0:714293de3836 1083 #define CA_TABLE_SIZE 11
ashleymills 0:714293de3836 1084 #endif
ashleymills 0:714293de3836 1085
ashleymills 0:714293de3836 1086 /* CyaSSL Certificate Manager */
ashleymills 0:714293de3836 1087 struct CYASSL_CERT_MANAGER {
ashleymills 0:714293de3836 1088 Signer* caTable[CA_TABLE_SIZE]; /* the CA signer table */
ashleymills 0:714293de3836 1089 CyaSSL_Mutex caLock; /* CA list lock */
ashleymills 0:714293de3836 1090 CallbackCACache caCacheCallback; /* CA cache addition callback */
ashleymills 0:714293de3836 1091 void* heap; /* heap helper */
ashleymills 0:714293de3836 1092 CYASSL_CRL* crl; /* CRL checker */
ashleymills 0:714293de3836 1093 byte crlEnabled; /* is CRL on ? */
ashleymills 0:714293de3836 1094 byte crlCheckAll; /* always leaf, but all ? */
ashleymills 0:714293de3836 1095 CbMissingCRL cbMissingCRL; /* notify through cb of missing crl */
ashleymills 0:714293de3836 1096 };
ashleymills 0:714293de3836 1097
ashleymills 0:714293de3836 1098 CYASSL_LOCAL int CM_SaveCertCache(CYASSL_CERT_MANAGER*, const char*);
ashleymills 0:714293de3836 1099 CYASSL_LOCAL int CM_RestoreCertCache(CYASSL_CERT_MANAGER*, const char*);
ashleymills 0:714293de3836 1100 CYASSL_LOCAL int CM_MemSaveCertCache(CYASSL_CERT_MANAGER*, void*, int, int*);
ashleymills 0:714293de3836 1101 CYASSL_LOCAL int CM_MemRestoreCertCache(CYASSL_CERT_MANAGER*, const void*, int);
ashleymills 0:714293de3836 1102 CYASSL_LOCAL int CM_GetCertCacheMemSize(CYASSL_CERT_MANAGER*);
ashleymills 0:714293de3836 1103
ashleymills 0:714293de3836 1104 /* CyaSSL Sock Addr */
ashleymills 0:714293de3836 1105 struct CYASSL_SOCKADDR {
ashleymills 0:714293de3836 1106 unsigned int sz; /* sockaddr size */
ashleymills 0:714293de3836 1107 void* sa; /* pointer to the sockaddr_in or sockaddr_in6 */
ashleymills 0:714293de3836 1108 };
ashleymills 0:714293de3836 1109
ashleymills 0:714293de3836 1110 typedef struct CYASSL_DTLS_CTX {
ashleymills 0:714293de3836 1111 CYASSL_SOCKADDR peer;
ashleymills 0:714293de3836 1112 int fd;
ashleymills 0:714293de3836 1113 } CYASSL_DTLS_CTX;
ashleymills 0:714293de3836 1114
ashleymills 0:714293de3836 1115 /* RFC 6066 TLS Extensions */
ashleymills 0:714293de3836 1116 #ifdef HAVE_TLS_EXTENSIONS
ashleymills 0:714293de3836 1117
ashleymills 0:714293de3836 1118 typedef enum {
ashleymills 0:714293de3836 1119 SERVER_NAME_INDICATION = 0,/*
ashleymills 0:714293de3836 1120 MAX_FRAGMENT_LENGTH = 1,
ashleymills 0:714293de3836 1121 CLIENT_CERTIFICATE_URL = 2,
ashleymills 0:714293de3836 1122 TRUSTED_CA_KEYS = 3,
ashleymills 0:714293de3836 1123 TRUNCATED_HMAC = 4,
ashleymills 0:714293de3836 1124 STATUS_REQUEST = 5,
ashleymills 0:714293de3836 1125 SIGNATURE_ALGORITHMS = 13,*/
ashleymills 0:714293de3836 1126 } TLSX_Type;
ashleymills 0:714293de3836 1127
ashleymills 0:714293de3836 1128 typedef struct TLSX {
ashleymills 0:714293de3836 1129 TLSX_Type type; /* Extension Type */
ashleymills 0:714293de3836 1130 void* data; /* Extension Data */
ashleymills 0:714293de3836 1131 byte resp; /* IsResponse Flag */
ashleymills 0:714293de3836 1132 struct TLSX* next; /* List Behavior */
ashleymills 0:714293de3836 1133 } TLSX;
ashleymills 0:714293de3836 1134
ashleymills 0:714293de3836 1135 CYASSL_LOCAL TLSX* TLSX_Find(TLSX* list, TLSX_Type type);
ashleymills 0:714293de3836 1136 CYASSL_LOCAL void TLSX_FreeAll(TLSX* list);
ashleymills 0:714293de3836 1137
ashleymills 0:714293de3836 1138 #ifndef NO_CYASSL_CLIENT
ashleymills 0:714293de3836 1139 CYASSL_LOCAL word16 TLSX_GetRequestSize(CYASSL* ssl);
ashleymills 0:714293de3836 1140 CYASSL_LOCAL word16 TLSX_WriteRequest(CYASSL* ssl, byte* output);
ashleymills 0:714293de3836 1141 #endif
ashleymills 0:714293de3836 1142
ashleymills 0:714293de3836 1143 #ifndef NO_CYASSL_SERVER
ashleymills 0:714293de3836 1144 CYASSL_LOCAL word16 TLSX_GetResponseSize(CYASSL* ssl);
ashleymills 0:714293de3836 1145 CYASSL_LOCAL word16 TLSX_WriteResponse(CYASSL* ssl, byte* output);
ashleymills 0:714293de3836 1146 #endif
ashleymills 0:714293de3836 1147
ashleymills 0:714293de3836 1148 CYASSL_LOCAL int TLSX_Parse(CYASSL* ssl, byte* input, word16 length,
ashleymills 0:714293de3836 1149 byte isRequest, Suites *suites);
ashleymills 0:714293de3836 1150
ashleymills 0:714293de3836 1151 /* Server Name Indication */
ashleymills 0:714293de3836 1152 #ifdef HAVE_SNI
ashleymills 0:714293de3836 1153
ashleymills 0:714293de3836 1154 typedef struct SNI {
ashleymills 0:714293de3836 1155 byte type; /* SNI Type */
ashleymills 0:714293de3836 1156 union { char* host_name; } data; /* SNI Data */
ashleymills 0:714293de3836 1157 struct SNI* next; /* List Behavior */
ashleymills 0:714293de3836 1158 #ifndef NO_CYASSL_SERVER
ashleymills 0:714293de3836 1159 byte options; /* Behaviour options */
ashleymills 0:714293de3836 1160 byte matched; /* Matching result */
ashleymills 0:714293de3836 1161 #endif
ashleymills 0:714293de3836 1162 } SNI;
ashleymills 0:714293de3836 1163
ashleymills 0:714293de3836 1164 CYASSL_LOCAL int TLSX_UseSNI(TLSX** extensions, byte type, const void* data,
ashleymills 0:714293de3836 1165 word16 size);
ashleymills 0:714293de3836 1166
ashleymills 0:714293de3836 1167 #ifndef NO_CYASSL_SERVER
ashleymills 0:714293de3836 1168 CYASSL_LOCAL byte TLSX_SNI_Matched(TLSX* extensions, byte type);
ashleymills 0:714293de3836 1169 CYASSL_LOCAL void TLSX_SNI_SetOptions(TLSX* extensions, byte type,
ashleymills 0:714293de3836 1170 byte options);
ashleymills 0:714293de3836 1171 #endif
ashleymills 0:714293de3836 1172
ashleymills 0:714293de3836 1173 #endif /* HAVE_SNI */
ashleymills 0:714293de3836 1174
ashleymills 0:714293de3836 1175 #endif /* HAVE_TLS_EXTENSIONS */
ashleymills 0:714293de3836 1176
ashleymills 0:714293de3836 1177 /* CyaSSL context type */
ashleymills 0:714293de3836 1178 struct CYASSL_CTX {
ashleymills 0:714293de3836 1179 CYASSL_METHOD* method;
ashleymills 0:714293de3836 1180 CyaSSL_Mutex countMutex; /* reference count mutex */
ashleymills 0:714293de3836 1181 int refCount; /* reference count */
ashleymills 0:714293de3836 1182 #ifndef NO_CERTS
ashleymills 0:714293de3836 1183 buffer certificate;
ashleymills 0:714293de3836 1184 buffer certChain;
ashleymills 0:714293de3836 1185 /* chain after self, in DER, with leading size for each cert */
ashleymills 0:714293de3836 1186 buffer privateKey;
ashleymills 0:714293de3836 1187 buffer serverDH_P;
ashleymills 0:714293de3836 1188 buffer serverDH_G;
ashleymills 0:714293de3836 1189 CYASSL_CERT_MANAGER* cm; /* our cert manager, ctx owns SSL will use */
ashleymills 0:714293de3836 1190 #endif
ashleymills 0:714293de3836 1191 Suites suites;
ashleymills 0:714293de3836 1192 void* heap; /* for user memory overrides */
ashleymills 0:714293de3836 1193 byte verifyPeer;
ashleymills 0:714293de3836 1194 byte verifyNone;
ashleymills 0:714293de3836 1195 byte failNoCert;
ashleymills 0:714293de3836 1196 byte sessionCacheOff;
ashleymills 0:714293de3836 1197 byte sessionCacheFlushOff;
ashleymills 0:714293de3836 1198 byte sendVerify; /* for client side */
ashleymills 0:714293de3836 1199 byte haveRSA; /* RSA available */
ashleymills 0:714293de3836 1200 byte haveDH; /* server DH parms set by user */
ashleymills 0:714293de3836 1201 byte haveNTRU; /* server private NTRU key loaded */
ashleymills 0:714293de3836 1202 byte haveECDSAsig; /* server cert signed w/ ECDSA */
ashleymills 0:714293de3836 1203 byte haveStaticECC; /* static server ECC private key */
ashleymills 0:714293de3836 1204 byte partialWrite; /* only one msg per write call */
ashleymills 0:714293de3836 1205 byte quietShutdown; /* don't send close notify */
ashleymills 0:714293de3836 1206 byte groupMessages; /* group handshake messages before sending */
ashleymills 0:714293de3836 1207 CallbackIORecv CBIORecv;
ashleymills 0:714293de3836 1208 CallbackIOSend CBIOSend;
ashleymills 0:714293de3836 1209 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 1210 CallbackGenCookie CBIOCookie; /* gen cookie callback */
ashleymills 0:714293de3836 1211 #endif
ashleymills 0:714293de3836 1212 VerifyCallback verifyCallback; /* cert verification callback */
ashleymills 0:714293de3836 1213 word32 timeout; /* session timeout */
ashleymills 0:714293de3836 1214 #ifdef HAVE_ECC
ashleymills 0:714293de3836 1215 word16 eccTempKeySz; /* in octets 20 - 66 */
ashleymills 0:714293de3836 1216 #endif
ashleymills 0:714293de3836 1217 #ifndef NO_PSK
ashleymills 0:714293de3836 1218 byte havePSK; /* psk key set by user */
ashleymills 0:714293de3836 1219 psk_client_callback client_psk_cb; /* client callback */
ashleymills 0:714293de3836 1220 psk_server_callback server_psk_cb; /* server callback */
ashleymills 0:714293de3836 1221 char server_hint[MAX_PSK_ID_LEN];
ashleymills 0:714293de3836 1222 #endif /* NO_PSK */
ashleymills 0:714293de3836 1223 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
ashleymills 0:714293de3836 1224 pem_password_cb passwd_cb;
ashleymills 0:714293de3836 1225 void* userdata;
ashleymills 0:714293de3836 1226 #endif /* OPENSSL_EXTRA */
ashleymills 0:714293de3836 1227 #ifdef HAVE_OCSP
ashleymills 0:714293de3836 1228 CYASSL_OCSP ocsp;
ashleymills 0:714293de3836 1229 #endif
ashleymills 0:714293de3836 1230 #ifdef HAVE_CAVIUM
ashleymills 0:714293de3836 1231 int devId; /* cavium device id to use */
ashleymills 0:714293de3836 1232 #endif
ashleymills 0:714293de3836 1233 #ifdef HAVE_TLS_EXTENSIONS
ashleymills 0:714293de3836 1234 TLSX* extensions; /* RFC 6066 TLS Extensions data */
ashleymills 0:714293de3836 1235 #endif
ashleymills 0:714293de3836 1236 };
ashleymills 0:714293de3836 1237
ashleymills 0:714293de3836 1238
ashleymills 0:714293de3836 1239 CYASSL_LOCAL
ashleymills 0:714293de3836 1240 int InitSSL_Ctx(CYASSL_CTX*, CYASSL_METHOD*);
ashleymills 0:714293de3836 1241 CYASSL_LOCAL
ashleymills 0:714293de3836 1242 void FreeSSL_Ctx(CYASSL_CTX*);
ashleymills 0:714293de3836 1243 CYASSL_LOCAL
ashleymills 0:714293de3836 1244 void SSL_CtxResourceFree(CYASSL_CTX*);
ashleymills 0:714293de3836 1245
ashleymills 0:714293de3836 1246 CYASSL_LOCAL
ashleymills 0:714293de3836 1247 int DeriveTlsKeys(CYASSL* ssl);
ashleymills 0:714293de3836 1248 CYASSL_LOCAL
ashleymills 0:714293de3836 1249 int ProcessOldClientHello(CYASSL* ssl, const byte* input, word32* inOutIdx,
ashleymills 0:714293de3836 1250 word32 inSz, word16 sz);
ashleymills 0:714293de3836 1251 #ifndef NO_CERTS
ashleymills 0:714293de3836 1252 CYASSL_LOCAL
ashleymills 0:714293de3836 1253 int AddCA(CYASSL_CERT_MANAGER* ctx, buffer der, int type, int verify);
ashleymills 0:714293de3836 1254 CYASSL_LOCAL
ashleymills 0:714293de3836 1255 int AlreadySigner(CYASSL_CERT_MANAGER* cm, byte* hash);
ashleymills 0:714293de3836 1256 #endif
ashleymills 0:714293de3836 1257
ashleymills 0:714293de3836 1258 /* All cipher suite related info */
ashleymills 0:714293de3836 1259 typedef struct CipherSpecs {
ashleymills 0:714293de3836 1260 byte bulk_cipher_algorithm;
ashleymills 0:714293de3836 1261 byte cipher_type; /* block, stream, or aead */
ashleymills 0:714293de3836 1262 byte mac_algorithm;
ashleymills 0:714293de3836 1263 byte kea; /* key exchange algo */
ashleymills 0:714293de3836 1264 byte sig_algo;
ashleymills 0:714293de3836 1265 byte hash_size;
ashleymills 0:714293de3836 1266 byte pad_size;
ashleymills 0:714293de3836 1267 byte static_ecdh;
ashleymills 0:714293de3836 1268 word16 key_size;
ashleymills 0:714293de3836 1269 word16 iv_size;
ashleymills 0:714293de3836 1270 word16 block_size;
ashleymills 0:714293de3836 1271 word16 aead_mac_size;
ashleymills 0:714293de3836 1272 } CipherSpecs;
ashleymills 0:714293de3836 1273
ashleymills 0:714293de3836 1274
ashleymills 0:714293de3836 1275 void InitCipherSpecs(CipherSpecs* cs);
ashleymills 0:714293de3836 1276
ashleymills 0:714293de3836 1277
ashleymills 0:714293de3836 1278 /* Supported Ciphers from page 43 */
ashleymills 0:714293de3836 1279 enum BulkCipherAlgorithm {
ashleymills 0:714293de3836 1280 cipher_null,
ashleymills 0:714293de3836 1281 rc4,
ashleymills 0:714293de3836 1282 rc2,
ashleymills 0:714293de3836 1283 des,
ashleymills 0:714293de3836 1284 triple_des, /* leading 3 (3des) not valid identifier */
ashleymills 0:714293de3836 1285 des40,
ashleymills 0:714293de3836 1286 idea,
ashleymills 0:714293de3836 1287 aes,
ashleymills 0:714293de3836 1288 aes_gcm,
ashleymills 0:714293de3836 1289 aes_ccm,
ashleymills 0:714293de3836 1290 camellia,
ashleymills 0:714293de3836 1291 hc128, /* CyaSSL extensions */
ashleymills 0:714293de3836 1292 rabbit
ashleymills 0:714293de3836 1293 };
ashleymills 0:714293de3836 1294
ashleymills 0:714293de3836 1295
ashleymills 0:714293de3836 1296 /* Supported Message Authentication Codes from page 43 */
ashleymills 0:714293de3836 1297 enum MACAlgorithm {
ashleymills 0:714293de3836 1298 no_mac,
ashleymills 0:714293de3836 1299 md5_mac,
ashleymills 0:714293de3836 1300 sha_mac,
ashleymills 0:714293de3836 1301 sha224_mac,
ashleymills 0:714293de3836 1302 sha256_mac,
ashleymills 0:714293de3836 1303 sha384_mac,
ashleymills 0:714293de3836 1304 sha512_mac,
ashleymills 0:714293de3836 1305 rmd_mac
ashleymills 0:714293de3836 1306 };
ashleymills 0:714293de3836 1307
ashleymills 0:714293de3836 1308
ashleymills 0:714293de3836 1309 /* Supported Key Exchange Protocols */
ashleymills 0:714293de3836 1310 enum KeyExchangeAlgorithm {
ashleymills 0:714293de3836 1311 no_kea,
ashleymills 0:714293de3836 1312 rsa_kea,
ashleymills 0:714293de3836 1313 diffie_hellman_kea,
ashleymills 0:714293de3836 1314 fortezza_kea,
ashleymills 0:714293de3836 1315 psk_kea,
ashleymills 0:714293de3836 1316 ntru_kea,
ashleymills 0:714293de3836 1317 ecc_diffie_hellman_kea,
ashleymills 0:714293de3836 1318 ecc_static_diffie_hellman_kea /* for verify suite only */
ashleymills 0:714293de3836 1319 };
ashleymills 0:714293de3836 1320
ashleymills 0:714293de3836 1321
ashleymills 0:714293de3836 1322 /* Supported Authentication Schemes */
ashleymills 0:714293de3836 1323 enum SignatureAlgorithm {
ashleymills 0:714293de3836 1324 anonymous_sa_algo,
ashleymills 0:714293de3836 1325 rsa_sa_algo,
ashleymills 0:714293de3836 1326 dsa_sa_algo,
ashleymills 0:714293de3836 1327 ecc_dsa_sa_algo
ashleymills 0:714293de3836 1328 };
ashleymills 0:714293de3836 1329
ashleymills 0:714293de3836 1330
ashleymills 0:714293de3836 1331 /* Supprted ECC Curve Types */
ashleymills 0:714293de3836 1332 enum EccCurves {
ashleymills 0:714293de3836 1333 named_curve = 3
ashleymills 0:714293de3836 1334 };
ashleymills 0:714293de3836 1335
ashleymills 0:714293de3836 1336
ashleymills 0:714293de3836 1337 /* Supprted ECC Named Curves */
ashleymills 0:714293de3836 1338 enum EccNamedCurves {
ashleymills 0:714293de3836 1339 secp256r1 = 0x17, /* default, OpenSSL also calls it prime256v1 */
ashleymills 0:714293de3836 1340 secp384r1 = 0x18,
ashleymills 0:714293de3836 1341 secp521r1 = 0x19,
ashleymills 0:714293de3836 1342
ashleymills 0:714293de3836 1343 secp160r1 = 0x10,
ashleymills 0:714293de3836 1344 secp192r1 = 0x13, /* Openssl also call it prime192v1 */
ashleymills 0:714293de3836 1345 secp224r1 = 0x15
ashleymills 0:714293de3836 1346 };
ashleymills 0:714293de3836 1347
ashleymills 0:714293de3836 1348
ashleymills 0:714293de3836 1349 /* Valid client certificate request types from page 27 */
ashleymills 0:714293de3836 1350 enum ClientCertificateType {
ashleymills 0:714293de3836 1351 rsa_sign = 1,
ashleymills 0:714293de3836 1352 dss_sign = 2,
ashleymills 0:714293de3836 1353 rsa_fixed_dh = 3,
ashleymills 0:714293de3836 1354 dss_fixed_dh = 4,
ashleymills 0:714293de3836 1355 rsa_ephemeral_dh = 5,
ashleymills 0:714293de3836 1356 dss_ephemeral_dh = 6,
ashleymills 0:714293de3836 1357 fortezza_kea_cert = 20
ashleymills 0:714293de3836 1358 };
ashleymills 0:714293de3836 1359
ashleymills 0:714293de3836 1360
ashleymills 0:714293de3836 1361 enum CipherType { stream, block, aead };
ashleymills 0:714293de3836 1362
ashleymills 0:714293de3836 1363
ashleymills 0:714293de3836 1364 /* keys and secrets */
ashleymills 0:714293de3836 1365 typedef struct Keys {
ashleymills 0:714293de3836 1366 byte client_write_MAC_secret[MAX_DIGEST_SIZE]; /* max sizes */
ashleymills 0:714293de3836 1367 byte server_write_MAC_secret[MAX_DIGEST_SIZE];
ashleymills 0:714293de3836 1368 byte client_write_key[AES_256_KEY_SIZE]; /* max sizes */
ashleymills 0:714293de3836 1369 byte server_write_key[AES_256_KEY_SIZE];
ashleymills 0:714293de3836 1370 byte client_write_IV[AES_IV_SIZE]; /* max sizes */
ashleymills 0:714293de3836 1371 byte server_write_IV[AES_IV_SIZE];
ashleymills 0:714293de3836 1372 #ifdef HAVE_AEAD
ashleymills 0:714293de3836 1373 byte aead_exp_IV[AEAD_EXP_IV_SZ];
ashleymills 0:714293de3836 1374 byte aead_enc_imp_IV[AEAD_IMP_IV_SZ];
ashleymills 0:714293de3836 1375 byte aead_dec_imp_IV[AEAD_IMP_IV_SZ];
ashleymills 0:714293de3836 1376 #endif
ashleymills 0:714293de3836 1377
ashleymills 0:714293de3836 1378 word32 peer_sequence_number;
ashleymills 0:714293de3836 1379 word32 sequence_number;
ashleymills 0:714293de3836 1380
ashleymills 0:714293de3836 1381 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 1382 word32 dtls_sequence_number;
ashleymills 0:714293de3836 1383 word32 dtls_peer_sequence_number;
ashleymills 0:714293de3836 1384 word32 dtls_expected_peer_sequence_number;
ashleymills 0:714293de3836 1385 word16 dtls_handshake_number;
ashleymills 0:714293de3836 1386 word16 dtls_peer_handshake_number;
ashleymills 0:714293de3836 1387 word16 dtls_expected_peer_handshake_number;
ashleymills 0:714293de3836 1388 word16 dtls_epoch;
ashleymills 0:714293de3836 1389 word16 dtls_peer_epoch;
ashleymills 0:714293de3836 1390 word16 dtls_expected_peer_epoch;
ashleymills 0:714293de3836 1391 #endif
ashleymills 0:714293de3836 1392
ashleymills 0:714293de3836 1393 word32 encryptSz; /* last size of encrypted data */
ashleymills 0:714293de3836 1394 byte encryptionOn; /* true after change cipher spec */
ashleymills 0:714293de3836 1395 byte decryptedCur; /* only decrypt current record once */
ashleymills 0:714293de3836 1396 } Keys;
ashleymills 0:714293de3836 1397
ashleymills 0:714293de3836 1398
ashleymills 0:714293de3836 1399 /* cipher for now */
ashleymills 0:714293de3836 1400 typedef struct Ciphers {
ashleymills 0:714293de3836 1401 #ifdef BUILD_ARC4
ashleymills 0:714293de3836 1402 Arc4* arc4;
ashleymills 0:714293de3836 1403 #endif
ashleymills 0:714293de3836 1404 #ifdef BUILD_DES3
ashleymills 0:714293de3836 1405 Des3* des3;
ashleymills 0:714293de3836 1406 #endif
ashleymills 0:714293de3836 1407 #if defined(BUILD_AES) || defined(BUILD_AESGCM)
ashleymills 0:714293de3836 1408 Aes* aes;
ashleymills 0:714293de3836 1409 #endif
ashleymills 0:714293de3836 1410 #ifdef HAVE_CAMELLIA
ashleymills 0:714293de3836 1411 Camellia* cam;
ashleymills 0:714293de3836 1412 #endif
ashleymills 0:714293de3836 1413 #ifdef HAVE_HC128
ashleymills 0:714293de3836 1414 HC128* hc128;
ashleymills 0:714293de3836 1415 #endif
ashleymills 0:714293de3836 1416 #ifdef BUILD_RABBIT
ashleymills 0:714293de3836 1417 Rabbit* rabbit;
ashleymills 0:714293de3836 1418 #endif
ashleymills 0:714293de3836 1419 byte setup; /* have we set it up flag for detection */
ashleymills 0:714293de3836 1420 } Ciphers;
ashleymills 0:714293de3836 1421
ashleymills 0:714293de3836 1422
ashleymills 0:714293de3836 1423 CYASSL_LOCAL void InitCiphers(CYASSL* ssl);
ashleymills 0:714293de3836 1424 CYASSL_LOCAL void FreeCiphers(CYASSL* ssl);
ashleymills 0:714293de3836 1425
ashleymills 0:714293de3836 1426
ashleymills 0:714293de3836 1427 /* hashes type */
ashleymills 0:714293de3836 1428 typedef struct Hashes {
ashleymills 0:714293de3836 1429 #ifndef NO_OLD_TLS
ashleymills 0:714293de3836 1430 byte md5[MD5_DIGEST_SIZE];
ashleymills 0:714293de3836 1431 #endif
ashleymills 0:714293de3836 1432 byte sha[SHA_DIGEST_SIZE];
ashleymills 0:714293de3836 1433 #ifndef NO_SHA256
ashleymills 0:714293de3836 1434 byte sha256[SHA256_DIGEST_SIZE];
ashleymills 0:714293de3836 1435 #endif
ashleymills 0:714293de3836 1436 #ifdef CYASSL_SHA384
ashleymills 0:714293de3836 1437 byte sha384[SHA384_DIGEST_SIZE];
ashleymills 0:714293de3836 1438 #endif
ashleymills 0:714293de3836 1439 } Hashes;
ashleymills 0:714293de3836 1440
ashleymills 0:714293de3836 1441
ashleymills 0:714293de3836 1442 /* Static x509 buffer */
ashleymills 0:714293de3836 1443 typedef struct x509_buffer {
ashleymills 0:714293de3836 1444 int length; /* actual size */
ashleymills 0:714293de3836 1445 byte buffer[MAX_X509_SIZE]; /* max static cert size */
ashleymills 0:714293de3836 1446 } x509_buffer;
ashleymills 0:714293de3836 1447
ashleymills 0:714293de3836 1448
ashleymills 0:714293de3836 1449 /* CyaSSL X509_CHAIN, for no dynamic memory SESSION_CACHE */
ashleymills 0:714293de3836 1450 struct CYASSL_X509_CHAIN {
ashleymills 0:714293de3836 1451 int count; /* total number in chain */
ashleymills 0:714293de3836 1452 x509_buffer certs[MAX_CHAIN_DEPTH]; /* only allow max depth 4 for now */
ashleymills 0:714293de3836 1453 };
ashleymills 0:714293de3836 1454
ashleymills 0:714293de3836 1455
ashleymills 0:714293de3836 1456 /* CyaSSL session type */
ashleymills 0:714293de3836 1457 struct CYASSL_SESSION {
ashleymills 0:714293de3836 1458 byte sessionID[ID_LEN]; /* id for protocol */
ashleymills 0:714293de3836 1459 byte masterSecret[SECRET_LEN]; /* stored secret */
ashleymills 0:714293de3836 1460 word32 bornOn; /* create time in seconds */
ashleymills 0:714293de3836 1461 word32 timeout; /* timeout in seconds */
ashleymills 0:714293de3836 1462 #ifdef SESSION_CERTS
ashleymills 0:714293de3836 1463 CYASSL_X509_CHAIN chain; /* peer cert chain, static */
ashleymills 0:714293de3836 1464 ProtocolVersion version; /* which version was used */
ashleymills 0:714293de3836 1465 byte cipherSuite0; /* first byte, normally 0 */
ashleymills 0:714293de3836 1466 byte cipherSuite; /* 2nd byte, actual suite */
ashleymills 0:714293de3836 1467 #endif
ashleymills 0:714293de3836 1468 #ifndef NO_CLIENT_CACHE
ashleymills 0:714293de3836 1469 byte serverID[SERVER_ID_LEN]; /* for easier client lookup */
ashleymills 0:714293de3836 1470 word16 idLen; /* serverID length */
ashleymills 0:714293de3836 1471 #endif
ashleymills 0:714293de3836 1472 };
ashleymills 0:714293de3836 1473
ashleymills 0:714293de3836 1474
ashleymills 0:714293de3836 1475 CYASSL_LOCAL
ashleymills 0:714293de3836 1476 CYASSL_SESSION* GetSession(CYASSL*, byte*);
ashleymills 0:714293de3836 1477 CYASSL_LOCAL
ashleymills 0:714293de3836 1478 int SetSession(CYASSL*, CYASSL_SESSION*);
ashleymills 0:714293de3836 1479
ashleymills 0:714293de3836 1480 typedef void (*hmacfp) (CYASSL*, byte*, const byte*, word32, int, int);
ashleymills 0:714293de3836 1481
ashleymills 0:714293de3836 1482 #ifndef NO_CLIENT_CACHE
ashleymills 0:714293de3836 1483 CYASSL_SESSION* GetSessionClient(CYASSL*, const byte*, int);
ashleymills 0:714293de3836 1484 #endif
ashleymills 0:714293de3836 1485
ashleymills 0:714293de3836 1486 /* client connect state for nonblocking restart */
ashleymills 0:714293de3836 1487 enum ConnectState {
ashleymills 0:714293de3836 1488 CONNECT_BEGIN = 0,
ashleymills 0:714293de3836 1489 CLIENT_HELLO_SENT,
ashleymills 0:714293de3836 1490 HELLO_AGAIN, /* HELLO_AGAIN s for DTLS case */
ashleymills 0:714293de3836 1491 HELLO_AGAIN_REPLY,
ashleymills 0:714293de3836 1492 FIRST_REPLY_DONE,
ashleymills 0:714293de3836 1493 FIRST_REPLY_FIRST,
ashleymills 0:714293de3836 1494 FIRST_REPLY_SECOND,
ashleymills 0:714293de3836 1495 FIRST_REPLY_THIRD,
ashleymills 0:714293de3836 1496 FIRST_REPLY_FOURTH,
ashleymills 0:714293de3836 1497 FINISHED_DONE,
ashleymills 0:714293de3836 1498 SECOND_REPLY_DONE
ashleymills 0:714293de3836 1499 };
ashleymills 0:714293de3836 1500
ashleymills 0:714293de3836 1501
ashleymills 0:714293de3836 1502 /* server accept state for nonblocking restart */
ashleymills 0:714293de3836 1503 enum AcceptState {
ashleymills 0:714293de3836 1504 ACCEPT_BEGIN = 0,
ashleymills 0:714293de3836 1505 ACCEPT_CLIENT_HELLO_DONE,
ashleymills 0:714293de3836 1506 HELLO_VERIFY_SENT,
ashleymills 0:714293de3836 1507 ACCEPT_FIRST_REPLY_DONE,
ashleymills 0:714293de3836 1508 SERVER_HELLO_SENT,
ashleymills 0:714293de3836 1509 CERT_SENT,
ashleymills 0:714293de3836 1510 KEY_EXCHANGE_SENT,
ashleymills 0:714293de3836 1511 CERT_REQ_SENT,
ashleymills 0:714293de3836 1512 SERVER_HELLO_DONE,
ashleymills 0:714293de3836 1513 ACCEPT_SECOND_REPLY_DONE,
ashleymills 0:714293de3836 1514 CHANGE_CIPHER_SENT,
ashleymills 0:714293de3836 1515 ACCEPT_FINISHED_DONE,
ashleymills 0:714293de3836 1516 ACCEPT_THIRD_REPLY_DONE
ashleymills 0:714293de3836 1517 };
ashleymills 0:714293de3836 1518
ashleymills 0:714293de3836 1519
ashleymills 0:714293de3836 1520 typedef struct Buffers {
ashleymills 0:714293de3836 1521 #ifndef NO_CERTS
ashleymills 0:714293de3836 1522 buffer certificate; /* CYASSL_CTX owns, unless we own */
ashleymills 0:714293de3836 1523 buffer key; /* CYASSL_CTX owns, unless we own */
ashleymills 0:714293de3836 1524 buffer certChain; /* CYASSL_CTX owns */
ashleymills 0:714293de3836 1525 /* chain after self, in DER, with leading size for each cert */
ashleymills 0:714293de3836 1526 buffer serverDH_P; /* CYASSL_CTX owns, unless we own */
ashleymills 0:714293de3836 1527 buffer serverDH_G; /* CYASSL_CTX owns, unless we own */
ashleymills 0:714293de3836 1528 buffer serverDH_Pub;
ashleymills 0:714293de3836 1529 buffer serverDH_Priv;
ashleymills 0:714293de3836 1530 #endif
ashleymills 0:714293de3836 1531 buffer domainName; /* for client check */
ashleymills 0:714293de3836 1532 bufferStatic inputBuffer;
ashleymills 0:714293de3836 1533 bufferStatic outputBuffer;
ashleymills 0:714293de3836 1534 buffer clearOutputBuffer;
ashleymills 0:714293de3836 1535 int prevSent; /* previous plain text bytes sent
ashleymills 0:714293de3836 1536 when got WANT_WRITE */
ashleymills 0:714293de3836 1537 int plainSz; /* plain text bytes in buffer to send
ashleymills 0:714293de3836 1538 when got WANT_WRITE */
ashleymills 0:714293de3836 1539 byte weOwnCert; /* SSL own cert flag */
ashleymills 0:714293de3836 1540 byte weOwnKey; /* SSL own key flag */
ashleymills 0:714293de3836 1541 byte weOwnDH; /* SSL own dh (p,g) flag */
ashleymills 0:714293de3836 1542 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 1543 CYASSL_DTLS_CTX dtlsCtx; /* DTLS connection context */
ashleymills 0:714293de3836 1544 #endif
ashleymills 0:714293de3836 1545 } Buffers;
ashleymills 0:714293de3836 1546
ashleymills 0:714293de3836 1547 typedef struct Options {
ashleymills 0:714293de3836 1548 byte sessionCacheOff;
ashleymills 0:714293de3836 1549 byte sessionCacheFlushOff;
ashleymills 0:714293de3836 1550 byte cipherSuite0; /* first byte, normally 0 */
ashleymills 0:714293de3836 1551 byte cipherSuite; /* second byte, actual suite */
ashleymills 0:714293de3836 1552 byte serverState;
ashleymills 0:714293de3836 1553 byte clientState;
ashleymills 0:714293de3836 1554 byte handShakeState;
ashleymills 0:714293de3836 1555 byte side; /* client or server end */
ashleymills 0:714293de3836 1556 byte verifyPeer;
ashleymills 0:714293de3836 1557 byte verifyNone;
ashleymills 0:714293de3836 1558 byte failNoCert;
ashleymills 0:714293de3836 1559 byte downgrade; /* allow downgrade of versions */
ashleymills 0:714293de3836 1560 byte sendVerify; /* false = 0, true = 1, sendBlank = 2 */
ashleymills 0:714293de3836 1561 byte resuming;
ashleymills 0:714293de3836 1562 byte haveSessionId; /* server may not send */
ashleymills 0:714293de3836 1563 byte tls; /* using TLS ? */
ashleymills 0:714293de3836 1564 byte tls1_1; /* using TLSv1.1+ ? */
ashleymills 0:714293de3836 1565 byte dtls; /* using datagrams ? */
ashleymills 0:714293de3836 1566 byte connReset; /* has the peer reset */
ashleymills 0:714293de3836 1567 byte isClosed; /* if we consider conn closed */
ashleymills 0:714293de3836 1568 byte closeNotify; /* we've recieved a close notify */
ashleymills 0:714293de3836 1569 byte sentNotify; /* we've sent a close notify */
ashleymills 0:714293de3836 1570 byte connectState; /* nonblocking resume */
ashleymills 0:714293de3836 1571 byte acceptState; /* nonblocking resume */
ashleymills 0:714293de3836 1572 byte usingCompression; /* are we using compression */
ashleymills 0:714293de3836 1573 byte haveRSA; /* RSA available */
ashleymills 0:714293de3836 1574 byte haveDH; /* server DH parms set by user */
ashleymills 0:714293de3836 1575 byte haveNTRU; /* server NTRU private key loaded */
ashleymills 0:714293de3836 1576 byte haveECDSAsig; /* server ECDSA signed cert */
ashleymills 0:714293de3836 1577 byte haveStaticECC; /* static server ECC private key */
ashleymills 0:714293de3836 1578 byte havePeerCert; /* do we have peer's cert */
ashleymills 0:714293de3836 1579 byte havePeerVerify; /* and peer's cert verify */
ashleymills 0:714293de3836 1580 byte usingPSK_cipher; /* whether we're using psk as cipher */
ashleymills 0:714293de3836 1581 byte sendAlertState; /* nonblocking resume */
ashleymills 0:714293de3836 1582 byte processReply; /* nonblocking resume */
ashleymills 0:714293de3836 1583 byte partialWrite; /* only one msg per write call */
ashleymills 0:714293de3836 1584 byte quietShutdown; /* don't send close notify */
ashleymills 0:714293de3836 1585 byte certOnly; /* stop once we get cert */
ashleymills 0:714293de3836 1586 byte groupMessages; /* group handshake messages */
ashleymills 0:714293de3836 1587 byte usingNonblock; /* set when using nonblocking socket */
ashleymills 0:714293de3836 1588 byte saveArrays; /* save array Memory for user get keys
ashleymills 0:714293de3836 1589 or psk */
ashleymills 0:714293de3836 1590 #ifndef NO_PSK
ashleymills 0:714293de3836 1591 byte havePSK; /* psk key set by user */
ashleymills 0:714293de3836 1592 psk_client_callback client_psk_cb;
ashleymills 0:714293de3836 1593 psk_server_callback server_psk_cb;
ashleymills 0:714293de3836 1594 #endif /* NO_PSK */
ashleymills 0:714293de3836 1595 } Options;
ashleymills 0:714293de3836 1596
ashleymills 0:714293de3836 1597 typedef struct Arrays {
ashleymills 0:714293de3836 1598 byte clientRandom[RAN_LEN];
ashleymills 0:714293de3836 1599 byte serverRandom[RAN_LEN];
ashleymills 0:714293de3836 1600 byte sessionID[ID_LEN];
ashleymills 0:714293de3836 1601 byte preMasterSecret[ENCRYPT_LEN];
ashleymills 0:714293de3836 1602 byte masterSecret[SECRET_LEN];
ashleymills 0:714293de3836 1603 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 1604 byte cookie[MAX_COOKIE_LEN];
ashleymills 0:714293de3836 1605 byte cookieSz;
ashleymills 0:714293de3836 1606 #endif
ashleymills 0:714293de3836 1607 #ifndef NO_PSK
ashleymills 0:714293de3836 1608 char client_identity[MAX_PSK_ID_LEN];
ashleymills 0:714293de3836 1609 char server_hint[MAX_PSK_ID_LEN];
ashleymills 0:714293de3836 1610 byte psk_key[MAX_PSK_KEY_LEN];
ashleymills 0:714293de3836 1611 word32 psk_keySz; /* acutal size */
ashleymills 0:714293de3836 1612 #endif
ashleymills 0:714293de3836 1613 word32 preMasterSz; /* differs for DH, actual size */
ashleymills 0:714293de3836 1614 } Arrays;
ashleymills 0:714293de3836 1615
ashleymills 0:714293de3836 1616 #ifndef ASN_NAME_MAX
ashleymills 0:714293de3836 1617 #define ASN_NAME_MAX 256
ashleymills 0:714293de3836 1618 #endif
ashleymills 0:714293de3836 1619
ashleymills 0:714293de3836 1620 struct CYASSL_X509_NAME {
ashleymills 0:714293de3836 1621 char name[ASN_NAME_MAX];
ashleymills 0:714293de3836 1622 int sz;
ashleymills 0:714293de3836 1623 };
ashleymills 0:714293de3836 1624
ashleymills 0:714293de3836 1625 #ifndef EXTERNAL_SERIAL_SIZE
ashleymills 0:714293de3836 1626 #define EXTERNAL_SERIAL_SIZE 32
ashleymills 0:714293de3836 1627 #endif
ashleymills 0:714293de3836 1628
ashleymills 0:714293de3836 1629 #ifdef NO_ASN
ashleymills 0:714293de3836 1630 typedef struct DNS_entry DNS_entry;
ashleymills 0:714293de3836 1631 #endif
ashleymills 0:714293de3836 1632
ashleymills 0:714293de3836 1633 struct CYASSL_X509 {
ashleymills 0:714293de3836 1634 CYASSL_X509_NAME issuer;
ashleymills 0:714293de3836 1635 CYASSL_X509_NAME subject;
ashleymills 0:714293de3836 1636 int serialSz;
ashleymills 0:714293de3836 1637 byte serial[EXTERNAL_SERIAL_SIZE];
ashleymills 0:714293de3836 1638 char subjectCN[ASN_NAME_MAX]; /* common name short cut */
ashleymills 0:714293de3836 1639 buffer derCert; /* may need */
ashleymills 0:714293de3836 1640 DNS_entry* altNames; /* alt names list */
ashleymills 0:714293de3836 1641 DNS_entry* altNamesNext; /* hint for retrieval */
ashleymills 0:714293de3836 1642 byte dynamicMemory; /* dynamic memory flag */
ashleymills 0:714293de3836 1643 };
ashleymills 0:714293de3836 1644
ashleymills 0:714293de3836 1645
ashleymills 0:714293de3836 1646 /* record layer header for PlainText, Compressed, and CipherText */
ashleymills 0:714293de3836 1647 typedef struct RecordLayerHeader {
ashleymills 0:714293de3836 1648 byte type;
ashleymills 0:714293de3836 1649 byte pvMajor;
ashleymills 0:714293de3836 1650 byte pvMinor;
ashleymills 0:714293de3836 1651 byte length[2];
ashleymills 0:714293de3836 1652 } RecordLayerHeader;
ashleymills 0:714293de3836 1653
ashleymills 0:714293de3836 1654
ashleymills 0:714293de3836 1655 /* record layer header for DTLS PlainText, Compressed, and CipherText */
ashleymills 0:714293de3836 1656 typedef struct DtlsRecordLayerHeader {
ashleymills 0:714293de3836 1657 byte type;
ashleymills 0:714293de3836 1658 byte pvMajor;
ashleymills 0:714293de3836 1659 byte pvMinor;
ashleymills 0:714293de3836 1660 byte epoch[2]; /* increment on cipher state change */
ashleymills 0:714293de3836 1661 byte sequence_number[6]; /* per record */
ashleymills 0:714293de3836 1662 byte length[2];
ashleymills 0:714293de3836 1663 } DtlsRecordLayerHeader;
ashleymills 0:714293de3836 1664
ashleymills 0:714293de3836 1665
ashleymills 0:714293de3836 1666 typedef struct DtlsPool {
ashleymills 0:714293de3836 1667 buffer buf[DTLS_POOL_SZ];
ashleymills 0:714293de3836 1668 int used;
ashleymills 0:714293de3836 1669 } DtlsPool;
ashleymills 0:714293de3836 1670
ashleymills 0:714293de3836 1671 typedef struct DtlsMsg {
ashleymills 0:714293de3836 1672 struct DtlsMsg* next;
ashleymills 0:714293de3836 1673 word32 seq; /* Handshake sequence number */
ashleymills 0:714293de3836 1674 word32 sz; /* Length of whole mesage */
ashleymills 0:714293de3836 1675 word32 fragSz; /* Length of fragments received */
ashleymills 0:714293de3836 1676 byte type;
ashleymills 0:714293de3836 1677 byte* buf;
ashleymills 0:714293de3836 1678 byte* msg;
ashleymills 0:714293de3836 1679 } DtlsMsg;
ashleymills 0:714293de3836 1680
ashleymills 0:714293de3836 1681
ashleymills 0:714293de3836 1682 /* CyaSSL ssl type */
ashleymills 0:714293de3836 1683 struct CYASSL {
ashleymills 0:714293de3836 1684 CYASSL_CTX* ctx;
ashleymills 0:714293de3836 1685 int error;
ashleymills 0:714293de3836 1686 ProtocolVersion version; /* negotiated version */
ashleymills 0:714293de3836 1687 ProtocolVersion chVersion; /* client hello version */
ashleymills 0:714293de3836 1688 Suites* suites; /* only need during handshake */
ashleymills 0:714293de3836 1689 Ciphers encrypt;
ashleymills 0:714293de3836 1690 Ciphers decrypt;
ashleymills 0:714293de3836 1691 CipherSpecs specs;
ashleymills 0:714293de3836 1692 Keys keys;
ashleymills 0:714293de3836 1693 int rfd; /* read file descriptor */
ashleymills 0:714293de3836 1694 int wfd; /* write file descriptor */
ashleymills 0:714293de3836 1695 int rflags; /* user read flags */
ashleymills 0:714293de3836 1696 int wflags; /* user write flags */
ashleymills 0:714293de3836 1697 CYASSL_BIO* biord; /* socket bio read to free/close */
ashleymills 0:714293de3836 1698 CYASSL_BIO* biowr; /* socket bio write to free/close */
ashleymills 0:714293de3836 1699 void* IOCB_ReadCtx;
ashleymills 0:714293de3836 1700 void* IOCB_WriteCtx;
ashleymills 0:714293de3836 1701 RNG* rng;
ashleymills 0:714293de3836 1702 #ifndef NO_OLD_TLS
ashleymills 0:714293de3836 1703 #ifndef NO_SHA
ashleymills 0:714293de3836 1704 Sha hashSha; /* sha hash of handshake msgs */
ashleymills 0:714293de3836 1705 #endif
ashleymills 0:714293de3836 1706 #ifndef NO_MD5
ashleymills 0:714293de3836 1707 Md5 hashMd5; /* md5 hash of handshake msgs */
ashleymills 0:714293de3836 1708 #endif
ashleymills 0:714293de3836 1709 #endif
ashleymills 0:714293de3836 1710 #ifndef NO_SHA256
ashleymills 0:714293de3836 1711 Sha256 hashSha256; /* sha256 hash of handshake msgs */
ashleymills 0:714293de3836 1712 #endif
ashleymills 0:714293de3836 1713 #ifdef CYASSL_SHA384
ashleymills 0:714293de3836 1714 Sha384 hashSha384; /* sha384 hash of handshake msgs */
ashleymills 0:714293de3836 1715 #endif
ashleymills 0:714293de3836 1716 Hashes verifyHashes;
ashleymills 0:714293de3836 1717 Hashes certHashes; /* for cert verify */
ashleymills 0:714293de3836 1718 Buffers buffers;
ashleymills 0:714293de3836 1719 Options options;
ashleymills 0:714293de3836 1720 Arrays* arrays;
ashleymills 0:714293de3836 1721 CYASSL_SESSION session;
ashleymills 0:714293de3836 1722 VerifyCallback verifyCallback; /* cert verification callback */
ashleymills 0:714293de3836 1723 void* verifyCbCtx; /* cert verify callback user ctx*/
ashleymills 0:714293de3836 1724 #ifndef NO_RSA
ashleymills 0:714293de3836 1725 RsaKey* peerRsaKey;
ashleymills 0:714293de3836 1726 byte peerRsaKeyPresent;
ashleymills 0:714293de3836 1727 #endif
ashleymills 0:714293de3836 1728 #ifdef HAVE_NTRU
ashleymills 0:714293de3836 1729 word16 peerNtruKeyLen;
ashleymills 0:714293de3836 1730 byte peerNtruKey[MAX_NTRU_PUB_KEY_SZ];
ashleymills 0:714293de3836 1731 byte peerNtruKeyPresent;
ashleymills 0:714293de3836 1732 #endif
ashleymills 0:714293de3836 1733 #ifdef HAVE_ECC
ashleymills 0:714293de3836 1734 ecc_key* peerEccKey; /* peer's ECDHE key */
ashleymills 0:714293de3836 1735 ecc_key* peerEccDsaKey; /* peer's ECDSA key */
ashleymills 0:714293de3836 1736 ecc_key* eccTempKey; /* private ECDHE key */
ashleymills 0:714293de3836 1737 ecc_key* eccDsaKey; /* private ECDSA key */
ashleymills 0:714293de3836 1738 word16 eccTempKeySz; /* in octets 20 - 66 */
ashleymills 0:714293de3836 1739 byte peerEccKeyPresent;
ashleymills 0:714293de3836 1740 byte peerEccDsaKeyPresent;
ashleymills 0:714293de3836 1741 byte eccTempKeyPresent;
ashleymills 0:714293de3836 1742 byte eccDsaKeyPresent;
ashleymills 0:714293de3836 1743 #endif
ashleymills 0:714293de3836 1744 hmacfp hmac;
ashleymills 0:714293de3836 1745 void* heap; /* for user overrides */
ashleymills 0:714293de3836 1746 RecordLayerHeader curRL;
ashleymills 0:714293de3836 1747 word16 curSize;
ashleymills 0:714293de3836 1748 word32 timeout; /* session timeout */
ashleymills 0:714293de3836 1749 CYASSL_CIPHER cipher;
ashleymills 0:714293de3836 1750 #ifdef HAVE_LIBZ
ashleymills 0:714293de3836 1751 z_stream c_stream; /* compression stream */
ashleymills 0:714293de3836 1752 z_stream d_stream; /* decompression stream */
ashleymills 0:714293de3836 1753 byte didStreamInit; /* for stream init and end */
ashleymills 0:714293de3836 1754 #endif
ashleymills 0:714293de3836 1755 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 1756 int dtls_timeout_init; /* starting timeout vaule */
ashleymills 0:714293de3836 1757 int dtls_timeout_max; /* maximum timeout value */
ashleymills 0:714293de3836 1758 int dtls_timeout; /* current timeout value, changes */
ashleymills 0:714293de3836 1759 DtlsPool* dtls_pool;
ashleymills 0:714293de3836 1760 DtlsMsg* dtls_msg_list;
ashleymills 0:714293de3836 1761 void* IOCB_CookieCtx; /* gen cookie ctx */
ashleymills 0:714293de3836 1762 word32 dtls_expected_rx;
ashleymills 0:714293de3836 1763 #endif
ashleymills 0:714293de3836 1764 #ifdef CYASSL_CALLBACKS
ashleymills 0:714293de3836 1765 HandShakeInfo handShakeInfo; /* info saved during handshake */
ashleymills 0:714293de3836 1766 TimeoutInfo timeoutInfo; /* info saved during handshake */
ashleymills 0:714293de3836 1767 byte hsInfoOn; /* track handshake info */
ashleymills 0:714293de3836 1768 byte toInfoOn; /* track timeout info */
ashleymills 0:714293de3836 1769 #endif
ashleymills 0:714293de3836 1770 #ifdef KEEP_PEER_CERT
ashleymills 0:714293de3836 1771 CYASSL_X509 peerCert; /* X509 peer cert */
ashleymills 0:714293de3836 1772 #endif
ashleymills 0:714293de3836 1773 #ifdef FORTRESS
ashleymills 0:714293de3836 1774 void* ex_data[MAX_EX_DATA]; /* external data, for Fortress */
ashleymills 0:714293de3836 1775 #endif
ashleymills 0:714293de3836 1776 #ifdef HAVE_CAVIUM
ashleymills 0:714293de3836 1777 int devId; /* cavium device id to use */
ashleymills 0:714293de3836 1778 #endif
ashleymills 0:714293de3836 1779 #ifdef HAVE_TLS_EXTENSIONS
ashleymills 0:714293de3836 1780 TLSX* extensions; /* RFC 6066 TLS Extensions data */
ashleymills 0:714293de3836 1781 #endif
ashleymills 0:714293de3836 1782 CYASSL_ALERT_HISTORY alert_history;
ashleymills 0:714293de3836 1783 };
ashleymills 0:714293de3836 1784
ashleymills 0:714293de3836 1785
ashleymills 0:714293de3836 1786 CYASSL_LOCAL
ashleymills 0:714293de3836 1787 int InitSSL(CYASSL*, CYASSL_CTX*);
ashleymills 0:714293de3836 1788 CYASSL_LOCAL
ashleymills 0:714293de3836 1789 void FreeSSL(CYASSL*);
ashleymills 0:714293de3836 1790 CYASSL_API void SSL_ResourceFree(CYASSL*); /* Micrium uses */
ashleymills 0:714293de3836 1791
ashleymills 0:714293de3836 1792
ashleymills 0:714293de3836 1793 enum {
ashleymills 0:714293de3836 1794 IV_SZ = 32, /* max iv sz */
ashleymills 0:714293de3836 1795 NAME_SZ = 80 /* max one line */
ashleymills 0:714293de3836 1796 };
ashleymills 0:714293de3836 1797
ashleymills 0:714293de3836 1798
ashleymills 0:714293de3836 1799 typedef struct EncryptedInfo {
ashleymills 0:714293de3836 1800 char name[NAME_SZ]; /* encryption name */
ashleymills 0:714293de3836 1801 byte iv[IV_SZ]; /* encrypted IV */
ashleymills 0:714293de3836 1802 word32 ivSz; /* encrypted IV size */
ashleymills 0:714293de3836 1803 long consumed; /* tracks PEM bytes consumed */
ashleymills 0:714293de3836 1804 byte set; /* if encryption set */
ashleymills 0:714293de3836 1805 CYASSL_CTX* ctx; /* CTX owner */
ashleymills 0:714293de3836 1806 } EncryptedInfo;
ashleymills 0:714293de3836 1807
ashleymills 0:714293de3836 1808
ashleymills 0:714293de3836 1809 #ifndef NO_CERTS
ashleymills 0:714293de3836 1810 CYASSL_LOCAL int PemToDer(const unsigned char* buff, long sz, int type,
ashleymills 0:714293de3836 1811 buffer* der, void* heap, EncryptedInfo* info,
ashleymills 0:714293de3836 1812 int* eccKey);
ashleymills 0:714293de3836 1813
ashleymills 0:714293de3836 1814 CYASSL_LOCAL int ProcessFile(CYASSL_CTX* ctx, const char* fname, int format,
ashleymills 0:714293de3836 1815 int type, CYASSL* ssl, int userChain,
ashleymills 0:714293de3836 1816 CYASSL_CRL* crl);
ashleymills 0:714293de3836 1817 #endif
ashleymills 0:714293de3836 1818
ashleymills 0:714293de3836 1819
ashleymills 0:714293de3836 1820 #ifdef CYASSL_CALLBACKS
ashleymills 0:714293de3836 1821 CYASSL_LOCAL
ashleymills 0:714293de3836 1822 void InitHandShakeInfo(HandShakeInfo*);
ashleymills 0:714293de3836 1823 CYASSL_LOCAL
ashleymills 0:714293de3836 1824 void FinishHandShakeInfo(HandShakeInfo*, const CYASSL*);
ashleymills 0:714293de3836 1825 CYASSL_LOCAL
ashleymills 0:714293de3836 1826 void AddPacketName(const char*, HandShakeInfo*);
ashleymills 0:714293de3836 1827
ashleymills 0:714293de3836 1828 CYASSL_LOCAL
ashleymills 0:714293de3836 1829 void InitTimeoutInfo(TimeoutInfo*);
ashleymills 0:714293de3836 1830 CYASSL_LOCAL
ashleymills 0:714293de3836 1831 void FreeTimeoutInfo(TimeoutInfo*, void*);
ashleymills 0:714293de3836 1832 CYASSL_LOCAL
ashleymills 0:714293de3836 1833 void AddPacketInfo(const char*, TimeoutInfo*, const byte*, int, void*);
ashleymills 0:714293de3836 1834 CYASSL_LOCAL
ashleymills 0:714293de3836 1835 void AddLateName(const char*, TimeoutInfo*);
ashleymills 0:714293de3836 1836 CYASSL_LOCAL
ashleymills 0:714293de3836 1837 void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info);
ashleymills 0:714293de3836 1838 #endif
ashleymills 0:714293de3836 1839
ashleymills 0:714293de3836 1840
ashleymills 0:714293de3836 1841 /* Record Layer Header identifier from page 12 */
ashleymills 0:714293de3836 1842 enum ContentType {
ashleymills 0:714293de3836 1843 no_type = 0,
ashleymills 0:714293de3836 1844 change_cipher_spec = 20,
ashleymills 0:714293de3836 1845 alert = 21,
ashleymills 0:714293de3836 1846 handshake = 22,
ashleymills 0:714293de3836 1847 application_data = 23
ashleymills 0:714293de3836 1848 };
ashleymills 0:714293de3836 1849
ashleymills 0:714293de3836 1850
ashleymills 0:714293de3836 1851 /* handshake header, same for each message type, pgs 20/21 */
ashleymills 0:714293de3836 1852 typedef struct HandShakeHeader {
ashleymills 0:714293de3836 1853 byte type;
ashleymills 0:714293de3836 1854 word24 length;
ashleymills 0:714293de3836 1855 } HandShakeHeader;
ashleymills 0:714293de3836 1856
ashleymills 0:714293de3836 1857
ashleymills 0:714293de3836 1858 /* DTLS handshake header, same for each message type */
ashleymills 0:714293de3836 1859 typedef struct DtlsHandShakeHeader {
ashleymills 0:714293de3836 1860 byte type;
ashleymills 0:714293de3836 1861 word24 length;
ashleymills 0:714293de3836 1862 byte message_seq[2]; /* start at 0, restransmit gets same # */
ashleymills 0:714293de3836 1863 word24 fragment_offset; /* bytes in previous fragments */
ashleymills 0:714293de3836 1864 word24 fragment_length; /* length of this fragment */
ashleymills 0:714293de3836 1865 } DtlsHandShakeHeader;
ashleymills 0:714293de3836 1866
ashleymills 0:714293de3836 1867
ashleymills 0:714293de3836 1868 enum HandShakeType {
ashleymills 0:714293de3836 1869 no_shake = -1,
ashleymills 0:714293de3836 1870 hello_request = 0,
ashleymills 0:714293de3836 1871 client_hello = 1,
ashleymills 0:714293de3836 1872 server_hello = 2,
ashleymills 0:714293de3836 1873 hello_verify_request = 3, /* DTLS addition */
ashleymills 0:714293de3836 1874 session_ticket = 4,
ashleymills 0:714293de3836 1875 certificate = 11,
ashleymills 0:714293de3836 1876 server_key_exchange = 12,
ashleymills 0:714293de3836 1877 certificate_request = 13,
ashleymills 0:714293de3836 1878 server_hello_done = 14,
ashleymills 0:714293de3836 1879 certificate_verify = 15,
ashleymills 0:714293de3836 1880 client_key_exchange = 16,
ashleymills 0:714293de3836 1881 finished = 20
ashleymills 0:714293de3836 1882 };
ashleymills 0:714293de3836 1883
ashleymills 0:714293de3836 1884
ashleymills 0:714293de3836 1885 /* Valid Alert types from page 16/17 */
ashleymills 0:714293de3836 1886 enum AlertDescription {
ashleymills 0:714293de3836 1887 close_notify = 0,
ashleymills 0:714293de3836 1888 unexpected_message = 10,
ashleymills 0:714293de3836 1889 bad_record_mac = 20,
ashleymills 0:714293de3836 1890 decompression_failure = 30,
ashleymills 0:714293de3836 1891 handshake_failure = 40,
ashleymills 0:714293de3836 1892 no_certificate = 41,
ashleymills 0:714293de3836 1893 bad_certificate = 42,
ashleymills 0:714293de3836 1894 unsupported_certificate = 43,
ashleymills 0:714293de3836 1895 certificate_revoked = 44,
ashleymills 0:714293de3836 1896 certificate_expired = 45,
ashleymills 0:714293de3836 1897 certificate_unknown = 46,
ashleymills 0:714293de3836 1898 illegal_parameter = 47,
ashleymills 0:714293de3836 1899 decrypt_error = 51,
ashleymills 0:714293de3836 1900 protocol_version = 70,
ashleymills 0:714293de3836 1901 no_renegotiation = 100,
ashleymills 0:714293de3836 1902 unrecognized_name = 112
ashleymills 0:714293de3836 1903 };
ashleymills 0:714293de3836 1904
ashleymills 0:714293de3836 1905
ashleymills 0:714293de3836 1906 enum AlertLevel {
ashleymills 0:714293de3836 1907 alert_warning = 1,
ashleymills 0:714293de3836 1908 alert_fatal = 2
ashleymills 0:714293de3836 1909 };
ashleymills 0:714293de3836 1910
ashleymills 0:714293de3836 1911
ashleymills 0:714293de3836 1912 static const byte client[SIZEOF_SENDER] = { 0x43, 0x4C, 0x4E, 0x54 };
ashleymills 0:714293de3836 1913 static const byte server[SIZEOF_SENDER] = { 0x53, 0x52, 0x56, 0x52 };
ashleymills 0:714293de3836 1914
ashleymills 0:714293de3836 1915 static const byte tls_client[FINISHED_LABEL_SZ + 1] = "client finished";
ashleymills 0:714293de3836 1916 static const byte tls_server[FINISHED_LABEL_SZ + 1] = "server finished";
ashleymills 0:714293de3836 1917
ashleymills 0:714293de3836 1918
ashleymills 0:714293de3836 1919 /* internal functions */
ashleymills 0:714293de3836 1920 CYASSL_LOCAL int SendChangeCipher(CYASSL*);
ashleymills 0:714293de3836 1921 CYASSL_LOCAL int SendData(CYASSL*, const void*, int);
ashleymills 0:714293de3836 1922 CYASSL_LOCAL int SendCertificate(CYASSL*);
ashleymills 0:714293de3836 1923 CYASSL_LOCAL int SendCertificateRequest(CYASSL*);
ashleymills 0:714293de3836 1924 CYASSL_LOCAL int SendServerKeyExchange(CYASSL*);
ashleymills 0:714293de3836 1925 CYASSL_LOCAL int SendBuffered(CYASSL*);
ashleymills 0:714293de3836 1926 CYASSL_LOCAL int ReceiveData(CYASSL*, byte*, int, int);
ashleymills 0:714293de3836 1927 CYASSL_LOCAL int SendFinished(CYASSL*);
ashleymills 0:714293de3836 1928 CYASSL_LOCAL int SendAlert(CYASSL*, int, int);
ashleymills 0:714293de3836 1929 CYASSL_LOCAL int ProcessReply(CYASSL*);
ashleymills 0:714293de3836 1930
ashleymills 0:714293de3836 1931 CYASSL_LOCAL int SetCipherSpecs(CYASSL*);
ashleymills 0:714293de3836 1932 CYASSL_LOCAL int MakeMasterSecret(CYASSL*);
ashleymills 0:714293de3836 1933
ashleymills 0:714293de3836 1934 CYASSL_LOCAL int AddSession(CYASSL*);
ashleymills 0:714293de3836 1935 CYASSL_LOCAL int DeriveKeys(CYASSL* ssl);
ashleymills 0:714293de3836 1936 CYASSL_LOCAL int StoreKeys(CYASSL* ssl, const byte* keyData);
ashleymills 0:714293de3836 1937
ashleymills 0:714293de3836 1938 CYASSL_LOCAL int IsTLS(const CYASSL* ssl);
ashleymills 0:714293de3836 1939 CYASSL_LOCAL int IsAtLeastTLSv1_2(const CYASSL* ssl);
ashleymills 0:714293de3836 1940
ashleymills 0:714293de3836 1941 CYASSL_LOCAL void FreeHandshakeResources(CYASSL* ssl);
ashleymills 0:714293de3836 1942 CYASSL_LOCAL void ShrinkInputBuffer(CYASSL* ssl, int forcedFree);
ashleymills 0:714293de3836 1943 CYASSL_LOCAL void ShrinkOutputBuffer(CYASSL* ssl);
ashleymills 0:714293de3836 1944 #ifndef NO_CERTS
ashleymills 0:714293de3836 1945 CYASSL_LOCAL Signer* GetCA(void* cm, byte* hash);
ashleymills 0:714293de3836 1946 #ifndef NO_SKID
ashleymills 0:714293de3836 1947 CYASSL_LOCAL Signer* GetCAByName(void* cm, byte* hash);
ashleymills 0:714293de3836 1948 #endif
ashleymills 0:714293de3836 1949 #endif
ashleymills 0:714293de3836 1950 CYASSL_LOCAL void BuildTlsFinished(CYASSL* ssl, Hashes* hashes,
ashleymills 0:714293de3836 1951 const byte* sender);
ashleymills 0:714293de3836 1952 CYASSL_LOCAL void FreeArrays(CYASSL* ssl, int keep);
ashleymills 0:714293de3836 1953 CYASSL_LOCAL int CheckAvailableSize(CYASSL *ssl, int size);
ashleymills 0:714293de3836 1954 CYASSL_LOCAL int GrowInputBuffer(CYASSL* ssl, int size, int usedLength);
ashleymills 0:714293de3836 1955
ashleymills 0:714293de3836 1956 #ifndef NO_TLS
ashleymills 0:714293de3836 1957 CYASSL_LOCAL int MakeTlsMasterSecret(CYASSL*);
ashleymills 0:714293de3836 1958 CYASSL_LOCAL void TLS_hmac(CYASSL* ssl, byte* digest, const byte* in,
ashleymills 0:714293de3836 1959 word32 sz, int content, int verify);
ashleymills 0:714293de3836 1960 #endif
ashleymills 0:714293de3836 1961
ashleymills 0:714293de3836 1962 #ifndef NO_CYASSL_CLIENT
ashleymills 0:714293de3836 1963 CYASSL_LOCAL int SendClientHello(CYASSL*);
ashleymills 0:714293de3836 1964 CYASSL_LOCAL int SendClientKeyExchange(CYASSL*);
ashleymills 0:714293de3836 1965 CYASSL_LOCAL int SendCertificateVerify(CYASSL*);
ashleymills 0:714293de3836 1966 #endif /* NO_CYASSL_CLIENT */
ashleymills 0:714293de3836 1967
ashleymills 0:714293de3836 1968 #ifndef NO_CYASSL_SERVER
ashleymills 0:714293de3836 1969 CYASSL_LOCAL int SendServerHello(CYASSL*);
ashleymills 0:714293de3836 1970 CYASSL_LOCAL int SendServerHelloDone(CYASSL*);
ashleymills 0:714293de3836 1971 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 1972 CYASSL_LOCAL int SendHelloVerifyRequest(CYASSL*);
ashleymills 0:714293de3836 1973 #endif
ashleymills 0:714293de3836 1974 #endif /* NO_CYASSL_SERVER */
ashleymills 0:714293de3836 1975
ashleymills 0:714293de3836 1976 #ifdef CYASSL_DTLS
ashleymills 0:714293de3836 1977 CYASSL_LOCAL int DtlsPoolInit(CYASSL*);
ashleymills 0:714293de3836 1978 CYASSL_LOCAL int DtlsPoolSave(CYASSL*, const byte*, int);
ashleymills 0:714293de3836 1979 CYASSL_LOCAL int DtlsPoolTimeout(CYASSL*);
ashleymills 0:714293de3836 1980 CYASSL_LOCAL int DtlsPoolSend(CYASSL*);
ashleymills 0:714293de3836 1981 CYASSL_LOCAL void DtlsPoolReset(CYASSL*);
ashleymills 0:714293de3836 1982
ashleymills 0:714293de3836 1983 CYASSL_LOCAL DtlsMsg* DtlsMsgNew(word32, void*);
ashleymills 0:714293de3836 1984 CYASSL_LOCAL void DtlsMsgDelete(DtlsMsg*, void*);
ashleymills 0:714293de3836 1985 CYASSL_LOCAL void DtlsMsgListDelete(DtlsMsg*, void*);
ashleymills 0:714293de3836 1986 CYASSL_LOCAL void DtlsMsgSet(DtlsMsg*, word32, const byte*, byte,
ashleymills 0:714293de3836 1987 word32, word32);
ashleymills 0:714293de3836 1988 CYASSL_LOCAL DtlsMsg* DtlsMsgFind(DtlsMsg*, word32);
ashleymills 0:714293de3836 1989 CYASSL_LOCAL DtlsMsg* DtlsMsgStore(DtlsMsg*, word32, const byte*, word32,
ashleymills 0:714293de3836 1990 byte, word32, word32, void*);
ashleymills 0:714293de3836 1991 CYASSL_LOCAL DtlsMsg* DtlsMsgInsert(DtlsMsg*, DtlsMsg*);
ashleymills 0:714293de3836 1992 #endif /* CYASSL_DTLS */
ashleymills 0:714293de3836 1993
ashleymills 0:714293de3836 1994 #ifndef NO_TLS
ashleymills 0:714293de3836 1995
ashleymills 0:714293de3836 1996
ashleymills 0:714293de3836 1997 #endif /* NO_TLS */
ashleymills 0:714293de3836 1998
ashleymills 0:714293de3836 1999
ashleymills 0:714293de3836 2000 CYASSL_LOCAL word32 LowResTimer(void);
ashleymills 0:714293de3836 2001
ashleymills 0:714293de3836 2002 CYASSL_LOCAL void InitX509(CYASSL_X509*, int);
ashleymills 0:714293de3836 2003 CYASSL_LOCAL void FreeX509(CYASSL_X509*);
ashleymills 0:714293de3836 2004 #ifndef NO_CERTS
ashleymills 0:714293de3836 2005 CYASSL_LOCAL int CopyDecodedToX509(CYASSL_X509*, DecodedCert*);
ashleymills 0:714293de3836 2006 #endif
ashleymills 0:714293de3836 2007
ashleymills 0:714293de3836 2008
ashleymills 0:714293de3836 2009 #ifdef __cplusplus
ashleymills 0:714293de3836 2010 } /* extern "C" */
ashleymills 0:714293de3836 2011 #endif
ashleymills 0:714293de3836 2012
ashleymills 0:714293de3836 2013 #endif /* CyaSSL_INT_H */
ashleymills 0:714293de3836 2014