Skip to content

Commit 16631fe

Browse files
committed
Added duplicate detection functionality
1 parent 15e6b51 commit 16631fe

File tree

4 files changed

+111
-3
lines changed

4 files changed

+111
-3
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,11 @@ public static Config createEmptyConfig() {
789789
*/
790790
private boolean dtlsUpdateOnOutOfOrder = false;
791791

792+
/**
793+
* Exclude messages with same
794+
*/
795+
private boolean dtlsExcludeDuplicates = false;
796+
792797
private WorkflowExecutorType workflowExecutorType = WorkflowExecutorType.DEFAULT;
793798

794799
/**
@@ -1755,6 +1760,14 @@ public void setDtlsExcludeOutOfOrder(boolean dtlsDtlsExcludeOutOfOrder) {
17551760
this.dtlsExcludeOutOfOrder = dtlsDtlsExcludeOutOfOrder;
17561761
}
17571762

1763+
public boolean isDtlsExcludeDuplicates() {
1764+
return dtlsExcludeDuplicates;
1765+
}
1766+
1767+
public void setDtlsExcludeDuplicates(boolean dtlsExcludeDuplicates) {
1768+
this.dtlsExcludeDuplicates = dtlsExcludeDuplicates;
1769+
}
1770+
17581771
public boolean isDtlsUpdateOnOutOfOrder() {
17591772
return dtlsUpdateOnOutOfOrder;
17601773
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package de.rub.nds.tlsattacker.core.dtls;
2+
3+
import java.util.Arrays;
4+
import java.util.HashSet;
5+
import java.util.Set;
6+
7+
import de.rub.nds.tlsattacker.core.protocol.message.ProtocolMessage;
8+
import de.rub.nds.tlsattacker.core.workflow.action.executor.DtlsMessageInformation;
9+
10+
public class MessageCache {
11+
12+
private Set<MessageKey> keys = new HashSet<>();
13+
14+
public MessageCache() {
15+
}
16+
17+
public void addMessage(ProtocolMessage message, DtlsMessageInformation info) {
18+
keys.add(new MessageKey(message, info));
19+
}
20+
21+
public boolean hasMessage(ProtocolMessage message, DtlsMessageInformation info) {
22+
return keys.contains(new MessageKey(message, info));
23+
}
24+
25+
static class MessageKey {
26+
27+
private byte[] messageBytes;
28+
private Integer messageSequence;
29+
private Integer epochNumber;
30+
31+
public MessageKey(ProtocolMessage message, DtlsMessageInformation info) {
32+
messageBytes = message.getCompleteResultingMessage().getValue();
33+
messageSequence = info.getMessageSequence();
34+
epochNumber = info.getEpoch();
35+
}
36+
37+
@Override
38+
public int hashCode() {
39+
final int prime = 31;
40+
int result = 1;
41+
result = prime * result + ((epochNumber == null) ? 0 : epochNumber.hashCode());
42+
result = prime * result + Arrays.hashCode(messageBytes);
43+
result = prime * result + ((messageSequence == null) ? 0 : messageSequence.hashCode());
44+
return result;
45+
}
46+
47+
@Override
48+
public boolean equals(Object obj) {
49+
if (this == obj)
50+
return true;
51+
if (obj == null)
52+
return false;
53+
if (getClass() != obj.getClass())
54+
return false;
55+
MessageKey other = (MessageKey) obj;
56+
if (epochNumber == null) {
57+
if (other.epochNumber != null)
58+
return false;
59+
} else if (!epochNumber.equals(other.epochNumber))
60+
return false;
61+
if (!Arrays.equals(messageBytes, other.messageBytes))
62+
return false;
63+
if (messageSequence == null) {
64+
if (other.messageSequence != null)
65+
return false;
66+
} else if (!messageSequence.equals(other.messageSequence))
67+
return false;
68+
return true;
69+
}
70+
}
71+
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/state/TlsContext.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import de.rub.nds.tlsattacker.core.crypto.MessageDigestCollector;
3838
import de.rub.nds.tlsattacker.core.crypto.ec.Point;
3939
import de.rub.nds.tlsattacker.core.dtls.FragmentManager;
40+
import de.rub.nds.tlsattacker.core.dtls.MessageCache;
4041
import de.rub.nds.tlsattacker.core.exceptions.ConfigurationException;
4142
import de.rub.nds.tlsattacker.core.exceptions.TransportHandlerConnectException;
4243
import de.rub.nds.tlsattacker.core.protocol.message.ProtocolMessage;
@@ -483,6 +484,11 @@ public class TlsContext {
483484
*/
484485
private FragmentManager dtlsFragmentManager;
485486

487+
/**
488+
* message cache used for duplication detection;
489+
*/
490+
private MessageCache dtlsMessageCache;
491+
486492
/**
487493
* supported protocol versions
488494
*/
@@ -659,6 +665,7 @@ private void init(Config config, AliasedConnection connection) {
659665
messageBuffer = new LinkedList<>();
660666
recordBuffer = new LinkedList<>();
661667
dtlsFragmentManager = new FragmentManager(config);
668+
dtlsMessageCache = new MessageCache();
662669
}
663670

664671
public Chooser getChooser() {
@@ -1300,6 +1307,10 @@ public FragmentManager getDtlsFragmentManager() {
13001307
return dtlsFragmentManager;
13011308
}
13021309

1310+
public MessageCache getDtlsMessageCache() {
1311+
return dtlsMessageCache;
1312+
}
1313+
13031314
public void increaseDtlsNextReceiveSequenceNumber() {
13041315
dtlsNextReceiveSequenceNumber++;
13051316
}

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,11 @@ private List<ProtocolMessage> processDtlsFragments(List<DtlsHandshakeMessageFrag
470470
&& fragment.getMessageSeq().getValue() == context.getDtlsNextReceiveSequenceNumber()) {
471471
manager.clearFragmentedMessage(fragmentedMessage.getMessageSeq().getValue(), epoch);
472472
HandshakeMessage message = processFragmentedMessage(fragmentedMessage, context, true);
473+
DtlsMessageInformation info = new DtlsMessageInformation(epoch, fragmentedMessage.getMessageSeq()
474+
.getValue());
475+
context.getDtlsMessageCache().addMessage(message, info);
473476
messages.add(message);
474-
dtlsInfos.add(new DtlsMessageInformation(epoch, fragmentedMessage.getMessageSeq().getValue()));
477+
dtlsInfos.add(info);
475478
if (message.getHandshakeMessageType() == HandshakeMessageType.FINISHED) {
476479
context.setDtlsNextReceiveSequenceNumber(0);
477480
} else {
@@ -489,8 +492,18 @@ private List<ProtocolMessage> processDtlsFragments(List<DtlsHandshakeMessageFrag
489492
.isDtlsUpdateOnOutOfOrder());
490493
manager.clearFragmentedMessage(fragmentedMessage.getMessageSeq().getValue(), epoch);
491494
if (!context.getConfig().isDtlsExcludeOutOfOrder()) {
492-
messages.add(message);
493-
dtlsInfos.add(new DtlsMessageInformation(epoch, fragmentedMessage.getMessageSeq().getValue()));
495+
DtlsMessageInformation info = new DtlsMessageInformation(epoch, fragmentedMessage
496+
.getMessageSeq().getValue());
497+
498+
// if the exclude duplicate option is disabled, or the
499+
// message is not a duplicate
500+
// w.r.t. bytes, epoch and sequence number
501+
if (!context.getConfig().isDtlsExcludeDuplicates()
502+
|| !context.getDtlsMessageCache().hasMessage(message, info)) {
503+
context.getDtlsMessageCache().addMessage(message, info);
504+
messages.add(message);
505+
dtlsInfos.add(info);
506+
}
494507
}
495508
}
496509
}

0 commit comments

Comments
 (0)