Coverage Report

Created: 2025-07-23 07:18

/src/gnutls/lib/handshake.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (C) 2000-2016 Free Software Foundation, Inc.
3
 * Copyright (C) 2015-2018 Red Hat, Inc.
4
 *
5
 * Author: Nikos Mavrogiannopoulos
6
 *
7
 * This file is part of GnuTLS.
8
 *
9
 * The GnuTLS is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public License
11
 * as published by the Free Software Foundation; either version 2.1 of
12
 * the License, or (at your option) any later version.
13
 *
14
 * This library is distributed in the hope that it will be useful, but
15
 * WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
 * Lesser General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public License
20
 * along with this program.  If not, see <https://www.gnu.org/licenses/>
21
 *
22
 */
23
24
/* Functions that relate to the TLS handshake procedure.
25
 */
26
27
#include "gnutls_int.h"
28
#include "errors.h"
29
#include "dh.h"
30
#include "debug.h"
31
#include "algorithms.h"
32
#include "cipher.h"
33
#include "buffers.h"
34
#include "mbuffers.h"
35
#include "kx.h"
36
#include "handshake.h"
37
#include "num.h"
38
#include "hash_int.h"
39
#include "db.h"
40
#include "hello_ext.h"
41
#include "supplemental.h"
42
#include "auth.h"
43
#include "sslv2_compat.h"
44
#include "auth/cert.h"
45
#include "constate.h"
46
#include "record.h"
47
#include "state.h"
48
#include "ext/pre_shared_key.h"
49
#include "ext/srp.h"
50
#include "ext/session_ticket.h"
51
#include "ext/status_request.h"
52
#include "ext/safe_renegotiation.h"
53
#include "auth/anon.h" /* for gnutls_anon_server_credentials_t */
54
#include "auth/psk.h" /* for gnutls_psk_server_credentials_t */
55
#include "random.h"
56
#include "dtls.h"
57
#include "secrets.h"
58
#include "tls13/early_data.h"
59
#include "tls13/session_ticket.h"
60
#include "locks.h"
61
#include "system/ktls.h"
62
63
static int check_if_null_comp_present(gnutls_session_t session, uint8_t *data,
64
              int datalen);
65
static int handshake_client(gnutls_session_t session);
66
static int handshake_server(gnutls_session_t session);
67
68
static int read_server_hello(gnutls_session_t session, uint8_t *data,
69
           int datalen);
70
71
static int recv_handshake_final(gnutls_session_t session, int init);
72
static int send_handshake_final(gnutls_session_t session, int init);
73
74
/* Empties but does not free the buffer
75
 */
76
inline static void handshake_hash_buffer_reset(gnutls_session_t session)
77
0
{
78
0
  _gnutls_buffers_log("BUF[HSK]: Emptied buffer\n");
79
80
0
  session->internals.handshake_hash_buffer_client_hello_len = 0;
81
0
  session->internals.handshake_hash_buffer_client_kx_len = 0;
82
0
  session->internals.handshake_hash_buffer_server_finished_len = 0;
83
0
  session->internals.handshake_hash_buffer_client_finished_len = 0;
84
0
  session->internals.handshake_hash_buffer_prev_len = 0;
85
0
  session->internals.handshake_hash_buffer.length = 0;
86
0
  session->internals.full_client_hello.length = 0;
87
0
  return;
88
0
}
89
90
static int handshake_hash_add_recvd(gnutls_session_t session,
91
            gnutls_handshake_description_t recv_type,
92
            uint8_t *header, uint16_t header_size,
93
            uint8_t *dataptr, uint32_t datalen);
94
95
static int handshake_hash_add_sent(gnutls_session_t session,
96
           gnutls_handshake_description_t type,
97
           uint8_t *dataptr, uint32_t datalen);
98
99
static int recv_hello_verify_request(gnutls_session_t session, uint8_t *data,
100
             int datalen);
101
102
/* Clears the handshake hash buffers and handles.
103
 */
104
void _gnutls_handshake_hash_buffers_clear(gnutls_session_t session)
105
0
{
106
0
  handshake_hash_buffer_reset(session);
107
0
  _gnutls_buffer_clear(&session->internals.handshake_hash_buffer);
108
0
  _gnutls_buffer_clear(&session->internals.full_client_hello);
109
0
}
110
111
/* Replace handshake message buffer, with the special synthetic message
112
 * needed by TLS1.3 when HRR is sent. */
113
int _gnutls13_handshake_hash_buffers_synth(gnutls_session_t session,
114
             const mac_entry_st *prf,
115
             unsigned client)
116
0
{
117
0
  int ret;
118
0
  uint8_t hdata[4 + MAX_HASH_SIZE];
119
0
  size_t length;
120
121
0
  if (client)
122
0
    length = session->internals.handshake_hash_buffer_prev_len;
123
0
  else
124
0
    length = session->internals.handshake_hash_buffer.length;
125
126
  /* calculate hash */
127
0
  hdata[0] = 254;
128
0
  _gnutls_write_uint24(prf->output_size, &hdata[1]);
129
130
0
  ret = gnutls_hash_fast((gnutls_digest_algorithm_t)prf->id,
131
0
             session->internals.handshake_hash_buffer.data,
132
0
             length, hdata + 4);
133
0
  if (ret < 0)
134
0
    return gnutls_assert_val(ret);
135
136
0
  handshake_hash_buffer_reset(session);
137
138
0
  ret = _gnutls_buffer_append_data(
139
0
    &session->internals.handshake_hash_buffer, hdata,
140
0
    prf->output_size + 4);
141
0
  if (ret < 0)
142
0
    return gnutls_assert_val(ret);
143
144
0
  _gnutls_buffers_log(
145
0
    "BUF[HSK]: Replaced handshake buffer with synth message (%d bytes)\n",
146
0
    prf->output_size + 4);
147
148
0
  return 0;
149
0
}
150
151
/* this will copy the required values for resuming to
152
 * internals, and to security_parameters.
153
 * this will keep as less data to security_parameters.
154
 */
155
static int tls12_resume_copy_required_vals(gnutls_session_t session,
156
             unsigned ticket)
157
0
{
158
0
  int ret;
159
160
  /* get the new random values */
161
0
  memcpy(session->internals.resumed_security_parameters.server_random,
162
0
         session->security_parameters.server_random, GNUTLS_RANDOM_SIZE);
163
0
  memcpy(session->internals.resumed_security_parameters.client_random,
164
0
         session->security_parameters.client_random, GNUTLS_RANDOM_SIZE);
165
166
  /* keep the ciphersuite and compression
167
   * That is because the client must see these in our
168
   * hello message.
169
   */
170
0
  ret = _gnutls_set_cipher_suite2(
171
0
    session, session->internals.resumed_security_parameters.cs);
172
0
  if (ret < 0)
173
0
    return gnutls_assert_val(ret);
174
175
  /* or write_compression_algorithm
176
   * they are the same
177
   */
178
179
0
  session->security_parameters.entity =
180
0
    session->internals.resumed_security_parameters.entity;
181
182
0
  if (session->internals.resumed_security_parameters.pversion == NULL)
183
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
184
185
0
  if (_gnutls_set_current_version(
186
0
        session, session->internals.resumed_security_parameters
187
0
             .pversion->id) < 0)
188
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
189
190
0
  session->security_parameters.client_ctype =
191
0
    session->internals.resumed_security_parameters.client_ctype;
192
0
  session->security_parameters.server_ctype =
193
0
    session->internals.resumed_security_parameters.server_ctype;
194
195
0
  if (!ticket) {
196
0
    memcpy(session->security_parameters.session_id,
197
0
           session->internals.resumed_security_parameters.session_id,
198
0
           sizeof(session->security_parameters.session_id));
199
0
    session->security_parameters.session_id_size =
200
0
      session->internals.resumed_security_parameters
201
0
        .session_id_size;
202
0
  }
203
204
0
  return 0;
205
0
}
206
207
void _gnutls_set_client_random(gnutls_session_t session, uint8_t *rnd)
208
0
{
209
0
  _gnutls_memory_mark_defined(session->security_parameters.client_random,
210
0
            GNUTLS_RANDOM_SIZE);
211
0
  memcpy(session->security_parameters.client_random, rnd,
212
0
         GNUTLS_RANDOM_SIZE);
213
0
}
214
215
static int _gnutls_gen_client_random(gnutls_session_t session)
216
0
{
217
0
  int ret;
218
219
  /* no random given, we generate. */
220
0
  if (session->internals.sc_random_set != 0) {
221
0
    _gnutls_memory_mark_defined(
222
0
      session->security_parameters.client_random,
223
0
      GNUTLS_RANDOM_SIZE);
224
0
    memcpy(session->security_parameters.client_random,
225
0
           session->internals.resumed_security_parameters
226
0
             .client_random,
227
0
           GNUTLS_RANDOM_SIZE);
228
0
  } else {
229
0
    _gnutls_memory_mark_defined(
230
0
      session->security_parameters.client_random,
231
0
      GNUTLS_RANDOM_SIZE);
232
0
    ret = gnutls_rnd(GNUTLS_RND_NONCE,
233
0
         session->security_parameters.client_random,
234
0
         GNUTLS_RANDOM_SIZE);
235
0
    if (ret < 0) {
236
0
      _gnutls_memory_mark_undefined(
237
0
        session->security_parameters.client_random,
238
0
        GNUTLS_RANDOM_SIZE);
239
0
      return gnutls_assert_val(ret);
240
0
    }
241
0
  }
242
243
0
  return 0;
244
0
}
245
246
static int _gnutls_set_server_random(gnutls_session_t session,
247
             const version_entry_st *vers, uint8_t *rnd)
248
0
{
249
0
  const version_entry_st *max;
250
251
0
  _gnutls_memory_mark_defined(session->security_parameters.server_random,
252
0
            GNUTLS_RANDOM_SIZE);
253
0
  memcpy(session->security_parameters.server_random, rnd,
254
0
         GNUTLS_RANDOM_SIZE);
255
256
  /* check whether the server random value is set according to
257
   * to TLS 1.3. p4.1.3 requirements */
258
0
  if (!IS_DTLS(session) && vers->id <= GNUTLS_TLS1_2 &&
259
0
      have_creds_for_tls13(session)) {
260
0
    max = _gnutls_version_max(session);
261
0
    if (max->id <= GNUTLS_TLS1_2)
262
0
      return 0;
263
264
0
    if (vers->id == GNUTLS_TLS1_2 &&
265
0
        memcmp(&session->security_parameters
266
0
            .server_random[GNUTLS_RANDOM_SIZE - 8],
267
0
         "\x44\x4F\x57\x4E\x47\x52\x44\x01", 8) == 0) {
268
0
      _gnutls_audit_log(
269
0
        session,
270
0
        "Detected downgrade to TLS 1.2 from TLS 1.3\n");
271
0
      return gnutls_assert_val(
272
0
        GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER);
273
0
    } else if (vers->id <= GNUTLS_TLS1_1 &&
274
0
         memcmp(&session->security_parameters
275
0
             .server_random[GNUTLS_RANDOM_SIZE -
276
0
                8],
277
0
          "\x44\x4F\x57\x4E\x47\x52\x44\x00", 8) == 0) {
278
0
      _gnutls_audit_log(
279
0
        session,
280
0
        "Detected downgrade to TLS 1.1 or earlier from TLS 1.3\n");
281
0
      return gnutls_assert_val(
282
0
        GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER);
283
0
    }
284
0
  }
285
286
0
  return 0;
287
0
}
288
289
int _gnutls_gen_server_random(gnutls_session_t session, int version)
290
0
{
291
0
  int ret;
292
0
  const version_entry_st *max;
293
294
0
  if (session->internals.sc_random_set != 0) {
295
0
    _gnutls_memory_mark_defined(
296
0
      session->security_parameters.server_random,
297
0
      GNUTLS_RANDOM_SIZE);
298
0
    memcpy(session->security_parameters.server_random,
299
0
           session->internals.resumed_security_parameters
300
0
             .server_random,
301
0
           GNUTLS_RANDOM_SIZE);
302
0
    return 0;
303
0
  }
304
305
0
  max = _gnutls_version_max(session);
306
0
  if (max == NULL)
307
0
    return gnutls_assert_val(GNUTLS_E_NO_CIPHER_SUITES);
308
309
0
  _gnutls_memory_mark_defined(session->security_parameters.server_random,
310
0
            GNUTLS_RANDOM_SIZE);
311
312
0
  if (!IS_DTLS(session) && max->id >= GNUTLS_TLS1_3 &&
313
0
      version <= GNUTLS_TLS1_2) {
314
0
    if (version == GNUTLS_TLS1_2) {
315
0
      memcpy(&session->security_parameters
316
0
          .server_random[GNUTLS_RANDOM_SIZE - 8],
317
0
             "\x44\x4F\x57\x4E\x47\x52\x44\x01", 8);
318
0
    } else {
319
0
      memcpy(&session->security_parameters
320
0
          .server_random[GNUTLS_RANDOM_SIZE - 8],
321
0
             "\x44\x4F\x57\x4E\x47\x52\x44\x00", 8);
322
0
    }
323
0
    ret = gnutls_rnd(GNUTLS_RND_NONCE,
324
0
         session->security_parameters.server_random,
325
0
         GNUTLS_RANDOM_SIZE - 8);
326
327
0
  } else {
328
0
    ret = gnutls_rnd(GNUTLS_RND_NONCE,
329
0
         session->security_parameters.server_random,
330
0
         GNUTLS_RANDOM_SIZE);
331
0
  }
332
333
0
  if (ret < 0) {
334
0
    gnutls_assert();
335
0
    _gnutls_memory_mark_undefined(
336
0
      session->security_parameters.server_random,
337
0
      GNUTLS_RANDOM_SIZE);
338
0
    return ret;
339
0
  }
340
341
0
  return 0;
342
0
}
343
344
#ifdef ENABLE_SSL3
345
/* Calculate The SSL3 Finished message
346
 */
347
#define SSL3_CLIENT_MSG "CLNT"
348
#define SSL3_SERVER_MSG "SRVR"
349
#define SSL_MSG_LEN 4
350
static int _gnutls_ssl3_finished(gnutls_session_t session, int type,
351
         uint8_t *ret, int sending)
352
{
353
  digest_hd_st td_md5;
354
  digest_hd_st td_sha;
355
  const char *mesg;
356
  int rc, len;
357
358
  if (sending)
359
    len = session->internals.handshake_hash_buffer.length;
360
  else
361
    len = session->internals.handshake_hash_buffer_prev_len;
362
363
  rc = _gnutls_hash_init(&td_sha, hash_to_entry(GNUTLS_DIG_SHA1));
364
  if (rc < 0)
365
    return gnutls_assert_val(rc);
366
367
  rc = _gnutls_hash_init(&td_md5, hash_to_entry(GNUTLS_DIG_MD5));
368
  if (rc < 0) {
369
    _gnutls_hash_deinit(&td_sha, NULL);
370
    return gnutls_assert_val(rc);
371
  }
372
373
  _gnutls_hash(&td_sha, session->internals.handshake_hash_buffer.data,
374
         len);
375
  _gnutls_hash(&td_md5, session->internals.handshake_hash_buffer.data,
376
         len);
377
378
  if (type == GNUTLS_SERVER)
379
    mesg = SSL3_SERVER_MSG;
380
  else
381
    mesg = SSL3_CLIENT_MSG;
382
383
  _gnutls_hash(&td_md5, mesg, SSL_MSG_LEN);
384
  _gnutls_hash(&td_sha, mesg, SSL_MSG_LEN);
385
386
  rc = _gnutls_mac_deinit_ssl3_handshake(
387
    &td_md5, ret, session->security_parameters.master_secret,
388
    GNUTLS_MASTER_SIZE);
389
  if (rc < 0) {
390
    _gnutls_hash_deinit(&td_md5, NULL);
391
    _gnutls_hash_deinit(&td_sha, NULL);
392
    return gnutls_assert_val(rc);
393
  }
394
395
  rc = _gnutls_mac_deinit_ssl3_handshake(
396
    &td_sha, &ret[16], session->security_parameters.master_secret,
397
    GNUTLS_MASTER_SIZE);
398
  if (rc < 0) {
399
    _gnutls_hash_deinit(&td_sha, NULL);
400
    return gnutls_assert_val(rc);
401
  }
402
403
  return 0;
404
}
405
#endif
406
407
/* Hash the handshake messages as required by TLS 1.0
408
 */
409
0
#define SERVER_MSG "server finished"
410
0
#define CLIENT_MSG "client finished"
411
0
#define TLS_MSG_LEN 15
412
static int _gnutls_finished(gnutls_session_t session, int type, void *ret,
413
          int sending)
414
0
{
415
0
  const int siz = TLS_MSG_LEN;
416
0
  uint8_t concat[MAX_HASH_SIZE];
417
0
  size_t hash_len;
418
0
  const char *mesg;
419
0
  int rc, len, algorithm;
420
421
0
  if (sending)
422
0
    len = session->internals.handshake_hash_buffer.length;
423
0
  else
424
0
    len = session->internals.handshake_hash_buffer_prev_len;
425
426
0
  algorithm = session->security_parameters.prf->id;
427
0
  rc = _gnutls_hash_fast(algorithm,
428
0
             session->internals.handshake_hash_buffer.data,
429
0
             len, concat);
430
0
  if (rc < 0)
431
0
    return gnutls_assert_val(rc);
432
433
0
  hash_len = session->security_parameters.prf->output_size;
434
435
0
  if (type == GNUTLS_SERVER) {
436
0
    mesg = SERVER_MSG;
437
0
  } else {
438
0
    mesg = CLIENT_MSG;
439
0
  }
440
441
0
  _gnutls_memory_mark_defined(session->security_parameters.master_secret,
442
0
            GNUTLS_MASTER_SIZE);
443
0
  rc = _gnutls_PRF(session, session->security_parameters.master_secret,
444
0
       GNUTLS_MASTER_SIZE, mesg, siz, concat, hash_len, 12,
445
0
       ret);
446
0
  if (rc < 0) {
447
0
    _gnutls_memory_mark_undefined(
448
0
      session->security_parameters.master_secret,
449
0
      GNUTLS_MASTER_SIZE);
450
0
  }
451
0
  return rc;
452
0
}
453
454
/* returns the 0 on success or a negative error code.
455
 */
456
int _gnutls_negotiate_version(gnutls_session_t session, uint8_t major,
457
            uint8_t minor, unsigned allow_tls13)
