Coverage Report

Created: 2024-11-25 06:29

/src/gnutls/lib/constate.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (C) 2001-2012 Free Software Foundation, Inc.
3
 * Copyright (C) 2017 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 are supposed to run after the handshake procedure is
25
 * finished. These functions activate the established security parameters.
26
 */
27
28
#include "gnutls_int.h"
29
#include "constate.h"
30
#include "errors.h"
31
#include "fips.h"
32
#include "kx.h"
33
#include "algorithms.h"
34
#include "num.h"
35
#include "datum.h"
36
#include "state.h"
37
#include "hello_ext.h"
38
#include "buffers.h"
39
#include "dtls.h"
40
#include "secrets.h"
41
#include "handshake.h"
42
#include "crypto-api.h"
43
#include "locks.h"
44
45
static const char keyexp[] = "key expansion";
46
static const int keyexp_length = sizeof(keyexp) - 1;
47
48
static int _tls13_init_record_state(gnutls_cipher_algorithm_t algo,
49
            record_state_st *state);
50
51
/* This function is to be called after handshake, when master_secret,
52
 *  client_random and server_random have been initialized. 
53
 * This function creates the keys and stores them into pending session.
54
 * (session->cipher_specs)
55
 */
56
static int _gnutls_set_keys(gnutls_session_t session,
57
          record_parameters_st *params, unsigned hash_size,
58
          unsigned IV_size, unsigned key_size)
59
128
{
60
128
  uint8_t rnd[2 * GNUTLS_RANDOM_SIZE];
61
128
  int pos, ret;
62
128
  int block_size;
63
128
  char buf[4 * MAX_HASH_SIZE + 4 * MAX_CIPHER_KEY_SIZE +
64
128
     4 * MAX_CIPHER_BLOCK_SIZE];
65
  /* avoid using malloc */
66
128
  uint8_t key_block[2 * MAX_HASH_SIZE + 2 * MAX_CIPHER_KEY_SIZE +
67
128
        2 * MAX_CIPHER_BLOCK_SIZE];
68
128
  record_state_st *client_write, *server_write;
69
70
128
  if (session->security_parameters.entity == GNUTLS_CLIENT) {
71
0
    client_write = &params->write;
72
0
    server_write = &params->read;
73
128
  } else {
74
128
    client_write = &params->read;
75
128
    server_write = &params->write;
76
128
  }
77
78
128
  block_size = 2 * hash_size + 2 * key_size;
79
128
  block_size += 2 * IV_size;
80
81
128
  memcpy(rnd, session->security_parameters.server_random,
82
128
         GNUTLS_RANDOM_SIZE);
83
128
  memcpy(&rnd[GNUTLS_RANDOM_SIZE],
84
128
         session->security_parameters.client_random, GNUTLS_RANDOM_SIZE);
85
86
128
  _gnutls_memory_mark_defined(session->security_parameters.master_secret,
87
128
            GNUTLS_MASTER_SIZE);
88
#ifdef ENABLE_SSL3
89
  if (get_num_version(session) == GNUTLS_SSL3) { /* SSL 3 */
90
    ret = _gnutls_ssl3_generate_random(
91
      session->security_parameters.master_secret,
92
      GNUTLS_MASTER_SIZE, rnd, 2 * GNUTLS_RANDOM_SIZE,
93
      block_size, key_block);
94
  } else /* TLS 1.0+ */
95
#endif
96
128
    ret = _gnutls_PRF(session,
97
128
          session->security_parameters.master_secret,
98
128
          GNUTLS_MASTER_SIZE, keyexp, keyexp_length,
99
128
          rnd, 2 * GNUTLS_RANDOM_SIZE, block_size,
100
128
          key_block);
101
102
128
  if (ret < 0) {
103
0
    _gnutls_memory_mark_undefined(
104
0
      session->security_parameters.master_secret,
105
0
      GNUTLS_MASTER_SIZE);
106
0
    return gnutls_assert_val(ret);
107
0
  }
108
109
128
  _gnutls_hard_log("INT: KEY BLOCK[%d]: %s\n", block_size,
110
128
       _gnutls_bin2hex(key_block, block_size, buf,
111
128
           sizeof(buf), NULL));
112
113
128
  pos = 0;
114
128
  if (hash_size > 0) {
115
33
    assert(hash_size <= sizeof(client_write->mac_key));
116
33
    client_write->mac_key_size = hash_size;
117
33
    memcpy(client_write->mac_key, &key_block[pos], hash_size);
118
119
33
    pos += hash_size;
120
121
33
    server_write->mac_key_size = hash_size;
122
33
    memcpy(server_write->mac_key, &key_block[pos], hash_size);
123
124
33
    pos += hash_size;
125
126
33
    _gnutls_hard_log("INT: CLIENT MAC KEY [%d]: %s\n",
127
33
         client_write->mac_key_size,
128
33
         _gnutls_bin2hex(client_write->mac_key,
129
33
             hash_size, buf, sizeof(buf),
130
33
             NULL));
131
132
33
    _gnutls_hard_log("INT: SERVER MAC KEY [%d]: %s\n",
133
33
         server_write->mac_key_size,
134
33
         _gnutls_bin2hex(server_write->mac_key,
135
33
             hash_size, buf, sizeof(buf),
136
33
             NULL));
137
33
  }
138
139
128
  if (key_size > 0) {
140
128
    assert(key_size <= sizeof(client_write->key));
141
128
    client_write->key_size = key_size;
142
128
    memcpy(client_write->key, &key_block[pos], key_size);
143
144
128
    pos += key_size;
145
146
128
    server_write->key_size = key_size;
147
128
    memcpy(server_write->key, &key_block[pos], key_size);
148
149
128
    pos += key_size;
150
151
128
    _gnutls_hard_log("INT: CLIENT WRITE KEY [%d]: %s\n", key_size,
152
128
         _gnutls_bin2hex(client_write->key, key_size,
153
128
             buf, sizeof(buf), NULL));
154
155
128
    _gnutls_hard_log("INT: SERVER WRITE KEY [%d]: %s\n", key_size,
156
128
         _gnutls_bin2hex(server_write->key, key_size,
157
128
             buf, sizeof(buf), NULL));
158
128
  }
159
160
  /* IV generation in export and non export ciphers.
161
   */
162
128
  if (IV_size > 0) {
163
128
    assert(IV_size <= sizeof(client_write->iv));
164
165
128
    client_write->iv_size = IV_size;
166
128
    memcpy(client_write->iv, &key_block[pos], IV_size);
167
168
128
    pos += IV_size;
169
170
128
    server_write->iv_size = IV_size;
171
128
    memcpy(server_write->iv, &key_block[pos], IV_size);
172
173
128
    _gnutls_hard_log("INT: CLIENT WRITE IV [%d]: %s\n",
174
128
         client_write->iv_size,
175
128
         _gnutls_bin2hex(client_write->iv,
176
128
             client_write->iv_size, buf,
177
128
             sizeof(buf), NULL));
178
179
128
    _gnutls_hard_log("INT: SERVER WRITE IV [%d]: %s\n",
180
128
         server_write->iv_size,
181
128
         _gnutls_bin2hex(server_write->iv,
182
128
             server_write->iv_size, buf,
183
128
             sizeof(buf), NULL));
184
128
  }
185
186
128
  return 0;
187
128
}
188
189
static int _tls13_update_keys(gnutls_session_t session, hs_stage_t stage,
190
            record_parameters_st *params, unsigned iv_size,
191
            unsigned key_size)
