Skip to content

Commit 15e6b51

Browse files
committed
Added DTLS message information class containing seq/epoch numbers. The receiver helper also returns those in output
1 parent c1174f5 commit 15e6b51

File tree

9 files changed

+106
-27
lines changed

9 files changed

+106
-27
lines changed

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,10 +1116,10 @@ public static Config createEmptyConfig() {
11161116
.hexStringToByteArray("963c77cdc13a2a8d75cdddd1e0449929843711c21d47ce6e6383cdda37e47da3");
11171117

11181118
private ECPointFormat defaultSelectedPointFormat = ECPointFormat.UNCOMPRESSED;
1119-
1119+
11201120
/**
1121-
* TLS-Attacker will parse encrypted messages with invalid MAC or padding
1122-
* as unknown if this option is set.
1121+
* TLS-Attacker will parse encrypted messages with invalid MAC or padding as
1122+
* unknown if this option is set.
11231123
*/
11241124
private Boolean doNotParseInvalidMacOrPadMessages = false;
11251125

@@ -3359,12 +3359,12 @@ public Boolean isAddPWDProtectExtension() {
33593359
public void setAddPWDProtectExtension(Boolean addPWDProtectExtension) {
33603360
this.addPWDProtectExtension = addPWDProtectExtension;
33613361
}
3362-
3362+
33633363
public Boolean isDoNotParseInvalidMacOrPadMessages() {
3364-
return doNotParseInvalidMacOrPadMessages;
3364+
return doNotParseInvalidMacOrPadMessages;
33653365
}
3366-
3366+
33673367
public void setDoNotParseInvalidMacOrPadMessages(Boolean doNotParseInvalidMacOrPadMessages) {
3368-
this.doNotParseInvalidMacOrPadMessages = doNotParseInvalidMacOrPadMessages;
3368+
this.doNotParseInvalidMacOrPadMessages = doNotParseInvalidMacOrPadMessages;
33693369
}
33703370
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/record/cipher/RecordAEADCipher.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ private byte[] decryptTLS12(DecryptionRequest decryptionRequest) throws CryptoEx
176176
byte[] nonce;
177177
byte[] data;
178178
if (cipherSuite.usesStrictExplicitIv()) {
179-
// TODO In the case of DTLS, we should get the sequence number from the record
179+
// TODO In the case of DTLS, we should get the sequence number from
180+
// the record
180181
nonce = ArrayConverter.longToBytes(context.getReadSequenceNumber(), SEQUENCE_NUMBER_LENGTH);
181182
data = decryptionRequest.getCipherText();
182183
} else {

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/ReceiveAction.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ public void execute(State state) throws WorkflowExecutionException {
152152
String expected = getReadableString(expectedMessages);
153153
LOGGER.debug("Receive Expected:" + expected);
154154
String received = getReadableString(messages);
155+
System.out.println(result.getMessageInformationList());
155156
if (hasDefaultAlias()) {
156157
LOGGER.info("Received Messages: " + received);
157158
} else {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package de.rub.nds.tlsattacker.core.workflow.action.executor;
2+
3+
/**
4+
* DTLS message information contains DTLS-relevant information associated with
5+
* each message. For non-handshake messages, messageSequence should be null.
6+
*/
7+
public class DtlsMessageInformation {
8+
private Integer epoch;
9+
private Integer messageSequence;
10+
11+
public DtlsMessageInformation(Integer epoch) {
12+
this.epoch = epoch;
13+
}
14+
15+
public DtlsMessageInformation(Integer epoch, Integer messageSequence) {
16+
this.epoch = epoch;
17+
this.messageSequence = messageSequence;
18+
}
19+
20+
public Integer getEpoch() {
21+
return epoch;
22+
}
23+
24+
public void setEpoch(Integer epoch) {
25+
this.epoch = epoch;
26+
}
27+
28+
public Integer getMessageSequence() {
29+
return messageSequence;
30+
}
31+
32+
public void setMessageSequence(Integer messageSequence) {
33+
this.messageSequence = messageSequence;
34+
}
35+
36+
public String toString() {
37+
StringBuilder builder = new StringBuilder();
38+
builder.append("{epoch=").append(epoch);
39+
builder.append(", message_seq=").append(messageSequence);
40+
return builder.append("}").toString();
41+
}
42+
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/FakeReceiveMessageHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public MessageActionResult receiveMessages(TlsContext context) {
4141

4242
@Override
4343
public MessageActionResult receiveMessages(List<ProtocolMessage> expectedMessages, TlsContext context) {
44-
return new MessageActionResult(recordsToReturn, messagesToReturn, null);
44+
return new MessageActionResult(recordsToReturn, messagesToReturn, null, null);
4545
}
4646

4747
public List<ProtocolMessage> getMessagesToReturn() {

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/MessageActionResult.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ public class MessageActionResult {
2323

2424
private final List<DtlsHandshakeMessageFragment> messageFragmentList;
2525

26+
private final List<DtlsMessageInformation> messageInformationList;
27+
2628
public MessageActionResult(List<AbstractRecord> recordList, List<ProtocolMessage> messageList,
27-
List<DtlsHandshakeMessageFragment> messageFragmentList) {
29+
List<DtlsHandshakeMessageFragment> messageFragmentList, List<DtlsMessageInformation> messageInformationList) {
2830
this.recordList = recordList;
2931
this.messageList = messageList;
3032
this.messageFragmentList = messageFragmentList;
33+
this.messageInformationList = messageInformationList;
3134
}
3235

3336
/**
@@ -36,7 +39,7 @@ public MessageActionResult(List<AbstractRecord> recordList, List<ProtocolMessage
3639
*/
3740
public MessageActionResult() {
3841
this(new LinkedList<AbstractRecord>(), new LinkedList<ProtocolMessage>(),
39-
new LinkedList<DtlsHandshakeMessageFragment>());
42+
new LinkedList<DtlsHandshakeMessageFragment>(), new LinkedList<DtlsMessageInformation>());
4043
}
4144

4245
public List<AbstractRecord> getRecordList() {
@@ -51,6 +54,13 @@ public List<DtlsHandshakeMessageFragment> getMessageFragmentList() {
5154
return messageFragmentList;
5255
}
5356

57+
/**
58+
* Returns message information corresponding to DTLS messages.
59+
*/
60+
public List<DtlsMessageInformation> getMessageInformationList() {
61+
return messageInformationList;
62+
}
63+
5464
/**
5565
* Merger this with other results, forming a new result.
5666
*/
@@ -59,14 +69,16 @@ public MessageActionResult merge(MessageActionResult... other) {
5969
results.add(0, this);
6070
List<AbstractRecord> recordList = new LinkedList<>();
6171
List<DtlsHandshakeMessageFragment> messageFragmentList = new LinkedList<>();
72+
List<DtlsMessageInformation> messageInfoList = new LinkedList<>();
6273
List<ProtocolMessage> messageList = new LinkedList<>();
6374

6475
for (MessageActionResult result : results) {
6576
recordList.addAll(result.getRecordList());
6677
messageFragmentList.addAll(result.getMessageFragmentList());
78+
messageInfoList.addAll(result.getMessageInformationList());
6779
messageList.addAll(result.getMessageList());
6880
}
6981

70-
return new MessageActionResult(recordList, messageList, messageFragmentList);
82+
return new MessageActionResult(recordList, messageList, messageFragmentList, messageInfoList);
7183
}
7284
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/MessageParsingResult.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515
public class MessageParsingResult {
1616
private List<ProtocolMessage> messages;
1717
private List<DtlsHandshakeMessageFragment> messageFragments;
18+
private List<DtlsMessageInformation> messageInfos;
1819

19-
public MessageParsingResult(List<ProtocolMessage> messages, List<DtlsHandshakeMessageFragment> messageFragments) {
20+
public MessageParsingResult(List<ProtocolMessage> messages, List<DtlsHandshakeMessageFragment> messageFragments,
21+
List<DtlsMessageInformation> messageInfos) {
2022
super();
2123
this.messages = messages;
2224
this.messageFragments = messageFragments;
25+
this.messageInfos = messageInfos;
2326
}
2427

2528
public List<ProtocolMessage> getMessages() {
@@ -30,4 +33,8 @@ public List<DtlsHandshakeMessageFragment> getMessageFragments() {
3033
return messageFragments;
3134
}
3235

36+
public List<DtlsMessageInformation> getMessageInfos() {
37+
return messageInfos;
38+
}
39+
3340
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/ReceiveMessageHelper.java

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@
88
*/
99
package de.rub.nds.tlsattacker.core.workflow.action.executor;
1010

11+
import java.io.ByteArrayOutputStream;
12+
import java.io.IOException;
13+
import java.util.LinkedList;
14+
import java.util.List;
15+
16+
import org.apache.logging.log4j.LogManager;
17+
import org.apache.logging.log4j.Logger;
18+
1119
import de.rub.nds.modifiablevariable.util.ArrayConverter;
1220
import de.rub.nds.tlsattacker.core.constants.AlertLevel;
1321
import de.rub.nds.tlsattacker.core.constants.HandshakeByteLength;
@@ -30,18 +38,9 @@
3038
import de.rub.nds.tlsattacker.core.protocol.message.HandshakeMessage;
3139
import de.rub.nds.tlsattacker.core.protocol.message.ProtocolMessage;
3240
import de.rub.nds.tlsattacker.core.protocol.message.SSL2HandshakeMessage;
33-
import de.rub.nds.tlsattacker.core.protocol.message.UnknownMessage;
3441
import de.rub.nds.tlsattacker.core.record.AbstractRecord;
35-
import de.rub.nds.tlsattacker.core.record.cipher.RecordNullCipher;
36-
import de.rub.nds.tlsattacker.core.record.layer.RecordLayerType;
3742
import de.rub.nds.tlsattacker.core.state.TlsContext;
3843
import de.rub.nds.tlsattacker.transport.ConnectionEndType;
39-
import java.io.ByteArrayOutputStream;
40-
import java.io.IOException;
41-
import java.util.LinkedList;
42-
import java.util.List;
43-
import org.apache.logging.log4j.LogManager;
44-
import org.apache.logging.log4j.Logger;
4544

4645
public class ReceiveMessageHelper {
4746

@@ -136,7 +135,7 @@ private MessageActionResult processRecordGroup(RecordGroup recordGroup, TlsConte
136135
MessageParsingResult messageParsingResult = parseMessages(recordGroup, context);
137136

138137
return new MessageActionResult(recordGroup.getRecords(), messageParsingResult.getMessages(),
139-
messageParsingResult.getMessageFragments());
138+
messageParsingResult.getMessageFragments(), messageParsingResult.getMessageInfos());
140139
}
141140

142141
public List<AbstractRecord> receiveRecords(TlsContext context) {
@@ -232,6 +231,7 @@ public MessageParsingResult parseMessages(RecordGroup recordGroup, TlsContext co
232231
// new groups here
233232
List<ProtocolMessage> messages = new LinkedList<>();
234233
List<DtlsHandshakeMessageFragment> messageFragments = new LinkedList<>();
234+
List<DtlsMessageInformation> dtlsMessageInfos = new LinkedList<>();
235235
for (RecordGroup group : RecordGroup.generateRecordGroups(recordGroup.getRecords(), context)) {
236236
boolean parseAsUnknown = false;
237237
if (context.getConfig().isDoNotParseInvalidMacOrPadMessages()) {
@@ -252,13 +252,21 @@ public MessageParsingResult parseMessages(RecordGroup recordGroup, TlsContext co
252252
if (parsedMessage.isDtlsHandshakeMessageFragment()) {
253253
messageFragments.add((DtlsHandshakeMessageFragment) parsedMessage);
254254
} else {
255+
dtlsMessageInfos.add(new DtlsMessageInformation(recordGroup.getDtlsEpoch()));
255256
messages.add(parsedMessage);
256257
}
257258
}
258259
List<ProtocolMessage> parsedFragmentedMessages = processDtlsFragments(messageFragments,
259-
recordGroup.getDtlsEpoch(), context);
260+
recordGroup.getDtlsEpoch(), dtlsMessageInfos, context);
260261
messages.addAll(parsedFragmentedMessages);
261262
} else {
263+
// TODO Normally, retransmission handling should only be
264+
// applied to CCS and HANDSHAKE messages,
265+
// and not to other message types. I am unsure if we should
266+
// adapt the code based on that.
267+
// (so that, reordering options apply only to CCS, and not
268+
// to other message types).
269+
262270
boolean isInOrder = recordGroup.getDtlsEpoch() == context.getDtlsNextReceiveEpoch();
263271
// we only update the context for in order records (with
264272
// epoch == current) unless the update on ooo was set, in
@@ -267,8 +275,12 @@ public MessageParsingResult parseMessages(RecordGroup recordGroup, TlsContext co
267275
: true;
268276
List<ProtocolMessage> parsedMessages = handleCleanBytes(cleanProtocolMessageBytes,
269277
group.getProtocolMessageType(), context, onlyParse, false, parseAsUnknown);
278+
270279
if (isInOrder || !context.getConfig().isDtlsExcludeOutOfOrder()) {
271280
messages.addAll(parsedMessages);
281+
for (int i = 0; i < parsedMessages.size(); i++) {
282+
dtlsMessageInfos.add(new DtlsMessageInformation(recordGroup.getDtlsEpoch()));
283+
}
272284
}
273285
}
274286
} else {
@@ -277,7 +289,8 @@ public MessageParsingResult parseMessages(RecordGroup recordGroup, TlsContext co
277289
messages.addAll(parsedMessages);
278290
}
279291
}
280-
return new MessageParsingResult(messages, messageFragments);
292+
293+
return new MessageParsingResult(messages, messageFragments, dtlsMessageInfos);
281294
}
282295

283296
private List<ProtocolMessage> handleCleanBytes(byte[] cleanProtocolMessageBytes,
@@ -427,7 +440,7 @@ private ParserResult tryHandleAsUnknownMessage(byte[] protocolMessageBytes, int
427440
* sequence is next for processing.
428441
*/
429442
private List<ProtocolMessage> processDtlsFragments(List<DtlsHandshakeMessageFragment> fragments, Integer epoch,
430-
TlsContext context) {
443+
List<DtlsMessageInformation> dtlsInfos, TlsContext context) {
431444

432445
// the fragment manager stores all the message fragments received
433446
FragmentManager manager = context.getDtlsFragmentManager();
@@ -458,6 +471,7 @@ private List<ProtocolMessage> processDtlsFragments(List<DtlsHandshakeMessageFrag
458471
manager.clearFragmentedMessage(fragmentedMessage.getMessageSeq().getValue(), epoch);
459472
HandshakeMessage message = processFragmentedMessage(fragmentedMessage, context, true);
460473
messages.add(message);
474+
dtlsInfos.add(new DtlsMessageInformation(epoch, fragmentedMessage.getMessageSeq().getValue()));
461475
if (message.getHandshakeMessageType() == HandshakeMessageType.FINISHED) {
462476
context.setDtlsNextReceiveSequenceNumber(0);
463477
} else {
@@ -476,6 +490,7 @@ private List<ProtocolMessage> processDtlsFragments(List<DtlsHandshakeMessageFrag
476490
manager.clearFragmentedMessage(fragmentedMessage.getMessageSeq().getValue(), epoch);
477491
if (!context.getConfig().isDtlsExcludeOutOfOrder()) {
478492
messages.add(message);
493+
dtlsInfos.add(new DtlsMessageInformation(epoch, fragmentedMessage.getMessageSeq().getValue()));
479494
}
480495
}
481496
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/SendMessageHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ public MessageActionResult sendMessages(List<ProtocolMessage> messages, List<Abs
117117
if (fragmentMessages.isEmpty()) {
118118
fragmentMessages = null;
119119
}
120-
return new MessageActionResult(records, messages, fragmentMessages);
120+
// TODO add message information
121+
return new MessageActionResult(records, messages, fragmentMessages, null);
121122
}
122123

123124
public void sendRecords(List<AbstractRecord> records, TlsContext context) throws IOException {

0 commit comments

Comments
 (0)