458
0
{
459
0
  const version_entry_st *vers;
460
0
  const version_entry_st *aversion = nversion_to_entry(major, minor);
461
462
  /* if we do not support that version, unless that version is TLS 1.2;
463
   * TLS 1.2 is handled separately because it is always advertised under TLS 1.3 or later */
464
0
  if (aversion == NULL ||
465
0
      _gnutls_nversion_is_supported(session, major, minor) == 0) {
466
0
    if (aversion && aversion->id == GNUTLS_TLS1_2) {
467
0
      vers = _gnutls_version_max(session);
468
0
      if (unlikely(vers == NULL))
469
0
        return gnutls_assert_val(
470
0
          GNUTLS_E_NO_CIPHER_SUITES);
471
472
0
      if (vers->id >= GNUTLS_TLS1_2) {
473
0
        session->security_parameters.pversion =
474
0
          aversion;
475
0
        return 0;
476
0
      }
477
0
    }
478
479
    /* if we get an unknown/unsupported version, then fail if the version we
480
     * got is too low to be supported */
481
0
    if (!_gnutls_version_is_too_high(session, major, minor))
482
0
      return gnutls_assert_val(
483
0
        GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
484
485
    /* If he requested something we do not support
486
     * then we send him the highest we support.
487
     */
488
0
    vers = _gnutls_legacy_version_max(session);
489
0
    if (vers == NULL) {
490
      /* this check is not really needed.
491
       */
492
0
      gnutls_assert();
493
0
      return GNUTLS_E_UNKNOWN_CIPHER_SUITE;
494
0
    }
495
496
0
    session->security_parameters.pversion = vers;
497
498
0
    return 0;
499
0
  } else {
500
0
    session->security_parameters.pversion = aversion;
501
502
    /* we do not allow TLS1.3 negotiation using this mechanism */
503
0
    if (aversion->tls13_sem && !allow_tls13) {
504
0
      vers = _gnutls_legacy_version_max(session);
505
0
      session->security_parameters.pversion = vers;
506
0
    }
507
508
0
    return 0;
509
0
  }
510
0
}
511
512
/* This function returns:
513
 *  - zero on success
514
 *  - GNUTLS_E_INT_RET_0 if GNUTLS_E_AGAIN || GNUTLS_E_INTERRUPTED were returned by the callback
515
 *  - a negative error code on other error
516
 */
517
int _gnutls_user_hello_func(gnutls_session_t session, uint8_t major,
518
          uint8_t minor)
519
0
{
520
0
  int ret, sret = 0;
521
0
  const version_entry_st *vers, *old_vers;
522
0
  const version_entry_st *new_max;
523
524
0
  if (session->internals.user_hello_func != NULL) {
525
0
    ret = session->internals.user_hello_func(session);
526
527
0
    if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED) {
528
0
      gnutls_assert();
529
0
      sret = GNUTLS_E_INT_RET_0;
530
0
    } else if (ret < 0) {
531
0
      gnutls_assert();
532
0
      return ret;
533
0
    }
534
535
    /* This callback is often used to switch the priority string of the
536
     * server, and that includes switching version which we have already
537
     * negotiated; note that this doesn't apply when resuming as the version
538
     * negotiation is already complete. */
539
0
    if (!session->internals.resumed) {
540
0
      new_max = _gnutls_version_max(session);
541
0
      old_vers = get_version(session);
542
543
0
      if (!old_vers->tls13_sem ||
544
0
          (new_max && !new_max->tls13_sem)) {
545
#if GNUTLS_TLS_VERSION_MAX != GNUTLS_TLS1_3
546
#error "Need to update the following logic"
547
#endif
548
        /* Here we need to renegotiate the version since the callee might
549
         * have disabled some TLS versions. This logic does not cope for
550
         * protocols later than TLS1.3 if they have the tls13_sem set */
551
0
        ret = _gnutls_negotiate_version(session, major,
552
0
                minor, 0);
553
0
        if (ret < 0)
554
0
          return gnutls_assert_val(ret);
555
556
0
        vers = get_version(session);
557
0
        if (old_vers != vers) {
558
          /* at this point we need to regenerate the random value to
559
           * avoid the peer detecting this session as a rollback
560
           * attempt. */
561
0
          ret = _gnutls_gen_server_random(
562
0
            session, vers->id);
563
0
          if (ret < 0)
564
0
            return gnutls_assert_val(ret);
565
0
        }
566
0
      }
567
0
    }
568
0
  }
569
0
  return sret;
570
0
}
571
572
/* Associates the right credential types for the session, and
573
 * performs sanity checks. */
574
static int set_auth_types(gnutls_session_t session)
575
0
{
576
0
  const version_entry_st *ver = get_version(session);
577
0
  gnutls_kx_algorithm_t kx;
578
579
  /* sanity check:
580
   * we see TLS1.3 negotiated but no key share was sent */
581
0
  if (ver->tls13_sem) {
582
0
    if (unlikely(!(session->internals.hsk_flags &
583
0
             HSK_PSK_KE_MODE_PSK) &&
584
0
           !(session->internals.hsk_flags &
585
0
             HSK_KEY_SHARE_RECEIVED))) {
586
0
      return gnutls_assert_val(GNUTLS_E_MISSING_EXTENSION);
587
0
    }
588
589
    /* Under TLS1.3 this returns a KX which matches the negotiated
590
     * groups from the key shares; if we are resuming then the KX seen
591
     * here doesn't match the original session. */
592
0
    if (!session->internals.resumed) {
593
0
      const gnutls_group_entry_st *group = get_group(session);
594
595
0
      if (session->internals.hsk_flags & HSK_PSK_SELECTED) {
596
0
        if (group) {
597
0
          kx = group->pk == GNUTLS_PK_DH ?
598
0
                 GNUTLS_KX_DHE_PSK :
599
0
                 GNUTLS_KX_ECDHE_PSK;
600
0
        } else {
601
0
          kx = GNUTLS_KX_PSK;
602
0
        }
603
0
      } else if (group) {
604
        /* Not necessarily be RSA, but just to
605
         * make _gnutls_map_kx_get_cred below
606
         * work.
607
         */
608
0
        kx = group->pk == GNUTLS_PK_DH ?
609
0
               GNUTLS_KX_DHE_RSA :
610
0
               GNUTLS_KX_ECDHE_RSA;
611
0
      } else
612
0
        kx = GNUTLS_KX_UNKNOWN;
613
0
    } else
614
0
      kx = GNUTLS_KX_UNKNOWN;
615
0
  } else {
616
    /* TLS1.2 or earlier, kx is associated with ciphersuite */
617
0
    kx = session->security_parameters.cs->kx_algorithm;
618
0
  }
619
620
0
  if (kx != GNUTLS_KX_UNKNOWN) {
621
0
    session->security_parameters.server_auth_type =
622
0
      _gnutls_map_kx_get_cred(kx, 1);
623
0
    session->security_parameters.client_auth_type =
624
0
      _gnutls_map_kx_get_cred(kx, 0);
625
0
  } else if (unlikely(!session->internals.resumed)) {
626
    /* Here we can only arrive if something we received
627
     * prevented the session from completing. */
628
0
    return gnutls_assert_val(GNUTLS_E_ILLEGAL_PARAMETER);
629
0
  }
630
631
0
  return 0;
632
0
}
633
634
/* Read a client hello packet.
635
 * A client hello must be a known version client hello
636
 * or version 2.0 client hello (only for compatibility
637
 * since SSL version 2.0 is not supported).
638
 */
639
static int read_client_hello(gnutls_session_t session, uint8_t *data,
640
           int datalen)
641
0
{
642
0
  uint8_t session_id_len;
643
0
  int pos = 0, ret;
644
0
  uint16_t suite_size, comp_size;
645
0
  int ext_size;
646
0
  int neg_version, sret = 0;
647
0
  int len = datalen;
648
0
  uint8_t major, minor;
649
0
  uint8_t *suite_ptr, *comp_ptr, *session_id, *ext_ptr;
650
0
  const version_entry_st *vers;
651
652
0
  DECR_LEN(len, 2);
653
0
  _gnutls_handshake_log("HSK[%p]: Client's version: %d.%d\n", session,
654
0
            data[pos], data[pos + 1]);
655
656
0
  major = data[pos];
657
0
  minor = data[pos + 1];
658
659
0
  set_adv_version(session, major, minor);
660
661
0
  ret = _gnutls_negotiate_version(session, major, minor, 0);
662
0
  if (ret < 0)
663
0
    return gnutls_assert_val(ret);
664
665
0
  vers = get_version(session);
666
0
  if (vers == NULL)
667
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
668
669
0
  neg_version = vers->id;
670
671
0
  pos += 2;
672
673
  /* Read client random value.
674
   */
675
0
  DECR_LEN(len, GNUTLS_RANDOM_SIZE);
676
0
  _gnutls_set_client_random(session, &data[pos]);
677
678
0
  pos += GNUTLS_RANDOM_SIZE;
679
680
0
  ret = _gnutls_gen_server_random(session, neg_version);
681
0
  if (ret < 0)
682
0
    return gnutls_assert_val(ret);
683
684
0
  session->security_parameters.timestamp = gnutls_time(NULL);
685
686
0
  DECR_LEN(len, 1);
687
0
  session_id_len = data[pos++];
688
689
  /* RESUME SESSION
690
   */
691
0
  if (session_id_len > GNUTLS_MAX_SESSION_ID_SIZE) {
692
0
    gnutls_assert();
693
0
    return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
694
0
  }
695
0
  DECR_LEN(len, session_id_len);
696
0
  session_id = &data[pos];
697
0
  pos += session_id_len;
698
699
0
  if (IS_DTLS(session)) {
700
0
    int cookie_size;
701
702
0
    DECR_LEN(len, 1);
703
0
    cookie_size = data[pos++];
704
0
    DECR_LEN(len, cookie_size);
705
0
    pos += cookie_size;
706
0
  }
707
708
  /* move forward to extensions and store other vals */
709
0
  DECR_LEN(len, 2);
710
0
  suite_size = _gnutls_read_uint16(&data[pos]);
711
0
  pos += 2;
712
713
0
  if (suite_size == 0 || (suite_size % 2) != 0)
714
0
    return gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET_LENGTH);
715
716
0
  suite_ptr = &data[pos];
717
0
  DECR_LEN(len, suite_size);
718
0
  pos += suite_size;
719
720
0
  DECR_LEN(len, 1);
721
0
  comp_size = data[pos++]; /* the number of compression methods */
722
723
0
  if (comp_size == 0)
724
0
    return gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET_LENGTH);
725
726
0
  comp_ptr = &data[pos];
727
0
  DECR_LEN(len, comp_size);
728
0
  pos += comp_size;
729
730
0
  ext_ptr = &data[pos];
731
0
  ext_size = len;
732
733
  /* Parse only the mandatory to read extensions for resumption
734
   * and version negotiation. We don't want to parse any other
735
   * extensions since  we don't want new extension values to override
736
   * the resumed ones. */
737
0
  ret = _gnutls_parse_hello_extensions(session,
738
0
               GNUTLS_EXT_FLAG_CLIENT_HELLO,
739
0
               GNUTLS_EXT_VERSION_NEG, ext_ptr,
740
0
               ext_size);
741
0
  if (ret < 0)
742
0
    return gnutls_assert_val(ret);
743
744
0
  ret = _gnutls_parse_hello_extensions(session,
745
0
               GNUTLS_EXT_FLAG_CLIENT_HELLO,
746
0
               GNUTLS_EXT_MANDATORY, ext_ptr,
747
0
               ext_size);
748
0
  if (ret < 0)
749
0
    return gnutls_assert_val(ret);
750
751
0
  vers = get_version(session);
752
0
  if (unlikely(vers == NULL))
753
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
754
755
0
  if (!vers->tls13_sem) {
756
0
    ret = _gnutls_server_restore_session(session, session_id,
757
0
                 session_id_len);
758
759
0
    if (session_id_len > 0)
760
0
      session->internals.resumption_requested = 1;
761
762
0
    if (ret == 0) { /* resumed using default TLS resumption! */
763
0
      ret = _gnutls_server_select_suite(session, suite_ptr,
764
0
                suite_size, 1);
765
0
      if (ret < 0)
766
0
        return gnutls_assert_val(ret);
767
768
0
      ret = tls12_resume_copy_required_vals(session, 0);
769
0
      if (ret < 0)
770
0
        return gnutls_assert_val(ret);
771
772
0
      session->internals.resumed = true;
773
774
0
      return _gnutls_user_hello_func(session, major, minor);
775
0
    } else {
776
0
      ret = _gnutls_generate_session_id(
777
0
        session->security_parameters.session_id,
778
0
        &session->security_parameters.session_id_size);
779
0
      if (ret < 0)
780
0
        return gnutls_assert_val(ret);
781
782
0
      session->internals.resumed = false;
783
0
    }
784
0
  } else { /* TLS1.3 */
785
    /* we echo client's session ID - length was checked previously */
786
0
    assert(session_id_len <= GNUTLS_MAX_SESSION_ID_SIZE);
787
0
    if (session_id_len > 0)
788
0
      memcpy(session->security_parameters.session_id,
789
0
             session_id, session_id_len);
790
0
    session->security_parameters.session_id_size = session_id_len;
791
0
  }
792
793
  /* Parse the extensions (if any)
794
   *
795
   * Unconditionally try to parse extensions; safe renegotiation uses them in
796
   * sslv3 and higher, even though sslv3 doesn't officially support them.
797
   */
798
0
  ret = _gnutls_parse_hello_extensions(session,
799
0
               GNUTLS_EXT_FLAG_CLIENT_HELLO,
800
0
               GNUTLS_EXT_APPLICATION, ext_ptr,
801
0
               ext_size);
802
  /* len is the rest of the parsed length */
803
0
  if (ret < 0) {
804
0
    gnutls_assert();
805
0
    return ret;
806
0
  }
807
808
  /* we cache this error code */
809
0
  sret = _gnutls_user_hello_func(session, major, minor);
810
0
  if (sret < 0 && sret != GNUTLS_E_INT_RET_0) {
811
0
    gnutls_assert();
812
0
    return sret;
813
0
  }
814
815
  /* Session tickets are parsed in this point */
816
0
  ret = _gnutls_parse_hello_extensions(session,
817
0
               GNUTLS_EXT_FLAG_CLIENT_HELLO,
818
0
               GNUTLS_EXT_TLS, ext_ptr, ext_size);
819
0
  if (ret < 0) {
820
0
    gnutls_assert();
821
0
    return ret;
822
0
  }
823
824
0
  if (session->internals.hsk_flags & HSK_EARLY_DATA_ACCEPTED) {
825
0
    const cipher_entry_st *ce;
826
0
    const mac_entry_st *me;
827
0
    record_parameters_st *params;
828
829
0
    ce = cipher_to_entry(
830
0
      session->internals.resumed_security_parameters.cs
831
0
        ->block_algorithm);
832
0
    me = mac_to_entry(session->internals.resumed_security_parameters
833
0
            .cs->mac_algorithm);
834
835
0
    ret = _gnutls_epoch_get(session, EPOCH_NEXT, &params);
836
0
    if (ret < 0) {
837
0
      return gnutls_assert_val(ret);
838
0
    }
839
840
0
    params->cipher = ce;
841
0
    params->mac = me;
842
843
0
    ret = _tls13_read_connection_state_init(session, STAGE_EARLY);
844
0
    if (ret < 0) {
845
0
      return gnutls_assert_val(ret);
846
0
    }
847
848
0
    _gnutls_epoch_bump(session);
849
0
    ret = _gnutls_epoch_dup(session, EPOCH_READ_CURRENT);
850
0
    if (ret < 0) {
851
0
      return gnutls_assert_val(ret);
852
0
    }
853
0
  }
854
855
  /* resumed by session_ticket extension */
856
0
  if (!vers->tls13_sem && session->internals.resumed) {
857
0
    session->internals.resumed_security_parameters
858
0
      .max_record_recv_size =
859
0
      session->security_parameters.max_record_recv_size;
860
0
    session->internals.resumed_security_parameters
861
0
      .max_record_send_size =
862
0
      session->security_parameters.max_record_send_size;
863
864
0
    ret = _gnutls_server_select_suite(session, suite_ptr,
865
0
              suite_size, 1);
866
0
    if (ret < 0)
867
0
      return gnutls_assert_val(ret);
868
869
0
    ret = tls12_resume_copy_required_vals(session, 1);
870
0
    if (ret < 0)
871
0
      return gnutls_assert_val(ret);
872
873
    /* to indicate to the client that the current session is resumed */
874
0
    memcpy(session->security_parameters.session_id, session_id,
875
0
           session_id_len);
876
0
    session->security_parameters.session_id_size = session_id_len;
877
878
0
    return 0;
879
0
  }
880
881
  /* select an appropriate cipher suite (as well as certificate)
882
   */
883
0
  ret = _gnutls_server_select_suite(session, suite_ptr, suite_size, 0);
884
0
  if (ret < 0) {
885
0
    gnutls_assert();
886
0
    return ret;
887
0
  }
888
889
  /* Only at this point we know the version we are actually going to use
890
   * ("supported_versions" extension is parsed, user_hello_func is called,
891
   * legacy version negotiation is done). */
892
0
  vers = get_version(session);
893
0
  if (unlikely(vers == NULL))
894
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
895
896
0
  if (_gnutls_version_priority(session, vers->id) < 0)
897
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
898
899
  /* check if EMS is required */
900
0
  if (!vers->tls13_sem && vers->id != GNUTLS_SSL3 &&
901
0
      vers->id != GNUTLS_DTLS0_9 &&
902
0
      session->internals.priorities->force_ext_master_secret ==
903
0
        EMS_REQUIRE &&
904
0
      !session->security_parameters.ext_master_secret) {
905
0
    return gnutls_assert_val(GNUTLS_E_INSUFFICIENT_SECURITY);
906
0
  }
907
908
0
  _gnutls_handshake_log("HSK[%p]: Selected version %s\n", session,
909
0
            vers->name);
910
911
  /* select appropriate compression method */
912
0
  ret = check_if_null_comp_present(session, comp_ptr, comp_size);
913
0
  if (ret < 0) {
914
0
    gnutls_assert();
915
0
    return ret;
916
0
  }
917
918
  /* call extensions that are intended to be parsed after the ciphersuite/cert
919
   * are known. */
920
0
  ret = _gnutls_parse_hello_extensions(session,
921
0
               GNUTLS_EXT_FLAG_CLIENT_HELLO,
922
0
               _GNUTLS_EXT_TLS_POST_CS, ext_ptr,
923
0
               ext_size);
924
0
  if (ret < 0) {
925
0
    gnutls_assert();
926
0
    return ret;
927
0
  }
928
929
  /* Calculate TLS 1.3 Early Secret */
930
0
  if (session->security_parameters.pversion->tls13_sem &&
931
0
      !(session->internals.hsk_flags & HSK_PSK_SELECTED)) {
932
0
    ret = _tls13_init_secret(session, NULL, 0);
933
0
    if (ret < 0)
934
0
      return gnutls_assert_val(ret);
935
0
  }
936
937
0
  ret = set_auth_types(session);
938
0
  if (ret < 0) {
939
0
    gnutls_assert();
940
0
    return ret;
941
0
  }
942
943
0
  return sret;
944
0
}
945
946
/* This is to be called after sending CHANGE CIPHER SPEC packet
947
 * and initializing encryption. This is the first encrypted message
948
 * we send.
949
 */