192
0
{
193
0
  uint8_t key_block[MAX_CIPHER_KEY_SIZE];
194
0
  uint8_t iv_block[MAX_CIPHER_IV_SIZE];
195
0
  char buf[65];
196
0
  record_state_st *upd_state;
197
0
  record_parameters_st *prev = NULL;
198
0
  int ret;
199
200
  /* generate new keys for direction needed and copy old from previous epoch */
201
202
0
  if (stage == STAGE_UPD_OURS) {
203
0
    upd_state = &params->write;
204
205
0
    ret = _gnutls_epoch_get(session, EPOCH_READ_CURRENT, &prev);
206
0
    if (ret < 0)
207
0
      return gnutls_assert_val(ret);
208
0
    assert(prev != NULL);
209
210
0
    params->read.sequence_number = prev->read.sequence_number;
211
212
0
    params->read.key_size = prev->read.key_size;
213
0
    memcpy(params->read.key, prev->read.key, prev->read.key_size);
214
215
0
    _gnutls_hard_log(
216
0
      "INT: READ KEY [%d]: %s\n", params->read.key_size,
217
0
      _gnutls_bin2hex(params->read.key, params->read.key_size,
218
0
          buf, sizeof(buf), NULL));
219
220
0
    params->read.iv_size = prev->read.iv_size;
221
0
    memcpy(params->read.iv, prev->read.iv, prev->read.key_size);
222
223
0
    _gnutls_hard_log(
224
0
      "INT: READ IV [%d]: %s\n", params->read.iv_size,
225
0
      _gnutls_bin2hex(params->read.iv, params->read.iv_size,
226
0
          buf, sizeof(buf), NULL));
227
0
  } else {
228
0
    upd_state = &params->read;
229
230
0
    ret = _gnutls_epoch_get(session, EPOCH_WRITE_CURRENT, &prev);
231
0
    if (ret < 0)
232
0
      return gnutls_assert_val(ret);
233
0
    assert(prev != NULL);
234
235
0
    params->write.sequence_number = prev->write.sequence_number;
236
237
0
    params->write.key_size = prev->write.key_size;
238
0
    memcpy(params->write.key, prev->write.key,
239
0
           prev->write.key_size);
240
241
0
    _gnutls_hard_log("INT: WRITE KEY [%d]: %s\n",
242
0
         params->write.key_size,
243
0
         _gnutls_bin2hex(params->write.key,
244
0
             params->write.key_size, buf,
245
0
             sizeof(buf), NULL));
246
247
0
    params->write.iv_size = prev->write.iv_size;
248
0
    memcpy(params->write.iv, prev->write.iv, prev->write.iv_size);
249
250
0
    _gnutls_hard_log(
251
0
      "INT: WRITE IV [%d]: %s\n", params->write.iv_size,
252
0
      _gnutls_bin2hex(params->write.iv, params->write.iv_size,
253
0
          buf, sizeof(buf), NULL));
254
0
  }
255
256
0
  if ((session->security_parameters.entity == GNUTLS_CLIENT &&
257
0
       stage == STAGE_UPD_OURS) ||
258
0
      (session->security_parameters.entity == GNUTLS_SERVER &&
259
0
       stage == STAGE_UPD_PEERS)) {
260
    /* client keys */
261
0
    ret = _tls13_expand_secret(
262
0
      session, APPLICATION_TRAFFIC_UPDATE,
263
0
      sizeof(APPLICATION_TRAFFIC_UPDATE) - 1, NULL, 0,
264
0
      session->key.proto.tls13.ap_ckey,
265
0
      session->security_parameters.prf->output_size,
266
0
      session->key.proto.tls13.ap_ckey);
267
0
    if (ret < 0)
268
0
      return gnutls_assert_val(ret);
269
270
0
    ret = _tls13_expand_secret(session, "key", 3, NULL, 0,
271
0
             session->key.proto.tls13.ap_ckey,
272
0
             key_size, key_block);
273
0
    if (ret < 0)
274
0
      return gnutls_assert_val(ret);
275
276
0
    ret = _tls13_expand_secret(session, "iv", 2, NULL, 0,
277
0
             session->key.proto.tls13.ap_ckey,
278
0
             iv_size, iv_block);
279
0
    if (ret < 0)
280
0
      return gnutls_assert_val(ret);
281
0
  } else {
282
0
    ret = _tls13_expand_secret(
283
0
      session, APPLICATION_TRAFFIC_UPDATE,
284
0
      sizeof(APPLICATION_TRAFFIC_UPDATE) - 1, NULL, 0,
285
0
      session->key.proto.tls13.ap_skey,
286
0
      session->security_parameters.prf->output_size,
287
0
      session->key.proto.tls13.ap_skey);
288
0
    if (ret < 0)
289
0
      return gnutls_assert_val(ret);
290
291
0
    ret = _tls13_expand_secret(session, "key", 3, NULL, 0,
292
0
             session->key.proto.tls13.ap_skey,
293
0
             key_size, key_block);
294
0
    if (ret < 0)
295
0
      return gnutls_assert_val(ret);
296
297
0
    ret = _tls13_expand_secret(session, "iv", 2, NULL, 0,
298
0
             session->key.proto.tls13.ap_skey,
299
0
             iv_size, iv_block);
300
0
    if (ret < 0)
301
0
      return gnutls_assert_val(ret);
302
0
  }
303
304
0
  upd_state->mac_key_size = 0;
305
306
0
  assert(key_size <= sizeof(upd_state->key));
307
0
  memcpy(upd_state->key, key_block, key_size);
308
0
  upd_state->key_size = key_size;
309
310
0
  _gnutls_hard_log(
311
0
    "INT: NEW %s KEY [%d]: %s\n",
312
0
    (upd_state == &params->read) ? "READ" : "WRITE", key_size,
313
0
    _gnutls_bin2hex(key_block, key_size, buf, sizeof(buf), NULL));
314
315
0
  if (iv_size > 0) {
316
0
    assert(iv_size <= sizeof(upd_state->iv));
317
0
    memcpy(upd_state->iv, iv_block, iv_size);
318
0
    upd_state->iv_size = iv_size;
319
320
0
    _gnutls_hard_log("INT: NEW %s IV [%d]: %s\n",
321
0
         (upd_state == &params->read) ? "READ" :
322
0
                "WRITE",
323
0
         iv_size,
324
0
         _gnutls_bin2hex(iv_block, iv_size, buf,
325
0
             sizeof(buf), NULL));
326
0
  }
327
328
0
  return 0;
329
0
}
330
331
static int _tls13_set_early_keys(gnutls_session_t session,
332
         record_parameters_st *params, unsigned iv_size,
333
         unsigned key_size)
334
0
{
335
0
  uint8_t key_block[MAX_CIPHER_KEY_SIZE];
336
0
  uint8_t iv_block[MAX_CIPHER_IV_SIZE];
337
0
  char buf[65];
338
0
  record_state_st *early_state;
339
0
  int ret;
340
341
0
  if (session->security_parameters.entity == GNUTLS_CLIENT &&
342
0
      !(session->internals.hsk_flags & HSK_TLS13_TICKET_SENT)) {
343
0
    return GNUTLS_E_INVALID_REQUEST;
344
0
  }
345
346
0
  ret = _tls13_expand_secret2(
347
0
    session->internals.resumed_security_parameters.prf, "key", 3,
348
0
    NULL, 0, session->key.proto.tls13.e_ckey, key_size, key_block);
349
0
  if (ret < 0)
350
0
    return gnutls_assert_val(ret);
351
352
0
  ret = _tls13_expand_secret2(
353
0
    session->internals.resumed_security_parameters.prf, "iv", 2,
354
0
    NULL, 0, session->key.proto.tls13.e_ckey, iv_size, iv_block);
355
0
  if (ret < 0)
356
0
    return gnutls_assert_val(ret);
357
358
0
  if (session->security_parameters.entity == GNUTLS_CLIENT) {
359
0
    early_state = &params->write;
360
0
  } else {
361
0
    early_state = &params->read;
362
0
  }
363
364
0
  early_state->mac_key_size = 0;
365
366
0
  assert(key_size <= sizeof(early_state->key));
367
0
  memcpy(early_state->key, key_block, key_size);
368
0
  early_state->key_size = key_size;
369
370
0
  _gnutls_hard_log("INT: EARLY KEY [%d]: %s\n", key_size,
371
0
       _gnutls_bin2hex(key_block, key_size, buf, sizeof(buf),
372
0
           NULL));
373
374
0
  if (iv_size > 0) {
375
0
    assert(iv_size <= sizeof(early_state->iv));
376
0
    memcpy(early_state->iv, iv_block, iv_size);
377
0
    early_state->iv_size = iv_size;
378
379
0
    _gnutls_hard_log("INT: EARLY IV [%d]: %s\n", iv_size,
380
0
         _gnutls_bin2hex(iv_block, iv_size, buf,
381
0
             sizeof(buf), NULL));
382
0
  }
383
384
0
  return 0;
385
0
}
386
387
static int _tls13_set_keys(gnutls_session_t session, hs_stage_t stage,
388
         record_parameters_st *params, unsigned iv_size,
389
         unsigned key_size)
390
1.10k
{
391
1.10k
  uint8_t ckey_block[MAX_CIPHER_KEY_SIZE];
392
1.10k
  uint8_t civ_block[MAX_CIPHER_IV_SIZE];
393
1.10k
  uint8_t skey_block[MAX_CIPHER_KEY_SIZE];
394
1.10k
  uint8_t siv_block[MAX_CIPHER_IV_SIZE];
395
1.10k
  char buf[65];
396
1.10k
  record_state_st *client_write, *server_write;
397
1.10k
  const char *label;
398
1.10k
  unsigned label_size, hsk_len;
399
1.10k
  const char *keylog_label;
400
1.10k
  void *ckey, *skey;
401
1.10k
  int ret;
402
403
1.10k
  if (stage == STAGE_UPD_OURS || stage == STAGE_UPD_PEERS)
404
0
    return _tls13_update_keys(session, stage, params, iv_size,
405
0
            key_size);
406
407
1.10k
  else if (stage == STAGE_EARLY)
408
0
    return _tls13_set_early_keys(session, params, iv_size,
409
0
               key_size);
410
411
1.10k
  else if (stage == STAGE_HS) {
412
553
    label = HANDSHAKE_CLIENT_TRAFFIC_LABEL;
413
553
    label_size = sizeof(HANDSHAKE_CLIENT_TRAFFIC_LABEL) - 1;
414
553
    hsk_len = session->internals.handshake_hash_buffer.length;
415
553
    keylog_label = "CLIENT_HANDSHAKE_TRAFFIC_SECRET";
416
553
    ckey = session->key.proto.tls13.hs_ckey;
417
553
  } else {
418
553
    label = APPLICATION_CLIENT_TRAFFIC_LABEL;
419
553
    label_size = sizeof(APPLICATION_CLIENT_TRAFFIC_LABEL) - 1;
420
553
    hsk_len = session->internals
421
553
          .handshake_hash_buffer_server_finished_len;
422
553
    keylog_label = "CLIENT_TRAFFIC_SECRET_0";
423
553
    ckey = session->key.proto.tls13.ap_ckey;
424
553
  }
425
426
1.10k
  ret = _tls13_derive_secret(
427
1.10k
    session, label, label_size,
428
1.10k
    session->internals.handshake_hash_buffer.data, hsk_len,
429
1.10k
    session->key.proto.tls13.temp_secret, ckey);
430
1.10k
  if (ret < 0)
431
0
    return gnutls_assert_val(ret);
432
433
1.10k
  ret = _gnutls_call_keylog_func(
434
1.10k
    session, keylog_label, ckey,
435
1.10k
    session->security_parameters.prf->output_size);
436
1.10k
  if (ret < 0)
437
0
    return gnutls_assert_val(ret);
438
439
  /* client keys */
440
1.10k
  ret = _tls13_expand_secret(session, "key", 3, NULL, 0, ckey, key_size,
441
1.10k
           ckey_block);
442
1.10k
  if (ret < 0)
443
0
    return gnutls_assert_val(ret);
444
445
1.10k
  ret = _tls13_expand_secret(session, "iv", 2, NULL, 0, ckey, iv_size,
446
1.10k
           civ_block);
447
1.10k
  if (ret < 0)
448
0
    return gnutls_assert_val(ret);
449
450
  /* server keys */
451
1.10k
  if (stage == STAGE_HS) {
452
553
    label = HANDSHAKE_SERVER_TRAFFIC_LABEL;
453
553
    label_size = sizeof(HANDSHAKE_SERVER_TRAFFIC_LABEL) - 1;
454
553
    keylog_label = "SERVER_HANDSHAKE_TRAFFIC_SECRET";
455
553
    skey = session->key.proto.tls13.hs_skey;
456
553
  } else {
457
553
    label = APPLICATION_SERVER_TRAFFIC_LABEL;
458
553
    label_size = sizeof(APPLICATION_SERVER_TRAFFIC_LABEL) - 1;
459
553
    keylog_label = "SERVER_TRAFFIC_SECRET_0";
460
553
    skey = session->key.proto.tls13.ap_skey;
461
553
  }
462
463
1.10k
  ret = _tls13_derive_secret(
464
1.10k
    session, label, label_size,
465
1.10k
    session->internals.handshake_hash_buffer.data, hsk_len,
466
1.10k
    session->key.proto.tls13.temp_secret, skey);
467
468
1.10k
  if (ret < 0)
469
0
    return gnutls_assert_val(ret);
470
471
1.10k
  ret = _gnutls_call_keylog_func(
472
1.10k
    session, keylog_label, skey,
473
1.10k
    session->security_parameters.prf->output_size);
474
1.10k
  if (ret < 0)
475
0
    return gnutls_assert_val(ret);
476
477
1.10k
  ret = _tls13_expand_secret(session, "key", 3, NULL, 0, skey, key_size,
478
1.10k
           skey_block);
479
1.10k
  if (ret < 0)
480
0
    return gnutls_assert_val(ret);
481
482
1.10k
  ret = _tls13_expand_secret(session, "iv", 2, NULL, 0, skey, iv_size,
483
1.10k
           siv_block);
484
1.10k
  if (ret < 0)
485
0
    return gnutls_assert_val(ret);
486
487
1.10k
  if (session->security_parameters.entity == GNUTLS_CLIENT) {
488
0
    client_write = &params->write;
489
0
    server_write = &params->read;
490
1.10k
  } else {
491
1.10k
    client_write = &params->read;
492
1.10k
    server_write = &params->write;
493
1.10k
  }
494
495
1.10k
  client_write->mac_key_size = 0;
496
1.10k
  server_write->mac_key_size = 0;
497
498
1.10k
  assert(key_size <= sizeof(client_write->key));
499
1.10k
  memcpy(client_write->key, ckey_block, key_size);
500
1.10k
  client_write->key_size = key_size;
501
502
1.10k
  _gnutls_hard_log("INT: CLIENT WRITE KEY [%d]: %s\n", key_size,
503
1.10k
       _gnutls_bin2hex(ckey_block, key_size, buf, sizeof(buf),
504
1.10k
           NULL));
505
506
1.10k
  memcpy(server_write->key, skey_block, key_size);
507
1.10k
  server_write->key_size = key_size;
508
509
1.10k
  _gnutls_hard_log("INT: SERVER WRITE KEY [%d]: %s\n", key_size,
510
1.10k
       _gnutls_bin2hex(skey_block, key_size, buf, sizeof(buf),
511
1.10k
           NULL));
512
513
1.10k
  if (iv_size > 0) {
514
1.10k
    assert(iv_size <= sizeof(client_write->iv));
515
1.10k
    memcpy(client_write->iv, civ_block, iv_size);
516
1.10k
    client_write->iv_size = iv_size;
517
518
1.10k
    _gnutls_hard_log("INT: CLIENT WRITE IV [%d]: %s\n", iv_size,
519
1.10k
         _gnutls_bin2hex(civ_block, iv_size, buf,
520
1.10k
             sizeof(buf), NULL));
521
522
1.10k
    memcpy(server_write->iv, siv_block, iv_size);
523
1.10k
    server_write->iv_size = iv_size;
524
525
1.10k
    _gnutls_hard_log("INT: SERVER WRITE IV [%d]: %s\n", iv_size,
526
1.10k
         _gnutls_bin2hex(siv_block, iv_size, buf,
527
1.10k
             sizeof(buf), NULL));
528
1.10k
  }
529
530
1.10k
  client_write->level = server_write->level =
531
1.10k
    stage == STAGE_HS ? GNUTLS_ENCRYPTION_LEVEL_HANDSHAKE :
532
1.10k
            GNUTLS_ENCRYPTION_LEVEL_APPLICATION;
533
534
1.10k
  return 0;
535
1.10k
}
536
537
static int _gnutls_init_record_state(record_parameters_st *params,
538
             const version_entry_st *ver, int read,
539
             record_state_st *state)
540
256
{
541
256
  int ret;
542
256
  gnutls_datum_t *iv = NULL, _iv;
543
256
  gnutls_datum_t key;
544
256
  gnutls_datum_t mac;
545
546
256
  _iv.data = state->iv;
547
256
  _iv.size = state->iv_size;
548
549
256
  key.data = state->key;
550
256
  key.size = state->key_size;
551
552
256
  mac.data = state->mac_key;
553
256
  mac.size = state->mac_key_size;
554
555
256
  if (_gnutls_cipher_type(params->cipher) == CIPHER_BLOCK) {
556
66
    if (!_gnutls_version_has_explicit_iv(ver))
557
18
      iv = &_iv;
558
190
  } else if (_gnutls_cipher_type(params->cipher) == CIPHER_STREAM) {
559
    /* To handle GOST ciphersuites */
560
0
    if (_gnutls_cipher_get_implicit_iv_size(params->cipher))
561
0
      iv = &_iv;
562
0
  }
563
564
256
  ret = _gnutls_auth_cipher_init(&state->ctx.tls12, params->cipher, &key,
565
256
               iv, params->mac, &mac, params->etm,
566
#ifdef ENABLE_SSL3
567
               (ver->id == GNUTLS_SSL3) ? 1 : 0,
568
#endif
569
256
               1 - read /*1==encrypt */);
570
256
  if (ret < 0 && params->cipher->id != GNUTLS_CIPHER_NULL) {
571
0
    _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_ERROR);
572
0
    return gnutls_assert_val(ret);
573
0
  }
574
575
256
  if (is_cipher_algo_allowed(params->cipher->id))
576
256
    _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_APPROVED);
577
0
  else
578
0
    _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_NOT_APPROVED);
579
580
256
  return 0;
581
256
}
582
583
int _gnutls_set_cipher_suite2(gnutls_session_t session,
584
            const gnutls_cipher_suite_entry_st *cs)
585
2.40k
{
586
2.40k
  const cipher_entry_st *cipher_algo;
587
2.40k
  const mac_entry_st *mac_algo;
588
2.40k
  record_parameters_st *params;
589
2.40k
  int ret;
590
2.40k
  const version_entry_st *ver = get_version(session);
591
592
2.40k
  ret = _gnutls_epoch_get(session, EPOCH_NEXT, &params);
593
2.40k
  if (ret < 0)
594
0
    return gnutls_assert_val(ret);
595
596
2.40k
  cipher_algo = cipher_to_entry(cs->block_algorithm);
597
2.40k
  mac_algo = mac_to_entry(cs->mac_algorithm);
598
599
2.40k
  if (ver->tls13_sem && (session->internals.hsk_flags & HSK_HRR_SENT)) {
600
14
    if (params->initialized &&
601
14
        (params->cipher != cipher_algo || params->mac != mac_algo ||
602
0
         cs != session->security_parameters.cs))
603
0
      return gnutls_assert_val(
604
14
        GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER);
605
606
14
    return 0;
607
14
  }
608
609
  /* The params shouldn't have been initialized at this point, unless we
610
   * are doing trial encryption/decryption of early data.
611
   */
612
2.38k
  if (unlikely(
613
2.38k
        !((session->internals.hsk_flags & HSK_EARLY_DATA_IN_FLIGHT &&
614
2.38k
           !IS_SERVER(session)) ||
615
2.38k
          (session->internals.hsk_flags & HSK_EARLY_DATA_ACCEPTED &&
616
2.38k
           IS_SERVER(session))) &&
617
2.38k
        (params->initialized || params->cipher != NULL ||
618
2.38k
         params->mac != NULL))) {
619
12
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
620
12
  }
621
622
2.37k
  if (_gnutls_cipher_is_ok(cipher_algo) == 0 ||
623
2.37k
      _gnutls_mac_is_ok(mac_algo) == 0)
624
0
    return gnutls_assert_val(GNUTLS_E_UNWANTED_ALGORITHM);
625
626
2.37k
  if (_gnutls_version_has_selectable_prf(get_version(session))) {
627
2.35k
    if (cs->prf == GNUTLS_MAC_UNKNOWN ||
628
2.35k
        _gnutls_mac_is_ok(mac_to_entry(cs->prf)) == 0)
629
0
      return gnutls_assert_val(GNUTLS_E_UNWANTED_ALGORITHM);
630
2.35k
    session->security_parameters.prf = mac_to_entry(cs->prf);
631
2.35k
  } else {
632
24
    session->security_parameters.prf =
633
24
      mac_to_entry(GNUTLS_MAC_MD5_SHA1);
634
24
  }
635
636
2.37k
  session->security_parameters.cs = cs;
637
2.37k
  params->cipher = cipher_algo;
638
2.37k
  params->mac = mac_algo;
639
640
2.37k
  return 0;
641
2.37k
}
642
643
/* Sets the next epoch to be a clone of the current one.
644
 * The keys are not cloned, only the cipher and MAC.
645
 */
646
int _gnutls_epoch_dup(gnutls_session_t session, unsigned int epoch_rel)
647
553
{
648
553
  record_parameters_st *prev;
649
553
  record_parameters_st *next;
650
553
  int ret;
651
652
553
  ret = _gnutls_epoch_get(session, epoch_rel, &prev);
653
553
  if (ret < 0)
654
0
    return gnutls_assert_val(ret);
655
656
553
  ret = _gnutls_epoch_get(session, EPOCH_NEXT, &next);
657
553
  if (ret < 0) {
658
553
    ret = _gnutls_epoch_setup_next(session, 0, &next);
659
553
    if (ret < 0)
660
0
      return gnutls_assert_val(ret);
661
553
  }
662
663
553
  if (next->initialized || next->cipher != NULL || next->mac != NULL)
664
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
665
666
553
  next->cipher = prev->cipher;
667
553
  next->mac = prev->mac;
668
669
553
  return 0;
670
553
}
671
672
int _gnutls_epoch_set_keys(gnutls_session_t session, uint16_t epoch,
673
         hs_stage_t stage)
674
1.23k
{
675
1.23k
  int hash_size;
676
1.23k
  int IV_size;
677
1.23k
  int key_size;
678
1.23k
  record_parameters_st *params;
679
1.23k
  int ret;
680
1.23k
  const version_entry_st *ver =
681
1.23k
    stage == STAGE_EARLY && !IS_SERVER(session) ?
682
0
      session->internals.resumed_security_parameters.pversion :
683
1.23k
      get_version(session);
684
685
1.23k
  if (unlikely(ver == NULL))
686
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
687
688
1.23k
  ret = _gnutls_epoch_get(session, epoch, &params);
689
1.23k
  if (ret < 0)
690
0
    return gnutls_assert_val(ret);
691
692
1.23k
  if (params->initialized)
693
0
    return 0;
694
695
1.23k
  _gnutls_record_log("REC[%p]: Initializing epoch #%u\n", session,
696
1.23k
         params->epoch);
697
698
1.23k
  if (_gnutls_cipher_is_ok(params->cipher) == 0 ||
699
1.23k
      _gnutls_mac_is_ok(params->mac) == 0)
700
0
    return gnutls_assert_val(GNUTLS_E_UNWANTED_ALGORITHM);
701
702
1.23k
  if (_gnutls_version_has_explicit_iv(ver) &&
703
1.23k
      (_gnutls_cipher_type(params->cipher) != CIPHER_BLOCK)) {
704
95
    IV_size = _gnutls_cipher_get_implicit_iv_size(params->cipher);
705
1.13k
  } else {
706
1.13k
    IV_size = _gnutls_cipher_get_iv_size(params->cipher);
707
1.13k
  }
708
709
1.23k
  key_size = _gnutls_cipher_get_key_size(params->cipher);
710
1.23k
  hash_size = _gnutls_mac_get_key_size(params->mac);
711
1.23k
  params->etm = session->security_parameters.etm;
712
713
1.23k
  if (ver->tls13_sem) {
714
1.10k
    ret = _tls13_set_keys(session, stage, params, IV_size,
715
1.10k
              key_size);
716
1.10k
    if (ret < 0)
717
0
      return gnutls_assert_val(ret);
718
719
1.10k
    if (stage != STAGE_EARLY ||
720
1.10k
        session->security_parameters.entity == GNUTLS_SERVER) {
721
1.10k
      ret = _tls13_init_record_state(params->cipher->id,
722
1.10k
                   &params->read);
723
1.10k
      if (ret < 0)
724
0
        return gnutls_assert_val(ret);
725
1.10k
    }
726
727
1.10k
    if (stage != STAGE_EARLY ||
728
1.10k
        session->security_parameters.entity == GNUTLS_CLIENT) {
729
1.10k
      ret = _tls13_init_record_state(params->cipher->id,
730
1.10k
                   &params->write);
731
1.10k
      if (ret < 0)
732
0
        return gnutls_assert_val(ret);
733
1.10k
    }
734
1.10k
  } else {
735
128
    ret = _gnutls_set_keys(session, params, hash_size, IV_size,
736
128
               key_size);
737
128
    if (ret < 0)
738
0
      return gnutls_assert_val(ret);
739
740
128
    ret = _gnutls_init_record_state(params, ver, 1, &params->read);
741
128
    if (ret < 0)
742
0
      return gnutls_assert_val(ret);
743
744
128
    ret = _gnutls_init_record_state(params, ver, 0, &params->write);
745
128
    if (ret < 0)
746
0
      return gnutls_assert_val(ret);
747
128
  }
748
749
  /* The TLS1.3 limit of 256 additional bytes is also enforced under CBC
750
   * ciphers to ensure we interoperate with gnutls 2.12.x which could add padding
751
   * data exceeding the maximum. */
752
1.23k
  if (ver->tls13_sem ||
753
1.23k
      _gnutls_cipher_type(params->cipher) == CIPHER_BLOCK) {
754
1.13k
    session->internals.max_recv_size = 256;
755
1.13k
  } else {
756
95
    session->internals.max_recv_size = 0;
757
95
  }
758
759
1.23k
  if (!ver->tls13_sem) {
760
128
    session->internals.max_recv_size += _gnutls_record_overhead(
761
128
      ver, params->cipher, params->mac, 1);
762
128
    if (session->internals.allow_large_records != 0)
763
0
      session->internals.max_recv_size += EXTRA_COMP_SIZE;
764
128
  }
765
766
1.23k
  session->internals.max_recv_size +=
767
1.23k
    session->security_parameters.max_record_recv_size +
768
1.23k
    RECORD_HEADER_SIZE(session);
769
770
1.23k
  _dtls_reset_window(params);
771
772
1.23k
  _gnutls_record_log("REC[%p]: Epoch #%u ready\n", session,
773
1.23k
         params->epoch);
774
775
1.23k
  params->initialized = 1;
776
1.23k
  return 0;
777
1.23k
}
778
779
void _gnutls_set_resumed_parameters(gnutls_session_t session)
780
0
{
781
0
  security_parameters_st *src =
782
0
    &session->internals.resumed_security_parameters;
783
0
  security_parameters_st *dst = &session->security_parameters;
784
0
  const version_entry_st *ver = get_version(session);
785
786
  /* Under TLS 1.3, these values are items which are not
787
   * negotiated on the subsequent session. */
788
0
  if (!ver->tls13_sem) {
789
0
    dst->cs = src->cs;
790
0
    _gnutls_memory_mark_defined(dst->master_secret,
791
0
              GNUTLS_MASTER_SIZE);
792
0
    memcpy(dst->master_secret, src->master_secret,
793
0
           GNUTLS_MASTER_SIZE);
794
0
    _gnutls_memory_mark_defined(dst->client_random,
795
0
              GNUTLS_RANDOM_SIZE);
796
0
    memcpy(dst->client_random, src->client_random,
797
0
           GNUTLS_RANDOM_SIZE);
798
0
    _gnutls_memory_mark_defined(dst->server_random,
799
0
              GNUTLS_RANDOM_SIZE);
800
0
    memcpy(dst->server_random, src->server_random,
801
0
           GNUTLS_RANDOM_SIZE);
802
0
    dst->ext_master_secret = src->ext_master_secret;
803
0
    dst->etm = src->etm;
804
0
    dst->prf = src->prf;
805
0
    dst->grp = src->grp;
806
0
    dst->pversion = src->pversion;
807
0
  }
808
0
  memcpy(dst->session_id, src->session_id, GNUTLS_MAX_SESSION_ID_SIZE);
809
0
  dst->session_id_size = src->session_id_size;
810
0
  dst->timestamp = src->timestamp;
811
0
  dst->client_ctype = src->client_ctype;
812
0
  dst->server_ctype = src->server_ctype;
813
0
  dst->client_auth_type = src->client_auth_type;
814
0
  dst->server_auth_type = src->server_auth_type;
815
816
0
  if (!ver->tls13_sem && !(session->internals.hsk_flags &
817
0
         HSK_RECORD_SIZE_LIMIT_NEGOTIATED)) {
818
0
    dst->max_record_recv_size = src->max_record_recv_size;
819
0
    dst->max_record_send_size = src->max_record_send_size;
820
0
  }
821
0
}
822
823
/* Sets the current connection session to conform with the
824
 * Security parameters(pending session), and initializes encryption.
825
 * Actually it initializes and starts encryption ( so it needs
826
 * secrets and random numbers to have been negotiated)
827
 * This is to be called after sending the Change Cipher Spec packet.
828
 */
