Coverage Report

Created: 2026-08-14 06:46

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