950
int _gnutls_send_finished(gnutls_session_t session, int again)
951
0
{
952
0
  mbuffer_st *bufel;
953
0
  uint8_t *data;
954
0
  int ret;
955
0
  size_t vdata_size = 0;
956
0
  const version_entry_st *vers;
957
958
0
  if (again == 0) {
959
0
    bufel = _gnutls_handshake_alloc(session, MAX_VERIFY_DATA_SIZE);
960
0
    if (bufel == NULL) {
961
0
      gnutls_assert();
962
0
      return GNUTLS_E_MEMORY_ERROR;
963
0
    }
964
0
    data = _mbuffer_get_udata_ptr(bufel);
965
966
0
    vers = get_version(session);
967
0
    if (unlikely(vers == NULL))
968
0
      return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
969
970
#ifdef ENABLE_SSL3
971
    if (vers->id == GNUTLS_SSL3) {
972
      ret = _gnutls_ssl3_finished(
973
        session, session->security_parameters.entity,
974
        data, 1);
975
      _mbuffer_set_udata_size(bufel, 36);
976
    } else { /* TLS 1.0+ */
977
#endif
978
0
      ret = _gnutls_finished(
979
0
        session, session->security_parameters.entity,
980
0
        data, 1);
981
0
      _mbuffer_set_udata_size(bufel, 12);
982
#ifdef ENABLE_SSL3
983
    }
984
#endif
985
986
0
    if (ret < 0) {
987
0
      gnutls_assert();
988
0
      return ret;
989
0
    }
990
991
0
    vdata_size = _mbuffer_get_udata_size(bufel);
992
993
0
    ret = _gnutls_ext_sr_finished(session, data, vdata_size, 0);
994
0
    if (ret < 0) {
995
0
      gnutls_assert();
996
0
      return ret;
997
0
    }
998
999
0
    if ((!session->internals.resumed &&
1000
0
         session->security_parameters.entity == GNUTLS_CLIENT) ||
1001
0
        (session->internals.resumed &&
1002
0
         session->security_parameters.entity == GNUTLS_SERVER)) {
1003
      /* if we are a client not resuming - or we are a server resuming */
1004
0
      _gnutls_handshake_log(
1005
0
        "HSK[%p]: recording tls-unique CB (send)\n",
1006
0
        session);
1007
0
      memcpy(session->internals.cb_tls_unique, data,
1008
0
             vdata_size);
1009
0
      session->internals.cb_tls_unique_len = vdata_size;
1010
0
    }
1011
1012
0
    ret = _gnutls_send_handshake(session, bufel,
1013
0
               GNUTLS_HANDSHAKE_FINISHED);
1014
0
  } else {
1015
0
    ret = _gnutls_send_handshake(session, NULL,
1016
0
               GNUTLS_HANDSHAKE_FINISHED);
1017
0
  }
1018
1019
0
  return ret;
1020
0
}
1021
1022
/* This is to be called after sending our finished message. If everything
1023
 * went fine we have negotiated a secure connection
1024
 */
1025
int _gnutls_recv_finished(gnutls_session_t session)
1026
0
{
1027
0
  uint8_t data[MAX_VERIFY_DATA_SIZE], *vrfy;
1028
0
  gnutls_buffer_st buf;
1029
0
  int data_size;
1030
0
  int ret;
1031
0
  int vrfy_size;
1032
0
  const version_entry_st *vers = get_version(session);
1033
1034
0
  if (unlikely(vers == NULL))
1035
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
1036
1037
0
  ret = _gnutls_recv_handshake(session, GNUTLS_HANDSHAKE_FINISHED, 0,
1038
0
             &buf);
1039
0
  if (ret < 0) {
1040
0
    gnutls_assert();
1041
0
    return ret;
1042
0
  }
1043
1044
0
  vrfy = buf.data;
1045
0
  vrfy_size = buf.length;
1046
1047
#ifdef ENABLE_SSL3
1048
  if (vers->id == GNUTLS_SSL3)
1049
    data_size = 36;
1050
  else
1051
#endif
1052
0
    data_size = 12;
1053
1054
0
  if (vrfy_size != data_size) {
1055
0
    gnutls_assert();
1056
0
    ret = GNUTLS_E_ERROR_IN_FINISHED_PACKET;
1057
0
    goto cleanup;
1058
0
  }
1059
1060
#ifdef ENABLE_SSL3
1061
  if (vers->id == GNUTLS_SSL3) {
1062
    ret = _gnutls_ssl3_finished(
1063
      session, (session->security_parameters.entity + 1) % 2,
1064
      data, 0);
1065
  } else /* TLS 1.0+ */
1066
#endif
1067
0
    ret = _gnutls_finished(
1068
0
      session, (session->security_parameters.entity + 1) % 2,
1069
0
      data, 0);
1070
1071
0
  if (ret < 0) {
1072
0
    gnutls_assert();
1073
0
    goto cleanup;
1074
0
  }
1075
1076
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
1077
  /* When fuzzying allow to proceed without verifying the handshake
1078
   * consistency */
1079
  (void)vrfy;
1080
#warning This is unsafe for production builds
1081
1082
#else
1083
0
  if (memcmp(vrfy, data, data_size) != 0) {
1084
0
    gnutls_assert();
1085
0
    ret = GNUTLS_E_ERROR_IN_FINISHED_PACKET;
1086
0
    goto cleanup;
1087
0
  }
1088
0
#endif
1089
1090
0
  ret = _gnutls_ext_sr_finished(session, data, data_size, 1);
1091
0
  if (ret < 0) {
1092
0
    gnutls_assert();
1093
0
    goto cleanup;
1094
0
  }
1095
1096
0
  if ((session->internals.resumed &&
1097
0
       session->security_parameters.entity == GNUTLS_CLIENT) ||
1098
0
      (!session->internals.resumed &&
1099
0
       session->security_parameters.entity == GNUTLS_SERVER)) {
1100
    /* if we are a client resuming - or we are a server not resuming */
1101
0
    _gnutls_handshake_log(
1102
0
      "HSK[%p]: recording tls-unique CB (recv)\n", session);
1103
0
    memcpy(session->internals.cb_tls_unique, data, data_size);
1104
0
    session->internals.cb_tls_unique_len = data_size;
1105
0
  }
1106
1107
0
cleanup:
1108
0
  _gnutls_buffer_clear(&buf);
1109
1110
0
  return ret;
1111
0
}
1112
1113
/* This selects the best supported ciphersuite from the given ones. Then
1114
 * it adds the suite to the session and performs some checks.
1115
 *
1116
 * When @scsv_only is non-zero only the available SCSVs are parsed
1117
 * and acted upon.
1118
 */
1119
int _gnutls_server_select_suite(gnutls_session_t session, uint8_t *data,
1120
        unsigned int datalen, unsigned scsv_only)
1121
0
{
1122
0
  int ret;
1123
0
  unsigned int i;
1124
0
  ciphersuite_list_st peer_clist;
1125
0
  const gnutls_cipher_suite_entry_st *selected;
1126
0
  gnutls_kx_algorithm_t kx;
1127
0
  int retval;
1128
0
  const version_entry_st *vers = get_version(session);
1129
1130
0
  peer_clist.size = 0;
1131
1132
0
  for (i = 0; i < datalen; i += 2) {
1133
    /* we support the TLS renegotiation SCSV, even if we are
1134
     * not under SSL 3.0, because openssl sends this SCSV
1135
     * on resumption unconditionally. */
1136
    /* TLS_RENEGO_PROTECTION_REQUEST = { 0x00, 0xff } */
1137
0
    if (session->internals.priorities->sr != SR_DISABLED &&
1138
0
        data[i] == GNUTLS_RENEGO_PROTECTION_REQUEST_MAJOR &&
1139
0
        data[i + 1] == GNUTLS_RENEGO_PROTECTION_REQUEST_MINOR) {
1140
0
      _gnutls_handshake_log(
1141
0
        "HSK[%p]: Received safe renegotiation CS\n",
1142
0
        session);
1143
0
      retval = _gnutls_ext_sr_recv_cs(session);
1144
0
      if (retval < 0) {
1145
0
        gnutls_assert();
1146
0
        return retval;
1147
0
      }
1148
0
    }
1149
1150
    /* TLS_FALLBACK_SCSV */
1151
0
    if (data[i] == GNUTLS_FALLBACK_SCSV_MAJOR &&
1152
0
        data[i + 1] == GNUTLS_FALLBACK_SCSV_MINOR) {
1153
0
      const version_entry_st *max =
1154
0
        _gnutls_version_max(session);
1155
1156
0
      _gnutls_handshake_log("HSK[%p]: Received fallback CS\n",
1157
0
                session);
1158
1159
0
      if (vers != max)
1160
0
        return gnutls_assert_val(
1161
0
          GNUTLS_E_INAPPROPRIATE_FALLBACK);
1162
0
    } else if (!scsv_only) {
1163
0
      if (peer_clist.size < MAX_CIPHERSUITE_SIZE) {
1164
0
        peer_clist.entry[peer_clist.size] =
1165
0
          ciphersuite_to_entry(&data[i]);
1166
0
        if (peer_clist.entry[peer_clist.size] != NULL)
1167
0
          peer_clist.size++;
1168
0
      }
1169
0
    }
1170
0
  }
1171
1172
0
  if (scsv_only)
1173
0
    return 0;
1174
1175
0
  ret = _gnutls_figure_common_ciphersuite(session, &peer_clist,
1176
0
            &selected);
1177
0
  if (ret < 0) {
1178
0
    return gnutls_assert_val(ret);
1179
0
  }
1180
1181
0
  _gnutls_handshake_log("HSK[%p]: Selected cipher suite: %s\n", session,
1182
0
            selected->name);
1183
1184
0
  ret = _gnutls_set_cipher_suite2(session, selected);
1185
0
  if (ret < 0) {
1186
0
    gnutls_assert();
1187
0
    return ret;
1188
0
  }
1189
1190
0
  if (!vers->tls13_sem) {
1191
    /* check if the credentials (username, public key etc.) are ok
1192
     */
1193
0
    kx = selected->kx_algorithm;
1194
0
    if (_gnutls_get_kx_cred(session, kx) == NULL) {
1195
0
      gnutls_assert();
1196
0
      return GNUTLS_E_INSUFFICIENT_CREDENTIALS;
1197
0
    }
1198
1199
    /* set the mod_auth_st to the appropriate struct
1200
     * according to the KX algorithm. This is needed since all the
1201
     * handshake functions are read from there;
1202
     */
1203
0
    session->internals.auth_struct = _gnutls_kx_auth_struct(kx);
1204
0
    if (session->internals.auth_struct == NULL) {
1205
0
      _gnutls_handshake_log(
1206
0
        "HSK[%p]: Cannot find the appropriate handler for the KX algorithm\n",
1207
0
        session);
1208
0
      gnutls_assert();
1209
0
      return GNUTLS_E_INTERNAL_ERROR;
1210
0
    }
1211
0
  }
1212
1213
0
  return 0;
1214
0
}
1215
1216
/* This checks whether the null compression method is present.
1217
 */
1218
static int check_if_null_comp_present(gnutls_session_t session, uint8_t *data,
1219
              int datalen)
1220
0
{
1221
0
  int j;
1222
1223
0
  for (j = 0; j < datalen; j++) {
1224
0
    if (data[j] == 0)
1225
0
      return 0;
1226
0
  }
1227
1228
  /* we were not able to find a the NULL compression
1229
   * algorithm
1230
   */
1231
0
  gnutls_assert();
1232
0
  return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
1233
0
}
1234
1235
/* This function sends an empty handshake packet. (like hello request).
1236
 * If the previous _gnutls_send_empty_handshake() returned
1237
 * GNUTLS_E_AGAIN or GNUTLS_E_INTERRUPTED, then it must be called again
1238
 * (until it returns ok), with NULL parameters.
1239
 */
1240
static int _gnutls_send_empty_handshake(gnutls_session_t session,
1241
          gnutls_handshake_description_t type,
1242
          int again)
1243
0
{
1244
0
  mbuffer_st *bufel;
1245
1246
0
  if (again == 0) {
1247
0
    bufel = _gnutls_handshake_alloc(session, 0);
1248
0
    if (bufel == NULL) {
1249
0
      gnutls_assert();
1250
0
      return GNUTLS_E_MEMORY_ERROR;
1251
0
    }
1252
0
  } else
1253
0
    bufel = NULL;
1254
1255
0
  return _gnutls_send_handshake(session, bufel, type);
1256
0
}
1257
1258
int _gnutls_call_hook_func(gnutls_session_t session,
1259
         gnutls_handshake_description_t type, int post,
1260
         unsigned incoming, const uint8_t *data,
1261
         unsigned data_size)
1262
0
{
1263
0
  gnutls_datum_t msg = { (void *)data, data_size };
1264
1265
0
  if (session->internals.h_hook != NULL) {
1266
0
    if ((session->internals.h_type == type ||
1267
0
         session->internals.h_type == GNUTLS_HANDSHAKE_ANY) &&
1268
0
        (session->internals.h_post == post ||
1269
0
         session->internals.h_post == GNUTLS_HOOK_BOTH)) {
1270
      /* internal API for testing: when we are expected to
1271
       * wait for GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC, we
1272
       * do so, but not when doing for all messages. The
1273
       * reason is that change cipher specs are not handshake
1274
       * messages, and we don't support waiting for them
1275
       * consistently (only sending is tracked, not receiving).
1276
       */
1277
0
      if (type == GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC &&
1278
0
          session->internals.h_type !=
1279
0
            GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC)
1280
0
        return 0;
1281
1282
0
      return session->internals.h_hook(session, type, post,
1283
0
               incoming, &msg);
1284
0
    }
1285
0
  }
1286
0
  return 0;
1287
0
}
1288
1289
/* Note that the "New session ticket" handshake packet behaves differently under
1290
 * TLS 1.2 or 1.3. In 1.2 it is included in the handshake process, while in 1.3
1291
 * it is sent asynchronously */
1292
#define IS_ASYNC(t, v)                          \
1293
0
  (t == GNUTLS_HANDSHAKE_HELLO_REQUEST || \
1294
0
   t == GNUTLS_HANDSHAKE_KEY_UPDATE ||    \
1295
0
   (t == GNUTLS_HANDSHAKE_NEW_SESSION_TICKET && v->tls13_sem))
1296
1297
int _gnutls_send_handshake(gnutls_session_t session, mbuffer_st *bufel,
1298
         gnutls_handshake_description_t type)
1299
0
{
1300
0
  return _gnutls_send_handshake2(session, bufel, type, 0);
1301
0
}
1302
1303
/* This function sends a handshake message of type 'type' containing the
1304
 * data specified here. If the previous _gnutls_send_handshake() returned
1305
 * GNUTLS_E_AGAIN or GNUTLS_E_INTERRUPTED, then it must be called again
1306
 * (until it returns ok), with NULL parameters.
1307
 */
1308
int _gnutls_send_handshake2(gnutls_session_t session, mbuffer_st *bufel,
1309
          gnutls_handshake_description_t type,
1310
          unsigned queue_only)
1311
0
{
1312
0
  int ret;
1313
0
  uint8_t *data;
1314
0
  uint32_t datasize, i_datasize;
1315
0
  int pos = 0;
1316
0
  const version_entry_st *vers = get_version(session);
1317
1318
0
  if (bufel == NULL) {
1319
    /* we are resuming a previously interrupted
1320
     * send.
1321
     */
1322
0
    ret = _gnutls_handshake_io_write_flush(session);
1323
0
    return ret;
1324
0
  }
1325
1326
  /* first run */
1327
0
  data = _mbuffer_get_uhead_ptr(bufel);
1328
0
  i_datasize = _mbuffer_get_udata_size(bufel);
1329
0
  datasize = i_datasize + _mbuffer_get_uhead_size(bufel);
1330
1331
0
  data[pos++] = (uint8_t)REAL_HSK_TYPE(type);
1332
0
  _gnutls_write_uint24(_mbuffer_get_udata_size(bufel), &data[pos]);
1333
0
  pos += 3;
1334
1335
  /* Add DTLS handshake fragment headers.  The message will be
1336
   * fragmented later by the fragmentation sub-layer. All fields must
1337
   * be set properly for HMAC. The HMAC requires we pretend that the
1338
   * message was sent in a single fragment. */
1339
0
  if (IS_DTLS(session)) {
1340
0
    _gnutls_write_uint16(session->internals.dtls.hsk_write_seq++,
1341
0
             &data[pos]);
1342
0
    pos += 2;
1343
1344
    /* Fragment offset */
1345
0
    _gnutls_write_uint24(0, &data[pos]);
1346
0
    pos += 3;
1347
1348
    /* Fragment length */
1349
0
    _gnutls_write_uint24(i_datasize, &data[pos]);
1350
    /* pos += 3; */
1351
0
  }
1352
1353
0
  _gnutls_handshake_log("HSK[%p]: %s was queued [%ld bytes]\n", session,
1354
0
            _gnutls_handshake2str(type), (long)datasize);
1355
1356
  /* Here we keep the handshake messages in order to hash them...
1357
   */
1358
0
  if (!IS_ASYNC(type, vers)) {
1359
0
    if ((ret = handshake_hash_add_sent(session, type, data,
1360
0
               datasize)) < 0) {
1361
0
      gnutls_assert();
1362
0
      _mbuffer_xfree(&bufel);
1363
0
      return ret;
1364
0
    }
1365
    /* If we are sending a PSK, generate early secrets here.
1366
     * This cannot be done in pre_shared_key.c, because it
1367
     * relies on transcript hash of a Client Hello. */
1368
0
    if (type == GNUTLS_HANDSHAKE_CLIENT_HELLO &&
1369
0
        session->key.binders[0].prf != NULL) {
1370
0
      ret = _gnutls_generate_early_secrets_for_psk(session);
1371
0
      if (ret < 0) {
1372
0
        gnutls_assert();
1373
0
        _mbuffer_xfree(&bufel);
1374
0
        return ret;
1375
0
      }
1376
0
    }
1377
0
  }
1378
1379
0
  ret = _gnutls_call_hook_func(session, type, GNUTLS_HOOK_PRE, 0,
1380
0
             _mbuffer_get_udata_ptr(bufel),
1381
0
             _mbuffer_get_udata_size(bufel));
1382
0
  if (ret < 0) {
1383
0
    gnutls_assert();
1384
0
    _mbuffer_xfree(&bufel);
1385
0
    return ret;
1386
0
  }
1387
1388
0
  session->internals.last_handshake_out = type;
1389
1390
0
  ret = _gnutls_handshake_io_cache_int(session, type, bufel);
1391
0
  if (ret < 0) {
1392
0
    _mbuffer_xfree(&bufel);
1393
0
    gnutls_assert();
1394
0
    return ret;
1395
0
  }
1396
1397
0
  ret = _gnutls_call_hook_func(session, type, GNUTLS_HOOK_POST, 0,
1398
0
             _mbuffer_get_udata_ptr(bufel),
1399
0
             _mbuffer_get_udata_size(bufel));
1400
0
  if (ret < 0) {
1401
0
    gnutls_assert();
1402
0
    return ret;
1403
0
  }
1404
1405
0
  if (queue_only)
1406
0
    return 0;
1407
1408
  /* Decide when to cache and when to send */
1409
0
  if (vers && vers->tls13_sem) {
1410
0
    if (session->internals.initial_negotiation_completed) {
1411
      /* we are under TLS1.3 in a re-authentication phase.
1412
       * we don't attempt to cache any messages */
1413
0
      goto force_send;
1414
0
    }
1415
1416
    /* The messages which are followed by another are not sent by default
1417
     * but are cached instead */
1418
0
    switch (type) {
1419
0
    case GNUTLS_HANDSHAKE_SERVER_HELLO: /* always followed by something */
1420
0
    case GNUTLS_HANDSHAKE_ENCRYPTED_EXTENSIONS: /* followed by finished or cert */
1421
0
    case GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST: /* followed by certificate */
1422
0
    case GNUTLS_HANDSHAKE_CERTIFICATE_PKT: /* this one is followed by cert verify */
1423
0
    case GNUTLS_HANDSHAKE_COMPRESSED_CERTIFICATE_PKT: /* as above */
1424
0
    case GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY: /* followed by finished */
1425
0
      ret = 0; /* cache */
1426
0
      break;
1427
0
    default:
1428
      /* send this and any cached messages */
1429
0
      goto force_send;
1430
0
    }
1431
0
  } else {
1432
    /* The messages which are followed by another are not sent by default
1433
     * but are cached instead */
1434
0
    switch (type) {
1435
0
    case GNUTLS_HANDSHAKE_CERTIFICATE_PKT: /* this one is followed by ServerHelloDone
1436
               * or ClientKeyExchange always.
1437
               */
1438
0
    case GNUTLS_HANDSHAKE_COMPRESSED_CERTIFICATE_PKT: /* as above */
1439
0
    case GNUTLS_HANDSHAKE_CERTIFICATE_STATUS:
1440
0
    case GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE: /* as above */
1441
0
    case GNUTLS_HANDSHAKE_SERVER_HELLO: /* as above */
1442
0
    case GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST: /* as above */
1443
0
    case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET: /* followed by ChangeCipherSpec */
1444
1445
      /* now for client Certificate, ClientKeyExchange and
1446
       * CertificateVerify are always followed by ChangeCipherSpec
1447
       */
1448
0
    case GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY:
1449
0
    case GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE:
1450
0
      ret = 0;
1451
0
      break;
1452
0
    default:
1453
      /* send this and any cached messages */
1454
0
      goto force_send;
1455
0
    }
1456
0
  }
1457
1458
0
  return ret;
1459
1460
0
force_send:
1461
0
  return _gnutls_handshake_io_write_flush(session);
1462
0
}
1463
1464
#define CHECK_SIZE(ll)                                                      \
1465
0
  if ((session->internals.max_handshake_data_buffer_size > 0) &&      \
1466
0
      (((ll) + session->internals.handshake_hash_buffer.length) >     \
1467
0
       session->internals.max_handshake_data_buffer_size)) {          \
1468
0
    _gnutls_debug_log(                                          \
1469
0
      "Handshake buffer length is %u (max: %u)\n",        \
1470
0
      (unsigned)((ll) +                                   \
1471
0
           session->internals.handshake_hash_buffer \
1472
0
             .length),                        \
1473
0
      (unsigned)session->internals                        \
1474
0
        .max_handshake_data_buffer_size);           \
1475
0
    return gnutls_assert_val(GNUTLS_E_HANDSHAKE_TOO_LARGE);     \
1476
0
  }