829
int _gnutls_connection_state_init(gnutls_session_t session)
830
128
{
831
128
  int ret;
832
833
  /* Setup the master secret 
834
 */
835
128
  if ((ret = _gnutls_generate_master(session, 0)) < 0)
836
0
    return gnutls_assert_val(ret);
837
838
128
  return 0;
839
128
}
840
841
/* Initializes the read connection session
842
 * (read encrypted data)
843
 */
844
int _gnutls_read_connection_state_init(gnutls_session_t session)
845
128
{
846
128
  const uint16_t epoch_next = session->security_parameters.epoch_next;
847
128
  int ret;
848
849
  /* Update internals from CipherSuite selected.
850
   * If we are resuming just copy the connection session
851
   */
852
128
  if (session->internals.resumed &&
853
128
      session->security_parameters.entity == GNUTLS_CLIENT)
854
0
    _gnutls_set_resumed_parameters(session);
855
856
128
  ret = _gnutls_epoch_set_keys(session, epoch_next, 0);
857
128
  if (ret < 0)
858
0
    return ret;
859
860
128
  _gnutls_handshake_log("HSK[%p]: Cipher Suite: %s\n", session,
861
128
            session->security_parameters.cs->name);
862
863
128
  session->security_parameters.epoch_read = epoch_next;
864
865
128
  return 0;
866
128
}
867
868
/* Initializes the write connection session
869
 * (write encrypted data)
870
 */
871
int _gnutls_write_connection_state_init(gnutls_session_t session)
872
0
{
873
0
  const uint16_t epoch_next = session->security_parameters.epoch_next;
874
0
  int ret;
875
876
  /* reset max_record_send_size if it was negotiated in the
877
   * previous handshake using the record_size_limit extension */
878
0
  if (!(session->internals.hsk_flags &
879
0
        HSK_RECORD_SIZE_LIMIT_NEGOTIATED) &&
880
0
      session->security_parameters.entity == GNUTLS_SERVER)
881
0
    session->security_parameters.max_record_send_size =
882
0
      session->security_parameters.max_user_record_send_size;
883
884
  /* Update internals from CipherSuite selected.
885
 * If we are resuming just copy the connection session
886
 */
887
0
  if (session->internals.resumed &&
888
0
      session->security_parameters.entity == GNUTLS_SERVER)
889
0
    _gnutls_set_resumed_parameters(session);
890
891
0
  ret = _gnutls_epoch_set_keys(session, epoch_next, 0);
892
0
  if (ret < 0)
893
0
    return gnutls_assert_val(ret);
894
895
0
  _gnutls_handshake_log("HSK[%p]: Cipher Suite: %s\n", session,
896
0
            session->security_parameters.cs->name);
897
898
0
  _gnutls_handshake_log(
899
0
    "HSK[%p]: Initializing internal [write] cipher sessions\n",
900
0
    session);
901
902
0
  session->security_parameters.epoch_write = epoch_next;
903
904
0
  return 0;
905
0
}
906
907
static inline int epoch_resolve(gnutls_session_t session,
908
        unsigned int epoch_rel, uint16_t *epoch_out)
909
374k
{
910
374k
  switch (epoch_rel) {
911
117k
  case EPOCH_READ_CURRENT:
912
117k
    *epoch_out = session->security_parameters.epoch_read;
913
117k
    return 0;
914
915
234k
  case EPOCH_WRITE_CURRENT:
916
234k
    *epoch_out = session->security_parameters.epoch_write;
917
234k
    return 0;
918
919
2.95k
  case EPOCH_NEXT:
920
2.95k
    *epoch_out = session->security_parameters.epoch_next;
921
2.95k
    return 0;
922
923
19.4k
  default:
924
19.4k
    if (epoch_rel > 0xffffu)
925
0
      return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
926
927
19.4k
    *epoch_out = epoch_rel;
928
19.4k
    return 0;
929
374k
  }
930
374k
}
931
932
static inline record_parameters_st **epoch_get_slot(gnutls_session_t session,
933
                uint16_t epoch)
934
383k
{
935
383k
  uint16_t epoch_index = epoch - session->security_parameters.epoch_min;
936
937
383k
  if (epoch_index >= MAX_EPOCH_INDEX) {
938
0
    _gnutls_handshake_log(
939
0
      "Epoch %d out of range (idx: %d, max: %d)\n",
940
0
      (int)epoch, (int)epoch_index, MAX_EPOCH_INDEX);
941
0
    gnutls_assert();
942
0
    return NULL;
943
0
  }
944
  /* The slot may still be empty (NULL) */
945
383k
  return &session->record_parameters[epoch_index];
946
383k
}
947
948
int _gnutls_epoch_get(gnutls_session_t session, unsigned int epoch_rel,
949
          record_parameters_st **params_out)
950
374k
{
951
374k
  uint16_t epoch;
952
374k
  record_parameters_st **params;
953
374k
  int ret;
954
955
374k
  gnutls_mutex_lock(&session->internals.epoch_lock);
956
957
374k
  ret = epoch_resolve(session, epoch_rel, &epoch);
958
374k
  if (ret < 0) {
959
0
    gnutls_assert();
960
0
    goto cleanup;
961
0
  }
962
963
374k
  params = epoch_get_slot(session, epoch);
964
374k
  if (params == NULL || *params == NULL) {
965
553
    ret = gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
966
553
    goto cleanup;
967
553
  }
968
969
374k
  if (params_out)
970
374k
    *params_out = *params;
971
972
374k
  ret = 0;
973
974
374k
cleanup:
975
374k
  gnutls_mutex_unlock(&session->internals.epoch_lock);
976
374k
  return ret;
977
374k
}
978
979
/* Ensures that the next epoch is setup. When an epoch will null ciphers
980
 * is to be setup, call with @null_epoch set to true. In that case
981
 * the epoch is fully initialized after call.
982
 */
983
int _gnutls_epoch_setup_next(gnutls_session_t session, unsigned null_epoch,
984
           record_parameters_st **newp)
