Dependents:   blinky_max32630fthr

Committer:
switches
Date:
Fri Dec 16 16:27:57 2016 +0000
Revision:
3:1198227e6421
Parent:
0:5c4d7b2438d3
Changed ADC scale for MAX32625 platforms to 1.2V full scale to match MAX32630 platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
switches 0:5c4d7b2438d3 1 /*
switches 0:5c4d7b2438d3 2 * SSLv3/TLSv1 client-side functions
switches 0:5c4d7b2438d3 3 *
switches 0:5c4d7b2438d3 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
switches 0:5c4d7b2438d3 5 * SPDX-License-Identifier: Apache-2.0
switches 0:5c4d7b2438d3 6 *
switches 0:5c4d7b2438d3 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
switches 0:5c4d7b2438d3 8 * not use this file except in compliance with the License.
switches 0:5c4d7b2438d3 9 * You may obtain a copy of the License at
switches 0:5c4d7b2438d3 10 *
switches 0:5c4d7b2438d3 11 * http://www.apache.org/licenses/LICENSE-2.0
switches 0:5c4d7b2438d3 12 *
switches 0:5c4d7b2438d3 13 * Unless required by applicable law or agreed to in writing, software
switches 0:5c4d7b2438d3 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
switches 0:5c4d7b2438d3 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
switches 0:5c4d7b2438d3 16 * See the License for the specific language governing permissions and
switches 0:5c4d7b2438d3 17 * limitations under the License.
switches 0:5c4d7b2438d3 18 *
switches 0:5c4d7b2438d3 19 * This file is part of mbed TLS (https://tls.mbed.org)
switches 0:5c4d7b2438d3 20 */
switches 0:5c4d7b2438d3 21
switches 0:5c4d7b2438d3 22 #if !defined(MBEDTLS_CONFIG_FILE)
switches 0:5c4d7b2438d3 23 #include "mbedtls/config.h"
switches 0:5c4d7b2438d3 24 #else
switches 0:5c4d7b2438d3 25 #include MBEDTLS_CONFIG_FILE
switches 0:5c4d7b2438d3 26 #endif
switches 0:5c4d7b2438d3 27
switches 0:5c4d7b2438d3 28 #if defined(MBEDTLS_SSL_CLI_C)
switches 0:5c4d7b2438d3 29
switches 0:5c4d7b2438d3 30 #if defined(MBEDTLS_PLATFORM_C)
switches 0:5c4d7b2438d3 31 #include "mbedtls/platform.h"
switches 0:5c4d7b2438d3 32 #else
switches 0:5c4d7b2438d3 33 #include <stdlib.h>
switches 0:5c4d7b2438d3 34 #define mbedtls_calloc calloc
switches 0:5c4d7b2438d3 35 #define mbedtls_free free
switches 0:5c4d7b2438d3 36 #endif
switches 0:5c4d7b2438d3 37
switches 0:5c4d7b2438d3 38 #include "mbedtls/debug.h"
switches 0:5c4d7b2438d3 39 #include "mbedtls/ssl.h"
switches 0:5c4d7b2438d3 40 #include "mbedtls/ssl_internal.h"
switches 0:5c4d7b2438d3 41
switches 0:5c4d7b2438d3 42 #include <string.h>
switches 0:5c4d7b2438d3 43
switches 0:5c4d7b2438d3 44 #include <stdint.h>
switches 0:5c4d7b2438d3 45
switches 0:5c4d7b2438d3 46 #if defined(MBEDTLS_HAVE_TIME)
switches 0:5c4d7b2438d3 47 #include "mbedtls/platform_time.h"
switches 0:5c4d7b2438d3 48 #endif
switches 0:5c4d7b2438d3 49
switches 0:5c4d7b2438d3 50 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 51 /* Implementation that should never be optimized out by the compiler */
switches 0:5c4d7b2438d3 52 static void mbedtls_zeroize( void *v, size_t n ) {
switches 0:5c4d7b2438d3 53 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
switches 0:5c4d7b2438d3 54 }
switches 0:5c4d7b2438d3 55 #endif
switches 0:5c4d7b2438d3 56
switches 0:5c4d7b2438d3 57 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
switches 0:5c4d7b2438d3 58 static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 59 unsigned char *buf,
switches 0:5c4d7b2438d3 60 size_t *olen )
switches 0:5c4d7b2438d3 61 {
switches 0:5c4d7b2438d3 62 unsigned char *p = buf;
switches 0:5c4d7b2438d3 63 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 64 size_t hostname_len;
switches 0:5c4d7b2438d3 65
switches 0:5c4d7b2438d3 66 *olen = 0;
switches 0:5c4d7b2438d3 67
switches 0:5c4d7b2438d3 68 if( ssl->hostname == NULL )
switches 0:5c4d7b2438d3 69 return;
switches 0:5c4d7b2438d3 70
switches 0:5c4d7b2438d3 71 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
switches 0:5c4d7b2438d3 72 ssl->hostname ) );
switches 0:5c4d7b2438d3 73
switches 0:5c4d7b2438d3 74 hostname_len = strlen( ssl->hostname );
switches 0:5c4d7b2438d3 75
switches 0:5c4d7b2438d3 76 if( end < p || (size_t)( end - p ) < hostname_len + 9 )
switches 0:5c4d7b2438d3 77 {
switches 0:5c4d7b2438d3 78 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 79 return;
switches 0:5c4d7b2438d3 80 }
switches 0:5c4d7b2438d3 81
switches 0:5c4d7b2438d3 82 /*
switches 0:5c4d7b2438d3 83 * struct {
switches 0:5c4d7b2438d3 84 * NameType name_type;
switches 0:5c4d7b2438d3 85 * select (name_type) {
switches 0:5c4d7b2438d3 86 * case host_name: HostName;
switches 0:5c4d7b2438d3 87 * } name;
switches 0:5c4d7b2438d3 88 * } ServerName;
switches 0:5c4d7b2438d3 89 *
switches 0:5c4d7b2438d3 90 * enum {
switches 0:5c4d7b2438d3 91 * host_name(0), (255)
switches 0:5c4d7b2438d3 92 * } NameType;
switches 0:5c4d7b2438d3 93 *
switches 0:5c4d7b2438d3 94 * opaque HostName<1..2^16-1>;
switches 0:5c4d7b2438d3 95 *
switches 0:5c4d7b2438d3 96 * struct {
switches 0:5c4d7b2438d3 97 * ServerName server_name_list<1..2^16-1>
switches 0:5c4d7b2438d3 98 * } ServerNameList;
switches 0:5c4d7b2438d3 99 */
switches 0:5c4d7b2438d3 100 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 101 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF );
switches 0:5c4d7b2438d3 102
switches 0:5c4d7b2438d3 103 *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 104 *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF );
switches 0:5c4d7b2438d3 105
switches 0:5c4d7b2438d3 106 *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 107 *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF );
switches 0:5c4d7b2438d3 108
switches 0:5c4d7b2438d3 109 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
switches 0:5c4d7b2438d3 110 *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 111 *p++ = (unsigned char)( ( hostname_len ) & 0xFF );
switches 0:5c4d7b2438d3 112
switches 0:5c4d7b2438d3 113 memcpy( p, ssl->hostname, hostname_len );
switches 0:5c4d7b2438d3 114
switches 0:5c4d7b2438d3 115 *olen = hostname_len + 9;
switches 0:5c4d7b2438d3 116 }
switches 0:5c4d7b2438d3 117 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
switches 0:5c4d7b2438d3 118
switches 0:5c4d7b2438d3 119 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 120 static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 121 unsigned char *buf,
switches 0:5c4d7b2438d3 122 size_t *olen )
switches 0:5c4d7b2438d3 123 {
switches 0:5c4d7b2438d3 124 unsigned char *p = buf;
switches 0:5c4d7b2438d3 125 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 126
switches 0:5c4d7b2438d3 127 *olen = 0;
switches 0:5c4d7b2438d3 128
switches 0:5c4d7b2438d3 129 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
switches 0:5c4d7b2438d3 130 return;
switches 0:5c4d7b2438d3 131
switches 0:5c4d7b2438d3 132 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
switches 0:5c4d7b2438d3 133
switches 0:5c4d7b2438d3 134 if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len )
switches 0:5c4d7b2438d3 135 {
switches 0:5c4d7b2438d3 136 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 137 return;
switches 0:5c4d7b2438d3 138 }
switches 0:5c4d7b2438d3 139
switches 0:5c4d7b2438d3 140 /*
switches 0:5c4d7b2438d3 141 * Secure renegotiation
switches 0:5c4d7b2438d3 142 */
switches 0:5c4d7b2438d3 143 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 144 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
switches 0:5c4d7b2438d3 145
switches 0:5c4d7b2438d3 146 *p++ = 0x00;
switches 0:5c4d7b2438d3 147 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
switches 0:5c4d7b2438d3 148 *p++ = ssl->verify_data_len & 0xFF;
switches 0:5c4d7b2438d3 149
switches 0:5c4d7b2438d3 150 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
switches 0:5c4d7b2438d3 151
switches 0:5c4d7b2438d3 152 *olen = 5 + ssl->verify_data_len;
switches 0:5c4d7b2438d3 153 }
switches 0:5c4d7b2438d3 154 #endif /* MBEDTLS_SSL_RENEGOTIATION */
switches 0:5c4d7b2438d3 155
switches 0:5c4d7b2438d3 156 /*
switches 0:5c4d7b2438d3 157 * Only if we handle at least one key exchange that needs signatures.
switches 0:5c4d7b2438d3 158 */
switches 0:5c4d7b2438d3 159 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
switches 0:5c4d7b2438d3 160 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
switches 0:5c4d7b2438d3 161 static void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 162 unsigned char *buf,
switches 0:5c4d7b2438d3 163 size_t *olen )
switches 0:5c4d7b2438d3 164 {
switches 0:5c4d7b2438d3 165 unsigned char *p = buf;
switches 0:5c4d7b2438d3 166 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 167 size_t sig_alg_len = 0;
switches 0:5c4d7b2438d3 168 const int *md;
switches 0:5c4d7b2438d3 169 #if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
switches 0:5c4d7b2438d3 170 unsigned char *sig_alg_list = buf + 6;
switches 0:5c4d7b2438d3 171 #endif
switches 0:5c4d7b2438d3 172
switches 0:5c4d7b2438d3 173 *olen = 0;
switches 0:5c4d7b2438d3 174
switches 0:5c4d7b2438d3 175 if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
switches 0:5c4d7b2438d3 176 return;
switches 0:5c4d7b2438d3 177
switches 0:5c4d7b2438d3 178 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
switches 0:5c4d7b2438d3 179
switches 0:5c4d7b2438d3 180 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
switches 0:5c4d7b2438d3 181 {
switches 0:5c4d7b2438d3 182 #if defined(MBEDTLS_ECDSA_C)
switches 0:5c4d7b2438d3 183 sig_alg_len += 2;
switches 0:5c4d7b2438d3 184 #endif
switches 0:5c4d7b2438d3 185 #if defined(MBEDTLS_RSA_C)
switches 0:5c4d7b2438d3 186 sig_alg_len += 2;
switches 0:5c4d7b2438d3 187 #endif
switches 0:5c4d7b2438d3 188 }
switches 0:5c4d7b2438d3 189
switches 0:5c4d7b2438d3 190 if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )
switches 0:5c4d7b2438d3 191 {
switches 0:5c4d7b2438d3 192 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 193 return;
switches 0:5c4d7b2438d3 194 }
switches 0:5c4d7b2438d3 195
switches 0:5c4d7b2438d3 196 /*
switches 0:5c4d7b2438d3 197 * Prepare signature_algorithms extension (TLS 1.2)
switches 0:5c4d7b2438d3 198 */
switches 0:5c4d7b2438d3 199 sig_alg_len = 0;
switches 0:5c4d7b2438d3 200
switches 0:5c4d7b2438d3 201 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
switches 0:5c4d7b2438d3 202 {
switches 0:5c4d7b2438d3 203 #if defined(MBEDTLS_ECDSA_C)
switches 0:5c4d7b2438d3 204 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
switches 0:5c4d7b2438d3 205 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
switches 0:5c4d7b2438d3 206 #endif
switches 0:5c4d7b2438d3 207 #if defined(MBEDTLS_RSA_C)
switches 0:5c4d7b2438d3 208 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
switches 0:5c4d7b2438d3 209 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
switches 0:5c4d7b2438d3 210 #endif
switches 0:5c4d7b2438d3 211 }
switches 0:5c4d7b2438d3 212
switches 0:5c4d7b2438d3 213 /*
switches 0:5c4d7b2438d3 214 * enum {
switches 0:5c4d7b2438d3 215 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
switches 0:5c4d7b2438d3 216 * sha512(6), (255)
switches 0:5c4d7b2438d3 217 * } HashAlgorithm;
switches 0:5c4d7b2438d3 218 *
switches 0:5c4d7b2438d3 219 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
switches 0:5c4d7b2438d3 220 * SignatureAlgorithm;
switches 0:5c4d7b2438d3 221 *
switches 0:5c4d7b2438d3 222 * struct {
switches 0:5c4d7b2438d3 223 * HashAlgorithm hash;
switches 0:5c4d7b2438d3 224 * SignatureAlgorithm signature;
switches 0:5c4d7b2438d3 225 * } SignatureAndHashAlgorithm;
switches 0:5c4d7b2438d3 226 *
switches 0:5c4d7b2438d3 227 * SignatureAndHashAlgorithm
switches 0:5c4d7b2438d3 228 * supported_signature_algorithms<2..2^16-2>;
switches 0:5c4d7b2438d3 229 */
switches 0:5c4d7b2438d3 230 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 231 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF );
switches 0:5c4d7b2438d3 232
switches 0:5c4d7b2438d3 233 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 234 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
switches 0:5c4d7b2438d3 235
switches 0:5c4d7b2438d3 236 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 237 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
switches 0:5c4d7b2438d3 238
switches 0:5c4d7b2438d3 239 *olen = 6 + sig_alg_len;
switches 0:5c4d7b2438d3 240 }
switches 0:5c4d7b2438d3 241 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
switches 0:5c4d7b2438d3 242 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
switches 0:5c4d7b2438d3 243
switches 0:5c4d7b2438d3 244 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
switches 0:5c4d7b2438d3 245 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 246 static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 247 unsigned char *buf,
switches 0:5c4d7b2438d3 248 size_t *olen )
switches 0:5c4d7b2438d3 249 {
switches 0:5c4d7b2438d3 250 unsigned char *p = buf;
switches 0:5c4d7b2438d3 251 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 252 unsigned char *elliptic_curve_list = p + 6;
switches 0:5c4d7b2438d3 253 size_t elliptic_curve_len = 0;
switches 0:5c4d7b2438d3 254 const mbedtls_ecp_curve_info *info;
switches 0:5c4d7b2438d3 255 #if defined(MBEDTLS_ECP_C)
switches 0:5c4d7b2438d3 256 const mbedtls_ecp_group_id *grp_id;
switches 0:5c4d7b2438d3 257 #else
switches 0:5c4d7b2438d3 258 ((void) ssl);
switches 0:5c4d7b2438d3 259 #endif
switches 0:5c4d7b2438d3 260
switches 0:5c4d7b2438d3 261 *olen = 0;
switches 0:5c4d7b2438d3 262
switches 0:5c4d7b2438d3 263 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
switches 0:5c4d7b2438d3 264
switches 0:5c4d7b2438d3 265 #if defined(MBEDTLS_ECP_C)
switches 0:5c4d7b2438d3 266 for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
switches 0:5c4d7b2438d3 267 {
switches 0:5c4d7b2438d3 268 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
switches 0:5c4d7b2438d3 269 #else
switches 0:5c4d7b2438d3 270 for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
switches 0:5c4d7b2438d3 271 {
switches 0:5c4d7b2438d3 272 #endif
switches 0:5c4d7b2438d3 273 if( info == NULL )
switches 0:5c4d7b2438d3 274 {
switches 0:5c4d7b2438d3 275 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid curve in ssl configuration" ) );
switches 0:5c4d7b2438d3 276 return;
switches 0:5c4d7b2438d3 277 }
switches 0:5c4d7b2438d3 278
switches 0:5c4d7b2438d3 279 elliptic_curve_len += 2;
switches 0:5c4d7b2438d3 280 }
switches 0:5c4d7b2438d3 281
switches 0:5c4d7b2438d3 282 if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )
switches 0:5c4d7b2438d3 283 {
switches 0:5c4d7b2438d3 284 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 285 return;
switches 0:5c4d7b2438d3 286 }
switches 0:5c4d7b2438d3 287
switches 0:5c4d7b2438d3 288 elliptic_curve_len = 0;
switches 0:5c4d7b2438d3 289
switches 0:5c4d7b2438d3 290 #if defined(MBEDTLS_ECP_C)
switches 0:5c4d7b2438d3 291 for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
switches 0:5c4d7b2438d3 292 {
switches 0:5c4d7b2438d3 293 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
switches 0:5c4d7b2438d3 294 #else
switches 0:5c4d7b2438d3 295 for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
switches 0:5c4d7b2438d3 296 {
switches 0:5c4d7b2438d3 297 #endif
switches 0:5c4d7b2438d3 298 elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
switches 0:5c4d7b2438d3 299 elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
switches 0:5c4d7b2438d3 300 }
switches 0:5c4d7b2438d3 301
switches 0:5c4d7b2438d3 302 if( elliptic_curve_len == 0 )
switches 0:5c4d7b2438d3 303 return;
switches 0:5c4d7b2438d3 304
switches 0:5c4d7b2438d3 305 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 306 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
switches 0:5c4d7b2438d3 307
switches 0:5c4d7b2438d3 308 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 309 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
switches 0:5c4d7b2438d3 310
switches 0:5c4d7b2438d3 311 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 312 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
switches 0:5c4d7b2438d3 313
switches 0:5c4d7b2438d3 314 *olen = 6 + elliptic_curve_len;
switches 0:5c4d7b2438d3 315 }
switches 0:5c4d7b2438d3 316
switches 0:5c4d7b2438d3 317 static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 318 unsigned char *buf,
switches 0:5c4d7b2438d3 319 size_t *olen )
switches 0:5c4d7b2438d3 320 {
switches 0:5c4d7b2438d3 321 unsigned char *p = buf;
switches 0:5c4d7b2438d3 322 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 323
switches 0:5c4d7b2438d3 324 *olen = 0;
switches 0:5c4d7b2438d3 325
switches 0:5c4d7b2438d3 326 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
switches 0:5c4d7b2438d3 327
switches 0:5c4d7b2438d3 328 if( end < p || (size_t)( end - p ) < 6 )
switches 0:5c4d7b2438d3 329 {
switches 0:5c4d7b2438d3 330 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 331 return;
switches 0:5c4d7b2438d3 332 }
switches 0:5c4d7b2438d3 333
switches 0:5c4d7b2438d3 334 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 335 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
switches 0:5c4d7b2438d3 336
switches 0:5c4d7b2438d3 337 *p++ = 0x00;
switches 0:5c4d7b2438d3 338 *p++ = 2;
switches 0:5c4d7b2438d3 339
switches 0:5c4d7b2438d3 340 *p++ = 1;
switches 0:5c4d7b2438d3 341 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
switches 0:5c4d7b2438d3 342
switches 0:5c4d7b2438d3 343 *olen = 6;
switches 0:5c4d7b2438d3 344 }
switches 0:5c4d7b2438d3 345 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
switches 0:5c4d7b2438d3 346 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
switches 0:5c4d7b2438d3 347
switches 0:5c4d7b2438d3 348 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 349 static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 350 unsigned char *buf,
switches 0:5c4d7b2438d3 351 size_t *olen )
switches 0:5c4d7b2438d3 352 {
switches 0:5c4d7b2438d3 353 int ret;
switches 0:5c4d7b2438d3 354 unsigned char *p = buf;
switches 0:5c4d7b2438d3 355 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 356 size_t kkpp_len;
switches 0:5c4d7b2438d3 357
switches 0:5c4d7b2438d3 358 *olen = 0;
switches 0:5c4d7b2438d3 359
switches 0:5c4d7b2438d3 360 /* Skip costly extension if we can't use EC J-PAKE anyway */
switches 0:5c4d7b2438d3 361 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
switches 0:5c4d7b2438d3 362 return;
switches 0:5c4d7b2438d3 363
switches 0:5c4d7b2438d3 364 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) );
switches 0:5c4d7b2438d3 365
switches 0:5c4d7b2438d3 366 if( end - p < 4 )
switches 0:5c4d7b2438d3 367 {
switches 0:5c4d7b2438d3 368 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 369 return;
switches 0:5c4d7b2438d3 370 }
switches 0:5c4d7b2438d3 371
switches 0:5c4d7b2438d3 372 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 373 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
switches 0:5c4d7b2438d3 374
switches 0:5c4d7b2438d3 375 /*
switches 0:5c4d7b2438d3 376 * We may need to send ClientHello multiple times for Hello verification.
switches 0:5c4d7b2438d3 377 * We don't want to compute fresh values every time (both for performance
switches 0:5c4d7b2438d3 378 * and consistency reasons), so cache the extension content.
switches 0:5c4d7b2438d3 379 */
switches 0:5c4d7b2438d3 380 if( ssl->handshake->ecjpake_cache == NULL ||
switches 0:5c4d7b2438d3 381 ssl->handshake->ecjpake_cache_len == 0 )
switches 0:5c4d7b2438d3 382 {
switches 0:5c4d7b2438d3 383 MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
switches 0:5c4d7b2438d3 384
switches 0:5c4d7b2438d3 385 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
switches 0:5c4d7b2438d3 386 p + 2, end - p - 2, &kkpp_len,
switches 0:5c4d7b2438d3 387 ssl->conf->f_rng, ssl->conf->p_rng );
switches 0:5c4d7b2438d3 388 if( ret != 0 )
switches 0:5c4d7b2438d3 389 {
switches 0:5c4d7b2438d3 390 MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
switches 0:5c4d7b2438d3 391 return;
switches 0:5c4d7b2438d3 392 }
switches 0:5c4d7b2438d3 393
switches 0:5c4d7b2438d3 394 ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
switches 0:5c4d7b2438d3 395 if( ssl->handshake->ecjpake_cache == NULL )
switches 0:5c4d7b2438d3 396 {
switches 0:5c4d7b2438d3 397 MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
switches 0:5c4d7b2438d3 398 return;
switches 0:5c4d7b2438d3 399 }
switches 0:5c4d7b2438d3 400
switches 0:5c4d7b2438d3 401 memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
switches 0:5c4d7b2438d3 402 ssl->handshake->ecjpake_cache_len = kkpp_len;
switches 0:5c4d7b2438d3 403 }
switches 0:5c4d7b2438d3 404 else
switches 0:5c4d7b2438d3 405 {
switches 0:5c4d7b2438d3 406 MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
switches 0:5c4d7b2438d3 407
switches 0:5c4d7b2438d3 408 kkpp_len = ssl->handshake->ecjpake_cache_len;
switches 0:5c4d7b2438d3 409
switches 0:5c4d7b2438d3 410 if( (size_t)( end - p - 2 ) < kkpp_len )
switches 0:5c4d7b2438d3 411 {
switches 0:5c4d7b2438d3 412 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 413 return;
switches 0:5c4d7b2438d3 414 }
switches 0:5c4d7b2438d3 415
switches 0:5c4d7b2438d3 416 memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
switches 0:5c4d7b2438d3 417 }
switches 0:5c4d7b2438d3 418
switches 0:5c4d7b2438d3 419 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 420 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
switches 0:5c4d7b2438d3 421
switches 0:5c4d7b2438d3 422 *olen = kkpp_len + 4;
switches 0:5c4d7b2438d3 423 }
switches 0:5c4d7b2438d3 424 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
switches 0:5c4d7b2438d3 425
switches 0:5c4d7b2438d3 426 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
switches 0:5c4d7b2438d3 427 static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 428 unsigned char *buf,
switches 0:5c4d7b2438d3 429 size_t *olen )
switches 0:5c4d7b2438d3 430 {
switches 0:5c4d7b2438d3 431 unsigned char *p = buf;
switches 0:5c4d7b2438d3 432 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 433
switches 0:5c4d7b2438d3 434 *olen = 0;
switches 0:5c4d7b2438d3 435
switches 0:5c4d7b2438d3 436 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) {
switches 0:5c4d7b2438d3 437 return;
switches 0:5c4d7b2438d3 438 }
switches 0:5c4d7b2438d3 439
switches 0:5c4d7b2438d3 440 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
switches 0:5c4d7b2438d3 441
switches 0:5c4d7b2438d3 442 if( end < p || (size_t)( end - p ) < 5 )
switches 0:5c4d7b2438d3 443 {
switches 0:5c4d7b2438d3 444 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 445 return;
switches 0:5c4d7b2438d3 446 }
switches 0:5c4d7b2438d3 447
switches 0:5c4d7b2438d3 448 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 449 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
switches 0:5c4d7b2438d3 450
switches 0:5c4d7b2438d3 451 *p++ = 0x00;
switches 0:5c4d7b2438d3 452 *p++ = 1;
switches 0:5c4d7b2438d3 453
switches 0:5c4d7b2438d3 454 *p++ = ssl->conf->mfl_code;
switches 0:5c4d7b2438d3 455
switches 0:5c4d7b2438d3 456 *olen = 5;
switches 0:5c4d7b2438d3 457 }
switches 0:5c4d7b2438d3 458 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
switches 0:5c4d7b2438d3 459
switches 0:5c4d7b2438d3 460 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
switches 0:5c4d7b2438d3 461 static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 462 unsigned char *buf, size_t *olen )
switches 0:5c4d7b2438d3 463 {
switches 0:5c4d7b2438d3 464 unsigned char *p = buf;
switches 0:5c4d7b2438d3 465 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 466
switches 0:5c4d7b2438d3 467 *olen = 0;
switches 0:5c4d7b2438d3 468
switches 0:5c4d7b2438d3 469 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
switches 0:5c4d7b2438d3 470 {
switches 0:5c4d7b2438d3 471 return;
switches 0:5c4d7b2438d3 472 }
switches 0:5c4d7b2438d3 473
switches 0:5c4d7b2438d3 474 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
switches 0:5c4d7b2438d3 475
switches 0:5c4d7b2438d3 476 if( end < p || (size_t)( end - p ) < 4 )
switches 0:5c4d7b2438d3 477 {
switches 0:5c4d7b2438d3 478 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 479 return;
switches 0:5c4d7b2438d3 480 }
switches 0:5c4d7b2438d3 481
switches 0:5c4d7b2438d3 482 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 483 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
switches 0:5c4d7b2438d3 484
switches 0:5c4d7b2438d3 485 *p++ = 0x00;
switches 0:5c4d7b2438d3 486 *p++ = 0x00;
switches 0:5c4d7b2438d3 487
switches 0:5c4d7b2438d3 488 *olen = 4;
switches 0:5c4d7b2438d3 489 }
switches 0:5c4d7b2438d3 490 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
switches 0:5c4d7b2438d3 491
switches 0:5c4d7b2438d3 492 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
switches 0:5c4d7b2438d3 493 static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 494 unsigned char *buf, size_t *olen )
switches 0:5c4d7b2438d3 495 {
switches 0:5c4d7b2438d3 496 unsigned char *p = buf;
switches 0:5c4d7b2438d3 497 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 498
switches 0:5c4d7b2438d3 499 *olen = 0;
switches 0:5c4d7b2438d3 500
switches 0:5c4d7b2438d3 501 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
switches 0:5c4d7b2438d3 502 ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
switches 0:5c4d7b2438d3 503 {
switches 0:5c4d7b2438d3 504 return;
switches 0:5c4d7b2438d3 505 }
switches 0:5c4d7b2438d3 506
switches 0:5c4d7b2438d3 507 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
switches 0:5c4d7b2438d3 508 "extension" ) );
switches 0:5c4d7b2438d3 509
switches 0:5c4d7b2438d3 510 if( end < p || (size_t)( end - p ) < 4 )
switches 0:5c4d7b2438d3 511 {
switches 0:5c4d7b2438d3 512 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 513 return;
switches 0:5c4d7b2438d3 514 }
switches 0:5c4d7b2438d3 515
switches 0:5c4d7b2438d3 516 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 517 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
switches 0:5c4d7b2438d3 518
switches 0:5c4d7b2438d3 519 *p++ = 0x00;
switches 0:5c4d7b2438d3 520 *p++ = 0x00;
switches 0:5c4d7b2438d3 521
switches 0:5c4d7b2438d3 522 *olen = 4;
switches 0:5c4d7b2438d3 523 }
switches 0:5c4d7b2438d3 524 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
switches 0:5c4d7b2438d3 525
switches 0:5c4d7b2438d3 526 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
switches 0:5c4d7b2438d3 527 static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 528 unsigned char *buf, size_t *olen )
switches 0:5c4d7b2438d3 529 {
switches 0:5c4d7b2438d3 530 unsigned char *p = buf;
switches 0:5c4d7b2438d3 531 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 532
switches 0:5c4d7b2438d3 533 *olen = 0;
switches 0:5c4d7b2438d3 534
switches 0:5c4d7b2438d3 535 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
switches 0:5c4d7b2438d3 536 ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
switches 0:5c4d7b2438d3 537 {
switches 0:5c4d7b2438d3 538 return;
switches 0:5c4d7b2438d3 539 }
switches 0:5c4d7b2438d3 540
switches 0:5c4d7b2438d3 541 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
switches 0:5c4d7b2438d3 542 "extension" ) );
switches 0:5c4d7b2438d3 543
switches 0:5c4d7b2438d3 544 if( end < p || (size_t)( end - p ) < 4 )
switches 0:5c4d7b2438d3 545 {
switches 0:5c4d7b2438d3 546 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 547 return;
switches 0:5c4d7b2438d3 548 }
switches 0:5c4d7b2438d3 549
switches 0:5c4d7b2438d3 550 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 551 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
switches 0:5c4d7b2438d3 552
switches 0:5c4d7b2438d3 553 *p++ = 0x00;
switches 0:5c4d7b2438d3 554 *p++ = 0x00;
switches 0:5c4d7b2438d3 555
switches 0:5c4d7b2438d3 556 *olen = 4;
switches 0:5c4d7b2438d3 557 }
switches 0:5c4d7b2438d3 558 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
switches 0:5c4d7b2438d3 559
switches 0:5c4d7b2438d3 560 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 561 static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 562 unsigned char *buf, size_t *olen )
switches 0:5c4d7b2438d3 563 {
switches 0:5c4d7b2438d3 564 unsigned char *p = buf;
switches 0:5c4d7b2438d3 565 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 566 size_t tlen = ssl->session_negotiate->ticket_len;
switches 0:5c4d7b2438d3 567
switches 0:5c4d7b2438d3 568 *olen = 0;
switches 0:5c4d7b2438d3 569
switches 0:5c4d7b2438d3 570 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
switches 0:5c4d7b2438d3 571 {
switches 0:5c4d7b2438d3 572 return;
switches 0:5c4d7b2438d3 573 }
switches 0:5c4d7b2438d3 574
switches 0:5c4d7b2438d3 575 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
switches 0:5c4d7b2438d3 576
switches 0:5c4d7b2438d3 577 if( end < p || (size_t)( end - p ) < 4 + tlen )
switches 0:5c4d7b2438d3 578 {
switches 0:5c4d7b2438d3 579 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 580 return;
switches 0:5c4d7b2438d3 581 }
switches 0:5c4d7b2438d3 582
switches 0:5c4d7b2438d3 583 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 584 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
switches 0:5c4d7b2438d3 585
switches 0:5c4d7b2438d3 586 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 587 *p++ = (unsigned char)( ( tlen ) & 0xFF );
switches 0:5c4d7b2438d3 588
switches 0:5c4d7b2438d3 589 *olen = 4;
switches 0:5c4d7b2438d3 590
switches 0:5c4d7b2438d3 591 if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
switches 0:5c4d7b2438d3 592 {
switches 0:5c4d7b2438d3 593 return;
switches 0:5c4d7b2438d3 594 }
switches 0:5c4d7b2438d3 595
switches 0:5c4d7b2438d3 596 MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
switches 0:5c4d7b2438d3 597
switches 0:5c4d7b2438d3 598 memcpy( p, ssl->session_negotiate->ticket, tlen );
switches 0:5c4d7b2438d3 599
switches 0:5c4d7b2438d3 600 *olen += tlen;
switches 0:5c4d7b2438d3 601 }
switches 0:5c4d7b2438d3 602 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
switches 0:5c4d7b2438d3 603
switches 0:5c4d7b2438d3 604 #if defined(MBEDTLS_SSL_ALPN)
switches 0:5c4d7b2438d3 605 static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 606 unsigned char *buf, size_t *olen )
switches 0:5c4d7b2438d3 607 {
switches 0:5c4d7b2438d3 608 unsigned char *p = buf;
switches 0:5c4d7b2438d3 609 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
switches 0:5c4d7b2438d3 610 size_t alpnlen = 0;
switches 0:5c4d7b2438d3 611 const char **cur;
switches 0:5c4d7b2438d3 612
switches 0:5c4d7b2438d3 613 *olen = 0;
switches 0:5c4d7b2438d3 614
switches 0:5c4d7b2438d3 615 if( ssl->conf->alpn_list == NULL )
switches 0:5c4d7b2438d3 616 {
switches 0:5c4d7b2438d3 617 return;
switches 0:5c4d7b2438d3 618 }
switches 0:5c4d7b2438d3 619
switches 0:5c4d7b2438d3 620 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
switches 0:5c4d7b2438d3 621
switches 0:5c4d7b2438d3 622 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
switches 0:5c4d7b2438d3 623 alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;
switches 0:5c4d7b2438d3 624
switches 0:5c4d7b2438d3 625 if( end < p || (size_t)( end - p ) < 6 + alpnlen )
switches 0:5c4d7b2438d3 626 {
switches 0:5c4d7b2438d3 627 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
switches 0:5c4d7b2438d3 628 return;
switches 0:5c4d7b2438d3 629 }
switches 0:5c4d7b2438d3 630
switches 0:5c4d7b2438d3 631 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 632 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
switches 0:5c4d7b2438d3 633
switches 0:5c4d7b2438d3 634 /*
switches 0:5c4d7b2438d3 635 * opaque ProtocolName<1..2^8-1>;
switches 0:5c4d7b2438d3 636 *
switches 0:5c4d7b2438d3 637 * struct {
switches 0:5c4d7b2438d3 638 * ProtocolName protocol_name_list<2..2^16-1>
switches 0:5c4d7b2438d3 639 * } ProtocolNameList;
switches 0:5c4d7b2438d3 640 */
switches 0:5c4d7b2438d3 641
switches 0:5c4d7b2438d3 642 /* Skip writing extension and list length for now */
switches 0:5c4d7b2438d3 643 p += 4;
switches 0:5c4d7b2438d3 644
switches 0:5c4d7b2438d3 645 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
switches 0:5c4d7b2438d3 646 {
switches 0:5c4d7b2438d3 647 *p = (unsigned char)( strlen( *cur ) & 0xFF );
switches 0:5c4d7b2438d3 648 memcpy( p + 1, *cur, *p );
switches 0:5c4d7b2438d3 649 p += 1 + *p;
switches 0:5c4d7b2438d3 650 }
switches 0:5c4d7b2438d3 651
switches 0:5c4d7b2438d3 652 *olen = p - buf;
switches 0:5c4d7b2438d3 653
switches 0:5c4d7b2438d3 654 /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
switches 0:5c4d7b2438d3 655 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 656 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
switches 0:5c4d7b2438d3 657
switches 0:5c4d7b2438d3 658 /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
switches 0:5c4d7b2438d3 659 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 660 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
switches 0:5c4d7b2438d3 661 }
switches 0:5c4d7b2438d3 662 #endif /* MBEDTLS_SSL_ALPN */
switches 0:5c4d7b2438d3 663
switches 0:5c4d7b2438d3 664 /*
switches 0:5c4d7b2438d3 665 * Generate random bytes for ClientHello
switches 0:5c4d7b2438d3 666 */
switches 0:5c4d7b2438d3 667 static int ssl_generate_random( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 668 {
switches 0:5c4d7b2438d3 669 int ret;
switches 0:5c4d7b2438d3 670 unsigned char *p = ssl->handshake->randbytes;
switches 0:5c4d7b2438d3 671 #if defined(MBEDTLS_HAVE_TIME)
switches 0:5c4d7b2438d3 672 mbedtls_time_t t;
switches 0:5c4d7b2438d3 673 #endif
switches 0:5c4d7b2438d3 674
switches 0:5c4d7b2438d3 675 /*
switches 0:5c4d7b2438d3 676 * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
switches 0:5c4d7b2438d3 677 */
switches 0:5c4d7b2438d3 678 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 679 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
switches 0:5c4d7b2438d3 680 ssl->handshake->verify_cookie != NULL )
switches 0:5c4d7b2438d3 681 {
switches 0:5c4d7b2438d3 682 return( 0 );
switches 0:5c4d7b2438d3 683 }
switches 0:5c4d7b2438d3 684 #endif
switches 0:5c4d7b2438d3 685
switches 0:5c4d7b2438d3 686 #if defined(MBEDTLS_HAVE_TIME)
switches 0:5c4d7b2438d3 687 t = mbedtls_time( NULL );
switches 0:5c4d7b2438d3 688 *p++ = (unsigned char)( t >> 24 );
switches 0:5c4d7b2438d3 689 *p++ = (unsigned char)( t >> 16 );
switches 0:5c4d7b2438d3 690 *p++ = (unsigned char)( t >> 8 );
switches 0:5c4d7b2438d3 691 *p++ = (unsigned char)( t );
switches 0:5c4d7b2438d3 692
switches 0:5c4d7b2438d3 693 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
switches 0:5c4d7b2438d3 694 #else
switches 0:5c4d7b2438d3 695 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
switches 0:5c4d7b2438d3 696 return( ret );
switches 0:5c4d7b2438d3 697
switches 0:5c4d7b2438d3 698 p += 4;
switches 0:5c4d7b2438d3 699 #endif /* MBEDTLS_HAVE_TIME */
switches 0:5c4d7b2438d3 700
switches 0:5c4d7b2438d3 701 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
switches 0:5c4d7b2438d3 702 return( ret );
switches 0:5c4d7b2438d3 703
switches 0:5c4d7b2438d3 704 return( 0 );
switches 0:5c4d7b2438d3 705 }
switches 0:5c4d7b2438d3 706
switches 0:5c4d7b2438d3 707 static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 708 {
switches 0:5c4d7b2438d3 709 int ret;
switches 0:5c4d7b2438d3 710 size_t i, n, olen, ext_len = 0;
switches 0:5c4d7b2438d3 711 unsigned char *buf;
switches 0:5c4d7b2438d3 712 unsigned char *p, *q;
switches 0:5c4d7b2438d3 713 unsigned char offer_compress;
switches 0:5c4d7b2438d3 714 const int *ciphersuites;
switches 0:5c4d7b2438d3 715 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
switches 0:5c4d7b2438d3 716
switches 0:5c4d7b2438d3 717 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
switches 0:5c4d7b2438d3 718
switches 0:5c4d7b2438d3 719 if( ssl->conf->f_rng == NULL )
switches 0:5c4d7b2438d3 720 {
switches 0:5c4d7b2438d3 721 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
switches 0:5c4d7b2438d3 722 return( MBEDTLS_ERR_SSL_NO_RNG );
switches 0:5c4d7b2438d3 723 }
switches 0:5c4d7b2438d3 724
switches 0:5c4d7b2438d3 725 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 726 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
switches 0:5c4d7b2438d3 727 #endif
switches 0:5c4d7b2438d3 728 {
switches 0:5c4d7b2438d3 729 ssl->major_ver = ssl->conf->min_major_ver;
switches 0:5c4d7b2438d3 730 ssl->minor_ver = ssl->conf->min_minor_ver;
switches 0:5c4d7b2438d3 731 }
switches 0:5c4d7b2438d3 732
switches 0:5c4d7b2438d3 733 if( ssl->conf->max_major_ver == 0 )
switches 0:5c4d7b2438d3 734 {
switches 0:5c4d7b2438d3 735 MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, "
switches 0:5c4d7b2438d3 736 "consider using mbedtls_ssl_config_defaults()" ) );
switches 0:5c4d7b2438d3 737 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
switches 0:5c4d7b2438d3 738 }
switches 0:5c4d7b2438d3 739
switches 0:5c4d7b2438d3 740 /*
switches 0:5c4d7b2438d3 741 * 0 . 0 handshake type
switches 0:5c4d7b2438d3 742 * 1 . 3 handshake length
switches 0:5c4d7b2438d3 743 * 4 . 5 highest version supported
switches 0:5c4d7b2438d3 744 * 6 . 9 current UNIX time
switches 0:5c4d7b2438d3 745 * 10 . 37 random bytes
switches 0:5c4d7b2438d3 746 */
switches 0:5c4d7b2438d3 747 buf = ssl->out_msg;
switches 0:5c4d7b2438d3 748 p = buf + 4;
switches 0:5c4d7b2438d3 749
switches 0:5c4d7b2438d3 750 mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
switches 0:5c4d7b2438d3 751 ssl->conf->transport, p );
switches 0:5c4d7b2438d3 752 p += 2;
switches 0:5c4d7b2438d3 753
switches 0:5c4d7b2438d3 754 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
switches 0:5c4d7b2438d3 755 buf[4], buf[5] ) );
switches 0:5c4d7b2438d3 756
switches 0:5c4d7b2438d3 757 if( ( ret = ssl_generate_random( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 758 {
switches 0:5c4d7b2438d3 759 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
switches 0:5c4d7b2438d3 760 return( ret );
switches 0:5c4d7b2438d3 761 }
switches 0:5c4d7b2438d3 762
switches 0:5c4d7b2438d3 763 memcpy( p, ssl->handshake->randbytes, 32 );
switches 0:5c4d7b2438d3 764 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
switches 0:5c4d7b2438d3 765 p += 32;
switches 0:5c4d7b2438d3 766
switches 0:5c4d7b2438d3 767 /*
switches 0:5c4d7b2438d3 768 * 38 . 38 session id length
switches 0:5c4d7b2438d3 769 * 39 . 39+n session id
switches 0:5c4d7b2438d3 770 * 39+n . 39+n DTLS only: cookie length (1 byte)
switches 0:5c4d7b2438d3 771 * 40+n . .. DTSL only: cookie
switches 0:5c4d7b2438d3 772 * .. . .. ciphersuitelist length (2 bytes)
switches 0:5c4d7b2438d3 773 * .. . .. ciphersuitelist
switches 0:5c4d7b2438d3 774 * .. . .. compression methods length (1 byte)
switches 0:5c4d7b2438d3 775 * .. . .. compression methods
switches 0:5c4d7b2438d3 776 * .. . .. extensions length (2 bytes)
switches 0:5c4d7b2438d3 777 * .. . .. extensions
switches 0:5c4d7b2438d3 778 */
switches 0:5c4d7b2438d3 779 n = ssl->session_negotiate->id_len;
switches 0:5c4d7b2438d3 780
switches 0:5c4d7b2438d3 781 if( n < 16 || n > 32 ||
switches 0:5c4d7b2438d3 782 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 783 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
switches 0:5c4d7b2438d3 784 #endif
switches 0:5c4d7b2438d3 785 ssl->handshake->resume == 0 )
switches 0:5c4d7b2438d3 786 {
switches 0:5c4d7b2438d3 787 n = 0;
switches 0:5c4d7b2438d3 788 }
switches 0:5c4d7b2438d3 789
switches 0:5c4d7b2438d3 790 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 791 /*
switches 0:5c4d7b2438d3 792 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
switches 0:5c4d7b2438d3 793 * generate and include a Session ID in the TLS ClientHello."
switches 0:5c4d7b2438d3 794 */
switches 0:5c4d7b2438d3 795 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 796 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
switches 0:5c4d7b2438d3 797 #endif
switches 0:5c4d7b2438d3 798 {
switches 0:5c4d7b2438d3 799 if( ssl->session_negotiate->ticket != NULL &&
switches 0:5c4d7b2438d3 800 ssl->session_negotiate->ticket_len != 0 )
switches 0:5c4d7b2438d3 801 {
switches 0:5c4d7b2438d3 802 ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 32 );
switches 0:5c4d7b2438d3 803
switches 0:5c4d7b2438d3 804 if( ret != 0 )
switches 0:5c4d7b2438d3 805 return( ret );
switches 0:5c4d7b2438d3 806
switches 0:5c4d7b2438d3 807 ssl->session_negotiate->id_len = n = 32;
switches 0:5c4d7b2438d3 808 }
switches 0:5c4d7b2438d3 809 }
switches 0:5c4d7b2438d3 810 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
switches 0:5c4d7b2438d3 811
switches 0:5c4d7b2438d3 812 *p++ = (unsigned char) n;
switches 0:5c4d7b2438d3 813
switches 0:5c4d7b2438d3 814 for( i = 0; i < n; i++ )
switches 0:5c4d7b2438d3 815 *p++ = ssl->session_negotiate->id[i];
switches 0:5c4d7b2438d3 816
switches 0:5c4d7b2438d3 817 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
switches 0:5c4d7b2438d3 818 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
switches 0:5c4d7b2438d3 819
switches 0:5c4d7b2438d3 820 /*
switches 0:5c4d7b2438d3 821 * DTLS cookie
switches 0:5c4d7b2438d3 822 */
switches 0:5c4d7b2438d3 823 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 824 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
switches 0:5c4d7b2438d3 825 {
switches 0:5c4d7b2438d3 826 if( ssl->handshake->verify_cookie == NULL )
switches 0:5c4d7b2438d3 827 {
switches 0:5c4d7b2438d3 828 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
switches 0:5c4d7b2438d3 829 *p++ = 0;
switches 0:5c4d7b2438d3 830 }
switches 0:5c4d7b2438d3 831 else
switches 0:5c4d7b2438d3 832 {
switches 0:5c4d7b2438d3 833 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
switches 0:5c4d7b2438d3 834 ssl->handshake->verify_cookie,
switches 0:5c4d7b2438d3 835 ssl->handshake->verify_cookie_len );
switches 0:5c4d7b2438d3 836
switches 0:5c4d7b2438d3 837 *p++ = ssl->handshake->verify_cookie_len;
switches 0:5c4d7b2438d3 838 memcpy( p, ssl->handshake->verify_cookie,
switches 0:5c4d7b2438d3 839 ssl->handshake->verify_cookie_len );
switches 0:5c4d7b2438d3 840 p += ssl->handshake->verify_cookie_len;
switches 0:5c4d7b2438d3 841 }
switches 0:5c4d7b2438d3 842 }
switches 0:5c4d7b2438d3 843 #endif
switches 0:5c4d7b2438d3 844
switches 0:5c4d7b2438d3 845 /*
switches 0:5c4d7b2438d3 846 * Ciphersuite list
switches 0:5c4d7b2438d3 847 */
switches 0:5c4d7b2438d3 848 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
switches 0:5c4d7b2438d3 849
switches 0:5c4d7b2438d3 850 /* Skip writing ciphersuite length for now */
switches 0:5c4d7b2438d3 851 n = 0;
switches 0:5c4d7b2438d3 852 q = p;
switches 0:5c4d7b2438d3 853 p += 2;
switches 0:5c4d7b2438d3 854
switches 0:5c4d7b2438d3 855 for( i = 0; ciphersuites[i] != 0; i++ )
switches 0:5c4d7b2438d3 856 {
switches 0:5c4d7b2438d3 857 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
switches 0:5c4d7b2438d3 858
switches 0:5c4d7b2438d3 859 if( ciphersuite_info == NULL )
switches 0:5c4d7b2438d3 860 continue;
switches 0:5c4d7b2438d3 861
switches 0:5c4d7b2438d3 862 if( ciphersuite_info->min_minor_ver > ssl->conf->max_minor_ver ||
switches 0:5c4d7b2438d3 863 ciphersuite_info->max_minor_ver < ssl->conf->min_minor_ver )
switches 0:5c4d7b2438d3 864 continue;
switches 0:5c4d7b2438d3 865
switches 0:5c4d7b2438d3 866 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 867 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
switches 0:5c4d7b2438d3 868 ( ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
switches 0:5c4d7b2438d3 869 continue;
switches 0:5c4d7b2438d3 870 #endif
switches 0:5c4d7b2438d3 871
switches 0:5c4d7b2438d3 872 #if defined(MBEDTLS_ARC4_C)
switches 0:5c4d7b2438d3 873 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
switches 0:5c4d7b2438d3 874 ciphersuite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
switches 0:5c4d7b2438d3 875 continue;
switches 0:5c4d7b2438d3 876 #endif
switches 0:5c4d7b2438d3 877
switches 0:5c4d7b2438d3 878 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 879 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
switches 0:5c4d7b2438d3 880 mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
switches 0:5c4d7b2438d3 881 continue;
switches 0:5c4d7b2438d3 882 #endif
switches 0:5c4d7b2438d3 883
switches 0:5c4d7b2438d3 884 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
switches 0:5c4d7b2438d3 885 ciphersuites[i] ) );
switches 0:5c4d7b2438d3 886
switches 0:5c4d7b2438d3 887 n++;
switches 0:5c4d7b2438d3 888 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
switches 0:5c4d7b2438d3 889 *p++ = (unsigned char)( ciphersuites[i] );
switches 0:5c4d7b2438d3 890 }
switches 0:5c4d7b2438d3 891
switches 0:5c4d7b2438d3 892 /*
switches 0:5c4d7b2438d3 893 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
switches 0:5c4d7b2438d3 894 */
switches 0:5c4d7b2438d3 895 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 896 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
switches 0:5c4d7b2438d3 897 #endif
switches 0:5c4d7b2438d3 898 {
switches 0:5c4d7b2438d3 899 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
switches 0:5c4d7b2438d3 900 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO );
switches 0:5c4d7b2438d3 901 n++;
switches 0:5c4d7b2438d3 902 }
switches 0:5c4d7b2438d3 903
switches 0:5c4d7b2438d3 904 /* Some versions of OpenSSL don't handle it correctly if not at end */
switches 0:5c4d7b2438d3 905 #if defined(MBEDTLS_SSL_FALLBACK_SCSV)
switches 0:5c4d7b2438d3 906 if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
switches 0:5c4d7b2438d3 907 {
switches 0:5c4d7b2438d3 908 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
switches 0:5c4d7b2438d3 909 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
switches 0:5c4d7b2438d3 910 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE );
switches 0:5c4d7b2438d3 911 n++;
switches 0:5c4d7b2438d3 912 }
switches 0:5c4d7b2438d3 913 #endif
switches 0:5c4d7b2438d3 914
switches 0:5c4d7b2438d3 915 *q++ = (unsigned char)( n >> 7 );
switches 0:5c4d7b2438d3 916 *q++ = (unsigned char)( n << 1 );
switches 0:5c4d7b2438d3 917
switches 0:5c4d7b2438d3 918 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
switches 0:5c4d7b2438d3 919
switches 0:5c4d7b2438d3 920 #if defined(MBEDTLS_ZLIB_SUPPORT)
switches 0:5c4d7b2438d3 921 offer_compress = 1;
switches 0:5c4d7b2438d3 922 #else
switches 0:5c4d7b2438d3 923 offer_compress = 0;
switches 0:5c4d7b2438d3 924 #endif
switches 0:5c4d7b2438d3 925
switches 0:5c4d7b2438d3 926 /*
switches 0:5c4d7b2438d3 927 * We don't support compression with DTLS right now: is many records come
switches 0:5c4d7b2438d3 928 * in the same datagram, uncompressing one could overwrite the next one.
switches 0:5c4d7b2438d3 929 * We don't want to add complexity for handling that case unless there is
switches 0:5c4d7b2438d3 930 * an actual need for it.
switches 0:5c4d7b2438d3 931 */
switches 0:5c4d7b2438d3 932 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 933 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
switches 0:5c4d7b2438d3 934 offer_compress = 0;
switches 0:5c4d7b2438d3 935 #endif
switches 0:5c4d7b2438d3 936
switches 0:5c4d7b2438d3 937 if( offer_compress )
switches 0:5c4d7b2438d3 938 {
switches 0:5c4d7b2438d3 939 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
switches 0:5c4d7b2438d3 940 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
switches 0:5c4d7b2438d3 941 MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) );
switches 0:5c4d7b2438d3 942
switches 0:5c4d7b2438d3 943 *p++ = 2;
switches 0:5c4d7b2438d3 944 *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
switches 0:5c4d7b2438d3 945 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
switches 0:5c4d7b2438d3 946 }
switches 0:5c4d7b2438d3 947 else
switches 0:5c4d7b2438d3 948 {
switches 0:5c4d7b2438d3 949 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
switches 0:5c4d7b2438d3 950 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
switches 0:5c4d7b2438d3 951 MBEDTLS_SSL_COMPRESS_NULL ) );
switches 0:5c4d7b2438d3 952
switches 0:5c4d7b2438d3 953 *p++ = 1;
switches 0:5c4d7b2438d3 954 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
switches 0:5c4d7b2438d3 955 }
switches 0:5c4d7b2438d3 956
switches 0:5c4d7b2438d3 957 // First write extensions, then the total length
switches 0:5c4d7b2438d3 958 //
switches 0:5c4d7b2438d3 959 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
switches 0:5c4d7b2438d3 960 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 961 ext_len += olen;
switches 0:5c4d7b2438d3 962 #endif
switches 0:5c4d7b2438d3 963
switches 0:5c4d7b2438d3 964 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 965 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 966 ext_len += olen;
switches 0:5c4d7b2438d3 967 #endif
switches 0:5c4d7b2438d3 968
switches 0:5c4d7b2438d3 969 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
switches 0:5c4d7b2438d3 970 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
switches 0:5c4d7b2438d3 971 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 972 ext_len += olen;
switches 0:5c4d7b2438d3 973 #endif
switches 0:5c4d7b2438d3 974
switches 0:5c4d7b2438d3 975 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
switches 0:5c4d7b2438d3 976 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 977 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 978 ext_len += olen;
switches 0:5c4d7b2438d3 979
switches 0:5c4d7b2438d3 980 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 981 ext_len += olen;
switches 0:5c4d7b2438d3 982 #endif
switches 0:5c4d7b2438d3 983
switches 0:5c4d7b2438d3 984 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 985 ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 986 ext_len += olen;
switches 0:5c4d7b2438d3 987 #endif
switches 0:5c4d7b2438d3 988
switches 0:5c4d7b2438d3 989 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
switches 0:5c4d7b2438d3 990 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 991 ext_len += olen;
switches 0:5c4d7b2438d3 992 #endif
switches 0:5c4d7b2438d3 993
switches 0:5c4d7b2438d3 994 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
switches 0:5c4d7b2438d3 995 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 996 ext_len += olen;
switches 0:5c4d7b2438d3 997 #endif
switches 0:5c4d7b2438d3 998
switches 0:5c4d7b2438d3 999 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
switches 0:5c4d7b2438d3 1000 ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 1001 ext_len += olen;
switches 0:5c4d7b2438d3 1002 #endif
switches 0:5c4d7b2438d3 1003
switches 0:5c4d7b2438d3 1004 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
switches 0:5c4d7b2438d3 1005 ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 1006 ext_len += olen;
switches 0:5c4d7b2438d3 1007 #endif
switches 0:5c4d7b2438d3 1008
switches 0:5c4d7b2438d3 1009 #if defined(MBEDTLS_SSL_ALPN)
switches 0:5c4d7b2438d3 1010 ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 1011 ext_len += olen;
switches 0:5c4d7b2438d3 1012 #endif
switches 0:5c4d7b2438d3 1013
switches 0:5c4d7b2438d3 1014 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 1015 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
switches 0:5c4d7b2438d3 1016 ext_len += olen;
switches 0:5c4d7b2438d3 1017 #endif
switches 0:5c4d7b2438d3 1018
switches 0:5c4d7b2438d3 1019 /* olen unused if all extensions are disabled */
switches 0:5c4d7b2438d3 1020 ((void) olen);
switches 0:5c4d7b2438d3 1021
switches 0:5c4d7b2438d3 1022 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
switches 0:5c4d7b2438d3 1023 ext_len ) );
switches 0:5c4d7b2438d3 1024
switches 0:5c4d7b2438d3 1025 if( ext_len > 0 )
switches 0:5c4d7b2438d3 1026 {
switches 0:5c4d7b2438d3 1027 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
switches 0:5c4d7b2438d3 1028 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
switches 0:5c4d7b2438d3 1029 p += ext_len;
switches 0:5c4d7b2438d3 1030 }
switches 0:5c4d7b2438d3 1031
switches 0:5c4d7b2438d3 1032 ssl->out_msglen = p - buf;
switches 0:5c4d7b2438d3 1033 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
switches 0:5c4d7b2438d3 1034 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
switches 0:5c4d7b2438d3 1035
switches 0:5c4d7b2438d3 1036 ssl->state++;
switches 0:5c4d7b2438d3 1037
switches 0:5c4d7b2438d3 1038 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 1039 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
switches 0:5c4d7b2438d3 1040 mbedtls_ssl_send_flight_completed( ssl );
switches 0:5c4d7b2438d3 1041 #endif
switches 0:5c4d7b2438d3 1042
switches 0:5c4d7b2438d3 1043 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 1044 {
switches 0:5c4d7b2438d3 1045 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
switches 0:5c4d7b2438d3 1046 return( ret );
switches 0:5c4d7b2438d3 1047 }
switches 0:5c4d7b2438d3 1048
switches 0:5c4d7b2438d3 1049 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
switches 0:5c4d7b2438d3 1050
switches 0:5c4d7b2438d3 1051 return( 0 );
switches 0:5c4d7b2438d3 1052 }
switches 0:5c4d7b2438d3 1053
switches 0:5c4d7b2438d3 1054 static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1055 const unsigned char *buf,
switches 0:5c4d7b2438d3 1056 size_t len )
switches 0:5c4d7b2438d3 1057 {
switches 0:5c4d7b2438d3 1058 int ret;
switches 0:5c4d7b2438d3 1059
switches 0:5c4d7b2438d3 1060 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 1061 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
switches 0:5c4d7b2438d3 1062 {
switches 0:5c4d7b2438d3 1063 /* Check verify-data in constant-time. The length OTOH is no secret */
switches 0:5c4d7b2438d3 1064 if( len != 1 + ssl->verify_data_len * 2 ||
switches 0:5c4d7b2438d3 1065 buf[0] != ssl->verify_data_len * 2 ||
switches 0:5c4d7b2438d3 1066 mbedtls_ssl_safer_memcmp( buf + 1,
switches 0:5c4d7b2438d3 1067 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
switches 0:5c4d7b2438d3 1068 mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
switches 0:5c4d7b2438d3 1069 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
switches 0:5c4d7b2438d3 1070 {
switches 0:5c4d7b2438d3 1071 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
switches 0:5c4d7b2438d3 1072
switches 0:5c4d7b2438d3 1073 if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 1074 return( ret );
switches 0:5c4d7b2438d3 1075
switches 0:5c4d7b2438d3 1076 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1077 }
switches 0:5c4d7b2438d3 1078 }
switches 0:5c4d7b2438d3 1079 else
switches 0:5c4d7b2438d3 1080 #endif /* MBEDTLS_SSL_RENEGOTIATION */
switches 0:5c4d7b2438d3 1081 {
switches 0:5c4d7b2438d3 1082 if( len != 1 || buf[0] != 0x00 )
switches 0:5c4d7b2438d3 1083 {
switches 0:5c4d7b2438d3 1084 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
switches 0:5c4d7b2438d3 1085
switches 0:5c4d7b2438d3 1086 if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 1087 return( ret );
switches 0:5c4d7b2438d3 1088
switches 0:5c4d7b2438d3 1089 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1090 }
switches 0:5c4d7b2438d3 1091
switches 0:5c4d7b2438d3 1092 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
switches 0:5c4d7b2438d3 1093 }
switches 0:5c4d7b2438d3 1094
switches 0:5c4d7b2438d3 1095 return( 0 );
switches 0:5c4d7b2438d3 1096 }
switches 0:5c4d7b2438d3 1097
switches 0:5c4d7b2438d3 1098 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
switches 0:5c4d7b2438d3 1099 static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1100 const unsigned char *buf,
switches 0:5c4d7b2438d3 1101 size_t len )
switches 0:5c4d7b2438d3 1102 {
switches 0:5c4d7b2438d3 1103 /*
switches 0:5c4d7b2438d3 1104 * server should use the extension only if we did,
switches 0:5c4d7b2438d3 1105 * and if so the server's value should match ours (and len is always 1)
switches 0:5c4d7b2438d3 1106 */
switches 0:5c4d7b2438d3 1107 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
switches 0:5c4d7b2438d3 1108 len != 1 ||
switches 0:5c4d7b2438d3 1109 buf[0] != ssl->conf->mfl_code )
switches 0:5c4d7b2438d3 1110 {
switches 0:5c4d7b2438d3 1111 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1112 }
switches 0:5c4d7b2438d3 1113
switches 0:5c4d7b2438d3 1114 return( 0 );
switches 0:5c4d7b2438d3 1115 }
switches 0:5c4d7b2438d3 1116 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
switches 0:5c4d7b2438d3 1117
switches 0:5c4d7b2438d3 1118 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
switches 0:5c4d7b2438d3 1119 static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1120 const unsigned char *buf,
switches 0:5c4d7b2438d3 1121 size_t len )
switches 0:5c4d7b2438d3 1122 {
switches 0:5c4d7b2438d3 1123 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
switches 0:5c4d7b2438d3 1124 len != 0 )
switches 0:5c4d7b2438d3 1125 {
switches 0:5c4d7b2438d3 1126 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1127 }
switches 0:5c4d7b2438d3 1128
switches 0:5c4d7b2438d3 1129 ((void) buf);
switches 0:5c4d7b2438d3 1130
switches 0:5c4d7b2438d3 1131 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
switches 0:5c4d7b2438d3 1132
switches 0:5c4d7b2438d3 1133 return( 0 );
switches 0:5c4d7b2438d3 1134 }
switches 0:5c4d7b2438d3 1135 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
switches 0:5c4d7b2438d3 1136
switches 0:5c4d7b2438d3 1137 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
switches 0:5c4d7b2438d3 1138 static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1139 const unsigned char *buf,
switches 0:5c4d7b2438d3 1140 size_t len )
switches 0:5c4d7b2438d3 1141 {
switches 0:5c4d7b2438d3 1142 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
switches 0:5c4d7b2438d3 1143 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
switches 0:5c4d7b2438d3 1144 len != 0 )
switches 0:5c4d7b2438d3 1145 {
switches 0:5c4d7b2438d3 1146 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1147 }
switches 0:5c4d7b2438d3 1148
switches 0:5c4d7b2438d3 1149 ((void) buf);
switches 0:5c4d7b2438d3 1150
switches 0:5c4d7b2438d3 1151 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
switches 0:5c4d7b2438d3 1152
switches 0:5c4d7b2438d3 1153 return( 0 );
switches 0:5c4d7b2438d3 1154 }
switches 0:5c4d7b2438d3 1155 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
switches 0:5c4d7b2438d3 1156
switches 0:5c4d7b2438d3 1157 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
switches 0:5c4d7b2438d3 1158 static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1159 const unsigned char *buf,
switches 0:5c4d7b2438d3 1160 size_t len )
switches 0:5c4d7b2438d3 1161 {
switches 0:5c4d7b2438d3 1162 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
switches 0:5c4d7b2438d3 1163 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
switches 0:5c4d7b2438d3 1164 len != 0 )
switches 0:5c4d7b2438d3 1165 {
switches 0:5c4d7b2438d3 1166 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1167 }
switches 0:5c4d7b2438d3 1168
switches 0:5c4d7b2438d3 1169 ((void) buf);
switches 0:5c4d7b2438d3 1170
switches 0:5c4d7b2438d3 1171 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
switches 0:5c4d7b2438d3 1172
switches 0:5c4d7b2438d3 1173 return( 0 );
switches 0:5c4d7b2438d3 1174 }
switches 0:5c4d7b2438d3 1175 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
switches 0:5c4d7b2438d3 1176
switches 0:5c4d7b2438d3 1177 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 1178 static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1179 const unsigned char *buf,
switches 0:5c4d7b2438d3 1180 size_t len )
switches 0:5c4d7b2438d3 1181 {
switches 0:5c4d7b2438d3 1182 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
switches 0:5c4d7b2438d3 1183 len != 0 )
switches 0:5c4d7b2438d3 1184 {
switches 0:5c4d7b2438d3 1185 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1186 }
switches 0:5c4d7b2438d3 1187
switches 0:5c4d7b2438d3 1188 ((void) buf);
switches 0:5c4d7b2438d3 1189
switches 0:5c4d7b2438d3 1190 ssl->handshake->new_session_ticket = 1;
switches 0:5c4d7b2438d3 1191
switches 0:5c4d7b2438d3 1192 return( 0 );
switches 0:5c4d7b2438d3 1193 }
switches 0:5c4d7b2438d3 1194 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
switches 0:5c4d7b2438d3 1195
switches 0:5c4d7b2438d3 1196 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
switches 0:5c4d7b2438d3 1197 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 1198 static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1199 const unsigned char *buf,
switches 0:5c4d7b2438d3 1200 size_t len )
switches 0:5c4d7b2438d3 1201 {
switches 0:5c4d7b2438d3 1202 size_t list_size;
switches 0:5c4d7b2438d3 1203 const unsigned char *p;
switches 0:5c4d7b2438d3 1204
switches 0:5c4d7b2438d3 1205 list_size = buf[0];
switches 0:5c4d7b2438d3 1206 if( list_size + 1 != len )
switches 0:5c4d7b2438d3 1207 {
switches 0:5c4d7b2438d3 1208 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1209 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1210 }
switches 0:5c4d7b2438d3 1211
switches 0:5c4d7b2438d3 1212 p = buf + 1;
switches 0:5c4d7b2438d3 1213 while( list_size > 0 )
switches 0:5c4d7b2438d3 1214 {
switches 0:5c4d7b2438d3 1215 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
switches 0:5c4d7b2438d3 1216 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
switches 0:5c4d7b2438d3 1217 {
switches 0:5c4d7b2438d3 1218 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
switches 0:5c4d7b2438d3 1219 ssl->handshake->ecdh_ctx.point_format = p[0];
switches 0:5c4d7b2438d3 1220 #endif
switches 0:5c4d7b2438d3 1221 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 1222 ssl->handshake->ecjpake_ctx.point_format = p[0];
switches 0:5c4d7b2438d3 1223 #endif
switches 0:5c4d7b2438d3 1224 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
switches 0:5c4d7b2438d3 1225 return( 0 );
switches 0:5c4d7b2438d3 1226 }
switches 0:5c4d7b2438d3 1227
switches 0:5c4d7b2438d3 1228 list_size--;
switches 0:5c4d7b2438d3 1229 p++;
switches 0:5c4d7b2438d3 1230 }
switches 0:5c4d7b2438d3 1231
switches 0:5c4d7b2438d3 1232 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
switches 0:5c4d7b2438d3 1233 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1234 }
switches 0:5c4d7b2438d3 1235 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
switches 0:5c4d7b2438d3 1236 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
switches 0:5c4d7b2438d3 1237
switches 0:5c4d7b2438d3 1238 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 1239 static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1240 const unsigned char *buf,
switches 0:5c4d7b2438d3 1241 size_t len )
switches 0:5c4d7b2438d3 1242 {
switches 0:5c4d7b2438d3 1243 int ret;
switches 0:5c4d7b2438d3 1244
switches 0:5c4d7b2438d3 1245 if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
switches 0:5c4d7b2438d3 1246 MBEDTLS_KEY_EXCHANGE_ECJPAKE )
switches 0:5c4d7b2438d3 1247 {
switches 0:5c4d7b2438d3 1248 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
switches 0:5c4d7b2438d3 1249 return( 0 );
switches 0:5c4d7b2438d3 1250 }
switches 0:5c4d7b2438d3 1251
switches 0:5c4d7b2438d3 1252 /* If we got here, we no longer need our cached extension */
switches 0:5c4d7b2438d3 1253 mbedtls_free( ssl->handshake->ecjpake_cache );
switches 0:5c4d7b2438d3 1254 ssl->handshake->ecjpake_cache = NULL;
switches 0:5c4d7b2438d3 1255 ssl->handshake->ecjpake_cache_len = 0;
switches 0:5c4d7b2438d3 1256
switches 0:5c4d7b2438d3 1257 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
switches 0:5c4d7b2438d3 1258 buf, len ) ) != 0 )
switches 0:5c4d7b2438d3 1259 {
switches 0:5c4d7b2438d3 1260 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
switches 0:5c4d7b2438d3 1261 return( ret );
switches 0:5c4d7b2438d3 1262 }
switches 0:5c4d7b2438d3 1263
switches 0:5c4d7b2438d3 1264 return( 0 );
switches 0:5c4d7b2438d3 1265 }
switches 0:5c4d7b2438d3 1266 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
switches 0:5c4d7b2438d3 1267
switches 0:5c4d7b2438d3 1268 #if defined(MBEDTLS_SSL_ALPN)
switches 0:5c4d7b2438d3 1269 static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1270 const unsigned char *buf, size_t len )
switches 0:5c4d7b2438d3 1271 {
switches 0:5c4d7b2438d3 1272 size_t list_len, name_len;
switches 0:5c4d7b2438d3 1273 const char **p;
switches 0:5c4d7b2438d3 1274
switches 0:5c4d7b2438d3 1275 /* If we didn't send it, the server shouldn't send it */
switches 0:5c4d7b2438d3 1276 if( ssl->conf->alpn_list == NULL )
switches 0:5c4d7b2438d3 1277 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1278
switches 0:5c4d7b2438d3 1279 /*
switches 0:5c4d7b2438d3 1280 * opaque ProtocolName<1..2^8-1>;
switches 0:5c4d7b2438d3 1281 *
switches 0:5c4d7b2438d3 1282 * struct {
switches 0:5c4d7b2438d3 1283 * ProtocolName protocol_name_list<2..2^16-1>
switches 0:5c4d7b2438d3 1284 * } ProtocolNameList;
switches 0:5c4d7b2438d3 1285 *
switches 0:5c4d7b2438d3 1286 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
switches 0:5c4d7b2438d3 1287 */
switches 0:5c4d7b2438d3 1288
switches 0:5c4d7b2438d3 1289 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
switches 0:5c4d7b2438d3 1290 if( len < 4 )
switches 0:5c4d7b2438d3 1291 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1292
switches 0:5c4d7b2438d3 1293 list_len = ( buf[0] << 8 ) | buf[1];
switches 0:5c4d7b2438d3 1294 if( list_len != len - 2 )
switches 0:5c4d7b2438d3 1295 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1296
switches 0:5c4d7b2438d3 1297 name_len = buf[2];
switches 0:5c4d7b2438d3 1298 if( name_len != list_len - 1 )
switches 0:5c4d7b2438d3 1299 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1300
switches 0:5c4d7b2438d3 1301 /* Check that the server chosen protocol was in our list and save it */
switches 0:5c4d7b2438d3 1302 for( p = ssl->conf->alpn_list; *p != NULL; p++ )
switches 0:5c4d7b2438d3 1303 {
switches 0:5c4d7b2438d3 1304 if( name_len == strlen( *p ) &&
switches 0:5c4d7b2438d3 1305 memcmp( buf + 3, *p, name_len ) == 0 )
switches 0:5c4d7b2438d3 1306 {
switches 0:5c4d7b2438d3 1307 ssl->alpn_chosen = *p;
switches 0:5c4d7b2438d3 1308 return( 0 );
switches 0:5c4d7b2438d3 1309 }
switches 0:5c4d7b2438d3 1310 }
switches 0:5c4d7b2438d3 1311
switches 0:5c4d7b2438d3 1312 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1313 }
switches 0:5c4d7b2438d3 1314 #endif /* MBEDTLS_SSL_ALPN */
switches 0:5c4d7b2438d3 1315
switches 0:5c4d7b2438d3 1316 /*
switches 0:5c4d7b2438d3 1317 * Parse HelloVerifyRequest. Only called after verifying the HS type.
switches 0:5c4d7b2438d3 1318 */
switches 0:5c4d7b2438d3 1319 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 1320 static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 1321 {
switches 0:5c4d7b2438d3 1322 const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
switches 0:5c4d7b2438d3 1323 int major_ver, minor_ver;
switches 0:5c4d7b2438d3 1324 unsigned char cookie_len;
switches 0:5c4d7b2438d3 1325
switches 0:5c4d7b2438d3 1326 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
switches 0:5c4d7b2438d3 1327
switches 0:5c4d7b2438d3 1328 /*
switches 0:5c4d7b2438d3 1329 * struct {
switches 0:5c4d7b2438d3 1330 * ProtocolVersion server_version;
switches 0:5c4d7b2438d3 1331 * opaque cookie<0..2^8-1>;
switches 0:5c4d7b2438d3 1332 * } HelloVerifyRequest;
switches 0:5c4d7b2438d3 1333 */
switches 0:5c4d7b2438d3 1334 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
switches 0:5c4d7b2438d3 1335 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
switches 0:5c4d7b2438d3 1336 p += 2;
switches 0:5c4d7b2438d3 1337
switches 0:5c4d7b2438d3 1338 /*
switches 0:5c4d7b2438d3 1339 * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
switches 0:5c4d7b2438d3 1340 * even is lower than our min version.
switches 0:5c4d7b2438d3 1341 */
switches 0:5c4d7b2438d3 1342 if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
switches 0:5c4d7b2438d3 1343 minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
switches 0:5c4d7b2438d3 1344 major_ver > ssl->conf->max_major_ver ||
switches 0:5c4d7b2438d3 1345 minor_ver > ssl->conf->max_minor_ver )
switches 0:5c4d7b2438d3 1346 {
switches 0:5c4d7b2438d3 1347 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
switches 0:5c4d7b2438d3 1348
switches 0:5c4d7b2438d3 1349 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
switches 0:5c4d7b2438d3 1350 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
switches 0:5c4d7b2438d3 1351
switches 0:5c4d7b2438d3 1352 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
switches 0:5c4d7b2438d3 1353 }
switches 0:5c4d7b2438d3 1354
switches 0:5c4d7b2438d3 1355 cookie_len = *p++;
switches 0:5c4d7b2438d3 1356 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
switches 0:5c4d7b2438d3 1357
switches 0:5c4d7b2438d3 1358 if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
switches 0:5c4d7b2438d3 1359 {
switches 0:5c4d7b2438d3 1360 MBEDTLS_SSL_DEBUG_MSG( 1,
switches 0:5c4d7b2438d3 1361 ( "cookie length does not match incoming message size" ) );
switches 0:5c4d7b2438d3 1362 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
switches 0:5c4d7b2438d3 1363 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
switches 0:5c4d7b2438d3 1364 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1365 }
switches 0:5c4d7b2438d3 1366
switches 0:5c4d7b2438d3 1367 mbedtls_free( ssl->handshake->verify_cookie );
switches 0:5c4d7b2438d3 1368
switches 0:5c4d7b2438d3 1369 ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
switches 0:5c4d7b2438d3 1370 if( ssl->handshake->verify_cookie == NULL )
switches 0:5c4d7b2438d3 1371 {
switches 0:5c4d7b2438d3 1372 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
switches 0:5c4d7b2438d3 1373 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
switches 0:5c4d7b2438d3 1374 }
switches 0:5c4d7b2438d3 1375
switches 0:5c4d7b2438d3 1376 memcpy( ssl->handshake->verify_cookie, p, cookie_len );
switches 0:5c4d7b2438d3 1377 ssl->handshake->verify_cookie_len = cookie_len;
switches 0:5c4d7b2438d3 1378
switches 0:5c4d7b2438d3 1379 /* Start over at ClientHello */
switches 0:5c4d7b2438d3 1380 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
switches 0:5c4d7b2438d3 1381 mbedtls_ssl_reset_checksum( ssl );
switches 0:5c4d7b2438d3 1382
switches 0:5c4d7b2438d3 1383 mbedtls_ssl_recv_flight_completed( ssl );
switches 0:5c4d7b2438d3 1384
switches 0:5c4d7b2438d3 1385 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
switches 0:5c4d7b2438d3 1386
switches 0:5c4d7b2438d3 1387 return( 0 );
switches 0:5c4d7b2438d3 1388 }
switches 0:5c4d7b2438d3 1389 #endif /* MBEDTLS_SSL_PROTO_DTLS */
switches 0:5c4d7b2438d3 1390
switches 0:5c4d7b2438d3 1391 static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 1392 {
switches 0:5c4d7b2438d3 1393 int ret, i;
switches 0:5c4d7b2438d3 1394 size_t n;
switches 0:5c4d7b2438d3 1395 size_t ext_len;
switches 0:5c4d7b2438d3 1396 unsigned char *buf, *ext;
switches 0:5c4d7b2438d3 1397 unsigned char comp;
switches 0:5c4d7b2438d3 1398 #if defined(MBEDTLS_ZLIB_SUPPORT)
switches 0:5c4d7b2438d3 1399 int accept_comp;
switches 0:5c4d7b2438d3 1400 #endif
switches 0:5c4d7b2438d3 1401 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 1402 int renegotiation_info_seen = 0;
switches 0:5c4d7b2438d3 1403 #endif
switches 0:5c4d7b2438d3 1404 int handshake_failure = 0;
switches 0:5c4d7b2438d3 1405 const mbedtls_ssl_ciphersuite_t *suite_info;
switches 0:5c4d7b2438d3 1406 #if defined(MBEDTLS_DEBUG_C)
switches 0:5c4d7b2438d3 1407 uint32_t t;
switches 0:5c4d7b2438d3 1408 #endif
switches 0:5c4d7b2438d3 1409
switches 0:5c4d7b2438d3 1410 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
switches 0:5c4d7b2438d3 1411
switches 0:5c4d7b2438d3 1412 buf = ssl->in_msg;
switches 0:5c4d7b2438d3 1413
switches 0:5c4d7b2438d3 1414 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 1415 {
switches 0:5c4d7b2438d3 1416 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
switches 0:5c4d7b2438d3 1417 return( ret );
switches 0:5c4d7b2438d3 1418 }
switches 0:5c4d7b2438d3 1419
switches 0:5c4d7b2438d3 1420 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
switches 0:5c4d7b2438d3 1421 {
switches 0:5c4d7b2438d3 1422 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 1423 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
switches 0:5c4d7b2438d3 1424 {
switches 0:5c4d7b2438d3 1425 ssl->renego_records_seen++;
switches 0:5c4d7b2438d3 1426
switches 0:5c4d7b2438d3 1427 if( ssl->conf->renego_max_records >= 0 &&
switches 0:5c4d7b2438d3 1428 ssl->renego_records_seen > ssl->conf->renego_max_records )
switches 0:5c4d7b2438d3 1429 {
switches 0:5c4d7b2438d3 1430 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
switches 0:5c4d7b2438d3 1431 "but not honored by server" ) );
switches 0:5c4d7b2438d3 1432 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 1433 }
switches 0:5c4d7b2438d3 1434
switches 0:5c4d7b2438d3 1435 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) );
switches 0:5c4d7b2438d3 1436 return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
switches 0:5c4d7b2438d3 1437 }
switches 0:5c4d7b2438d3 1438 #endif /* MBEDTLS_SSL_RENEGOTIATION */
switches 0:5c4d7b2438d3 1439
switches 0:5c4d7b2438d3 1440 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1441 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 1442 }
switches 0:5c4d7b2438d3 1443
switches 0:5c4d7b2438d3 1444 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 1445 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
switches 0:5c4d7b2438d3 1446 {
switches 0:5c4d7b2438d3 1447 if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
switches 0:5c4d7b2438d3 1448 {
switches 0:5c4d7b2438d3 1449 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
switches 0:5c4d7b2438d3 1450 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
switches 0:5c4d7b2438d3 1451 return( ssl_parse_hello_verify_request( ssl ) );
switches 0:5c4d7b2438d3 1452 }
switches 0:5c4d7b2438d3 1453 else
switches 0:5c4d7b2438d3 1454 {
switches 0:5c4d7b2438d3 1455 /* We made it through the verification process */
switches 0:5c4d7b2438d3 1456 mbedtls_free( ssl->handshake->verify_cookie );
switches 0:5c4d7b2438d3 1457 ssl->handshake->verify_cookie = NULL;
switches 0:5c4d7b2438d3 1458 ssl->handshake->verify_cookie_len = 0;
switches 0:5c4d7b2438d3 1459 }
switches 0:5c4d7b2438d3 1460 }
switches 0:5c4d7b2438d3 1461 #endif /* MBEDTLS_SSL_PROTO_DTLS */
switches 0:5c4d7b2438d3 1462
switches 0:5c4d7b2438d3 1463 if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
switches 0:5c4d7b2438d3 1464 buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
switches 0:5c4d7b2438d3 1465 {
switches 0:5c4d7b2438d3 1466 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1467 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1468 }
switches 0:5c4d7b2438d3 1469
switches 0:5c4d7b2438d3 1470 /*
switches 0:5c4d7b2438d3 1471 * 0 . 1 server_version
switches 0:5c4d7b2438d3 1472 * 2 . 33 random (maybe including 4 bytes of Unix time)
switches 0:5c4d7b2438d3 1473 * 34 . 34 session_id length = n
switches 0:5c4d7b2438d3 1474 * 35 . 34+n session_id
switches 0:5c4d7b2438d3 1475 * 35+n . 36+n cipher_suite
switches 0:5c4d7b2438d3 1476 * 37+n . 37+n compression_method
switches 0:5c4d7b2438d3 1477 *
switches 0:5c4d7b2438d3 1478 * 38+n . 39+n extensions length (optional)
switches 0:5c4d7b2438d3 1479 * 40+n . .. extensions
switches 0:5c4d7b2438d3 1480 */
switches 0:5c4d7b2438d3 1481 buf += mbedtls_ssl_hs_hdr_len( ssl );
switches 0:5c4d7b2438d3 1482
switches 0:5c4d7b2438d3 1483 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
switches 0:5c4d7b2438d3 1484 mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
switches 0:5c4d7b2438d3 1485 ssl->conf->transport, buf + 0 );
switches 0:5c4d7b2438d3 1486
switches 0:5c4d7b2438d3 1487 if( ssl->major_ver < ssl->conf->min_major_ver ||
switches 0:5c4d7b2438d3 1488 ssl->minor_ver < ssl->conf->min_minor_ver ||
switches 0:5c4d7b2438d3 1489 ssl->major_ver > ssl->conf->max_major_ver ||
switches 0:5c4d7b2438d3 1490 ssl->minor_ver > ssl->conf->max_minor_ver )
switches 0:5c4d7b2438d3 1491 {
switches 0:5c4d7b2438d3 1492 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - "
switches 0:5c4d7b2438d3 1493 " min: [%d:%d], server: [%d:%d], max: [%d:%d]",
switches 0:5c4d7b2438d3 1494 ssl->conf->min_major_ver, ssl->conf->min_minor_ver,
switches 0:5c4d7b2438d3 1495 ssl->major_ver, ssl->minor_ver,
switches 0:5c4d7b2438d3 1496 ssl->conf->max_major_ver, ssl->conf->max_minor_ver ) );
switches 0:5c4d7b2438d3 1497
switches 0:5c4d7b2438d3 1498 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
switches 0:5c4d7b2438d3 1499 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
switches 0:5c4d7b2438d3 1500
switches 0:5c4d7b2438d3 1501 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
switches 0:5c4d7b2438d3 1502 }
switches 0:5c4d7b2438d3 1503
switches 0:5c4d7b2438d3 1504 #if defined(MBEDTLS_DEBUG_C)
switches 0:5c4d7b2438d3 1505 t = ( (uint32_t) buf[2] << 24 )
switches 0:5c4d7b2438d3 1506 | ( (uint32_t) buf[3] << 16 )
switches 0:5c4d7b2438d3 1507 | ( (uint32_t) buf[4] << 8 )
switches 0:5c4d7b2438d3 1508 | ( (uint32_t) buf[5] );
switches 0:5c4d7b2438d3 1509 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
switches 0:5c4d7b2438d3 1510 #endif
switches 0:5c4d7b2438d3 1511
switches 0:5c4d7b2438d3 1512 memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
switches 0:5c4d7b2438d3 1513
switches 0:5c4d7b2438d3 1514 n = buf[34];
switches 0:5c4d7b2438d3 1515
switches 0:5c4d7b2438d3 1516 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
switches 0:5c4d7b2438d3 1517
switches 0:5c4d7b2438d3 1518 if( n > 32 )
switches 0:5c4d7b2438d3 1519 {
switches 0:5c4d7b2438d3 1520 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1521 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1522 }
switches 0:5c4d7b2438d3 1523
switches 0:5c4d7b2438d3 1524 if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
switches 0:5c4d7b2438d3 1525 {
switches 0:5c4d7b2438d3 1526 ext_len = ( ( buf[38 + n] << 8 )
switches 0:5c4d7b2438d3 1527 | ( buf[39 + n] ) );
switches 0:5c4d7b2438d3 1528
switches 0:5c4d7b2438d3 1529 if( ( ext_len > 0 && ext_len < 4 ) ||
switches 0:5c4d7b2438d3 1530 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
switches 0:5c4d7b2438d3 1531 {
switches 0:5c4d7b2438d3 1532 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1533 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1534 }
switches 0:5c4d7b2438d3 1535 }
switches 0:5c4d7b2438d3 1536 else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
switches 0:5c4d7b2438d3 1537 {
switches 0:5c4d7b2438d3 1538 ext_len = 0;
switches 0:5c4d7b2438d3 1539 }
switches 0:5c4d7b2438d3 1540 else
switches 0:5c4d7b2438d3 1541 {
switches 0:5c4d7b2438d3 1542 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1543 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1544 }
switches 0:5c4d7b2438d3 1545
switches 0:5c4d7b2438d3 1546 /* ciphersuite (used later) */
switches 0:5c4d7b2438d3 1547 i = ( buf[35 + n] << 8 ) | buf[36 + n];
switches 0:5c4d7b2438d3 1548
switches 0:5c4d7b2438d3 1549 /*
switches 0:5c4d7b2438d3 1550 * Read and check compression
switches 0:5c4d7b2438d3 1551 */
switches 0:5c4d7b2438d3 1552 comp = buf[37 + n];
switches 0:5c4d7b2438d3 1553
switches 0:5c4d7b2438d3 1554 #if defined(MBEDTLS_ZLIB_SUPPORT)
switches 0:5c4d7b2438d3 1555 /* See comments in ssl_write_client_hello() */
switches 0:5c4d7b2438d3 1556 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 1557 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
switches 0:5c4d7b2438d3 1558 accept_comp = 0;
switches 0:5c4d7b2438d3 1559 else
switches 0:5c4d7b2438d3 1560 #endif
switches 0:5c4d7b2438d3 1561 accept_comp = 1;
switches 0:5c4d7b2438d3 1562
switches 0:5c4d7b2438d3 1563 if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
switches 0:5c4d7b2438d3 1564 ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
switches 0:5c4d7b2438d3 1565 #else /* MBEDTLS_ZLIB_SUPPORT */
switches 0:5c4d7b2438d3 1566 if( comp != MBEDTLS_SSL_COMPRESS_NULL )
switches 0:5c4d7b2438d3 1567 #endif/* MBEDTLS_ZLIB_SUPPORT */
switches 0:5c4d7b2438d3 1568 {
switches 0:5c4d7b2438d3 1569 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) );
switches 0:5c4d7b2438d3 1570 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
switches 0:5c4d7b2438d3 1571 }
switches 0:5c4d7b2438d3 1572
switches 0:5c4d7b2438d3 1573 /*
switches 0:5c4d7b2438d3 1574 * Initialize update checksum functions
switches 0:5c4d7b2438d3 1575 */
switches 0:5c4d7b2438d3 1576 ssl->transform_negotiate->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i );
switches 0:5c4d7b2438d3 1577
switches 0:5c4d7b2438d3 1578 if( ssl->transform_negotiate->ciphersuite_info == NULL )
switches 0:5c4d7b2438d3 1579 {
switches 0:5c4d7b2438d3 1580 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) );
switches 0:5c4d7b2438d3 1581 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
switches 0:5c4d7b2438d3 1582 }
switches 0:5c4d7b2438d3 1583
switches 0:5c4d7b2438d3 1584 mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
switches 0:5c4d7b2438d3 1585
switches 0:5c4d7b2438d3 1586 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
switches 0:5c4d7b2438d3 1587 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
switches 0:5c4d7b2438d3 1588
switches 0:5c4d7b2438d3 1589 /*
switches 0:5c4d7b2438d3 1590 * Check if the session can be resumed
switches 0:5c4d7b2438d3 1591 */
switches 0:5c4d7b2438d3 1592 if( ssl->handshake->resume == 0 || n == 0 ||
switches 0:5c4d7b2438d3 1593 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 1594 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
switches 0:5c4d7b2438d3 1595 #endif
switches 0:5c4d7b2438d3 1596 ssl->session_negotiate->ciphersuite != i ||
switches 0:5c4d7b2438d3 1597 ssl->session_negotiate->compression != comp ||
switches 0:5c4d7b2438d3 1598 ssl->session_negotiate->id_len != n ||
switches 0:5c4d7b2438d3 1599 memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
switches 0:5c4d7b2438d3 1600 {
switches 0:5c4d7b2438d3 1601 ssl->state++;
switches 0:5c4d7b2438d3 1602 ssl->handshake->resume = 0;
switches 0:5c4d7b2438d3 1603 #if defined(MBEDTLS_HAVE_TIME)
switches 0:5c4d7b2438d3 1604 ssl->session_negotiate->start = mbedtls_time( NULL );
switches 0:5c4d7b2438d3 1605 #endif
switches 0:5c4d7b2438d3 1606 ssl->session_negotiate->ciphersuite = i;
switches 0:5c4d7b2438d3 1607 ssl->session_negotiate->compression = comp;
switches 0:5c4d7b2438d3 1608 ssl->session_negotiate->id_len = n;
switches 0:5c4d7b2438d3 1609 memcpy( ssl->session_negotiate->id, buf + 35, n );
switches 0:5c4d7b2438d3 1610 }
switches 0:5c4d7b2438d3 1611 else
switches 0:5c4d7b2438d3 1612 {
switches 0:5c4d7b2438d3 1613 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
switches 0:5c4d7b2438d3 1614
switches 0:5c4d7b2438d3 1615 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 1616 {
switches 0:5c4d7b2438d3 1617 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
switches 0:5c4d7b2438d3 1618 return( ret );
switches 0:5c4d7b2438d3 1619 }
switches 0:5c4d7b2438d3 1620 }
switches 0:5c4d7b2438d3 1621
switches 0:5c4d7b2438d3 1622 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
switches 0:5c4d7b2438d3 1623 ssl->handshake->resume ? "a" : "no" ) );
switches 0:5c4d7b2438d3 1624
switches 0:5c4d7b2438d3 1625 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
switches 0:5c4d7b2438d3 1626 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
switches 0:5c4d7b2438d3 1627
switches 0:5c4d7b2438d3 1628 suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );
switches 0:5c4d7b2438d3 1629 if( suite_info == NULL
switches 0:5c4d7b2438d3 1630 #if defined(MBEDTLS_ARC4_C)
switches 0:5c4d7b2438d3 1631 || ( ssl->conf->arc4_disabled &&
switches 0:5c4d7b2438d3 1632 suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
switches 0:5c4d7b2438d3 1633 #endif
switches 0:5c4d7b2438d3 1634 )
switches 0:5c4d7b2438d3 1635 {
switches 0:5c4d7b2438d3 1636 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1637 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1638 }
switches 0:5c4d7b2438d3 1639
switches 0:5c4d7b2438d3 1640 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
switches 0:5c4d7b2438d3 1641
switches 0:5c4d7b2438d3 1642 i = 0;
switches 0:5c4d7b2438d3 1643 while( 1 )
switches 0:5c4d7b2438d3 1644 {
switches 0:5c4d7b2438d3 1645 if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 )
switches 0:5c4d7b2438d3 1646 {
switches 0:5c4d7b2438d3 1647 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1648 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1649 }
switches 0:5c4d7b2438d3 1650
switches 0:5c4d7b2438d3 1651 if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] ==
switches 0:5c4d7b2438d3 1652 ssl->session_negotiate->ciphersuite )
switches 0:5c4d7b2438d3 1653 {
switches 0:5c4d7b2438d3 1654 break;
switches 0:5c4d7b2438d3 1655 }
switches 0:5c4d7b2438d3 1656 }
switches 0:5c4d7b2438d3 1657
switches 0:5c4d7b2438d3 1658 if( comp != MBEDTLS_SSL_COMPRESS_NULL
switches 0:5c4d7b2438d3 1659 #if defined(MBEDTLS_ZLIB_SUPPORT)
switches 0:5c4d7b2438d3 1660 && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
switches 0:5c4d7b2438d3 1661 #endif
switches 0:5c4d7b2438d3 1662 )
switches 0:5c4d7b2438d3 1663 {
switches 0:5c4d7b2438d3 1664 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1665 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1666 }
switches 0:5c4d7b2438d3 1667 ssl->session_negotiate->compression = comp;
switches 0:5c4d7b2438d3 1668
switches 0:5c4d7b2438d3 1669 ext = buf + 40 + n;
switches 0:5c4d7b2438d3 1670
switches 0:5c4d7b2438d3 1671 MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
switches 0:5c4d7b2438d3 1672
switches 0:5c4d7b2438d3 1673 while( ext_len )
switches 0:5c4d7b2438d3 1674 {
switches 0:5c4d7b2438d3 1675 unsigned int ext_id = ( ( ext[0] << 8 )
switches 0:5c4d7b2438d3 1676 | ( ext[1] ) );
switches 0:5c4d7b2438d3 1677 unsigned int ext_size = ( ( ext[2] << 8 )
switches 0:5c4d7b2438d3 1678 | ( ext[3] ) );
switches 0:5c4d7b2438d3 1679
switches 0:5c4d7b2438d3 1680 if( ext_size + 4 > ext_len )
switches 0:5c4d7b2438d3 1681 {
switches 0:5c4d7b2438d3 1682 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1683 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1684 }
switches 0:5c4d7b2438d3 1685
switches 0:5c4d7b2438d3 1686 switch( ext_id )
switches 0:5c4d7b2438d3 1687 {
switches 0:5c4d7b2438d3 1688 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
switches 0:5c4d7b2438d3 1689 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
switches 0:5c4d7b2438d3 1690 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 1691 renegotiation_info_seen = 1;
switches 0:5c4d7b2438d3 1692 #endif
switches 0:5c4d7b2438d3 1693
switches 0:5c4d7b2438d3 1694 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
switches 0:5c4d7b2438d3 1695 ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1696 return( ret );
switches 0:5c4d7b2438d3 1697
switches 0:5c4d7b2438d3 1698 break;
switches 0:5c4d7b2438d3 1699
switches 0:5c4d7b2438d3 1700 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
switches 0:5c4d7b2438d3 1701 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
switches 0:5c4d7b2438d3 1702 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
switches 0:5c4d7b2438d3 1703
switches 0:5c4d7b2438d3 1704 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
switches 0:5c4d7b2438d3 1705 ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1706 {
switches 0:5c4d7b2438d3 1707 return( ret );
switches 0:5c4d7b2438d3 1708 }
switches 0:5c4d7b2438d3 1709
switches 0:5c4d7b2438d3 1710 break;
switches 0:5c4d7b2438d3 1711 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
switches 0:5c4d7b2438d3 1712
switches 0:5c4d7b2438d3 1713 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
switches 0:5c4d7b2438d3 1714 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
switches 0:5c4d7b2438d3 1715 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
switches 0:5c4d7b2438d3 1716
switches 0:5c4d7b2438d3 1717 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
switches 0:5c4d7b2438d3 1718 ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1719 {
switches 0:5c4d7b2438d3 1720 return( ret );
switches 0:5c4d7b2438d3 1721 }
switches 0:5c4d7b2438d3 1722
switches 0:5c4d7b2438d3 1723 break;
switches 0:5c4d7b2438d3 1724 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
switches 0:5c4d7b2438d3 1725
switches 0:5c4d7b2438d3 1726 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
switches 0:5c4d7b2438d3 1727 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
switches 0:5c4d7b2438d3 1728 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
switches 0:5c4d7b2438d3 1729
switches 0:5c4d7b2438d3 1730 if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
switches 0:5c4d7b2438d3 1731 ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1732 {
switches 0:5c4d7b2438d3 1733 return( ret );
switches 0:5c4d7b2438d3 1734 }
switches 0:5c4d7b2438d3 1735
switches 0:5c4d7b2438d3 1736 break;
switches 0:5c4d7b2438d3 1737 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
switches 0:5c4d7b2438d3 1738
switches 0:5c4d7b2438d3 1739 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
switches 0:5c4d7b2438d3 1740 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
switches 0:5c4d7b2438d3 1741 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) );
switches 0:5c4d7b2438d3 1742
switches 0:5c4d7b2438d3 1743 if( ( ret = ssl_parse_extended_ms_ext( ssl,
switches 0:5c4d7b2438d3 1744 ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1745 {
switches 0:5c4d7b2438d3 1746 return( ret );
switches 0:5c4d7b2438d3 1747 }
switches 0:5c4d7b2438d3 1748
switches 0:5c4d7b2438d3 1749 break;
switches 0:5c4d7b2438d3 1750 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
switches 0:5c4d7b2438d3 1751
switches 0:5c4d7b2438d3 1752 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 1753 case MBEDTLS_TLS_EXT_SESSION_TICKET:
switches 0:5c4d7b2438d3 1754 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
switches 0:5c4d7b2438d3 1755
switches 0:5c4d7b2438d3 1756 if( ( ret = ssl_parse_session_ticket_ext( ssl,
switches 0:5c4d7b2438d3 1757 ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1758 {
switches 0:5c4d7b2438d3 1759 return( ret );
switches 0:5c4d7b2438d3 1760 }
switches 0:5c4d7b2438d3 1761
switches 0:5c4d7b2438d3 1762 break;
switches 0:5c4d7b2438d3 1763 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
switches 0:5c4d7b2438d3 1764
switches 0:5c4d7b2438d3 1765 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
switches 0:5c4d7b2438d3 1766 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 1767 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
switches 0:5c4d7b2438d3 1768 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
switches 0:5c4d7b2438d3 1769
switches 0:5c4d7b2438d3 1770 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
switches 0:5c4d7b2438d3 1771 ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1772 {
switches 0:5c4d7b2438d3 1773 return( ret );
switches 0:5c4d7b2438d3 1774 }
switches 0:5c4d7b2438d3 1775
switches 0:5c4d7b2438d3 1776 break;
switches 0:5c4d7b2438d3 1777 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
switches 0:5c4d7b2438d3 1778 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
switches 0:5c4d7b2438d3 1779
switches 0:5c4d7b2438d3 1780 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 1781 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
switches 0:5c4d7b2438d3 1782 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
switches 0:5c4d7b2438d3 1783
switches 0:5c4d7b2438d3 1784 if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
switches 0:5c4d7b2438d3 1785 ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1786 {
switches 0:5c4d7b2438d3 1787 return( ret );
switches 0:5c4d7b2438d3 1788 }
switches 0:5c4d7b2438d3 1789
switches 0:5c4d7b2438d3 1790 break;
switches 0:5c4d7b2438d3 1791 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
switches 0:5c4d7b2438d3 1792
switches 0:5c4d7b2438d3 1793 #if defined(MBEDTLS_SSL_ALPN)
switches 0:5c4d7b2438d3 1794 case MBEDTLS_TLS_EXT_ALPN:
switches 0:5c4d7b2438d3 1795 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
switches 0:5c4d7b2438d3 1796
switches 0:5c4d7b2438d3 1797 if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
switches 0:5c4d7b2438d3 1798 return( ret );
switches 0:5c4d7b2438d3 1799
switches 0:5c4d7b2438d3 1800 break;
switches 0:5c4d7b2438d3 1801 #endif /* MBEDTLS_SSL_ALPN */
switches 0:5c4d7b2438d3 1802
switches 0:5c4d7b2438d3 1803 default:
switches 0:5c4d7b2438d3 1804 MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
switches 0:5c4d7b2438d3 1805 ext_id ) );
switches 0:5c4d7b2438d3 1806 }
switches 0:5c4d7b2438d3 1807
switches 0:5c4d7b2438d3 1808 ext_len -= 4 + ext_size;
switches 0:5c4d7b2438d3 1809 ext += 4 + ext_size;
switches 0:5c4d7b2438d3 1810
switches 0:5c4d7b2438d3 1811 if( ext_len > 0 && ext_len < 4 )
switches 0:5c4d7b2438d3 1812 {
switches 0:5c4d7b2438d3 1813 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
switches 0:5c4d7b2438d3 1814 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1815 }
switches 0:5c4d7b2438d3 1816 }
switches 0:5c4d7b2438d3 1817
switches 0:5c4d7b2438d3 1818 /*
switches 0:5c4d7b2438d3 1819 * Renegotiation security checks
switches 0:5c4d7b2438d3 1820 */
switches 0:5c4d7b2438d3 1821 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
switches 0:5c4d7b2438d3 1822 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
switches 0:5c4d7b2438d3 1823 {
switches 0:5c4d7b2438d3 1824 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
switches 0:5c4d7b2438d3 1825 handshake_failure = 1;
switches 0:5c4d7b2438d3 1826 }
switches 0:5c4d7b2438d3 1827 #if defined(MBEDTLS_SSL_RENEGOTIATION)
switches 0:5c4d7b2438d3 1828 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
switches 0:5c4d7b2438d3 1829 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
switches 0:5c4d7b2438d3 1830 renegotiation_info_seen == 0 )
switches 0:5c4d7b2438d3 1831 {
switches 0:5c4d7b2438d3 1832 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
switches 0:5c4d7b2438d3 1833 handshake_failure = 1;
switches 0:5c4d7b2438d3 1834 }
switches 0:5c4d7b2438d3 1835 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
switches 0:5c4d7b2438d3 1836 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
switches 0:5c4d7b2438d3 1837 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
switches 0:5c4d7b2438d3 1838 {
switches 0:5c4d7b2438d3 1839 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
switches 0:5c4d7b2438d3 1840 handshake_failure = 1;
switches 0:5c4d7b2438d3 1841 }
switches 0:5c4d7b2438d3 1842 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
switches 0:5c4d7b2438d3 1843 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
switches 0:5c4d7b2438d3 1844 renegotiation_info_seen == 1 )
switches 0:5c4d7b2438d3 1845 {
switches 0:5c4d7b2438d3 1846 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
switches 0:5c4d7b2438d3 1847 handshake_failure = 1;
switches 0:5c4d7b2438d3 1848 }
switches 0:5c4d7b2438d3 1849 #endif /* MBEDTLS_SSL_RENEGOTIATION */
switches 0:5c4d7b2438d3 1850
switches 0:5c4d7b2438d3 1851 if( handshake_failure == 1 )
switches 0:5c4d7b2438d3 1852 {
switches 0:5c4d7b2438d3 1853 if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 1854 return( ret );
switches 0:5c4d7b2438d3 1855
switches 0:5c4d7b2438d3 1856 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
switches 0:5c4d7b2438d3 1857 }
switches 0:5c4d7b2438d3 1858
switches 0:5c4d7b2438d3 1859 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
switches 0:5c4d7b2438d3 1860
switches 0:5c4d7b2438d3 1861 return( 0 );
switches 0:5c4d7b2438d3 1862 }
switches 0:5c4d7b2438d3 1863
switches 0:5c4d7b2438d3 1864 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 1865 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
switches 0:5c4d7b2438d3 1866 static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p,
switches 0:5c4d7b2438d3 1867 unsigned char *end )
switches 0:5c4d7b2438d3 1868 {
switches 0:5c4d7b2438d3 1869 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
switches 0:5c4d7b2438d3 1870
switches 0:5c4d7b2438d3 1871 /*
switches 0:5c4d7b2438d3 1872 * Ephemeral DH parameters:
switches 0:5c4d7b2438d3 1873 *
switches 0:5c4d7b2438d3 1874 * struct {
switches 0:5c4d7b2438d3 1875 * opaque dh_p<1..2^16-1>;
switches 0:5c4d7b2438d3 1876 * opaque dh_g<1..2^16-1>;
switches 0:5c4d7b2438d3 1877 * opaque dh_Ys<1..2^16-1>;
switches 0:5c4d7b2438d3 1878 * } ServerDHParams;
switches 0:5c4d7b2438d3 1879 */
switches 0:5c4d7b2438d3 1880 if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
switches 0:5c4d7b2438d3 1881 {
switches 0:5c4d7b2438d3 1882 MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
switches 0:5c4d7b2438d3 1883 return( ret );
switches 0:5c4d7b2438d3 1884 }
switches 0:5c4d7b2438d3 1885
switches 0:5c4d7b2438d3 1886 if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
switches 0:5c4d7b2438d3 1887 {
switches 0:5c4d7b2438d3 1888 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
switches 0:5c4d7b2438d3 1889 ssl->handshake->dhm_ctx.len * 8,
switches 0:5c4d7b2438d3 1890 ssl->conf->dhm_min_bitlen ) );
switches 0:5c4d7b2438d3 1891 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 1892 }
switches 0:5c4d7b2438d3 1893
switches 0:5c4d7b2438d3 1894 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
switches 0:5c4d7b2438d3 1895 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
switches 0:5c4d7b2438d3 1896 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
switches 0:5c4d7b2438d3 1897
switches 0:5c4d7b2438d3 1898 return( ret );
switches 0:5c4d7b2438d3 1899 }
switches 0:5c4d7b2438d3 1900 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 1901 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
switches 0:5c4d7b2438d3 1902
switches 0:5c4d7b2438d3 1903 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 1904 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
switches 0:5c4d7b2438d3 1905 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
switches 0:5c4d7b2438d3 1906 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 1907 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 1908 static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 1909 {
switches 0:5c4d7b2438d3 1910 const mbedtls_ecp_curve_info *curve_info;
switches 0:5c4d7b2438d3 1911
switches 0:5c4d7b2438d3 1912 curve_info = mbedtls_ecp_curve_info_from_grp_id( ssl->handshake->ecdh_ctx.grp.id );
switches 0:5c4d7b2438d3 1913 if( curve_info == NULL )
switches 0:5c4d7b2438d3 1914 {
switches 0:5c4d7b2438d3 1915 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 1916 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 1917 }
switches 0:5c4d7b2438d3 1918
switches 0:5c4d7b2438d3 1919 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
switches 0:5c4d7b2438d3 1920
switches 0:5c4d7b2438d3 1921 #if defined(MBEDTLS_ECP_C)
switches 0:5c4d7b2438d3 1922 if( mbedtls_ssl_check_curve( ssl, ssl->handshake->ecdh_ctx.grp.id ) != 0 )
switches 0:5c4d7b2438d3 1923 #else
switches 0:5c4d7b2438d3 1924 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
switches 0:5c4d7b2438d3 1925 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
switches 0:5c4d7b2438d3 1926 #endif
switches 0:5c4d7b2438d3 1927 return( -1 );
switches 0:5c4d7b2438d3 1928
switches 0:5c4d7b2438d3 1929 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
switches 0:5c4d7b2438d3 1930
switches 0:5c4d7b2438d3 1931 return( 0 );
switches 0:5c4d7b2438d3 1932 }
switches 0:5c4d7b2438d3 1933 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 1934 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
switches 0:5c4d7b2438d3 1935 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
switches 0:5c4d7b2438d3 1936 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
switches 0:5c4d7b2438d3 1937 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 1938
switches 0:5c4d7b2438d3 1939 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 1940 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
switches 0:5c4d7b2438d3 1941 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
switches 0:5c4d7b2438d3 1942 static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1943 unsigned char **p,
switches 0:5c4d7b2438d3 1944 unsigned char *end )
switches 0:5c4d7b2438d3 1945 {
switches 0:5c4d7b2438d3 1946 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
switches 0:5c4d7b2438d3 1947
switches 0:5c4d7b2438d3 1948 /*
switches 0:5c4d7b2438d3 1949 * Ephemeral ECDH parameters:
switches 0:5c4d7b2438d3 1950 *
switches 0:5c4d7b2438d3 1951 * struct {
switches 0:5c4d7b2438d3 1952 * ECParameters curve_params;
switches 0:5c4d7b2438d3 1953 * ECPoint public;
switches 0:5c4d7b2438d3 1954 * } ServerECDHParams;
switches 0:5c4d7b2438d3 1955 */
switches 0:5c4d7b2438d3 1956 if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
switches 0:5c4d7b2438d3 1957 (const unsigned char **) p, end ) ) != 0 )
switches 0:5c4d7b2438d3 1958 {
switches 0:5c4d7b2438d3 1959 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
switches 0:5c4d7b2438d3 1960 return( ret );
switches 0:5c4d7b2438d3 1961 }
switches 0:5c4d7b2438d3 1962
switches 0:5c4d7b2438d3 1963 if( ssl_check_server_ecdh_params( ssl ) != 0 )
switches 0:5c4d7b2438d3 1964 {
switches 0:5c4d7b2438d3 1965 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) );
switches 0:5c4d7b2438d3 1966 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 1967 }
switches 0:5c4d7b2438d3 1968
switches 0:5c4d7b2438d3 1969 return( ret );
switches 0:5c4d7b2438d3 1970 }
switches 0:5c4d7b2438d3 1971 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 1972 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
switches 0:5c4d7b2438d3 1973 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
switches 0:5c4d7b2438d3 1974
switches 0:5c4d7b2438d3 1975 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
switches 0:5c4d7b2438d3 1976 static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 1977 unsigned char **p,
switches 0:5c4d7b2438d3 1978 unsigned char *end )
switches 0:5c4d7b2438d3 1979 {
switches 0:5c4d7b2438d3 1980 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
switches 0:5c4d7b2438d3 1981 size_t len;
switches 0:5c4d7b2438d3 1982 ((void) ssl);
switches 0:5c4d7b2438d3 1983
switches 0:5c4d7b2438d3 1984 /*
switches 0:5c4d7b2438d3 1985 * PSK parameters:
switches 0:5c4d7b2438d3 1986 *
switches 0:5c4d7b2438d3 1987 * opaque psk_identity_hint<0..2^16-1>;
switches 0:5c4d7b2438d3 1988 */
switches 0:5c4d7b2438d3 1989 len = (*p)[0] << 8 | (*p)[1];
switches 0:5c4d7b2438d3 1990 *p += 2;
switches 0:5c4d7b2438d3 1991
switches 0:5c4d7b2438d3 1992 if( (*p) + len > end )
switches 0:5c4d7b2438d3 1993 {
switches 0:5c4d7b2438d3 1994 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
switches 0:5c4d7b2438d3 1995 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 1996 }
switches 0:5c4d7b2438d3 1997
switches 0:5c4d7b2438d3 1998 /*
switches 0:5c4d7b2438d3 1999 * Note: we currently ignore the PKS identity hint, as we only allow one
switches 0:5c4d7b2438d3 2000 * PSK to be provisionned on the client. This could be changed later if
switches 0:5c4d7b2438d3 2001 * someone needs that feature.
switches 0:5c4d7b2438d3 2002 */
switches 0:5c4d7b2438d3 2003 *p += len;
switches 0:5c4d7b2438d3 2004 ret = 0;
switches 0:5c4d7b2438d3 2005
switches 0:5c4d7b2438d3 2006 return( ret );
switches 0:5c4d7b2438d3 2007 }
switches 0:5c4d7b2438d3 2008 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
switches 0:5c4d7b2438d3 2009
switches 0:5c4d7b2438d3 2010 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2011 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
switches 0:5c4d7b2438d3 2012 /*
switches 0:5c4d7b2438d3 2013 * Generate a pre-master secret and encrypt it with the server's RSA key
switches 0:5c4d7b2438d3 2014 */
switches 0:5c4d7b2438d3 2015 static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 2016 size_t offset, size_t *olen,
switches 0:5c4d7b2438d3 2017 size_t pms_offset )
switches 0:5c4d7b2438d3 2018 {
switches 0:5c4d7b2438d3 2019 int ret;
switches 0:5c4d7b2438d3 2020 size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
switches 0:5c4d7b2438d3 2021 unsigned char *p = ssl->handshake->premaster + pms_offset;
switches 0:5c4d7b2438d3 2022
switches 0:5c4d7b2438d3 2023 if( offset + len_bytes > MBEDTLS_SSL_MAX_CONTENT_LEN )
switches 0:5c4d7b2438d3 2024 {
switches 0:5c4d7b2438d3 2025 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
switches 0:5c4d7b2438d3 2026 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
switches 0:5c4d7b2438d3 2027 }
switches 0:5c4d7b2438d3 2028
switches 0:5c4d7b2438d3 2029 /*
switches 0:5c4d7b2438d3 2030 * Generate (part of) the pre-master as
switches 0:5c4d7b2438d3 2031 * struct {
switches 0:5c4d7b2438d3 2032 * ProtocolVersion client_version;
switches 0:5c4d7b2438d3 2033 * opaque random[46];
switches 0:5c4d7b2438d3 2034 * } PreMasterSecret;
switches 0:5c4d7b2438d3 2035 */
switches 0:5c4d7b2438d3 2036 mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
switches 0:5c4d7b2438d3 2037 ssl->conf->transport, p );
switches 0:5c4d7b2438d3 2038
switches 0:5c4d7b2438d3 2039 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
switches 0:5c4d7b2438d3 2040 {
switches 0:5c4d7b2438d3 2041 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
switches 0:5c4d7b2438d3 2042 return( ret );
switches 0:5c4d7b2438d3 2043 }
switches 0:5c4d7b2438d3 2044
switches 0:5c4d7b2438d3 2045 ssl->handshake->pmslen = 48;
switches 0:5c4d7b2438d3 2046
switches 0:5c4d7b2438d3 2047 if( ssl->session_negotiate->peer_cert == NULL )
switches 0:5c4d7b2438d3 2048 {
switches 0:5c4d7b2438d3 2049 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
switches 0:5c4d7b2438d3 2050 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 2051 }
switches 0:5c4d7b2438d3 2052
switches 0:5c4d7b2438d3 2053 /*
switches 0:5c4d7b2438d3 2054 * Now write it out, encrypted
switches 0:5c4d7b2438d3 2055 */
switches 0:5c4d7b2438d3 2056 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
switches 0:5c4d7b2438d3 2057 MBEDTLS_PK_RSA ) )
switches 0:5c4d7b2438d3 2058 {
switches 0:5c4d7b2438d3 2059 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
switches 0:5c4d7b2438d3 2060 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
switches 0:5c4d7b2438d3 2061 }
switches 0:5c4d7b2438d3 2062
switches 0:5c4d7b2438d3 2063 if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk,
switches 0:5c4d7b2438d3 2064 p, ssl->handshake->pmslen,
switches 0:5c4d7b2438d3 2065 ssl->out_msg + offset + len_bytes, olen,
switches 0:5c4d7b2438d3 2066 MBEDTLS_SSL_MAX_CONTENT_LEN - offset - len_bytes,
switches 0:5c4d7b2438d3 2067 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
switches 0:5c4d7b2438d3 2068 {
switches 0:5c4d7b2438d3 2069 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
switches 0:5c4d7b2438d3 2070 return( ret );
switches 0:5c4d7b2438d3 2071 }
switches 0:5c4d7b2438d3 2072
switches 0:5c4d7b2438d3 2073 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
switches 0:5c4d7b2438d3 2074 defined(MBEDTLS_SSL_PROTO_TLS1_2)
switches 0:5c4d7b2438d3 2075 if( len_bytes == 2 )
switches 0:5c4d7b2438d3 2076 {
switches 0:5c4d7b2438d3 2077 ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
switches 0:5c4d7b2438d3 2078 ssl->out_msg[offset+1] = (unsigned char)( *olen );
switches 0:5c4d7b2438d3 2079 *olen += 2;
switches 0:5c4d7b2438d3 2080 }
switches 0:5c4d7b2438d3 2081 #endif
switches 0:5c4d7b2438d3 2082
switches 0:5c4d7b2438d3 2083 return( 0 );
switches 0:5c4d7b2438d3 2084 }
switches 0:5c4d7b2438d3 2085 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2086 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
switches 0:5c4d7b2438d3 2087
switches 0:5c4d7b2438d3 2088 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
switches 0:5c4d7b2438d3 2089 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2090 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2091 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2092 static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
switches 0:5c4d7b2438d3 2093 unsigned char **p,
switches 0:5c4d7b2438d3 2094 unsigned char *end,
switches 0:5c4d7b2438d3 2095 mbedtls_md_type_t *md_alg,
switches 0:5c4d7b2438d3 2096 mbedtls_pk_type_t *pk_alg )
switches 0:5c4d7b2438d3 2097 {
switches 0:5c4d7b2438d3 2098 ((void) ssl);
switches 0:5c4d7b2438d3 2099 *md_alg = MBEDTLS_MD_NONE;
switches 0:5c4d7b2438d3 2100 *pk_alg = MBEDTLS_PK_NONE;
switches 0:5c4d7b2438d3 2101
switches 0:5c4d7b2438d3 2102 /* Only in TLS 1.2 */
switches 0:5c4d7b2438d3 2103 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
switches 0:5c4d7b2438d3 2104 {
switches 0:5c4d7b2438d3 2105 return( 0 );
switches 0:5c4d7b2438d3 2106 }
switches 0:5c4d7b2438d3 2107
switches 0:5c4d7b2438d3 2108 if( (*p) + 2 > end )
switches 0:5c4d7b2438d3 2109 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2110
switches 0:5c4d7b2438d3 2111 /*
switches 0:5c4d7b2438d3 2112 * Get hash algorithm
switches 0:5c4d7b2438d3 2113 */
switches 0:5c4d7b2438d3 2114 if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE )
switches 0:5c4d7b2438d3 2115 {
switches 0:5c4d7b2438d3 2116 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported "
switches 0:5c4d7b2438d3 2117 "HashAlgorithm %d", *(p)[0] ) );
switches 0:5c4d7b2438d3 2118 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2119 }
switches 0:5c4d7b2438d3 2120
switches 0:5c4d7b2438d3 2121 /*
switches 0:5c4d7b2438d3 2122 * Get signature algorithm
switches 0:5c4d7b2438d3 2123 */
switches 0:5c4d7b2438d3 2124 if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE )
switches 0:5c4d7b2438d3 2125 {
switches 0:5c4d7b2438d3 2126 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported "
switches 0:5c4d7b2438d3 2127 "SignatureAlgorithm %d", (*p)[1] ) );
switches 0:5c4d7b2438d3 2128 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2129 }
switches 0:5c4d7b2438d3 2130
switches 0:5c4d7b2438d3 2131 /*
switches 0:5c4d7b2438d3 2132 * Check if the hash is acceptable
switches 0:5c4d7b2438d3 2133 */
switches 0:5c4d7b2438d3 2134 if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
switches 0:5c4d7b2438d3 2135 {
switches 0:5c4d7b2438d3 2136 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm "
switches 0:5c4d7b2438d3 2137 "that was not offered" ) );
switches 0:5c4d7b2438d3 2138 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2139 }
switches 0:5c4d7b2438d3 2140
switches 0:5c4d7b2438d3 2141 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
switches 0:5c4d7b2438d3 2142 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
switches 0:5c4d7b2438d3 2143 *p += 2;
switches 0:5c4d7b2438d3 2144
switches 0:5c4d7b2438d3 2145 return( 0 );
switches 0:5c4d7b2438d3 2146 }
switches 0:5c4d7b2438d3 2147 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2148 MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2149 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 2150 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
switches 0:5c4d7b2438d3 2151
switches 0:5c4d7b2438d3 2152 #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2153 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2154 static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 2155 {
switches 0:5c4d7b2438d3 2156 int ret;
switches 0:5c4d7b2438d3 2157 const mbedtls_ecp_keypair *peer_key;
switches 0:5c4d7b2438d3 2158
switches 0:5c4d7b2438d3 2159 if( ssl->session_negotiate->peer_cert == NULL )
switches 0:5c4d7b2438d3 2160 {
switches 0:5c4d7b2438d3 2161 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
switches 0:5c4d7b2438d3 2162 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 2163 }
switches 0:5c4d7b2438d3 2164
switches 0:5c4d7b2438d3 2165 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
switches 0:5c4d7b2438d3 2166 MBEDTLS_PK_ECKEY ) )
switches 0:5c4d7b2438d3 2167 {
switches 0:5c4d7b2438d3 2168 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
switches 0:5c4d7b2438d3 2169 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
switches 0:5c4d7b2438d3 2170 }
switches 0:5c4d7b2438d3 2171
switches 0:5c4d7b2438d3 2172 peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk );
switches 0:5c4d7b2438d3 2173
switches 0:5c4d7b2438d3 2174 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
switches 0:5c4d7b2438d3 2175 MBEDTLS_ECDH_THEIRS ) ) != 0 )
switches 0:5c4d7b2438d3 2176 {
switches 0:5c4d7b2438d3 2177 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
switches 0:5c4d7b2438d3 2178 return( ret );
switches 0:5c4d7b2438d3 2179 }
switches 0:5c4d7b2438d3 2180
switches 0:5c4d7b2438d3 2181 if( ssl_check_server_ecdh_params( ssl ) != 0 )
switches 0:5c4d7b2438d3 2182 {
switches 0:5c4d7b2438d3 2183 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
switches 0:5c4d7b2438d3 2184 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
switches 0:5c4d7b2438d3 2185 }
switches 0:5c4d7b2438d3 2186
switches 0:5c4d7b2438d3 2187 return( ret );
switches 0:5c4d7b2438d3 2188 }
switches 0:5c4d7b2438d3 2189 #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
switches 0:5c4d7b2438d3 2190 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 2191
switches 0:5c4d7b2438d3 2192 static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 2193 {
switches 0:5c4d7b2438d3 2194 int ret;
switches 0:5c4d7b2438d3 2195 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
switches 0:5c4d7b2438d3 2196 unsigned char *p, *end;
switches 0:5c4d7b2438d3 2197
switches 0:5c4d7b2438d3 2198 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
switches 0:5c4d7b2438d3 2199
switches 0:5c4d7b2438d3 2200 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
switches 0:5c4d7b2438d3 2201 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
switches 0:5c4d7b2438d3 2202 {
switches 0:5c4d7b2438d3 2203 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
switches 0:5c4d7b2438d3 2204 ssl->state++;
switches 0:5c4d7b2438d3 2205 return( 0 );
switches 0:5c4d7b2438d3 2206 }
switches 0:5c4d7b2438d3 2207 ((void) p);
switches 0:5c4d7b2438d3 2208 ((void) end);
switches 0:5c4d7b2438d3 2209 #endif
switches 0:5c4d7b2438d3 2210
switches 0:5c4d7b2438d3 2211 #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2212 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2213 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
switches 0:5c4d7b2438d3 2214 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
switches 0:5c4d7b2438d3 2215 {
switches 0:5c4d7b2438d3 2216 if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 2217 {
switches 0:5c4d7b2438d3 2218 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
switches 0:5c4d7b2438d3 2219 return( ret );
switches 0:5c4d7b2438d3 2220 }
switches 0:5c4d7b2438d3 2221
switches 0:5c4d7b2438d3 2222 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
switches 0:5c4d7b2438d3 2223 ssl->state++;
switches 0:5c4d7b2438d3 2224 return( 0 );
switches 0:5c4d7b2438d3 2225 }
switches 0:5c4d7b2438d3 2226 ((void) p);
switches 0:5c4d7b2438d3 2227 ((void) end);
switches 0:5c4d7b2438d3 2228 #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2229 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 2230
switches 0:5c4d7b2438d3 2231 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 2232 {
switches 0:5c4d7b2438d3 2233 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
switches 0:5c4d7b2438d3 2234 return( ret );
switches 0:5c4d7b2438d3 2235 }
switches 0:5c4d7b2438d3 2236
switches 0:5c4d7b2438d3 2237 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
switches 0:5c4d7b2438d3 2238 {
switches 0:5c4d7b2438d3 2239 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2240 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 2241 }
switches 0:5c4d7b2438d3 2242
switches 0:5c4d7b2438d3 2243 /*
switches 0:5c4d7b2438d3 2244 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
switches 0:5c4d7b2438d3 2245 * doesn't use a psk_identity_hint
switches 0:5c4d7b2438d3 2246 */
switches 0:5c4d7b2438d3 2247 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
switches 0:5c4d7b2438d3 2248 {
switches 0:5c4d7b2438d3 2249 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 2250 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
switches 0:5c4d7b2438d3 2251 {
switches 0:5c4d7b2438d3 2252 ssl->record_read = 1;
switches 0:5c4d7b2438d3 2253 goto exit;
switches 0:5c4d7b2438d3 2254 }
switches 0:5c4d7b2438d3 2255
switches 0:5c4d7b2438d3 2256 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2257 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 2258 }
switches 0:5c4d7b2438d3 2259
switches 0:5c4d7b2438d3 2260 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
switches 0:5c4d7b2438d3 2261 end = ssl->in_msg + ssl->in_hslen;
switches 0:5c4d7b2438d3 2262 MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
switches 0:5c4d7b2438d3 2263
switches 0:5c4d7b2438d3 2264 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
switches 0:5c4d7b2438d3 2265 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 2266 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
switches 0:5c4d7b2438d3 2267 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
switches 0:5c4d7b2438d3 2268 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
switches 0:5c4d7b2438d3 2269 {
switches 0:5c4d7b2438d3 2270 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
switches 0:5c4d7b2438d3 2271 {
switches 0:5c4d7b2438d3 2272 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2273 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2274 }
switches 0:5c4d7b2438d3 2275 } /* FALLTROUGH */
switches 0:5c4d7b2438d3 2276 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
switches 0:5c4d7b2438d3 2277
switches 0:5c4d7b2438d3 2278 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
switches 0:5c4d7b2438d3 2279 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
switches 0:5c4d7b2438d3 2280 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 2281 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
switches 0:5c4d7b2438d3 2282 ; /* nothing more to do */
switches 0:5c4d7b2438d3 2283 else
switches 0:5c4d7b2438d3 2284 #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
switches 0:5c4d7b2438d3 2285 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
switches 0:5c4d7b2438d3 2286 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2287 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
switches 0:5c4d7b2438d3 2288 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
switches 0:5c4d7b2438d3 2289 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
switches 0:5c4d7b2438d3 2290 {
switches 0:5c4d7b2438d3 2291 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
switches 0:5c4d7b2438d3 2292 {
switches 0:5c4d7b2438d3 2293 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2294 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2295 }
switches 0:5c4d7b2438d3 2296 }
switches 0:5c4d7b2438d3 2297 else
switches 0:5c4d7b2438d3 2298 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2299 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
switches 0:5c4d7b2438d3 2300 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2301 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
switches 0:5c4d7b2438d3 2302 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2303 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
switches 0:5c4d7b2438d3 2304 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
switches 0:5c4d7b2438d3 2305 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
switches 0:5c4d7b2438d3 2306 {
switches 0:5c4d7b2438d3 2307 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
switches 0:5c4d7b2438d3 2308 {
switches 0:5c4d7b2438d3 2309 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2310 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2311 }
switches 0:5c4d7b2438d3 2312 }
switches 0:5c4d7b2438d3 2313 else
switches 0:5c4d7b2438d3 2314 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2315 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
switches 0:5c4d7b2438d3 2316 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 2317 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 2318 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
switches 0:5c4d7b2438d3 2319 {
switches 0:5c4d7b2438d3 2320 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
switches 0:5c4d7b2438d3 2321 p, end - p );
switches 0:5c4d7b2438d3 2322 if( ret != 0 )
switches 0:5c4d7b2438d3 2323 {
switches 0:5c4d7b2438d3 2324 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
switches 0:5c4d7b2438d3 2325 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2326 }
switches 0:5c4d7b2438d3 2327 }
switches 0:5c4d7b2438d3 2328 else
switches 0:5c4d7b2438d3 2329 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
switches 0:5c4d7b2438d3 2330 {
switches 0:5c4d7b2438d3 2331 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 2332 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 2333 }
switches 0:5c4d7b2438d3 2334
switches 0:5c4d7b2438d3 2335 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2336 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2337 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2338 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
switches 0:5c4d7b2438d3 2339 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
switches 0:5c4d7b2438d3 2340 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
switches 0:5c4d7b2438d3 2341 {
switches 0:5c4d7b2438d3 2342 size_t sig_len, hashlen;
switches 0:5c4d7b2438d3 2343 unsigned char hash[64];
switches 0:5c4d7b2438d3 2344 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
switches 0:5c4d7b2438d3 2345 mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
switches 0:5c4d7b2438d3 2346 unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
switches 0:5c4d7b2438d3 2347 size_t params_len = p - params;
switches 0:5c4d7b2438d3 2348
switches 0:5c4d7b2438d3 2349 /*
switches 0:5c4d7b2438d3 2350 * Handle the digitally-signed structure
switches 0:5c4d7b2438d3 2351 */
switches 0:5c4d7b2438d3 2352 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
switches 0:5c4d7b2438d3 2353 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
switches 0:5c4d7b2438d3 2354 {
switches 0:5c4d7b2438d3 2355 if( ssl_parse_signature_algorithm( ssl, &p, end,
switches 0:5c4d7b2438d3 2356 &md_alg, &pk_alg ) != 0 )
switches 0:5c4d7b2438d3 2357 {
switches 0:5c4d7b2438d3 2358 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2359 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2360 }
switches 0:5c4d7b2438d3 2361
switches 0:5c4d7b2438d3 2362 if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
switches 0:5c4d7b2438d3 2363 {
switches 0:5c4d7b2438d3 2364 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2365 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2366 }
switches 0:5c4d7b2438d3 2367 }
switches 0:5c4d7b2438d3 2368 else
switches 0:5c4d7b2438d3 2369 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
switches 0:5c4d7b2438d3 2370 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
switches 0:5c4d7b2438d3 2371 defined(MBEDTLS_SSL_PROTO_TLS1_1)
switches 0:5c4d7b2438d3 2372 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
switches 0:5c4d7b2438d3 2373 {
switches 0:5c4d7b2438d3 2374 pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
switches 0:5c4d7b2438d3 2375
switches 0:5c4d7b2438d3 2376 /* Default hash for ECDSA is SHA-1 */
switches 0:5c4d7b2438d3 2377 if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
switches 0:5c4d7b2438d3 2378 md_alg = MBEDTLS_MD_SHA1;
switches 0:5c4d7b2438d3 2379 }
switches 0:5c4d7b2438d3 2380 else
switches 0:5c4d7b2438d3 2381 #endif
switches 0:5c4d7b2438d3 2382 {
switches 0:5c4d7b2438d3 2383 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 2384 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 2385 }
switches 0:5c4d7b2438d3 2386
switches 0:5c4d7b2438d3 2387 /*
switches 0:5c4d7b2438d3 2388 * Read signature
switches 0:5c4d7b2438d3 2389 */
switches 0:5c4d7b2438d3 2390 sig_len = ( p[0] << 8 ) | p[1];
switches 0:5c4d7b2438d3 2391 p += 2;
switches 0:5c4d7b2438d3 2392
switches 0:5c4d7b2438d3 2393 if( end != p + sig_len )
switches 0:5c4d7b2438d3 2394 {
switches 0:5c4d7b2438d3 2395 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2396 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
switches 0:5c4d7b2438d3 2397 }
switches 0:5c4d7b2438d3 2398
switches 0:5c4d7b2438d3 2399 MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
switches 0:5c4d7b2438d3 2400
switches 0:5c4d7b2438d3 2401 /*
switches 0:5c4d7b2438d3 2402 * Compute the hash that has been signed
switches 0:5c4d7b2438d3 2403 */
switches 0:5c4d7b2438d3 2404 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
switches 0:5c4d7b2438d3 2405 defined(MBEDTLS_SSL_PROTO_TLS1_1)
switches 0:5c4d7b2438d3 2406 if( md_alg == MBEDTLS_MD_NONE )
switches 0:5c4d7b2438d3 2407 {
switches 0:5c4d7b2438d3 2408 mbedtls_md5_context mbedtls_md5;
switches 0:5c4d7b2438d3 2409 mbedtls_sha1_context mbedtls_sha1;
switches 0:5c4d7b2438d3 2410
switches 0:5c4d7b2438d3 2411 mbedtls_md5_init( &mbedtls_md5 );
switches 0:5c4d7b2438d3 2412 mbedtls_sha1_init( &mbedtls_sha1 );
switches 0:5c4d7b2438d3 2413
switches 0:5c4d7b2438d3 2414 hashlen = 36;
switches 0:5c4d7b2438d3 2415
switches 0:5c4d7b2438d3 2416 /*
switches 0:5c4d7b2438d3 2417 * digitally-signed struct {
switches 0:5c4d7b2438d3 2418 * opaque md5_hash[16];
switches 0:5c4d7b2438d3 2419 * opaque sha_hash[20];
switches 0:5c4d7b2438d3 2420 * };
switches 0:5c4d7b2438d3 2421 *
switches 0:5c4d7b2438d3 2422 * md5_hash
switches 0:5c4d7b2438d3 2423 * MD5(ClientHello.random + ServerHello.random
switches 0:5c4d7b2438d3 2424 * + ServerParams);
switches 0:5c4d7b2438d3 2425 * sha_hash
switches 0:5c4d7b2438d3 2426 * SHA(ClientHello.random + ServerHello.random
switches 0:5c4d7b2438d3 2427 * + ServerParams);
switches 0:5c4d7b2438d3 2428 */
switches 0:5c4d7b2438d3 2429 mbedtls_md5_starts( &mbedtls_md5 );
switches 0:5c4d7b2438d3 2430 mbedtls_md5_update( &mbedtls_md5, ssl->handshake->randbytes, 64 );
switches 0:5c4d7b2438d3 2431 mbedtls_md5_update( &mbedtls_md5, params, params_len );
switches 0:5c4d7b2438d3 2432 mbedtls_md5_finish( &mbedtls_md5, hash );
switches 0:5c4d7b2438d3 2433
switches 0:5c4d7b2438d3 2434 mbedtls_sha1_starts( &mbedtls_sha1 );
switches 0:5c4d7b2438d3 2435 mbedtls_sha1_update( &mbedtls_sha1, ssl->handshake->randbytes, 64 );
switches 0:5c4d7b2438d3 2436 mbedtls_sha1_update( &mbedtls_sha1, params, params_len );
switches 0:5c4d7b2438d3 2437 mbedtls_sha1_finish( &mbedtls_sha1, hash + 16 );
switches 0:5c4d7b2438d3 2438
switches 0:5c4d7b2438d3 2439 mbedtls_md5_free( &mbedtls_md5 );
switches 0:5c4d7b2438d3 2440 mbedtls_sha1_free( &mbedtls_sha1 );
switches 0:5c4d7b2438d3 2441 }
switches 0:5c4d7b2438d3 2442 else
switches 0:5c4d7b2438d3 2443 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
switches 0:5c4d7b2438d3 2444 MBEDTLS_SSL_PROTO_TLS1_1 */
switches 0:5c4d7b2438d3 2445 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
switches 0:5c4d7b2438d3 2446 defined(MBEDTLS_SSL_PROTO_TLS1_2)
switches 0:5c4d7b2438d3 2447 if( md_alg != MBEDTLS_MD_NONE )
switches 0:5c4d7b2438d3 2448 {
switches 0:5c4d7b2438d3 2449 mbedtls_md_context_t ctx;
switches 0:5c4d7b2438d3 2450
switches 0:5c4d7b2438d3 2451 mbedtls_md_init( &ctx );
switches 0:5c4d7b2438d3 2452
switches 0:5c4d7b2438d3 2453 /* Info from md_alg will be used instead */
switches 0:5c4d7b2438d3 2454 hashlen = 0;
switches 0:5c4d7b2438d3 2455
switches 0:5c4d7b2438d3 2456 /*
switches 0:5c4d7b2438d3 2457 * digitally-signed struct {
switches 0:5c4d7b2438d3 2458 * opaque client_random[32];
switches 0:5c4d7b2438d3 2459 * opaque server_random[32];
switches 0:5c4d7b2438d3 2460 * ServerDHParams params;
switches 0:5c4d7b2438d3 2461 * };
switches 0:5c4d7b2438d3 2462 */
switches 0:5c4d7b2438d3 2463 if( ( ret = mbedtls_md_setup( &ctx,
switches 0:5c4d7b2438d3 2464 mbedtls_md_info_from_type( md_alg ), 0 ) ) != 0 )
switches 0:5c4d7b2438d3 2465 {
switches 0:5c4d7b2438d3 2466 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
switches 0:5c4d7b2438d3 2467 return( ret );
switches 0:5c4d7b2438d3 2468 }
switches 0:5c4d7b2438d3 2469
switches 0:5c4d7b2438d3 2470 mbedtls_md_starts( &ctx );
switches 0:5c4d7b2438d3 2471 mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 );
switches 0:5c4d7b2438d3 2472 mbedtls_md_update( &ctx, params, params_len );
switches 0:5c4d7b2438d3 2473 mbedtls_md_finish( &ctx, hash );
switches 0:5c4d7b2438d3 2474 mbedtls_md_free( &ctx );
switches 0:5c4d7b2438d3 2475 }
switches 0:5c4d7b2438d3 2476 else
switches 0:5c4d7b2438d3 2477 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
switches 0:5c4d7b2438d3 2478 MBEDTLS_SSL_PROTO_TLS1_2 */
switches 0:5c4d7b2438d3 2479 {
switches 0:5c4d7b2438d3 2480 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 2481 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 2482 }
switches 0:5c4d7b2438d3 2483
switches 0:5c4d7b2438d3 2484 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
switches 0:5c4d7b2438d3 2485 (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );
switches 0:5c4d7b2438d3 2486
switches 0:5c4d7b2438d3 2487 if( ssl->session_negotiate->peer_cert == NULL )
switches 0:5c4d7b2438d3 2488 {
switches 0:5c4d7b2438d3 2489 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
switches 0:5c4d7b2438d3 2490 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 2491 }
switches 0:5c4d7b2438d3 2492
switches 0:5c4d7b2438d3 2493 /*
switches 0:5c4d7b2438d3 2494 * Verify signature
switches 0:5c4d7b2438d3 2495 */
switches 0:5c4d7b2438d3 2496 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
switches 0:5c4d7b2438d3 2497 {
switches 0:5c4d7b2438d3 2498 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
switches 0:5c4d7b2438d3 2499 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
switches 0:5c4d7b2438d3 2500 }
switches 0:5c4d7b2438d3 2501
switches 0:5c4d7b2438d3 2502 if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,
switches 0:5c4d7b2438d3 2503 md_alg, hash, hashlen, p, sig_len ) ) != 0 )
switches 0:5c4d7b2438d3 2504 {
switches 0:5c4d7b2438d3 2505 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
switches 0:5c4d7b2438d3 2506 return( ret );
switches 0:5c4d7b2438d3 2507 }
switches 0:5c4d7b2438d3 2508 }
switches 0:5c4d7b2438d3 2509 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2510 MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2511 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 2512
switches 0:5c4d7b2438d3 2513 exit:
switches 0:5c4d7b2438d3 2514 ssl->state++;
switches 0:5c4d7b2438d3 2515
switches 0:5c4d7b2438d3 2516 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
switches 0:5c4d7b2438d3 2517
switches 0:5c4d7b2438d3 2518 return( 0 );
switches 0:5c4d7b2438d3 2519 }
switches 0:5c4d7b2438d3 2520
switches 0:5c4d7b2438d3 2521 #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2522 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2523 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2524 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2525 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
switches 0:5c4d7b2438d3 2526 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2527 static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 2528 {
switches 0:5c4d7b2438d3 2529 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
switches 0:5c4d7b2438d3 2530
switches 0:5c4d7b2438d3 2531 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
switches 0:5c4d7b2438d3 2532
switches 0:5c4d7b2438d3 2533 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 2534 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
switches 0:5c4d7b2438d3 2535 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
switches 0:5c4d7b2438d3 2536 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
switches 0:5c4d7b2438d3 2537 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
switches 0:5c4d7b2438d3 2538 {
switches 0:5c4d7b2438d3 2539 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
switches 0:5c4d7b2438d3 2540 ssl->state++;
switches 0:5c4d7b2438d3 2541 return( 0 );
switches 0:5c4d7b2438d3 2542 }
switches 0:5c4d7b2438d3 2543
switches 0:5c4d7b2438d3 2544 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 2545 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 2546 }
switches 0:5c4d7b2438d3 2547 #else
switches 0:5c4d7b2438d3 2548 static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 2549 {
switches 0:5c4d7b2438d3 2550 int ret;
switches 0:5c4d7b2438d3 2551 unsigned char *buf;
switches 0:5c4d7b2438d3 2552 size_t n = 0;
switches 0:5c4d7b2438d3 2553 size_t cert_type_len = 0, dn_len = 0;
switches 0:5c4d7b2438d3 2554 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
switches 0:5c4d7b2438d3 2555
switches 0:5c4d7b2438d3 2556 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
switches 0:5c4d7b2438d3 2557
switches 0:5c4d7b2438d3 2558 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 2559 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
switches 0:5c4d7b2438d3 2560 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
switches 0:5c4d7b2438d3 2561 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
switches 0:5c4d7b2438d3 2562 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
switches 0:5c4d7b2438d3 2563 {
switches 0:5c4d7b2438d3 2564 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
switches 0:5c4d7b2438d3 2565 ssl->state++;
switches 0:5c4d7b2438d3 2566 return( 0 );
switches 0:5c4d7b2438d3 2567 }
switches 0:5c4d7b2438d3 2568
switches 0:5c4d7b2438d3 2569 if( ssl->record_read == 0 )
switches 0:5c4d7b2438d3 2570 {
switches 0:5c4d7b2438d3 2571 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 2572 {
switches 0:5c4d7b2438d3 2573 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
switches 0:5c4d7b2438d3 2574 return( ret );
switches 0:5c4d7b2438d3 2575 }
switches 0:5c4d7b2438d3 2576
switches 0:5c4d7b2438d3 2577 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
switches 0:5c4d7b2438d3 2578 {
switches 0:5c4d7b2438d3 2579 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
switches 0:5c4d7b2438d3 2580 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 2581 }
switches 0:5c4d7b2438d3 2582
switches 0:5c4d7b2438d3 2583 ssl->record_read = 1;
switches 0:5c4d7b2438d3 2584 }
switches 0:5c4d7b2438d3 2585
switches 0:5c4d7b2438d3 2586 ssl->client_auth = 0;
switches 0:5c4d7b2438d3 2587 ssl->state++;
switches 0:5c4d7b2438d3 2588
switches 0:5c4d7b2438d3 2589 if( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST )
switches 0:5c4d7b2438d3 2590 ssl->client_auth++;
switches 0:5c4d7b2438d3 2591
switches 0:5c4d7b2438d3 2592 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
switches 0:5c4d7b2438d3 2593 ssl->client_auth ? "a" : "no" ) );
switches 0:5c4d7b2438d3 2594
switches 0:5c4d7b2438d3 2595 if( ssl->client_auth == 0 )
switches 0:5c4d7b2438d3 2596 goto exit;
switches 0:5c4d7b2438d3 2597
switches 0:5c4d7b2438d3 2598 ssl->record_read = 0;
switches 0:5c4d7b2438d3 2599
switches 0:5c4d7b2438d3 2600 /*
switches 0:5c4d7b2438d3 2601 * struct {
switches 0:5c4d7b2438d3 2602 * ClientCertificateType certificate_types<1..2^8-1>;
switches 0:5c4d7b2438d3 2603 * SignatureAndHashAlgorithm
switches 0:5c4d7b2438d3 2604 * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
switches 0:5c4d7b2438d3 2605 * DistinguishedName certificate_authorities<0..2^16-1>;
switches 0:5c4d7b2438d3 2606 * } CertificateRequest;
switches 0:5c4d7b2438d3 2607 *
switches 0:5c4d7b2438d3 2608 * Since we only support a single certificate on clients, let's just
switches 0:5c4d7b2438d3 2609 * ignore all the information that's supposed to help us pick a
switches 0:5c4d7b2438d3 2610 * certificate.
switches 0:5c4d7b2438d3 2611 *
switches 0:5c4d7b2438d3 2612 * We could check that our certificate matches the request, and bail out
switches 0:5c4d7b2438d3 2613 * if it doesn't, but it's simpler to just send the certificate anyway,
switches 0:5c4d7b2438d3 2614 * and give the server the opportunity to decide if it should terminate
switches 0:5c4d7b2438d3 2615 * the connection when it doesn't like our certificate.
switches 0:5c4d7b2438d3 2616 *
switches 0:5c4d7b2438d3 2617 * Same goes for the hash in TLS 1.2's signature_algorithms: at this
switches 0:5c4d7b2438d3 2618 * point we only have one hash available (see comments in
switches 0:5c4d7b2438d3 2619 * write_certificate_verify), so let's just use what we have.
switches 0:5c4d7b2438d3 2620 *
switches 0:5c4d7b2438d3 2621 * However, we still minimally parse the message to check it is at least
switches 0:5c4d7b2438d3 2622 * superficially sane.
switches 0:5c4d7b2438d3 2623 */
switches 0:5c4d7b2438d3 2624 buf = ssl->in_msg;
switches 0:5c4d7b2438d3 2625
switches 0:5c4d7b2438d3 2626 /* certificate_types */
switches 0:5c4d7b2438d3 2627 cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
switches 0:5c4d7b2438d3 2628 n = cert_type_len;
switches 0:5c4d7b2438d3 2629
switches 0:5c4d7b2438d3 2630 if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
switches 0:5c4d7b2438d3 2631 {
switches 0:5c4d7b2438d3 2632 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
switches 0:5c4d7b2438d3 2633 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
switches 0:5c4d7b2438d3 2634 }
switches 0:5c4d7b2438d3 2635
switches 0:5c4d7b2438d3 2636 /* supported_signature_algorithms */
switches 0:5c4d7b2438d3 2637 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
switches 0:5c4d7b2438d3 2638 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
switches 0:5c4d7b2438d3 2639 {
switches 0:5c4d7b2438d3 2640 size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
switches 0:5c4d7b2438d3 2641 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
switches 0:5c4d7b2438d3 2642 #if defined(MBEDTLS_DEBUG_C)
switches 0:5c4d7b2438d3 2643 unsigned char* sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
switches 0:5c4d7b2438d3 2644 size_t i;
switches 0:5c4d7b2438d3 2645
switches 0:5c4d7b2438d3 2646 for( i = 0; i < sig_alg_len; i += 2 )
switches 0:5c4d7b2438d3 2647 {
switches 0:5c4d7b2438d3 2648 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Signature Algorithm found: %d,%d", sig_alg[i], sig_alg[i + 1] ) );
switches 0:5c4d7b2438d3 2649 }
switches 0:5c4d7b2438d3 2650 #endif
switches 0:5c4d7b2438d3 2651
switches 0:5c4d7b2438d3 2652 n += 2 + sig_alg_len;
switches 0:5c4d7b2438d3 2653
switches 0:5c4d7b2438d3 2654 if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
switches 0:5c4d7b2438d3 2655 {
switches 0:5c4d7b2438d3 2656 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
switches 0:5c4d7b2438d3 2657 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
switches 0:5c4d7b2438d3 2658 }
switches 0:5c4d7b2438d3 2659 }
switches 0:5c4d7b2438d3 2660 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
switches 0:5c4d7b2438d3 2661
switches 0:5c4d7b2438d3 2662 /* certificate_authorities */
switches 0:5c4d7b2438d3 2663 dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
switches 0:5c4d7b2438d3 2664 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
switches 0:5c4d7b2438d3 2665
switches 0:5c4d7b2438d3 2666 n += dn_len;
switches 0:5c4d7b2438d3 2667 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
switches 0:5c4d7b2438d3 2668 {
switches 0:5c4d7b2438d3 2669 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
switches 0:5c4d7b2438d3 2670 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
switches 0:5c4d7b2438d3 2671 }
switches 0:5c4d7b2438d3 2672
switches 0:5c4d7b2438d3 2673 exit:
switches 0:5c4d7b2438d3 2674 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
switches 0:5c4d7b2438d3 2675
switches 0:5c4d7b2438d3 2676 return( 0 );
switches 0:5c4d7b2438d3 2677 }
switches 0:5c4d7b2438d3 2678 #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
switches 0:5c4d7b2438d3 2679 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
switches 0:5c4d7b2438d3 2680 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
switches 0:5c4d7b2438d3 2681 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
switches 0:5c4d7b2438d3 2682 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
switches 0:5c4d7b2438d3 2683 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 2684
switches 0:5c4d7b2438d3 2685 static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 2686 {
switches 0:5c4d7b2438d3 2687 int ret;
switches 0:5c4d7b2438d3 2688
switches 0:5c4d7b2438d3 2689 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
switches 0:5c4d7b2438d3 2690
switches 0:5c4d7b2438d3 2691 if( ssl->record_read == 0 )
switches 0:5c4d7b2438d3 2692 {
switches 0:5c4d7b2438d3 2693 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 2694 {
switches 0:5c4d7b2438d3 2695 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
switches 0:5c4d7b2438d3 2696 return( ret );
switches 0:5c4d7b2438d3 2697 }
switches 0:5c4d7b2438d3 2698
switches 0:5c4d7b2438d3 2699 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
switches 0:5c4d7b2438d3 2700 {
switches 0:5c4d7b2438d3 2701 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
switches 0:5c4d7b2438d3 2702 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 2703 }
switches 0:5c4d7b2438d3 2704 }
switches 0:5c4d7b2438d3 2705 ssl->record_read = 0;
switches 0:5c4d7b2438d3 2706
switches 0:5c4d7b2438d3 2707 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
switches 0:5c4d7b2438d3 2708 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
switches 0:5c4d7b2438d3 2709 {
switches 0:5c4d7b2438d3 2710 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
switches 0:5c4d7b2438d3 2711 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
switches 0:5c4d7b2438d3 2712 }
switches 0:5c4d7b2438d3 2713
switches 0:5c4d7b2438d3 2714 ssl->state++;
switches 0:5c4d7b2438d3 2715
switches 0:5c4d7b2438d3 2716 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 2717 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
switches 0:5c4d7b2438d3 2718 mbedtls_ssl_recv_flight_completed( ssl );
switches 0:5c4d7b2438d3 2719 #endif
switches 0:5c4d7b2438d3 2720
switches 0:5c4d7b2438d3 2721 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
switches 0:5c4d7b2438d3 2722
switches 0:5c4d7b2438d3 2723 return( 0 );
switches 0:5c4d7b2438d3 2724 }
switches 0:5c4d7b2438d3 2725
switches 0:5c4d7b2438d3 2726 static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 2727 {
switches 0:5c4d7b2438d3 2728 int ret;
switches 0:5c4d7b2438d3 2729 size_t i, n;
switches 0:5c4d7b2438d3 2730 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
switches 0:5c4d7b2438d3 2731
switches 0:5c4d7b2438d3 2732 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
switches 0:5c4d7b2438d3 2733
switches 0:5c4d7b2438d3 2734 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
switches 0:5c4d7b2438d3 2735 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
switches 0:5c4d7b2438d3 2736 {
switches 0:5c4d7b2438d3 2737 /*
switches 0:5c4d7b2438d3 2738 * DHM key exchange -- send G^X mod P
switches 0:5c4d7b2438d3 2739 */
switches 0:5c4d7b2438d3 2740 n = ssl->handshake->dhm_ctx.len;
switches 0:5c4d7b2438d3 2741
switches 0:5c4d7b2438d3 2742 ssl->out_msg[4] = (unsigned char)( n >> 8 );
switches 0:5c4d7b2438d3 2743 ssl->out_msg[5] = (unsigned char)( n );
switches 0:5c4d7b2438d3 2744 i = 6;
switches 0:5c4d7b2438d3 2745
switches 0:5c4d7b2438d3 2746 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
switches 0:5c4d7b2438d3 2747 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
switches 0:5c4d7b2438d3 2748 &ssl->out_msg[i], n,
switches 0:5c4d7b2438d3 2749 ssl->conf->f_rng, ssl->conf->p_rng );
switches 0:5c4d7b2438d3 2750 if( ret != 0 )
switches 0:5c4d7b2438d3 2751 {
switches 0:5c4d7b2438d3 2752 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
switches 0:5c4d7b2438d3 2753 return( ret );
switches 0:5c4d7b2438d3 2754 }
switches 0:5c4d7b2438d3 2755
switches 0:5c4d7b2438d3 2756 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
switches 0:5c4d7b2438d3 2757 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
switches 0:5c4d7b2438d3 2758
switches 0:5c4d7b2438d3 2759 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
switches 0:5c4d7b2438d3 2760 ssl->handshake->premaster,
switches 0:5c4d7b2438d3 2761 MBEDTLS_PREMASTER_SIZE,
switches 0:5c4d7b2438d3 2762 &ssl->handshake->pmslen,
switches 0:5c4d7b2438d3 2763 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
switches 0:5c4d7b2438d3 2764 {
switches 0:5c4d7b2438d3 2765 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
switches 0:5c4d7b2438d3 2766 return( ret );
switches 0:5c4d7b2438d3 2767 }
switches 0:5c4d7b2438d3 2768
switches 0:5c4d7b2438d3 2769 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
switches 0:5c4d7b2438d3 2770 }
switches 0:5c4d7b2438d3 2771 else
switches 0:5c4d7b2438d3 2772 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
switches 0:5c4d7b2438d3 2773 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2774 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
switches 0:5c4d7b2438d3 2775 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
switches 0:5c4d7b2438d3 2776 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2777 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
switches 0:5c4d7b2438d3 2778 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
switches 0:5c4d7b2438d3 2779 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
switches 0:5c4d7b2438d3 2780 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
switches 0:5c4d7b2438d3 2781 {
switches 0:5c4d7b2438d3 2782 /*
switches 0:5c4d7b2438d3 2783 * ECDH key exchange -- send client public value
switches 0:5c4d7b2438d3 2784 */
switches 0:5c4d7b2438d3 2785 i = 4;
switches 0:5c4d7b2438d3 2786
switches 0:5c4d7b2438d3 2787 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
switches 0:5c4d7b2438d3 2788 &n,
switches 0:5c4d7b2438d3 2789 &ssl->out_msg[i], 1000,
switches 0:5c4d7b2438d3 2790 ssl->conf->f_rng, ssl->conf->p_rng );
switches 0:5c4d7b2438d3 2791 if( ret != 0 )
switches 0:5c4d7b2438d3 2792 {
switches 0:5c4d7b2438d3 2793 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
switches 0:5c4d7b2438d3 2794 return( ret );
switches 0:5c4d7b2438d3 2795 }
switches 0:5c4d7b2438d3 2796
switches 0:5c4d7b2438d3 2797 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
switches 0:5c4d7b2438d3 2798
switches 0:5c4d7b2438d3 2799 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
switches 0:5c4d7b2438d3 2800 &ssl->handshake->pmslen,
switches 0:5c4d7b2438d3 2801 ssl->handshake->premaster,
switches 0:5c4d7b2438d3 2802 MBEDTLS_MPI_MAX_SIZE,
switches 0:5c4d7b2438d3 2803 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
switches 0:5c4d7b2438d3 2804 {
switches 0:5c4d7b2438d3 2805 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
switches 0:5c4d7b2438d3 2806 return( ret );
switches 0:5c4d7b2438d3 2807 }
switches 0:5c4d7b2438d3 2808
switches 0:5c4d7b2438d3 2809 MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
switches 0:5c4d7b2438d3 2810 }
switches 0:5c4d7b2438d3 2811 else
switches 0:5c4d7b2438d3 2812 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2813 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
switches 0:5c4d7b2438d3 2814 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
switches 0:5c4d7b2438d3 2815 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 2816 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
switches 0:5c4d7b2438d3 2817 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 2818 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
switches 0:5c4d7b2438d3 2819 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
switches 0:5c4d7b2438d3 2820 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
switches 0:5c4d7b2438d3 2821 {
switches 0:5c4d7b2438d3 2822 /*
switches 0:5c4d7b2438d3 2823 * opaque psk_identity<0..2^16-1>;
switches 0:5c4d7b2438d3 2824 */
switches 0:5c4d7b2438d3 2825 if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )
switches 0:5c4d7b2438d3 2826 {
switches 0:5c4d7b2438d3 2827 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) );
switches 0:5c4d7b2438d3 2828 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
switches 0:5c4d7b2438d3 2829 }
switches 0:5c4d7b2438d3 2830
switches 0:5c4d7b2438d3 2831 i = 4;
switches 0:5c4d7b2438d3 2832 n = ssl->conf->psk_identity_len;
switches 0:5c4d7b2438d3 2833
switches 0:5c4d7b2438d3 2834 if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
switches 0:5c4d7b2438d3 2835 {
switches 0:5c4d7b2438d3 2836 MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or "
switches 0:5c4d7b2438d3 2837 "SSL buffer too short" ) );
switches 0:5c4d7b2438d3 2838 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
switches 0:5c4d7b2438d3 2839 }
switches 0:5c4d7b2438d3 2840
switches 0:5c4d7b2438d3 2841 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
switches 0:5c4d7b2438d3 2842 ssl->out_msg[i++] = (unsigned char)( n );
switches 0:5c4d7b2438d3 2843
switches 0:5c4d7b2438d3 2844 memcpy( ssl->out_msg + i, ssl->conf->psk_identity, ssl->conf->psk_identity_len );
switches 0:5c4d7b2438d3 2845 i += ssl->conf->psk_identity_len;
switches 0:5c4d7b2438d3 2846
switches 0:5c4d7b2438d3 2847 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
switches 0:5c4d7b2438d3 2848 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
switches 0:5c4d7b2438d3 2849 {
switches 0:5c4d7b2438d3 2850 n = 0;
switches 0:5c4d7b2438d3 2851 }
switches 0:5c4d7b2438d3 2852 else
switches 0:5c4d7b2438d3 2853 #endif
switches 0:5c4d7b2438d3 2854 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
switches 0:5c4d7b2438d3 2855 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
switches 0:5c4d7b2438d3 2856 {
switches 0:5c4d7b2438d3 2857 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
switches 0:5c4d7b2438d3 2858 return( ret );
switches 0:5c4d7b2438d3 2859 }
switches 0:5c4d7b2438d3 2860 else
switches 0:5c4d7b2438d3 2861 #endif
switches 0:5c4d7b2438d3 2862 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
switches 0:5c4d7b2438d3 2863 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
switches 0:5c4d7b2438d3 2864 {
switches 0:5c4d7b2438d3 2865 /*
switches 0:5c4d7b2438d3 2866 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
switches 0:5c4d7b2438d3 2867 */
switches 0:5c4d7b2438d3 2868 n = ssl->handshake->dhm_ctx.len;
switches 0:5c4d7b2438d3 2869
switches 0:5c4d7b2438d3 2870 if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
switches 0:5c4d7b2438d3 2871 {
switches 0:5c4d7b2438d3 2872 MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long"
switches 0:5c4d7b2438d3 2873 " or SSL buffer too short" ) );
switches 0:5c4d7b2438d3 2874 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
switches 0:5c4d7b2438d3 2875 }
switches 0:5c4d7b2438d3 2876
switches 0:5c4d7b2438d3 2877 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
switches 0:5c4d7b2438d3 2878 ssl->out_msg[i++] = (unsigned char)( n );
switches 0:5c4d7b2438d3 2879
switches 0:5c4d7b2438d3 2880 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
switches 0:5c4d7b2438d3 2881 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
switches 0:5c4d7b2438d3 2882 &ssl->out_msg[i], n,
switches 0:5c4d7b2438d3 2883 ssl->conf->f_rng, ssl->conf->p_rng );
switches 0:5c4d7b2438d3 2884 if( ret != 0 )
switches 0:5c4d7b2438d3 2885 {
switches 0:5c4d7b2438d3 2886 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
switches 0:5c4d7b2438d3 2887 return( ret );
switches 0:5c4d7b2438d3 2888 }
switches 0:5c4d7b2438d3 2889 }
switches 0:5c4d7b2438d3 2890 else
switches 0:5c4d7b2438d3 2891 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
switches 0:5c4d7b2438d3 2892 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
switches 0:5c4d7b2438d3 2893 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
switches 0:5c4d7b2438d3 2894 {
switches 0:5c4d7b2438d3 2895 /*
switches 0:5c4d7b2438d3 2896 * ClientECDiffieHellmanPublic public;
switches 0:5c4d7b2438d3 2897 */
switches 0:5c4d7b2438d3 2898 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
switches 0:5c4d7b2438d3 2899 &ssl->out_msg[i], MBEDTLS_SSL_MAX_CONTENT_LEN - i,
switches 0:5c4d7b2438d3 2900 ssl->conf->f_rng, ssl->conf->p_rng );
switches 0:5c4d7b2438d3 2901 if( ret != 0 )
switches 0:5c4d7b2438d3 2902 {
switches 0:5c4d7b2438d3 2903 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
switches 0:5c4d7b2438d3 2904 return( ret );
switches 0:5c4d7b2438d3 2905 }
switches 0:5c4d7b2438d3 2906
switches 0:5c4d7b2438d3 2907 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
switches 0:5c4d7b2438d3 2908 }
switches 0:5c4d7b2438d3 2909 else
switches 0:5c4d7b2438d3 2910 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
switches 0:5c4d7b2438d3 2911 {
switches 0:5c4d7b2438d3 2912 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 2913 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 2914 }
switches 0:5c4d7b2438d3 2915
switches 0:5c4d7b2438d3 2916 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
switches 0:5c4d7b2438d3 2917 ciphersuite_info->key_exchange ) ) != 0 )
switches 0:5c4d7b2438d3 2918 {
switches 0:5c4d7b2438d3 2919 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
switches 0:5c4d7b2438d3 2920 return( ret );
switches 0:5c4d7b2438d3 2921 }
switches 0:5c4d7b2438d3 2922 }
switches 0:5c4d7b2438d3 2923 else
switches 0:5c4d7b2438d3 2924 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
switches 0:5c4d7b2438d3 2925 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
switches 0:5c4d7b2438d3 2926 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
switches 0:5c4d7b2438d3 2927 {
switches 0:5c4d7b2438d3 2928 i = 4;
switches 0:5c4d7b2438d3 2929 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
switches 0:5c4d7b2438d3 2930 return( ret );
switches 0:5c4d7b2438d3 2931 }
switches 0:5c4d7b2438d3 2932 else
switches 0:5c4d7b2438d3 2933 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
switches 0:5c4d7b2438d3 2934 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
switches 0:5c4d7b2438d3 2935 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
switches 0:5c4d7b2438d3 2936 {
switches 0:5c4d7b2438d3 2937 i = 4;
switches 0:5c4d7b2438d3 2938
switches 0:5c4d7b2438d3 2939 ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
switches 0:5c4d7b2438d3 2940 ssl->out_msg + i, MBEDTLS_SSL_MAX_CONTENT_LEN - i, &n,
switches 0:5c4d7b2438d3 2941 ssl->conf->f_rng, ssl->conf->p_rng );
switches 0:5c4d7b2438d3 2942 if( ret != 0 )
switches 0:5c4d7b2438d3 2943 {
switches 0:5c4d7b2438d3 2944 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
switches 0:5c4d7b2438d3 2945 return( ret );
switches 0:5c4d7b2438d3 2946 }
switches 0:5c4d7b2438d3 2947
switches 0:5c4d7b2438d3 2948 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
switches 0:5c4d7b2438d3 2949 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
switches 0:5c4d7b2438d3 2950 ssl->conf->f_rng, ssl->conf->p_rng );
switches 0:5c4d7b2438d3 2951 if( ret != 0 )
switches 0:5c4d7b2438d3 2952 {
switches 0:5c4d7b2438d3 2953 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
switches 0:5c4d7b2438d3 2954 return( ret );
switches 0:5c4d7b2438d3 2955 }
switches 0:5c4d7b2438d3 2956 }
switches 0:5c4d7b2438d3 2957 else
switches 0:5c4d7b2438d3 2958 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
switches 0:5c4d7b2438d3 2959 {
switches 0:5c4d7b2438d3 2960 ((void) ciphersuite_info);
switches 0:5c4d7b2438d3 2961 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 2962 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 2963 }
switches 0:5c4d7b2438d3 2964
switches 0:5c4d7b2438d3 2965 ssl->out_msglen = i + n;
switches 0:5c4d7b2438d3 2966 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
switches 0:5c4d7b2438d3 2967 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
switches 0:5c4d7b2438d3 2968
switches 0:5c4d7b2438d3 2969 ssl->state++;
switches 0:5c4d7b2438d3 2970
switches 0:5c4d7b2438d3 2971 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 2972 {
switches 0:5c4d7b2438d3 2973 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
switches 0:5c4d7b2438d3 2974 return( ret );
switches 0:5c4d7b2438d3 2975 }
switches 0:5c4d7b2438d3 2976
switches 0:5c4d7b2438d3 2977 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
switches 0:5c4d7b2438d3 2978
switches 0:5c4d7b2438d3 2979 return( 0 );
switches 0:5c4d7b2438d3 2980 }
switches 0:5c4d7b2438d3 2981
switches 0:5c4d7b2438d3 2982 #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2983 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2984 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2985 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
switches 0:5c4d7b2438d3 2986 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
switches 0:5c4d7b2438d3 2987 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
switches 0:5c4d7b2438d3 2988 static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 2989 {
switches 0:5c4d7b2438d3 2990 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
switches 0:5c4d7b2438d3 2991 int ret;
switches 0:5c4d7b2438d3 2992
switches 0:5c4d7b2438d3 2993 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
switches 0:5c4d7b2438d3 2994
switches 0:5c4d7b2438d3 2995 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 2996 {
switches 0:5c4d7b2438d3 2997 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
switches 0:5c4d7b2438d3 2998 return( ret );
switches 0:5c4d7b2438d3 2999 }
switches 0:5c4d7b2438d3 3000
switches 0:5c4d7b2438d3 3001 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 3002 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
switches 0:5c4d7b2438d3 3003 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
switches 0:5c4d7b2438d3 3004 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
switches 0:5c4d7b2438d3 3005 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
switches 0:5c4d7b2438d3 3006 {
switches 0:5c4d7b2438d3 3007 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
switches 0:5c4d7b2438d3 3008 ssl->state++;
switches 0:5c4d7b2438d3 3009 return( 0 );
switches 0:5c4d7b2438d3 3010 }
switches 0:5c4d7b2438d3 3011
switches 0:5c4d7b2438d3 3012 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 3013 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 3014 }
switches 0:5c4d7b2438d3 3015 #else
switches 0:5c4d7b2438d3 3016 static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 3017 {
switches 0:5c4d7b2438d3 3018 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
switches 0:5c4d7b2438d3 3019 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
switches 0:5c4d7b2438d3 3020 size_t n = 0, offset = 0;
switches 0:5c4d7b2438d3 3021 unsigned char hash[48];
switches 0:5c4d7b2438d3 3022 unsigned char *hash_start = hash;
switches 0:5c4d7b2438d3 3023 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
switches 0:5c4d7b2438d3 3024 unsigned int hashlen;
switches 0:5c4d7b2438d3 3025
switches 0:5c4d7b2438d3 3026 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
switches 0:5c4d7b2438d3 3027
switches 0:5c4d7b2438d3 3028 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 3029 {
switches 0:5c4d7b2438d3 3030 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
switches 0:5c4d7b2438d3 3031 return( ret );
switches 0:5c4d7b2438d3 3032 }
switches 0:5c4d7b2438d3 3033
switches 0:5c4d7b2438d3 3034 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
switches 0:5c4d7b2438d3 3035 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
switches 0:5c4d7b2438d3 3036 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
switches 0:5c4d7b2438d3 3037 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
switches 0:5c4d7b2438d3 3038 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
switches 0:5c4d7b2438d3 3039 {
switches 0:5c4d7b2438d3 3040 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
switches 0:5c4d7b2438d3 3041 ssl->state++;
switches 0:5c4d7b2438d3 3042 return( 0 );
switches 0:5c4d7b2438d3 3043 }
switches 0:5c4d7b2438d3 3044
switches 0:5c4d7b2438d3 3045 if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
switches 0:5c4d7b2438d3 3046 {
switches 0:5c4d7b2438d3 3047 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
switches 0:5c4d7b2438d3 3048 ssl->state++;
switches 0:5c4d7b2438d3 3049 return( 0 );
switches 0:5c4d7b2438d3 3050 }
switches 0:5c4d7b2438d3 3051
switches 0:5c4d7b2438d3 3052 if( mbedtls_ssl_own_key( ssl ) == NULL )
switches 0:5c4d7b2438d3 3053 {
switches 0:5c4d7b2438d3 3054 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
switches 0:5c4d7b2438d3 3055 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
switches 0:5c4d7b2438d3 3056 }
switches 0:5c4d7b2438d3 3057
switches 0:5c4d7b2438d3 3058 /*
switches 0:5c4d7b2438d3 3059 * Make an RSA signature of the handshake digests
switches 0:5c4d7b2438d3 3060 */
switches 0:5c4d7b2438d3 3061 ssl->handshake->calc_verify( ssl, hash );
switches 0:5c4d7b2438d3 3062
switches 0:5c4d7b2438d3 3063 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
switches 0:5c4d7b2438d3 3064 defined(MBEDTLS_SSL_PROTO_TLS1_1)
switches 0:5c4d7b2438d3 3065 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
switches 0:5c4d7b2438d3 3066 {
switches 0:5c4d7b2438d3 3067 /*
switches 0:5c4d7b2438d3 3068 * digitally-signed struct {
switches 0:5c4d7b2438d3 3069 * opaque md5_hash[16];
switches 0:5c4d7b2438d3 3070 * opaque sha_hash[20];
switches 0:5c4d7b2438d3 3071 * };
switches 0:5c4d7b2438d3 3072 *
switches 0:5c4d7b2438d3 3073 * md5_hash
switches 0:5c4d7b2438d3 3074 * MD5(handshake_messages);
switches 0:5c4d7b2438d3 3075 *
switches 0:5c4d7b2438d3 3076 * sha_hash
switches 0:5c4d7b2438d3 3077 * SHA(handshake_messages);
switches 0:5c4d7b2438d3 3078 */
switches 0:5c4d7b2438d3 3079 hashlen = 36;
switches 0:5c4d7b2438d3 3080 md_alg = MBEDTLS_MD_NONE;
switches 0:5c4d7b2438d3 3081
switches 0:5c4d7b2438d3 3082 /*
switches 0:5c4d7b2438d3 3083 * For ECDSA, default hash is SHA-1 only
switches 0:5c4d7b2438d3 3084 */
switches 0:5c4d7b2438d3 3085 if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
switches 0:5c4d7b2438d3 3086 {
switches 0:5c4d7b2438d3 3087 hash_start += 16;
switches 0:5c4d7b2438d3 3088 hashlen -= 16;
switches 0:5c4d7b2438d3 3089 md_alg = MBEDTLS_MD_SHA1;
switches 0:5c4d7b2438d3 3090 }
switches 0:5c4d7b2438d3 3091 }
switches 0:5c4d7b2438d3 3092 else
switches 0:5c4d7b2438d3 3093 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
switches 0:5c4d7b2438d3 3094 MBEDTLS_SSL_PROTO_TLS1_1 */
switches 0:5c4d7b2438d3 3095 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
switches 0:5c4d7b2438d3 3096 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
switches 0:5c4d7b2438d3 3097 {
switches 0:5c4d7b2438d3 3098 /*
switches 0:5c4d7b2438d3 3099 * digitally-signed struct {
switches 0:5c4d7b2438d3 3100 * opaque handshake_messages[handshake_messages_length];
switches 0:5c4d7b2438d3 3101 * };
switches 0:5c4d7b2438d3 3102 *
switches 0:5c4d7b2438d3 3103 * Taking shortcut here. We assume that the server always allows the
switches 0:5c4d7b2438d3 3104 * PRF Hash function and has sent it in the allowed signature
switches 0:5c4d7b2438d3 3105 * algorithms list received in the Certificate Request message.
switches 0:5c4d7b2438d3 3106 *
switches 0:5c4d7b2438d3 3107 * Until we encounter a server that does not, we will take this
switches 0:5c4d7b2438d3 3108 * shortcut.
switches 0:5c4d7b2438d3 3109 *
switches 0:5c4d7b2438d3 3110 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
switches 0:5c4d7b2438d3 3111 * in order to satisfy 'weird' needs from the server side.
switches 0:5c4d7b2438d3 3112 */
switches 0:5c4d7b2438d3 3113 if( ssl->transform_negotiate->ciphersuite_info->mac ==
switches 0:5c4d7b2438d3 3114 MBEDTLS_MD_SHA384 )
switches 0:5c4d7b2438d3 3115 {
switches 0:5c4d7b2438d3 3116 md_alg = MBEDTLS_MD_SHA384;
switches 0:5c4d7b2438d3 3117 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
switches 0:5c4d7b2438d3 3118 }
switches 0:5c4d7b2438d3 3119 else
switches 0:5c4d7b2438d3 3120 {
switches 0:5c4d7b2438d3 3121 md_alg = MBEDTLS_MD_SHA256;
switches 0:5c4d7b2438d3 3122 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
switches 0:5c4d7b2438d3 3123 }
switches 0:5c4d7b2438d3 3124 ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
switches 0:5c4d7b2438d3 3125
switches 0:5c4d7b2438d3 3126 /* Info from md_alg will be used instead */
switches 0:5c4d7b2438d3 3127 hashlen = 0;
switches 0:5c4d7b2438d3 3128 offset = 2;
switches 0:5c4d7b2438d3 3129 }
switches 0:5c4d7b2438d3 3130 else
switches 0:5c4d7b2438d3 3131 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
switches 0:5c4d7b2438d3 3132 {
switches 0:5c4d7b2438d3 3133 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
switches 0:5c4d7b2438d3 3134 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
switches 0:5c4d7b2438d3 3135 }
switches 0:5c4d7b2438d3 3136
switches 0:5c4d7b2438d3 3137 if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen,
switches 0:5c4d7b2438d3 3138 ssl->out_msg + 6 + offset, &n,
switches 0:5c4d7b2438d3 3139 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
switches 0:5c4d7b2438d3 3140 {
switches 0:5c4d7b2438d3 3141 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
switches 0:5c4d7b2438d3 3142 return( ret );
switches 0:5c4d7b2438d3 3143 }
switches 0:5c4d7b2438d3 3144
switches 0:5c4d7b2438d3 3145 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
switches 0:5c4d7b2438d3 3146 ssl->out_msg[5 + offset] = (unsigned char)( n );
switches 0:5c4d7b2438d3 3147
switches 0:5c4d7b2438d3 3148 ssl->out_msglen = 6 + n + offset;
switches 0:5c4d7b2438d3 3149 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
switches 0:5c4d7b2438d3 3150 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
switches 0:5c4d7b2438d3 3151
switches 0:5c4d7b2438d3 3152 ssl->state++;
switches 0:5c4d7b2438d3 3153
switches 0:5c4d7b2438d3 3154 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 3155 {
switches 0:5c4d7b2438d3 3156 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
switches 0:5c4d7b2438d3 3157 return( ret );
switches 0:5c4d7b2438d3 3158 }
switches 0:5c4d7b2438d3 3159
switches 0:5c4d7b2438d3 3160 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
switches 0:5c4d7b2438d3 3161
switches 0:5c4d7b2438d3 3162 return( ret );
switches 0:5c4d7b2438d3 3163 }
switches 0:5c4d7b2438d3 3164 #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
switches 0:5c4d7b2438d3 3165 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
switches 0:5c4d7b2438d3 3166 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
switches 0:5c4d7b2438d3 3167 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
switches 0:5c4d7b2438d3 3168 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
switches 0:5c4d7b2438d3 3169 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
switches 0:5c4d7b2438d3 3170
switches 0:5c4d7b2438d3 3171 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 3172 static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 3173 {
switches 0:5c4d7b2438d3 3174 int ret;
switches 0:5c4d7b2438d3 3175 uint32_t lifetime;
switches 0:5c4d7b2438d3 3176 size_t ticket_len;
switches 0:5c4d7b2438d3 3177 unsigned char *ticket;
switches 0:5c4d7b2438d3 3178 const unsigned char *msg;
switches 0:5c4d7b2438d3 3179
switches 0:5c4d7b2438d3 3180 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
switches 0:5c4d7b2438d3 3181
switches 0:5c4d7b2438d3 3182 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 3183 {
switches 0:5c4d7b2438d3 3184 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
switches 0:5c4d7b2438d3 3185 return( ret );
switches 0:5c4d7b2438d3 3186 }
switches 0:5c4d7b2438d3 3187
switches 0:5c4d7b2438d3 3188 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
switches 0:5c4d7b2438d3 3189 {
switches 0:5c4d7b2438d3 3190 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
switches 0:5c4d7b2438d3 3191 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
switches 0:5c4d7b2438d3 3192 }
switches 0:5c4d7b2438d3 3193
switches 0:5c4d7b2438d3 3194 /*
switches 0:5c4d7b2438d3 3195 * struct {
switches 0:5c4d7b2438d3 3196 * uint32 ticket_lifetime_hint;
switches 0:5c4d7b2438d3 3197 * opaque ticket<0..2^16-1>;
switches 0:5c4d7b2438d3 3198 * } NewSessionTicket;
switches 0:5c4d7b2438d3 3199 *
switches 0:5c4d7b2438d3 3200 * 0 . 3 ticket_lifetime_hint
switches 0:5c4d7b2438d3 3201 * 4 . 5 ticket_len (n)
switches 0:5c4d7b2438d3 3202 * 6 . 5+n ticket content
switches 0:5c4d7b2438d3 3203 */
switches 0:5c4d7b2438d3 3204 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
switches 0:5c4d7b2438d3 3205 ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
switches 0:5c4d7b2438d3 3206 {
switches 0:5c4d7b2438d3 3207 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
switches 0:5c4d7b2438d3 3208 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
switches 0:5c4d7b2438d3 3209 }
switches 0:5c4d7b2438d3 3210
switches 0:5c4d7b2438d3 3211 msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
switches 0:5c4d7b2438d3 3212
switches 0:5c4d7b2438d3 3213 lifetime = ( msg[0] << 24 ) | ( msg[1] << 16 ) |
switches 0:5c4d7b2438d3 3214 ( msg[2] << 8 ) | ( msg[3] );
switches 0:5c4d7b2438d3 3215
switches 0:5c4d7b2438d3 3216 ticket_len = ( msg[4] << 8 ) | ( msg[5] );
switches 0:5c4d7b2438d3 3217
switches 0:5c4d7b2438d3 3218 if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
switches 0:5c4d7b2438d3 3219 {
switches 0:5c4d7b2438d3 3220 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
switches 0:5c4d7b2438d3 3221 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
switches 0:5c4d7b2438d3 3222 }
switches 0:5c4d7b2438d3 3223
switches 0:5c4d7b2438d3 3224 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
switches 0:5c4d7b2438d3 3225
switches 0:5c4d7b2438d3 3226 /* We're not waiting for a NewSessionTicket message any more */
switches 0:5c4d7b2438d3 3227 ssl->handshake->new_session_ticket = 0;
switches 0:5c4d7b2438d3 3228 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
switches 0:5c4d7b2438d3 3229
switches 0:5c4d7b2438d3 3230 /*
switches 0:5c4d7b2438d3 3231 * Zero-length ticket means the server changed his mind and doesn't want
switches 0:5c4d7b2438d3 3232 * to send a ticket after all, so just forget it
switches 0:5c4d7b2438d3 3233 */
switches 0:5c4d7b2438d3 3234 if( ticket_len == 0 )
switches 0:5c4d7b2438d3 3235 return( 0 );
switches 0:5c4d7b2438d3 3236
switches 0:5c4d7b2438d3 3237 mbedtls_zeroize( ssl->session_negotiate->ticket,
switches 0:5c4d7b2438d3 3238 ssl->session_negotiate->ticket_len );
switches 0:5c4d7b2438d3 3239 mbedtls_free( ssl->session_negotiate->ticket );
switches 0:5c4d7b2438d3 3240 ssl->session_negotiate->ticket = NULL;
switches 0:5c4d7b2438d3 3241 ssl->session_negotiate->ticket_len = 0;
switches 0:5c4d7b2438d3 3242
switches 0:5c4d7b2438d3 3243 if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
switches 0:5c4d7b2438d3 3244 {
switches 0:5c4d7b2438d3 3245 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
switches 0:5c4d7b2438d3 3246 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
switches 0:5c4d7b2438d3 3247 }
switches 0:5c4d7b2438d3 3248
switches 0:5c4d7b2438d3 3249 memcpy( ticket, msg + 6, ticket_len );
switches 0:5c4d7b2438d3 3250
switches 0:5c4d7b2438d3 3251 ssl->session_negotiate->ticket = ticket;
switches 0:5c4d7b2438d3 3252 ssl->session_negotiate->ticket_len = ticket_len;
switches 0:5c4d7b2438d3 3253 ssl->session_negotiate->ticket_lifetime = lifetime;
switches 0:5c4d7b2438d3 3254
switches 0:5c4d7b2438d3 3255 /*
switches 0:5c4d7b2438d3 3256 * RFC 5077 section 3.4:
switches 0:5c4d7b2438d3 3257 * "If the client receives a session ticket from the server, then it
switches 0:5c4d7b2438d3 3258 * discards any Session ID that was sent in the ServerHello."
switches 0:5c4d7b2438d3 3259 */
switches 0:5c4d7b2438d3 3260 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
switches 0:5c4d7b2438d3 3261 ssl->session_negotiate->id_len = 0;
switches 0:5c4d7b2438d3 3262
switches 0:5c4d7b2438d3 3263 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
switches 0:5c4d7b2438d3 3264
switches 0:5c4d7b2438d3 3265 return( 0 );
switches 0:5c4d7b2438d3 3266 }
switches 0:5c4d7b2438d3 3267 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
switches 0:5c4d7b2438d3 3268
switches 0:5c4d7b2438d3 3269 /*
switches 0:5c4d7b2438d3 3270 * SSL handshake -- client side -- single step
switches 0:5c4d7b2438d3 3271 */
switches 0:5c4d7b2438d3 3272 int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
switches 0:5c4d7b2438d3 3273 {
switches 0:5c4d7b2438d3 3274 int ret = 0;
switches 0:5c4d7b2438d3 3275
switches 0:5c4d7b2438d3 3276 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
switches 0:5c4d7b2438d3 3277 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
switches 0:5c4d7b2438d3 3278
switches 0:5c4d7b2438d3 3279 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
switches 0:5c4d7b2438d3 3280
switches 0:5c4d7b2438d3 3281 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 3282 return( ret );
switches 0:5c4d7b2438d3 3283
switches 0:5c4d7b2438d3 3284 #if defined(MBEDTLS_SSL_PROTO_DTLS)
switches 0:5c4d7b2438d3 3285 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
switches 0:5c4d7b2438d3 3286 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
switches 0:5c4d7b2438d3 3287 {
switches 0:5c4d7b2438d3 3288 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
switches 0:5c4d7b2438d3 3289 return( ret );
switches 0:5c4d7b2438d3 3290 }
switches 0:5c4d7b2438d3 3291 #endif
switches 0:5c4d7b2438d3 3292
switches 0:5c4d7b2438d3 3293 /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
switches 0:5c4d7b2438d3 3294 * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
switches 0:5c4d7b2438d3 3295 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 3296 if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
switches 0:5c4d7b2438d3 3297 ssl->handshake->new_session_ticket != 0 )
switches 0:5c4d7b2438d3 3298 {
switches 0:5c4d7b2438d3 3299 ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
switches 0:5c4d7b2438d3 3300 }
switches 0:5c4d7b2438d3 3301 #endif
switches 0:5c4d7b2438d3 3302
switches 0:5c4d7b2438d3 3303 switch( ssl->state )
switches 0:5c4d7b2438d3 3304 {
switches 0:5c4d7b2438d3 3305 case MBEDTLS_SSL_HELLO_REQUEST:
switches 0:5c4d7b2438d3 3306 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
switches 0:5c4d7b2438d3 3307 break;
switches 0:5c4d7b2438d3 3308
switches 0:5c4d7b2438d3 3309 /*
switches 0:5c4d7b2438d3 3310 * ==> ClientHello
switches 0:5c4d7b2438d3 3311 */
switches 0:5c4d7b2438d3 3312 case MBEDTLS_SSL_CLIENT_HELLO:
switches 0:5c4d7b2438d3 3313 ret = ssl_write_client_hello( ssl );
switches 0:5c4d7b2438d3 3314 break;
switches 0:5c4d7b2438d3 3315
switches 0:5c4d7b2438d3 3316 /*
switches 0:5c4d7b2438d3 3317 * <== ServerHello
switches 0:5c4d7b2438d3 3318 * Certificate
switches 0:5c4d7b2438d3 3319 * ( ServerKeyExchange )
switches 0:5c4d7b2438d3 3320 * ( CertificateRequest )
switches 0:5c4d7b2438d3 3321 * ServerHelloDone
switches 0:5c4d7b2438d3 3322 */
switches 0:5c4d7b2438d3 3323 case MBEDTLS_SSL_SERVER_HELLO:
switches 0:5c4d7b2438d3 3324 ret = ssl_parse_server_hello( ssl );
switches 0:5c4d7b2438d3 3325 break;
switches 0:5c4d7b2438d3 3326
switches 0:5c4d7b2438d3 3327 case MBEDTLS_SSL_SERVER_CERTIFICATE:
switches 0:5c4d7b2438d3 3328 ret = mbedtls_ssl_parse_certificate( ssl );
switches 0:5c4d7b2438d3 3329 break;
switches 0:5c4d7b2438d3 3330
switches 0:5c4d7b2438d3 3331 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
switches 0:5c4d7b2438d3 3332 ret = ssl_parse_server_key_exchange( ssl );
switches 0:5c4d7b2438d3 3333 break;
switches 0:5c4d7b2438d3 3334
switches 0:5c4d7b2438d3 3335 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
switches 0:5c4d7b2438d3 3336 ret = ssl_parse_certificate_request( ssl );
switches 0:5c4d7b2438d3 3337 break;
switches 0:5c4d7b2438d3 3338
switches 0:5c4d7b2438d3 3339 case MBEDTLS_SSL_SERVER_HELLO_DONE:
switches 0:5c4d7b2438d3 3340 ret = ssl_parse_server_hello_done( ssl );
switches 0:5c4d7b2438d3 3341 break;
switches 0:5c4d7b2438d3 3342
switches 0:5c4d7b2438d3 3343 /*
switches 0:5c4d7b2438d3 3344 * ==> ( Certificate/Alert )
switches 0:5c4d7b2438d3 3345 * ClientKeyExchange
switches 0:5c4d7b2438d3 3346 * ( CertificateVerify )
switches 0:5c4d7b2438d3 3347 * ChangeCipherSpec
switches 0:5c4d7b2438d3 3348 * Finished
switches 0:5c4d7b2438d3 3349 */
switches 0:5c4d7b2438d3 3350 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
switches 0:5c4d7b2438d3 3351 ret = mbedtls_ssl_write_certificate( ssl );
switches 0:5c4d7b2438d3 3352 break;
switches 0:5c4d7b2438d3 3353
switches 0:5c4d7b2438d3 3354 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
switches 0:5c4d7b2438d3 3355 ret = ssl_write_client_key_exchange( ssl );
switches 0:5c4d7b2438d3 3356 break;
switches 0:5c4d7b2438d3 3357
switches 0:5c4d7b2438d3 3358 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
switches 0:5c4d7b2438d3 3359 ret = ssl_write_certificate_verify( ssl );
switches 0:5c4d7b2438d3 3360 break;
switches 0:5c4d7b2438d3 3361
switches 0:5c4d7b2438d3 3362 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
switches 0:5c4d7b2438d3 3363 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
switches 0:5c4d7b2438d3 3364 break;
switches 0:5c4d7b2438d3 3365
switches 0:5c4d7b2438d3 3366 case MBEDTLS_SSL_CLIENT_FINISHED:
switches 0:5c4d7b2438d3 3367 ret = mbedtls_ssl_write_finished( ssl );
switches 0:5c4d7b2438d3 3368 break;
switches 0:5c4d7b2438d3 3369
switches 0:5c4d7b2438d3 3370 /*
switches 0:5c4d7b2438d3 3371 * <== ( NewSessionTicket )
switches 0:5c4d7b2438d3 3372 * ChangeCipherSpec
switches 0:5c4d7b2438d3 3373 * Finished
switches 0:5c4d7b2438d3 3374 */
switches 0:5c4d7b2438d3 3375 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
switches 0:5c4d7b2438d3 3376 case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
switches 0:5c4d7b2438d3 3377 ret = ssl_parse_new_session_ticket( ssl );
switches 0:5c4d7b2438d3 3378 break;
switches 0:5c4d7b2438d3 3379 #endif
switches 0:5c4d7b2438d3 3380
switches 0:5c4d7b2438d3 3381 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
switches 0:5c4d7b2438d3 3382 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
switches 0:5c4d7b2438d3 3383 break;
switches 0:5c4d7b2438d3 3384
switches 0:5c4d7b2438d3 3385 case MBEDTLS_SSL_SERVER_FINISHED:
switches 0:5c4d7b2438d3 3386 ret = mbedtls_ssl_parse_finished( ssl );
switches 0:5c4d7b2438d3 3387 break;
switches 0:5c4d7b2438d3 3388
switches 0:5c4d7b2438d3 3389 case MBEDTLS_SSL_FLUSH_BUFFERS:
switches 0:5c4d7b2438d3 3390 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
switches 0:5c4d7b2438d3 3391 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
switches 0:5c4d7b2438d3 3392 break;
switches 0:5c4d7b2438d3 3393
switches 0:5c4d7b2438d3 3394 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
switches 0:5c4d7b2438d3 3395 mbedtls_ssl_handshake_wrapup( ssl );
switches 0:5c4d7b2438d3 3396 break;
switches 0:5c4d7b2438d3 3397
switches 0:5c4d7b2438d3 3398 default:
switches 0:5c4d7b2438d3 3399 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
switches 0:5c4d7b2438d3 3400 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
switches 0:5c4d7b2438d3 3401 }
switches 0:5c4d7b2438d3 3402
switches 0:5c4d7b2438d3 3403 return( ret );
switches 0:5c4d7b2438d3 3404 }
switches 0:5c4d7b2438d3 3405 #endif /* MBEDTLS_SSL_CLI_C */