1477
1478
/* This function add the handshake headers and the
1479
 * handshake data to the handshake hash buffers. Needed
1480
 * for the finished messages calculations.
1481
 */
1482
static int handshake_hash_add_recvd(gnutls_session_t session,
1483
            gnutls_handshake_description_t recv_type,
1484
            uint8_t *header, uint16_t header_size,
1485
            uint8_t *dataptr, uint32_t datalen)
1486
0
{
1487
0
  int ret;
1488
0
  const version_entry_st *vers = get_version(session);
1489
1490
0
  if (unlikely(vers == NULL))
1491
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
1492
1493
0
  if ((vers->id != GNUTLS_DTLS0_9 &&
1494
0
       recv_type == GNUTLS_HANDSHAKE_HELLO_VERIFY_REQUEST) ||
1495
0
      IS_ASYNC(recv_type, vers))
1496
0
    return 0;
1497
1498
0
  CHECK_SIZE(header_size + datalen);
1499
1500
0
  session->internals.handshake_hash_buffer_prev_len =
1501
0
    session->internals.handshake_hash_buffer.length;
1502
1503
0
  if (vers->id != GNUTLS_DTLS0_9) {
1504
0
    ret = _gnutls_buffer_append_data(
1505
0
      &session->internals.handshake_hash_buffer, header,
1506
0
      header_size);
1507
0
    if (ret < 0)
1508
0
      return gnutls_assert_val(ret);
1509
0
  }
1510
0
  if (datalen > 0) {
1511
0
    ret = _gnutls_buffer_append_data(
1512
0
      &session->internals.handshake_hash_buffer, dataptr,
1513
0
      datalen);
1514
0
    if (ret < 0)
1515
0
      return gnutls_assert_val(ret);
1516
0
  }
1517
1518
  /* save the size until client KX. That is because the TLS
1519
   * session hash is calculated up to this message.
1520
   */
1521
0
  if (recv_type == GNUTLS_HANDSHAKE_CLIENT_HELLO)
1522
0
    session->internals.handshake_hash_buffer_client_hello_len =
1523
0
      session->internals.handshake_hash_buffer.length;
1524
0
  if (recv_type == GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE)
1525
0
    session->internals.handshake_hash_buffer_client_kx_len =
1526
0
      session->internals.handshake_hash_buffer.length;
1527
0
  if (recv_type == GNUTLS_HANDSHAKE_FINISHED &&
1528
0
      session->security_parameters.entity == GNUTLS_CLIENT)
1529
0
    session->internals.handshake_hash_buffer_server_finished_len =
1530
0
      session->internals.handshake_hash_buffer.length;
1531
0
  if (recv_type == GNUTLS_HANDSHAKE_FINISHED &&
1532
0
      session->security_parameters.entity == GNUTLS_SERVER)
1533
0
    session->internals.handshake_hash_buffer_client_finished_len =
1534
0
      session->internals.handshake_hash_buffer.length;
1535
1536
0
  return 0;
1537
0
}
1538
1539
/* This function will store the handshake message we sent.
1540
 */
1541
static int handshake_hash_add_sent(gnutls_session_t session,
1542
           gnutls_handshake_description_t type,
1543
           uint8_t *dataptr, uint32_t datalen)
1544
0
{
1545
0
  int ret;
1546
0
  const version_entry_st *vers = get_version(session);
1547
1548
0
  if (unlikely(vers == NULL))
1549
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
1550
1551
0
  if (IS_ASYNC(type, vers))
1552
0
    return 0;
1553
1554
0
  CHECK_SIZE(datalen);
1555
1556
0
  if (vers->id == GNUTLS_DTLS0_9) {
1557
    /* Old DTLS doesn't include the header in the MAC */
1558
0
    if (datalen < 12) {
1559
0
      gnutls_assert();
1560
0
      return GNUTLS_E_INTERNAL_ERROR;
1561
0
    }
1562
0
    dataptr += 12;
1563
0
    datalen -= 12;
1564
1565
0
    if (datalen == 0)
1566
0
      return 0;
1567
0
  }
1568
1569
0
  ret = _gnutls_buffer_append_data(
1570
0
    &session->internals.handshake_hash_buffer, dataptr, datalen);
1571
0
  if (ret < 0)
1572
0
    return gnutls_assert_val(ret);
1573
1574
0
  if (type == GNUTLS_HANDSHAKE_CLIENT_HELLO)
1575
0
    session->internals.handshake_hash_buffer_client_hello_len =
1576
0
      session->internals.handshake_hash_buffer.length;
1577
0
  if (type == GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE)
1578
0
    session->internals.handshake_hash_buffer_client_kx_len =
1579
0
      session->internals.handshake_hash_buffer.length;
1580
0
  if (type == GNUTLS_HANDSHAKE_FINISHED &&
1581
0
      session->security_parameters.entity == GNUTLS_SERVER)
1582
0
    session->internals.handshake_hash_buffer_server_finished_len =
1583
0
      session->internals.handshake_hash_buffer.length;
1584
0
  if (type == GNUTLS_HANDSHAKE_FINISHED &&
1585
0
      session->security_parameters.entity == GNUTLS_CLIENT)
1586
0
    session->internals.handshake_hash_buffer_client_finished_len =
1587
0
      session->internals.handshake_hash_buffer.length;
1588
1589
0
  return 0;
1590
0
}
1591
1592
/* This function will receive handshake messages of the given types,
1593
 * and will pass the message to the right place in order to be processed.
1594
 * E.g. for the SERVER_HELLO message (if it is expected), it will be
1595
 * passed to _gnutls_recv_hello().
1596
 */
1597
int _gnutls_recv_handshake(gnutls_session_t session,
1598
         gnutls_handshake_description_t type,
1599
         unsigned int optional, gnutls_buffer_st *buf)
1600
0
{
1601
0
  int ret, ret2;
1602
0
  handshake_buffer_st hsk;
1603
1604
0
  ret = _gnutls_handshake_io_recv_int(session, type, &hsk, optional);
1605
0
  if (ret < 0) {
1606
0
    if (optional != 0 &&
1607
0
        ret == GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET) {
1608
0
      if (buf)
1609
0
        _gnutls_buffer_init(buf);
1610
0
      return 0;
1611
0
    }
1612
1613
0
    return gnutls_assert_val_fatal(ret);
1614
0
  }
1615
0
  session->internals.last_handshake_in = hsk.htype;
1616
1617
0
  ret = _gnutls_call_hook_func(session, hsk.htype, GNUTLS_HOOK_PRE, 1,
1618
0
             hsk.data.data, hsk.data.length);
1619
0
  if (ret < 0) {
1620
0
    gnutls_assert();
1621
0
    goto cleanup;
1622
0
  }
1623
1624
0
  ret = handshake_hash_add_recvd(session, hsk.rtype, hsk.header,
1625
0
               hsk.header_size, hsk.data.data,
1626
0
               hsk.data.length);
1627
0
  if (ret < 0) {
1628
0
    gnutls_assert();
1629
0
    goto cleanup;
1630
0
  }
1631
1632
0
  switch (hsk.htype) {
1633
0
  case GNUTLS_HANDSHAKE_CLIENT_HELLO_V2:
1634
0
  case GNUTLS_HANDSHAKE_CLIENT_HELLO:
1635
0
    if (!(IS_SERVER(session))) {
1636
0
      ret = gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET);
1637
0
      goto cleanup;
1638
0
    }
1639
1640
0
#ifdef ENABLE_SSL2
1641
0
    if (hsk.htype == GNUTLS_HANDSHAKE_CLIENT_HELLO_V2)
1642
0
      ret = _gnutls_read_client_hello_v2(
1643
0
        session, hsk.data.data, hsk.data.length);
1644
0
    else
1645
0
#endif
1646
0
    {
1647
      /* Reference the full ClientHello in case an extension needs it */
1648
0
      ret = _gnutls_ext_set_full_client_hello(session, &hsk);
1649
0
      if (ret < 0) {
1650
0
        gnutls_assert();
1651
0
        goto cleanup;
1652
0
      }
1653
1654
0
      ret = read_client_hello(session, hsk.data.data,
1655
0
            hsk.data.length);
1656
0
    }
1657
1658
0
    if (ret < 0) {
1659
0
      gnutls_assert();
1660
0
      goto cleanup;
1661
0
    }
1662
1663
0
    break;
1664
1665
0
  case GNUTLS_HANDSHAKE_SERVER_HELLO:
1666
0
    if (IS_SERVER(session)) {
1667
0
      ret = gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET);
1668
0
      goto cleanup;
1669
0
    }
1670
1671
0
    ret = read_server_hello(session, hsk.data.data,
1672
0
          hsk.data.length);
1673
1674
0
    if (ret < 0) {
1675
0
      gnutls_assert();
1676
0
      goto cleanup;
1677
0
    }
1678
1679
0
    break;
1680
0
  case GNUTLS_HANDSHAKE_HELLO_VERIFY_REQUEST:
1681
0
    if (IS_SERVER(session)) {
1682
0
      ret = gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET);
1683
0
      goto cleanup;
1684
0
    }
1685
1686
0
    ret = recv_hello_verify_request(session, hsk.data.data,
1687
0
            hsk.data.length);
1688
0
    if (ret < 0) {
1689
0
      gnutls_assert();
1690
0
      goto cleanup;
1691
0
    } else {
1692
      /* Signal our caller we have received a verification cookie
1693
         and ClientHello needs to be sent again. */
1694
0
      ret = 1;
1695
0
    }
1696
1697
0
    break;
1698
0
  case GNUTLS_HANDSHAKE_HELLO_RETRY_REQUEST: {
1699
    /* hash buffer synth message is generated during hello retry parsing */
1700
0
    gnutls_datum_t hrr = { hsk.data.data, hsk.data.length };
1701
1702
0
    if (IS_SERVER(session)) {
1703
0
      ret = gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET);
1704
0
      goto cleanup;
1705
0
    }
1706
1707
0
    ret = _gnutls13_recv_hello_retry_request(session, &hsk.data);
1708
0
    if (ret < 0) {
1709
0
      gnutls_assert();
1710
0
      goto cleanup;
1711
0
    } else {
1712
      /* during hello retry parsing, we reset handshake hash buffer,
1713
         * re-add this message */
1714
0
      ret = handshake_hash_add_recvd(session, hsk.htype,
1715
0
                   hsk.header,
1716
0
                   hsk.header_size,
1717
0
                   hrr.data, hrr.size);
1718
0
      if (ret < 0) {
1719
0
        gnutls_assert();
1720
0
        goto cleanup;
1721
0
      }
1722
1723
      /* Signal our caller we have received a retry request
1724
           and ClientHello needs to be sent again. */
1725
0
      ret = 1;
1726
0
    }
1727
1728
0
    break;
1729
0
  }
1730
0
  case GNUTLS_HANDSHAKE_SERVER_HELLO_DONE:
1731
0
    if (hsk.data.length == 0)
1732
0
      ret = 0;
1733
0
    else {
1734
0
      gnutls_assert();
1735
0
      ret = GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
1736
0
      goto cleanup;
1737
0
    }
1738
0
    break;
1739
0
  case GNUTLS_HANDSHAKE_CERTIFICATE_PKT:
1740
0
  case GNUTLS_HANDSHAKE_COMPRESSED_CERTIFICATE_PKT:
1741
0
  case GNUTLS_HANDSHAKE_CERTIFICATE_STATUS:
1742
0
  case GNUTLS_HANDSHAKE_FINISHED:
1743
0
  case GNUTLS_HANDSHAKE_ENCRYPTED_EXTENSIONS:
1744
0
  case GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE:
1745
0
  case GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE:
1746
0
  case GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST:
1747
0
  case GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY:
1748
0
  case GNUTLS_HANDSHAKE_SUPPLEMENTAL:
1749
0
  case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET:
1750
0
  case GNUTLS_HANDSHAKE_END_OF_EARLY_DATA:
1751
0
    ret = hsk.data.length;
1752
0
    break;
1753
0
  default:
1754
0
    gnutls_assert();
1755
    /* we shouldn't actually arrive here in any case .
1756
     * unexpected messages should be caught after _gnutls_handshake_io_recv_int()
1757
     */
1758
0
    ret = GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET;
1759
0
    goto cleanup;
1760
0
  }
1761
1762
0
  ret2 = _gnutls_call_hook_func(session, hsk.htype, GNUTLS_HOOK_POST, 1,
1763
0
              hsk.data.data, hsk.data.length);
1764
0
  if (ret2 < 0) {
1765
0
    ret = ret2;
1766
0
    gnutls_assert();
1767
0
    goto cleanup;
1768
0
  }
1769
1770
0
  if (buf) {
1771
0
    *buf = hsk.data;
1772
0
    return ret;
1773
0
  }
1774
1775
0
cleanup:
1776
0
  _gnutls_handshake_buffer_clear(&hsk);
1777
0
  return ret;
1778
0
}
1779
1780
/* This function checks if the given cipher suite is supported, and sets it
1781
 * to the session;
1782
 */
1783
static int set_client_ciphersuite(gnutls_session_t session, uint8_t suite[2])
1784
0
{
1785
0
  unsigned j;
1786
0
  int ret;
1787
0
  const gnutls_cipher_suite_entry_st *selected = NULL;
1788
0
  const version_entry_st *vers = get_version(session);
1789
0
  gnutls_kx_algorithm_t kx;
1790
1791
0
  for (j = 0; j < session->internals.priorities->cs.size; j++) {
1792
0
    if (suite[0] ==
1793
0
          session->internals.priorities->cs.entry[j]->id[0] &&
1794
0
        suite[1] ==
1795
0
          session->internals.priorities->cs.entry[j]->id[1]) {
1796
0
      selected = session->internals.priorities->cs.entry[j];
1797
0
      break;
1798
0
    }
1799
0
  }
1800
1801
0
  if (!selected) {
1802
0
    gnutls_assert();
1803
0
    _gnutls_handshake_log(
1804
0
      "HSK[%p]: unsupported cipher suite %.2X.%.2X was negotiated\n",
1805
0
      session, (unsigned int)suite[0],
1806
0
      (unsigned int)suite[1]);
1807
0
    return GNUTLS_E_UNKNOWN_CIPHER_SUITE;
1808
0
  }
1809
1810
0
  ret = _gnutls_set_cipher_suite2(session, selected);
1811
0
  if (ret < 0)
1812
0
    return gnutls_assert_val(ret);
1813
1814
0
  _gnutls_handshake_log("HSK[%p]: Selected cipher suite: %s\n", session,
1815
0
            selected->name);
1816
1817
  /* check if the credentials (username, public key etc.) are ok.
1818
   * Actually checks if they exist.
1819
   */
1820
0
  if (!vers->tls13_sem) {
1821
0
    kx = selected->kx_algorithm;
1822
1823
0
    if (!session->internals.premaster_set &&
1824
0
        _gnutls_get_kx_cred(session, kx) == NULL) {
1825
0
      gnutls_assert();
1826
0
      return GNUTLS_E_INSUFFICIENT_CREDENTIALS;
1827
0
    }
1828
1829
    /* set the mod_auth_st to the appropriate struct
1830
     * according to the KX algorithm. This is needed since all the
1831
     * handshake functions are read from there;
1832
     */
1833
0
    session->internals.auth_struct = _gnutls_kx_auth_struct(kx);
1834
1835
0
    if (session->internals.auth_struct == NULL) {
1836
0
      _gnutls_handshake_log(
1837
0
        "HSK[%p]: Cannot find the appropriate handler for the KX algorithm\n",
1838
0
        session);
1839
0
      gnutls_assert();
1840
0
      return GNUTLS_E_INTERNAL_ERROR;
1841
0
    }
1842
0
  } else {
1843
0
    if (session->internals.hsk_flags & HSK_PSK_SELECTED) {
1844
0
      if (session->key.binders[0].prf->id != selected->prf) {
1845
0
        _gnutls_handshake_log(
1846
0
          "HSK[%p]: PRF of ciphersuite differs with the PSK identity (cs: %s, id: %s)\n",
1847
0
          session, selected->name,
1848
0
          session->key.binders[0].prf->name);
1849
0
        gnutls_assert();
1850
0
        return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
1851
0
      }
1852
0
    }
1853
0
  }
1854
1855
0
  return 0;
1856
0
}
1857
1858
/* This function returns 0 if we are resuming a session or -1 otherwise.
1859
 * This also sets the variables in the session. Used only while reading a server
1860
 * hello. Only applicable to TLS1.2 or earlier.
1861
 */
1862
static int client_check_if_resuming(gnutls_session_t session,
1863
            uint8_t *session_id, int session_id_len)
1864
0
{
1865
0
  char buf[2 * GNUTLS_MAX_SESSION_ID_SIZE + 1];
1866
0
  int ret;
1867
1868
0
  _gnutls_handshake_log("HSK[%p]: SessionID length: %d\n", session,
1869
0
            session_id_len);
1870
0
  _gnutls_handshake_log("HSK[%p]: SessionID: %s\n", session,
1871
0
            _gnutls_bin2hex(session_id, session_id_len, buf,
1872
0
                sizeof(buf), NULL));
1873
1874
0
  if ((session->internals.resumption_requested != 0 ||
1875
0
       session->internals.premaster_set != 0) &&
1876
0
      session_id_len > 0 &&
1877
0
      session->internals.resumed_security_parameters.session_id_size ==
1878
0
        session_id_len &&
1879
0
      memcmp(session_id,
1880
0
       session->internals.resumed_security_parameters.session_id,
1881
0
       session_id_len) == 0) {
1882
    /* resume session */
1883
0
    memcpy(session->internals.resumed_security_parameters
1884
0
             .server_random,
1885
0
           session->security_parameters.server_random,
1886
0
           GNUTLS_RANDOM_SIZE);
1887
0
    memcpy(session->internals.resumed_security_parameters
1888
0
             .client_random,
1889
0
           session->security_parameters.client_random,
1890
0
           GNUTLS_RANDOM_SIZE);
1891
1892
0
    ret = _gnutls_set_cipher_suite2(
1893
0
      session,
1894
0
      session->internals.resumed_security_parameters.cs);
1895
0
    if (ret < 0) {
1896
0
      gnutls_assert();
1897
0
      goto no_resume;
1898
0
    }
1899
1900
0
    session->internals.resumed = true; /* we are resuming */
1901
1902
0
    return 0;
1903
0
  } else {
1904
0
  no_resume:
1905
    /* keep the new session id */
1906
0
    session->internals.resumed = false; /* we are not resuming */
1907
0
    return -1;
1908
0
  }
1909
0
}
1910
1911
/* This function reads and parses the server hello handshake message.
1912
 * This function also restores resumed parameters if we are resuming a
1913
 * session.
1914
 */
