Skip to content

Commit 94b2871

Browse files
davidbenagl
authored andcommitted
Remove SSL_export_early_keying_material.
We did not end up needing this feature. Removing it trims 64 bytes of per-connection memory. Change-Id: Ifb8e66af2d583b6bf00c63f509eda8e8691d452a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/36789 Reviewed-by: Adam Langley <agl@google.com>
1 parent 2c65707 commit 94b2871

File tree

10 files changed

+3
-273
lines changed

10 files changed

+3
-273
lines changed

include/openssl/ssl.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3327,13 +3327,6 @@ OPENSSL_EXPORT int SSL_early_data_accepted(const SSL *ssl);
33273327
// |SSL_ERROR_EARLY_DATA_REJECTED|.
33283328
OPENSSL_EXPORT void SSL_reset_early_data_reject(SSL *ssl);
33293329

3330-
// SSL_export_early_keying_material behaves like |SSL_export_keying_material|,
3331-
// but it uses the early exporter. The operation will fail if |ssl| did not
3332-
// negotiate TLS 1.3 or 0-RTT.
3333-
OPENSSL_EXPORT int SSL_export_early_keying_material(
3334-
SSL *ssl, uint8_t *out, size_t out_len, const char *label, size_t label_len,
3335-
const uint8_t *context, size_t context_len);
3336-
33373330
// SSL_get_ticket_age_skew returns the difference, in seconds, between the
33383331
// client-sent ticket age and the server-computed value in TLS 1.3 server
33393332
// connections which resumed a session.

ssl/internal.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2296,11 +2296,9 @@ struct SSL3_STATE {
22962296
uint8_t write_traffic_secret[EVP_MAX_MD_SIZE] = {0};
22972297
uint8_t read_traffic_secret[EVP_MAX_MD_SIZE] = {0};
22982298
uint8_t exporter_secret[EVP_MAX_MD_SIZE] = {0};
2299-
uint8_t early_exporter_secret[EVP_MAX_MD_SIZE] = {0};
23002299
uint8_t write_traffic_secret_len = 0;
23012300
uint8_t read_traffic_secret_len = 0;
23022301
uint8_t exporter_secret_len = 0;
2303-
uint8_t early_exporter_secret_len = 0;
23042302

23052303
// Connection binding to prevent renegotiation attacks
23062304
uint8_t previous_client_finished[12] = {0};

ssl/t1_enc.cc

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -359,27 +359,3 @@ int SSL_export_keying_material(SSL *ssl, uint8_t *out, size_t out_len,
359359
MakeConstSpan(session->master_key, session->master_key_length),
360360
MakeConstSpan(label, label_len), seed, {});
361361
}
362-
363-
int SSL_export_early_keying_material(
364-
SSL *ssl, uint8_t *out, size_t out_len, const char *label, size_t label_len,
365-
const uint8_t *context, size_t context_len) {
366-
if (!SSL_in_early_data(ssl) &&
367-
(!ssl->s3->have_version ||
368-
ssl_protocol_version(ssl) < TLS1_3_VERSION)) {
369-
OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SSL_VERSION);
370-
return 0;
371-
}
372-
373-
// The early exporter only exists if we accepted early data or offered it as
374-
// a client.
375-
if (!SSL_in_early_data(ssl) && !SSL_early_data_accepted(ssl)) {
376-
OPENSSL_PUT_ERROR(SSL, SSL_R_EARLY_DATA_NOT_IN_USE);
377-
return 0;
378-
}
379-
380-
return tls13_export_keying_material(
381-
ssl, MakeSpan(out, out_len),
382-
MakeConstSpan(ssl->s3->early_exporter_secret,
383-
ssl->s3->early_exporter_secret_len),
384-
MakeConstSpan(label, label_len), MakeConstSpan(context, context_len));
385-
}

ssl/test/bssl_shim.cc

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -872,22 +872,6 @@ static bool DoExchange(bssl::UniquePtr<SSL_SESSION> *out_session,
872872
GetTestState(ssl)->got_new_session = false;
873873
}
874874

