1 diff --git a/include/mbedtls/check_config.h b/include/mbedtls/check_config.h
2 index a95af6c..a3852b2 100644
3 --- a/include/mbedtls/check_config.h
4 +++ b/include/mbedtls/check_config.h
6 #error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites"
9 +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED) && \
10 + ( !defined(MBEDTLS_ECDH_C) )
11 +#error "MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED defined, but not all prerequisites"
14 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \
15 ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \
16 !defined(MBEDTLS_X509_CRT_PARSE_C) )
17 diff --git a/include/mbedtls/compat-1.3.h b/include/mbedtls/compat-1.3.h
18 index 27abbd9..fa4db26 100644
19 --- a/include/mbedtls/compat-1.3.h
20 +++ b/include/mbedtls/compat-1.3.h
22 #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
23 #define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
25 +#if defined MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
26 +#define POLARSSL_KEY_EXCHANGE_ECDH_ANON_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
28 #if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
29 #define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
32 #define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA
33 #define POLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK
34 #define POLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA
35 +#define POLARSSL_KEY_EXCHANGE_ECDH_ANON MBEDTLS_KEY_EXCHANGE_ECDH_ANON
36 #define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA
37 #define POLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA
38 #define POLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE
40 #define TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384
41 #define TLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA
42 #define TLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA
43 +#define TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256
44 #define TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
45 #define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
46 #define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
47 diff --git a/include/mbedtls/config.h b/include/mbedtls/config.h
48 index 3b7c85b..5bef190 100644
49 --- a/include/mbedtls/config.h
50 +++ b/include/mbedtls/config.h
52 #define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
55 + * \def MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
57 + * Enable the ECDHE-ANON based ciphersuite modes in SSL / TLS.
59 + * Requires: MBEDTLS_ECDH_C
62 + * This enables the following ciphersuites (if other requisites are
64 + * MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256
66 +#define MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
70 * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
72 * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS.
75 * Comment this macro to disable support for SSL session tickets
77 -#define MBEDTLS_SSL_SESSION_TICKETS
78 +//#define MBEDTLS_SSL_SESSION_TICKETS
81 * \def MBEDTLS_SSL_EXPORT_KEYS
83 * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256
84 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256
85 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA
86 + * MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256
88 * PEM_PARSE uses AES for decrypting encrypted keys.
90 diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h
91 index 82c0760..88103ad 100644
92 --- a/include/mbedtls/ssl.h
93 +++ b/include/mbedtls/ssl.h
94 @@ -356,7 +356,8 @@ union mbedtls_ssl_premaster_secret
95 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
96 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
97 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
98 - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
99 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
100 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
101 unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */
103 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
104 diff --git a/include/mbedtls/ssl_ciphersuites.h b/include/mbedtls/ssl_ciphersuites.h
105 index deaaa37..4f10540 100644
106 --- a/include/mbedtls/ssl_ciphersuites.h
107 +++ b/include/mbedtls/ssl_ciphersuites.h
108 @@ -158,6 +158,8 @@ extern "C" {
109 #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031 /**< TLS 1.2 */
110 #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 0xC032 /**< TLS 1.2 */
112 +#define MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256 0xFF00 /**< TLS 1.2 */
114 #define MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA 0xC033 /**< Not in SSL3! */
115 #define MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0xC034 /**< Not in SSL3! */
116 #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xC035 /**< Not in SSL3! */
117 @@ -247,6 +249,7 @@ typedef enum {
118 MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
119 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
120 MBEDTLS_KEY_EXCHANGE_ECJPAKE,
121 + MBEDTLS_KEY_EXCHANGE_ECDH_ANON,
122 } mbedtls_key_exchange_type_t;
124 /* Key exchanges using a certificate */
125 @@ -271,7 +274,8 @@ typedef enum {
126 /* Key exchanges using a ECDHE */
127 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
128 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
129 - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
130 + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
131 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
132 #define MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED
135 diff --git a/library/ssl_ciphersuites.c b/library/ssl_ciphersuites.c
136 index 3546331..74cef29 100644
137 --- a/library/ssl_ciphersuites.c
138 +++ b/library/ssl_ciphersuites.c
139 @@ -96,6 +96,7 @@ static const int ciphersuite_preference[] =
140 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
141 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,
142 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8,
143 + MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256,
145 /* All CAMELLIA-128 ephemeral suites */
146 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,
147 @@ -408,6 +409,22 @@ static const mbedtls_ssl_ciphersuite_t ciphersuite_definitions[] =
148 #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
149 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
152 +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
153 +#if defined(MBEDTLS_AES_C)
154 +#if defined(MBEDTLS_SHA256_C)
155 +#if defined(MBEDTLS_CIPHER_MODE_CBC)
156 + { MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256, "TLS-ECDH-ANON-WITH-AES-128-CBC-SHA256",
157 + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ANON,
158 + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
159 + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
161 +#endif /* MBEDTLS_CIPHER_MODE_CBC */
162 +#endif /* MBEDTLS_SHA256_C */
163 +#endif /* MBEDTLS_AES_C */
164 +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED */
167 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
168 #if defined(MBEDTLS_AES_C)
169 #if defined(MBEDTLS_SHA1_C)
170 @@ -1830,6 +1847,7 @@ int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info )
171 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
172 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
173 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
174 + case MBEDTLS_KEY_EXCHANGE_ECDH_ANON:
178 diff --git a/library/ssl_cli.c b/library/ssl_cli.c
179 index cd39db0..2503022 100644
180 --- a/library/ssl_cli.c
181 +++ b/library/ssl_cli.c
182 @@ -1897,7 +1897,8 @@ static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char *
183 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
184 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
185 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
186 - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
187 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
188 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
189 static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
191 const mbedtls_ecp_curve_info *curve_info;
192 @@ -1927,11 +1928,13 @@ static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
193 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
194 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
195 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
196 - MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
197 + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED ||
198 + MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED */
200 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
201 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
202 - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
203 + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
204 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
205 static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
208 @@ -1963,40 +1966,75 @@ static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
210 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
211 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
212 - MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
213 + MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
214 + MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED*/
216 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
217 static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
221 - int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
227 + if( ssl->conf->f_psk == NULL &&
228 + ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ||
229 + ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) )
231 + MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
232 + return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
238 - * opaque psk_identity_hint<0..2^16-1>;
239 + * Receive client pre-shared key identity name
241 - len = (*p)[0] << 8 | (*p)[1];
244 + MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
245 + return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
248 + n = ( (*p)[0] << 8 ) | (*p)[1];
251 - if( (*p) + len > end )
252 + if( n < 1 || n > 65535 || *p + n > end )
254 - MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
255 - return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
256 + MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
257 + return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
261 - * Note: we currently ignore the PKS identity hint, as we only allow one
262 - * PSK to be provisionned on the client. This could be changed later if
263 - * someone needs that feature.
267 + if( ssl->conf->f_psk != NULL )
269 + if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 )
270 + ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
274 + /* Identity is not a big secret since clients send it in the clear,
275 + * but treat it carefully anyway, just in case */
276 + if( n != ssl->conf->psk_identity_len ||
277 + mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 )
279 + ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
284 + if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY )
286 + MBEDTLS_SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
287 + if( ( ret = mbedtls_ssl_send_alert_message( ssl,
288 + MBEDTLS_SSL_ALERT_LEVEL_FATAL,
289 + MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY ) ) != 0 )
294 + return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY );
301 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
303 @@ -2292,10 +2330,12 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
304 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
305 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
306 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
307 - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
308 + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
309 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
310 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
311 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
312 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
313 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
314 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
316 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
318 @@ -2306,7 +2346,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
320 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
321 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
322 - MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
323 + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
324 + MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED */
325 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
326 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
328 @@ -2377,6 +2418,10 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
329 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
332 +// Anonim cipher suite without sign, ecdh param only
333 +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
339 @@ -2525,7 +2570,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
340 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
341 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
342 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
343 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
344 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
345 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
347 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
349 @@ -2550,7 +2596,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
350 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
351 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
352 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
353 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
354 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
355 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
357 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
359 @@ -2753,11 +2800,13 @@ static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
360 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
361 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
362 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
363 - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
364 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
365 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
366 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
367 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
368 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
369 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
370 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ||
371 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON)
374 * ECDH key exchange -- send client public value
375 @@ -2792,7 +2841,8 @@ static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
376 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
377 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
378 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
379 - MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
380 + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
381 + MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED */
382 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
383 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
384 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
385 @@ -2980,7 +3030,8 @@ static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
386 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
387 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
388 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
389 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
390 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
391 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
393 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
395 @@ -3013,7 +3064,8 @@ static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
396 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
397 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
398 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
399 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
400 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
401 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
403 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
405 diff --git a/library/ssl_srv.c b/library/ssl_srv.c
406 index 7271045..2964015 100644
407 --- a/library/ssl_srv.c
408 +++ b/library/ssl_srv.c
409 @@ -2500,6 +2500,7 @@ static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
410 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
411 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
412 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
413 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON ||
414 authmode == MBEDTLS_SSL_VERIFY_NONE )
416 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
417 @@ -2677,7 +2678,8 @@ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
418 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
419 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
420 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
421 - defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
422 + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) || \
423 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
424 unsigned char *p = ssl->out_msg + 4;
425 unsigned char *dig_signed = p;
426 size_t dig_signed_len = 0, len;
427 @@ -2738,12 +2740,11 @@ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
428 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
429 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
431 - /* Note: we don't support identity hints, until someone asks
437 + *(p++) = (unsigned char)( ssl->conf->psk_identity_len >> 8 );
438 + *(p++) = (unsigned char)( ssl->conf->psk_identity_len );
439 + memcpy(p, ssl->conf->psk_identity, ssl->conf->psk_identity_len);
440 + p += ssl->conf->psk_identity_len;
441 + n += ssl->conf->psk_identity_len + 2;
443 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
444 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
445 @@ -2800,7 +2801,8 @@ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
446 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED)
447 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
448 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
449 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
450 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
451 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON)
454 * Ephemeral ECDH parameters:
455 @@ -3338,11 +3340,13 @@ static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl )
456 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
457 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
458 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
459 - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
460 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
461 + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
462 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
463 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
464 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
465 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
466 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ||
467 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
469 if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
471 @@ -3539,7 +3543,8 @@ static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
472 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
473 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
474 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
475 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
476 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
477 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
479 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
481 @@ -3570,6 +3575,7 @@ static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
482 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
483 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
484 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
485 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON ||
486 ssl->session_negotiate->peer_cert == NULL )
488 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
489 diff --git a/library/ssl_tls.c b/library/ssl_tls.c
490 index 80a908d..94c8fd7 100644
491 --- a/library/ssl_tls.c
492 +++ b/library/ssl_tls.c
493 @@ -4037,7 +4037,8 @@ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
494 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
495 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
496 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
497 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
498 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
499 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
501 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
503 @@ -4057,7 +4058,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
504 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
505 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
506 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
507 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
508 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
509 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
511 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
513 @@ -4080,7 +4082,8 @@ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
514 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
515 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
516 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
517 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
518 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
519 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
521 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
523 @@ -4196,7 +4199,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
524 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
525 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
526 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
527 - ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
528 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
529 + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ANON )
531 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
533 @@ -7510,6 +7514,7 @@ int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
534 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
535 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
536 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
537 + case MBEDTLS_KEY_EXCHANGE_ECDH_ANON:
541 diff --git a/library/version_features.c b/library/version_features.c
542 index 5d20ba0..6404a0c 100644
543 --- a/library/version_features.c
544 +++ b/library/version_features.c
545 @@ -264,6 +264,9 @@ static const char *features[] = {
546 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
547 "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED",
548 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
549 +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
550 + "MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED",
551 +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED */
552 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
553 "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED",
554 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */