/rust/registry/src/index.crates.io-1949cf8c6b5b557f/rustls-0.23.36/src/key_log.rs
Line | Count | Source |
1 | | use core::fmt::Debug; |
2 | | |
3 | | #[cfg(all(doc, feature = "std"))] |
4 | | use crate::KeyLogFile; |
5 | | |
6 | | /// This trait represents the ability to do something useful |
7 | | /// with key material, such as logging it to a file for debugging. |
8 | | /// |
9 | | /// Naturally, secrets passed over the interface are *extremely* |
10 | | /// sensitive and can break the security of past, present and |
11 | | /// future sessions. |
12 | | /// |
13 | | /// You'll likely want some interior mutability in your |
14 | | /// implementation to make this useful. |
15 | | /// |
16 | | /// See [`KeyLogFile`] that implements the standard |
17 | | /// `SSLKEYLOGFILE` environment variable behaviour. |
18 | | pub trait KeyLog: Debug + Send + Sync { |
19 | | /// Log the given `secret`. `client_random` is provided for |
20 | | /// session identification. `label` describes precisely what |
21 | | /// `secret` means: |
22 | | /// |
23 | | /// - `CLIENT_RANDOM`: `secret` is the master secret for a TLSv1.2 session. |
24 | | /// - `CLIENT_EARLY_TRAFFIC_SECRET`: `secret` encrypts early data |
25 | | /// transmitted by a client |
26 | | /// - `SERVER_HANDSHAKE_TRAFFIC_SECRET`: `secret` encrypts |
27 | | /// handshake messages from the server during a TLSv1.3 handshake. |
28 | | /// - `CLIENT_HANDSHAKE_TRAFFIC_SECRET`: `secret` encrypts |
29 | | /// handshake messages from the client during a TLSv1.3 handshake. |
30 | | /// - `SERVER_TRAFFIC_SECRET_0`: `secret` encrypts post-handshake data |
31 | | /// from the server in a TLSv1.3 session. |
32 | | /// - `CLIENT_TRAFFIC_SECRET_0`: `secret` encrypts post-handshake data |
33 | | /// from the client in a TLSv1.3 session. |
34 | | /// - `EXPORTER_SECRET`: `secret` is the post-handshake exporter secret |
35 | | /// in a TLSv1.3 session. |
36 | | /// |
37 | | /// These strings are selected to match the NSS key log format: |
38 | | /// <https://nss-crypto.org/reference/security/nss/legacy/key_log_format/index.html> |
39 | | fn log(&self, label: &str, client_random: &[u8], secret: &[u8]); |
40 | | |
41 | | /// Indicates whether the secret with label `label` will be logged. |
42 | | /// |
43 | | /// If `will_log` returns true then `log` will be called with the secret. |
44 | | /// Otherwise, `log` will not be called for the secret. This is a |
45 | | /// performance optimization. |
46 | 0 | fn will_log(&self, _label: &str) -> bool { |
47 | 0 | true |
48 | 0 | } |
49 | | } |
50 | | |
51 | | /// KeyLog that does exactly nothing. |
52 | | #[derive(Debug)] |
53 | | pub struct NoKeyLog; |
54 | | |
55 | | impl KeyLog for NoKeyLog { |
56 | 0 | fn log(&self, _: &str, _: &[u8], _: &[u8]) {} |
57 | | #[inline] |
58 | 0 | fn will_log(&self, _label: &str) -> bool { |
59 | 0 | false |
60 | 0 | } |
61 | | } |