From c72e7b1da940eff7d83e031d6192fe5ea46d002b Mon Sep 17 00:00:00 2001 From: serega6531 Date: Mon, 20 Apr 2020 16:09:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20Ke?= =?UTF-8?q?yShareExtension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tls/extensions/TlsExtension.java | 5 ++- .../extensions/UnimplementedTlsExtension.java | 6 ++- .../keyshare/ClientKeyShareExtension.java | 23 ++++++++++++ .../keyshare/KeyShareExtension.java | 37 +++++++++++-------- .../keyshare/ServerKeyShareExtension.java | 14 +++++++ .../ClientHelloHandshakeRecordContent.java | 3 +- .../HelloHandshakeRecordContent.java | 4 +- .../ServerHelloHandshakeRecordContent.java | 2 +- 8 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ClientKeyShareExtension.java create mode 100644 src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ServerKeyShareExtension.java diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/TlsExtension.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/TlsExtension.java index eaca4f7..d260da8 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/TlsExtension.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/TlsExtension.java @@ -9,13 +9,14 @@ public abstract class TlsExtension { protected ExtensionType type; protected short extensionLength; - public static TlsExtension newInstance(ExtensionType type, byte[] rawData, int offset, short extensionLength) { + public static TlsExtension newInstance(ExtensionType type, byte[] rawData, int offset, + short extensionLength, boolean client) { if (extensionLength > 0) { ByteArrays.validateBounds(rawData, offset, extensionLength); } if (type == ExtensionType.KEY_SHARE) { - return new KeyShareExtension(type, rawData, offset, extensionLength); + return KeyShareExtension.newInstance(type, rawData, offset, extensionLength, client); } else { return new UnimplementedTlsExtension(type, rawData, offset, extensionLength); } diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/UnimplementedTlsExtension.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/UnimplementedTlsExtension.java index 4576eef..3ca5171 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/UnimplementedTlsExtension.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/UnimplementedTlsExtension.java @@ -15,6 +15,10 @@ public class UnimplementedTlsExtension extends TlsExtension { @Override public String toString() { - return type.name() + "[" + extensionLength + " bytes]"; + if(extensionLength > 0) { + return type.name() + " [" + extensionLength + " bytes]"; + } else { + return type.name(); + } } } diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ClientKeyShareExtension.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ClientKeyShareExtension.java new file mode 100644 index 0000000..1834e8f --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ClientKeyShareExtension.java @@ -0,0 +1,23 @@ +package ru.serega6531.packmate.service.optimization.tls.extensions.keyshare; + +import org.pcap4j.util.ByteArrays; +import ru.serega6531.packmate.service.optimization.tls.numbers.ExtensionType; + +import static org.pcap4j.util.ByteArrays.SHORT_SIZE_IN_BYTES; + +public class ClientKeyShareExtension extends KeyShareExtension { + + private static final int KEY_SHARE_LENGTH_OFFSET = 0; + private static final int KEY_SHARE_ENTRY_OFFSET = KEY_SHARE_LENGTH_OFFSET + SHORT_SIZE_IN_BYTES; + + private short keyShareLength; + + public ClientKeyShareExtension(ExtensionType type, byte[] rawData, int offset, short extensionLength) { + super(type, extensionLength); + this.keyShareLength = ByteArrays.getShort(rawData, KEY_SHARE_LENGTH_OFFSET + offset); // the field is not always there + int cursor = KEY_SHARE_ENTRY_OFFSET + offset; + ByteArrays.validateBounds(rawData, cursor + offset, keyShareLength); + readEntries(rawData, KEY_SHARE_ENTRY_OFFSET + offset, offset + keyShareLength); + } + +} diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/KeyShareExtension.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/KeyShareExtension.java index 599be06..354839d 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/KeyShareExtension.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/KeyShareExtension.java @@ -7,31 +7,38 @@ import ru.serega6531.packmate.service.optimization.tls.numbers.ExtensionType; import java.util.ArrayList; import java.util.List; -import static org.pcap4j.util.ByteArrays.SHORT_SIZE_IN_BYTES; +public abstract class KeyShareExtension extends TlsExtension { -public class KeyShareExtension extends TlsExtension { + private final List entries = new ArrayList<>(); - private static final int KEY_SHARE_LENGTH_OFFSET = 0; - private static final int KEY_SHARE_ENTRY_OFFSET = KEY_SHARE_LENGTH_OFFSET + SHORT_SIZE_IN_BYTES; + public static KeyShareExtension newInstance(ExtensionType type, byte[] rawData, int offset, + short extensionLength, boolean client) { + ByteArrays.validateBounds(rawData, offset, extensionLength); - private short keyShareLength; - private List entries = new ArrayList<>(); + if(client) { + return new ClientKeyShareExtension(type, rawData, offset, extensionLength); + } else { + return new ServerKeyShareExtension(type, rawData, offset, extensionLength); + } + } - public KeyShareExtension(ExtensionType type, byte[] rawData, int offset, short extensionLength) { + protected KeyShareExtension(ExtensionType type, short extensionLength) { super(type, extensionLength); + } - this.keyShareLength = ByteArrays.getShort(rawData, KEY_SHARE_LENGTH_OFFSET + offset); // the field is not always there - ByteArrays.validateBounds(rawData, KEY_SHARE_ENTRY_OFFSET + offset, keyShareLength); - - int cursor = KEY_SHARE_ENTRY_OFFSET + offset; - - while (cursor < offset + this.keyShareLength) { - KeyShareEntry entry = new KeyShareEntry(rawData, cursor); - entries.add(entry); + protected void readEntries(byte[] rawData, int cursor, int end) { + while (cursor < end) { + KeyShareEntry entry = readEntry(rawData, cursor); cursor += entry.size(); } } + protected KeyShareEntry readEntry(byte[] rawData, int cursor) { + KeyShareEntry entry = new KeyShareEntry(rawData, cursor); + entries.add(entry); + return entry; + } + @Override public String toString() { return type.name() + " " + entries.toString(); diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ServerKeyShareExtension.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ServerKeyShareExtension.java new file mode 100644 index 0000000..e5daa52 --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/extensions/keyshare/ServerKeyShareExtension.java @@ -0,0 +1,14 @@ +package ru.serega6531.packmate.service.optimization.tls.extensions.keyshare; + +import ru.serega6531.packmate.service.optimization.tls.numbers.ExtensionType; + +public class ServerKeyShareExtension extends KeyShareExtension { + + private static final int KEY_SHARE_ENTRY_OFFSET = 0; + + public ServerKeyShareExtension(ExtensionType type, byte[] rawData, int offset, short extensionLength) { + super(type, extensionLength); + readEntry(rawData, KEY_SHARE_ENTRY_OFFSET + offset); + } + +} diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ClientHelloHandshakeRecordContent.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ClientHelloHandshakeRecordContent.java index b083220..518c807 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ClientHelloHandshakeRecordContent.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ClientHelloHandshakeRecordContent.java @@ -56,7 +56,8 @@ public class ClientHelloHandshakeRecordContent extends HelloHandshakeRecordConte this.extensionsLength = ByteArrays.getShort(rawData, EXTENSIONS_LENGTH_OFFSET + compressionMethodsLength + sessionIdLength + cipherSuitesLength + offset); - readExtensions(rawData, EXTENSIONS_OFFSET + compressionMethodsLength + sessionIdLength + cipherSuitesLength + offset); + readExtensions(rawData, EXTENSIONS_OFFSET + compressionMethodsLength + + sessionIdLength + cipherSuitesLength + offset, true); } @Override diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/HelloHandshakeRecordContent.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/HelloHandshakeRecordContent.java index 82cfd7a..b8d7c68 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/HelloHandshakeRecordContent.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/HelloHandshakeRecordContent.java @@ -37,7 +37,7 @@ public abstract class HelloHandshakeRecordContent implements HandshakeRecordCont } } - protected void readExtensions(byte[] rawData, int offset) { + protected void readExtensions(byte[] rawData, int offset, boolean client) { extensions = new ArrayList<>(extensionsLength); int cursor = offset; @@ -49,7 +49,7 @@ public abstract class HelloHandshakeRecordContent implements HandshakeRecordCont short extensionLength = ByteArrays.getShort(rawData, cursor); cursor += SHORT_SIZE_IN_BYTES; - extensions.add(TlsExtension.newInstance(extensionType, rawData, cursor, extensionLength)); + extensions.add(TlsExtension.newInstance(extensionType, rawData, cursor, extensionLength, client)); cursor += extensionLength; } diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ServerHelloHandshakeRecordContent.java b/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ServerHelloHandshakeRecordContent.java index 1e9ca29..09ef273 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ServerHelloHandshakeRecordContent.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/tls/records/handshakes/ServerHelloHandshakeRecordContent.java @@ -32,7 +32,7 @@ public class ServerHelloHandshakeRecordContent extends HelloHandshakeRecordConte this.extensionsLength = ByteArrays.getShort(rawData, EXTENSIONS_LENGTH_OFFSET + sessionIdLength + offset); - readExtensions(rawData, EXTENSIONS_OFFSET + sessionIdLength + offset); + readExtensions(rawData, EXTENSIONS_OFFSET + sessionIdLength + offset, false); } @Override