CyaSSL changed for NucleoF401RE board: implemented random and time functions for build. (Has trouble with wildcard domains like *.google.com, *.yahoo.com)

Fork of CyaSSL by wolf SSL

Committer:
Vanger
Date:
Wed Jan 14 22:07:14 2015 +0000
Revision:
4:e505054279ed
Parent:
0:1239e9b70ca2
Implemented some platform specific functions in the Cyassl library code: time functions, seed random functions, and also changed the settings.h file to define settings specific to the platform being used

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 0:1239e9b70ca2 1 /* tls.c
wolfSSL 0:1239e9b70ca2 2 *
wolfSSL 0:1239e9b70ca2 3 * Copyright (C) 2006-2014 wolfSSL Inc.
wolfSSL 0:1239e9b70ca2 4 *
wolfSSL 0:1239e9b70ca2 5 * This file is part of CyaSSL.
wolfSSL 0:1239e9b70ca2 6 *
wolfSSL 0:1239e9b70ca2 7 * CyaSSL is free software; you can redistribute it and/or modify
wolfSSL 0:1239e9b70ca2 8 * it under the terms of the GNU General Public License as published by
wolfSSL 0:1239e9b70ca2 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 0:1239e9b70ca2 10 * (at your option) any later version.
wolfSSL 0:1239e9b70ca2 11 *
wolfSSL 0:1239e9b70ca2 12 * CyaSSL is distributed in the hope that it will be useful,
wolfSSL 0:1239e9b70ca2 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 0:1239e9b70ca2 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 0:1239e9b70ca2 15 * GNU General Public License for more details.
wolfSSL 0:1239e9b70ca2 16 *
wolfSSL 0:1239e9b70ca2 17 * You should have received a copy of the GNU General Public License
wolfSSL 0:1239e9b70ca2 18 * along with this program; if not, write to the Free Software
wolfSSL 0:1239e9b70ca2 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
wolfSSL 0:1239e9b70ca2 20 */
wolfSSL 0:1239e9b70ca2 21
wolfSSL 0:1239e9b70ca2 22 #ifdef HAVE_CONFIG_H
wolfSSL 0:1239e9b70ca2 23 #include <config.h>
wolfSSL 0:1239e9b70ca2 24 #endif
wolfSSL 0:1239e9b70ca2 25
wolfSSL 0:1239e9b70ca2 26 #include <cyassl/ctaocrypt/settings.h>
wolfSSL 0:1239e9b70ca2 27
wolfSSL 0:1239e9b70ca2 28 #include <cyassl/ssl.h>
wolfSSL 0:1239e9b70ca2 29 #include <cyassl/internal.h>
wolfSSL 0:1239e9b70ca2 30 #include <cyassl/error-ssl.h>
wolfSSL 0:1239e9b70ca2 31 #include <cyassl/ctaocrypt/hmac.h>
wolfSSL 0:1239e9b70ca2 32
wolfSSL 0:1239e9b70ca2 33
wolfSSL 0:1239e9b70ca2 34
wolfSSL 0:1239e9b70ca2 35 #ifndef NO_TLS
wolfSSL 0:1239e9b70ca2 36
wolfSSL 0:1239e9b70ca2 37
wolfSSL 0:1239e9b70ca2 38 #ifndef min
wolfSSL 0:1239e9b70ca2 39
wolfSSL 0:1239e9b70ca2 40 static INLINE word32 min(word32 a, word32 b)
wolfSSL 0:1239e9b70ca2 41 {
wolfSSL 0:1239e9b70ca2 42 return a > b ? b : a;
wolfSSL 0:1239e9b70ca2 43 }
wolfSSL 0:1239e9b70ca2 44
wolfSSL 0:1239e9b70ca2 45 #endif /* min */
wolfSSL 0:1239e9b70ca2 46
wolfSSL 0:1239e9b70ca2 47
wolfSSL 0:1239e9b70ca2 48 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 49 #define PHASH_MAX_DIGEST_SIZE SHA384_DIGEST_SIZE
wolfSSL 0:1239e9b70ca2 50 #else
wolfSSL 0:1239e9b70ca2 51 #define PHASH_MAX_DIGEST_SIZE SHA256_DIGEST_SIZE
wolfSSL 0:1239e9b70ca2 52 #endif
wolfSSL 0:1239e9b70ca2 53
wolfSSL 0:1239e9b70ca2 54 /* compute p_hash for MD5, SHA-1, SHA-256, or SHA-384 for TLSv1 PRF */
wolfSSL 0:1239e9b70ca2 55 static int p_hash(byte* result, word32 resLen, const byte* secret,
wolfSSL 0:1239e9b70ca2 56 word32 secLen, const byte* seed, word32 seedLen, int hash)
wolfSSL 0:1239e9b70ca2 57 {
wolfSSL 0:1239e9b70ca2 58 word32 len = PHASH_MAX_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 59 word32 times;
wolfSSL 0:1239e9b70ca2 60 word32 lastLen;
wolfSSL 0:1239e9b70ca2 61 word32 lastTime;
wolfSSL 0:1239e9b70ca2 62 word32 i;
wolfSSL 0:1239e9b70ca2 63 word32 idx = 0;
wolfSSL 0:1239e9b70ca2 64 int ret;
wolfSSL 0:1239e9b70ca2 65 byte previous[PHASH_MAX_DIGEST_SIZE]; /* max size */
wolfSSL 0:1239e9b70ca2 66 byte current[PHASH_MAX_DIGEST_SIZE]; /* max size */
wolfSSL 0:1239e9b70ca2 67
wolfSSL 0:1239e9b70ca2 68 Hmac hmac;
wolfSSL 0:1239e9b70ca2 69
wolfSSL 0:1239e9b70ca2 70 switch (hash) {
wolfSSL 0:1239e9b70ca2 71 #ifndef NO_MD5
wolfSSL 0:1239e9b70ca2 72 case md5_mac:
wolfSSL 0:1239e9b70ca2 73 {
wolfSSL 0:1239e9b70ca2 74 len = MD5_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 75 hash = MD5;
wolfSSL 0:1239e9b70ca2 76 }
wolfSSL 0:1239e9b70ca2 77 break;
wolfSSL 0:1239e9b70ca2 78 #endif
wolfSSL 0:1239e9b70ca2 79 #ifndef NO_SHA256
wolfSSL 0:1239e9b70ca2 80 case sha256_mac:
wolfSSL 0:1239e9b70ca2 81 {
wolfSSL 0:1239e9b70ca2 82 len = SHA256_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 83 hash = SHA256;
wolfSSL 0:1239e9b70ca2 84 }
wolfSSL 0:1239e9b70ca2 85 break;
wolfSSL 0:1239e9b70ca2 86 #endif
wolfSSL 0:1239e9b70ca2 87 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 88 case sha384_mac:
wolfSSL 0:1239e9b70ca2 89 {
wolfSSL 0:1239e9b70ca2 90 len = SHA384_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 91 hash = SHA384;
wolfSSL 0:1239e9b70ca2 92 }
wolfSSL 0:1239e9b70ca2 93 break;
wolfSSL 0:1239e9b70ca2 94 #endif
wolfSSL 0:1239e9b70ca2 95 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 96 case sha_mac:
wolfSSL 0:1239e9b70ca2 97 default:
wolfSSL 0:1239e9b70ca2 98 {
wolfSSL 0:1239e9b70ca2 99 len = SHA_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 100 hash = SHA;
wolfSSL 0:1239e9b70ca2 101 }
wolfSSL 0:1239e9b70ca2 102 break;
wolfSSL 0:1239e9b70ca2 103 #endif
wolfSSL 0:1239e9b70ca2 104 }
wolfSSL 0:1239e9b70ca2 105
wolfSSL 0:1239e9b70ca2 106 times = resLen / len;
wolfSSL 0:1239e9b70ca2 107 lastLen = resLen % len;
wolfSSL 0:1239e9b70ca2 108 if (lastLen) times += 1;
wolfSSL 0:1239e9b70ca2 109 lastTime = times - 1;
wolfSSL 0:1239e9b70ca2 110
wolfSSL 0:1239e9b70ca2 111 ret = HmacSetKey(&hmac, hash, secret, secLen);
wolfSSL 0:1239e9b70ca2 112 if (ret != 0)
wolfSSL 0:1239e9b70ca2 113 return ret;
wolfSSL 0:1239e9b70ca2 114 ret = HmacUpdate(&hmac, seed, seedLen); /* A0 = seed */
wolfSSL 0:1239e9b70ca2 115 if (ret != 0)
wolfSSL 0:1239e9b70ca2 116 return ret;
wolfSSL 0:1239e9b70ca2 117 ret = HmacFinal(&hmac, previous); /* A1 */
wolfSSL 0:1239e9b70ca2 118 if (ret != 0)
wolfSSL 0:1239e9b70ca2 119 return ret;
wolfSSL 0:1239e9b70ca2 120
wolfSSL 0:1239e9b70ca2 121 for (i = 0; i < times; i++) {
wolfSSL 0:1239e9b70ca2 122 ret = HmacUpdate(&hmac, previous, len);
wolfSSL 0:1239e9b70ca2 123 if (ret != 0)
wolfSSL 0:1239e9b70ca2 124 return ret;
wolfSSL 0:1239e9b70ca2 125 ret = HmacUpdate(&hmac, seed, seedLen);
wolfSSL 0:1239e9b70ca2 126 if (ret != 0)
wolfSSL 0:1239e9b70ca2 127 return ret;
wolfSSL 0:1239e9b70ca2 128 ret = HmacFinal(&hmac, current);
wolfSSL 0:1239e9b70ca2 129 if (ret != 0)
wolfSSL 0:1239e9b70ca2 130 return ret;
wolfSSL 0:1239e9b70ca2 131
wolfSSL 0:1239e9b70ca2 132 if ( (i == lastTime) && lastLen)
wolfSSL 0:1239e9b70ca2 133 XMEMCPY(&result[idx], current, min(lastLen, sizeof(current)));
wolfSSL 0:1239e9b70ca2 134 else {
wolfSSL 0:1239e9b70ca2 135 XMEMCPY(&result[idx], current, len);
wolfSSL 0:1239e9b70ca2 136 idx += len;
wolfSSL 0:1239e9b70ca2 137 ret = HmacUpdate(&hmac, previous, len);
wolfSSL 0:1239e9b70ca2 138 if (ret != 0)
wolfSSL 0:1239e9b70ca2 139 return ret;
wolfSSL 0:1239e9b70ca2 140 ret = HmacFinal(&hmac, previous);
wolfSSL 0:1239e9b70ca2 141 if (ret != 0)
wolfSSL 0:1239e9b70ca2 142 return ret;
wolfSSL 0:1239e9b70ca2 143 }
wolfSSL 0:1239e9b70ca2 144 }
wolfSSL 0:1239e9b70ca2 145 XMEMSET(previous, 0, sizeof previous);
wolfSSL 0:1239e9b70ca2 146 XMEMSET(current, 0, sizeof current);
wolfSSL 0:1239e9b70ca2 147 XMEMSET(&hmac, 0, sizeof hmac);
wolfSSL 0:1239e9b70ca2 148
wolfSSL 0:1239e9b70ca2 149 return 0;
wolfSSL 0:1239e9b70ca2 150 }
wolfSSL 0:1239e9b70ca2 151
wolfSSL 0:1239e9b70ca2 152
wolfSSL 0:1239e9b70ca2 153
wolfSSL 0:1239e9b70ca2 154 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 155
wolfSSL 0:1239e9b70ca2 156 /* calculate XOR for TLSv1 PRF */
wolfSSL 0:1239e9b70ca2 157 static INLINE void get_xor(byte *digest, word32 digLen, byte* md5, byte* sha)
wolfSSL 0:1239e9b70ca2 158 {
wolfSSL 0:1239e9b70ca2 159 word32 i;
wolfSSL 0:1239e9b70ca2 160
wolfSSL 0:1239e9b70ca2 161 for (i = 0; i < digLen; i++)
wolfSSL 0:1239e9b70ca2 162 digest[i] = md5[i] ^ sha[i];
wolfSSL 0:1239e9b70ca2 163 }
wolfSSL 0:1239e9b70ca2 164
wolfSSL 0:1239e9b70ca2 165
wolfSSL 0:1239e9b70ca2 166 /* compute TLSv1 PRF (pseudo random function using HMAC) */
wolfSSL 0:1239e9b70ca2 167 static int doPRF(byte* digest, word32 digLen, const byte* secret,word32 secLen,
wolfSSL 0:1239e9b70ca2 168 const byte* label, word32 labLen, const byte* seed,
wolfSSL 0:1239e9b70ca2 169 word32 seedLen)
wolfSSL 0:1239e9b70ca2 170 {
wolfSSL 0:1239e9b70ca2 171 int ret;
wolfSSL 0:1239e9b70ca2 172 word32 half = (secLen + 1) / 2;
wolfSSL 0:1239e9b70ca2 173
wolfSSL 0:1239e9b70ca2 174 byte md5_half[MAX_PRF_HALF]; /* half is real size */
wolfSSL 0:1239e9b70ca2 175 byte sha_half[MAX_PRF_HALF]; /* half is real size */
wolfSSL 0:1239e9b70ca2 176 byte labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
wolfSSL 0:1239e9b70ca2 177 byte md5_result[MAX_PRF_DIG]; /* digLen is real size */
wolfSSL 0:1239e9b70ca2 178 byte sha_result[MAX_PRF_DIG]; /* digLen is real size */
wolfSSL 0:1239e9b70ca2 179
wolfSSL 0:1239e9b70ca2 180 if (half > MAX_PRF_HALF)
wolfSSL 0:1239e9b70ca2 181 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 182 if (labLen + seedLen > MAX_PRF_LABSEED)
wolfSSL 0:1239e9b70ca2 183 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 184 if (digLen > MAX_PRF_DIG)
wolfSSL 0:1239e9b70ca2 185 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 186
wolfSSL 0:1239e9b70ca2 187 XMEMSET(md5_result, 0, digLen);
wolfSSL 0:1239e9b70ca2 188 XMEMSET(sha_result, 0, digLen);
wolfSSL 0:1239e9b70ca2 189
wolfSSL 0:1239e9b70ca2 190 XMEMCPY(md5_half, secret, half);
wolfSSL 0:1239e9b70ca2 191 XMEMCPY(sha_half, secret + half - secLen % 2, half);
wolfSSL 0:1239e9b70ca2 192
wolfSSL 0:1239e9b70ca2 193 XMEMCPY(labelSeed, label, labLen);
wolfSSL 0:1239e9b70ca2 194 XMEMCPY(labelSeed + labLen, seed, seedLen);
wolfSSL 0:1239e9b70ca2 195
wolfSSL 0:1239e9b70ca2 196 ret = p_hash(md5_result, digLen, md5_half, half, labelSeed,
wolfSSL 0:1239e9b70ca2 197 labLen + seedLen, md5_mac);
wolfSSL 0:1239e9b70ca2 198 if (ret != 0)
wolfSSL 0:1239e9b70ca2 199 return ret;
wolfSSL 0:1239e9b70ca2 200 ret = p_hash(sha_result, digLen, sha_half, half, labelSeed,
wolfSSL 0:1239e9b70ca2 201 labLen + seedLen, sha_mac);
wolfSSL 0:1239e9b70ca2 202 if (ret != 0)
wolfSSL 0:1239e9b70ca2 203 return ret;
wolfSSL 0:1239e9b70ca2 204 get_xor(digest, digLen, md5_result, sha_result);
wolfSSL 0:1239e9b70ca2 205
wolfSSL 0:1239e9b70ca2 206 return 0;
wolfSSL 0:1239e9b70ca2 207 }
wolfSSL 0:1239e9b70ca2 208
wolfSSL 0:1239e9b70ca2 209 #endif
wolfSSL 0:1239e9b70ca2 210
wolfSSL 0:1239e9b70ca2 211
wolfSSL 0:1239e9b70ca2 212 /* Wrapper to call straight thru to p_hash in TSL 1.2 cases to remove stack
wolfSSL 0:1239e9b70ca2 213 use */
wolfSSL 0:1239e9b70ca2 214 static int PRF(byte* digest, word32 digLen, const byte* secret, word32 secLen,
wolfSSL 0:1239e9b70ca2 215 const byte* label, word32 labLen, const byte* seed, word32 seedLen,
wolfSSL 0:1239e9b70ca2 216 int useAtLeastSha256, int hash_type)
wolfSSL 0:1239e9b70ca2 217 {
wolfSSL 0:1239e9b70ca2 218 int ret = 0;
wolfSSL 0:1239e9b70ca2 219
wolfSSL 0:1239e9b70ca2 220 if (useAtLeastSha256) {
wolfSSL 0:1239e9b70ca2 221 byte labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
wolfSSL 0:1239e9b70ca2 222
wolfSSL 0:1239e9b70ca2 223 if (labLen + seedLen > MAX_PRF_LABSEED)
wolfSSL 0:1239e9b70ca2 224 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 225
wolfSSL 0:1239e9b70ca2 226 XMEMCPY(labelSeed, label, labLen);
wolfSSL 0:1239e9b70ca2 227 XMEMCPY(labelSeed + labLen, seed, seedLen);
wolfSSL 0:1239e9b70ca2 228
wolfSSL 0:1239e9b70ca2 229 /* If a cipher suite wants an algorithm better than sha256, it
wolfSSL 0:1239e9b70ca2 230 * should use better. */
wolfSSL 0:1239e9b70ca2 231 if (hash_type < sha256_mac)
wolfSSL 0:1239e9b70ca2 232 hash_type = sha256_mac;
wolfSSL 0:1239e9b70ca2 233 ret = p_hash(digest, digLen, secret, secLen, labelSeed,
wolfSSL 0:1239e9b70ca2 234 labLen + seedLen, hash_type);
wolfSSL 0:1239e9b70ca2 235 }
wolfSSL 0:1239e9b70ca2 236 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 237 else {
wolfSSL 0:1239e9b70ca2 238 ret = doPRF(digest, digLen, secret, secLen, label, labLen, seed,
wolfSSL 0:1239e9b70ca2 239 seedLen);
wolfSSL 0:1239e9b70ca2 240 }
wolfSSL 0:1239e9b70ca2 241 #endif
wolfSSL 0:1239e9b70ca2 242
wolfSSL 0:1239e9b70ca2 243 return ret;
wolfSSL 0:1239e9b70ca2 244 }
wolfSSL 0:1239e9b70ca2 245
wolfSSL 0:1239e9b70ca2 246
wolfSSL 0:1239e9b70ca2 247 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 248 #define HSHASH_SZ SHA384_DIGEST_SIZE
wolfSSL 0:1239e9b70ca2 249 #else
wolfSSL 0:1239e9b70ca2 250 #define HSHASH_SZ FINISHED_SZ
wolfSSL 0:1239e9b70ca2 251 #endif
wolfSSL 0:1239e9b70ca2 252
wolfSSL 0:1239e9b70ca2 253
wolfSSL 0:1239e9b70ca2 254 int BuildTlsFinished(CYASSL* ssl, Hashes* hashes, const byte* sender)
wolfSSL 0:1239e9b70ca2 255 {
wolfSSL 0:1239e9b70ca2 256 const byte* side;
wolfSSL 0:1239e9b70ca2 257 byte handshake_hash[HSHASH_SZ];
wolfSSL 0:1239e9b70ca2 258 word32 hashSz = FINISHED_SZ;
wolfSSL 0:1239e9b70ca2 259
wolfSSL 0:1239e9b70ca2 260 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 261 Md5Final(&ssl->hashMd5, handshake_hash);
wolfSSL 0:1239e9b70ca2 262 ShaFinal(&ssl->hashSha, &handshake_hash[MD5_DIGEST_SIZE]);
wolfSSL 0:1239e9b70ca2 263 #endif
wolfSSL 0:1239e9b70ca2 264
wolfSSL 0:1239e9b70ca2 265 if (IsAtLeastTLSv1_2(ssl)) {
wolfSSL 0:1239e9b70ca2 266 #ifndef NO_SHA256
wolfSSL 0:1239e9b70ca2 267 if (ssl->specs.mac_algorithm <= sha256_mac) {
wolfSSL 0:1239e9b70ca2 268 int ret = Sha256Final(&ssl->hashSha256, handshake_hash);
wolfSSL 0:1239e9b70ca2 269
wolfSSL 0:1239e9b70ca2 270 if (ret != 0)
wolfSSL 0:1239e9b70ca2 271 return ret;
wolfSSL 0:1239e9b70ca2 272
wolfSSL 0:1239e9b70ca2 273 hashSz = SHA256_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 274 }
wolfSSL 0:1239e9b70ca2 275 #endif
wolfSSL 0:1239e9b70ca2 276 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 277 if (ssl->specs.mac_algorithm == sha384_mac) {
wolfSSL 0:1239e9b70ca2 278 int ret = Sha384Final(&ssl->hashSha384, handshake_hash);
wolfSSL 0:1239e9b70ca2 279
wolfSSL 0:1239e9b70ca2 280 if (ret != 0)
wolfSSL 0:1239e9b70ca2 281 return ret;
wolfSSL 0:1239e9b70ca2 282
wolfSSL 0:1239e9b70ca2 283 hashSz = SHA384_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 284 }
wolfSSL 0:1239e9b70ca2 285 #endif
wolfSSL 0:1239e9b70ca2 286 }
wolfSSL 0:1239e9b70ca2 287
wolfSSL 0:1239e9b70ca2 288 if ( XSTRNCMP((const char*)sender, (const char*)client, SIZEOF_SENDER) == 0)
wolfSSL 0:1239e9b70ca2 289 side = tls_client;
wolfSSL 0:1239e9b70ca2 290 else
wolfSSL 0:1239e9b70ca2 291 side = tls_server;
wolfSSL 0:1239e9b70ca2 292
wolfSSL 0:1239e9b70ca2 293 return PRF((byte*)hashes, TLS_FINISHED_SZ, ssl->arrays->masterSecret,
wolfSSL 0:1239e9b70ca2 294 SECRET_LEN, side, FINISHED_LABEL_SZ, handshake_hash, hashSz,
wolfSSL 0:1239e9b70ca2 295 IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
wolfSSL 0:1239e9b70ca2 296 }
wolfSSL 0:1239e9b70ca2 297
wolfSSL 0:1239e9b70ca2 298
wolfSSL 0:1239e9b70ca2 299 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 300
wolfSSL 0:1239e9b70ca2 301 ProtocolVersion MakeTLSv1(void)
wolfSSL 0:1239e9b70ca2 302 {
wolfSSL 0:1239e9b70ca2 303 ProtocolVersion pv;
wolfSSL 0:1239e9b70ca2 304 pv.major = SSLv3_MAJOR;
wolfSSL 0:1239e9b70ca2 305 pv.minor = TLSv1_MINOR;
wolfSSL 0:1239e9b70ca2 306
wolfSSL 0:1239e9b70ca2 307 return pv;
wolfSSL 0:1239e9b70ca2 308 }
wolfSSL 0:1239e9b70ca2 309
wolfSSL 0:1239e9b70ca2 310
wolfSSL 0:1239e9b70ca2 311 ProtocolVersion MakeTLSv1_1(void)
wolfSSL 0:1239e9b70ca2 312 {
wolfSSL 0:1239e9b70ca2 313 ProtocolVersion pv;
wolfSSL 0:1239e9b70ca2 314 pv.major = SSLv3_MAJOR;
wolfSSL 0:1239e9b70ca2 315 pv.minor = TLSv1_1_MINOR;
wolfSSL 0:1239e9b70ca2 316
wolfSSL 0:1239e9b70ca2 317 return pv;
wolfSSL 0:1239e9b70ca2 318 }
wolfSSL 0:1239e9b70ca2 319
wolfSSL 0:1239e9b70ca2 320 #endif
wolfSSL 0:1239e9b70ca2 321
wolfSSL 0:1239e9b70ca2 322
wolfSSL 0:1239e9b70ca2 323 ProtocolVersion MakeTLSv1_2(void)
wolfSSL 0:1239e9b70ca2 324 {
wolfSSL 0:1239e9b70ca2 325 ProtocolVersion pv;
wolfSSL 0:1239e9b70ca2 326 pv.major = SSLv3_MAJOR;
wolfSSL 0:1239e9b70ca2 327 pv.minor = TLSv1_2_MINOR;
wolfSSL 0:1239e9b70ca2 328
wolfSSL 0:1239e9b70ca2 329 return pv;
wolfSSL 0:1239e9b70ca2 330 }
wolfSSL 0:1239e9b70ca2 331
wolfSSL 0:1239e9b70ca2 332
wolfSSL 0:1239e9b70ca2 333 static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
wolfSSL 0:1239e9b70ca2 334 static const byte key_label [KEY_LABEL_SZ + 1] = "key expansion";
wolfSSL 0:1239e9b70ca2 335
wolfSSL 0:1239e9b70ca2 336
wolfSSL 0:1239e9b70ca2 337 int DeriveTlsKeys(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 338 {
wolfSSL 0:1239e9b70ca2 339 int ret;
wolfSSL 0:1239e9b70ca2 340 int length = 2 * ssl->specs.hash_size +
wolfSSL 0:1239e9b70ca2 341 2 * ssl->specs.key_size +
wolfSSL 0:1239e9b70ca2 342 2 * ssl->specs.iv_size;
wolfSSL 0:1239e9b70ca2 343 byte seed[SEED_LEN];
wolfSSL 0:1239e9b70ca2 344 byte key_data[MAX_PRF_DIG];
wolfSSL 0:1239e9b70ca2 345
wolfSSL 0:1239e9b70ca2 346 XMEMCPY(seed, ssl->arrays->serverRandom, RAN_LEN);
wolfSSL 0:1239e9b70ca2 347 XMEMCPY(&seed[RAN_LEN], ssl->arrays->clientRandom, RAN_LEN);
wolfSSL 0:1239e9b70ca2 348
wolfSSL 0:1239e9b70ca2 349 ret = PRF(key_data, length, ssl->arrays->masterSecret, SECRET_LEN,
wolfSSL 0:1239e9b70ca2 350 key_label, KEY_LABEL_SZ, seed, SEED_LEN, IsAtLeastTLSv1_2(ssl),
wolfSSL 0:1239e9b70ca2 351 ssl->specs.mac_algorithm);
wolfSSL 0:1239e9b70ca2 352 if (ret != 0)
wolfSSL 0:1239e9b70ca2 353 return ret;
wolfSSL 0:1239e9b70ca2 354
wolfSSL 0:1239e9b70ca2 355 return StoreKeys(ssl, key_data);
wolfSSL 0:1239e9b70ca2 356 }
wolfSSL 0:1239e9b70ca2 357
wolfSSL 0:1239e9b70ca2 358
wolfSSL 0:1239e9b70ca2 359 int MakeTlsMasterSecret(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 360 {
wolfSSL 0:1239e9b70ca2 361 int ret;
wolfSSL 0:1239e9b70ca2 362 byte seed[SEED_LEN];
wolfSSL 0:1239e9b70ca2 363
wolfSSL 0:1239e9b70ca2 364 XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
wolfSSL 0:1239e9b70ca2 365 XMEMCPY(&seed[RAN_LEN], ssl->arrays->serverRandom, RAN_LEN);
wolfSSL 0:1239e9b70ca2 366
wolfSSL 0:1239e9b70ca2 367 ret = PRF(ssl->arrays->masterSecret, SECRET_LEN,
wolfSSL 0:1239e9b70ca2 368 ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
wolfSSL 0:1239e9b70ca2 369 master_label, MASTER_LABEL_SZ,
wolfSSL 0:1239e9b70ca2 370 seed, SEED_LEN, IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
wolfSSL 0:1239e9b70ca2 371 if (ret != 0)
wolfSSL 0:1239e9b70ca2 372 return ret;
wolfSSL 0:1239e9b70ca2 373
wolfSSL 0:1239e9b70ca2 374 #ifdef SHOW_SECRETS
wolfSSL 0:1239e9b70ca2 375 {
wolfSSL 0:1239e9b70ca2 376 int i;
wolfSSL 0:1239e9b70ca2 377 printf("master secret: ");
wolfSSL 0:1239e9b70ca2 378 for (i = 0; i < SECRET_LEN; i++)
wolfSSL 0:1239e9b70ca2 379 printf("%02x", ssl->arrays->masterSecret[i]);
wolfSSL 0:1239e9b70ca2 380 printf("\n");
wolfSSL 0:1239e9b70ca2 381 }
wolfSSL 0:1239e9b70ca2 382 #endif
wolfSSL 0:1239e9b70ca2 383
wolfSSL 0:1239e9b70ca2 384 return DeriveTlsKeys(ssl);
wolfSSL 0:1239e9b70ca2 385 }
wolfSSL 0:1239e9b70ca2 386
wolfSSL 0:1239e9b70ca2 387
wolfSSL 0:1239e9b70ca2 388 /* Used by EAP-TLS and EAP-TTLS to derive keying material from
wolfSSL 0:1239e9b70ca2 389 * the master_secret. */
wolfSSL 0:1239e9b70ca2 390 int CyaSSL_make_eap_keys(CYASSL* ssl, void* msk, unsigned int len,
wolfSSL 0:1239e9b70ca2 391 const char* label)
wolfSSL 0:1239e9b70ca2 392 {
wolfSSL 0:1239e9b70ca2 393 byte seed[SEED_LEN];
wolfSSL 0:1239e9b70ca2 394
wolfSSL 0:1239e9b70ca2 395 /*
wolfSSL 0:1239e9b70ca2 396 * As per RFC-5281, the order of the client and server randoms is reversed
wolfSSL 0:1239e9b70ca2 397 * from that used by the TLS protocol to derive keys.
wolfSSL 0:1239e9b70ca2 398 */
wolfSSL 0:1239e9b70ca2 399 XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
wolfSSL 0:1239e9b70ca2 400 XMEMCPY(&seed[RAN_LEN], ssl->arrays->serverRandom, RAN_LEN);
wolfSSL 0:1239e9b70ca2 401
wolfSSL 0:1239e9b70ca2 402 return PRF((byte*)msk, len,
wolfSSL 0:1239e9b70ca2 403 ssl->arrays->masterSecret, SECRET_LEN,
wolfSSL 0:1239e9b70ca2 404 (const byte *)label, (word32)strlen(label),
wolfSSL 0:1239e9b70ca2 405 seed, SEED_LEN, IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
wolfSSL 0:1239e9b70ca2 406
wolfSSL 0:1239e9b70ca2 407 }
wolfSSL 0:1239e9b70ca2 408
wolfSSL 0:1239e9b70ca2 409
wolfSSL 0:1239e9b70ca2 410 /*** next for static INLINE s copied internal.c ***/
wolfSSL 0:1239e9b70ca2 411
wolfSSL 0:1239e9b70ca2 412 /* convert 16 bit integer to opaque */
wolfSSL 0:1239e9b70ca2 413 static INLINE void c16toa(word16 u16, byte* c)
wolfSSL 0:1239e9b70ca2 414 {
wolfSSL 0:1239e9b70ca2 415 c[0] = (u16 >> 8) & 0xff;
wolfSSL 0:1239e9b70ca2 416 c[1] = u16 & 0xff;
wolfSSL 0:1239e9b70ca2 417 }
wolfSSL 0:1239e9b70ca2 418
wolfSSL 0:1239e9b70ca2 419 #ifdef HAVE_TLS_EXTENSIONS
wolfSSL 0:1239e9b70ca2 420 /* convert opaque to 16 bit integer */
wolfSSL 0:1239e9b70ca2 421 static INLINE void ato16(const byte* c, word16* u16)
wolfSSL 0:1239e9b70ca2 422 {
wolfSSL 0:1239e9b70ca2 423 *u16 = (c[0] << 8) | (c[1]);
wolfSSL 0:1239e9b70ca2 424 }
wolfSSL 0:1239e9b70ca2 425
wolfSSL 0:1239e9b70ca2 426 #ifdef HAVE_SNI
wolfSSL 0:1239e9b70ca2 427 /* convert a 24 bit integer into a 32 bit one */
wolfSSL 0:1239e9b70ca2 428 static INLINE void c24to32(const word24 u24, word32* u32)
wolfSSL 0:1239e9b70ca2 429 {
wolfSSL 0:1239e9b70ca2 430 *u32 = (u24[0] << 16) | (u24[1] << 8) | u24[2];
wolfSSL 0:1239e9b70ca2 431 }
wolfSSL 0:1239e9b70ca2 432 #endif
wolfSSL 0:1239e9b70ca2 433 #endif
wolfSSL 0:1239e9b70ca2 434
wolfSSL 0:1239e9b70ca2 435 /* convert 32 bit integer to opaque */
wolfSSL 0:1239e9b70ca2 436 static INLINE void c32toa(word32 u32, byte* c)
wolfSSL 0:1239e9b70ca2 437 {
wolfSSL 0:1239e9b70ca2 438 c[0] = (u32 >> 24) & 0xff;
wolfSSL 0:1239e9b70ca2 439 c[1] = (u32 >> 16) & 0xff;
wolfSSL 0:1239e9b70ca2 440 c[2] = (u32 >> 8) & 0xff;
wolfSSL 0:1239e9b70ca2 441 c[3] = u32 & 0xff;
wolfSSL 0:1239e9b70ca2 442 }
wolfSSL 0:1239e9b70ca2 443
wolfSSL 0:1239e9b70ca2 444
wolfSSL 0:1239e9b70ca2 445 static INLINE word32 GetSEQIncrement(CYASSL* ssl, int verify)
wolfSSL 0:1239e9b70ca2 446 {
wolfSSL 0:1239e9b70ca2 447 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 448 if (ssl->options.dtls) {
wolfSSL 0:1239e9b70ca2 449 if (verify)
wolfSSL 0:1239e9b70ca2 450 return ssl->keys.dtls_state.curSeq; /* explicit from peer */
wolfSSL 0:1239e9b70ca2 451 else
wolfSSL 0:1239e9b70ca2 452 return ssl->keys.dtls_sequence_number - 1; /* already incremented */
wolfSSL 0:1239e9b70ca2 453 }
wolfSSL 0:1239e9b70ca2 454 #endif
wolfSSL 0:1239e9b70ca2 455 if (verify)
wolfSSL 0:1239e9b70ca2 456 return ssl->keys.peer_sequence_number++;
wolfSSL 0:1239e9b70ca2 457 else
wolfSSL 0:1239e9b70ca2 458 return ssl->keys.sequence_number++;
wolfSSL 0:1239e9b70ca2 459 }
wolfSSL 0:1239e9b70ca2 460
wolfSSL 0:1239e9b70ca2 461
wolfSSL 0:1239e9b70ca2 462 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 463
wolfSSL 0:1239e9b70ca2 464 static INLINE word32 GetEpoch(CYASSL* ssl, int verify)
wolfSSL 0:1239e9b70ca2 465 {
wolfSSL 0:1239e9b70ca2 466 if (verify)
wolfSSL 0:1239e9b70ca2 467 return ssl->keys.dtls_state.curEpoch;
wolfSSL 0:1239e9b70ca2 468 else
wolfSSL 0:1239e9b70ca2 469 return ssl->keys.dtls_epoch;
wolfSSL 0:1239e9b70ca2 470 }
wolfSSL 0:1239e9b70ca2 471
wolfSSL 0:1239e9b70ca2 472 #endif /* CYASSL_DTLS */
wolfSSL 0:1239e9b70ca2 473
wolfSSL 0:1239e9b70ca2 474
wolfSSL 0:1239e9b70ca2 475 /*** end copy ***/
wolfSSL 0:1239e9b70ca2 476
wolfSSL 0:1239e9b70ca2 477
wolfSSL 0:1239e9b70ca2 478 /* return HMAC digest type in CyaSSL format */
wolfSSL 0:1239e9b70ca2 479 int CyaSSL_GetHmacType(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 480 {
wolfSSL 0:1239e9b70ca2 481 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 482 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 483
wolfSSL 0:1239e9b70ca2 484 switch (ssl->specs.mac_algorithm) {
wolfSSL 0:1239e9b70ca2 485 #ifndef NO_MD5
wolfSSL 0:1239e9b70ca2 486 case md5_mac:
wolfSSL 0:1239e9b70ca2 487 {
wolfSSL 0:1239e9b70ca2 488 return MD5;
wolfSSL 0:1239e9b70ca2 489 }
wolfSSL 0:1239e9b70ca2 490 #endif
wolfSSL 0:1239e9b70ca2 491 #ifndef NO_SHA256
wolfSSL 0:1239e9b70ca2 492 case sha256_mac:
wolfSSL 0:1239e9b70ca2 493 {
wolfSSL 0:1239e9b70ca2 494 return SHA256;
wolfSSL 0:1239e9b70ca2 495 }
wolfSSL 0:1239e9b70ca2 496 #endif
wolfSSL 0:1239e9b70ca2 497 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 498 case sha384_mac:
wolfSSL 0:1239e9b70ca2 499 {
wolfSSL 0:1239e9b70ca2 500 return SHA384;
wolfSSL 0:1239e9b70ca2 501 }
wolfSSL 0:1239e9b70ca2 502
wolfSSL 0:1239e9b70ca2 503 #endif
wolfSSL 0:1239e9b70ca2 504 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 505 case sha_mac:
wolfSSL 0:1239e9b70ca2 506 {
wolfSSL 0:1239e9b70ca2 507 return SHA;
wolfSSL 0:1239e9b70ca2 508 }
wolfSSL 0:1239e9b70ca2 509 #endif
wolfSSL 0:1239e9b70ca2 510 #ifdef HAVE_BLAKE2
wolfSSL 0:1239e9b70ca2 511 case blake2b_mac:
wolfSSL 0:1239e9b70ca2 512 {
wolfSSL 0:1239e9b70ca2 513 return BLAKE2B_ID;
wolfSSL 0:1239e9b70ca2 514 }
wolfSSL 0:1239e9b70ca2 515 #endif
wolfSSL 0:1239e9b70ca2 516 default:
wolfSSL 0:1239e9b70ca2 517 {
wolfSSL 0:1239e9b70ca2 518 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 519 }
wolfSSL 0:1239e9b70ca2 520 }
wolfSSL 0:1239e9b70ca2 521 }
wolfSSL 0:1239e9b70ca2 522
wolfSSL 0:1239e9b70ca2 523
wolfSSL 0:1239e9b70ca2 524 int CyaSSL_SetTlsHmacInner(CYASSL* ssl, byte* inner, word32 sz, int content,
wolfSSL 0:1239e9b70ca2 525 int verify)
wolfSSL 0:1239e9b70ca2 526 {
wolfSSL 0:1239e9b70ca2 527 if (ssl == NULL || inner == NULL)
wolfSSL 0:1239e9b70ca2 528 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 529
wolfSSL 0:1239e9b70ca2 530 XMEMSET(inner, 0, CYASSL_TLS_HMAC_INNER_SZ);
wolfSSL 0:1239e9b70ca2 531
wolfSSL 0:1239e9b70ca2 532 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 533 if (ssl->options.dtls)
wolfSSL 0:1239e9b70ca2 534 c16toa((word16)GetEpoch(ssl, verify), inner);
wolfSSL 0:1239e9b70ca2 535 #endif
wolfSSL 0:1239e9b70ca2 536 c32toa(GetSEQIncrement(ssl, verify), &inner[sizeof(word32)]);
wolfSSL 0:1239e9b70ca2 537 inner[SEQ_SZ] = (byte)content;
wolfSSL 0:1239e9b70ca2 538 inner[SEQ_SZ + ENUM_LEN] = ssl->version.major;
wolfSSL 0:1239e9b70ca2 539 inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
wolfSSL 0:1239e9b70ca2 540 c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
wolfSSL 0:1239e9b70ca2 541
wolfSSL 0:1239e9b70ca2 542 return 0;
wolfSSL 0:1239e9b70ca2 543 }
wolfSSL 0:1239e9b70ca2 544
wolfSSL 0:1239e9b70ca2 545
wolfSSL 0:1239e9b70ca2 546 /* TLS type HMAC */
wolfSSL 0:1239e9b70ca2 547 int TLS_hmac(CYASSL* ssl, byte* digest, const byte* in, word32 sz,
wolfSSL 0:1239e9b70ca2 548 int content, int verify)
wolfSSL 0:1239e9b70ca2 549 {
wolfSSL 0:1239e9b70ca2 550 Hmac hmac;
wolfSSL 0:1239e9b70ca2 551 int ret;
wolfSSL 0:1239e9b70ca2 552 byte myInner[CYASSL_TLS_HMAC_INNER_SZ];
wolfSSL 0:1239e9b70ca2 553
wolfSSL 0:1239e9b70ca2 554 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 555 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 556
wolfSSL 0:1239e9b70ca2 557 CyaSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
wolfSSL 0:1239e9b70ca2 558
wolfSSL 0:1239e9b70ca2 559 ret = HmacSetKey(&hmac, CyaSSL_GetHmacType(ssl),
wolfSSL 0:1239e9b70ca2 560 CyaSSL_GetMacSecret(ssl, verify), ssl->specs.hash_size);
wolfSSL 0:1239e9b70ca2 561 if (ret != 0)
wolfSSL 0:1239e9b70ca2 562 return ret;
wolfSSL 0:1239e9b70ca2 563 ret = HmacUpdate(&hmac, myInner, sizeof(myInner));
wolfSSL 0:1239e9b70ca2 564 if (ret != 0)
wolfSSL 0:1239e9b70ca2 565 return ret;
wolfSSL 0:1239e9b70ca2 566 ret = HmacUpdate(&hmac, in, sz); /* content */
wolfSSL 0:1239e9b70ca2 567 if (ret != 0)
wolfSSL 0:1239e9b70ca2 568 return ret;
wolfSSL 0:1239e9b70ca2 569 ret = HmacFinal(&hmac, digest);
wolfSSL 0:1239e9b70ca2 570 if (ret != 0)
wolfSSL 0:1239e9b70ca2 571 return ret;
wolfSSL 0:1239e9b70ca2 572
wolfSSL 0:1239e9b70ca2 573 return 0;
wolfSSL 0:1239e9b70ca2 574 }
wolfSSL 0:1239e9b70ca2 575
wolfSSL 0:1239e9b70ca2 576 #ifdef HAVE_TLS_EXTENSIONS
wolfSSL 0:1239e9b70ca2 577
wolfSSL 0:1239e9b70ca2 578 #define IS_OFF(semaphore, light) \
wolfSSL 0:1239e9b70ca2 579 ((semaphore)[(light) / 8] ^ (byte) (0x01 << ((light) % 8)))
wolfSSL 0:1239e9b70ca2 580
wolfSSL 0:1239e9b70ca2 581 #define TURN_ON(semaphore, light) \
wolfSSL 0:1239e9b70ca2 582 ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
wolfSSL 0:1239e9b70ca2 583
wolfSSL 0:1239e9b70ca2 584 static int TLSX_Append(TLSX** list, TLSX_Type type)
wolfSSL 0:1239e9b70ca2 585 {
wolfSSL 0:1239e9b70ca2 586 TLSX* extension;
wolfSSL 0:1239e9b70ca2 587
wolfSSL 0:1239e9b70ca2 588 if (list == NULL) /* won't check type since this function is static */
wolfSSL 0:1239e9b70ca2 589 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 590
wolfSSL 0:1239e9b70ca2 591 if ((extension = XMALLOC(sizeof(TLSX), 0, DYNAMIC_TYPE_TLSX)) == NULL)
wolfSSL 0:1239e9b70ca2 592 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 593
wolfSSL 0:1239e9b70ca2 594 extension->type = type;
wolfSSL 0:1239e9b70ca2 595 extension->data = NULL;
wolfSSL 0:1239e9b70ca2 596 extension->resp = 0;
wolfSSL 0:1239e9b70ca2 597 extension->next = *list;
wolfSSL 0:1239e9b70ca2 598 *list = extension;
wolfSSL 0:1239e9b70ca2 599
wolfSSL 0:1239e9b70ca2 600 return 0;
wolfSSL 0:1239e9b70ca2 601 }
wolfSSL 0:1239e9b70ca2 602
wolfSSL 0:1239e9b70ca2 603 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 604
wolfSSL 0:1239e9b70ca2 605 void TLSX_SetResponse(CYASSL* ssl, TLSX_Type type);
wolfSSL 0:1239e9b70ca2 606
wolfSSL 0:1239e9b70ca2 607 void TLSX_SetResponse(CYASSL* ssl, TLSX_Type type)
wolfSSL 0:1239e9b70ca2 608 {
wolfSSL 0:1239e9b70ca2 609 TLSX *ext = TLSX_Find(ssl->extensions, type);
wolfSSL 0:1239e9b70ca2 610
wolfSSL 0:1239e9b70ca2 611 if (ext)
wolfSSL 0:1239e9b70ca2 612 ext->resp = 1;
wolfSSL 0:1239e9b70ca2 613 }
wolfSSL 0:1239e9b70ca2 614
wolfSSL 0:1239e9b70ca2 615 #endif
wolfSSL 0:1239e9b70ca2 616
wolfSSL 0:1239e9b70ca2 617 /* SNI - Server Name Indication */
wolfSSL 0:1239e9b70ca2 618
wolfSSL 0:1239e9b70ca2 619 #ifdef HAVE_SNI
wolfSSL 0:1239e9b70ca2 620
wolfSSL 0:1239e9b70ca2 621 static void TLSX_SNI_Free(SNI* sni)
wolfSSL 0:1239e9b70ca2 622 {
wolfSSL 0:1239e9b70ca2 623 if (sni) {
wolfSSL 0:1239e9b70ca2 624 switch (sni->type) {
wolfSSL 0:1239e9b70ca2 625 case CYASSL_SNI_HOST_NAME:
wolfSSL 0:1239e9b70ca2 626 XFREE(sni->data.host_name, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 627 break;
wolfSSL 0:1239e9b70ca2 628 }
wolfSSL 0:1239e9b70ca2 629
wolfSSL 0:1239e9b70ca2 630 XFREE(sni, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 631 }
wolfSSL 0:1239e9b70ca2 632 }
wolfSSL 0:1239e9b70ca2 633
wolfSSL 0:1239e9b70ca2 634 static void TLSX_SNI_FreeAll(SNI* list)
wolfSSL 0:1239e9b70ca2 635 {
wolfSSL 0:1239e9b70ca2 636 SNI* sni;
wolfSSL 0:1239e9b70ca2 637
wolfSSL 0:1239e9b70ca2 638 while ((sni = list)) {
wolfSSL 0:1239e9b70ca2 639 list = sni->next;
wolfSSL 0:1239e9b70ca2 640 TLSX_SNI_Free(sni);
wolfSSL 0:1239e9b70ca2 641 }
wolfSSL 0:1239e9b70ca2 642 }
wolfSSL 0:1239e9b70ca2 643
wolfSSL 0:1239e9b70ca2 644 static int TLSX_SNI_Append(SNI** list, byte type, const void* data, word16 size)
wolfSSL 0:1239e9b70ca2 645 {
wolfSSL 0:1239e9b70ca2 646 SNI* sni;
wolfSSL 0:1239e9b70ca2 647
wolfSSL 0:1239e9b70ca2 648 if (list == NULL)
wolfSSL 0:1239e9b70ca2 649 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 650
wolfSSL 0:1239e9b70ca2 651 if ((sni = XMALLOC(sizeof(SNI), 0, DYNAMIC_TYPE_TLSX)) == NULL)
wolfSSL 0:1239e9b70ca2 652 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 653
wolfSSL 0:1239e9b70ca2 654 switch (type) {
wolfSSL 0:1239e9b70ca2 655 case CYASSL_SNI_HOST_NAME: {
wolfSSL 0:1239e9b70ca2 656 sni->data.host_name = XMALLOC(size + 1, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 657
wolfSSL 0:1239e9b70ca2 658 if (sni->data.host_name) {
wolfSSL 0:1239e9b70ca2 659 XSTRNCPY(sni->data.host_name, (const char*) data, size);
wolfSSL 0:1239e9b70ca2 660 sni->data.host_name[size] = 0;
wolfSSL 0:1239e9b70ca2 661 } else {
wolfSSL 0:1239e9b70ca2 662 XFREE(sni, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 663 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 664 }
wolfSSL 0:1239e9b70ca2 665 }
wolfSSL 0:1239e9b70ca2 666 break;
wolfSSL 0:1239e9b70ca2 667
wolfSSL 0:1239e9b70ca2 668 default: /* invalid type */
wolfSSL 0:1239e9b70ca2 669 XFREE(sni, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 670 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 671 }
wolfSSL 0:1239e9b70ca2 672
wolfSSL 0:1239e9b70ca2 673 sni->type = type;
wolfSSL 0:1239e9b70ca2 674 sni->next = *list;
wolfSSL 0:1239e9b70ca2 675
wolfSSL 0:1239e9b70ca2 676 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 677 sni->options = 0;
wolfSSL 0:1239e9b70ca2 678 sni->status = CYASSL_SNI_NO_MATCH;
wolfSSL 0:1239e9b70ca2 679 #endif
wolfSSL 0:1239e9b70ca2 680
wolfSSL 0:1239e9b70ca2 681 *list = sni;
wolfSSL 0:1239e9b70ca2 682
wolfSSL 0:1239e9b70ca2 683 return 0;
wolfSSL 0:1239e9b70ca2 684 }
wolfSSL 0:1239e9b70ca2 685
wolfSSL 0:1239e9b70ca2 686 static word16 TLSX_SNI_GetSize(SNI* list)
wolfSSL 0:1239e9b70ca2 687 {
wolfSSL 0:1239e9b70ca2 688 SNI* sni;
wolfSSL 0:1239e9b70ca2 689 word16 length = OPAQUE16_LEN; /* list length */
wolfSSL 0:1239e9b70ca2 690
wolfSSL 0:1239e9b70ca2 691 while ((sni = list)) {
wolfSSL 0:1239e9b70ca2 692 list = sni->next;
wolfSSL 0:1239e9b70ca2 693
wolfSSL 0:1239e9b70ca2 694 length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
wolfSSL 0:1239e9b70ca2 695
wolfSSL 0:1239e9b70ca2 696 switch (sni->type) {
wolfSSL 0:1239e9b70ca2 697 case CYASSL_SNI_HOST_NAME:
wolfSSL 0:1239e9b70ca2 698 length += XSTRLEN((char*) sni->data.host_name);
wolfSSL 0:1239e9b70ca2 699 break;
wolfSSL 0:1239e9b70ca2 700 }
wolfSSL 0:1239e9b70ca2 701 }
wolfSSL 0:1239e9b70ca2 702
wolfSSL 0:1239e9b70ca2 703 return length;
wolfSSL 0:1239e9b70ca2 704 }
wolfSSL 0:1239e9b70ca2 705
wolfSSL 0:1239e9b70ca2 706 static word16 TLSX_SNI_Write(SNI* list, byte* output)
wolfSSL 0:1239e9b70ca2 707 {
wolfSSL 0:1239e9b70ca2 708 SNI* sni;
wolfSSL 0:1239e9b70ca2 709 word16 length = 0;
wolfSSL 0:1239e9b70ca2 710 word16 offset = OPAQUE16_LEN; /* list length offset */
wolfSSL 0:1239e9b70ca2 711
wolfSSL 0:1239e9b70ca2 712 while ((sni = list)) {
wolfSSL 0:1239e9b70ca2 713 list = sni->next;
wolfSSL 0:1239e9b70ca2 714
wolfSSL 0:1239e9b70ca2 715 output[offset++] = sni->type; /* sni type */
wolfSSL 0:1239e9b70ca2 716
wolfSSL 0:1239e9b70ca2 717 switch (sni->type) {
wolfSSL 0:1239e9b70ca2 718 case CYASSL_SNI_HOST_NAME:
wolfSSL 0:1239e9b70ca2 719 length = XSTRLEN((char*) sni->data.host_name);
wolfSSL 0:1239e9b70ca2 720
wolfSSL 0:1239e9b70ca2 721 c16toa(length, output + offset); /* sni length */
wolfSSL 0:1239e9b70ca2 722 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 723
wolfSSL 0:1239e9b70ca2 724 XMEMCPY(output + offset, sni->data.host_name, length);
wolfSSL 0:1239e9b70ca2 725
wolfSSL 0:1239e9b70ca2 726 offset += length;
wolfSSL 0:1239e9b70ca2 727 break;
wolfSSL 0:1239e9b70ca2 728 }
wolfSSL 0:1239e9b70ca2 729 }
wolfSSL 0:1239e9b70ca2 730
wolfSSL 0:1239e9b70ca2 731 c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
wolfSSL 0:1239e9b70ca2 732
wolfSSL 0:1239e9b70ca2 733 return offset;
wolfSSL 0:1239e9b70ca2 734 }
wolfSSL 0:1239e9b70ca2 735
wolfSSL 0:1239e9b70ca2 736 static SNI* TLSX_SNI_Find(SNI *list, byte type)
wolfSSL 0:1239e9b70ca2 737 {
wolfSSL 0:1239e9b70ca2 738 SNI *sni = list;
wolfSSL 0:1239e9b70ca2 739
wolfSSL 0:1239e9b70ca2 740 while (sni && sni->type != type)
wolfSSL 0:1239e9b70ca2 741 sni = sni->next;
wolfSSL 0:1239e9b70ca2 742
wolfSSL 0:1239e9b70ca2 743 return sni;
wolfSSL 0:1239e9b70ca2 744 }
wolfSSL 0:1239e9b70ca2 745
wolfSSL 0:1239e9b70ca2 746 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 747 static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
wolfSSL 0:1239e9b70ca2 748 {
wolfSSL 0:1239e9b70ca2 749 TLSX* extension = TLSX_Find(extensions, SERVER_NAME_INDICATION);
wolfSSL 0:1239e9b70ca2 750 SNI* sni = TLSX_SNI_Find(extension ? extension->data : NULL, type);
wolfSSL 0:1239e9b70ca2 751
wolfSSL 0:1239e9b70ca2 752 if (sni) {
wolfSSL 0:1239e9b70ca2 753 sni->status = status;
wolfSSL 0:1239e9b70ca2 754 CYASSL_MSG("SNI did match!");
wolfSSL 0:1239e9b70ca2 755 }
wolfSSL 0:1239e9b70ca2 756 }
wolfSSL 0:1239e9b70ca2 757
wolfSSL 0:1239e9b70ca2 758 byte TLSX_SNI_Status(TLSX* extensions, byte type)
wolfSSL 0:1239e9b70ca2 759 {
wolfSSL 0:1239e9b70ca2 760 TLSX* extension = TLSX_Find(extensions, SERVER_NAME_INDICATION);
wolfSSL 0:1239e9b70ca2 761 SNI* sni = TLSX_SNI_Find(extension ? extension->data : NULL, type);
wolfSSL 0:1239e9b70ca2 762
wolfSSL 0:1239e9b70ca2 763 if (sni)
wolfSSL 0:1239e9b70ca2 764 return sni->status;
wolfSSL 0:1239e9b70ca2 765
wolfSSL 0:1239e9b70ca2 766 return 0;
wolfSSL 0:1239e9b70ca2 767 }
wolfSSL 0:1239e9b70ca2 768 #endif
wolfSSL 0:1239e9b70ca2 769
wolfSSL 0:1239e9b70ca2 770 static int TLSX_SNI_Parse(CYASSL* ssl, byte* input, word16 length,
wolfSSL 0:1239e9b70ca2 771 byte isRequest)
wolfSSL 0:1239e9b70ca2 772 {
wolfSSL 0:1239e9b70ca2 773 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 774 word16 size = 0;
wolfSSL 0:1239e9b70ca2 775 word16 offset = 0;
wolfSSL 0:1239e9b70ca2 776 #endif
wolfSSL 0:1239e9b70ca2 777
wolfSSL 0:1239e9b70ca2 778 TLSX *extension = TLSX_Find(ssl->extensions, SERVER_NAME_INDICATION);
wolfSSL 0:1239e9b70ca2 779
wolfSSL 0:1239e9b70ca2 780 if (!extension)
wolfSSL 0:1239e9b70ca2 781 extension = TLSX_Find(ssl->ctx->extensions, SERVER_NAME_INDICATION);
wolfSSL 0:1239e9b70ca2 782
wolfSSL 0:1239e9b70ca2 783 if (!extension || !extension->data)
wolfSSL 0:1239e9b70ca2 784 return isRequest ? 0 : BUFFER_ERROR; /* not using SNI OR unexpected
wolfSSL 0:1239e9b70ca2 785 SNI response from server. */
wolfSSL 0:1239e9b70ca2 786
wolfSSL 0:1239e9b70ca2 787 if (!isRequest)
wolfSSL 0:1239e9b70ca2 788 return length ? BUFFER_ERROR : 0; /* SNI response must be empty!
wolfSSL 0:1239e9b70ca2 789 Nothing else to do. */
wolfSSL 0:1239e9b70ca2 790
wolfSSL 0:1239e9b70ca2 791 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 792
wolfSSL 0:1239e9b70ca2 793 if (OPAQUE16_LEN > length)
wolfSSL 0:1239e9b70ca2 794 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 795
wolfSSL 0:1239e9b70ca2 796 ato16(input, &size);
wolfSSL 0:1239e9b70ca2 797 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 798
wolfSSL 0:1239e9b70ca2 799 /* validating sni list length */
wolfSSL 0:1239e9b70ca2 800 if (length != OPAQUE16_LEN + size)
wolfSSL 0:1239e9b70ca2 801 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 802
wolfSSL 0:1239e9b70ca2 803 for (size = 0; offset < length; offset += size) {
wolfSSL 0:1239e9b70ca2 804 SNI *sni;
wolfSSL 0:1239e9b70ca2 805 byte type = input[offset++];
wolfSSL 0:1239e9b70ca2 806
wolfSSL 0:1239e9b70ca2 807 if (offset + OPAQUE16_LEN > length)
wolfSSL 0:1239e9b70ca2 808 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 809
wolfSSL 0:1239e9b70ca2 810 ato16(input + offset, &size);
wolfSSL 0:1239e9b70ca2 811 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 812
wolfSSL 0:1239e9b70ca2 813 if (offset + size > length)
wolfSSL 0:1239e9b70ca2 814 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 815
wolfSSL 0:1239e9b70ca2 816 if (!(sni = TLSX_SNI_Find((SNI *) extension->data, type))) {
wolfSSL 0:1239e9b70ca2 817 continue; /* not using this SNI type */
wolfSSL 0:1239e9b70ca2 818 }
wolfSSL 0:1239e9b70ca2 819
wolfSSL 0:1239e9b70ca2 820 switch(type) {
wolfSSL 0:1239e9b70ca2 821 case CYASSL_SNI_HOST_NAME: {
wolfSSL 0:1239e9b70ca2 822 byte matched = (XSTRLEN(sni->data.host_name) == size)
wolfSSL 0:1239e9b70ca2 823 && (XSTRNCMP(sni->data.host_name,
wolfSSL 0:1239e9b70ca2 824 (const char *) input + offset, size) == 0);
wolfSSL 0:1239e9b70ca2 825
wolfSSL 0:1239e9b70ca2 826 if (matched || sni->options & CYASSL_SNI_ANSWER_ON_MISMATCH) {
wolfSSL 0:1239e9b70ca2 827 int r = TLSX_UseSNI(&ssl->extensions,
wolfSSL 0:1239e9b70ca2 828 type, input + offset, size);
wolfSSL 0:1239e9b70ca2 829
wolfSSL 0:1239e9b70ca2 830 if (r != SSL_SUCCESS) return r; /* throw error */
wolfSSL 0:1239e9b70ca2 831
wolfSSL 0:1239e9b70ca2 832 TLSX_SNI_SetStatus(ssl->extensions, type,
wolfSSL 0:1239e9b70ca2 833 matched ? CYASSL_SNI_REAL_MATCH : CYASSL_SNI_FAKE_MATCH);
wolfSSL 0:1239e9b70ca2 834
wolfSSL 0:1239e9b70ca2 835 } else if (!(sni->options & CYASSL_SNI_CONTINUE_ON_MISMATCH)) {
wolfSSL 0:1239e9b70ca2 836 SendAlert(ssl, alert_fatal, unrecognized_name);
wolfSSL 0:1239e9b70ca2 837
wolfSSL 0:1239e9b70ca2 838 return UNKNOWN_SNI_HOST_NAME_E;
wolfSSL 0:1239e9b70ca2 839 }
wolfSSL 0:1239e9b70ca2 840 break;
wolfSSL 0:1239e9b70ca2 841 }
wolfSSL 0:1239e9b70ca2 842 }
wolfSSL 0:1239e9b70ca2 843
wolfSSL 0:1239e9b70ca2 844 TLSX_SetResponse(ssl, SERVER_NAME_INDICATION);
wolfSSL 0:1239e9b70ca2 845 }
wolfSSL 0:1239e9b70ca2 846
wolfSSL 0:1239e9b70ca2 847 #endif
wolfSSL 0:1239e9b70ca2 848
wolfSSL 0:1239e9b70ca2 849 return 0;
wolfSSL 0:1239e9b70ca2 850 }
wolfSSL 0:1239e9b70ca2 851
wolfSSL 0:1239e9b70ca2 852 int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size)
wolfSSL 0:1239e9b70ca2 853 {
wolfSSL 0:1239e9b70ca2 854 TLSX* extension = NULL;
wolfSSL 0:1239e9b70ca2 855 SNI* sni = NULL;
wolfSSL 0:1239e9b70ca2 856 int ret = 0;
wolfSSL 0:1239e9b70ca2 857
wolfSSL 0:1239e9b70ca2 858 if (extensions == NULL || data == NULL)
wolfSSL 0:1239e9b70ca2 859 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 860
wolfSSL 0:1239e9b70ca2 861 if ((ret = TLSX_SNI_Append(&sni, type, data, size)) != 0)
wolfSSL 0:1239e9b70ca2 862 return ret;
wolfSSL 0:1239e9b70ca2 863
wolfSSL 0:1239e9b70ca2 864 extension = *extensions;
wolfSSL 0:1239e9b70ca2 865
wolfSSL 0:1239e9b70ca2 866 /* find SNI extension if it already exists. */
wolfSSL 0:1239e9b70ca2 867 while (extension && extension->type != SERVER_NAME_INDICATION)
wolfSSL 0:1239e9b70ca2 868 extension = extension->next;
wolfSSL 0:1239e9b70ca2 869
wolfSSL 0:1239e9b70ca2 870 /* push new SNI extension if it doesn't exists. */
wolfSSL 0:1239e9b70ca2 871 if (!extension) {
wolfSSL 0:1239e9b70ca2 872 if ((ret = TLSX_Append(extensions, SERVER_NAME_INDICATION)) != 0) {
wolfSSL 0:1239e9b70ca2 873 TLSX_SNI_Free(sni);
wolfSSL 0:1239e9b70ca2 874 return ret;
wolfSSL 0:1239e9b70ca2 875 }
wolfSSL 0:1239e9b70ca2 876
wolfSSL 0:1239e9b70ca2 877 extension = *extensions;
wolfSSL 0:1239e9b70ca2 878 }
wolfSSL 0:1239e9b70ca2 879
wolfSSL 0:1239e9b70ca2 880 /* push new SNI object to extension data. */
wolfSSL 0:1239e9b70ca2 881 sni->next = (SNI*) extension->data;
wolfSSL 0:1239e9b70ca2 882 extension->data = (void*) sni;
wolfSSL 0:1239e9b70ca2 883
wolfSSL 0:1239e9b70ca2 884 /* look for another server name of the same type to remove (replacement) */
wolfSSL 0:1239e9b70ca2 885 do {
wolfSSL 0:1239e9b70ca2 886 if (sni->next && sni->next->type == type) {
wolfSSL 0:1239e9b70ca2 887 SNI *next = sni->next;
wolfSSL 0:1239e9b70ca2 888
wolfSSL 0:1239e9b70ca2 889 sni->next = next->next;
wolfSSL 0:1239e9b70ca2 890 TLSX_SNI_Free(next);
wolfSSL 0:1239e9b70ca2 891
wolfSSL 0:1239e9b70ca2 892 break;
wolfSSL 0:1239e9b70ca2 893 }
wolfSSL 0:1239e9b70ca2 894 } while ((sni = sni->next));
wolfSSL 0:1239e9b70ca2 895
wolfSSL 0:1239e9b70ca2 896 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 897 }
wolfSSL 0:1239e9b70ca2 898
wolfSSL 0:1239e9b70ca2 899 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 900 word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data)
wolfSSL 0:1239e9b70ca2 901 {
wolfSSL 0:1239e9b70ca2 902 TLSX* extension = TLSX_Find(extensions, SERVER_NAME_INDICATION);
wolfSSL 0:1239e9b70ca2 903 SNI* sni = TLSX_SNI_Find(extension ? extension->data : NULL, type);
wolfSSL 0:1239e9b70ca2 904
wolfSSL 0:1239e9b70ca2 905 if (sni && sni->status != CYASSL_SNI_NO_MATCH) {
wolfSSL 0:1239e9b70ca2 906 switch (sni->type) {
wolfSSL 0:1239e9b70ca2 907 case CYASSL_SNI_HOST_NAME:
wolfSSL 0:1239e9b70ca2 908 *data = sni->data.host_name;
wolfSSL 0:1239e9b70ca2 909 return XSTRLEN(*data);
wolfSSL 0:1239e9b70ca2 910 }
wolfSSL 0:1239e9b70ca2 911 }
wolfSSL 0:1239e9b70ca2 912
wolfSSL 0:1239e9b70ca2 913 return 0;
wolfSSL 0:1239e9b70ca2 914 }
wolfSSL 0:1239e9b70ca2 915
wolfSSL 0:1239e9b70ca2 916 void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
wolfSSL 0:1239e9b70ca2 917 {
wolfSSL 0:1239e9b70ca2 918 TLSX* extension = TLSX_Find(extensions, SERVER_NAME_INDICATION);
wolfSSL 0:1239e9b70ca2 919 SNI* sni = TLSX_SNI_Find(extension ? extension->data : NULL, type);
wolfSSL 0:1239e9b70ca2 920
wolfSSL 0:1239e9b70ca2 921 if (sni)
wolfSSL 0:1239e9b70ca2 922 sni->options = options;
wolfSSL 0:1239e9b70ca2 923 }
wolfSSL 0:1239e9b70ca2 924
wolfSSL 0:1239e9b70ca2 925 int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
wolfSSL 0:1239e9b70ca2 926 byte type, byte* sni, word32* inOutSz)
wolfSSL 0:1239e9b70ca2 927 {
wolfSSL 0:1239e9b70ca2 928 word32 offset = 0;
wolfSSL 0:1239e9b70ca2 929 word32 len32 = 0;
wolfSSL 0:1239e9b70ca2 930 word16 len16 = 0;
wolfSSL 0:1239e9b70ca2 931
wolfSSL 0:1239e9b70ca2 932 if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
wolfSSL 0:1239e9b70ca2 933 return INCOMPLETE_DATA;
wolfSSL 0:1239e9b70ca2 934
wolfSSL 0:1239e9b70ca2 935 /* TLS record header */
wolfSSL 0:1239e9b70ca2 936 if ((enum ContentType) clientHello[offset++] != handshake)
wolfSSL 0:1239e9b70ca2 937 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 938
wolfSSL 0:1239e9b70ca2 939 if (clientHello[offset++] != SSLv3_MAJOR)
wolfSSL 0:1239e9b70ca2 940 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 941
wolfSSL 0:1239e9b70ca2 942 if (clientHello[offset++] < TLSv1_MINOR)
wolfSSL 0:1239e9b70ca2 943 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 944
wolfSSL 0:1239e9b70ca2 945 ato16(clientHello + offset, &len16);
wolfSSL 0:1239e9b70ca2 946 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 947
wolfSSL 0:1239e9b70ca2 948 if (offset + len16 > helloSz)
wolfSSL 0:1239e9b70ca2 949 return INCOMPLETE_DATA;
wolfSSL 0:1239e9b70ca2 950
wolfSSL 0:1239e9b70ca2 951 /* Handshake header */
wolfSSL 0:1239e9b70ca2 952 if ((enum HandShakeType) clientHello[offset] != client_hello)
wolfSSL 0:1239e9b70ca2 953 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 954
wolfSSL 0:1239e9b70ca2 955 c24to32(clientHello + offset + 1, &len32);
wolfSSL 0:1239e9b70ca2 956 offset += HANDSHAKE_HEADER_SZ;
wolfSSL 0:1239e9b70ca2 957
wolfSSL 0:1239e9b70ca2 958 if (offset + len32 > helloSz)
wolfSSL 0:1239e9b70ca2 959 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 960
wolfSSL 0:1239e9b70ca2 961 /* client hello */
wolfSSL 0:1239e9b70ca2 962 offset += VERSION_SZ + RAN_LEN; /* version, random */
wolfSSL 0:1239e9b70ca2 963
wolfSSL 0:1239e9b70ca2 964 if (helloSz < offset + clientHello[offset])
wolfSSL 0:1239e9b70ca2 965 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 966
wolfSSL 0:1239e9b70ca2 967 offset += ENUM_LEN + clientHello[offset]; /* skip session id */
wolfSSL 0:1239e9b70ca2 968
wolfSSL 0:1239e9b70ca2 969 /* cypher suites */
wolfSSL 0:1239e9b70ca2 970 if (helloSz < offset + OPAQUE16_LEN)
wolfSSL 0:1239e9b70ca2 971 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 972
wolfSSL 0:1239e9b70ca2 973 ato16(clientHello + offset, &len16);
wolfSSL 0:1239e9b70ca2 974 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 975
wolfSSL 0:1239e9b70ca2 976 if (helloSz < offset + len16)
wolfSSL 0:1239e9b70ca2 977 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 978
wolfSSL 0:1239e9b70ca2 979 offset += len16; /* skip cypher suites */
wolfSSL 0:1239e9b70ca2 980
wolfSSL 0:1239e9b70ca2 981 /* compression methods */
wolfSSL 0:1239e9b70ca2 982 if (helloSz < offset + 1)
wolfSSL 0:1239e9b70ca2 983 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 984
wolfSSL 0:1239e9b70ca2 985 if (helloSz < offset + clientHello[offset])
wolfSSL 0:1239e9b70ca2 986 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 987
wolfSSL 0:1239e9b70ca2 988 offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
wolfSSL 0:1239e9b70ca2 989
wolfSSL 0:1239e9b70ca2 990 /* extensions */
wolfSSL 0:1239e9b70ca2 991 if (helloSz < offset + OPAQUE16_LEN)
wolfSSL 0:1239e9b70ca2 992 return 0; /* no extensions in client hello. */
wolfSSL 0:1239e9b70ca2 993
wolfSSL 0:1239e9b70ca2 994 ato16(clientHello + offset, &len16);
wolfSSL 0:1239e9b70ca2 995 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 996
wolfSSL 0:1239e9b70ca2 997 if (helloSz < offset + len16)
wolfSSL 0:1239e9b70ca2 998 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 999
wolfSSL 0:1239e9b70ca2 1000 while (len16 > OPAQUE16_LEN + OPAQUE16_LEN) {
wolfSSL 0:1239e9b70ca2 1001 word16 extType;
wolfSSL 0:1239e9b70ca2 1002 word16 extLen;
wolfSSL 0:1239e9b70ca2 1003
wolfSSL 0:1239e9b70ca2 1004 ato16(clientHello + offset, &extType);
wolfSSL 0:1239e9b70ca2 1005 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1006
wolfSSL 0:1239e9b70ca2 1007 ato16(clientHello + offset, &extLen);
wolfSSL 0:1239e9b70ca2 1008 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1009
wolfSSL 0:1239e9b70ca2 1010 if (helloSz < offset + extLen)
wolfSSL 0:1239e9b70ca2 1011 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1012
wolfSSL 0:1239e9b70ca2 1013 if (extType != SERVER_NAME_INDICATION) {
wolfSSL 0:1239e9b70ca2 1014 offset += extLen; /* skip extension */
wolfSSL 0:1239e9b70ca2 1015 } else {
wolfSSL 0:1239e9b70ca2 1016 word16 listLen;
wolfSSL 0:1239e9b70ca2 1017
wolfSSL 0:1239e9b70ca2 1018 ato16(clientHello + offset, &listLen);
wolfSSL 0:1239e9b70ca2 1019 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1020
wolfSSL 0:1239e9b70ca2 1021 if (helloSz < offset + listLen)
wolfSSL 0:1239e9b70ca2 1022 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1023
wolfSSL 0:1239e9b70ca2 1024 while (listLen > ENUM_LEN + OPAQUE16_LEN) {
wolfSSL 0:1239e9b70ca2 1025 byte sniType = clientHello[offset++];
wolfSSL 0:1239e9b70ca2 1026 word16 sniLen;
wolfSSL 0:1239e9b70ca2 1027
wolfSSL 0:1239e9b70ca2 1028 ato16(clientHello + offset, &sniLen);
wolfSSL 0:1239e9b70ca2 1029 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1030
wolfSSL 0:1239e9b70ca2 1031 if (helloSz < offset + sniLen)
wolfSSL 0:1239e9b70ca2 1032 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1033
wolfSSL 0:1239e9b70ca2 1034 if (sniType != type) {
wolfSSL 0:1239e9b70ca2 1035 offset += sniLen;
wolfSSL 0:1239e9b70ca2 1036 listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
wolfSSL 0:1239e9b70ca2 1037 continue;
wolfSSL 0:1239e9b70ca2 1038 }
wolfSSL 0:1239e9b70ca2 1039
wolfSSL 0:1239e9b70ca2 1040 *inOutSz = min(sniLen, *inOutSz);
wolfSSL 0:1239e9b70ca2 1041 XMEMCPY(sni, clientHello + offset, *inOutSz);
wolfSSL 0:1239e9b70ca2 1042
wolfSSL 0:1239e9b70ca2 1043 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1044 }
wolfSSL 0:1239e9b70ca2 1045 }
wolfSSL 0:1239e9b70ca2 1046
wolfSSL 0:1239e9b70ca2 1047 len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
wolfSSL 0:1239e9b70ca2 1048 }
wolfSSL 0:1239e9b70ca2 1049
wolfSSL 0:1239e9b70ca2 1050 return len16 ? BUFFER_ERROR : SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1051 }
wolfSSL 0:1239e9b70ca2 1052
wolfSSL 0:1239e9b70ca2 1053 #endif
wolfSSL 0:1239e9b70ca2 1054
wolfSSL 0:1239e9b70ca2 1055 #define SNI_FREE_ALL TLSX_SNI_FreeAll
wolfSSL 0:1239e9b70ca2 1056 #define SNI_GET_SIZE TLSX_SNI_GetSize
wolfSSL 0:1239e9b70ca2 1057 #define SNI_WRITE TLSX_SNI_Write
wolfSSL 0:1239e9b70ca2 1058 #define SNI_PARSE TLSX_SNI_Parse
wolfSSL 0:1239e9b70ca2 1059
wolfSSL 0:1239e9b70ca2 1060 #else
wolfSSL 0:1239e9b70ca2 1061
wolfSSL 0:1239e9b70ca2 1062 #define SNI_FREE_ALL(list)
wolfSSL 0:1239e9b70ca2 1063 #define SNI_GET_SIZE(list) 0
wolfSSL 0:1239e9b70ca2 1064 #define SNI_WRITE(a, b) 0
wolfSSL 0:1239e9b70ca2 1065 #define SNI_PARSE(a, b, c, d) 0
wolfSSL 0:1239e9b70ca2 1066
wolfSSL 0:1239e9b70ca2 1067 #endif /* HAVE_SNI */
wolfSSL 0:1239e9b70ca2 1068
wolfSSL 0:1239e9b70ca2 1069 #ifdef HAVE_MAX_FRAGMENT
wolfSSL 0:1239e9b70ca2 1070
wolfSSL 0:1239e9b70ca2 1071 static word16 TLSX_MFL_Write(byte* data, byte* output)
wolfSSL 0:1239e9b70ca2 1072 {
wolfSSL 0:1239e9b70ca2 1073 output[0] = data[0];
wolfSSL 0:1239e9b70ca2 1074
wolfSSL 0:1239e9b70ca2 1075 return ENUM_LEN;
wolfSSL 0:1239e9b70ca2 1076 }
wolfSSL 0:1239e9b70ca2 1077
wolfSSL 0:1239e9b70ca2 1078 static int TLSX_MFL_Parse(CYASSL* ssl, byte* input, word16 length,
wolfSSL 0:1239e9b70ca2 1079 byte isRequest)
wolfSSL 0:1239e9b70ca2 1080 {
wolfSSL 0:1239e9b70ca2 1081 if (length != ENUM_LEN)
wolfSSL 0:1239e9b70ca2 1082 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1083
wolfSSL 0:1239e9b70ca2 1084 switch (*input) {
wolfSSL 0:1239e9b70ca2 1085 case CYASSL_MFL_2_9 : ssl->max_fragment = 512; break;
wolfSSL 0:1239e9b70ca2 1086 case CYASSL_MFL_2_10: ssl->max_fragment = 1024; break;
wolfSSL 0:1239e9b70ca2 1087 case CYASSL_MFL_2_11: ssl->max_fragment = 2048; break;
wolfSSL 0:1239e9b70ca2 1088 case CYASSL_MFL_2_12: ssl->max_fragment = 4096; break;
wolfSSL 0:1239e9b70ca2 1089 case CYASSL_MFL_2_13: ssl->max_fragment = 8192; break;
wolfSSL 0:1239e9b70ca2 1090
wolfSSL 0:1239e9b70ca2 1091 default:
wolfSSL 0:1239e9b70ca2 1092 SendAlert(ssl, alert_fatal, illegal_parameter);
wolfSSL 0:1239e9b70ca2 1093
wolfSSL 0:1239e9b70ca2 1094 return UNKNOWN_MAX_FRAG_LEN_E;
wolfSSL 0:1239e9b70ca2 1095 }
wolfSSL 0:1239e9b70ca2 1096
wolfSSL 0:1239e9b70ca2 1097 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 1098 if (isRequest) {
wolfSSL 0:1239e9b70ca2 1099 int r = TLSX_UseMaxFragment(&ssl->extensions, *input);
wolfSSL 0:1239e9b70ca2 1100
wolfSSL 0:1239e9b70ca2 1101 if (r != SSL_SUCCESS) return r; /* throw error */
wolfSSL 0:1239e9b70ca2 1102
wolfSSL 0:1239e9b70ca2 1103 TLSX_SetResponse(ssl, MAX_FRAGMENT_LENGTH);
wolfSSL 0:1239e9b70ca2 1104 }
wolfSSL 0:1239e9b70ca2 1105 #endif
wolfSSL 0:1239e9b70ca2 1106
wolfSSL 0:1239e9b70ca2 1107 return 0;
wolfSSL 0:1239e9b70ca2 1108 }
wolfSSL 0:1239e9b70ca2 1109
wolfSSL 0:1239e9b70ca2 1110 int TLSX_UseMaxFragment(TLSX** extensions, byte mfl)
wolfSSL 0:1239e9b70ca2 1111 {
wolfSSL 0:1239e9b70ca2 1112 TLSX* extension = NULL;
wolfSSL 0:1239e9b70ca2 1113 byte* data = NULL;
wolfSSL 0:1239e9b70ca2 1114 int ret = 0;
wolfSSL 0:1239e9b70ca2 1115
wolfSSL 0:1239e9b70ca2 1116 if (extensions == NULL)
wolfSSL 0:1239e9b70ca2 1117 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1118
wolfSSL 0:1239e9b70ca2 1119 if (mfl < CYASSL_MFL_2_9 || CYASSL_MFL_2_13 < mfl)
wolfSSL 0:1239e9b70ca2 1120 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1121
wolfSSL 0:1239e9b70ca2 1122 if ((data = XMALLOC(ENUM_LEN, 0, DYNAMIC_TYPE_TLSX)) == NULL)
wolfSSL 0:1239e9b70ca2 1123 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 1124
wolfSSL 0:1239e9b70ca2 1125 data[0] = mfl;
wolfSSL 0:1239e9b70ca2 1126
wolfSSL 0:1239e9b70ca2 1127 /* push new MFL extension. */
wolfSSL 0:1239e9b70ca2 1128 if ((ret = TLSX_Append(extensions, MAX_FRAGMENT_LENGTH)) != 0) {
wolfSSL 0:1239e9b70ca2 1129 XFREE(data, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 1130 return ret;
wolfSSL 0:1239e9b70ca2 1131 }
wolfSSL 0:1239e9b70ca2 1132
wolfSSL 0:1239e9b70ca2 1133 /* place new mfl to extension data. */
wolfSSL 0:1239e9b70ca2 1134 extension = *extensions;
wolfSSL 0:1239e9b70ca2 1135 extension->data = (void*) data;
wolfSSL 0:1239e9b70ca2 1136
wolfSSL 0:1239e9b70ca2 1137 /* remove duplicated extensions */
wolfSSL 0:1239e9b70ca2 1138 do {
wolfSSL 0:1239e9b70ca2 1139 if (extension->next && extension->next->type == MAX_FRAGMENT_LENGTH) {
wolfSSL 0:1239e9b70ca2 1140 TLSX *next = extension->next;
wolfSSL 0:1239e9b70ca2 1141
wolfSSL 0:1239e9b70ca2 1142 extension->next = next->next;
wolfSSL 0:1239e9b70ca2 1143 next->next = NULL;
wolfSSL 0:1239e9b70ca2 1144
wolfSSL 0:1239e9b70ca2 1145 TLSX_FreeAll(next);
wolfSSL 0:1239e9b70ca2 1146
wolfSSL 0:1239e9b70ca2 1147 break;
wolfSSL 0:1239e9b70ca2 1148 }
wolfSSL 0:1239e9b70ca2 1149 } while ((extension = extension->next));
wolfSSL 0:1239e9b70ca2 1150
wolfSSL 0:1239e9b70ca2 1151 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1152 }
wolfSSL 0:1239e9b70ca2 1153
wolfSSL 0:1239e9b70ca2 1154
wolfSSL 0:1239e9b70ca2 1155 #define MFL_FREE_ALL(data) XFREE(data, 0, DYNAMIC_TYPE_TLSX)
wolfSSL 0:1239e9b70ca2 1156 #define MFL_GET_SIZE(data) ENUM_LEN
wolfSSL 0:1239e9b70ca2 1157 #define MFL_WRITE TLSX_MFL_Write
wolfSSL 0:1239e9b70ca2 1158 #define MFL_PARSE TLSX_MFL_Parse
wolfSSL 0:1239e9b70ca2 1159
wolfSSL 0:1239e9b70ca2 1160 #else
wolfSSL 0:1239e9b70ca2 1161
wolfSSL 0:1239e9b70ca2 1162 #define MFL_FREE_ALL(a)
wolfSSL 0:1239e9b70ca2 1163 #define MFL_GET_SIZE(a) 0
wolfSSL 0:1239e9b70ca2 1164 #define MFL_WRITE(a, b) 0
wolfSSL 0:1239e9b70ca2 1165 #define MFL_PARSE(a, b, c, d) 0
wolfSSL 0:1239e9b70ca2 1166
wolfSSL 0:1239e9b70ca2 1167 #endif /* HAVE_MAX_FRAGMENT */
wolfSSL 0:1239e9b70ca2 1168
wolfSSL 0:1239e9b70ca2 1169 #ifdef HAVE_TRUNCATED_HMAC
wolfSSL 0:1239e9b70ca2 1170
wolfSSL 0:1239e9b70ca2 1171 int TLSX_UseTruncatedHMAC(TLSX** extensions)
wolfSSL 0:1239e9b70ca2 1172 {
wolfSSL 0:1239e9b70ca2 1173 int ret = 0;
wolfSSL 0:1239e9b70ca2 1174
wolfSSL 0:1239e9b70ca2 1175 if (extensions == NULL)
wolfSSL 0:1239e9b70ca2 1176 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1177
wolfSSL 0:1239e9b70ca2 1178 if (!TLSX_Find(*extensions, TRUNCATED_HMAC))
wolfSSL 0:1239e9b70ca2 1179 if ((ret = TLSX_Append(extensions, TRUNCATED_HMAC)) != 0)
wolfSSL 0:1239e9b70ca2 1180 return ret;
wolfSSL 0:1239e9b70ca2 1181
wolfSSL 0:1239e9b70ca2 1182 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1183 }
wolfSSL 0:1239e9b70ca2 1184
wolfSSL 0:1239e9b70ca2 1185 static int TLSX_THM_Parse(CYASSL* ssl, byte* input, word16 length,
wolfSSL 0:1239e9b70ca2 1186 byte isRequest)
wolfSSL 0:1239e9b70ca2 1187 {
wolfSSL 0:1239e9b70ca2 1188 if (length != 0 || input == NULL)
wolfSSL 0:1239e9b70ca2 1189 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1190
wolfSSL 0:1239e9b70ca2 1191 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 1192 if (isRequest) {
wolfSSL 0:1239e9b70ca2 1193 int r = TLSX_UseTruncatedHMAC(&ssl->extensions);
wolfSSL 0:1239e9b70ca2 1194
wolfSSL 0:1239e9b70ca2 1195 if (r != SSL_SUCCESS) return r; /* throw error */
wolfSSL 0:1239e9b70ca2 1196
wolfSSL 0:1239e9b70ca2 1197 TLSX_SetResponse(ssl, TRUNCATED_HMAC);
wolfSSL 0:1239e9b70ca2 1198 }
wolfSSL 0:1239e9b70ca2 1199 #endif
wolfSSL 0:1239e9b70ca2 1200
wolfSSL 0:1239e9b70ca2 1201 ssl->truncated_hmac = 1;
wolfSSL 0:1239e9b70ca2 1202
wolfSSL 0:1239e9b70ca2 1203 return 0;
wolfSSL 0:1239e9b70ca2 1204 }
wolfSSL 0:1239e9b70ca2 1205
wolfSSL 0:1239e9b70ca2 1206 #define THM_PARSE TLSX_THM_Parse
wolfSSL 0:1239e9b70ca2 1207
wolfSSL 0:1239e9b70ca2 1208 #else
wolfSSL 0:1239e9b70ca2 1209
wolfSSL 0:1239e9b70ca2 1210 #define THM_PARSE(a, b, c, d) 0
wolfSSL 0:1239e9b70ca2 1211
wolfSSL 0:1239e9b70ca2 1212 #endif /* HAVE_TRUNCATED_HMAC */
wolfSSL 0:1239e9b70ca2 1213
wolfSSL 0:1239e9b70ca2 1214 #ifdef HAVE_SUPPORTED_CURVES
wolfSSL 0:1239e9b70ca2 1215
wolfSSL 0:1239e9b70ca2 1216 #ifndef HAVE_ECC
wolfSSL 0:1239e9b70ca2 1217 #error "Elliptic Curves Extension requires Elliptic Curve Cryptography. \
wolfSSL 0:1239e9b70ca2 1218 Use --enable-ecc in the configure script or define HAVE_ECC."
wolfSSL 0:1239e9b70ca2 1219 #endif
wolfSSL 0:1239e9b70ca2 1220
wolfSSL 0:1239e9b70ca2 1221 static void TLSX_EllipticCurve_FreeAll(EllipticCurve* list)
wolfSSL 0:1239e9b70ca2 1222 {
wolfSSL 0:1239e9b70ca2 1223 EllipticCurve* curve;
wolfSSL 0:1239e9b70ca2 1224
wolfSSL 0:1239e9b70ca2 1225 while ((curve = list)) {
wolfSSL 0:1239e9b70ca2 1226 list = curve->next;
wolfSSL 0:1239e9b70ca2 1227 XFREE(curve, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 1228 }
wolfSSL 0:1239e9b70ca2 1229 }
wolfSSL 0:1239e9b70ca2 1230
wolfSSL 0:1239e9b70ca2 1231 static int TLSX_EllipticCurve_Append(EllipticCurve** list, word16 name)
wolfSSL 0:1239e9b70ca2 1232 {
wolfSSL 0:1239e9b70ca2 1233 EllipticCurve* curve;
wolfSSL 0:1239e9b70ca2 1234
wolfSSL 0:1239e9b70ca2 1235 if (list == NULL)
wolfSSL 0:1239e9b70ca2 1236 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1237
wolfSSL 0:1239e9b70ca2 1238 if ((curve = XMALLOC(sizeof(EllipticCurve), 0, DYNAMIC_TYPE_TLSX)) == NULL)
wolfSSL 0:1239e9b70ca2 1239 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 1240
wolfSSL 0:1239e9b70ca2 1241 curve->name = name;
wolfSSL 0:1239e9b70ca2 1242 curve->next = *list;
wolfSSL 0:1239e9b70ca2 1243
wolfSSL 0:1239e9b70ca2 1244 *list = curve;
wolfSSL 0:1239e9b70ca2 1245
wolfSSL 0:1239e9b70ca2 1246 return 0;
wolfSSL 0:1239e9b70ca2 1247 }
wolfSSL 0:1239e9b70ca2 1248
wolfSSL 0:1239e9b70ca2 1249 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 1250
wolfSSL 0:1239e9b70ca2 1251 static void TLSX_EllipticCurve_ValidateRequest(CYASSL* ssl, byte* semaphore)
wolfSSL 0:1239e9b70ca2 1252 {
wolfSSL 0:1239e9b70ca2 1253 int i;
wolfSSL 0:1239e9b70ca2 1254
wolfSSL 0:1239e9b70ca2 1255 for (i = 0; i < ssl->suites->suiteSz; i+= 2)
wolfSSL 0:1239e9b70ca2 1256 if (ssl->suites->suites[i] == ECC_BYTE)
wolfSSL 0:1239e9b70ca2 1257 return;
wolfSSL 0:1239e9b70ca2 1258
wolfSSL 0:1239e9b70ca2 1259 /* No elliptic curve suite found */
wolfSSL 0:1239e9b70ca2 1260 TURN_ON(semaphore, ELLIPTIC_CURVES);
wolfSSL 0:1239e9b70ca2 1261 }
wolfSSL 0:1239e9b70ca2 1262
wolfSSL 0:1239e9b70ca2 1263 static word16 TLSX_EllipticCurve_GetSize(EllipticCurve* list)
wolfSSL 0:1239e9b70ca2 1264 {
wolfSSL 0:1239e9b70ca2 1265 EllipticCurve* curve;
wolfSSL 0:1239e9b70ca2 1266 word16 length = OPAQUE16_LEN; /* list length */
wolfSSL 0:1239e9b70ca2 1267
wolfSSL 0:1239e9b70ca2 1268 while ((curve = list)) {
wolfSSL 0:1239e9b70ca2 1269 list = curve->next;
wolfSSL 0:1239e9b70ca2 1270 length += OPAQUE16_LEN; /* curve length */
wolfSSL 0:1239e9b70ca2 1271 }
wolfSSL 0:1239e9b70ca2 1272
wolfSSL 0:1239e9b70ca2 1273 return length;
wolfSSL 0:1239e9b70ca2 1274 }
wolfSSL 0:1239e9b70ca2 1275
wolfSSL 0:1239e9b70ca2 1276 static word16 TLSX_EllipticCurve_WriteR(EllipticCurve* curve, byte* output);
wolfSSL 0:1239e9b70ca2 1277 static word16 TLSX_EllipticCurve_WriteR(EllipticCurve* curve, byte* output)
wolfSSL 0:1239e9b70ca2 1278 {
wolfSSL 0:1239e9b70ca2 1279 word16 offset = 0;
wolfSSL 0:1239e9b70ca2 1280
wolfSSL 0:1239e9b70ca2 1281 if (!curve)
wolfSSL 0:1239e9b70ca2 1282 return offset;
wolfSSL 0:1239e9b70ca2 1283
wolfSSL 0:1239e9b70ca2 1284 offset = TLSX_EllipticCurve_WriteR(curve->next, output);
wolfSSL 0:1239e9b70ca2 1285 c16toa(curve->name, output + offset);
wolfSSL 0:1239e9b70ca2 1286
wolfSSL 0:1239e9b70ca2 1287 return OPAQUE16_LEN + offset;
wolfSSL 0:1239e9b70ca2 1288 }
wolfSSL 0:1239e9b70ca2 1289
wolfSSL 0:1239e9b70ca2 1290 static word16 TLSX_EllipticCurve_Write(EllipticCurve* list, byte* output)
wolfSSL 0:1239e9b70ca2 1291 {
wolfSSL 0:1239e9b70ca2 1292 word16 length = TLSX_EllipticCurve_WriteR(list, output + OPAQUE16_LEN);
wolfSSL 0:1239e9b70ca2 1293
wolfSSL 0:1239e9b70ca2 1294 c16toa(length, output); /* writing list length */
wolfSSL 0:1239e9b70ca2 1295
wolfSSL 0:1239e9b70ca2 1296 return OPAQUE16_LEN + length;
wolfSSL 0:1239e9b70ca2 1297 }
wolfSSL 0:1239e9b70ca2 1298
wolfSSL 0:1239e9b70ca2 1299 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:1239e9b70ca2 1300 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 1301
wolfSSL 0:1239e9b70ca2 1302 static int TLSX_EllipticCurve_Parse(CYASSL* ssl, byte* input, word16 length,
wolfSSL 0:1239e9b70ca2 1303 byte isRequest)
wolfSSL 0:1239e9b70ca2 1304 {
wolfSSL 0:1239e9b70ca2 1305 word16 offset;
wolfSSL 0:1239e9b70ca2 1306 word16 name;
wolfSSL 0:1239e9b70ca2 1307 int r;
wolfSSL 0:1239e9b70ca2 1308
wolfSSL 0:1239e9b70ca2 1309 (void) isRequest; /* shut up compiler! */
wolfSSL 0:1239e9b70ca2 1310
wolfSSL 0:1239e9b70ca2 1311 if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
wolfSSL 0:1239e9b70ca2 1312 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1313
wolfSSL 0:1239e9b70ca2 1314 ato16(input, &offset);
wolfSSL 0:1239e9b70ca2 1315
wolfSSL 0:1239e9b70ca2 1316 /* validating curve list length */
wolfSSL 0:1239e9b70ca2 1317 if (length != OPAQUE16_LEN + offset)
wolfSSL 0:1239e9b70ca2 1318 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1319
wolfSSL 0:1239e9b70ca2 1320 while (offset) {
wolfSSL 0:1239e9b70ca2 1321 ato16(input + offset, &name);
wolfSSL 0:1239e9b70ca2 1322 offset -= OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1323
wolfSSL 0:1239e9b70ca2 1324 r = TLSX_UseSupportedCurve(&ssl->extensions, name);
wolfSSL 0:1239e9b70ca2 1325
wolfSSL 0:1239e9b70ca2 1326 if (r != SSL_SUCCESS) return r; /* throw error */
wolfSSL 0:1239e9b70ca2 1327 }
wolfSSL 0:1239e9b70ca2 1328
wolfSSL 0:1239e9b70ca2 1329 return 0;
wolfSSL 0:1239e9b70ca2 1330 }
wolfSSL 0:1239e9b70ca2 1331
wolfSSL 0:1239e9b70ca2 1332 int TLSX_ValidateEllipticCurves(CYASSL* ssl, byte first, byte second) {
wolfSSL 0:1239e9b70ca2 1333 TLSX* extension = (first == ECC_BYTE)
wolfSSL 0:1239e9b70ca2 1334 ? TLSX_Find(ssl->extensions, ELLIPTIC_CURVES)
wolfSSL 0:1239e9b70ca2 1335 : NULL;
wolfSSL 0:1239e9b70ca2 1336 EllipticCurve* curve = NULL;
wolfSSL 0:1239e9b70ca2 1337 word32 oid = 0;
wolfSSL 0:1239e9b70ca2 1338 word16 octets = 0; /* acording to 'ecc_set_type ecc_sets[];' */
wolfSSL 0:1239e9b70ca2 1339 int sig = 0; /* valitade signature */
wolfSSL 0:1239e9b70ca2 1340 int key = 0; /* validate key */
wolfSSL 0:1239e9b70ca2 1341
wolfSSL 0:1239e9b70ca2 1342 if (!extension)
wolfSSL 0:1239e9b70ca2 1343 return 1; /* no suite restriction */
wolfSSL 0:1239e9b70ca2 1344
wolfSSL 0:1239e9b70ca2 1345 for (curve = extension->data; curve && !(sig && key); curve = curve->next) {
wolfSSL 0:1239e9b70ca2 1346
wolfSSL 0:1239e9b70ca2 1347 switch (curve->name) {
wolfSSL 0:1239e9b70ca2 1348 case CYASSL_ECC_SECP160R1: oid = ECC_160R1; octets = 20; break;
wolfSSL 0:1239e9b70ca2 1349 case CYASSL_ECC_SECP192R1: oid = ECC_192R1; octets = 24; break;
wolfSSL 0:1239e9b70ca2 1350 case CYASSL_ECC_SECP224R1: oid = ECC_224R1; octets = 28; break;
wolfSSL 0:1239e9b70ca2 1351 case CYASSL_ECC_SECP256R1: oid = ECC_256R1; octets = 32; break;
wolfSSL 0:1239e9b70ca2 1352 case CYASSL_ECC_SECP384R1: oid = ECC_384R1; octets = 48; break;
wolfSSL 0:1239e9b70ca2 1353 case CYASSL_ECC_SECP521R1: oid = ECC_521R1; octets = 66; break;
wolfSSL 0:1239e9b70ca2 1354 default: continue; /* unsupported curve */
wolfSSL 0:1239e9b70ca2 1355 }
wolfSSL 0:1239e9b70ca2 1356
wolfSSL 0:1239e9b70ca2 1357 switch (second) {
wolfSSL 0:1239e9b70ca2 1358 #ifndef NO_DSA
wolfSSL 0:1239e9b70ca2 1359 /* ECDHE_ECDSA */
wolfSSL 0:1239e9b70ca2 1360 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1361 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1362 case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
wolfSSL 0:1239e9b70ca2 1363 case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1364 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
wolfSSL 0:1239e9b70ca2 1365 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
wolfSSL 0:1239e9b70ca2 1366 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
wolfSSL 0:1239e9b70ca2 1367 case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
wolfSSL 0:1239e9b70ca2 1368 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
wolfSSL 0:1239e9b70ca2 1369 case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
wolfSSL 0:1239e9b70ca2 1370 sig |= ssl->pkCurveOID == oid;
wolfSSL 0:1239e9b70ca2 1371 key |= ssl->eccTempKeySz == octets;
wolfSSL 0:1239e9b70ca2 1372 break;
wolfSSL 0:1239e9b70ca2 1373
wolfSSL 0:1239e9b70ca2 1374 /* ECDH_ECDSA */
wolfSSL 0:1239e9b70ca2 1375 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1376 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1377 case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
wolfSSL 0:1239e9b70ca2 1378 case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1379 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
wolfSSL 0:1239e9b70ca2 1380 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
wolfSSL 0:1239e9b70ca2 1381 case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
wolfSSL 0:1239e9b70ca2 1382 case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
wolfSSL 0:1239e9b70ca2 1383 sig |= ssl->pkCurveOID == oid;
wolfSSL 0:1239e9b70ca2 1384 key |= ssl->pkCurveOID == oid;
wolfSSL 0:1239e9b70ca2 1385 break;
wolfSSL 0:1239e9b70ca2 1386 #endif
wolfSSL 0:1239e9b70ca2 1387 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 1388 /* ECDHE_RSA */
wolfSSL 0:1239e9b70ca2 1389 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1390 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1391 case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
wolfSSL 0:1239e9b70ca2 1392 case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1393 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
wolfSSL 0:1239e9b70ca2 1394 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
wolfSSL 0:1239e9b70ca2 1395 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
wolfSSL 0:1239e9b70ca2 1396 case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
wolfSSL 0:1239e9b70ca2 1397 sig = 1;
wolfSSL 0:1239e9b70ca2 1398 key |= ssl->eccTempKeySz == octets;
wolfSSL 0:1239e9b70ca2 1399 break;
wolfSSL 0:1239e9b70ca2 1400
wolfSSL 0:1239e9b70ca2 1401 /* ECDH_RSA */
wolfSSL 0:1239e9b70ca2 1402 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1403 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1404 case TLS_ECDH_RSA_WITH_RC4_128_SHA:
wolfSSL 0:1239e9b70ca2 1405 case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
wolfSSL 0:1239e9b70ca2 1406 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
wolfSSL 0:1239e9b70ca2 1407 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
wolfSSL 0:1239e9b70ca2 1408 case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
wolfSSL 0:1239e9b70ca2 1409 case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
wolfSSL 0:1239e9b70ca2 1410 sig = 1;
wolfSSL 0:1239e9b70ca2 1411 key |= ssl->pkCurveOID == oid;
wolfSSL 0:1239e9b70ca2 1412 break;
wolfSSL 0:1239e9b70ca2 1413 #endif
wolfSSL 0:1239e9b70ca2 1414 default:
wolfSSL 0:1239e9b70ca2 1415 sig = 1;
wolfSSL 0:1239e9b70ca2 1416 key = 1;
wolfSSL 0:1239e9b70ca2 1417 break;
wolfSSL 0:1239e9b70ca2 1418 }
wolfSSL 0:1239e9b70ca2 1419 }
wolfSSL 0:1239e9b70ca2 1420
wolfSSL 0:1239e9b70ca2 1421 return sig && key;
wolfSSL 0:1239e9b70ca2 1422 }
wolfSSL 0:1239e9b70ca2 1423
wolfSSL 0:1239e9b70ca2 1424 #endif /* NO_CYASSL_SERVER */
wolfSSL 0:1239e9b70ca2 1425
wolfSSL 0:1239e9b70ca2 1426 int TLSX_UseSupportedCurve(TLSX** extensions, word16 name)
wolfSSL 0:1239e9b70ca2 1427 {
wolfSSL 0:1239e9b70ca2 1428 TLSX* extension = NULL;
wolfSSL 0:1239e9b70ca2 1429 EllipticCurve* curve = NULL;
wolfSSL 0:1239e9b70ca2 1430 int ret = 0;
wolfSSL 0:1239e9b70ca2 1431
wolfSSL 0:1239e9b70ca2 1432 if (extensions == NULL)
wolfSSL 0:1239e9b70ca2 1433 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1434
wolfSSL 0:1239e9b70ca2 1435 if ((ret = TLSX_EllipticCurve_Append(&curve, name)) != 0)
wolfSSL 0:1239e9b70ca2 1436 return ret;
wolfSSL 0:1239e9b70ca2 1437
wolfSSL 0:1239e9b70ca2 1438 extension = *extensions;
wolfSSL 0:1239e9b70ca2 1439
wolfSSL 0:1239e9b70ca2 1440 /* find EllipticCurve extension if it already exists. */
wolfSSL 0:1239e9b70ca2 1441 while (extension && extension->type != ELLIPTIC_CURVES)
wolfSSL 0:1239e9b70ca2 1442 extension = extension->next;
wolfSSL 0:1239e9b70ca2 1443
wolfSSL 0:1239e9b70ca2 1444 /* push new EllipticCurve extension if it doesn't exists. */
wolfSSL 0:1239e9b70ca2 1445 if (!extension) {
wolfSSL 0:1239e9b70ca2 1446 if ((ret = TLSX_Append(extensions, ELLIPTIC_CURVES)) != 0) {
wolfSSL 0:1239e9b70ca2 1447 XFREE(curve, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 1448 return ret;
wolfSSL 0:1239e9b70ca2 1449 }
wolfSSL 0:1239e9b70ca2 1450
wolfSSL 0:1239e9b70ca2 1451 extension = *extensions;
wolfSSL 0:1239e9b70ca2 1452 }
wolfSSL 0:1239e9b70ca2 1453
wolfSSL 0:1239e9b70ca2 1454 /* push new EllipticCurve object to extension data. */
wolfSSL 0:1239e9b70ca2 1455 curve->next = (EllipticCurve*) extension->data;
wolfSSL 0:1239e9b70ca2 1456 extension->data = (void*) curve;
wolfSSL 0:1239e9b70ca2 1457
wolfSSL 0:1239e9b70ca2 1458 /* look for another curve of the same name to remove (replacement) */
wolfSSL 0:1239e9b70ca2 1459 do {
wolfSSL 0:1239e9b70ca2 1460 if (curve->next && curve->next->name == name) {
wolfSSL 0:1239e9b70ca2 1461 EllipticCurve *next = curve->next;
wolfSSL 0:1239e9b70ca2 1462
wolfSSL 0:1239e9b70ca2 1463 curve->next = next->next;
wolfSSL 0:1239e9b70ca2 1464 XFREE(next, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 1465
wolfSSL 0:1239e9b70ca2 1466 break;
wolfSSL 0:1239e9b70ca2 1467 }
wolfSSL 0:1239e9b70ca2 1468 } while ((curve = curve->next));
wolfSSL 0:1239e9b70ca2 1469
wolfSSL 0:1239e9b70ca2 1470 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1471 }
wolfSSL 0:1239e9b70ca2 1472
wolfSSL 0:1239e9b70ca2 1473 #define EC_FREE_ALL TLSX_EllipticCurve_FreeAll
wolfSSL 0:1239e9b70ca2 1474 #define EC_VALIDATE_REQUEST TLSX_EllipticCurve_ValidateRequest
wolfSSL 0:1239e9b70ca2 1475
wolfSSL 0:1239e9b70ca2 1476 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 1477 #define EC_GET_SIZE TLSX_EllipticCurve_GetSize
wolfSSL 0:1239e9b70ca2 1478 #define EC_WRITE TLSX_EllipticCurve_Write
wolfSSL 0:1239e9b70ca2 1479 #else
wolfSSL 0:1239e9b70ca2 1480 #define EC_GET_SIZE(list) 0
wolfSSL 0:1239e9b70ca2 1481 #define EC_WRITE(a, b) 0
wolfSSL 0:1239e9b70ca2 1482 #endif
wolfSSL 0:1239e9b70ca2 1483
wolfSSL 0:1239e9b70ca2 1484 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 1485 #define EC_PARSE TLSX_EllipticCurve_Parse
wolfSSL 0:1239e9b70ca2 1486 #else
wolfSSL 0:1239e9b70ca2 1487 #define EC_PARSE(a, b, c, d) 0
wolfSSL 0:1239e9b70ca2 1488 #endif
wolfSSL 0:1239e9b70ca2 1489
wolfSSL 0:1239e9b70ca2 1490 #else
wolfSSL 0:1239e9b70ca2 1491
wolfSSL 0:1239e9b70ca2 1492 #define EC_FREE_ALL(list)
wolfSSL 0:1239e9b70ca2 1493 #define EC_GET_SIZE(list) 0
wolfSSL 0:1239e9b70ca2 1494 #define EC_WRITE(a, b) 0
wolfSSL 0:1239e9b70ca2 1495 #define EC_PARSE(a, b, c, d) 0
wolfSSL 0:1239e9b70ca2 1496 #define EC_VALIDATE_REQUEST(a, b)
wolfSSL 0:1239e9b70ca2 1497
wolfSSL 0:1239e9b70ca2 1498 #endif /* HAVE_SUPPORTED_CURVES */
wolfSSL 0:1239e9b70ca2 1499
wolfSSL 0:1239e9b70ca2 1500 TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
wolfSSL 0:1239e9b70ca2 1501 {
wolfSSL 0:1239e9b70ca2 1502 TLSX* extension = list;
wolfSSL 0:1239e9b70ca2 1503
wolfSSL 0:1239e9b70ca2 1504 while (extension && extension->type != type)
wolfSSL 0:1239e9b70ca2 1505 extension = extension->next;
wolfSSL 0:1239e9b70ca2 1506
wolfSSL 0:1239e9b70ca2 1507 return extension;
wolfSSL 0:1239e9b70ca2 1508 }
wolfSSL 0:1239e9b70ca2 1509
wolfSSL 0:1239e9b70ca2 1510 void TLSX_FreeAll(TLSX* list)
wolfSSL 0:1239e9b70ca2 1511 {
wolfSSL 0:1239e9b70ca2 1512 TLSX* extension;
wolfSSL 0:1239e9b70ca2 1513
wolfSSL 0:1239e9b70ca2 1514 while ((extension = list)) {
wolfSSL 0:1239e9b70ca2 1515 list = extension->next;
wolfSSL 0:1239e9b70ca2 1516
wolfSSL 0:1239e9b70ca2 1517 switch (extension->type) {
wolfSSL 0:1239e9b70ca2 1518 case SERVER_NAME_INDICATION:
wolfSSL 0:1239e9b70ca2 1519 SNI_FREE_ALL((SNI *) extension->data);
wolfSSL 0:1239e9b70ca2 1520 break;
wolfSSL 0:1239e9b70ca2 1521
wolfSSL 0:1239e9b70ca2 1522 case MAX_FRAGMENT_LENGTH:
wolfSSL 0:1239e9b70ca2 1523 MFL_FREE_ALL(extension->data);
wolfSSL 0:1239e9b70ca2 1524 break;
wolfSSL 0:1239e9b70ca2 1525
wolfSSL 0:1239e9b70ca2 1526 case TRUNCATED_HMAC:
wolfSSL 0:1239e9b70ca2 1527 /* Nothing to do. */
wolfSSL 0:1239e9b70ca2 1528 break;
wolfSSL 0:1239e9b70ca2 1529
wolfSSL 0:1239e9b70ca2 1530 case ELLIPTIC_CURVES:
wolfSSL 0:1239e9b70ca2 1531 EC_FREE_ALL(extension->data);
wolfSSL 0:1239e9b70ca2 1532 break;
wolfSSL 0:1239e9b70ca2 1533 }
wolfSSL 0:1239e9b70ca2 1534
wolfSSL 0:1239e9b70ca2 1535 XFREE(extension, 0, DYNAMIC_TYPE_TLSX);
wolfSSL 0:1239e9b70ca2 1536 }
wolfSSL 0:1239e9b70ca2 1537 }
wolfSSL 0:1239e9b70ca2 1538
wolfSSL 0:1239e9b70ca2 1539 static word16 TLSX_GetSize(TLSX* list, byte* semaphore, byte isRequest)
wolfSSL 0:1239e9b70ca2 1540 {
wolfSSL 0:1239e9b70ca2 1541 TLSX* extension;
wolfSSL 0:1239e9b70ca2 1542 word16 length = 0;
wolfSSL 0:1239e9b70ca2 1543
wolfSSL 0:1239e9b70ca2 1544 while ((extension = list)) {
wolfSSL 0:1239e9b70ca2 1545 list = extension->next;
wolfSSL 0:1239e9b70ca2 1546
wolfSSL 0:1239e9b70ca2 1547 if (!isRequest && !extension->resp)
wolfSSL 0:1239e9b70ca2 1548 continue; /* skip! */
wolfSSL 0:1239e9b70ca2 1549
wolfSSL 0:1239e9b70ca2 1550 if (IS_OFF(semaphore, extension->type)) {
wolfSSL 0:1239e9b70ca2 1551 /* type + data length */
wolfSSL 0:1239e9b70ca2 1552 length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1553
wolfSSL 0:1239e9b70ca2 1554 switch (extension->type) {
wolfSSL 0:1239e9b70ca2 1555 case SERVER_NAME_INDICATION:
wolfSSL 0:1239e9b70ca2 1556 if (isRequest)
wolfSSL 0:1239e9b70ca2 1557 length += SNI_GET_SIZE((SNI *) extension->data);
wolfSSL 0:1239e9b70ca2 1558 break;
wolfSSL 0:1239e9b70ca2 1559 case MAX_FRAGMENT_LENGTH:
wolfSSL 0:1239e9b70ca2 1560 length += MFL_GET_SIZE(extension->data);
wolfSSL 0:1239e9b70ca2 1561 break;
wolfSSL 0:1239e9b70ca2 1562
wolfSSL 0:1239e9b70ca2 1563 case TRUNCATED_HMAC:
wolfSSL 0:1239e9b70ca2 1564 /* empty extension. */
wolfSSL 0:1239e9b70ca2 1565 break;
wolfSSL 0:1239e9b70ca2 1566
wolfSSL 0:1239e9b70ca2 1567 case ELLIPTIC_CURVES:
wolfSSL 0:1239e9b70ca2 1568 length += EC_GET_SIZE((EllipticCurve *) extension->data);
wolfSSL 0:1239e9b70ca2 1569 break;
wolfSSL 0:1239e9b70ca2 1570 }
wolfSSL 0:1239e9b70ca2 1571
wolfSSL 0:1239e9b70ca2 1572 TURN_ON(semaphore, extension->type);
wolfSSL 0:1239e9b70ca2 1573 }
wolfSSL 0:1239e9b70ca2 1574 }
wolfSSL 0:1239e9b70ca2 1575
wolfSSL 0:1239e9b70ca2 1576 return length;
wolfSSL 0:1239e9b70ca2 1577 }
wolfSSL 0:1239e9b70ca2 1578
wolfSSL 0:1239e9b70ca2 1579 static word16 TLSX_Write(TLSX* list, byte* output, byte* semaphore,
wolfSSL 0:1239e9b70ca2 1580 byte isRequest)
wolfSSL 0:1239e9b70ca2 1581 {
wolfSSL 0:1239e9b70ca2 1582 TLSX* extension;
wolfSSL 0:1239e9b70ca2 1583 word16 offset = 0;
wolfSSL 0:1239e9b70ca2 1584 word16 length_offset = 0;
wolfSSL 0:1239e9b70ca2 1585
wolfSSL 0:1239e9b70ca2 1586 while ((extension = list)) {
wolfSSL 0:1239e9b70ca2 1587 list = extension->next;
wolfSSL 0:1239e9b70ca2 1588
wolfSSL 0:1239e9b70ca2 1589 if (!isRequest && !extension->resp)
wolfSSL 0:1239e9b70ca2 1590 continue; /* skip! */
wolfSSL 0:1239e9b70ca2 1591
wolfSSL 0:1239e9b70ca2 1592 if (IS_OFF(semaphore, extension->type)) {
wolfSSL 0:1239e9b70ca2 1593 /* extension type */
wolfSSL 0:1239e9b70ca2 1594 c16toa(extension->type, output + offset);
wolfSSL 0:1239e9b70ca2 1595 offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1596 length_offset = offset;
wolfSSL 0:1239e9b70ca2 1597
wolfSSL 0:1239e9b70ca2 1598 /* extension data should be written internally */
wolfSSL 0:1239e9b70ca2 1599 switch (extension->type) {
wolfSSL 0:1239e9b70ca2 1600 case SERVER_NAME_INDICATION:
wolfSSL 0:1239e9b70ca2 1601 if (isRequest)
wolfSSL 0:1239e9b70ca2 1602 offset += SNI_WRITE((SNI *) extension->data,
wolfSSL 0:1239e9b70ca2 1603 output + offset);
wolfSSL 0:1239e9b70ca2 1604 break;
wolfSSL 0:1239e9b70ca2 1605
wolfSSL 0:1239e9b70ca2 1606 case MAX_FRAGMENT_LENGTH:
wolfSSL 0:1239e9b70ca2 1607 offset += MFL_WRITE((byte *) extension->data,
wolfSSL 0:1239e9b70ca2 1608 output + offset);
wolfSSL 0:1239e9b70ca2 1609 break;
wolfSSL 0:1239e9b70ca2 1610
wolfSSL 0:1239e9b70ca2 1611 case TRUNCATED_HMAC:
wolfSSL 0:1239e9b70ca2 1612 /* empty extension. */
wolfSSL 0:1239e9b70ca2 1613 break;
wolfSSL 0:1239e9b70ca2 1614
wolfSSL 0:1239e9b70ca2 1615 case ELLIPTIC_CURVES:
wolfSSL 0:1239e9b70ca2 1616 offset += EC_WRITE((EllipticCurve *) extension->data,
wolfSSL 0:1239e9b70ca2 1617 output + offset);
wolfSSL 0:1239e9b70ca2 1618 break;
wolfSSL 0:1239e9b70ca2 1619 }
wolfSSL 0:1239e9b70ca2 1620
wolfSSL 0:1239e9b70ca2 1621 /* writing extension data length */
wolfSSL 0:1239e9b70ca2 1622 c16toa(offset - length_offset,
wolfSSL 0:1239e9b70ca2 1623 output + length_offset - OPAQUE16_LEN);
wolfSSL 0:1239e9b70ca2 1624
wolfSSL 0:1239e9b70ca2 1625 TURN_ON(semaphore, extension->type);
wolfSSL 0:1239e9b70ca2 1626 }
wolfSSL 0:1239e9b70ca2 1627 }
wolfSSL 0:1239e9b70ca2 1628
wolfSSL 0:1239e9b70ca2 1629 return offset;
wolfSSL 0:1239e9b70ca2 1630 }
wolfSSL 0:1239e9b70ca2 1631
wolfSSL 0:1239e9b70ca2 1632 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 1633
wolfSSL 0:1239e9b70ca2 1634 word16 TLSX_GetRequestSize(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1635 {
wolfSSL 0:1239e9b70ca2 1636 word16 length = 0;
wolfSSL 0:1239e9b70ca2 1637
wolfSSL 0:1239e9b70ca2 1638 if (ssl && IsTLS(ssl)) {
wolfSSL 0:1239e9b70ca2 1639 byte semaphore[16] = {0};
wolfSSL 0:1239e9b70ca2 1640
wolfSSL 0:1239e9b70ca2 1641 EC_VALIDATE_REQUEST(ssl, semaphore);
wolfSSL 0:1239e9b70ca2 1642
wolfSSL 0:1239e9b70ca2 1643 if (ssl->extensions)
wolfSSL 0:1239e9b70ca2 1644 length += TLSX_GetSize(ssl->extensions, semaphore, 1);
wolfSSL 0:1239e9b70ca2 1645
wolfSSL 0:1239e9b70ca2 1646 if (ssl->ctx && ssl->ctx->extensions)
wolfSSL 0:1239e9b70ca2 1647 length += TLSX_GetSize(ssl->ctx->extensions, semaphore, 1);
wolfSSL 0:1239e9b70ca2 1648
wolfSSL 0:1239e9b70ca2 1649 if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
wolfSSL 0:1239e9b70ca2 1650 length += ssl->suites->hashSigAlgoSz + HELLO_EXT_LEN;
wolfSSL 0:1239e9b70ca2 1651 }
wolfSSL 0:1239e9b70ca2 1652
wolfSSL 0:1239e9b70ca2 1653 if (length)
wolfSSL 0:1239e9b70ca2 1654 length += OPAQUE16_LEN; /* for total length storage */
wolfSSL 0:1239e9b70ca2 1655
wolfSSL 0:1239e9b70ca2 1656 return length;
wolfSSL 0:1239e9b70ca2 1657 }
wolfSSL 0:1239e9b70ca2 1658
wolfSSL 0:1239e9b70ca2 1659 word16 TLSX_WriteRequest(CYASSL* ssl, byte* output)
wolfSSL 0:1239e9b70ca2 1660 {
wolfSSL 0:1239e9b70ca2 1661 word16 offset = 0;
wolfSSL 0:1239e9b70ca2 1662
wolfSSL 0:1239e9b70ca2 1663 if (ssl && IsTLS(ssl) && output) {
wolfSSL 0:1239e9b70ca2 1664 byte semaphore[16] = {0};
wolfSSL 0:1239e9b70ca2 1665
wolfSSL 0:1239e9b70ca2 1666 offset += OPAQUE16_LEN; /* extensions length */
wolfSSL 0:1239e9b70ca2 1667
wolfSSL 0:1239e9b70ca2 1668 EC_VALIDATE_REQUEST(ssl, semaphore);
wolfSSL 0:1239e9b70ca2 1669
wolfSSL 0:1239e9b70ca2 1670 if (ssl->extensions)
wolfSSL 0:1239e9b70ca2 1671 offset += TLSX_Write(ssl->extensions, output + offset,
wolfSSL 0:1239e9b70ca2 1672 semaphore, 1);
wolfSSL 0:1239e9b70ca2 1673
wolfSSL 0:1239e9b70ca2 1674 if (ssl->ctx && ssl->ctx->extensions)
wolfSSL 0:1239e9b70ca2 1675 offset += TLSX_Write(ssl->ctx->extensions, output + offset,
wolfSSL 0:1239e9b70ca2 1676 semaphore, 1);
wolfSSL 0:1239e9b70ca2 1677
wolfSSL 0:1239e9b70ca2 1678 if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
wolfSSL 0:1239e9b70ca2 1679 {
wolfSSL 0:1239e9b70ca2 1680 int i;
wolfSSL 0:1239e9b70ca2 1681 /* extension type */
wolfSSL 0:1239e9b70ca2 1682 c16toa(HELLO_EXT_SIG_ALGO, output + offset);
wolfSSL 0:1239e9b70ca2 1683 offset += HELLO_EXT_TYPE_SZ;
wolfSSL 0:1239e9b70ca2 1684
wolfSSL 0:1239e9b70ca2 1685 /* extension data length */
wolfSSL 0:1239e9b70ca2 1686 c16toa(OPAQUE16_LEN + ssl->suites->hashSigAlgoSz, output + offset);
wolfSSL 0:1239e9b70ca2 1687 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1688
wolfSSL 0:1239e9b70ca2 1689 /* sig algos length */
wolfSSL 0:1239e9b70ca2 1690 c16toa(ssl->suites->hashSigAlgoSz, output + offset);
wolfSSL 0:1239e9b70ca2 1691 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1692
wolfSSL 0:1239e9b70ca2 1693 /* sig algos */
wolfSSL 0:1239e9b70ca2 1694 for (i = 0; i < ssl->suites->hashSigAlgoSz; i++, offset++)
wolfSSL 0:1239e9b70ca2 1695 output[offset] = ssl->suites->hashSigAlgo[i];
wolfSSL 0:1239e9b70ca2 1696 }
wolfSSL 0:1239e9b70ca2 1697
wolfSSL 0:1239e9b70ca2 1698 if (offset > OPAQUE16_LEN)
wolfSSL 0:1239e9b70ca2 1699 c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
wolfSSL 0:1239e9b70ca2 1700 }
wolfSSL 0:1239e9b70ca2 1701
wolfSSL 0:1239e9b70ca2 1702 return offset;
wolfSSL 0:1239e9b70ca2 1703 }
wolfSSL 0:1239e9b70ca2 1704
wolfSSL 0:1239e9b70ca2 1705 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:1239e9b70ca2 1706
wolfSSL 0:1239e9b70ca2 1707 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 1708
wolfSSL 0:1239e9b70ca2 1709 word16 TLSX_GetResponseSize(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1710 {
wolfSSL 0:1239e9b70ca2 1711 word16 length = 0;
wolfSSL 0:1239e9b70ca2 1712 byte semaphore[16] = {0};
wolfSSL 0:1239e9b70ca2 1713
wolfSSL 0:1239e9b70ca2 1714 if (ssl && IsTLS(ssl))
wolfSSL 0:1239e9b70ca2 1715 length += TLSX_GetSize(ssl->extensions, semaphore, 0);
wolfSSL 0:1239e9b70ca2 1716
wolfSSL 0:1239e9b70ca2 1717 /* All the response data is set at the ssl object only, so no ctx here. */
wolfSSL 0:1239e9b70ca2 1718
wolfSSL 0:1239e9b70ca2 1719 if (length)
wolfSSL 0:1239e9b70ca2 1720 length += OPAQUE16_LEN; /* for total length storage */
wolfSSL 0:1239e9b70ca2 1721
wolfSSL 0:1239e9b70ca2 1722 return length;
wolfSSL 0:1239e9b70ca2 1723 }
wolfSSL 0:1239e9b70ca2 1724
wolfSSL 0:1239e9b70ca2 1725 word16 TLSX_WriteResponse(CYASSL *ssl, byte* output)
wolfSSL 0:1239e9b70ca2 1726 {
wolfSSL 0:1239e9b70ca2 1727 word16 offset = 0;
wolfSSL 0:1239e9b70ca2 1728
wolfSSL 0:1239e9b70ca2 1729 if (ssl && IsTLS(ssl) && output) {
wolfSSL 0:1239e9b70ca2 1730 byte semaphore[16] = {0};
wolfSSL 0:1239e9b70ca2 1731
wolfSSL 0:1239e9b70ca2 1732 offset += OPAQUE16_LEN; /* extensions length */
wolfSSL 0:1239e9b70ca2 1733
wolfSSL 0:1239e9b70ca2 1734 offset += TLSX_Write(ssl->extensions, output + offset, semaphore, 0);
wolfSSL 0:1239e9b70ca2 1735
wolfSSL 0:1239e9b70ca2 1736 if (offset > OPAQUE16_LEN)
wolfSSL 0:1239e9b70ca2 1737 c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
wolfSSL 0:1239e9b70ca2 1738 }
wolfSSL 0:1239e9b70ca2 1739
wolfSSL 0:1239e9b70ca2 1740 return offset;
wolfSSL 0:1239e9b70ca2 1741 }
wolfSSL 0:1239e9b70ca2 1742
wolfSSL 0:1239e9b70ca2 1743 #endif /* NO_CYASSL_SERVER */
wolfSSL 0:1239e9b70ca2 1744
wolfSSL 0:1239e9b70ca2 1745 int TLSX_Parse(CYASSL* ssl, byte* input, word16 length, byte isRequest,
wolfSSL 0:1239e9b70ca2 1746 Suites *suites)
wolfSSL 0:1239e9b70ca2 1747 {
wolfSSL 0:1239e9b70ca2 1748 int ret = 0;
wolfSSL 0:1239e9b70ca2 1749 word16 offset = 0;
wolfSSL 0:1239e9b70ca2 1750
wolfSSL 0:1239e9b70ca2 1751 if (!ssl || !input || !suites)
wolfSSL 0:1239e9b70ca2 1752 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1753
wolfSSL 0:1239e9b70ca2 1754 while (ret == 0 && offset < length) {
wolfSSL 0:1239e9b70ca2 1755 word16 type;
wolfSSL 0:1239e9b70ca2 1756 word16 size;
wolfSSL 0:1239e9b70ca2 1757
wolfSSL 0:1239e9b70ca2 1758 if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
wolfSSL 0:1239e9b70ca2 1759 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1760
wolfSSL 0:1239e9b70ca2 1761 ato16(input + offset, &type);
wolfSSL 0:1239e9b70ca2 1762 offset += HELLO_EXT_TYPE_SZ;
wolfSSL 0:1239e9b70ca2 1763
wolfSSL 0:1239e9b70ca2 1764 ato16(input + offset, &size);
wolfSSL 0:1239e9b70ca2 1765 offset += OPAQUE16_LEN;
wolfSSL 0:1239e9b70ca2 1766
wolfSSL 0:1239e9b70ca2 1767 if (offset + size > length)
wolfSSL 0:1239e9b70ca2 1768 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1769
wolfSSL 0:1239e9b70ca2 1770 switch (type) {
wolfSSL 0:1239e9b70ca2 1771 case SERVER_NAME_INDICATION:
wolfSSL 0:1239e9b70ca2 1772 CYASSL_MSG("SNI extension received");
wolfSSL 0:1239e9b70ca2 1773
wolfSSL 0:1239e9b70ca2 1774 ret = SNI_PARSE(ssl, input + offset, size, isRequest);
wolfSSL 0:1239e9b70ca2 1775 break;
wolfSSL 0:1239e9b70ca2 1776
wolfSSL 0:1239e9b70ca2 1777 case MAX_FRAGMENT_LENGTH:
wolfSSL 0:1239e9b70ca2 1778 CYASSL_MSG("Max Fragment Length extension received");
wolfSSL 0:1239e9b70ca2 1779
wolfSSL 0:1239e9b70ca2 1780 ret = MFL_PARSE(ssl, input + offset, size, isRequest);
wolfSSL 0:1239e9b70ca2 1781 break;
wolfSSL 0:1239e9b70ca2 1782
wolfSSL 0:1239e9b70ca2 1783 case TRUNCATED_HMAC:
wolfSSL 0:1239e9b70ca2 1784 CYASSL_MSG("Truncated HMAC extension received");
wolfSSL 0:1239e9b70ca2 1785
wolfSSL 0:1239e9b70ca2 1786 ret = THM_PARSE(ssl, input + offset, size, isRequest);
wolfSSL 0:1239e9b70ca2 1787 break;
wolfSSL 0:1239e9b70ca2 1788
wolfSSL 0:1239e9b70ca2 1789 case ELLIPTIC_CURVES:
wolfSSL 0:1239e9b70ca2 1790 CYASSL_MSG("Elliptic Curves extension received");
wolfSSL 0:1239e9b70ca2 1791
wolfSSL 0:1239e9b70ca2 1792 ret = EC_PARSE(ssl, input + offset, size, isRequest);
wolfSSL 0:1239e9b70ca2 1793 break;
wolfSSL 0:1239e9b70ca2 1794
wolfSSL 0:1239e9b70ca2 1795 case HELLO_EXT_SIG_ALGO:
wolfSSL 0:1239e9b70ca2 1796 if (isRequest) {
wolfSSL 0:1239e9b70ca2 1797 /* do not mess with offset inside the switch! */
wolfSSL 0:1239e9b70ca2 1798 if (IsAtLeastTLSv1_2(ssl)) {
wolfSSL 0:1239e9b70ca2 1799 ato16(input + offset, &suites->hashSigAlgoSz);
wolfSSL 0:1239e9b70ca2 1800
wolfSSL 0:1239e9b70ca2 1801 if (suites->hashSigAlgoSz > size - OPAQUE16_LEN)
wolfSSL 0:1239e9b70ca2 1802 return BUFFER_ERROR;
wolfSSL 0:1239e9b70ca2 1803
wolfSSL 0:1239e9b70ca2 1804 XMEMCPY(suites->hashSigAlgo,
wolfSSL 0:1239e9b70ca2 1805 input + offset + OPAQUE16_LEN,
wolfSSL 0:1239e9b70ca2 1806 min(suites->hashSigAlgoSz,
wolfSSL 0:1239e9b70ca2 1807 HELLO_EXT_SIGALGO_MAX));
wolfSSL 0:1239e9b70ca2 1808 }
wolfSSL 0:1239e9b70ca2 1809 } else {
wolfSSL 0:1239e9b70ca2 1810 CYASSL_MSG("Servers MUST NOT send SIG ALGO extension.");
wolfSSL 0:1239e9b70ca2 1811 }
wolfSSL 0:1239e9b70ca2 1812
wolfSSL 0:1239e9b70ca2 1813 break;
wolfSSL 0:1239e9b70ca2 1814 }
wolfSSL 0:1239e9b70ca2 1815
wolfSSL 0:1239e9b70ca2 1816 /* offset should be updated here! */
wolfSSL 0:1239e9b70ca2 1817 offset += size;
wolfSSL 0:1239e9b70ca2 1818 }
wolfSSL 0:1239e9b70ca2 1819
wolfSSL 0:1239e9b70ca2 1820 return ret;
wolfSSL 0:1239e9b70ca2 1821 }
wolfSSL 0:1239e9b70ca2 1822
wolfSSL 0:1239e9b70ca2 1823 /* undefining semaphore macros */
wolfSSL 0:1239e9b70ca2 1824 #undef IS_OFF
wolfSSL 0:1239e9b70ca2 1825 #undef TURN_ON
wolfSSL 0:1239e9b70ca2 1826
wolfSSL 0:1239e9b70ca2 1827 #elif defined(HAVE_SNI) \
wolfSSL 0:1239e9b70ca2 1828 || defined(HAVE_MAX_FRAGMENT) \
wolfSSL 0:1239e9b70ca2 1829 || defined(HAVE_TRUNCATED_HMAC) \
wolfSSL 0:1239e9b70ca2 1830 || defined(HAVE_SUPPORTED_CURVES)
wolfSSL 0:1239e9b70ca2 1831
wolfSSL 0:1239e9b70ca2 1832 #error "Using TLS extensions requires HAVE_TLS_EXTENSIONS to be defined."
wolfSSL 0:1239e9b70ca2 1833
wolfSSL 0:1239e9b70ca2 1834 #endif /* HAVE_TLS_EXTENSIONS */
wolfSSL 0:1239e9b70ca2 1835
wolfSSL 0:1239e9b70ca2 1836
wolfSSL 0:1239e9b70ca2 1837 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 1838
wolfSSL 0:1239e9b70ca2 1839 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 1840
wolfSSL 0:1239e9b70ca2 1841 CYASSL_METHOD* CyaTLSv1_client_method(void)
wolfSSL 0:1239e9b70ca2 1842 {
wolfSSL 0:1239e9b70ca2 1843 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1844 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1845 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1846 if (method)
wolfSSL 0:1239e9b70ca2 1847 InitSSL_Method(method, MakeTLSv1());
wolfSSL 0:1239e9b70ca2 1848 return method;
wolfSSL 0:1239e9b70ca2 1849 }
wolfSSL 0:1239e9b70ca2 1850
wolfSSL 0:1239e9b70ca2 1851
wolfSSL 0:1239e9b70ca2 1852 CYASSL_METHOD* CyaTLSv1_1_client_method(void)
wolfSSL 0:1239e9b70ca2 1853 {
wolfSSL 0:1239e9b70ca2 1854 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1855 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1856 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1857 if (method)
wolfSSL 0:1239e9b70ca2 1858 InitSSL_Method(method, MakeTLSv1_1());
wolfSSL 0:1239e9b70ca2 1859 return method;
wolfSSL 0:1239e9b70ca2 1860 }
wolfSSL 0:1239e9b70ca2 1861
wolfSSL 0:1239e9b70ca2 1862 #endif /* !NO_OLD_TLS */
wolfSSL 0:1239e9b70ca2 1863
wolfSSL 0:1239e9b70ca2 1864 #ifndef NO_SHA256 /* can't use without SHA256 */
wolfSSL 0:1239e9b70ca2 1865
wolfSSL 0:1239e9b70ca2 1866 CYASSL_METHOD* CyaTLSv1_2_client_method(void)
wolfSSL 0:1239e9b70ca2 1867 {
wolfSSL 0:1239e9b70ca2 1868 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1869 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1870 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1871 if (method)
wolfSSL 0:1239e9b70ca2 1872 InitSSL_Method(method, MakeTLSv1_2());
wolfSSL 0:1239e9b70ca2 1873 return method;
wolfSSL 0:1239e9b70ca2 1874 }
wolfSSL 0:1239e9b70ca2 1875
wolfSSL 0:1239e9b70ca2 1876 #endif
wolfSSL 0:1239e9b70ca2 1877
wolfSSL 0:1239e9b70ca2 1878
wolfSSL 0:1239e9b70ca2 1879 CYASSL_METHOD* CyaSSLv23_client_method(void)
wolfSSL 0:1239e9b70ca2 1880 {
wolfSSL 0:1239e9b70ca2 1881 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1882 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1883 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1884 if (method) {
wolfSSL 0:1239e9b70ca2 1885 #ifndef NO_SHA256 /* 1.2 requires SHA256 */
wolfSSL 0:1239e9b70ca2 1886 InitSSL_Method(method, MakeTLSv1_2());
wolfSSL 0:1239e9b70ca2 1887 #else
wolfSSL 0:1239e9b70ca2 1888 InitSSL_Method(method, MakeTLSv1_1());
wolfSSL 0:1239e9b70ca2 1889 #endif
wolfSSL 0:1239e9b70ca2 1890 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 1891 method->downgrade = 1;
wolfSSL 0:1239e9b70ca2 1892 #endif
wolfSSL 0:1239e9b70ca2 1893 }
wolfSSL 0:1239e9b70ca2 1894 return method;
wolfSSL 0:1239e9b70ca2 1895 }
wolfSSL 0:1239e9b70ca2 1896
wolfSSL 0:1239e9b70ca2 1897
wolfSSL 0:1239e9b70ca2 1898 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:1239e9b70ca2 1899
wolfSSL 0:1239e9b70ca2 1900
wolfSSL 0:1239e9b70ca2 1901
wolfSSL 0:1239e9b70ca2 1902 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 1903
wolfSSL 0:1239e9b70ca2 1904 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 1905
wolfSSL 0:1239e9b70ca2 1906 CYASSL_METHOD* CyaTLSv1_server_method(void)
wolfSSL 0:1239e9b70ca2 1907 {
wolfSSL 0:1239e9b70ca2 1908 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1909 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1910 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1911 if (method) {
wolfSSL 0:1239e9b70ca2 1912 InitSSL_Method(method, MakeTLSv1());
wolfSSL 0:1239e9b70ca2 1913 method->side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 1914 }
wolfSSL 0:1239e9b70ca2 1915 return method;
wolfSSL 0:1239e9b70ca2 1916 }
wolfSSL 0:1239e9b70ca2 1917
wolfSSL 0:1239e9b70ca2 1918
wolfSSL 0:1239e9b70ca2 1919 CYASSL_METHOD* CyaTLSv1_1_server_method(void)
wolfSSL 0:1239e9b70ca2 1920 {
wolfSSL 0:1239e9b70ca2 1921 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1922 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1923 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1924 if (method) {
wolfSSL 0:1239e9b70ca2 1925 InitSSL_Method(method, MakeTLSv1_1());
wolfSSL 0:1239e9b70ca2 1926 method->side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 1927 }
wolfSSL 0:1239e9b70ca2 1928 return method;
wolfSSL 0:1239e9b70ca2 1929 }
wolfSSL 0:1239e9b70ca2 1930
wolfSSL 0:1239e9b70ca2 1931 #endif /* !NO_OLD_TLS */
wolfSSL 0:1239e9b70ca2 1932
wolfSSL 0:1239e9b70ca2 1933 #ifndef NO_SHA256 /* can't use without SHA256 */
wolfSSL 0:1239e9b70ca2 1934
wolfSSL 0:1239e9b70ca2 1935 CYASSL_METHOD* CyaTLSv1_2_server_method(void)
wolfSSL 0:1239e9b70ca2 1936 {
wolfSSL 0:1239e9b70ca2 1937 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1938 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1939 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1940 if (method) {
wolfSSL 0:1239e9b70ca2 1941 InitSSL_Method(method, MakeTLSv1_2());
wolfSSL 0:1239e9b70ca2 1942 method->side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 1943 }
wolfSSL 0:1239e9b70ca2 1944 return method;
wolfSSL 0:1239e9b70ca2 1945 }
wolfSSL 0:1239e9b70ca2 1946
wolfSSL 0:1239e9b70ca2 1947 #endif
wolfSSL 0:1239e9b70ca2 1948
wolfSSL 0:1239e9b70ca2 1949
wolfSSL 0:1239e9b70ca2 1950 CYASSL_METHOD* CyaSSLv23_server_method(void)
wolfSSL 0:1239e9b70ca2 1951 {
wolfSSL 0:1239e9b70ca2 1952 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 1953 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 1954 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 1955 if (method) {
wolfSSL 0:1239e9b70ca2 1956 #ifndef NO_SHA256 /* 1.2 requires SHA256 */
wolfSSL 0:1239e9b70ca2 1957 InitSSL_Method(method, MakeTLSv1_2());
wolfSSL 0:1239e9b70ca2 1958 #else
wolfSSL 0:1239e9b70ca2 1959 InitSSL_Method(method, MakeTLSv1_1());
wolfSSL 0:1239e9b70ca2 1960 #endif
wolfSSL 0:1239e9b70ca2 1961 method->side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 1962 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 1963 method->downgrade = 1;
wolfSSL 0:1239e9b70ca2 1964 #endif /* !NO_OLD_TLS */
wolfSSL 0:1239e9b70ca2 1965 }
wolfSSL 0:1239e9b70ca2 1966 return method;
wolfSSL 0:1239e9b70ca2 1967 }
wolfSSL 0:1239e9b70ca2 1968
wolfSSL 0:1239e9b70ca2 1969
wolfSSL 0:1239e9b70ca2 1970
wolfSSL 0:1239e9b70ca2 1971 #endif /* NO_CYASSL_SERVER */
wolfSSL 0:1239e9b70ca2 1972 #endif /* NO_TLS */
wolfSSL 0:1239e9b70ca2 1973
wolfSSL 0:1239e9b70ca2 1974