875-
if (config->export_early_keying_material > 0) {
876-
std::vector<uint8_t> result(
877-
static_cast<size_t>(config->export_early_keying_material));
878-
if (!SSL_export_early_keying_material(
879-
ssl, result.data(), result.size(), config->export_label.data(),
880-
config->export_label.size(),
881-
reinterpret_cast<const uint8_t *>(config->export_context.data()),
882-
config->export_context.size())) {
883-
fprintf(stderr, "failed to export keying material\n");
884-
return false;
885-
}
886-
if (WriteAll(ssl, result.data(), result.size()) < 0) {
887-
return false;
888-
}
889-
}
890-
891875
if (config->export_keying_material > 0) {
892876
std::vector<uint8_t> result(
893877
static_cast<size_t>(config->export_keying_material));

ssl/test/runner/common.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,21 +1326,6 @@ type ProtocolBugs struct {
13261326
// it was accepted.
13271327
SendEarlyDataExtension bool
13281328

1329-
// ExpectEarlyKeyingMaterial, if non-zero, causes a TLS 1.3 server to
1330-
// read an application data record after the ClientHello before it sends
1331-
// a ServerHello. The record's contents have the specified length and
1332-
// match the corresponding early exporter value. This is used to test
1333-
// the client using the early exporter in the 0-RTT state.
1334-
ExpectEarlyKeyingMaterial int
1335-
1336-
// ExpectEarlyKeyingLabel is the label to use with
1337-
// ExpectEarlyKeyingMaterial.
1338-
ExpectEarlyKeyingLabel string
1339-
1340-
// ExpectEarlyKeyingContext is the context string to use with
1341-
// ExpectEarlyKeyingMaterial
1342-
ExpectEarlyKeyingContext string
1343-
13441329
// ExpectEarlyData causes a TLS 1.3 server to read application
13451330
// data after the ClientHello (assuming the server is able to
13461331
// derive the key under which the data is encrypted) before it

ssl/test/runner/handshake_server.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -726,16 +726,7 @@ ResendHelloRetryRequest:
726726
}
727727

728728
c.earlyCipherSuite = hs.suite
729-
expectEarlyData := config.Bugs.ExpectEarlyData
730-
if n := config.Bugs.ExpectEarlyKeyingMaterial; n > 0 {
731-
exporter, err := c.ExportEarlyKeyingMaterial(n, []byte(config.Bugs.ExpectEarlyKeyingLabel), []byte(config.Bugs.ExpectEarlyKeyingContext))
732-
if err != nil {
733-
return err
734-
}
735-
expectEarlyData = append([][]byte{exporter}, expectEarlyData...)
736-
}
737-
738-
for _, expectedMsg := range expectEarlyData {
729+
for _, expectedMsg := range config.Bugs.ExpectEarlyData {
739730
if err := c.readRecord(recordTypeApplicationData); err != nil {
740731
return err
741732
}

ssl/test/runner/runner.go

Lines changed: 1 addition & 190 deletions
Original file line numberDiff line numberDiff line change
@@ -589,9 +589,6 @@ type testCase struct {
589589
exportLabel string
590590
exportContext string
591591
useExportContext bool
592-
// exportEarlyKeyingMaterial, if non-zero, behaves like
593-
// exportKeyingMaterial, but for the early exporter.
594-
exportEarlyKeyingMaterial int
595592
// flags, if not empty, contains a list of command-line flags that will
596593
// be passed to the shim program.
597594
flags []string
@@ -881,20 +878,6 @@ func doExchange(test *testCase, config *Config, conn net.Conn, isResume bool, tr
881878
}
882879
}
883880

884-
if isResume && test.exportEarlyKeyingMaterial > 0 {
885-
actual := make([]byte, test.exportEarlyKeyingMaterial)
886-
if _, err := io.ReadFull(tlsConn, actual); err != nil {
887-
return err
888-
}
889-
expected, err := tlsConn.ExportEarlyKeyingMaterial(test.exportEarlyKeyingMaterial, []byte(test.exportLabel), []byte(test.exportContext))
890-
if err != nil {
891-
return err
892-
}
893-
if !bytes.Equal(actual, expected) {
894-
return fmt.Errorf("early keying material mismatch; got %x, wanted %x", actual, expected)
895-
}
896-
}
897-
898881
if test.exportKeyingMaterial > 0 {
899882
actual := make([]byte, test.exportKeyingMaterial)
900883
if _, err := io.ReadFull(tlsConn, actual); err != nil {
@@ -1272,10 +1255,7 @@ func runTest(test *testCase, shimPath string, mallocNumToFail int64) error {
12721255
flags = append(flags, "-use-export-context")
12731256
}
12741257
}
1275-
if test.exportEarlyKeyingMaterial > 0 {
1276-
flags = append(flags, "-on-resume-export-early-keying-material", strconv.Itoa(test.exportEarlyKeyingMaterial))
1277-
}
1278-
if test.exportKeyingMaterial > 0 || test.exportEarlyKeyingMaterial > 0 {
1258+
if test.exportKeyingMaterial > 0 {
12791259
flags = append(flags, "-export-label", test.exportLabel)
12801260
flags = append(flags, "-export-context", test.exportContext)
12811261
}
@@ -10146,106 +10126,6 @@ func addExportKeyingMaterialTests() {
1014610126
expectedError: ":HANDSHAKE_NOT_COMPLETE:",
1014710127
})
1014810128

10149-
// Test the early exporter works while the client is
10150-
// sending 0-RTT data. This data arrives during the
10151-
// server handshake, so we test it with ProtocolBugs.
10152-
testCases = append(testCases, testCase{
10153-
name: "ExportEarlyKeyingMaterial-Client-InEarlyData-" + vers.name,
10154-
config: Config{
10155-
MaxVersion: vers.version,
10156-
MaxEarlyDataSize: 16384,
10157-
},
10158-
resumeConfig: &Config{
10159-
MaxVersion: vers.version,
10160-
MaxEarlyDataSize: 16384,
10161-
Bugs: ProtocolBugs{
10162-
ExpectEarlyKeyingMaterial: 1024,
10163-
ExpectEarlyKeyingLabel: "label",
10164-
ExpectEarlyKeyingContext: "context",
10165-
},
10166-
},
10167-
resumeSession: true,
10168-
flags: []string{
10169-
"-enable-early-data",
10170-
"-expect-ticket-supports-early-data",
10171-
"-on-resume-expect-accept-early-data",
10172-
"-on-resume-export-early-keying-material", "1024",
10173-
"-on-resume-export-label", "label",
10174-
"-on-resume-export-context", "context",
10175-
},
10176-
})
10177-
10178-
// Test the early exporter still works on the client
10179-
// after the handshake is confirmed. This arrives after
10180-
// the server handshake, so the normal hooks work.
10181-
testCases = append(testCases, testCase{
10182-
name: "ExportEarlyKeyingMaterial-Client-EarlyDataAccept-" + vers.name,
10183-
config: Config{
10184-
MaxVersion: vers.version,
10185-
MaxEarlyDataSize: 16384,
10186-
},
10187-
resumeConfig: &Config{
10188-
MaxVersion: vers.version,
10189-
MaxEarlyDataSize: 16384,
10190-
},
10191-
resumeSession: true,
10192-
exportEarlyKeyingMaterial: 1024,
10193-
exportLabel: "label",
10194-
exportContext: "context",
10195-
flags: []string{
10196-
"-enable-early-data",
10197-
"-expect-ticket-supports-early-data",
10198-
"-on-resume-expect-accept-early-data",
10199-
// Handshake twice on the client to force
10200-
// handshake confirmation.
10201-
"-handshake-twice",
10202-
},
10203-
})
10204-
10205-
// Test the early exporter does not work on the client
10206-
// if 0-RTT was not offered.
10207-
testCases = append(testCases, testCase{
10208-
name: "NoExportEarlyKeyingMaterial-Client-Initial-" + vers.name,
10209-
config: Config{
10210-
MaxVersion: vers.version,
10211-
},
10212-
flags: []string{"-export-early-keying-material", "1024"},
10213-
shouldFail: true,
10214-
expectedError: ":EARLY_DATA_NOT_IN_USE:",
10215-
})
10216-
testCases = append(testCases, testCase{
10217-
name: "NoExportEarlyKeyingMaterial-Client-Resume-" + vers.name,
10218-
config: Config{
10219-
MaxVersion: vers.version,
10220-
},
10221-
resumeSession: true,
10222-
flags: []string{"-on-resume-export-early-keying-material", "1024"},
10223-
shouldFail: true,
10224-
expectedError: ":EARLY_DATA_NOT_IN_USE:",
10225-
})
10226-
10227-
// Test the early exporter does not work on the client
10228-
// after a 0-RTT reject.
10229-
testCases = append(testCases, testCase{
10230-
name: "NoExportEarlyKeyingMaterial-Client-EarlyDataReject-" + vers.name,
10231-
config: Config{
10232-
MaxVersion: vers.version,
10233-
MaxEarlyDataSize: 16384,
10234-
Bugs: ProtocolBugs{
10235-
AlwaysRejectEarlyData: true,
10236-
},
10237-
},
10238-
resumeSession: true,
10239-
flags: []string{
10240-
"-enable-early-data",
10241-
"-expect-ticket-supports-early-data",
10242-
"-expect-reject-early-data",
10243-
"-on-retry-export-early-keying-material", "1024",
10244-
},
10245-
shouldFail: true,
10246-
expectedError: ":EARLY_DATA_NOT_IN_USE:",
10247-
})
10248-
1024910129
// Test the normal exporter on the server in half-RTT.
1025010130
testCases = append(testCases, testCase{
1025110131
testType: serverTest,
@@ -10264,75 +10144,6 @@ func addExportKeyingMaterialTests() {
1026410144
useExportContext: true,
1026510145
flags: []string{"-enable-early-data"},
1026610146
})
10267-
10268-
// Test the early exporter works on the server in half-RTT.
10269-
testCases = append(testCases, testCase{
10270-
testType: serverTest,
10271-
name: "ExportEarlyKeyingMaterial-Server-HalfRTT-" + vers.name,
10272-
config: Config{
10273-
MaxVersion: vers.version,
10274-
Bugs: ProtocolBugs{
10275-
SendEarlyData: [][]byte{},
10276-
ExpectEarlyDataAccepted: true,
10277-
},
10278-
},
10279-
resumeSession: true,
10280-
exportEarlyKeyingMaterial: 1024,
10281-
exportLabel: "label",
10282-
exportContext: "context",
10283-
flags: []string{"-enable-early-data"},
10284-
})
10285-
10286-
// Test the early exporter does not work on the server
10287-
// if 0-RTT was not offered.
10288-
testCases = append(testCases, testCase{
10289-
testType: serverTest,
10290-
name: "NoExportEarlyKeyingMaterial-Server-Initial-" + vers.name,
10291-
config: Config{
10292-
MaxVersion: vers.version,
10293-
},
10294-
flags: []string{"-export-early-keying-material", "1024"},
10295-
shouldFail: true,
10296-
expectedError: ":EARLY_DATA_NOT_IN_USE:",
10297-
})
10298-
testCases = append(testCases, testCase{
10299-
testType: serverTest,
10300-
name: "NoExportEarlyKeyingMaterial-Server-Resume-" + vers.name,
10301-
config: Config{
10302-
MaxVersion: vers.version,
10303-
},
10304-
resumeSession: true,
10305-
flags: []string{"-on-resume-export-early-keying-material", "1024"},
10306-
shouldFail: true,
10307-
expectedError: ":EARLY_DATA_NOT_IN_USE:",
10308-
})
10309-
} else {
10310-
// Test the early exporter fails before TLS 1.3.
10311-
testCases = append(testCases, testCase{
10312-
name: "NoExportEarlyKeyingMaterial-Client-" + vers.name,
10313-
config: Config{
10314-
MaxVersion: vers.version,
10315-
},
10316-
resumeSession: true,
10317-
exportEarlyKeyingMaterial: 1024,
10318-
exportLabel: "label",
10319-
exportContext: "context",
10320-
shouldFail: true,
10321-
expectedError: ":WRONG_SSL_VERSION:",
10322-
})
10323-
testCases = append(testCases, testCase{
10324-
testType: serverTest,
10325-
name: "NoExportEarlyKeyingMaterial-Server-" + vers.name,
10326-
config: Config{
10327-
MaxVersion: vers.version,
10328-
},
10329-
resumeSession: true,
10330-
exportEarlyKeyingMaterial: 1024,
10331-
exportLabel: "label",
10332-
exportContext: "context",
10333-
shouldFail: true,
10334-
expectedError: ":WRONG_SSL_VERSION:",
10335-
})
1033610147
}
1033710148
}
1033810149

ssl/test/test_config.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,6 @@ const Flag<int> kIntFlags[] = {
207207
{"-max-version", &TestConfig::max_version},
208208
{"-expect-version", &TestConfig::expect_version},
209209
{"-mtu", &TestConfig::mtu},
210-
{"-export-early-keying-material",
211-
&TestConfig::export_early_keying_material},
212210
{"-export-keying-material", &TestConfig::export_keying_material},
213211
{"-expect-total-renegotiations", &TestConfig::expect_total_renegotiations},
214212
{"-expect-peer-signature-algorithm",

ssl/test/test_config.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ struct TestConfig {
8989
bool fail_cert_callback = false;
9090
std::string cipher;
9191
bool handshake_never_done = false;
92-
int export_early_keying_material = 0;
9392
int export_keying_material = 0;
9493
std::string export_label;
9594
std::string export_context;

ssl/tls13_enc.cc

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level,
215215

216216

217217
static const char kTLS13LabelExporter[] = "exp master";
218-
static const char kTLS13LabelEarlyExporter[] = "e exp master";
219218

220219
static const char kTLS13LabelClientEarlyTraffic[] = "c e traffic";
221220
static const char kTLS13LabelClientHandshakeTraffic[] = "c hs traffic";
@@ -229,13 +228,9 @@ bool tls13_derive_early_secrets(SSL_HANDSHAKE *hs) {
229228
kTLS13LabelClientEarlyTraffic,
230229
strlen(kTLS13LabelClientEarlyTraffic)) ||
231230
!ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET",
232-
hs->early_traffic_secret, hs->hash_len) ||
233-
!derive_secret(hs, ssl->s3->early_exporter_secret, hs->hash_len,
234-
kTLS13LabelEarlyExporter,
235-
strlen(kTLS13LabelEarlyExporter))) {
231+
hs->early_traffic_secret, hs->hash_len)) {
236232
return false;
237233
}
238-
ssl->s3->early_exporter_secret_len = hs->hash_len;
239234

240235
if (ssl->quic_method != nullptr) {
241236
if (ssl->server) {

0 commit comments

Comments
 (0)