Skip to content

Commit 8e40553

Browse files
authored
Merge pull request #565 from RUB-NDS/rsaVersionField
added rsa pms protocol version field as modifiable variable
2 parents 0e910b1 + 313c0bc commit 8e40553

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# TLS-Attacker
22

3-
[![release](https://img.shields.io/badge/Release-v2.9-blue.svg)](https://github.com/RUB-NDS/TLS-Attacker/releases)
3+
[![release](https://img.shields.io/badge/Release-v3.0-blue.svg)](https://github.com/RUB-NDS/TLS-Attacker/releases)
44
![licence](https://img.shields.io/badge/License-Apachev2-brightgreen.svg)
55
[![travis](https://travis-ci.org/RUB-NDS/TLS-Attacker.svg?branch=master)](https://travis-ci.org/RUB-NDS/TLS-Attacker)
66

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/message/computations/RSAClientComputations.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ public class RSAClientComputations extends KeyExchangeComputations {
1919

2020
private static final Logger LOGGER = LogManager.getLogger();
2121

22+
@ModifiableVariableProperty(type = ModifiableVariableProperty.Type.KEY_MATERIAL)
23+
private ModifiableByteArray premasterSecretProtocolVersion;
24+
2225
@ModifiableVariableProperty(format = ModifiableVariableProperty.Format.PKCS1, type = ModifiableVariableProperty.Type.KEY_MATERIAL)
2326
private ModifiableByteArray plainPaddedPremasterSecret;
2427

@@ -53,6 +56,19 @@ public void setPadding(byte[] padding) {
5356
this.padding = ModifiableVariableFactory.safelySetValue(this.padding, padding);
5457
}
5558

59+
public ModifiableByteArray getPremasterSecretProtocolVersion() {
60+
return premasterSecretProtocolVersion;
61+
}
62+
63+
public void setPremasterSecretProtocolVersion(ModifiableByteArray premasterSecretProtocolVersion) {
64+
this.premasterSecretProtocolVersion = premasterSecretProtocolVersion;
65+
}
66+
67+
public void setPremasterSecretProtocolVersion(byte[] premasterSecretProtocolVersion) {
68+
this.premasterSecretProtocolVersion = ModifiableVariableFactory.safelySetValue(
69+
this.premasterSecretProtocolVersion, premasterSecretProtocolVersion);
70+
}
71+
5672
@Override
5773
public void setSecretsInConfig(Config config) {
5874
LOGGER.debug("Nothing to do here, since the client has no private key");

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,16 @@ protected byte[] generatePremasterSecret() {
5252
LOGGER.debug("Using preset PreMasterSecret from context.");
5353
return tempPremasterSecret;
5454
}
55-
tempPremasterSecret = new byte[HandshakeByteLength.PREMASTER_SECRET];
56-
chooser.getContext().getRandom().nextBytes(tempPremasterSecret);
57-
tempPremasterSecret[0] = chooser.getHighestClientProtocolVersion().getMajor();
58-
tempPremasterSecret[1] = chooser.getHighestClientProtocolVersion().getMinor();
59-
return tempPremasterSecret;
55+
msg.getComputations().setPremasterSecretProtocolVersion(chooser.getHighestClientProtocolVersion().getValue());
56+
if (msg.getComputations().getPremasterSecretProtocolVersion().getValue().length > HandshakeByteLength.PREMASTER_SECRET) {
57+
return msg.getComputations().getPlainPaddedPremasterSecret().getValue();
58+
} else {
59+
tempPremasterSecret = new byte[HandshakeByteLength.PREMASTER_SECRET
60+
- msg.getComputations().getPremasterSecretProtocolVersion().getValue().length];
61+
chooser.getContext().getRandom().nextBytes(tempPremasterSecret);
62+
return ArrayConverter.concatenate(msg.getComputations().getPremasterSecretProtocolVersion().getValue(),
63+
tempPremasterSecret);
64+
}
6065
}
6166

6267
protected RSAPublicKey generateFreshKey() {
@@ -158,6 +163,11 @@ public void prepareAfterParse(boolean clientMode) {
158163
paddedPremasterSecret.length);
159164
premasterSecret = manipulatePremasterSecret(premasterSecret);
160165
preparePremasterSecret(msg);
166+
if (premasterSecret.length > 2) {
167+
msg.getComputations().setPremasterSecretProtocolVersion(Arrays.copyOfRange(premasterSecret, 0, 2));
168+
} else {
169+
LOGGER.warn("Decrypted PMS is not long enough to contain protocol version bytes");
170+
}
161171
} else {
162172
LOGGER.warn("RandomByteLength too short! Using empty premasterSecret!");
163173
premasterSecret = new byte[0];

0 commit comments

Comments
 (0)