Skip to content

Commit 1c048fc

Browse files
committed
added rsa pms protocol version field as modifiable variable
1 parent 0e910b1 commit 1c048fc

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

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)