1915
static int read_server_hello(gnutls_session_t session, uint8_t *data,
1916
           int datalen)
1917
0
{
1918
0
  uint8_t session_id_len = 0;
1919
0
  uint8_t *session_id;
1920
0
  uint8_t *cs_pos, *comp_pos, *srandom_pos;
1921
0
  uint8_t major, minor;
1922
0
  int pos = 0;
1923
0
  int ret;
1924
0
  int len = datalen;
1925
0
  unsigned ext_parse_flag = 0;
1926
0
  const version_entry_st *vers, *saved_vers;
1927
1928
0
  if (datalen < GNUTLS_RANDOM_SIZE + 2) {
1929
0
    gnutls_assert();
1930
0
    return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
1931
0
  }
1932
1933
0
  _gnutls_handshake_log("HSK[%p]: Server's version: %d.%d\n", session,
1934
0
            data[pos], data[pos + 1]);
1935
1936
0
  DECR_LEN(len, 2);
1937
0
  major = data[pos];
1938
0
  minor = data[pos + 1];
1939
1940
0
  saved_vers = get_version(
1941
0
    session); /* will be non-null if HRR has been received */
1942
1943
0
  vers = nversion_to_entry(major, minor);
1944
0
  if (unlikely(vers == NULL))
1945
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
1946
1947
0
  if (vers->tls13_sem) /* that shouldn't have been negotiated here */
1948
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
1949
1950
0
  if (_gnutls_set_current_version(session, vers->id) < 0)
1951
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
1952
1953
0
  pos += 2;
1954
1955
0
  DECR_LEN(len, GNUTLS_RANDOM_SIZE);
1956
0
  srandom_pos = &data[pos];
1957
0
  pos += GNUTLS_RANDOM_SIZE;
1958
1959
  /* Read session ID
1960
   */
1961
0
  DECR_LEN(len, 1);
1962
0
  session_id_len = data[pos++];
1963
1964
0
  if (len < session_id_len ||
1965
0
      session_id_len > GNUTLS_MAX_SESSION_ID_SIZE) {
1966
0
    gnutls_assert();
1967
0
    return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
1968
0
  }
1969
0
  DECR_LEN(len, session_id_len);
1970
0
  session_id = &data[pos];
1971
0
  pos += session_id_len;
1972
1973
0
  DECR_LEN(len, 2);
1974
0
  cs_pos = &data[pos];
1975
0
  pos += 2;
1976
1977
  /* move to compression
1978
   */
1979
0
  DECR_LEN(len, 1);
1980
0
  comp_pos = &data[pos];
1981
0
  pos++;
1982
1983
  /* parse extensions to figure version */
1984
0
  ret = _gnutls_parse_hello_extensions(
1985
0
    session,
1986
0
    GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO |
1987
0
      GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO,
1988
0
    GNUTLS_EXT_VERSION_NEG, &data[pos], len);
1989
0
  if (ret < 0)
1990
0
    return gnutls_assert_val(ret);
1991
1992
0
  vers = get_version(session);
1993
0
  if (unlikely(vers == NULL))
1994
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
1995
0
  if (vers->tls13_sem) {
1996
0
    if (major != 0x03 || minor != 0x03)
1997
0
      return gnutls_assert_val(
1998
0
        GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
1999
0
  }
2000
2001
0
  if (_gnutls_nversion_is_supported(session, vers->major, vers->minor) ==
2002
0
      0)
2003
0
    return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
2004
2005
  /* set server random - done after final version is selected */
2006
0
  ret = _gnutls_set_server_random(session, vers, srandom_pos);
2007
0
  if (ret < 0)
2008
0
    return gnutls_assert_val(ret);
2009
2010
  /* reset keys and binders if we are not using TLS 1.3 */
2011
0
  if (!vers->tls13_sem) {
2012
0
    gnutls_memset(&session->key.proto.tls13, 0,
2013
0
            sizeof(session->key.proto.tls13));
2014
0
    reset_binders(session);
2015
0
  }
2016
2017
  /* check if we are resuming and set the appropriate
2018
   * values;
2019
   */
2020
0
  if (!vers->tls13_sem && client_check_if_resuming(session, session_id,
2021
0
               session_id_len) == 0) {
2022
0
    ret = _gnutls_parse_hello_extensions(
2023
0
      session, GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
2024
0
      GNUTLS_EXT_MANDATORY, &data[pos], len);
2025
0
    if (ret < 0)
2026
0
      return gnutls_assert_val(ret);
2027
2028
0
    return 0;
2029
0
  } else {
2030
0
    session->security_parameters.session_id_size = session_id_len;
2031
0
    if (session_id_len > 0)
2032
0
      memcpy(session->security_parameters.session_id,
2033
0
             session_id, session_id_len);
2034
0
  }
2035
2036
  /* Check if the given cipher suite is supported and copy
2037
   * it to the session.
2038
   */
2039
0
  ret = set_client_ciphersuite(session, cs_pos);
2040
0
  if (ret < 0) {
2041
0
    gnutls_assert();
2042
0
    return ret;
2043
0
  }
2044
2045
0
  if (session->internals.hsk_flags & HSK_HRR_RECEIVED) {
2046
    /* check if ciphersuite matches */
2047
0
    if (memcmp(cs_pos, session->internals.hrr_cs, 2) != 0)
2048
0
      return gnutls_assert_val(
2049
0
        GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER);
2050
2051
    /* check if HRR version matches this version */
2052
0
    if (vers != saved_vers)
2053
0
      return gnutls_assert_val(
2054
0
        GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER);
2055
0
  }
2056
2057
0
  if (*comp_pos != 0)
2058
0
    return gnutls_assert_val(GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER);
2059
2060
0
  if (vers->tls13_sem)
2061
0
    ext_parse_flag |= GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO;
2062
0
  else
2063
0
    ext_parse_flag |= GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO;
2064
2065
  /* Parse extensions in order.
2066
   */
2067
0
  ret = _gnutls_parse_hello_extensions(
2068
0
    session, ext_parse_flag, GNUTLS_EXT_MANDATORY, &data[pos], len);
2069
0
  if (ret < 0)
2070
0
    return gnutls_assert_val(ret);
2071
2072
0
  if (!vers->tls13_sem) {
2073
    /* check if EtM is required */
2074
0
    if (session->internals.priorities->force_etm &&
2075
0
        !session->security_parameters.etm) {
2076
0
      const cipher_entry_st *cipher =
2077
0
        cipher_to_entry(session->security_parameters.cs
2078
0
              ->block_algorithm);
2079
0
      if (_gnutls_cipher_type(cipher) == CIPHER_BLOCK)
2080
0
        return gnutls_assert_val(
2081
0
          GNUTLS_E_UNWANTED_ALGORITHM);
2082
0
    }
2083
2084
    /* check if EMS is required */
2085
0
    if (vers->id != GNUTLS_SSL3 && vers->id != GNUTLS_DTLS0_9 &&
2086
0
        session->internals.priorities->force_ext_master_secret ==
2087
0
          EMS_REQUIRE &&
2088
0
        !session->security_parameters.ext_master_secret) {
2089
0
      return gnutls_assert_val(
2090
0
        GNUTLS_E_INSUFFICIENT_SECURITY);
2091
0
    }
2092
0
  }
2093
2094
0
  ret = _gnutls_parse_hello_extensions(session, ext_parse_flag,
2095
0
               GNUTLS_EXT_APPLICATION, &data[pos],
2096
0
               len);
2097
0
  if (ret < 0)
2098
0
    return gnutls_assert_val(ret);
2099
2100
0
  ret = _gnutls_parse_hello_extensions(session, ext_parse_flag,
2101
0
               GNUTLS_EXT_TLS, &data[pos], len);
2102
0
  if (ret < 0)
2103
0
    return gnutls_assert_val(ret);
2104
2105
0
  ret = _gnutls_parse_hello_extensions(session, ext_parse_flag,
2106
0
               _GNUTLS_EXT_TLS_POST_CS,
2107
0
               &data[pos], len);
2108
0
  if (ret < 0)
2109
0
    return gnutls_assert_val(ret);
2110
2111
  /* Calculate TLS 1.3 Early Secret */
2112
0
  if (vers->tls13_sem &&
2113
0
      !(session->internals.hsk_flags & HSK_PSK_SELECTED)) {
2114
0
    ret = _tls13_init_secret(session, NULL, 0);
2115
0
    if (ret < 0)
2116
0
      return gnutls_assert_val(ret);
2117
0
  }
2118
2119
0
  ret = set_auth_types(session);
2120
0
  if (ret < 0)
2121
0
    return gnutls_assert_val(ret);
2122
2123
0
  session->internals.hsk_flags |= HSK_SERVER_HELLO_RECEIVED;
2124
2125
0
  return 0;
2126
0
}
2127
2128
/* This function copies the appropriate compression methods, to a locally allocated buffer
2129
 * Needed in hello messages. Returns the new data length.
2130
 */
2131
static int append_null_comp(gnutls_session_t session, gnutls_buffer_st *cdata)
2132
0
{
2133
0
  uint8_t compression_methods[2] = { 0x01, 0x00 };
2134
0
  size_t init_length = cdata->length;
2135
0
  int ret;
2136
2137
0
  ret = _gnutls_buffer_append_data(cdata, compression_methods, 2);
2138
0
  if (ret < 0)
2139
0
    return gnutls_assert_val(ret);
2140
2141
0
  ret = cdata->length - init_length;
2142
2143
0
  return ret;
2144
0
}
2145
2146
/* This function sends the client hello handshake message.
2147
 */
2148
static int send_client_hello(gnutls_session_t session, int again)
2149
0
{
2150
0
  mbuffer_st *bufel = NULL;
2151
0
  int type;
2152
0
  int ret = 0;
2153
0
  const version_entry_st *hver, *min_ver, *max_ver;
2154
0
  uint8_t tver[2];
2155
0
  gnutls_buffer_st extdata;
2156
0
  bool rehandshake = false;
2157
0
  bool resuming = false;
2158
0
  unsigned add_sr_scsv = 0;
2159
0
  uint8_t *session_id =
2160
0
    session->internals.resumed_security_parameters.session_id;
2161
0
  uint8_t session_id_len =
2162
0
    session->internals.resumed_security_parameters.session_id_size;
2163
2164
0
  if (again == 0) {
2165
    /* note that rehandshake is different than resuming
2166
     */
2167
0
    if (session->internals.initial_negotiation_completed)
2168
0
      rehandshake = true;
2169
2170
0
    ret = _gnutls_buffer_init_handshake_mbuffer(&extdata);
2171
0
    if (ret < 0)
2172
0
      return gnutls_assert_val(ret);
2173
2174
    /* if we are resuming a session then we set the
2175
     * version number to the previously established.
2176
     */
2177
0
    if (session->internals.resumption_requested == 0 &&
2178
0
        session->internals.premaster_set == 0) {
2179
0
      if (rehandshake) /* already negotiated version thus version_max == negotiated version */
2180
0
        hver = get_version(session);
2181
0
      else /* new handshake. just get the max */
2182
0
        hver = _gnutls_legacy_version_max(session);
2183
0
    } else {
2184
      /* we are resuming a session */
2185
0
      resuming = true;
2186
2187
0
      hver = session->internals.resumed_security_parameters
2188
0
               .pversion;
2189
2190
0
      if (hver && hver->tls13_sem)
2191
0
        hver = _gnutls_legacy_version_max(session);
2192
0
    }
2193
2194
0
    if (hver == NULL) {
2195
0
      gnutls_assert();
2196
0
      if (session->internals.flags & INT_FLAG_NO_TLS13)
2197
0
        ret = GNUTLS_E_INSUFFICIENT_CREDENTIALS;
2198
0
      else
2199
0
        ret = GNUTLS_E_NO_PRIORITIES_WERE_SET;
2200
0
      goto cleanup;
2201
0
    }
2202
2203
0
    if (unlikely(session->internals.default_hello_version[0] !=
2204
0
           0)) {
2205
0
      tver[0] = session->internals.default_hello_version[0];
2206
0
      tver[1] = session->internals.default_hello_version[1];
2207
0
    } else {
2208
0
      tver[0] = hver->major;
2209
0
      tver[1] = hver->minor;
2210
0
    }
2211
0
    ret = _gnutls_buffer_append_data(&extdata, tver, 2);
2212
0
    if (ret < 0) {
2213
0
      gnutls_assert();
2214
0
      goto cleanup;
2215
0
    }
2216
0
    _gnutls_handshake_log("HSK[%p]: Adv. version: %u.%u\n", session,
2217
0
              (unsigned)tver[0], (unsigned)tver[1]);
2218
2219
0
    min_ver = _gnutls_version_lowest(session);
2220
0
    max_ver = _gnutls_version_max(session);
2221
0
    if (min_ver == NULL || max_ver == NULL) {
2222
0
      gnutls_assert();
2223
0
      ret = GNUTLS_E_NO_PRIORITIES_WERE_SET;
2224
0
      goto cleanup;
2225
0
    }
2226
2227
    /* if we are replying to an HRR the version is already negotiated */
2228
0
    if (!(session->internals.hsk_flags & HSK_HRR_RECEIVED) ||
2229
0
        !get_version(session)) {
2230
      /* Set the version we advertised as maximum
2231
       * (RSA uses it). */
2232
0
      set_adv_version(session, hver->major, hver->minor);
2233
0
      if (_gnutls_set_current_version(session, hver->id) <
2234
0
          0) {
2235
0
        ret = gnutls_assert_val(
2236
0
          GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
2237
0
        goto cleanup;
2238
0
      }
2239
0
    }
2240
2241
0
    if (session->internals.priorities->min_record_version != 0) {
2242
      /* Advertise the lowest supported (SSL 3.0) record packet
2243
       * version in record packets during the handshake.
2244
       * That is to avoid confusing implementations
2245
       * that do not support TLS 1.2 and don't know
2246
       * how 3,3 version of record packets look like.
2247
       */
2248
0
      set_default_version(session, min_ver);
2249
0
    } else {
2250
0
      set_default_version(session, hver);
2251
0
    }
2252
2253
    /* In order to know when this session was initiated.
2254
     */
2255
0
    session->security_parameters.timestamp = gnutls_time(NULL);
2256
2257
    /* Generate random data
2258
     */
2259
0
    if (!(session->internals.hsk_flags & HSK_HRR_RECEIVED) &&
2260
0
        !(IS_DTLS(session) &&
2261
0
          session->internals.dtls.hsk_hello_verify_requests != 0)) {
2262
0
      ret = _gnutls_gen_client_random(session);
2263
0
      if (ret < 0) {
2264
0
        gnutls_assert();
2265
0
        goto cleanup;
2266
0
      }
2267
0
    }
2268
2269
0
    ret = _gnutls_buffer_append_data(
2270
0
      &extdata, session->security_parameters.client_random,
2271
0
      GNUTLS_RANDOM_SIZE);
2272
0
    if (ret < 0) {
2273
0
      gnutls_assert();
2274
0
      goto cleanup;
2275
0
    }
2276
2277
0
#ifdef TLS13_APPENDIX_D4
2278
0
    if (max_ver->tls13_sem &&
2279
0
        session->internals.priorities->tls13_compat_mode &&
2280
0
        !resuming) {
2281
0
      if (!(session->internals.hsk_flags &
2282
0
            HSK_HRR_RECEIVED)) {
2283
        /* Under TLS1.3 we generate a random session ID to make
2284
         * the TLS1.3 session look like a resumed TLS1.2 session */
2285
0
        ret = _gnutls_generate_session_id(
2286
0
          session->security_parameters.session_id,
2287
0
          &session->security_parameters
2288
0
             .session_id_size);
2289
0
        if (ret < 0) {
2290
0
          gnutls_assert();
2291
0
          goto cleanup;
2292
0
        }
2293
0
      }
2294
0
      session_id = session->security_parameters.session_id;
2295
0
      session_id_len =
2296
0
        session->security_parameters.session_id_size;
2297
0
    }
2298
0
#endif
2299
2300
    /* Copy the Session ID - if any
2301
     */
2302
0
    ret = _gnutls_buffer_append_data_prefix(&extdata, 8, session_id,
2303
0
              session_id_len);
2304
0
    if (ret < 0) {
2305
0
      gnutls_assert();
2306
0
      goto cleanup;
2307
0
    }
2308
2309
    /* Copy the DTLS cookie
2310
     */
2311
0
    if (IS_DTLS(session)) {
2312
0
      ret = _gnutls_buffer_append_data_prefix(
2313
0
        &extdata, 8,
2314
0
        session->internals.dtls.dcookie.data,
2315
0
        session->internals.dtls.dcookie.size);
2316
0
      if (ret < 0) {
2317
0
        gnutls_assert();
2318
0
        goto cleanup;
2319
0
      }
2320
0
      _gnutls_free_datum(&session->internals.dtls.dcookie);
2321
0
    }
2322
2323
    /* Copy the ciphersuites.
2324
     */
2325
#ifdef ENABLE_SSL3
2326
    /* If using SSLv3 Send TLS_RENEGO_PROTECTION_REQUEST SCSV for MITM
2327
     * prevention on initial negotiation (but not renegotiation; that's
2328
     * handled with the RI extension below).
2329
     */
2330
    if (!session->internals.initial_negotiation_completed &&
2331
        session->security_parameters.entity == GNUTLS_CLIENT &&
2332
        (hver->id == GNUTLS_SSL3 &&
2333
         session->internals.priorities->no_extensions != 0)) {
2334
      add_sr_scsv = 1;
2335
    }
2336
#endif
2337
0
    ret = _gnutls_get_client_ciphersuites(session, &extdata,
2338
0
                  min_ver, add_sr_scsv);
2339
0
    if (ret < 0) {
2340
0
      gnutls_assert();
2341
0
      goto cleanup;
2342
0
    }
2343
2344
    /* Copy the compression methods.
2345
     */
2346
0
    ret = append_null_comp(session, &extdata);
2347
0
    if (ret < 0) {
2348
0
      gnutls_assert();
2349
0
      goto cleanup;
2350
0
    }
2351
2352
    /* Generate and copy TLS extensions.
2353
     */
2354
0
    if (session->internals.priorities->no_extensions == 0) {
2355
0
      if (_gnutls_version_has_extensions(hver)) {
2356
0
        type = GNUTLS_EXT_ANY;
2357
0
      } else {
2358
0
        type = GNUTLS_EXT_MANDATORY;
2359
0
      }
2360
2361
0
      ret = _gnutls_gen_hello_extensions(
2362
0
        session, &extdata, GNUTLS_EXT_FLAG_CLIENT_HELLO,
2363
0
        type);
2364
0
      if (ret < 0) {
2365
0
        gnutls_assert();
2366
0
        goto cleanup;
2367
0
      }
2368
0
    }
2369
2370
0
    bufel = _gnutls_buffer_to_mbuffer(&extdata);
2371
0
  }
2372
2373
0
  ret = _gnutls_send_handshake(session, bufel,
2374
0
             GNUTLS_HANDSHAKE_CLIENT_HELLO);
2375
2376
0
  if (session->internals.hsk_flags & HSK_EARLY_DATA_IN_FLIGHT) {
2377
0
    const cipher_entry_st *ce;
2378
0
    const mac_entry_st *me;
2379
0
    record_parameters_st *params;
2380
2381
0
    ce = cipher_to_entry(
2382
0
      session->internals.resumed_security_parameters.cs
2383
0
        ->block_algorithm);
2384
0
    me = mac_to_entry(session->internals.resumed_security_parameters
2385
0
            .cs->mac_algorithm);
2386
2387
0
    ret = _gnutls_epoch_get(session, EPOCH_NEXT, &params);
2388
0
    if (ret < 0) {
2389
0
      return gnutls_assert_val(ret);
2390
0
    }
2391
2392
0
    params->cipher = ce;
2393
0
    params->mac = me;
2394
2395
0
    ret = _tls13_write_connection_state_init(session, STAGE_EARLY);
2396
0
    if (ret < 0) {
2397
0
      return gnutls_assert_val(ret);
2398
0
    }
2399
2400
0
    _gnutls_epoch_bump(session);
2401
0
    ret = _gnutls_epoch_dup(session, EPOCH_WRITE_CURRENT);
2402
0
    if (ret < 0) {
2403
0
      return gnutls_assert_val(ret);
2404
0
    }
2405
2406
0
    ret = _gnutls13_send_early_data(session);
2407
0
    if (ret < 0) {
2408
0
      return gnutls_assert_val(ret);
2409
0
    }
2410
0
  }
2411
2412
0
  return ret;
2413
2414
0
cleanup:
2415
0
  _gnutls_buffer_clear(&extdata);
2416
0
  return ret;
2417
0
}
2418
2419
int _gnutls_send_server_hello(gnutls_session_t session, int again)
2420
0
{
2421
0
  mbuffer_st *bufel = NULL;
2422
0
  gnutls_buffer_st buf;
2423
0
  int ret;
2424
0
  uint8_t session_id_len = session->security_parameters.session_id_size;
2425
0
  char tmpbuf[2 * GNUTLS_MAX_SESSION_ID_SIZE + 1];
2426
0
  const version_entry_st *vers;
2427
0
  uint8_t vbytes[2];
2428
0
  unsigned extflag = 0;
2429
0
  gnutls_ext_parse_type_t etype;
2430
2431
0
  _gnutls_buffer_init(&buf);
2432
2433
0
  if (again == 0) {
2434
0
    vers = get_version(session);
2435
0
    if (unlikely(vers == NULL ||
2436
0
           session->security_parameters.cs == NULL))
2437
0
      return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
2438
2439
0
    if (vers->tls13_sem) {
2440
0
      vbytes[0] = 0x03; /* TLS1.2 */
2441
0
      vbytes[1] = 0x03;
2442
0
      extflag |= GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO;
2443
0
    } else {
2444
0
      vbytes[0] = vers->major;
2445
0
      vbytes[1] = vers->minor;
2446
0
      extflag |= GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO;
2447
0
    }
2448
2449
0
    ret = _gnutls_buffer_init_handshake_mbuffer(&buf);
2450
0
    if (ret < 0) {
2451
0
      gnutls_assert();
2452
0
      goto fail;
2453
0
    }
2454
2455
0
    ret = _gnutls_buffer_append_data(&buf, vbytes, 2);
2456
0
    if (ret < 0) {
2457
0
      gnutls_assert();
2458
0
      goto fail;
2459
0
    }
2460
2461
0
    ret = _gnutls_buffer_append_data(
2462
0
      &buf, session->security_parameters.server_random,
2463
0
      GNUTLS_RANDOM_SIZE);
2464
0
    if (ret < 0) {
2465
0
      gnutls_assert();
2466
0
      goto fail;
2467
0
    }
2468
2469
0
    ret = _gnutls_buffer_append_data_prefix(
2470
0
      &buf, 8, session->security_parameters.session_id,
2471
0
      session_id_len);
2472
0
    if (ret < 0) {
2473
0
      gnutls_assert();
2474
0
      goto fail;
2475
0
    }
2476
2477
0
    _gnutls_handshake_log(
2478
0
      "HSK[%p]: SessionID: %s\n", session,
2479
0
      _gnutls_bin2hex(session->security_parameters.session_id,
2480
0
          session_id_len, tmpbuf, sizeof(tmpbuf),
2481
0
          NULL));
2482
2483
0
    ret = _gnutls_buffer_append_data(
2484
0
      &buf, session->security_parameters.cs->id, 2);
2485
0
    if (ret < 0) {
2486
0
      gnutls_assert();
2487
0
      goto fail;
2488
0
    }
2489
2490
    /* compression */
2491
0
    ret = _gnutls_buffer_append_prefix(&buf, 8, 0);
2492
0
    if (ret < 0) {
2493
0
      gnutls_assert();
2494
0
      goto fail;
2495
0
    }
2496
2497
0
    if (!vers->tls13_sem && session->internals.resumed)
2498
0
      etype = GNUTLS_EXT_MANDATORY;
2499
0
    else
2500
0
      etype = GNUTLS_EXT_ANY;
2501
0
    ret = _gnutls_gen_hello_extensions(session, &buf, extflag,
2502
0
               etype);
2503
0
    if (ret < 0) {
2504
0
      gnutls_assert();
2505
0
      goto fail;
2506
0
    }
2507
2508
0
    if (vers->tls13_sem) {
2509
      /* Under TLS1.3, the session ID is used for different purposes than
2510
       * the TLS1.0 session ID. Ensure that there is an internally set
2511
       * value which the server will see on the original and resumed sessions */
2512
0
      ret = _gnutls_generate_session_id(
2513
0
        session->security_parameters.session_id,
2514
0
        &session->security_parameters.session_id_size);
2515
0
      if (ret < 0) {
2516
0
        gnutls_assert();
2517
0
        goto fail;
2518
0
      }
2519
0
    }
2520
2521
0
    bufel = _gnutls_buffer_to_mbuffer(&buf);
2522
0
  }
2523
2524
0
  ret = _gnutls_send_handshake(session, bufel,
2525
0
             GNUTLS_HANDSHAKE_SERVER_HELLO);
2526
2527
0
fail:
2528
0
  _gnutls_buffer_clear(&buf);
2529
0
  return ret;
2530
0
}
2531
2532
static int recv_hello_verify_request(gnutls_session_t session, uint8_t *data,
2533
             int datalen)
2534
0
{
2535
0
  ssize_t len = datalen;
2536
0
  size_t pos = 0;
2537
0
  uint8_t cookie_len;
2538
0
  unsigned int nb_verifs;
2539
0
  int ret;
2540
2541
0
  if (!IS_DTLS(session)) {
2542
0
    gnutls_assert();
2543
0
    return GNUTLS_E_UNEXPECTED_PACKET;
2544
0
  }
2545
2546
0
  nb_verifs = ++session->internals.dtls.hsk_hello_verify_requests;
2547
0
  if (nb_verifs >= MAX_HANDSHAKE_HELLO_VERIFY_REQUESTS) {
2548
    /* The server is either buggy, malicious or changing cookie
2549
       secrets _way_ too fast. */
2550
0
    gnutls_assert();
2551
0
    return GNUTLS_E_UNEXPECTED_PACKET;
2552
0
  }
2553
2554
0
  DECR_LEN(len, 2);
2555
0
  pos += 2;
2556
2557
0
  DECR_LEN(len, 1);
2558
0
  cookie_len = data[pos];
2559
0
  pos++;
2560
2561
0
  if (cookie_len > DTLS_MAX_COOKIE_SIZE) {
2562
0
    gnutls_assert();
2563
0
    return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
2564
0
  }
2565
2566
0
  DECR_LEN(len, cookie_len);
2567
2568
0
  gnutls_free(session->internals.dtls.dcookie.data);
2569
0
  ret = _gnutls_set_datum(&session->internals.dtls.dcookie, &data[pos],
2570
0
        cookie_len);
2571
0
  if (ret < 0)
2572
0
    return gnutls_assert_val(ret);
2573
2574
0
  if (len != 0) {
2575
0
    gnutls_assert();
2576
0
    return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
2577
0
  }
2578
2579
  /* reset handshake hash buffers */
2580
0
  handshake_hash_buffer_reset(session);
2581
  /* reset extensions used in previous hello */
2582
0
  session->internals.used_exts = 0;
2583
2584
0
  return 0;
2585
0
}
2586
2587
/* The packets in gnutls_handshake (it's more broad than original TLS handshake)
2588
 *
2589
 *     Client                Server
2590
 *
2591
 *     ClientHello      -------->
2592
 *          <--------  ServerHello
2593
 *
2594
 *                Certificate*
2595
 *                ServerKeyExchange*
2596
 *          <--------   CertificateRequest*
2597
 *
2598
 *          <--------      ServerHelloDone
2599
 *     Certificate*
2600
 *     ClientKeyExchange
2601
 *     CertificateVerify*
2602
 *     [ChangeCipherSpec]
2603
 *     Finished        -------->
2604
 *            NewSessionTicket
2605
 *                [ChangeCipherSpec]
2606
 *          <--------      Finished
2607
 *
2608
 * (*): means optional packet.
2609
 */
2610
2611
/* Handshake when resumming session:
2612
 *      Client            Server
2613
 *
2614
 *      ClientHello      -------->
2615
 *                  ServerHello
2616
 *                 [ChangeCipherSpec]
2617
 *           <--------       Finished
2618
 *     [ChangeCipherSpec]
2619
 *     Finished         -------->
2620
 *
2621
 */
2622
2623
/**
2624
 * gnutls_rehandshake:
2625
 * @session: is a #gnutls_session_t type.
2626
 *
2627
 * This function can only be called in server side, and
2628
 * instructs a TLS 1.2 or earlier client to renegotiate
2629
 * parameters (perform a handshake), by sending a
2630
 * hello request message.
2631
 *
2632
 * If this function succeeds, the calling application
2633
 * should call gnutls_record_recv() until %GNUTLS_E_REHANDSHAKE
2634
 * is returned to clear any pending data. If the %GNUTLS_E_REHANDSHAKE
2635
 * error code is not seen, then the handshake request was
2636
 * not followed by the peer (the TLS protocol does not require
2637
 * the client to do, and such compliance should be handled
2638
 * by the application protocol).
2639
 *
2640
 * Once the %GNUTLS_E_REHANDSHAKE error code is seen, the
2641
 * calling application should proceed to calling
2642
 * gnutls_handshake() to negotiate the new
2643
 * parameters.
2644
 *
2645
 * If the client does not wish to renegotiate parameters he
2646
 * may reply with an alert message, and in that case the return code seen
2647
 * by subsequent gnutls_record_recv() will be
2648
 * %GNUTLS_E_WARNING_ALERT_RECEIVED with the specific alert being
2649
 * %GNUTLS_A_NO_RENEGOTIATION.  A client may also choose to ignore
2650
 * this request.
2651
 *
2652
 * Under TLS 1.3 this function is equivalent to gnutls_session_key_update()
2653
 * with the %GNUTLS_KU_PEER flag. In that case subsequent calls to
2654
 * gnutls_record_recv() will not return %GNUTLS_E_REHANDSHAKE, and
2655
 * calls to gnutls_handshake() in server side are a no-op.
2656
 *
2657
 * This function always fails with %GNUTLS_E_INVALID_REQUEST when
2658
 * called in client side.
2659
 *
2660
 * Returns: %GNUTLS_E_SUCCESS on success, otherwise a negative error code.
2661
 **/
2662
int gnutls_rehandshake(gnutls_session_t session)
2663
0
{
2664
0
  int ret;
2665
0
  const version_entry_st *vers = get_version(session);
2666
2667
  /* only server sends that handshake packet */
2668
0
  if (session->security_parameters.entity == GNUTLS_CLIENT)
2669
0
    return GNUTLS_E_INVALID_REQUEST;
2670
2671
0
  if (vers->tls13_sem) {
2672
0
    return gnutls_session_key_update(session, GNUTLS_KU_PEER);
2673
0
  }
2674
2675
0
  _dtls_async_timer_delete(session);
2676
2677
0
  ret = _gnutls_send_empty_handshake(
2678
0
    session, GNUTLS_HANDSHAKE_HELLO_REQUEST, AGAIN(STATE50));
2679
0
  STATE = STATE50;
2680
2681
0
  if (ret < 0) {
2682
0
    gnutls_assert();
2683
0
    return ret;
2684
0
  }
2685
0
  STATE = STATE0;
2686
2687
0
  return 0;
2688
0
}
2689
2690
/* This function checks whether the error code should be treated fatal
2691
 * or not, and also does the necessary state transition.  In
2692
 * particular, in the case of a rehandshake abort it resets the
2693
 * handshake's internal state.
2694
 */
2695
inline static int _gnutls_abort_handshake(gnutls_session_t session, int ret)
2696
0
{
2697
0
  switch (ret) {
2698
0
  case GNUTLS_E_WARNING_ALERT_RECEIVED:
2699
0
    if (gnutls_alert_get(session) == GNUTLS_A_NO_RENEGOTIATION) {
2700
      /* The server always toleretes a "no_renegotiation" alert. */
2701
0
      if (session->security_parameters.entity ==
2702
0
          GNUTLS_SERVER) {
2703
0
        STATE = STATE0;
2704
0
        return ret;
2705
0
      }
2706
2707
      /* The client should tolerete a "no_renegotiation" alert only if:
2708
       * - the initial handshake has completed, or
2709
       * - a Server Hello is not yet received
2710
       */
2711
0
      if (session->internals.initial_negotiation_completed ||
2712
0
          !(session->internals.hsk_flags &
2713
0
            HSK_SERVER_HELLO_RECEIVED)) {
2714
0
        STATE = STATE0;
2715
0
        return ret;
2716
0
      }
2717
2718
0
      return gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET);
2719
0
    }
2720
0
    return ret;
2721
0
  case GNUTLS_E_GOT_APPLICATION_DATA:
2722
0
    STATE = STATE0;
2723
0
    return ret;
2724
0
  default:
2725
0
    return ret;
2726
0
  }
2727
0
}
2728
2729
static int _gnutls_send_supplemental(gnutls_session_t session, int again)
2730
0
{
2731
0
  mbuffer_st *bufel = NULL;
2732
0
  int ret = 0;
2733
2734
0
  _gnutls_debug_log("EXT[%p]: Sending supplemental data\n", session);
2735
2736
0
  if (!again) {
2737
0
    gnutls_buffer_st buf;
2738
0
    ret = _gnutls_buffer_init_handshake_mbuffer(&buf);
2739
0
    if (ret < 0)
2740
0
      return gnutls_assert_val(ret);
2741
2742
0
    ret = _gnutls_gen_supplemental(session, &buf);
2743
0
    if (ret < 0) {
2744
0
      gnutls_assert();
2745
0
      _gnutls_buffer_clear(&buf);
2746
0
      return ret;
2747
0
    }
2748
2749
0
    bufel = _gnutls_buffer_to_mbuffer(&buf);
2750
0
  }
2751
2752
0
  return _gnutls_send_handshake(session, bufel,
2753
0
              GNUTLS_HANDSHAKE_SUPPLEMENTAL);
2754
0
}
2755
2756
static int _gnutls_recv_supplemental(gnutls_session_t session)
2757
0
{
2758
0
  gnutls_buffer_st buf;
2759
0
  int ret;
2760
2761
0
  _gnutls_debug_log("EXT[%p]: Expecting supplemental data\n", session);
2762
2763
0
  ret = _gnutls_recv_handshake(session, GNUTLS_HANDSHAKE_SUPPLEMENTAL, 1,
2764
0
             &buf);
2765
0
  if (ret < 0) {
2766
0
    gnutls_assert();
2767
0
    return ret;
2768
0
  }
2769
2770
0
  ret = _gnutls_parse_supplemental(session, buf.data, buf.length);
2771
0
  if (ret < 0) {
2772
0
    gnutls_assert();
2773
0
    goto cleanup;
2774
0
  }
2775
2776
0
cleanup:
2777
0
  _gnutls_buffer_clear(&buf);
2778
2779
0
  return ret;
2780
0
}
2781
2782
/**
2783
 * gnutls_handshake:
2784
 * @session: is a #gnutls_session_t type.
2785
 *
2786
 * This function performs the handshake of the TLS/SSL protocol, and
2787
 * initializes the TLS session parameters.
2788
 *
2789
 * The non-fatal errors expected by this function are:
2790
 * %GNUTLS_E_INTERRUPTED, %GNUTLS_E_AGAIN,
2791
 * %GNUTLS_E_WARNING_ALERT_RECEIVED. When this function is called
2792
 * for re-handshake under TLS 1.2 or earlier, the non-fatal error code
2793
 * %GNUTLS_E_GOT_APPLICATION_DATA may also be returned.
2794
 *
2795
 * The former two interrupt the handshake procedure due to the transport
2796
 * layer being interrupted, and the latter because of a "warning" alert that
2797
 * was sent by the peer (it is always a good idea to check any
2798
 * received alerts). On these non-fatal errors call this function again,
2799
 * until it returns 0; cf.  gnutls_record_get_direction() and
2800
 * gnutls_error_is_fatal(). In DTLS sessions the non-fatal error
2801
 * %GNUTLS_E_LARGE_PACKET is also possible, and indicates that
2802
 * the MTU should be adjusted.
2803
 *
2804
 * When this function is called by a server after a rehandshake request
2805
 * under TLS 1.2 or earlier the %GNUTLS_E_GOT_APPLICATION_DATA error code indicates
2806
 * that some data were pending prior to peer initiating the handshake.
2807
 * Under TLS 1.3 this function when called after a successful handshake, is a no-op
2808
 * and always succeeds in server side; in client side this function is
2809
 * equivalent to gnutls_session_key_update() with %GNUTLS_KU_PEER flag.
2810
 *
2811
 * This function handles both full and abbreviated TLS handshakes (resumption).
2812
 * For abbreviated handshakes, in client side, the gnutls_session_set_data()
2813
 * should be called prior to this function to set parameters from a previous session.
2814
 * In server side, resumption is handled by either setting a DB back-end, or setting
2815
 * up keys for session tickets.
2816
 *
2817
 * Returns: %GNUTLS_E_SUCCESS on a successful handshake, otherwise a negative error code.
2818
 **/
2819
int gnutls_handshake(gnutls_session_t session)
2820
0
{
2821
0
  const version_entry_st *vers = get_version(session);
2822
0
  int ret;
2823
2824
0
  if (unlikely(session->internals.initial_negotiation_completed)) {
2825
0
    if (vers->tls13_sem) {
2826
0
      if (session->security_parameters.entity ==
2827
0
          GNUTLS_CLIENT) {
2828
0
        return gnutls_session_key_update(
2829
0
          session, GNUTLS_KU_PEER);
2830
0
      } else {
2831
        /* This is a no-op for a server under TLS 1.3, as
2832
         * a server has already called gnutls_rehandshake()
2833
         * which performed a key update.
2834
         */
2835
0
        return 0;
2836
0
      }
2837
0
    }
2838
0
  }
2839
2840
0
  if (STATE == STATE0) {
2841
0
    unsigned int tmo_ms;
2842
0
    struct timespec *end;
2843
0
    struct timespec *start;
2844
2845
    /* first call */
2846
0
    if (session->internals.priorities == NULL ||
2847
0
        session->internals.priorities->cs.size == 0)
2848
0
      return gnutls_assert_val(
2849
0
        GNUTLS_E_NO_PRIORITIES_WERE_SET);
2850
2851
0
    ret = _gnutls_epoch_setup_next(session, 0, NULL);
2852
0
    if (ret < 0)
2853
0
      return gnutls_assert_val(ret);
2854
2855
0
    session->internals.used_exts = 0;
2856
0
    session->internals.hsk_flags = 0;
2857
0
    session->internals.handshake_in_progress = 1;
2858
0
    session->internals.vc_status = -1;
2859
0
    gnutls_gettime(&session->internals.handshake_start_time);
2860
2861
0
    tmo_ms = session->internals.handshake_timeout_ms;
2862
0
    end = &session->internals.handshake_abs_timeout;
2863
0
    start = &session->internals.handshake_start_time;
2864
2865
0
    if (tmo_ms && end->tv_sec == 0 && end->tv_nsec == 0) {
2866
0
      end->tv_sec = start->tv_sec +
2867
0
              (start->tv_nsec + tmo_ms * 1000000LL) /
2868
0
                1000000000LL;
2869
0
      end->tv_nsec = (start->tv_nsec + tmo_ms * 1000000LL) %
2870
0
               1000000000LL;
2871
0
    }
2872
2873
#ifdef ENABLE_KTLS
2874
    if (_gnutls_config_is_ktls_enabled()) {
2875
      if ((session->internals.pull_func &&
2876
           session->internals.pull_func != system_read) ||
2877
          session->internals.push_func) {
2878
        _gnutls_audit_log(
2879
          session, "Not enabling KTLS with "
2880
             "custom pull/push function\n");
2881
      } else {
2882
        _gnutls_ktls_enable(session);
2883
      }
2884
    }
2885
#endif
2886
0
  }
2887
2888
0
  if (_gnutls_config_set_certificate_compression_methods(session) < 0)
2889
0
    _gnutls_audit_log(
2890
0
      session,
2891
0
      "Setting certificate compression methods failed\n");
2892
2893
0
  if (session->internals.recv_state == RECV_STATE_FALSE_START) {
2894
0
    session_invalidate(session);
2895
0
    return gnutls_assert_val(GNUTLS_E_HANDSHAKE_DURING_FALSE_START);
2896
0
  }
2897
2898
0
  if (session->security_parameters.entity == GNUTLS_CLIENT) {
2899
0
    do {
2900
0
      ret = handshake_client(session);
2901
0
    } while (ret == 1);
2902
0
  } else {
2903
0
    ret = handshake_server(session);
2904
0
  }
2905
2906
0
  if (ret < 0) {
2907
0
    return _gnutls_abort_handshake(session, ret);
2908
0
  }
2909
2910
  /* clear handshake buffer */
2911
0
  if (session->internals.recv_state != RECV_STATE_FALSE_START &&
2912
0
      session->internals.recv_state != RECV_STATE_EARLY_START) {
2913
0
    _gnutls_handshake_hash_buffers_clear(session);
2914
2915
0
    if (IS_DTLS(session) == 0) {
2916
0
      _gnutls_handshake_io_buffer_clear(session);
2917
0
    } else {
2918
0
      _dtls_async_timer_init(session);
2919
0
    }
2920
2921
0
    _gnutls_handshake_internal_state_clear(session);
2922
2923
0
    _gnutls_buffer_clear(&session->internals.record_presend_buffer);
2924
2925
0
    _gnutls_epoch_bump(session);
2926
0
  }
2927
2928
  /* Give an estimation of the round-trip under TLS1.3, used by gnutls_session_get_data2() */
2929
0
  if (!IS_SERVER(session) && vers->tls13_sem) {
2930
0
    struct timespec handshake_finish_time;
2931
0
    gnutls_gettime(&handshake_finish_time);
2932
2933
0
    if (!(session->internals.hsk_flags & HSK_HRR_RECEIVED)) {
2934
0
      session->internals.ertt =
2935
0
        timespec_sub_ms(
2936
0
          &handshake_finish_time,
2937
0
          &session->internals
2938
0
             .handshake_start_time) /
2939
0
        2;
2940
0
    } else {
2941
0
      session->internals.ertt =
2942
0
        timespec_sub_ms(
2943
0
          &handshake_finish_time,
2944
0
          &session->internals
2945
0
             .handshake_start_time) /
2946
0
        4;
2947
0
    }
2948
0
  }
2949
2950
#ifdef ENABLE_KTLS
2951
  if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_DUPLEX)) {
2952
    ret = _gnutls_ktls_set_keys(session, GNUTLS_KTLS_DUPLEX);
2953
    if (ret < 0) {
2954
      /* no need to invalidate the session as keys were not set */
2955
      session->internals.ktls_enabled = 0;
2956
      _gnutls_audit_log(
2957
        session,
2958
        "disabling KTLS: failed to set keys\n");
2959
    }
2960
  }