985
8.87k
{
986
8.87k
  record_parameters_st **slot;
987
988
8.87k
  slot = epoch_get_slot(session, session->security_parameters.epoch_next);
989
990
  /* If slot out of range or not empty. */
991
8.87k
  if (slot == NULL)
992
0
    return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
993
994
8.87k
  if (*slot != NULL) { /* already initialized */
995
193
    if (unlikely(null_epoch && !(*slot)->initialized))
996
0
      return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
997
998
193
    if (unlikely((*slot)->epoch !=
999
193
           session->security_parameters.epoch_next))
1000
0
      return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
1001
1002
193
    goto finish;
1003
193
  }
1004
1005
8.68k
  _gnutls_record_log("REC[%p]: Allocating epoch #%u\n", session,
1006
8.68k
         session->security_parameters.epoch_next);
1007
1008
8.68k
  *slot = gnutls_calloc(1, sizeof(record_parameters_st));
1009
8.68k
  if (*slot == NULL)
1010
0
    return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
1011
1012
8.68k
  (*slot)->epoch = session->security_parameters.epoch_next;
1013
1014
8.68k
  if (null_epoch) {
1015
4.06k
    (*slot)->cipher = cipher_to_entry(GNUTLS_CIPHER_NULL);
1016
4.06k
    (*slot)->mac = mac_to_entry(GNUTLS_MAC_NULL);
1017
4.06k
    (*slot)->initialized = 1;
1018
4.61k
  } else {
1019
4.61k
    (*slot)->cipher = NULL;
1020
4.61k
    (*slot)->mac = NULL;
1021
4.61k
  }
1022
1023
8.68k
  if (IS_DTLS(session)) {
1024
0
    uint64_t seq = (*slot)->write.sequence_number;
1025
0
    seq &= UINT64_C(0xffffffffffff);
1026
0
    seq |= ((uint64_t)session->security_parameters.epoch_next)
1027
0
           << 48;
1028
0
    (*slot)->write.sequence_number = seq;
1029
0
  }
1030
1031
8.87k
finish:
1032
8.87k
  if (newp != NULL)
1033
553
    *newp = *slot;
1034
1035
8.87k
  return 0;
1036
8.68k
}
1037
1038
static inline int epoch_is_active(gnutls_session_t session,
1039
          record_parameters_st *params)
1040
17.3k
{
1041
17.3k
  const security_parameters_st *sp = &session->security_parameters;
1042
1043
17.3k
  if (params->epoch == sp->epoch_read)
1044
8.13k
    return 1;
1045
1046
9.23k
  if (params->epoch == sp->epoch_write)
1047
1.36k
    return 1;
1048
1049
7.87k
  if (params->epoch == sp->epoch_next)
1050
6.77k
    return 1;
1051
1052
1.10k
  return 0;
1053
7.87k
}
1054
1055
static inline int epoch_alive(gnutls_session_t session,
1056
            record_parameters_st *params)
1057
8.68k
{
1058
8.68k
  if (params->usage_cnt > 0)
1059
0
    return 1;
1060
1061
8.68k
  return epoch_is_active(session, params);
1062
8.68k
}
1063
1064
void _gnutls_epoch_gc(gnutls_session_t session)
1065
4.06k
{
1066
4.06k
  int i, j;
1067
4.06k
  unsigned int min_index = 0;
1068
1069
4.06k
  _gnutls_record_log("REC[%p]: Start of epoch cleanup\n", session);
1070
1071
4.06k
  gnutls_mutex_lock(&session->internals.epoch_lock);
1072
1073
  /* Free all dead cipher state */
1074
20.3k
  for (i = 0; i < MAX_EPOCH_INDEX; i++) {
1075
16.2k
    if (session->record_parameters[i] != NULL) {
1076
8.68k
      if (!epoch_is_active(session,
1077
8.68k
               session->record_parameters[i]) &&
1078
8.68k
          session->record_parameters[i]->usage_cnt)
1079
8.68k
        _gnutls_record_log(
1080
8.68k
          "REC[%p]: Note inactive epoch %d has %d users\n",
1081
8.68k
          session,
1082
8.68k
          session->record_parameters[i]->epoch,
1083
8.68k
          session->record_parameters[i]
1084
8.68k
            ->usage_cnt);
1085
8.68k
      if (!epoch_alive(session,
1086
8.68k
           session->record_parameters[i])) {
1087
553
        _gnutls_epoch_free(
1088
553
          session, session->record_parameters[i]);
1089
553
        session->record_parameters[i] = NULL;
1090
553
      }
1091
8.68k
    }
1092
16.2k
  }
1093
1094
  /* Look for contiguous NULLs at the start of the array */
1095
4.06k
  for (i = 0;
1096
4.61k
       i < MAX_EPOCH_INDEX && session->record_parameters[i] == NULL; i++)
1097
553
    ;
1098
4.06k
  min_index = i;
1099
1100
  /* Pick up the slack in the epoch window. */
1101
4.06k
  if (min_index != 0) {
1102
2.21k
    for (i = 0, j = min_index; j < MAX_EPOCH_INDEX; i++, j++) {
1103
1.65k
      session->record_parameters[i] =
1104
1.65k
        session->record_parameters[j];
1105
1.65k
      session->record_parameters[j] = NULL;
1106
1.65k
    }
1107
553
  }
1108
1109
  /* Set the new epoch_min */
1110
4.06k
  if (session->record_parameters[0] != NULL)
1111
4.06k
    session->security_parameters.epoch_min =
1112
4.06k
      session->record_parameters[0]->epoch;
1113
1114
4.06k
  gnutls_mutex_unlock(&session->internals.epoch_lock);
1115
1116
4.06k
  _gnutls_record_log("REC[%p]: End of epoch cleanup\n", session);
1117
4.06k
}
1118
1119
static inline void free_record_state(record_state_st *state)
1120
17.3k
{
1121
17.3k
  zeroize_temp_key(state->mac_key, state->mac_key_size);
1122
17.3k
  zeroize_temp_key(state->iv, state->iv_size);
1123
17.3k
  zeroize_temp_key(state->key, state->key_size);
1124
1125
17.3k
  if (state->is_aead)
1126
2.21k
    _gnutls_aead_cipher_deinit(&state->ctx.aead);
1127
15.1k
  else
1128
15.1k
    _gnutls_auth_cipher_deinit(&state->ctx.tls12);
1129
17.3k
}
1130
1131
void _gnutls_epoch_free(gnutls_session_t session, record_parameters_st *params)
1132
8.68k
{
1133
8.68k
  _gnutls_record_log("REC[%p]: Epoch #%u freed\n", session,
1134
8.68k
         params->epoch);
1135
1136
8.68k
  free_record_state(&params->read);
1137
8.68k
  free_record_state(&params->write);
1138
1139
8.68k
  gnutls_free(params);
1140
8.68k
}
1141
1142
static int _gnutls_call_secret_func(gnutls_session_t session, hs_stage_t stage,
1143
            bool for_read, bool for_write)
