Skip to content

Commit 3483386

Browse files
committed
Merge origin/master into maven-deploy
Conflicts: TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/message/extension/AlpnExtensionMessage.java
2 parents c15a57b + 0451352 commit 3483386

File tree

13 files changed

+253
-24
lines changed

13 files changed

+253
-24
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,9 @@ public static Config mergeWithDefaultValues(Config c) {
284284
private byte[] certificateStatusRequestExtensionRequestExtension = new byte[0];
285285

286286
/**
287-
* Default ALPN announced protocols It's HTTP/2 0x68 0x32 as of RFC7540
287+
* Default ALPN announced protocols
288288
*/
289-
private String applicationLayerProtocolNegotiationAnnouncedProtocols = "h2";
289+
private String[] alpnAnnouncedProtocols = new String[] { "h2" };
290290

291291
@XmlJavaTypeAdapter(ByteArrayAdapter.class)
292292
private byte[] sessionId = new byte[0];
@@ -2049,13 +2049,12 @@ public void setCertificateStatusRequestExtensionRequestExtension(
20492049
this.certificateStatusRequestExtensionRequestExtension = certificateStatusRequestExtensionRequestExtension;
20502050
}
20512051

2052-
public String getApplicationLayerProtocolNegotiationAnnouncedProtocols() {
2053-
return applicationLayerProtocolNegotiationAnnouncedProtocols;
2052+
public String[] getAlpnAnnouncedProtocols() {
2053+
return alpnAnnouncedProtocols;
20542054
}
20552055

2056-
public void setApplicationLayerProtocolNegotiationAnnouncedProtocols(
2057-
String applicationLayerProtocolNegotiationAnnouncedProtocols) {
2058-
this.applicationLayerProtocolNegotiationAnnouncedProtocols = applicationLayerProtocolNegotiationAnnouncedProtocols;
2056+
public void setAlpnAnnouncedProtocols(String[] alpnAnnouncedProtocols) {
2057+
this.alpnAnnouncedProtocols = alpnAnnouncedProtocols;
20592058
}
20602059

20612060
public byte[] getSessionId() {

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/constants/ExtensionByteLength.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ public class ExtensionByteLength {
110110
*/
111111
public static final int ALPN_EXTENSION_LENGTH = 2;
112112

113+
public static final int ALPN_ENTRY_LENGTH = 1;
114+
113115
/**
114116
* Length of the SRP extension identifier length field
115117
*/

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public ClientHelloMessage(Config tlsConfig) {
149149
addExtension(new CertificateStatusRequestExtensionMessage());
150150
}
151151
if (tlsConfig.isAddAlpnExtension()) {
152-
addExtension(new AlpnExtensionMessage());
152+
addExtension(new AlpnExtensionMessage(tlsConfig));
153153
}
154154
if (tlsConfig.isAddSRPExtension()) {
155155
addExtension(new SRPExtensionMessage());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public ServerHelloMessage(Config tlsConfig) {
108108
addExtension(new CertificateStatusRequestExtensionMessage());
109109
}
110110
if (tlsConfig.isAddAlpnExtension()) {
111-
addExtension(new AlpnExtensionMessage());
111+
addExtension(new AlpnExtensionMessage(tlsConfig));
112112
}
113113
if (tlsConfig.isAddSRPExtension()) {
114114
addExtension(new SRPExtensionMessage());
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/**
2+
* TLS-Attacker - A Modular Penetration Testing Framework for TLS
3+
*
4+
* Copyright 2014-2017 Ruhr University Bochum / Hackmanit GmbH
5+
*
6+
* Licensed under Apache License 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*/
9+
package de.rub.nds.tlsattacker.core.protocol.message.extension.Alpn;
10+
11+
import de.rub.nds.modifiablevariable.ModifiableVariableFactory;
12+
import de.rub.nds.modifiablevariable.bytearray.ModifiableByteArray;
13+
import de.rub.nds.modifiablevariable.integer.ModifiableInteger;
14+
import de.rub.nds.tlsattacker.core.protocol.ModifiableVariableHolder;
15+
import java.io.Serializable;
16+
17+
/**
18+
*
19+
* @author Robert Merget <robert.merget@rub.de>
20+
*/
21+
public class AlpnEntry extends ModifiableVariableHolder implements Serializable {
22+
23+
private ModifiableInteger alpnEntryLength;
24+
25+
private ModifiableByteArray alpnEntryBytes;
26+
27+
private byte[] alpnEntryConfig;
28+
29+
public AlpnEntry() {
30+
}
31+
32+
public AlpnEntry(byte[] alpnEntryConfig) {
33+
this.alpnEntryConfig = alpnEntryConfig;
34+
}
35+
36+
public ModifiableInteger getAlpnEntryLength() {
37+
return alpnEntryLength;
38+
}
39+
40+
public void setAlpnEntryLength(ModifiableInteger alpnEntryLength) {
41+
this.alpnEntryLength = alpnEntryLength;
42+
}
43+
44+
public void setAlpnEntryLength(int alpnEntryLength) {
45+
this.alpnEntryLength = ModifiableVariableFactory.safelySetValue(this.alpnEntryLength, alpnEntryLength);
46+
}
47+
48+
public ModifiableByteArray getAlpnEntryBytes() {
49+
return alpnEntryBytes;
50+
}
51+
52+
public void setAlpnEntryBytes(ModifiableByteArray alpnEntryBytes) {
53+
this.alpnEntryBytes = alpnEntryBytes;
54+
}
55+
56+
public void setAlpnEntryBytes(byte[] alpnEntryBytes) {
57+
this.alpnEntryBytes = ModifiableVariableFactory.safelySetValue(this.alpnEntryBytes, alpnEntryBytes);
58+
}
59+
60+
public byte[] getAlpnEntryConfig() {
61+
return alpnEntryConfig;
62+
}
63+
64+
public void setAlpnEntryConfig(byte[] alpnEntryConfig) {
65+
this.alpnEntryConfig = alpnEntryConfig;
66+
}
67+
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/message/extension/AlpnExtensionMessage.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,16 @@
88
*/
99
package de.rub.nds.tlsattacker.core.protocol.message.extension;
1010

11+
import de.rub.nds.modifiablevariable.HoldsModifiableVariable;
1112
import de.rub.nds.modifiablevariable.ModifiableVariableFactory;
1213
import de.rub.nds.modifiablevariable.ModifiableVariableProperty;
1314
import de.rub.nds.modifiablevariable.bytearray.ModifiableByteArray;
1415
import de.rub.nds.modifiablevariable.integer.ModifiableInteger;
16+
import de.rub.nds.tlsattacker.core.config.Config;
1517
import de.rub.nds.tlsattacker.core.constants.ExtensionType;
18+
import de.rub.nds.tlsattacker.core.protocol.message.extension.Alpn.AlpnEntry;
19+
import java.util.LinkedList;
20+
import java.util.List;
1621

1722
/**
1823
* This extension is defined in RFC7301
@@ -24,8 +29,28 @@ public class AlpnExtensionMessage extends ExtensionMessage {
2429
@ModifiableVariableProperty
2530
private ModifiableByteArray alpnAnnouncedProtocols;
2631

32+
@HoldsModifiableVariable
33+
private List<AlpnEntry> alpnEntryList;
34+
2735
public AlpnExtensionMessage() {
2836
super(ExtensionType.ALPN);
37+
alpnEntryList = new LinkedList<>();
38+
}
39+
40+
public AlpnExtensionMessage(Config config) {
41+
super(ExtensionType.ALPN);
42+
alpnEntryList = new LinkedList<>();
43+
for (String string : config.getAlpnAnnouncedProtocols()) {
44+
alpnEntryList.add(new AlpnEntry(string.getBytes()));
45+
}
46+
}
47+
48+
public List<AlpnEntry> getAlpnEntryList() {
49+
return alpnEntryList;
50+
}
51+
52+
public void setAlpnEntryList(List<AlpnEntry> alpnEntryList) {
53+
this.alpnEntryList = alpnEntryList;
2954
}
3055

3156
public ModifiableInteger getAlpnExtensionLength() {

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
package de.rub.nds.tlsattacker.core.protocol.parser.extension;
1010

1111
import de.rub.nds.tlsattacker.core.constants.ExtensionByteLength;
12+
import de.rub.nds.tlsattacker.core.protocol.message.extension.Alpn.AlpnEntry;
1213
import de.rub.nds.tlsattacker.core.protocol.message.extension.AlpnExtensionMessage;
14+
import de.rub.nds.tlsattacker.core.protocol.parser.extension.alpn.AlpnEntryParser;
15+
import java.util.LinkedList;
16+
import java.util.List;
1317

1418
public class AlpnExtensionParser extends ExtensionParser<AlpnExtensionMessage> {
1519

@@ -20,7 +24,16 @@ public AlpnExtensionParser(int startposition, byte[] array) {
2024
@Override
2125
public void parseExtensionMessageContent(AlpnExtensionMessage msg) {
2226
msg.setAlpnExtensionLength(parseIntField(ExtensionByteLength.ALPN_EXTENSION_LENGTH));
23-
msg.setAlpnAnnouncedProtocols(parseByteArrayField(msg.getAlpnExtensionLength().getValue()));
27+
byte[] anouncedProtocols = parseByteArrayField(msg.getAlpnExtensionLength().getValue());
28+
msg.setAlpnAnnouncedProtocols(anouncedProtocols);
29+
List<AlpnEntry> entryList = new LinkedList<>();
30+
int pointer = 0;
31+
while (pointer < anouncedProtocols.length) {
32+
AlpnEntryParser parser = new AlpnEntryParser(pointer, anouncedProtocols);
33+
entryList.add(parser.parse());
34+
pointer = parser.getPointer();
35+
}
36+
msg.setAlpnEntryList(entryList);
2437
}
2538

2639
@Override
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* TLS-Attacker - A Modular Penetration Testing Framework for TLS
3+
*
4+
* Copyright 2014-2017 Ruhr University Bochum / Hackmanit GmbH
5+
*
6+
* Licensed under Apache License 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*/
9+
package de.rub.nds.tlsattacker.core.protocol.parser.extension.alpn;
10+
11+
import de.rub.nds.tlsattacker.core.constants.ExtensionByteLength;
12+
import de.rub.nds.tlsattacker.core.protocol.message.extension.Alpn.AlpnEntry;
13+
import de.rub.nds.tlsattacker.core.protocol.parser.Parser;
14+
15+
/**
16+
*
17+
* @author Robert Merget <robert.merget@rub.de>
18+
*/
19+
public class AlpnEntryParser extends Parser<AlpnEntry> {
20+
21+
public AlpnEntryParser(int startposition, byte[] array) {
22+
super(startposition, array);
23+
}
24+
25+
@Override
26+
public AlpnEntry parse() {
27+
AlpnEntry entry = new AlpnEntry();
28+
entry.setAlpnEntryLength(parseIntField(ExtensionByteLength.ALPN_ENTRY_LENGTH));
29+
entry.setAlpnEntryBytes(parseByteArrayField(entry.getAlpnEntryLength().getValue()));
30+
return entry;
31+
}
32+
33+
}

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@
99
package de.rub.nds.tlsattacker.core.protocol.preparator.extension;
1010

1111
import de.rub.nds.modifiablevariable.util.ArrayConverter;
12+
import de.rub.nds.tlsattacker.core.protocol.message.extension.Alpn.AlpnEntry;
1213
import de.rub.nds.tlsattacker.core.protocol.message.extension.AlpnExtensionMessage;
14+
import de.rub.nds.tlsattacker.core.protocol.preparator.extension.alpn.AlpnEntryPreparator;
1315
import de.rub.nds.tlsattacker.core.protocol.serializer.extension.ExtensionSerializer;
16+
import de.rub.nds.tlsattacker.core.protocol.serializer.extension.alpn.AlpnEntrySerializer;
1417
import de.rub.nds.tlsattacker.core.workflow.chooser.Chooser;
18+
import java.io.ByteArrayOutputStream;
19+
import java.io.IOException;
1520

1621
public class AlpnExtensionPreparator extends ExtensionPreparator<AlpnExtensionMessage> {
1722

@@ -25,8 +30,18 @@ public AlpnExtensionPreparator(Chooser chooser, AlpnExtensionMessage message,
2530

2631
@Override
2732
public void prepareExtensionContent() {
28-
msg.setAlpnAnnouncedProtocols(chooser.getConfig().getApplicationLayerProtocolNegotiationAnnouncedProtocols()
29-
.getBytes());
33+
ByteArrayOutputStream stream = new ByteArrayOutputStream();
34+
for (AlpnEntry entry : msg.getAlpnEntryList()) {
35+
AlpnEntryPreparator preparator = new AlpnEntryPreparator(chooser, entry);
36+
preparator.prepare();
37+
AlpnEntrySerializer serializer = new AlpnEntrySerializer(entry);
38+
try {
39+
stream.write(serializer.serialize());
40+
} catch (IOException ex) {
41+
LOGGER.warn("Could not serialize AlpnEntry");
42+
}
43+
}
44+
msg.setAlpnAnnouncedProtocols(stream.toByteArray());
3045
LOGGER.debug("Prepared the ALPN Extension with announced protocols "
3146
+ ArrayConverter.bytesToHexString(msg.getAlpnAnnouncedProtocols()));
3247
msg.setAlpnExtensionLength(msg.getAlpnAnnouncedProtocols().getValue().length);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* TLS-Attacker - A Modular Penetration Testing Framework for TLS
3+
*
4+
* Copyright 2014-2017 Ruhr University Bochum / Hackmanit GmbH
5+
*
6+
* Licensed under Apache License 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*/
9+
package de.rub.nds.tlsattacker.core.protocol.preparator.extension.alpn;
10+
11+
import de.rub.nds.tlsattacker.core.protocol.message.extension.Alpn.AlpnEntry;
12+
import de.rub.nds.tlsattacker.core.protocol.preparator.Preparator;
13+
import de.rub.nds.tlsattacker.core.workflow.chooser.Chooser;
14+
15+
/**
16+
*
17+
* @author Robert Merget <robert.merget@rub.de>
18+
*/
19+
public class AlpnEntryPreparator extends Preparator<AlpnEntry> {
20+
21+
private final AlpnEntry entry;
22+
23+
public AlpnEntryPreparator(Chooser chooser, AlpnEntry entry) {
24+
super(chooser, entry);
25+
this.entry = entry;
26+
}
27+
28+
@Override
29+
public void prepare() {
30+
entry.setAlpnEntryBytes(entry.getAlpnEntryConfig());
31+
entry.setAlpnEntryLength(entry.getAlpnEntryBytes().getValue().length);
32+
}
33+
34+
}

0 commit comments

Comments
 (0)