2961
#endif
2962
2963
0
  return 0;
2964
0
}
2965
2966
/**
2967
 * gnutls_handshake_set_timeout:
2968
 * @session: is a #gnutls_session_t type.
2969
 * @ms: is a timeout value in milliseconds
2970
 *
2971
 * This function sets the timeout for the TLS handshake process
2972
 * to the provided value. Use an @ms value of zero to disable
2973
 * timeout, or %GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT for a reasonable
2974
 * default value. For the DTLS protocol, the more detailed
2975
 * gnutls_dtls_set_timeouts() is provided.
2976
 *
2977
 * This function requires to set a pull timeout callback. See
2978
 * gnutls_transport_set_pull_timeout_function().
2979
 *
2980
 * Since: 3.1.0
2981
 **/
2982
void gnutls_handshake_set_timeout(gnutls_session_t session, unsigned int ms)
2983
0
{
2984
0
  if (ms == GNUTLS_INDEFINITE_TIMEOUT) {
2985
0
    session->internals.handshake_timeout_ms = 0;
2986
0
    return;
2987
0
  }
2988
2989
0
  if (ms == GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT)
2990
0
    ms = DEFAULT_HANDSHAKE_TIMEOUT_MS;
2991
2992
0
  if (IS_DTLS(session)) {
2993
0
    gnutls_dtls_set_timeouts(session, DTLS_RETRANS_TIMEOUT, ms);
2994
0
    return;
2995
0
  }
2996
2997
0
  session->internals.handshake_timeout_ms = ms;
2998
0
}
2999
3000
/* Runs the certificate verification callback.
3001
 * side is the side that we verify the certificate
3002
 * from (either GNUTLS_CLIENT or GNUTLS_SERVER).
3003
 */
