Skip to content

Commit d11afc3

Browse files
authored
Merge pull request #438 from RUB-NDS/null_integration
Null integration
2 parents 37f9056 + cd48e96 commit d11afc3

File tree

20 files changed

+366
-35
lines changed

20 files changed

+366
-35
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,4 @@ Utils/.project
4141
Utils/.settings/org.eclipse.core.resources.prefs
4242
Utils/.settings/org.eclipse.jdt.core.prefs
4343
.project
44+
test.sh

TLS-Client/src/test/java/de/rub/nds/tlsattacker/client/main/TlsClientTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public void testExecuteWorkflows(PublicKeyAlgorithm algorithm, int port) {
164164
private void testProtocolCompatibility(List<String> serverList, Config config, PublicKeyAlgorithm algorithm) {
165165
LOGGER.info(config.getHighestProtocolVersion());
166166
for (CipherSuite cs : CipherSuite.getImplemented()) {
167-
if (cs.name().toUpperCase().contains("NULL")) {
167+
if (cs.name().toUpperCase().contains("NULL") || cs.name().toUpperCase().contains("ANON")) {
168168
continue;
169169
}
170170
Set<PublicKeyAlgorithm> requiredAlgorithms = AlgorithmResolver.getRequiredKeystoreAlgorithms(cs);

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

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,8 @@ public enum CipherSuite {
432432

433433
private int value;
434434

435+
public static final int EXPORT_SYMMETRIC_KEY_SIZE_BYTES = 5;
436+
435437
private static final Map<Integer, CipherSuite> MAP;
436438

437439
private CipherSuite(int value) {
@@ -501,10 +503,10 @@ public int getValue() {
501503
* Returns true in case the cipher suite enforces ephemeral keys. This is
502504
* the case for ECDHE and DHE cipher suites.
503505
*
504-
* @return True if the Ciphersuite is Ephermaral
506+
* @return True if the Ciphersuite is Ephemeral
505507
*/
506508
public boolean isEphemeral() {
507-
return this.name().contains("DHE_");
509+
return this.name().contains("DHE_") || this.isAnon();
508510
}
509511

510512
public boolean isPskOrDhPsk() {
@@ -532,6 +534,11 @@ public boolean isExport() {
532534
return this.name().contains("EXPORT");
533535
}
534536

537+
public boolean isExportSymmetricCipher() {
538+
return this.name().contains("DES40") || this.name().contains("RC4_40") || this.name().contains("RC2_CBC_40")
539+
|| this.name().contains("DES_CBC_40");
540+
}
541+
535542
/**
536543
* Returns true in case the cipher suite is a CBC cipher suite.
537544
*
@@ -640,14 +647,21 @@ public static List<CipherSuite> getImplemented() {
640647
list.add(TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA);
641648
list.add(TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA);
642649
list.add(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA);
650+
list.add(TLS_DH_anon_EXPORT_WITH_RC4_40_MD5);
651+
list.add(TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA);
652+
list.add(TLS_DH_anon_WITH_RC4_128_MD5);
653+
list.add(TLS_DH_anon_WITH_DES_CBC_SHA);
654+
list.add(TLS_DH_anon_WITH_3DES_EDE_CBC_SHA);
643655
list.add(TLS_DH_DSS_WITH_AES_128_CBC_SHA);
644656
list.add(TLS_DH_RSA_WITH_AES_128_CBC_SHA);
645657
list.add(TLS_DHE_DSS_WITH_AES_128_CBC_SHA);
646658
list.add(TLS_DHE_RSA_WITH_AES_128_CBC_SHA);
659+
list.add(TLS_DH_anon_WITH_AES_128_CBC_SHA);
647660
list.add(TLS_DH_DSS_WITH_AES_256_CBC_SHA);
648661
list.add(TLS_DH_RSA_WITH_AES_256_CBC_SHA);
649662
list.add(TLS_DHE_DSS_WITH_AES_256_CBC_SHA);
650663
list.add(TLS_DHE_RSA_WITH_AES_256_CBC_SHA);
664+
list.add(TLS_DH_anon_WITH_AES_256_CBC_SHA);
651665
list.add(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA);
652666
list.add(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA);
653667
list.add(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA);
@@ -666,10 +680,14 @@ public static List<CipherSuite> getImplemented() {
666680
list.add(TLS_DH_RSA_WITH_AES_256_GCM_SHA384);
667681
list.add(TLS_DH_RSA_WITH_AES_128_GCM_SHA256);
668682
list.add(TLS_DH_DSS_WITH_AES_256_GCM_SHA384);
683+
list.add(TLS_DH_anon_WITH_AES_128_GCM_SHA256);
684+
list.add(TLS_DH_anon_WITH_AES_256_GCM_SHA384);
669685
list.add(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256);
670686
list.add(TLS_DHE_RSA_WITH_AES_256_GCM_SHA384);
671687
list.add(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256);
672688
list.add(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256);
689+
list.add(TLS_DH_anon_WITH_AES_128_CBC_SHA256);
690+
list.add(TLS_DH_anon_WITH_AES_256_CBC_SHA256);
673691
list.add(TLS_DHE_RSA_WITH_DES_CBC_SHA);
674692
list.add(TLS_DHE_RSA_WITH_AES_128_CCM);
675693
list.add(TLS_DHE_RSA_WITH_AES_256_CCM);
@@ -750,6 +768,7 @@ public static List<CipherSuite> getImplemented() {
750768
list.add(TLS_ECDH_ECDSA_WITH_RC4_128_SHA);
751769
list.add(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA);
752770
list.add(TLS_ECDH_RSA_WITH_RC4_128_SHA);
771+
list.add(TLS_ECDH_anon_WITH_NULL_SHA);
753772
list.add(TLS_SRP_SHA_WITH_AES_128_CBC_SHA);
754773
list.add(TLS_SRP_SHA_WITH_AES_256_CBC_SHA);
755774
list.add(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256);
@@ -849,6 +868,57 @@ public static List<CipherSuite> getImplemented() {
849868
list.add(TLS_ECDHE_PSK_WITH_NULL_SHA);
850869
list.add(TLS_ECDHE_PSK_WITH_NULL_SHA256);
851870
list.add(TLS_ECDHE_PSK_WITH_NULL_SHA384);
871+
list.add(TLS_DH_DSS_WITH_DES_CBC_SHA);
872+
list.add(TLS_DHE_DSS_WITH_DES_CBC_SHA);
873+
list.add(TLS_DH_DSS_WITH_AES_128_CBC_SHA256);
874+
list.add(TLS_DHE_DSS_WITH_AES_128_CBC_SHA256);
875+
list.add(TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA);
876+
list.add(TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA);
877+
list.add(TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA);
878+
list.add(UNOFFICIAL_TLS_ECDH_anon_WITH_NULL_SHA);
879+
list.add(UNOFFICIAL_TLS_ECDH_anon_WITH_RC4_128_SHA);
880+
list.add(UNOFFICIAL_TLS_ECDH_anon_WITH_DES_CBC_SHA);
881+
list.add(UNOFFICIAL_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA);
882+
list.add(TLS_DHE_DSS_WITH_AES_256_CBC_SHA256);
883+
list.add(TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA);
884+
list.add(TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA);
885+
list.add(TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA);
886+
list.add(TLS_DH_DSS_WITH_SEED_CBC_SHA);
887+
list.add(TLS_DHE_DSS_WITH_SEED_CBC_SHA);
888+
list.add(TLS_DH_anon_WITH_SEED_CBC_SHA);
889+
list.add(TLS_DH_DSS_WITH_AES_128_GCM_SHA256);
890+
list.add(TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256);
891+
list.add(TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256);
892+
list.add(TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256);
893+
list.add(TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256);
894+
list.add(TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256);
895+
list.add(TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256);
896+
list.add(TLS_ECDH_anon_WITH_RC4_128_SHA);
897+
list.add(TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA);
898+
list.add(TLS_ECDH_anon_WITH_AES_128_CBC_SHA);
899+
list.add(TLS_ECDH_anon_WITH_AES_256_CBC_SHA);
900+
list.add(TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256);
901+
list.add(TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384);
902+
list.add(TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256);
903+
list.add(TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384);
904+
list.add(TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256);
905+
list.add(TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384);
906+
list.add(TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256);
907+
list.add(TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384);
908+
list.add(TLS_DH_anon_WITH_ARIA_128_CBC_SHA256);
909+
list.add(TLS_DH_anon_WITH_ARIA_256_CBC_SHA384);
910+
list.add(TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256);
911+
list.add(TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384);
912+
list.add(TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256);
913+
list.add(TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384);
914+
list.add(TLS_DH_anon_WITH_ARIA_128_GCM_SHA256);
915+
list.add(TLS_DH_anon_WITH_ARIA_256_GCM_SHA384);
916+
list.add(TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256);
917+
list.add(TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384);
918+
list.add(TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256);
919+
list.add(TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384);
920+
list.add(TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256);
921+
list.add(TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384);
852922
return list;
853923
}
854924

@@ -874,4 +944,12 @@ public boolean isTLS13() {
874944
public boolean isImplemented() {
875945
return getImplemented().contains(this);
876946
}
947+
948+
public boolean isSHA256() {
949+
return this.name().contains("SHA256");
950+
}
951+
952+
public boolean isAnon() {
953+
return this.name().contains("anon");
954+
}
877955
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ public enum KeyExchangeAlgorithm {
4141
public boolean isEC() {
4242
return this.name().contains("EC");
4343
}
44+
45+
public boolean isAnon() {
46+
return this.name().contains("ANON");
47+
}
4448
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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.crypto;
10+
11+
import org.bouncycastle.crypto.digests.MD5Digest;
12+
13+
public class MD5Utils {
14+
15+
public static void md5Update(MD5Digest md5, byte[] bytes) {
16+
md5.update(bytes, 0, bytes.length);
17+
}
18+
19+
public static byte[] MD5(byte[]... byteArrays) {
20+
MD5Digest md5 = new MD5Digest();
21+
for (byte[] bytes : byteArrays) {
22+
md5Update(md5, bytes);
23+
}
24+
byte[] md5Output = new byte[md5.getDigestSize()];
25+
md5.doFinal(md5Output, 0);
26+
return md5Output;
27+
}
28+
29+
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/crypto/PseudoRandomFunction.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ public class PseudoRandomFunction {
5555
*/
5656
public static final String EXTENDED_MASTER_SECRET_LABEL = "extended master secret";
5757

58+
public static final String CLIENT_WRITE_KEY_LABEL = "client write key";
59+
60+
public static final String SERVER_WRITE_KEY_LABEL = "server write key";
61+
62+
public static final String IV_BLOCK_LABEL = "IV block";
63+
5864
/**
5965
* Computes PRF output of the provided size using the given mac algorithm
6066
*

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/handler/DHEServerKeyExchangeHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99
package de.rub.nds.tlsattacker.core.protocol.handler;
1010

11+
import de.rub.nds.tlsattacker.core.constants.AlgorithmResolver;
1112
import de.rub.nds.tlsattacker.core.protocol.message.DHEServerKeyExchangeMessage;
1213
import de.rub.nds.tlsattacker.core.protocol.parser.DHEServerKeyExchangeParser;
1314
import de.rub.nds.tlsattacker.core.protocol.preparator.DHEServerKeyExchangePreparator;
@@ -23,7 +24,8 @@ public DHEServerKeyExchangeHandler(TlsContext tlsContext) {
2324

2425
@Override
2526
public DHEServerKeyExchangeParser getParser(byte[] message, int pointer) {
26-
return new DHEServerKeyExchangeParser(pointer, message, tlsContext.getChooser().getLastRecordVersion());
27+
return new DHEServerKeyExchangeParser(pointer, message, tlsContext.getChooser().getLastRecordVersion(),
28+
AlgorithmResolver.getKeyExchangeAlgorithm(tlsContext.getChooser().getSelectedCipherSuite()));
2729
}
2830

2931
@Override

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/handler/ECDHEServerKeyExchangeHandler.java

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

1111
import de.rub.nds.modifiablevariable.util.ArrayConverter;
12+
import de.rub.nds.tlsattacker.core.constants.AlgorithmResolver;
1213
import de.rub.nds.tlsattacker.core.constants.NamedGroup;
1314
import de.rub.nds.tlsattacker.core.crypto.ECCUtilsBCWrapper;
1415
import de.rub.nds.tlsattacker.core.crypto.ec.CustomECPoint;
@@ -32,7 +33,8 @@ public ECDHEServerKeyExchangeHandler(TlsContext tlsContext) {
3233

3334
@Override
3435
public ECDHEServerKeyExchangeParser getParser(byte[] message, int pointer) {
35-
return new ECDHEServerKeyExchangeParser(pointer, message, tlsContext.getChooser().getLastRecordVersion());
36+
return new ECDHEServerKeyExchangeParser(pointer, message, tlsContext.getChooser().getLastRecordVersion(),
37+
AlgorithmResolver.getKeyExchangeAlgorithm(tlsContext.getChooser().getSelectedCipherSuite()));
3638
}
3739

3840
@Override

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/handler/factory/HandlerFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ private static HandshakeMessageHandler getServerKeyExchangeHandler(TlsContext co
310310
case ECDH_ECDSA:
311311
case ECDH_RSA:
312312
case ECDHE_RSA:
313+
case ECDH_ANON:
313314
return new ECDHEServerKeyExchangeHandler(context);
314315
case DHE_DSS:
315316
case DHE_RSA:

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,7 @@ protected T createHandshakeMessage() {
5656
* Message to write in
5757
*/
5858
private void parseSerializedPublicKeyLength(T message) {
59-
if (getVersion().isSSL()) {
60-
message.setPublicKeyLength(getBytesLeft());
61-
} else {
62-
message.setPublicKeyLength(parseIntField(HandshakeByteLength.DH_PUBLICKEY_LENGTH));
63-
}
59+
message.setPublicKeyLength(parseIntField(HandshakeByteLength.DH_PUBLICKEY_LENGTH));
6460
LOGGER.debug("SerializedPublicKeyLength: " + message.getPublicKeyLength().getValue());
6561
}
6662

0 commit comments

Comments
 (0)