Skip to content

Commit 75f7959

Browse files
Merge pull request #660 from RUB-NDS/esni_improvements
Fixed ESNI Extension
2 parents d9fc910 + d3593a5 commit 75f7959

File tree

4 files changed

+59
-21
lines changed

4 files changed

+59
-21
lines changed

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/config/Config.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,13 @@ public static Config createEmptyConfig() {
11401140

11411141
private ECPointFormat defaultSelectedPointFormat = ECPointFormat.UNCOMPRESSED;
11421142

1143+
/**
1144+
* Private Key of the Client for the EncryptedServerNameIndication
1145+
* extension.
1146+
*/
1147+
private BigInteger defaultEsniClientPrivateKey = new BigInteger(
1148+
"191991257030464195512760799659436374116556484140110877679395918219072292938297573720808302564562486757422301181089761");
1149+
11431150
/**
11441151
* Supported Ciphersuites for EncryptedServerNameIndication extension.
11451152
*/
@@ -3645,4 +3652,13 @@ public String getKeylogFilePath() {
36453652
public void setKeylogFilePath(String keylogFilePath) {
36463653
this.keylogFilePath = keylogFilePath;
36473654
}
3655+
3656+
public BigInteger getDefaultEsniClientPrivateKey() {
3657+
return defaultEsniClientPrivateKey;
3658+
}
3659+
3660+
public void setDefaultEsniClientPrivateKey(BigInteger defaultEsniClientPrivateKey) {
3661+
this.defaultEsniClientPrivateKey = defaultEsniClientPrivateKey;
3662+
}
3663+
36483664
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/parser/extension/EncryptedServerNameIndicationExtensionParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private void parseKeyShareEntry(EncryptedServerNameIndicationExtensionMessage ms
7575
private void parseRecordDigestLength(EncryptedServerNameIndicationExtensionMessage msg) {
7676
int digestLen = parseIntField(ExtensionByteLength.RECORD_DIGEST_LENGTH);
7777
msg.setRecordDigestLength(digestLen);
78-
LOGGER.debug("recordDigestLength: " + msg.getRecordDigestLength().getOriginalValue());
78+
LOGGER.debug("recordDigestLength: " + msg.getRecordDigestLength().getValue());
7979
}
8080

8181
private void parseRecordDigest(EncryptedServerNameIndicationExtensionMessage msg) {

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/preparator/extension/EncryptedServerNameIndicationExtensionPreparator.java

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import de.rub.nds.tlsattacker.core.protocol.message.ClientHelloMessage;
4141
import de.rub.nds.tlsattacker.core.protocol.message.extension.ClientEsniInner;
4242
import de.rub.nds.tlsattacker.core.protocol.message.extension.EncryptedServerNameIndicationExtensionMessage;
43+
import de.rub.nds.tlsattacker.core.protocol.message.extension.ExtensionMessage;
44+
import de.rub.nds.tlsattacker.core.protocol.message.extension.KeyShareExtensionMessage;
4345
import de.rub.nds.tlsattacker.core.protocol.message.extension.keyshare.KeyShareEntry;
4446
import de.rub.nds.tlsattacker.core.protocol.message.extension.keyshare.KeyShareStoreEntry;
4547
import de.rub.nds.tlsattacker.core.protocol.parser.extension.ClientEsniInnerParser;
@@ -240,6 +242,7 @@ private void prepareNamedGroup(EncryptedServerNameIndicationExtensionMessage msg
240242

241243
private void prepareKeyShareEntry(EncryptedServerNameIndicationExtensionMessage msg) {
242244
KeyShareEntry keyShareEntry = msg.getKeyShareEntry();
245+
keyShareEntry.setPrivateKey(chooser.getConfig().getDefaultEsniClientPrivateKey());
243246
KeyShareEntryPreparator keyShareEntryPreparator = new KeyShareEntryPreparator(chooser, keyShareEntry);
244247
keyShareEntryPreparator.prepare();
245248
LOGGER.debug("ClientPrivateKey: "
@@ -382,6 +385,7 @@ private void prepareEsniMasterSecret(EncryptedServerNameIndicationExtensionMessa
382385
}
383386

384387
private void prepareEsniKey(EncryptedServerNameIndicationExtensionMessage msg) {
388+
385389
byte[] key = null;
386390
byte[] esniMasterSecret = msg.getEncryptedSniComputation().getEsniMasterSecret().getValue();
387391
byte[] hashIn = msg.getEncryptedSniComputation().getEsniContentsHash().getValue();
@@ -415,36 +419,53 @@ private void prepareEsniIv(EncryptedServerNameIndicationExtensionMessage msg) {
415419
}
416420

417421
private void prepareClientHelloKeyShare(EncryptedServerNameIndicationExtensionMessage msg) {
418-
ByteArrayOutputStream clientKeyShareStream = new ByteArrayOutputStream();
422+
int keyShareListBytesLength = 0;
423+
byte[] keyShareListBytesLengthField = null;
424+
byte[] keyShareListBytes = null;
419425
ByteArrayOutputStream clientHelloKeyShareStream = new ByteArrayOutputStream();
426+
boolean isClientHelloExensionsFound = false;
427+
if (clientHelloMessage != null) {
420428

421-
for (KeyShareStoreEntry pair : chooser.getClientKeyShares()) {
422-
KeyShareEntry entry = new KeyShareEntry();
423-
KeyShareEntrySerializer serializer = new KeyShareEntrySerializer(entry);
424-
entry.setGroup(pair.getGroup().getValue());
425-
entry.setPublicKeyLength(pair.getPublicKey().length);
426-
entry.setPublicKey(pair.getPublicKey());
427-
try {
428-
clientKeyShareStream.write(serializer.serialize());
429-
} catch (IOException e) {
430-
throw new PreparationException("Failed to write esniContents", e);
429+
List<ExtensionMessage> clientHelloExtensions = clientHelloMessage.getExtensions();
430+
for (ExtensionMessage m : clientHelloExtensions) {
431+
if (m instanceof KeyShareExtensionMessage) {
432+
KeyShareExtensionMessage keyShareExtensionMessage = (KeyShareExtensionMessage) m;
433+
keyShareListBytesLength = keyShareExtensionMessage.getKeyShareListLength().getValue();
434+
keyShareListBytes = keyShareExtensionMessage.getKeyShareListBytes().getValue();
435+
isClientHelloExensionsFound = true;
436+
break;
437+
}
431438
}
432439
}
433-
byte[] keyShareListBytes = clientKeyShareStream.toByteArray();
434-
int keyShareListBytesLength = keyShareListBytes.length;
435-
byte[] keyShareListBytesLengthFild = ArrayConverter.intToBytes(keyShareListBytesLength,
440+
if (!isClientHelloExensionsFound) {
441+
ByteArrayOutputStream keyShareListStream = new ByteArrayOutputStream();
442+
for (KeyShareStoreEntry pair : chooser.getClientKeyShares()) {
443+
KeyShareEntry entry = new KeyShareEntry();
444+
KeyShareEntrySerializer serializer = new KeyShareEntrySerializer(entry);
445+
entry.setGroup(pair.getGroup().getValue());
446+
entry.setPublicKeyLength(pair.getPublicKey().length);
447+
entry.setPublicKey(pair.getPublicKey());
448+
try {
449+
keyShareListStream.write(serializer.serialize());
450+
} catch (IOException e) {
451+
throw new PreparationException("Failed to write esniContents", e);
452+
}
453+
}
454+
keyShareListBytes = keyShareListStream.toByteArray();
455+
keyShareListBytesLength = keyShareListBytes.length;
456+
}
457+
458+
keyShareListBytesLengthField = ArrayConverter.intToBytes(keyShareListBytesLength,
436459
ExtensionByteLength.KEY_SHARE_LIST_LENGTH);
437460
try {
438-
clientHelloKeyShareStream.write(keyShareListBytesLengthFild);
461+
clientHelloKeyShareStream.write(keyShareListBytesLengthField);
439462
clientHelloKeyShareStream.write(keyShareListBytes);
440463
} catch (IOException e) {
441-
throw new PreparationException("Failed to write esniContents", e);
464+
throw new PreparationException("Failed to write ClientHelloKeyShare", e);
442465
}
443-
444466
byte[] clientHelloKeyShareBytes = clientHelloKeyShareStream.toByteArray();
445467
msg.getEncryptedSniComputation().setClientHelloKeyShare(clientHelloKeyShareBytes);
446-
LOGGER.debug("clientHelloKeyShare: "
447-
+ ArrayConverter.bytesToHexString(msg.getEncryptedSniComputation().getClientHelloKeyShare().getValue()));
468+
LOGGER.debug("clientHelloKeyShare: " + ArrayConverter.bytesToHexString(clientHelloKeyShareBytes));
448469
}
449470

450471
private void prepareEncryptedSni(EncryptedServerNameIndicationExtensionMessage msg) {
@@ -513,7 +534,7 @@ private void prepareEncryptedSniLength(EncryptedServerNameIndicationExtensionMes
513534
private void prepareServerNonce(EncryptedServerNameIndicationExtensionMessage msg) {
514535
byte[] receivedClientNonce = chooser.getEsniClientNonce();
515536
msg.setServerNonce(receivedClientNonce);
516-
LOGGER.debug("ServerNonce: " + msg.getServerNonce().getValue());
537+
LOGGER.debug("ServerNonce: " + ArrayConverter.bytesToHexString(msg.getServerNonce().getValue()));
517538
}
518539

519540
private byte[] generateEsniContents(EncryptedServerNameIndicationExtensionMessage msg) {

TLS-Core/src/main/resources/default_config.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,7 @@ A9 DA F4 93 96 CF 12 EC 47 EF A7 A0 D3 88 2F 8B
11331133
<defaultServerPWDSalt>96 3C 77 CD C1 3A 2A 8D 75 CD DD D1 E0 44 99 29 84 37 11 C2 1D 47 CE 6E 63 83 CD DA 37 E4 7D A3</defaultServerPWDSalt>
11341134
<parseInvalidRecordsUnencrypted>false</parseInvalidRecordsUnencrypted>
11351135
<defaultSelectedPointFormat>UNCOMPRESSED</defaultSelectedPointFormat>
1136+
<defaultEsniClientPrivateKey>191991257030464195512760799659436374116556484140110877679395918219072292938297573720808302564562486757422301181089761</defaultEsniClientPrivateKey>
11361137
<defaultEsniClientNonce>A7 28 4C 9A 52 F1 5C 13 64 4B 94 72 61 77 46 57</defaultEsniClientNonce>
11371138
<defaultEsniServerNonce>00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</defaultEsniServerNonce>
11381139
<defaultEsniRecordBytes>FF 01 00 12 4B 2A 00 24 00 1D 00 20 FA 57 2D 03 E2 1E 15 F9 CA 1A A7 FB 85 F6 1B 9F C7 84 58 A7 80 50 AC 58 18 11 86 33 25 94 44 12 00 02 13 01 01 04 00 00 00 00 5D CC 3A 45 00 00 00 00 5D DA 12 05 00 00</defaultEsniRecordBytes>

0 commit comments

Comments
 (0)