3004
int _gnutls_run_verify_callback(gnutls_session_t session, unsigned int side)
3005
0
{
3006
0
  gnutls_certificate_credentials_t cred;
3007
0
  int ret, type;
3008
3009
0
  if (session->internals.hsk_flags & HSK_PSK_SELECTED)
3010
0
    return 0;
3011
3012
0
  cred = (gnutls_certificate_credentials_t)_gnutls_get_cred(
3013
0
    session, GNUTLS_CRD_CERTIFICATE);
3014
3015
0
  if (side == GNUTLS_CLIENT)
3016
0
    type = gnutls_auth_server_get_type(session);
3017
0
  else
3018
0
    type = gnutls_auth_client_get_type(session);
3019
3020
0
  if (type != GNUTLS_CRD_CERTIFICATE)
3021
0
    return 0;
3022
3023
  /* verify whether the certificate of the peer remained the same
3024
   * as with any previous handshakes */
3025
0
  if (cred != NULL) {
3026
0
    ret = _gnutls_check_if_cert_hash_is_same(session, cred);
3027
0
    if (ret < 0) {
3028
0
      return gnutls_assert_val(ret);
3029
0
    }
3030
0
  }
3031
3032
0
  if (cred != NULL &&
3033
0
      (cred->verify_callback != NULL ||
3034
0
       session->internals.verify_callback != NULL) &&
3035
0
      (session->security_parameters.entity == GNUTLS_CLIENT ||
3036
0
       session->internals.send_cert_req != GNUTLS_CERT_IGNORE)) {
3037
0
    if (session->internals.verify_callback)
3038
0
      ret = session->internals.verify_callback(session);
3039
0
    else
3040
0
      ret = cred->verify_callback(session);
3041
0
    if (ret < -1)
3042
0
      return gnutls_assert_val(ret);
3043
0
    else if (ret != 0)
3044
0
      return gnutls_assert_val(GNUTLS_E_CERTIFICATE_ERROR);
3045
0
  }
3046
3047
0
  return 0;
3048
0
}
3049
3050
static bool can_send_false_start(gnutls_session_t session)
3051
0
{
3052
0
  const version_entry_st *vers;
3053
3054
0
  vers = get_version(session);
3055
0
  if (unlikely(vers == NULL || !vers->false_start))
3056
0
    return 0;
3057
3058
0
  if (session->internals.selected_cert_list != NULL)
3059
0
    return 0;
3060
3061
0
  if (!_gnutls_kx_allows_false_start(session))
3062
0
    return 0;
3063
3064
0
  return 1;
3065
0
}
3066
3067
/*
3068
 * handshake_client
3069
 * This function performs the client side of the handshake of the TLS/SSL protocol.
3070
 */
3071
static int handshake_client(gnutls_session_t session)
3072
0
{
3073
0
  int ret = 0;
3074
0
  const version_entry_st *ver;
3075
3076
0
reset:
3077
0
  if (STATE >= STATE99)
3078
0
    return _gnutls13_handshake_client(session);
3079
3080
0
  switch (STATE) {
3081
0
  case STATE0:
3082
0
  case STATE1:
3083
0
    ret = send_client_hello(session, AGAIN(STATE1));
3084
0
    STATE = STATE1;
3085
0
    IMED_RET("send hello", ret, 1);
3086
0
    FALLTHROUGH;
3087
0
  case STATE2:
3088
0
    if (IS_DTLS(session)) {
3089
0
      ret = _gnutls_recv_handshake(
3090
0
        session, GNUTLS_HANDSHAKE_HELLO_VERIFY_REQUEST,
3091
0
        1, NULL);
3092
0
      STATE = STATE2;
3093
0
      IMED_RET("recv hello verify", ret, 1);
3094
3095
0
      if (ret == 1) {
3096
0
        STATE = STATE0;
3097
0
        return 1;
3098
0
      }
3099
0
    } else {
3100
0
      ret = _gnutls_recv_handshake(
3101
0
        session, GNUTLS_HANDSHAKE_HELLO_RETRY_REQUEST,
3102
0
        1, NULL);
3103
0
      STATE = STATE2;
3104
0
      IMED_RET("recv hello retry", ret, 1);
3105
3106
0
      if (ret == 1) {
3107
0
        STATE = STATE0;
3108
0
        return 1;
3109
0
      }
3110
0
    }
3111
0
    FALLTHROUGH;
3112
0
  case STATE3:
3113
    /* receive the server hello */
3114
0
    ret = _gnutls_recv_handshake(
3115
0
      session, GNUTLS_HANDSHAKE_SERVER_HELLO, 0, NULL);
3116
0
    STATE = STATE3;
3117
0
    IMED_RET("recv hello", ret, 1);
3118
0
    FALLTHROUGH;
3119
0
  case STATE4:
3120
0
    ver = get_version(session);
3121
0
    if (ver->tls13_sem) { /* TLS 1.3 state machine */
3122
0
      STATE = STATE99;
3123
0
      goto reset;
3124
0
    }
3125
3126
0
    ret = _gnutls_ext_sr_verify(session);
3127
0
    STATE = STATE4;
3128
0
    IMED_RET_FATAL("recv hello", ret, 0);
3129
0
    FALLTHROUGH;
3130
0
  case STATE5:
3131
0
    if (session->security_parameters.do_recv_supplemental) {
3132
0
      ret = _gnutls_recv_supplemental(session);
3133
0
      STATE = STATE5;
3134
0
      IMED_RET("recv supplemental", ret, 1);
3135
0
    }
3136
0
    FALLTHROUGH;
3137
0
  case STATE6:
3138
    /* RECV CERTIFICATE */
3139
0
    if (!session->internals.resumed) /* if we are not resuming */
3140
0
      ret = _gnutls_recv_server_certificate(session);
3141
0
    STATE = STATE6;
3142
0
    IMED_RET("recv server certificate", ret, 1);
3143
0
    FALLTHROUGH;
3144
0
  case STATE7:
3145
0
#ifdef ENABLE_OCSP
3146
    /* RECV CERTIFICATE STATUS */
3147
0
    if (!session->internals.resumed) /* if we are not resuming */
3148
0
      ret = _gnutls_recv_server_certificate_status(session);
3149
0
    STATE = STATE7;
3150
0
    IMED_RET("recv server certificate", ret, 1);
3151
0
#endif
3152
0
    FALLTHROUGH;
3153
0
  case STATE8:
3154
0
    ret = _gnutls_run_verify_callback(session, GNUTLS_CLIENT);
3155
0
    STATE = STATE8;
3156
0
    if (ret < 0)
3157
0
      return gnutls_assert_val(ret);
3158
3159
0
    FALLTHROUGH;
3160
0
  case STATE9:
3161
    /* receive the server key exchange */
3162
0
    if (!session->internals.resumed) /* if we are not resuming */
3163
0
      ret = _gnutls_recv_server_kx_message(session);
3164
0
    STATE = STATE9;
3165
0
    IMED_RET("recv server kx message", ret, 1);
3166
0
    FALLTHROUGH;
3167
0
  case STATE10:
3168
    /* receive the server certificate request - if any
3169
     */
3170
3171
0
    if (!session->internals.resumed) /* if we are not resuming */
3172
0
      ret = _gnutls_recv_server_crt_request(session);
3173
0
    STATE = STATE10;
3174
0
    IMED_RET("recv server certificate request message", ret, 1);
3175
0
    FALLTHROUGH;
3176
0
  case STATE11:
3177
    /* receive the server hello done */
3178
0
    if (!session->internals.resumed) /* if we are not resuming */
3179
0
      ret = _gnutls_recv_handshake(
3180
0
        session, GNUTLS_HANDSHAKE_SERVER_HELLO_DONE, 0,
3181
0
        NULL);
3182
0
    STATE = STATE11;
3183
0
    IMED_RET("recv server hello done", ret, 1);
3184
0
    FALLTHROUGH;
3185
0
  case STATE12:
3186
0
    if (session->security_parameters.do_send_supplemental) {
3187
0
      ret = _gnutls_send_supplemental(session,
3188
0
              AGAIN(STATE12));
3189
0
      STATE = STATE12;
3190
0
      IMED_RET("send supplemental", ret, 0);
3191
0
    }
3192
0
    FALLTHROUGH;
3193
0
  case STATE13:
3194
    /* send our certificate - if any and if requested
3195
     */
3196
0
    if (!session->internals.resumed) /* if we are not resuming */
3197
0
      ret = _gnutls_send_client_certificate(session,
3198
0
                    AGAIN(STATE13));
3199
0
    STATE = STATE13;
3200
0
    IMED_RET("send client certificate", ret, 0);
3201
0
    FALLTHROUGH;
3202
0
  case STATE14:
3203
0
    if (!session->internals.resumed) /* if we are not resuming */
3204
0
      ret = _gnutls_send_client_kx_message(session,
3205
0
                   AGAIN(STATE14));
3206
0
    STATE = STATE14;
3207
0
    IMED_RET("send client kx", ret, 0);
3208
0
    FALLTHROUGH;
3209
0
  case STATE15:
3210
    /* send client certificate verify */
3211
0
    if (!session->internals.resumed) /* if we are not resuming */
3212
0
      ret = _gnutls_send_client_certificate_verify(
3213
0
        session, AGAIN(STATE15));
3214
0
    STATE = STATE15;
3215
0
    IMED_RET("send client certificate verify", ret, 1);
3216
0
    FALLTHROUGH;
3217
0
  case STATE16:
3218
0
    STATE = STATE16;
3219
0
    if (!session->internals.resumed) {
3220
0
      ret = send_handshake_final(session, true);
3221
0
      IMED_RET("send handshake final 2", ret, 1);
3222
0
    } else {
3223
0
      ret = _gnutls_recv_new_session_ticket(session);
3224
0
      IMED_RET("recv handshake new session ticket", ret, 1);
3225
0
    }
3226
0
    FALLTHROUGH;
3227
0
  case STATE17:
3228
0
    STATE = STATE17;
3229
0
    if (!session->internals.resumed &&
3230
0
        (session->internals.flags & GNUTLS_ENABLE_FALSE_START) &&
3231
0
        can_send_false_start(session)) {
3232
0
      session->internals.hsk_flags |= HSK_FALSE_START_USED;
3233
0
      session->internals.recv_state = RECV_STATE_FALSE_START;
3234
      /* complete this phase of the handshake. We
3235
       * should be called again by gnutls_record_recv()
3236
       */
3237
0
      STATE = STATE18;
3238
0
      gnutls_assert();
3239
3240
0
      return 0;
3241
0
    }
3242
0
    FALLTHROUGH;
3243
0
  case STATE18:
3244
0
    STATE = STATE18;
3245
3246
0
    if (!session->internals.resumed) {
3247
0
      ret = _gnutls_recv_new_session_ticket(session);
3248
0
      IMED_RET("recv handshake new session ticket", ret, 1);
3249
0
    } else {
3250
0
      ret = recv_handshake_final(session, true);
3251
0
      IMED_RET("recv handshake final", ret, 1);
3252
0
    }
3253
0
    FALLTHROUGH;
3254
0
  case STATE19:
3255
0
    STATE = STATE19;
3256
0
    if (!session->internals.resumed) {
3257
0
      ret = recv_handshake_final(session, false);
3258
0
      IMED_RET("recv handshake final 2", ret, 1);
3259
0
    } else {
3260
0
      ret = send_handshake_final(session, false);
3261
0
      IMED_RET("send handshake final", ret, 1);
3262
0
    }
3263
3264
0
    STATE = STATE0;
3265
0
    FALLTHROUGH;
3266
0
  default:
3267
0
    break;
3268
0
  }
3269
3270
  /* explicitly reset any false start flags */
3271
0
  gnutls_mutex_lock(&session->internals.post_negotiation_lock);
3272
0
  session->internals.initial_negotiation_completed = 1;
3273
0
  session->internals.recv_state = RECV_STATE_0;
3274
0
  gnutls_mutex_unlock(&session->internals.post_negotiation_lock);
3275
3276
0
  return 0;
3277
0
}
3278
3279
/* This function is to be called if the handshake was successfully
3280
 * completed. This sends a Change Cipher Spec packet to the peer.
3281
 */
