Coverage Report

Created: 2025-11-16 06:28

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