tls13_enc.cc
Go to the documentation of this file.
1 /* Copyright (c) 2016, Google Inc.
2  *
3  * Permission to use, copy, modify, and/or distribute this software for any
4  * purpose with or without fee is hereby granted, provided that the above
5  * copyright notice and this permission notice appear in all copies.
6  *
7  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14 
15 #include <openssl/ssl.h>
16 
17 #include <assert.h>
18 #include <string.h>
19 
20 #include <algorithm>
21 #include <utility>
22 
23 #include <openssl/aead.h>
24 #include <openssl/bytestring.h>
25 #include <openssl/digest.h>
26 #include <openssl/hkdf.h>
27 #include <openssl/hmac.h>
28 #include <openssl/mem.h>
29 
30 #include "../crypto/internal.h"
31 #include "internal.h"
32 
33 
35 
36 static bool init_key_schedule(SSL_HANDSHAKE *hs, SSLTranscript *transcript,
37  uint16_t version, const SSL_CIPHER *cipher) {
38  if (!transcript->InitHash(version, cipher)) {
39  return false;
40  }
41 
42  // Initialize the secret to the zero key.
43  hs->ResizeSecrets(transcript->DigestLen());
44  OPENSSL_memset(hs->secret().data(), 0, hs->secret().size());
45 
46  return true;
47 }
48 
50  const SSLTranscript &transcript,
52  size_t len;
53  if (!HKDF_extract(hs->secret().data(), &len, transcript.Digest(), in.data(),
54  in.size(), hs->secret().data(), hs->secret().size())) {
55  return false;
56  }
57  assert(len == hs->secret().size());
58  return true;
59 }
60 
63  hs->new_cipher)) {
64  return false;
65  }
66 
67  // Handback includes the whole handshake transcript, so we cannot free the
68  // transcript buffer in the handback case.
69  if (!hs->handback) {
70  hs->transcript.FreeBuffer();
71  }
72  return hkdf_extract_to_secret(hs, hs->transcript, psk);
73 }
74 
76  const SSL_SESSION *session) {
77  assert(!hs->ssl->server);
78  // When offering ECH, early data is associated with ClientHelloInner, not
79  // ClientHelloOuter.
80  SSLTranscript *transcript =
82  return init_key_schedule(hs, transcript,
84  session->cipher) &&
86  hs, *transcript,
87  MakeConstSpan(session->secret, session->secret_length));
88 }
89 
90 static Span<const char> label_to_span(const char *label) {
91  return MakeConstSpan(label, strlen(label));
92 }
93 
94 static bool hkdf_expand_label(Span<uint8_t> out, const EVP_MD *digest,
95  Span<const uint8_t> secret,
98  Span<const char> protocol_label = label_to_span("tls13 ");
99  ScopedCBB cbb;
100  CBB child;
101  Array<uint8_t> hkdf_label;
102  if (!CBB_init(cbb.get(), 2 + 1 + protocol_label.size() + label.size() + 1 +
103  hash.size()) ||
104  !CBB_add_u16(cbb.get(), out.size()) ||
105  !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
107  reinterpret_cast<const uint8_t *>(protocol_label.data()),
108  protocol_label.size()) ||
109  !CBB_add_bytes(&child, reinterpret_cast<const uint8_t *>(label.data()),
110  label.size()) ||
111  !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
112  !CBB_add_bytes(&child, hash.data(), hash.size()) ||
113  !CBBFinishArray(cbb.get(), &hkdf_label)) {
114  return false;
115  }
116 
117  return HKDF_expand(out.data(), out.size(), digest, secret.data(),
118  secret.size(), hkdf_label.data(), hkdf_label.size());
119 }
120 
121 static const char kTLS13LabelDerived[] = "derived";
122 
124  uint8_t derive_context[EVP_MAX_MD_SIZE];
125  unsigned derive_context_len;
126  return EVP_Digest(nullptr, 0, derive_context, &derive_context_len,
127  hs->transcript.Digest(), nullptr) &&
128  hkdf_expand_label(hs->secret(), hs->transcript.Digest(), hs->secret(),
130  MakeConstSpan(derive_context, derive_context_len)) &&
132 }
133 
134 // derive_secret_with_transcript derives a secret of length |out.size()| and
135 // writes the result in |out| with the given label, the current base secret, and
136 // the state of |transcript|. It returns true on success and false on error.
139  const SSLTranscript &transcript,
141  uint8_t context_hash[EVP_MAX_MD_SIZE];
142  size_t context_hash_len;
143  if (!transcript.GetHash(context_hash, &context_hash_len)) {
144  return false;
145  }
146 
147  return hkdf_expand_label(out, transcript.Digest(), hs->secret(), label,
148  MakeConstSpan(context_hash, context_hash_len));
149 }
150 
154 }
155 
156 bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level,
157  enum evp_aead_direction_t direction,
158  const SSL_SESSION *session,
159  Span<const uint8_t> traffic_secret) {
161  UniquePtr<SSLAEADContext> traffic_aead;
162  Span<const uint8_t> secret_for_quic;
163  if (ssl->quic_method != nullptr) {
164  // Install a placeholder SSLAEADContext so that SSL accessors work. The
165  // encryption itself will be handled by the SSL_QUIC_METHOD.
166  traffic_aead =
168  secret_for_quic = traffic_secret;
169  } else {
170  // Look up cipher suite properties.
171  const EVP_AEAD *aead;
172  size_t discard;
173  if (!ssl_cipher_get_evp_aead(&aead, &discard, &discard, session->cipher,
174  version, SSL_is_dtls(ssl))) {
175  return false;
176  }
177 
178  const EVP_MD *digest = ssl_session_get_digest(session);
179 
180  // Derive the key.
181  size_t key_len = EVP_AEAD_key_length(aead);
183  auto key = MakeSpan(key_buf, key_len);
184  if (!hkdf_expand_label(key, digest, traffic_secret, label_to_span("key"),
185  {})) {
186  return false;
187  }
188 
189  // Derive the IV.
190  size_t iv_len = EVP_AEAD_nonce_length(aead);
192  auto iv = MakeSpan(iv_buf, iv_len);
193  if (!hkdf_expand_label(iv, digest, traffic_secret, label_to_span("iv"),
194  {})) {
195  return false;
196  }
197 
198  traffic_aead = SSLAEADContext::Create(direction, session->ssl_version,
199  SSL_is_dtls(ssl), session->cipher,
200  key, Span<const uint8_t>(), iv);
201  }
202 
203  if (!traffic_aead) {
204  return false;
205  }
206 
207  if (traffic_secret.size() >
208  OPENSSL_ARRAY_SIZE(ssl->s3->read_traffic_secret) ||
209  traffic_secret.size() >
210  OPENSSL_ARRAY_SIZE(ssl->s3->write_traffic_secret)) {
212  return false;
213  }
214 
215  if (direction == evp_aead_open) {
216  if (!ssl->method->set_read_state(ssl, level, std::move(traffic_aead),
217  secret_for_quic)) {
218  return false;
219  }
220  OPENSSL_memmove(ssl->s3->read_traffic_secret, traffic_secret.data(),
221  traffic_secret.size());
222  ssl->s3->read_traffic_secret_len = traffic_secret.size();
223  } else {
224  if (!ssl->method->set_write_state(ssl, level, std::move(traffic_aead),
225  secret_for_quic)) {
226  return false;
227  }
228  OPENSSL_memmove(ssl->s3->write_traffic_secret, traffic_secret.data(),
229  traffic_secret.size());
230  ssl->s3->write_traffic_secret_len = traffic_secret.size();
231  }
232 
233  return true;
234 }
235 
236 
237 static const char kTLS13LabelExporter[] = "exp master";
238 
239 static const char kTLS13LabelClientEarlyTraffic[] = "c e traffic";
240 static const char kTLS13LabelClientHandshakeTraffic[] = "c hs traffic";
241 static const char kTLS13LabelServerHandshakeTraffic[] = "s hs traffic";
242 static const char kTLS13LabelClientApplicationTraffic[] = "c ap traffic";
243 static const char kTLS13LabelServerApplicationTraffic[] = "s ap traffic";
244 
246  SSL *const ssl = hs->ssl;
247  // When offering ECH on the client, early data is associated with
248  // ClientHelloInner, not ClientHelloOuter.
249  const SSLTranscript &transcript = (!ssl->server && hs->selected_ech_config)
250  ? hs->inner_transcript
251  : hs->transcript;
253  hs, hs->early_traffic_secret(), transcript,
255  !ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET",
256  hs->early_traffic_secret())) {
257  return false;
258  }
259  return true;
260 }
261 
263  SSL *const ssl = hs->ssl;
264  if (!derive_secret(hs, hs->client_handshake_secret(),
266  !ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
267  hs->client_handshake_secret()) ||
270  !ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
271  hs->server_handshake_secret())) {
272  return false;
273  }
274 
275  return true;
276 }
277 
279  SSL *const ssl = hs->ssl;
280  ssl->s3->exporter_secret_len = hs->transcript.DigestLen();
281  if (!derive_secret(hs, hs->client_traffic_secret_0(),
283  !ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0",
284  hs->client_traffic_secret_0()) ||
287  !ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0",
288  hs->server_traffic_secret_0()) ||
289  !derive_secret(
290  hs, MakeSpan(ssl->s3->exporter_secret, ssl->s3->exporter_secret_len),
292  !ssl_log_secret(ssl, "EXPORTER_SECRET",
293  MakeConstSpan(ssl->s3->exporter_secret,
294  ssl->s3->exporter_secret_len))) {
295  return false;
296  }
297 
298  return true;
299 }
300 
301 static const char kTLS13LabelApplicationTraffic[] = "traffic upd";
302 
304  Span<uint8_t> secret;
305  if (direction == evp_aead_open) {
306  secret = MakeSpan(ssl->s3->read_traffic_secret,
307  ssl->s3->read_traffic_secret_len);
308  } else {
309  secret = MakeSpan(ssl->s3->write_traffic_secret,
310  ssl->s3->write_traffic_secret_len);
311  }
312 
313  const SSL_SESSION *session = SSL_get_session(ssl);
314  const EVP_MD *digest = ssl_session_get_digest(session);
315  return hkdf_expand_label(secret, digest, secret,
318  session, secret);
319 }
320 
321 static const char kTLS13LabelResumption[] = "res master";
322 
326  return false;
327  }
328  hs->new_session->secret_length = hs->transcript.DigestLen();
329  return derive_secret(
330  hs, MakeSpan(hs->new_session->secret, hs->new_session->secret_length),
332 }
333 
334 static const char kTLS13LabelFinished[] = "finished";
335 
336 // tls13_verify_data sets |out| to be the HMAC of |context| using a derived
337 // Finished key for both Finished messages and the PSK binder. |out| must have
338 // space available for |EVP_MAX_MD_SIZE| bytes.
339 static bool tls13_verify_data(uint8_t *out, size_t *out_len,
340  const EVP_MD *digest, uint16_t version,
341  Span<const uint8_t> secret,
343  uint8_t key_buf[EVP_MAX_MD_SIZE];
344  auto key = MakeSpan(key_buf, EVP_MD_size(digest));
345  unsigned len;
346  if (!hkdf_expand_label(key, digest, secret,
348  HMAC(digest, key.data(), key.size(), context.data(), context.size(), out,
349  &len) == nullptr) {
350  return false;
351  }
352  *out_len = len;
353  return true;
354 }
355 
356 bool tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len,
357  bool is_server) {
358  Span<const uint8_t> traffic_secret =
359  is_server ? hs->server_handshake_secret() : hs->client_handshake_secret();
360 
361  uint8_t context_hash[EVP_MAX_MD_SIZE];
362  size_t context_hash_len;
363  if (!hs->transcript.GetHash(context_hash, &context_hash_len) ||
364  !tls13_verify_data(out, out_len, hs->transcript.Digest(),
365  hs->ssl->version, traffic_secret,
366  MakeConstSpan(context_hash, context_hash_len))) {
367  return 0;
368  }
369  return 1;
370 }
371 
372 static const char kTLS13LabelResumptionPSK[] = "resumption";
373 
375  const EVP_MD *digest = ssl_session_get_digest(session);
376  // The session initially stores the resumption_master_secret, which we
377  // override with the PSK.
378  auto session_secret = MakeSpan(session->secret, session->secret_length);
379  return hkdf_expand_label(session_secret, digest, session_secret,
381 }
382 
383 static const char kTLS13LabelExportKeying[] = "exporter";
384 
386  Span<const uint8_t> secret,
389  if (secret.empty()) {
390  assert(0);
392  return false;
393  }
394 
395  const EVP_MD *digest = ssl_session_get_digest(SSL_get_session(ssl));
396 
397  uint8_t hash_buf[EVP_MAX_MD_SIZE];
398  uint8_t export_context_buf[EVP_MAX_MD_SIZE];
399  unsigned hash_len;
400  unsigned export_context_len;
401  if (!EVP_Digest(context.data(), context.size(), hash_buf, &hash_len, digest,
402  nullptr) ||
403  !EVP_Digest(nullptr, 0, export_context_buf, &export_context_len, digest,
404  nullptr)) {
405  return false;
406  }
407 
408  auto hash = MakeConstSpan(hash_buf, hash_len);
409  auto export_context = MakeConstSpan(export_context_buf, export_context_len);
410  uint8_t derived_secret_buf[EVP_MAX_MD_SIZE];
411  auto derived_secret = MakeSpan(derived_secret_buf, EVP_MD_size(digest));
412  return hkdf_expand_label(derived_secret, digest, secret, label,
413  export_context) &&
414  hkdf_expand_label(out, digest, derived_secret,
416 }
417 
418 static const char kTLS13LabelPSKBinder[] = "res binder";
419 
420 static bool tls13_psk_binder(uint8_t *out, size_t *out_len,
421  const SSL_SESSION *session,
422  const SSLTranscript &transcript,
423  Span<const uint8_t> client_hello,
424  size_t binders_len) {
425  const EVP_MD *digest = ssl_session_get_digest(session);
426 
427  // Compute the binder key.
428  //
429  // TODO(davidben): Ideally we wouldn't recompute early secret and the binder
430  // key each time.
431  uint8_t binder_context[EVP_MAX_MD_SIZE];
432  unsigned binder_context_len;
433  uint8_t early_secret[EVP_MAX_MD_SIZE] = {0};
434  size_t early_secret_len;
435  uint8_t binder_key_buf[EVP_MAX_MD_SIZE] = {0};
436  auto binder_key = MakeSpan(binder_key_buf, EVP_MD_size(digest));
437  if (!EVP_Digest(nullptr, 0, binder_context, &binder_context_len, digest,
438  nullptr) ||
439  !HKDF_extract(early_secret, &early_secret_len, digest, session->secret,
440  session->secret_length, nullptr, 0) ||
441  !hkdf_expand_label(binder_key, digest,
442  MakeConstSpan(early_secret, early_secret_len),
444  MakeConstSpan(binder_context, binder_context_len))) {
445  return false;
446  }
447 
448  // Hash the transcript and truncated ClientHello.
449  if (client_hello.size() < binders_len) {
451  return false;
452  }
453  auto truncated = client_hello.subspan(0, client_hello.size() - binders_len);
455  unsigned context_len;
456  ScopedEVP_MD_CTX ctx;
457  if (!transcript.CopyToHashContext(ctx.get(), digest) ||
458  !EVP_DigestUpdate(ctx.get(), truncated.data(),
459  truncated.size()) ||
460  !EVP_DigestFinal_ex(ctx.get(), context, &context_len)) {
461  return false;
462  }
463 
464  if (!tls13_verify_data(out, out_len, digest, session->ssl_version, binder_key,
465  MakeConstSpan(context, context_len))) {
466  return false;
467  }
468 
469  assert(*out_len == EVP_MD_size(digest));
470  return true;
471 }
472 
474  const SSLTranscript &transcript, Span<uint8_t> msg,
475  size_t *out_binder_len) {
476  const SSL *const ssl = hs->ssl;
477  const EVP_MD *digest = ssl_session_get_digest(ssl->session.get());
478  const size_t hash_len = EVP_MD_size(digest);
479  // We only offer one PSK, so the binders are a u16 and u8 length
480  // prefix, followed by the binder. The caller is assumed to have constructed
481  // |msg| with placeholder binders.
482  const size_t binders_len = 3 + hash_len;
483  uint8_t verify_data[EVP_MAX_MD_SIZE];
484  size_t verify_data_len;
485  if (!tls13_psk_binder(verify_data, &verify_data_len, ssl->session.get(),
486  transcript, msg, binders_len) ||
487  verify_data_len != hash_len) {
489  return false;
490  }
491 
492  auto msg_binder = msg.last(verify_data_len);
493  OPENSSL_memcpy(msg_binder.data(), verify_data, verify_data_len);
494  if (out_binder_len != nullptr) {
495  *out_binder_len = verify_data_len;
496  }
497  return true;
498 }
499 
501  const SSL_SESSION *session, const SSLMessage &msg,
502  CBS *binders) {
503  uint8_t verify_data[EVP_MAX_MD_SIZE];
504  size_t verify_data_len;
505  CBS binder;
506  // The binders are computed over |msg| with |binders| and its u16 length
507  // prefix removed. The caller is assumed to have parsed |msg|, extracted
508  // |binders|, and verified the PSK extension is last.
509  if (!tls13_psk_binder(verify_data, &verify_data_len, session, hs->transcript,
510  msg.raw, 2 + CBS_len(binders)) ||
511  // We only consider the first PSK, so compare against the first binder.
512  !CBS_get_u8_length_prefixed(binders, &binder)) {
514  return false;
515  }
516 
517  bool binder_ok =
518  CBS_len(&binder) == verify_data_len &&
519  CRYPTO_memcmp(CBS_data(&binder), verify_data, verify_data_len) == 0;
520 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
521  binder_ok = true;
522 #endif
523  if (!binder_ok) {
525  return false;
526  }
527 
528  return true;
529 }
530 
533  "the confirmation signal is a suffix of the random");
534  const size_t header_len =
536  return header_len + 2 /* version */ + SSL3_RANDOM_SIZE -
538 }
539 
541  Span<const uint8_t> client_random,
542  const SSLTranscript &transcript, bool is_hrr,
543  Span<const uint8_t> msg, size_t offset) {
544  // See draft-ietf-tls-esni-13, sections 7.2 and 7.2.1.
545  static const uint8_t kZeros[EVP_MAX_MD_SIZE] = {0};
546 
547  // We hash |msg|, with bytes from |offset| zeroed.
548  if (msg.size() < offset + ECH_CONFIRMATION_SIGNAL_LEN) {
550  return false;
551  }
552 
553  auto before_zeros = msg.subspan(0, offset);
554  auto after_zeros = msg.subspan(offset + ECH_CONFIRMATION_SIGNAL_LEN);
556  unsigned context_len;
557  ScopedEVP_MD_CTX ctx;
558  if (!transcript.CopyToHashContext(ctx.get(), transcript.Digest()) ||
559  !EVP_DigestUpdate(ctx.get(), before_zeros.data(), before_zeros.size()) ||
561  !EVP_DigestUpdate(ctx.get(), after_zeros.data(), after_zeros.size()) ||
562  !EVP_DigestFinal_ex(ctx.get(), context, &context_len)) {
563  return false;
564  }
565 
566  uint8_t secret[EVP_MAX_MD_SIZE];
567  size_t secret_len;
568  if (!HKDF_extract(secret, &secret_len, transcript.Digest(),
569  client_random.data(), client_random.size(), kZeros,
570  transcript.DigestLen())) {
571  return false;
572  }
573 
574  assert(out.size() == ECH_CONFIRMATION_SIGNAL_LEN);
575  return hkdf_expand_label(out, transcript.Digest(),
576  MakeConstSpan(secret, secret_len),
577  is_hrr ? label_to_span("hrr ech accept confirmation")
578  : label_to_span("ech accept confirmation"),
579  MakeConstSpan(context, context_len));
580 }
581 
ssl_st::server
bool server
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3777
Span::subspan
Span subspan(size_t pos=0, size_t len=npos) const
Definition: boringssl-with-bazel/src/include/openssl/span.h:162
ssl_cipher_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:520
tls13_derive_resumption_secret
bool tls13_derive_resumption_secret(SSL_HANDSHAKE *hs)
Definition: tls13_enc.cc:323
CBB_init
#define CBB_init
Definition: boringssl_prefix_symbols.h:1047
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
Span::size
size_t size() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:133
SSLTranscript::InitHash
bool InitHash(uint16_t version, const SSL_CIPHER *cipher)
Definition: ssl_transcript.cc:161
cbs_st
Definition: bytestring.h:39
ctx
Definition: benchmark-async.c:30
tls13_derive_early_secret
bool tls13_derive_early_secret(SSL_HANDSHAKE *hs)
Definition: tls13_enc.cc:245
SSLTranscript::Digest
const EVP_MD * Digest() const
Definition: ssl_transcript.cc:179
env_md_st
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h:67
Array::data
const T * data() const
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:274
label_to_span
static Span< const char > label_to_span(const char *label)
Definition: tls13_enc.cc:90
CBS_data
#define CBS_data
Definition: boringssl_prefix_symbols.h:1057
kTLS13LabelApplicationTraffic
static const char kTLS13LabelApplicationTraffic[]
Definition: tls13_enc.cc:301
evp_aead_direction_t
evp_aead_direction_t
Definition: aead.h:429
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
SSL_HANDSHAKE::new_cipher
const SSL_CIPHER * new_cipher
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1933
EVP_AEAD_MAX_NONCE_LENGTH
#define EVP_AEAD_MAX_NONCE_LENGTH
Definition: aead.h:231
kTLS13LabelPSKBinder
static const char kTLS13LabelPSKBinder[]
Definition: tls13_enc.cc:418
SSL_HANDSHAKE::inner_transcript
SSLTranscript inner_transcript
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1826
tls13_init_early_key_schedule
bool tls13_init_early_key_schedule(SSL_HANDSHAKE *hs, const SSL_SESSION *session)
Definition: tls13_enc.cc:75
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
internal.h
SSL_HANDSHAKE::early_traffic_secret
Span< uint8_t > early_traffic_secret()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1779
string.h
SSLAEADContext::CreatePlaceholderForQUIC
static UniquePtr< SSLAEADContext > CreatePlaceholderForQUIC(uint16_t version, const SSL_CIPHER *cipher)
Definition: ssl_aead_ctx.cc:149
OPENSSL_ARRAY_SIZE
#define OPENSSL_ARRAY_SIZE(array)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:179
SSL_HANDSHAKE::ssl
SSL * ssl
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1726
derive_secret
static bool derive_secret(SSL_HANDSHAKE *hs, Span< uint8_t > out, Span< const char > label)
Definition: tls13_enc.cc:151
SSL_HANDSHAKE::server_handshake_secret
Span< uint8_t > server_handshake_secret()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1785
CBS_get_u8_length_prefixed
#define CBS_get_u8_length_prefixed
Definition: boringssl_prefix_symbols.h:1083
ECH_CONFIRMATION_SIGNAL_LEN
#define ECH_CONFIRMATION_SIGNAL_LEN
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1515
CBS_len
#define CBS_len
Definition: boringssl_prefix_symbols.h:1089
SSL_HANDSHAKE::selected_ech_config
UniquePtr< ECHConfig > selected_ech_config
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1930
EVP_DigestUpdate
#define EVP_DigestUpdate
Definition: boringssl_prefix_symbols.h:1516
ctx
static struct test_ctx ctx
Definition: test-ipc-send-recv.c:65
version
Definition: version.py:1
SSL_HANDSHAKE::secret
Span< uint8_t > secret()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1775
SSL_HANDSHAKE::new_session
UniquePtr< SSL_SESSION > new_session
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1916
SSL3_RANDOM_SIZE
#define SSL3_RANDOM_SIZE
Definition: ssl3.h:204
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
OPENSSL_memset
static void * OPENSSL_memset(void *dst, int c, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:835
ssl_session_st::secret_length
int secret_length
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3809
ssl_st::quic_method
const SSL_QUIC_METHOD * quic_method
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3769
ssl_st::session
bssl::UniquePtr< SSL_SESSION > session
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3750
ssl_session_protocol_version
uint16_t ssl_session_protocol_version(const SSL_SESSION *session)
Definition: ssl_session.cc:335
HKDF_extract
#define HKDF_extract
Definition: boringssl_prefix_symbols.h:1782
EVP_AEAD_nonce_length
#define EVP_AEAD_nonce_length
Definition: boringssl_prefix_symbols.h:1461
hkdf_extract_to_secret
static bool hkdf_extract_to_secret(SSL_HANDSHAKE *hs, const SSLTranscript &transcript, Span< const uint8_t > in)
Definition: tls13_enc.cc:49
hash
uint64_t hash
Definition: ring_hash.cc:284
bytestring.h
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
tls13_verify_psk_binder
bool tls13_verify_psk_binder(const SSL_HANDSHAKE *hs, const SSL_SESSION *session, const SSLMessage &msg, CBS *binders)
Definition: tls13_enc.cc:500
CBB_add_u16
#define CBB_add_u16
Definition: boringssl_prefix_symbols.h:1027
ssl_session_st::ssl_version
uint16_t ssl_version
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3795
kTLS13LabelFinished
static const char kTLS13LabelFinished[]
Definition: tls13_enc.cc:334
SSL_R_DIGEST_CHECK_FAILED
#define SSL_R_DIGEST_CHECK_FAILED
Definition: ssl.h:5410
SSL_HANDSHAKE
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1720
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
hkdf_expand_label
static bool hkdf_expand_label(Span< uint8_t > out, const EVP_MD *digest, Span< const uint8_t > secret, Span< const char > label, Span< const uint8_t > hash)
Definition: tls13_enc.cc:94
Array< uint8_t >
gen_synthetic_protos.label
label
Definition: gen_synthetic_protos.py:102
Span::empty
bool empty() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:134
Array::size
size_t size() const
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:276
CBB_add_u8_length_prefixed
#define CBB_add_u8_length_prefixed
Definition: boringssl_prefix_symbols.h:1037
ssl_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3698
EVP_MD_size
#define EVP_MD_size
Definition: boringssl_prefix_symbols.h:1579
ssl_ech_accept_confirmation
bool ssl_ech_accept_confirmation(const SSL_HANDSHAKE *hs, Span< uint8_t > out, Span< const uint8_t > client_random, const SSLTranscript &transcript, bool is_hrr, Span< const uint8_t > msg, size_t offset)
Definition: tls13_enc.cc:540
tls13_init_key_schedule
bool tls13_init_key_schedule(SSL_HANDSHAKE *hs, Span< const uint8_t > psk)
Definition: tls13_enc.cc:61
tls13_write_psk_binder
bool tls13_write_psk_binder(const SSL_HANDSHAKE *hs, const SSLTranscript &transcript, Span< uint8_t > msg, size_t *out_binder_len)
Definition: tls13_enc.cc:473
SSL3_HM_HEADER_LENGTH
#define SSL3_HM_HEADER_LENGTH
Definition: ssl3.h:208
SSL_is_dtls
#define SSL_is_dtls
Definition: boringssl_prefix_symbols.h:402
tls13_derive_handshake_secrets
bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs)
Definition: tls13_enc.cc:262
OPENSSL_memcpy
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:819
BSSL_NAMESPACE_END
#define BSSL_NAMESPACE_END
Definition: base.h:480
SSL_HANDSHAKE::client_traffic_secret_0
Span< uint8_t > client_traffic_secret_0()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1788
kTLS13LabelResumption
static const char kTLS13LabelResumption[]
Definition: tls13_enc.cc:321
tls13_rotate_traffic_key
bool tls13_rotate_traffic_key(SSL *ssl, enum evp_aead_direction_t direction)
Definition: tls13_enc.cc:303
tls13_derive_application_secrets
bool tls13_derive_application_secrets(SSL_HANDSHAKE *hs)
Definition: tls13_enc.cc:278
ERR_R_INTERNAL_ERROR
#define ERR_R_INTERNAL_ERROR
Definition: err.h:374
ssl_protocol_version
uint16_t ssl_protocol_version(const SSL *ssl)
Definition: ssl_versions.cc:251
kTLS13LabelClientEarlyTraffic
static const char kTLS13LabelClientEarlyTraffic[]
Definition: tls13_enc.cc:239
SSL_MAX_MASTER_KEY_LENGTH
#define SSL_MAX_MASTER_KEY_LENGTH
Definition: ssl.h:1795
kTLS13LabelClientHandshakeTraffic
static const char kTLS13LabelClientHandshakeTraffic[]
Definition: tls13_enc.cc:240
evp_aead_open
@ evp_aead_open
Definition: aead.h:430
derive_secret_with_transcript
static bool derive_secret_with_transcript(const SSL_HANDSHAKE *hs, Span< uint8_t > out, const SSLTranscript &transcript, Span< const char > label)
Definition: tls13_enc.cc:137
googletest-filter-unittest.child
child
Definition: bloaty/third_party/googletest/googletest/test/googletest-filter-unittest.py:62
tls13_export_keying_material
bool tls13_export_keying_material(SSL *ssl, Span< uint8_t > out, Span< const uint8_t > secret, Span< const char > label, Span< const uint8_t > context)
Definition: tls13_enc.cc:385
ssl_session_st::cipher
const SSL_CIPHER * cipher
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3860
kTLS13LabelClientApplicationTraffic
static const char kTLS13LabelClientApplicationTraffic[]
Definition: tls13_enc.cc:242
tls13_set_traffic_key
bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level, enum evp_aead_direction_t direction, const SSL_SESSION *session, Span< const uint8_t > traffic_secret)
Definition: tls13_enc.cc:156
aead.h
SSL_HANDSHAKE::server_traffic_secret_0
Span< uint8_t > server_traffic_secret_0()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1791
ssl_session_get_digest
const EVP_MD * ssl_session_get_digest(const SSL_SESSION *session)
Definition: ssl_session.cc:347
Span< const uint8_t >
SSL_HANDSHAKE::transcript
SSLTranscript transcript
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1821
ssl_ech_confirmation_signal_hello_offset
size_t ssl_ech_confirmation_signal_hello_offset(const SSL *ssl)
Definition: tls13_enc.cc:531
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
tls13_psk_binder
static bool tls13_psk_binder(uint8_t *out, size_t *out_len, const SSL_SESSION *session, const SSLTranscript &transcript, Span< const uint8_t > client_hello, size_t binders_len)
Definition: tls13_enc.cc:420
ssl.h
evp_aead_st
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h:77
SSLMessage
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1140
ssl_session_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3787
ssl_cipher_get_evp_aead
bool ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead, size_t *out_mac_secret_len, size_t *out_fixed_iv_len, const SSL_CIPHER *cipher, uint16_t version, bool is_dtls)
Definition: ssl_cipher.cc:559
EVP_AEAD_MAX_KEY_LENGTH
#define EVP_AEAD_MAX_KEY_LENGTH
Definition: aead.h:227
CBB_add_bytes
#define CBB_add_bytes
Definition: boringssl_prefix_symbols.h:1025
CBBFinishArray
OPENSSL_EXPORT bool CBBFinishArray(CBB *cbb, Array< uint8_t > *out)
Definition: ssl_lib.cc:190
BSSL_NAMESPACE_BEGIN
Definition: trust_token_test.cc:45
ssl_st::s3
bssl::SSL3_STATE * s3
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3730
digest.h
key
const char * key
Definition: hpack_parser_table.cc:164
EVP_Digest
#define EVP_Digest
Definition: boringssl_prefix_symbols.h:1506
EVP_DigestFinal_ex
#define EVP_DigestFinal_ex
Definition: boringssl_prefix_symbols.h:1509
ssl_encryption_application
ssl_encryption_application
Definition: ssl.h:3285
kTLS13LabelResumptionPSK
static const char kTLS13LabelResumptionPSK[]
Definition: tls13_enc.cc:372
SSL_HANDSHAKE::ResizeSecrets
void ResizeSecrets(size_t hash_len)
Definition: handshake.cc:167
hkdf.h
init_key_schedule
static BSSL_NAMESPACE_BEGIN bool init_key_schedule(SSL_HANDSHAKE *hs, SSLTranscript *transcript, uint16_t version, const SSL_CIPHER *cipher)
Definition: tls13_enc.cc:36
EVP_MAX_MD_SIZE
#define EVP_MAX_MD_SIZE
Definition: digest.h:156
OPENSSL_memmove
static void * OPENSSL_memmove(void *dst, const void *src, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:827
HMAC
#define HMAC
Definition: boringssl_prefix_symbols.h:1783
SSLTranscript::GetHash
bool GetHash(uint8_t *out, size_t *out_len) const
Definition: ssl_transcript.cc:235
tls13_verify_data
static bool tls13_verify_data(uint8_t *out, size_t *out_len, const EVP_MD *digest, uint16_t version, Span< const uint8_t > secret, Span< const uint8_t > context)
Definition: tls13_enc.cc:339
ssl_st::method
const bssl::SSL_PROTOCOL_METHOD * method
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3706
tls13_derive_session_psk
bool tls13_derive_session_psk(SSL_SESSION *session, Span< const uint8_t > nonce)
Definition: tls13_enc.cc:374
SSL_HANDSHAKE::client_handshake_secret
Span< uint8_t > client_handshake_secret()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1782
tls13_finished_mac
bool tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, bool is_server)
Definition: tls13_enc.cc:356
SSLTranscript::FreeBuffer
void FreeBuffer()
Definition: ssl_transcript.cc:171
kTLS13LabelExportKeying
static const char kTLS13LabelExportKeying[]
Definition: tls13_enc.cc:383
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
Span::data
T * data() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:132
mem.h
kTLS13LabelExporter
static const char kTLS13LabelExporter[]
Definition: tls13_enc.cc:237
client.level
level
Definition: examples/python/async_streaming/client.py:118
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
tls13_advance_key_schedule
bool tls13_advance_key_schedule(SSL_HANDSHAKE *hs, Span< const uint8_t > in)
Definition: tls13_enc.cc:123
SSL_get_session
#define SSL_get_session
Definition: boringssl_prefix_symbols.h:376
EVP_AEAD_key_length
#define EVP_AEAD_key_length
Definition: boringssl_prefix_symbols.h:1458
ssl_st::version
uint16_t version
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3715
SSLTranscript::CopyToHashContext
bool CopyToHashContext(EVP_MD_CTX *ctx, const EVP_MD *digest) const
Definition: ssl_transcript.cc:203
kTLS13LabelDerived
static const char kTLS13LabelDerived[]
Definition: tls13_enc.cc:121
SSL_HANDSHAKE::handback
bool handback
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2021
absl::MakeSpan
constexpr Span< T > MakeSpan(T *ptr, size_t size) noexcept
Definition: abseil-cpp/absl/types/span.h:661
ssl_session_st::secret
uint8_t secret[SSL_MAX_MASTER_KEY_LENGTH]
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3810
if
if(p->owned &&p->wrapped !=NULL)
Definition: call.c:42
CRYPTO_memcmp
#define CRYPTO_memcmp
Definition: boringssl_prefix_symbols.h:1178
kTLS13LabelServerHandshakeTraffic
static const char kTLS13LabelServerHandshakeTraffic[]
Definition: tls13_enc.cc:241
SSLAEADContext::Create
static UniquePtr< SSLAEADContext > Create(enum evp_aead_direction_t direction, uint16_t version, bool is_dtls, const SSL_CIPHER *cipher, Span< const uint8_t > enc_key, Span< const uint8_t > mac_key, Span< const uint8_t > fixed_iv)
Definition: ssl_aead_ctx.cc:56
hmac.h
DTLS1_HM_HEADER_LENGTH
#define DTLS1_HM_HEADER_LENGTH
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2835
offset
voidpf uLong offset
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:142
ssl_log_secret
bool ssl_log_secret(const SSL *ssl, const char *label, Span< const uint8_t > secret)
Definition: ssl_lib.cc:291
SSLTranscript::DigestLen
size_t DigestLen() const
Definition: ssl_transcript.cc:175
kTLS13LabelServerApplicationTraffic
static const char kTLS13LabelServerApplicationTraffic[]
Definition: tls13_enc.cc:243
absl::MakeConstSpan
constexpr Span< const T > MakeConstSpan(T *ptr, size_t size) noexcept
Definition: abseil-cpp/absl/types/span.h:707
cbb_st
Definition: bytestring.h:375
HKDF_expand
#define HKDF_expand
Definition: boringssl_prefix_symbols.h:1781
SSLTranscript
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:681


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:39