3282
ssize_t _gnutls_send_change_cipher_spec(gnutls_session_t session, int again)
3283
0
{
3284
0
  uint8_t *data;
3285
0
  mbuffer_st *bufel;
3286
0
  int ret;
3287
0
  const version_entry_st *vers;
3288
3289
0
  if (again == 0) {
3290
0
    bufel = _gnutls_handshake_alloc(session,
3291
0
            3); /* max for DTLS0.9 */
3292
0
    if (bufel == NULL)
3293
0
      return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
3294
3295
0
    vers = get_version(session);
3296
0
    if (unlikely(vers == NULL))
3297
0
      return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
3298
3299
0
    if (vers->id == GNUTLS_DTLS0_9)
3300
0
      _mbuffer_set_uhead_size(bufel, 3);
3301
0
    else
3302
0
      _mbuffer_set_uhead_size(bufel, 1);
3303
0
    _mbuffer_set_udata_size(bufel, 0);
3304
3305
0
    data = _mbuffer_get_uhead_ptr(bufel);
3306
3307
0
    data[0] = 1;
3308
0
    if (vers->id == GNUTLS_DTLS0_9) {
3309
0
      _gnutls_write_uint16(
3310
0
        session->internals.dtls.hsk_write_seq,
3311
0
        &data[1]);
3312
0
      session->internals.dtls.hsk_write_seq++;
3313
0
    }
3314
3315
0
    ret = _gnutls_call_hook_func(
3316
0
      session, GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC,
3317
0
      GNUTLS_HOOK_PRE, 0, data, 1);
3318
0
    if (ret < 0) {
3319
0
      _mbuffer_xfree(&bufel);
3320
0
      return gnutls_assert_val(ret);
3321
0
    }
3322
3323
0
    ret = _gnutls_handshake_io_cache_int(
3324
0
      session, GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC, bufel);
3325
0
    if (ret < 0) {
3326
0
      _mbuffer_xfree(&bufel);
3327
0
      return gnutls_assert_val(ret);
3328
0
    }
3329
3330
0
    ret = _gnutls_call_hook_func(
3331
0
      session, GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC,
3332
0
      GNUTLS_HOOK_POST, 0, data, 1);
3333
0
    if (ret < 0) {
3334
0
      return gnutls_assert_val(ret);
3335
0
    }
3336
3337
    /* under TLS 1.3, CCS may be immediately followed by
3338
     * receiving ClientHello thus cannot be cached */
3339
0
    if (vers->tls13_sem) {
3340
0
      ret = _gnutls_handshake_io_write_flush(session);
3341
0
      if (ret < 0)
3342
0
        return gnutls_assert_val(ret);
3343
0
    }
3344
3345
0
    _gnutls_handshake_log("REC[%p]: Sent ChangeCipherSpec\n",
3346
0
              session);
3347
0
  }
3348
3349
0
  return 0;
3350
0
}
3351
3352
/* This function sends the final handshake packets and initializes connection
3353
 */
3354
static int send_handshake_final(gnutls_session_t session, int init)
3355
0
{
3356
0
  int ret = 0;
3357
3358
  /* Send the CHANGE CIPHER SPEC PACKET */
3359
3360
0
  switch (FINAL_STATE) {
3361
0
  case STATE0:
3362
0
  case STATE1:
3363
0
    ret = _gnutls_send_change_cipher_spec(session, FAGAIN(STATE1));
3364
0
    FINAL_STATE = STATE0;
3365
3366
0
    if (ret < 0) {
3367
0
      gnutls_assert();
3368
0
      return ret;
3369
0
    }
3370
    /* Initialize the connection session (start encryption) - in case of client
3371
     */
3372
0
    if (init) {
3373
0
      ret = _gnutls_connection_state_init(session);
3374
0
      if (ret < 0) {
3375
0
        gnutls_assert();
3376
0
        return ret;
3377
0
      }
3378
0
    }
3379
3380
0
    ret = _gnutls_write_connection_state_init(session);
3381
0
    if (ret < 0) {
3382
0
      gnutls_assert();
3383
0
      return ret;
3384
0
    }
3385
3386
0
    FALLTHROUGH;
3387
0
  case STATE2:
3388
    /* send the finished message */
3389
0
    ret = _gnutls_send_finished(session, FAGAIN(STATE2));
3390
0
    FINAL_STATE = STATE2;
3391
0
    if (ret < 0) {
3392
0
      gnutls_assert();
3393
0
      return ret;
3394
0
    }
3395
3396
0
    FINAL_STATE = STATE0;
3397
0
    FALLTHROUGH;
3398
0
  default:
3399
0
    break;
3400
0
  }
3401
3402
0
  return 0;
3403
0
}
3404
3405
/* This function receives the final handshake packets
3406
 * And executes the appropriate function to initialize the
3407
 * read session.
3408
 */
3409
static int recv_handshake_final(gnutls_session_t session, int init)
3410
0
{
3411
0
  int ret = 0;
3412
0
  uint8_t ccs[3];
3413
0
  unsigned int ccs_len = 1;
3414
0
  unsigned int tleft;
3415
0
  const version_entry_st *vers;
3416
3417
0
  ret = handshake_remaining_time(session);
3418
0
  if (ret < 0)
3419
0
    return gnutls_assert_val(ret);
3420
0
  tleft = ret;
3421
3422
0
  switch (FINAL_STATE) {
3423
0
  case STATE0:
3424
0
  case STATE30:
3425
0
    FINAL_STATE = STATE30;
3426
3427
    /* This is the last flight and peer cannot be sure
3428
     * we have received it unless we notify him. So we
3429
     * wait for a message and retransmit if needed. */
3430
0
    if (IS_DTLS(session) && !_dtls_is_async(session) &&
3431
0
        (gnutls_record_check_pending(session) +
3432
0
         record_check_unprocessed(session)) == 0) {
3433
0
      ret = _dtls_wait_and_retransmit(session);
3434
0
      if (ret < 0)
3435
0
        return gnutls_assert_val(ret);
3436
0
    }
3437
3438
0
    vers = get_version(session);
3439
0
    if (unlikely(vers == NULL))
3440
0
      return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
3441
3442
0
    if (vers->id == GNUTLS_DTLS0_9)
3443
0
      ccs_len = 3;
3444
3445
0
    ret = _gnutls_recv_int(session, GNUTLS_CHANGE_CIPHER_SPEC, ccs,
3446
0
               ccs_len, NULL, tleft);
3447
0
    if (ret <= 0) {
3448
0
      gnutls_assert();
3449
0
      return (ret < 0) ? ret : GNUTLS_E_UNEXPECTED_PACKET;
3450
0
    }
3451
3452
0
    if (vers->id == GNUTLS_DTLS0_9)
3453
0
      session->internals.dtls.hsk_read_seq++;
3454
3455
    /* Initialize the connection session (start encryption) - in case of server */
3456
0
    if (init) {
3457
0
      ret = _gnutls_connection_state_init(session);
3458
0
      if (ret < 0) {
3459
0
        gnutls_assert();
3460
0
        return ret;
3461
0
      }
3462
0
    }
3463
3464
0
    ret = _gnutls_read_connection_state_init(session);
3465
0
    if (ret < 0) {
3466
0
      gnutls_assert();
3467
0
      return ret;
3468
0
    }
3469
0
    FALLTHROUGH;
3470
0
  case STATE31:
3471
0
    FINAL_STATE = STATE31;
3472
3473
0
    if (IS_DTLS(session) && !_dtls_is_async(session) &&
3474
0
        (gnutls_record_check_pending(session) +
3475
0
         record_check_unprocessed(session)) == 0) {
3476
0
      ret = _dtls_wait_and_retransmit(session);
3477
0
      if (ret < 0)
3478
0
        return gnutls_assert_val(ret);
3479
0
    }
3480
3481
0
    ret = _gnutls_recv_finished(session);
3482
0
    if (ret < 0) {
3483
0
      gnutls_assert();
3484
0
      return ret;
3485
0
    }
3486
0
    FINAL_STATE = STATE0;
3487
0
    FALLTHROUGH;
3488
0
  default:
3489
0
    break;
3490
0
  }
3491
3492
0
  return 0;
3493
0
}
3494
3495
/*
3496
 * handshake_server
3497
 * This function does the server stuff of the handshake protocol.
3498
 */
3499
static int handshake_server(gnutls_session_t session)
3500
0
{
3501
0
  int ret = 0;
3502
0
  const version_entry_st *ver;
3503
3504
0
reset:
3505
3506
0
  if (STATE >= STATE90)
3507
0
    return _gnutls13_handshake_server(session);
3508
3509
0
  switch (STATE) {
3510
0
  case STATE0:
3511
0
  case STATE1:
3512
0
    ret = _gnutls_recv_handshake(
3513
0
      session, GNUTLS_HANDSHAKE_CLIENT_HELLO, 0, NULL);
3514
0
    if (ret == GNUTLS_E_INT_RET_0) {
3515
      /* this is triggered by post_client_hello, and instructs the
3516
       * handshake to proceed but be put on hold */
3517
0
      ret = GNUTLS_E_INTERRUPTED;
3518
0
      STATE = STATE2; /* hello already parsed -> move on */
3519
0
    } else {
3520
0
      STATE = STATE1;
3521
0
    }
3522
3523
0
    if (ret == GNUTLS_E_NO_COMMON_KEY_SHARE) {
3524
0
      STATE = STATE90;
3525
0
      session->internals.hsk_flags |= HSK_HRR_SENT;
3526
0
      goto reset;
3527
0
    }
3528
3529
0
    IMED_RET("recv hello", ret, 1);
3530
0
    FALLTHROUGH;
3531
0
  case STATE2:
3532
3533
0
    ret = _gnutls_ext_sr_verify(session);
3534
0
    STATE = STATE2;
3535
0
    IMED_RET_FATAL("recv hello", ret, 0);
3536
0
    FALLTHROUGH;
3537
0
  case STATE3:
3538
0
    ret = _gnutls_send_server_hello(session, AGAIN(STATE3));
3539
0
    STATE = STATE3;
3540
0
    IMED_RET("send hello", ret, 1);
3541
3542
0
    ver = get_version(session);
3543
0
    if (ver->tls13_sem) { /* TLS 1.3 state machine */
3544
0
      STATE = STATE99;
3545
0
      goto reset;
3546
0
    }
3547
3548
0
    FALLTHROUGH;
3549
0
  case STATE4:
3550
0
    if (session->security_parameters.do_send_supplemental) {
3551
0
      ret = _gnutls_send_supplemental(session, AGAIN(STATE4));
3552
0
      STATE = STATE4;
3553
0
      IMED_RET("send supplemental data", ret, 0);
3554
0
    }
3555
    /* SEND CERTIFICATE + KEYEXCHANGE + CERTIFICATE_REQUEST */
3556
0
    FALLTHROUGH;
3557
0
  case STATE5:
3558
    /* NOTE: these should not be send if we are resuming */
3559
3560
0
    if (!session->internals.resumed)
3561
0
      ret = _gnutls_send_server_certificate(session,
3562
0
                    AGAIN(STATE5));
3563
0
    STATE = STATE5;
3564
0
    IMED_RET("send server certificate", ret, 0);
3565
0
    FALLTHROUGH;
3566
0
  case STATE6:
3567
0
#ifdef ENABLE_OCSP
3568
0
    if (!session->internals.resumed)
3569
0
      ret = _gnutls_send_server_certificate_status(
3570
0
        session, AGAIN(STATE6));
3571
0
    STATE = STATE6;
3572
0
    IMED_RET("send server certificate status", ret, 0);
3573
0
#endif
3574
0
    FALLTHROUGH;
3575
0
  case STATE7:
3576
    /* send server key exchange (A) */
3577
0
    if (!session->internals.resumed)
3578
0
      ret = _gnutls_send_server_kx_message(session,
3579
0
                   AGAIN(STATE7));
3580
0
    STATE = STATE7;
3581
0
    IMED_RET("send server kx", ret, 0);
3582
0
    FALLTHROUGH;
3583
0
  case STATE8:
3584
    /* Send certificate request - if requested to */
3585
0
    if (!session->internals.resumed)
3586
0
      ret = _gnutls_send_server_crt_request(session,
3587
0
                    AGAIN(STATE8));
3588
0
    STATE = STATE8;
3589
0
    IMED_RET("send server cert request", ret, 0);
3590
0
    FALLTHROUGH;
3591
0
  case STATE9:
3592
    /* send the server hello done */
3593
0
    if (!session->internals.resumed) /* if we are not resuming */
3594
0
      ret = _gnutls_send_empty_handshake(
3595
0
        session, GNUTLS_HANDSHAKE_SERVER_HELLO_DONE,
3596
0
        AGAIN(STATE9));
3597
0
    STATE = STATE9;
3598
0
    IMED_RET("send server hello done", ret, 1);
3599
0
    FALLTHROUGH;
3600
0
  case STATE10:
3601
0
    if (session->security_parameters.do_recv_supplemental) {
3602
0
      ret = _gnutls_recv_supplemental(session);
3603
0
      STATE = STATE10;
3604
0
      IMED_RET("recv client supplemental", ret, 1);
3605
0
    }
3606
    /* RECV CERTIFICATE + KEYEXCHANGE + CERTIFICATE_VERIFY */
3607
0
    FALLTHROUGH;
3608
0
  case STATE11:
3609
    /* receive the client certificate message */
3610
0
    if (!session->internals.resumed) /* if we are not resuming */
3611
0
      ret = _gnutls_recv_client_certificate(session);
3612
0
    STATE = STATE11;
3613
0
    IMED_RET("recv client certificate", ret, 1);
3614
0
    FALLTHROUGH;
3615
0
  case STATE12:
3616
0
    ret = _gnutls_run_verify_callback(session, GNUTLS_SERVER);
3617
0
    STATE = STATE12;
3618
0
    if (ret < 0)
3619
0
      return gnutls_assert_val(ret);
3620
0
    FALLTHROUGH;
3621
0
  case STATE13:
3622
    /* receive the client key exchange message */
3623
0
    if (!session->internals.resumed) /* if we are not resuming */
3624
0
      ret = _gnutls_recv_client_kx_message(session);
3625
0
    STATE = STATE13;
3626
0
    IMED_RET("recv client kx", ret, 1);
3627
0
    FALLTHROUGH;
3628
0
  case STATE14:
3629
    /* receive the client certificate verify message */
3630
0
    if (!session->internals.resumed) /* if we are not resuming */
3631
0
      ret = _gnutls_recv_client_certificate_verify_message(
3632
0
        session);
3633
0
    STATE = STATE14;
3634
0
    IMED_RET("recv client certificate verify", ret, 1);
3635
0
    FALLTHROUGH;
3636
0
  case STATE15:
3637
0
    STATE = STATE15;
3638
0
    if (!session->internals.resumed) { /* if we are not resuming */
3639
0
      ret = recv_handshake_final(session, true);
3640
0
      IMED_RET("recv handshake final", ret, 1);
3641
0
    } else {
3642
0
      ret = send_handshake_final(session, true);
3643
0
      IMED_RET("send handshake final 2", ret, 1);
3644
0
    }
3645
0
    FALLTHROUGH;
3646
0
  case STATE16:
3647
0
    ret = _gnutls_send_new_session_ticket(session, AGAIN(STATE16));
3648
0
    STATE = STATE16;
3649
0
    IMED_RET("send handshake new session ticket", ret, 0);
3650
0
    FALLTHROUGH;
3651
0
  case STATE17:
3652
0
    STATE = STATE17;
3653
0
    if (!session->internals.resumed) { /* if we are not resuming */
3654
0
      ret = send_handshake_final(session, false);
3655
0
      IMED_RET("send handshake final", ret, 1);
3656
3657
0
      if (session->security_parameters.entity ==
3658
0
            GNUTLS_SERVER &&
3659
0
          !(session->internals.hsk_flags &
3660
0
            HSK_TLS12_TICKET_SENT)) {
3661
        /* if no ticket, save session data */
3662
0
        _gnutls_server_register_current_session(
3663
0
          session);
3664
0
      }
3665
0
    } else {
3666
0
      ret = recv_handshake_final(session, false);
3667
0
      IMED_RET("recv handshake final 2", ret, 1);
3668
0
    }
3669
3670
0
    STATE = STATE0;
3671
0
    FALLTHROUGH;
3672
0
  default:
3673
0
    break;
3674
0
  }
3675
3676
  /* no lock of post_negotiation_lock is required here as this is not run
3677
   * after handshake */
3678
0
  session->internals.initial_negotiation_completed = 1;
3679
3680
0
  return _gnutls_check_id_for_change(session);
3681
0
}
3682
3683
int _gnutls_generate_session_id(uint8_t *session_id, uint8_t *len)
3684
0
{
3685
0
  int ret;
3686
3687
0
  *len = GNUTLS_DEF_SESSION_ID_SIZE;
3688
3689
0
  ret = gnutls_rnd(GNUTLS_RND_NONCE, session_id,
3690
0
       GNUTLS_DEF_SESSION_ID_SIZE);
3691
0
  if (ret < 0) {
3692
0
    gnutls_assert();
3693
0
    return ret;
3694
0
  }
3695
3696
0
  return 0;
3697
0
}
3698
3699
/**
3700
 * gnutls_handshake_set_max_packet_length:
3701
 * @session: is a #gnutls_session_t type.
3702
 * @max: is the maximum number.
3703
 *
3704
 * This function will set the maximum size of all handshake messages.
3705
 * Handshakes over this size are rejected with
3706
 * %GNUTLS_E_HANDSHAKE_TOO_LARGE error code.  The default value is
3707
 * 128kb which is typically large enough.  Set this to 0 if you do not
3708
 * want to set an upper limit.
3709
 *
3710
 * The reason for restricting the handshake message sizes are to
3711
 * limit Denial of Service attacks.
3712
 *
3713
 * Note that the maximum handshake size was increased to 128kb
3714
 * from 48kb in GnuTLS 3.5.5.
3715
 **/
3716
void gnutls_handshake_set_max_packet_length(gnutls_session_t session,
3717
              size_t max)
3718
0
{
3719
0
  session->internals.max_handshake_data_buffer_size = max;
3720
0
}
3721
3722
/**
3723
 * gnutls_handshake_get_last_in:
3724
 * @session: is a #gnutls_session_t type.
3725
 *
3726
 * This function is only useful to check where the last performed
3727
 * handshake failed.  If the previous handshake succeed or was not
3728
 * performed at all then no meaningful value will be returned.
3729
 *
3730
 * Check %gnutls_handshake_description_t in gnutls.h for the
3731
 * available handshake descriptions.
3732
 *
3733
 * Returns: the last handshake message type received, a
3734
 * %gnutls_handshake_description_t.
3735
 **/
3736
gnutls_handshake_description_t
3737
gnutls_handshake_get_last_in(gnutls_session_t session)
3738
0
{
3739
0
  return session->internals.last_handshake_in;
3740
0
}
3741
3742
/**
3743
 * gnutls_handshake_get_last_out:
3744
 * @session: is a #gnutls_session_t type.
3745
 *
3746
 * This function is only useful to check where the last performed
3747
 * handshake failed.  If the previous handshake succeed or was not
3748
 * performed at all then no meaningful value will be returned.
3749
 *
3750
 * Check %gnutls_handshake_description_t in gnutls.h for the
3751
 * available handshake descriptions.
3752
 *
3753
 * Returns: the last handshake message type sent, a
3754
 * %gnutls_handshake_description_t.
3755
 **/
3756
gnutls_handshake_description_t
3757
gnutls_handshake_get_last_out(gnutls_session_t session)
3758
0
{
3759
0
  return session->internals.last_handshake_out;
3760
0
}
3761
3762
/* This returns the session hash as in draft-ietf-tls-session-hash-02.
3763
 */
3764
int _gnutls_handshake_get_session_hash(gnutls_session_t session,
3765
               gnutls_datum_t *shash)
3766
0
{
3767
0
  const version_entry_st *ver = get_version(session);
3768
0
  int ret;
3769
0
  uint8_t concat[2 * MAX_HASH_SIZE];
3770
3771
0
  if (unlikely(ver == NULL))
3772
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
3773
3774
0
  if (session->internals.handshake_hash_buffer_client_kx_len == 0 ||
3775
0
      (session->internals.handshake_hash_buffer.length <
3776
0
       session->internals.handshake_hash_buffer_client_kx_len)) {
3777
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
3778
0
  }
3779
3780
0
  ret = _gnutls_hash_fast(
3781
0
    (gnutls_digest_algorithm_t)session->security_parameters.prf->id,
3782
0
    session->internals.handshake_hash_buffer.data,
3783
0
    session->internals.handshake_hash_buffer_client_kx_len, concat);
3784
0
  if (ret < 0)
3785
0
    return gnutls_assert_val(ret);
3786
3787
0
  return _gnutls_set_datum(shash, concat,
3788
0
         session->security_parameters.prf->output_size);
3789
0
}