1976f89d2eb5f369e62960f071b33b12190153bd
[platform/upstream/iotivity.git] / extlibs / mbedtls / ocf.patch
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
5 @@ -184,6 +184,11 @@
6  #error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites"
7  #endif
8  
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"
12 +#endif
13 +
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
21 @@ -264,6 +264,9 @@
22  #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
23  #define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
24  #endif
25 +#if defined MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
26 +#define POLARSSL_KEY_EXCHANGE_ECDH_ANON_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
27 +#endif
28  #if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
29  #define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
30  #endif
31 @@ -1273,6 +1276,7 @@
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
39 @@ -1616,6 +1620,7 @@
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
51 @@ -642,6 +642,21 @@
52  #define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
53  
54  /**
55 + * \def MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
56 + *
57 + * Enable the ECDHE-ANON based ciphersuite modes in SSL / TLS.
58 + *
59 + * Requires: MBEDTLS_ECDH_C
60 + *
61 + *
62 + * This enables the following ciphersuites (if other requisites are
63 + * enabled as well):
64 + *      MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256
65 + */
66 +#define MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED
67 +
68 +
69 +/**
70   * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
71   *
72   * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS.
73 @@ -1239,7 +1254,7 @@
74   *
75   * Comment this macro to disable support for SSL session tickets
76   */
77 -#define MBEDTLS_SSL_SESSION_TICKETS
78 +//#define MBEDTLS_SSL_SESSION_TICKETS
79  
80  /**
81   * \def MBEDTLS_SSL_EXPORT_KEYS
82 @@ -1479,6 +1494,7 @@
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
87   *
88   * PEM_PARSE uses AES for decrypting encrypted keys.
89   */
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 */
102  #endif
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 */
111  
112 +#define MBEDTLS_TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256    0xFF00 /**< TLS 1.2 */
113 +
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;
123  
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
133  #endif
134  
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,
144  
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 */
150  
151 +
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,
160 +      0 },
161 +#endif /* MBEDTLS_CIPHER_MODE_CBC */
162 +#endif /* MBEDTLS_SHA256_C */
163 +#endif /* MBEDTLS_AES_C */
164 +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED */
165 +
166 +
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:
175              return( 1 );
176  
177          default:
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 )
190  {
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 */
199  
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,
206                                           unsigned char **p,
207                                           unsigned char *end )
208 @@ -1963,40 +1966,75 @@ static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
209  }
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*/
215  
216  #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
217  static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
218                                        unsigned char **p,
219                                        unsigned char *end )
220  {
221 -    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
222 -    size_t  len;
223 -    ((void) ssl);
224 +        int ret = 0;
225 +    size_t n;
226 +
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 ) )
230 +    {
231 +        MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
232 +        return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
233 +    }
234  
235      /*
236 -     * PSK parameters:
237 -     *
238 -     * opaque psk_identity_hint<0..2^16-1>;
239 +     * Receive client pre-shared key identity name
240       */
241 -    len = (*p)[0] << 8 | (*p)[1];
242 +    if( *p + 2 > end )
243 +    {
244 +        MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
245 +        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
246 +    }
247 +
248 +    n = ( (*p)[0] << 8 ) | (*p)[1];
249      *p += 2;
250  
251 -    if( (*p) + len > end )
252 +    if( n < 1 || n > 65535 || *p + n > end )
253      {
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 );
258      }
259  
260 -    /*
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.
264 -     */
265 -    *p += len;
266 -    ret = 0;
267 +    if( ssl->conf->f_psk != NULL )
268 +    {
269 +        if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 )
270 +            ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
271 +    }
272 +    else
273 +    {
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 )
278 +        {
279 +            ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
280 +        }
281 +    }
282  
283 -    return( ret );
284 +    if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY )
285 +    {
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 )
290 +        {
291 +            return( ret );
292 +        }
293 +
294 +        return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY );
295 +    }
296 +
297 +    *p += n;
298 +
299 +    return( 0 );
300  }
301  #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
302  
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 )
315      {
316          if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
317          {
318 @@ -2306,7 +2346,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
319      else
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 )
327      {
328 @@ -2377,6 +2418,10 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
329              return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
330          }
331  
332 +// Anonim cipher suite without sign, ecdh param only
333 +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ANON_ENABLED)
334 +        goto exit;
335 +#endif
336          /*
337           * Read signature
338           */
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 )
346      {
347          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
348          ssl->state++;
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 )
356      {
357          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
358          ssl->state++;
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)
372      {
373          /*
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 )
392      {
393          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
394          ssl->state++;
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 )
402      {
403          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
404          ssl->state++;
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 )
415      {
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 )
430      {
431 -        /* Note: we don't support identity hints, until someone asks
432 -         * for them. */
433 -        *(p++) = 0x00;
434 -        *(p++) = 0x00;
435 -
436 -        n += 2;
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;
442      }
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)
452      {
453          /*
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 )
468      {
469          if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
470                                        p, end - p) ) != 0 )
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 )
478      {
479          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
480          ssl->state++;
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 )
487      {
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 )
500      {
501          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
502          ssl->state++;
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 )
510      {
511          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
512          ssl->state++;
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 )
520      {
521          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
522          ssl->state++;
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 )
530      {
531          MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
532          ssl->state++;
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:
538                  usage = 0;
539          }
540      }
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 */