1144
1.10k
{
1145
1.10k
  const mac_entry_st *prf = NULL;
1146
1.10k
  gnutls_record_encryption_level_t level;
1147
1.10k
  void *secret_read = NULL, *secret_write = NULL;
1148
1149
1.10k
  if (session->internals.h_secret_func == NULL)
1150
1.10k
    return 0;
1151
1152
0
  switch (stage) {
1153
0
  case STAGE_EARLY:
1154
0
    prf = session->key.binders[0].prf;
1155
0
    level = GNUTLS_ENCRYPTION_LEVEL_EARLY;
1156
0
    if (for_read) {
1157
0
      if (unlikely(session->security_parameters.entity ==
1158
0
             GNUTLS_CLIENT))
1159
0
        return gnutls_assert_val(
1160
0
          GNUTLS_E_INTERNAL_ERROR);
1161
0
      secret_read = session->key.proto.tls13.e_ckey;
1162
0
    }
1163
0
    if (for_write) {
1164
0
      if (unlikely(session->security_parameters.entity ==
1165
0
             GNUTLS_SERVER))
1166
0
        return gnutls_assert_val(
1167
0
          GNUTLS_E_INTERNAL_ERROR);
1168
0
      secret_write = session->key.proto.tls13.e_ckey;
1169
0
    }
1170
0
    break;
1171
0
  case STAGE_HS:
1172
0
    prf = session->security_parameters.prf;
1173
0
    level = GNUTLS_ENCRYPTION_LEVEL_HANDSHAKE;
1174
0
    if (for_read)
1175
0
      secret_read = session->security_parameters.entity ==
1176
0
                  GNUTLS_CLIENT ?
1177
0
                session->key.proto.tls13.hs_skey :
1178
0
                session->key.proto.tls13.hs_ckey;
1179
0
    if (for_write)
1180
0
      secret_write =
1181
0
        session->security_parameters.entity ==
1182
0
            GNUTLS_CLIENT ?
1183
0
          session->key.proto.tls13.hs_ckey :
1184
0
          session->key.proto.tls13.hs_skey;
1185
0
    break;
1186
0
  case STAGE_APP:
1187
0
  case STAGE_UPD_OURS:
1188
0
  case STAGE_UPD_PEERS:
1189
0
    prf = session->security_parameters.prf;
1190
0
    level = GNUTLS_ENCRYPTION_LEVEL_APPLICATION;
1191
0
    if (for_read)
1192
0
      secret_read = session->security_parameters.entity ==
1193
0
                  GNUTLS_CLIENT ?
1194
0
                session->key.proto.tls13.ap_skey :
1195
0
                session->key.proto.tls13.ap_ckey;
1196
0
    if (for_write)
1197
0
      secret_write =
1198
0
        session->security_parameters.entity ==
1199
0
            GNUTLS_CLIENT ?
1200
0
          session->key.proto.tls13.ap_ckey :
1201
0
          session->key.proto.tls13.ap_skey;
1202
0
    break;
1203
0
  default:
1204
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
1205
0
  }
1206
1207
0
  return session->internals.h_secret_func(session, level, secret_read,
1208
0
            secret_write, prf->output_size);
1209
0
}
1210
1211
int _tls13_connection_state_init(gnutls_session_t session, hs_stage_t stage)
1212
553
{
1213
553
  const uint16_t epoch_next = session->security_parameters.epoch_next;
1214
553
  int ret;
1215
1216
553
  ret = _gnutls_epoch_set_keys(session, epoch_next, stage);
1217
553
  if (ret < 0)
1218
0
    return ret;
1219
1220
553
  _gnutls_handshake_log("HSK[%p]: TLS 1.3 re-key with cipher suite: %s\n",
1221
553
            session, session->security_parameters.cs->name);
1222
1223
553
  session->security_parameters.epoch_read = epoch_next;
1224
553
  session->security_parameters.epoch_write = epoch_next;
1225
1226
553
  ret = _gnutls_call_secret_func(session, stage, 1, 1);
1227
553
  if (ret < 0)
1228
0
    return gnutls_assert_val(ret);
1229
1230
553
  return 0;
1231
553
}
1232
1233
int _tls13_read_connection_state_init(gnutls_session_t session,
1234
              hs_stage_t stage)
1235
0
{
1236
0
  const uint16_t epoch_next = session->security_parameters.epoch_next;
1237
0
  int ret;
1238
1239
0
  if (unlikely(stage == STAGE_EARLY && !IS_SERVER(session))) {
1240
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
1241
0
  }
1242
1243
0
  ret = _gnutls_epoch_set_keys(session, epoch_next, stage);
1244
0
  if (ret < 0)
1245
0
    return ret;
1246
1247
0
  _gnutls_handshake_log(
1248
0
    "HSK[%p]: TLS 1.3 set read key with cipher suite: %s\n",
1249
0
    session,
1250
0
    stage == STAGE_EARLY ?
1251
0
      session->internals.resumed_security_parameters.cs->name :
1252
0
      session->security_parameters.cs->name);
1253
1254
0
  session->security_parameters.epoch_read = epoch_next;
1255
1256
0
  ret = _gnutls_call_secret_func(session, stage, 1, 0);
1257
0
  if (ret < 0)
1258
0
    return gnutls_assert_val(ret);
1259
1260
0
  return 0;
1261
0
}
1262
1263
int _tls13_write_connection_state_init(gnutls_session_t session,
1264
               hs_stage_t stage)
1265
553
{
1266
553
  const uint16_t epoch_next = session->security_parameters.epoch_next;
1267
553
  int ret;
1268
1269
553
  if (unlikely(stage == STAGE_EARLY && IS_SERVER(session))) {
1270
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
1271
0
  }
1272
1273
553
  ret = _gnutls_epoch_set_keys(session, epoch_next, stage);
1274
553
  if (ret < 0)
1275
0
    return ret;
1276
1277
553
  _gnutls_handshake_log(
1278
553
    "HSK[%p]: TLS 1.3 set write key with cipher suite: %s\n",
1279
553
    session,
1280
553
    stage == STAGE_EARLY ?
1281
553
      session->internals.resumed_security_parameters.cs->name :
1282
553
      session->security_parameters.cs->name);
1283
1284
553
  session->security_parameters.epoch_write = epoch_next;
1285
1286
553
  ret = _gnutls_call_secret_func(session, stage, 0, 1);
1287
553
  if (ret < 0)
1288
0
    return gnutls_assert_val(ret);
1289
1290
553
  return 0;
1291
553
}
1292
1293
static int _tls13_init_record_state(gnutls_cipher_algorithm_t algo,
1294
            record_state_st *state)
1295
2.21k
{
1296
2.21k
  int ret;
1297
2.21k
  gnutls_datum_t key;
1298
1299
2.21k
  key.data = state->key;
1300
2.21k
  key.size = state->key_size;
1301
1302
2.21k
  ret = _gnutls_aead_cipher_init(&state->ctx.aead, algo, &key);
1303
2.21k
  if (ret < 0) {
1304
0
    _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_ERROR);
1305
0
    return gnutls_assert_val(ret);
1306
0
  }
1307
1308
2.21k
  if (is_cipher_algo_allowed(algo))
1309
2.21k
    _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_APPROVED);
1310
0
  else
1311
0
    _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_NOT_APPROVED);
1312
1313
2.21k
  state->aead_tag_size = gnutls_cipher_get_tag_size(algo);
1314
2.21k
  state->is_aead = 1;
1315
1316
2.21k
  return 0;
1317
2.21k
}
1318
1319
/**
1320
 * gnutls_handshake_set_secret_function:
1321
 * @session: is a #gnutls_session_t type.
1322
 * @func: the secret func
1323
 *
1324
 * This function will set a callback to be called when a new traffic
1325
 * secret is installed.
1326
 *
1327
 * Since: 3.7.0
1328
 */
1329
void gnutls_handshake_set_secret_function(gnutls_session_t session,
1330
            gnutls_handshake_secret_func func)
1331
0
{
1332
0
  session->internals.h_secret_func = func;
1333
0
}