Добавлен разбор DH и RSA ключей
This commit is contained in:
@@ -0,0 +1,50 @@
|
|||||||
|
package ru.serega6531.packmate.service.optimization.tls.keys;
|
||||||
|
|
||||||
|
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmHash;
|
||||||
|
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmSignature;
|
||||||
|
|
||||||
|
public class DhClientParams {
|
||||||
|
|
||||||
|
private final byte[] p;
|
||||||
|
private final byte[] g;
|
||||||
|
private final byte[] pubkey;
|
||||||
|
private final SignatureHashAlgorithmHash signatureHashAlgorithmHash;
|
||||||
|
private final SignatureHashAlgorithmSignature signatureHashAlgorithmSignature;
|
||||||
|
private final byte[] signature;
|
||||||
|
|
||||||
|
public DhClientParams(byte[] p, byte[] g, byte[] pubkey,
|
||||||
|
SignatureHashAlgorithmHash signatureHashAlgorithmHash,
|
||||||
|
SignatureHashAlgorithmSignature signatureHashAlgorithmSignature,
|
||||||
|
byte[] signature) {
|
||||||
|
this.p = p;
|
||||||
|
this.g = g;
|
||||||
|
this.pubkey = pubkey;
|
||||||
|
this.signatureHashAlgorithmHash = signatureHashAlgorithmHash;
|
||||||
|
this.signatureHashAlgorithmSignature = signatureHashAlgorithmSignature;
|
||||||
|
this.signature = signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getP() {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getG() {
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getPubkey() {
|
||||||
|
return pubkey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SignatureHashAlgorithmHash getSignatureHashAlgorithmHash() {
|
||||||
|
return signatureHashAlgorithmHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SignatureHashAlgorithmSignature getSignatureHashAlgorithmSignature() {
|
||||||
|
return signatureHashAlgorithmSignature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getSignature() {
|
||||||
|
return signature;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,12 +7,12 @@ import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashA
|
|||||||
|
|
||||||
public class EcdheServerParams {
|
public class EcdheServerParams {
|
||||||
|
|
||||||
private CurveType curveType;
|
private final CurveType curveType;
|
||||||
private NamedCurve namedCurve;
|
private final NamedCurve namedCurve;
|
||||||
private byte[] pubkey;
|
private final byte[] pubkey;
|
||||||
private SignatureHashAlgorithmHash signatureHashAlgorithmHash;
|
private final SignatureHashAlgorithmHash signatureHashAlgorithmHash;
|
||||||
private SignatureHashAlgorithmSignature signatureHashAlgorithmSignature;
|
private final SignatureHashAlgorithmSignature signatureHashAlgorithmSignature;
|
||||||
private byte[] signature;
|
private final byte[] signature;
|
||||||
|
|
||||||
public EcdheServerParams(CurveType curveType, NamedCurve namedCurve, byte[] pubkey,
|
public EcdheServerParams(CurveType curveType, NamedCurve namedCurve, byte[] pubkey,
|
||||||
SignatureHashAlgorithmHash signatureHashAlgorithmHash,
|
SignatureHashAlgorithmHash signatureHashAlgorithmHash,
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package ru.serega6531.packmate.service.optimization.tls.keys;
|
||||||
|
|
||||||
|
import ru.serega6531.packmate.service.optimization.tls.numbers.TlsVersion;
|
||||||
|
|
||||||
|
public class RsaServerParams {
|
||||||
|
|
||||||
|
private final TlsVersion version;
|
||||||
|
private final byte[] encryptedPreMasterSecret;
|
||||||
|
|
||||||
|
public RsaServerParams(TlsVersion version, byte[] encryptedPreMasterSecret) {
|
||||||
|
this.version = version;
|
||||||
|
this.encryptedPreMasterSecret = encryptedPreMasterSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TlsVersion getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getEncryptedPreMasterSecret() {
|
||||||
|
return encryptedPreMasterSecret;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,11 +4,50 @@ import ru.serega6531.packmate.service.optimization.tls.keys.enums.CurveType;
|
|||||||
import ru.serega6531.packmate.service.optimization.tls.keys.enums.NamedCurve;
|
import ru.serega6531.packmate.service.optimization.tls.keys.enums.NamedCurve;
|
||||||
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmHash;
|
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmHash;
|
||||||
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmSignature;
|
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmSignature;
|
||||||
|
import ru.serega6531.packmate.service.optimization.tls.numbers.TlsVersion;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It is impossible to determine key format just by KeyExchange record,
|
||||||
|
* so you can use this class when analyzing tls traffic.
|
||||||
|
*/
|
||||||
public final class TlsKeyUtils {
|
public final class TlsKeyUtils {
|
||||||
|
|
||||||
|
// https://wiki.osdev.org/TLS_Handshake
|
||||||
|
|
||||||
|
public static DhClientParams parseServerDH(byte[] rawData, int offset) {
|
||||||
|
ByteBuffer bb = ByteBuffer.wrap(rawData).position(offset);
|
||||||
|
|
||||||
|
short pLength = bb.getShort();
|
||||||
|
byte[] p = new byte[pLength];
|
||||||
|
bb.get(p);
|
||||||
|
|
||||||
|
short gLength = bb.getShort();
|
||||||
|
byte[] g = new byte[gLength];
|
||||||
|
bb.get(g);
|
||||||
|
|
||||||
|
short pubKeyLength = bb.getShort();
|
||||||
|
byte[] pubKey = new byte[pubKeyLength]; // aka Ys
|
||||||
|
bb.get(pubKey);
|
||||||
|
|
||||||
|
SignatureHashAlgorithmHash signatureHashAlgorithmHash =
|
||||||
|
SignatureHashAlgorithmHash.findByValue(bb.getShort());
|
||||||
|
SignatureHashAlgorithmSignature signatureHashAlgorithmSignature =
|
||||||
|
SignatureHashAlgorithmSignature.findByValue(bb.getShort());
|
||||||
|
|
||||||
|
if (signatureHashAlgorithmHash == null || signatureHashAlgorithmSignature == null) {
|
||||||
|
throw new IllegalArgumentException("Unknown signature data");
|
||||||
|
}
|
||||||
|
|
||||||
|
short signatureLength = bb.getShort();
|
||||||
|
byte[] signature = new byte[signatureLength];
|
||||||
|
|
||||||
|
bb.get(signature);
|
||||||
|
|
||||||
|
return new DhClientParams(p, g, pubKey, signatureHashAlgorithmHash, signatureHashAlgorithmSignature, signature);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param rawData Handshake record content
|
* @param rawData Handshake record content
|
||||||
*/
|
*/
|
||||||
@@ -49,10 +88,13 @@ public final class TlsKeyUtils {
|
|||||||
signatureHashAlgorithmHash, signatureHashAlgorithmSignature, signature);
|
signatureHashAlgorithmHash, signatureHashAlgorithmSignature, signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://ldapwiki.com/wiki/ClientKeyExchange
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Suitable for both DH and ECDHE
|
||||||
* @param rawData Handshake record content
|
* @param rawData Handshake record content
|
||||||
*/
|
*/
|
||||||
public static byte[] getServerECDHEPubkey(byte[] rawData, int offset) {
|
public static byte[] getClientDHPubkey(byte[] rawData, int offset) {
|
||||||
ByteBuffer bb = ByteBuffer.wrap(rawData).position(offset);
|
ByteBuffer bb = ByteBuffer.wrap(rawData).position(offset);
|
||||||
|
|
||||||
byte length = bb.get();
|
byte length = bb.get();
|
||||||
@@ -62,4 +104,14 @@ public final class TlsKeyUtils {
|
|||||||
return pubkey;
|
return pubkey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static RsaServerParams parseClientRsa(byte[] rawData, int offset) {
|
||||||
|
ByteBuffer bb = ByteBuffer.wrap(rawData).position(offset);
|
||||||
|
|
||||||
|
TlsVersion version = TlsVersion.getInstance(bb.getShort());
|
||||||
|
byte[] encryptedPreMasterSecret = new byte[46];
|
||||||
|
bb.get(encryptedPreMasterSecret);
|
||||||
|
|
||||||
|
return new RsaServerParams(version, encryptedPreMasterSecret);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ public enum CurveType {
|
|||||||
|
|
||||||
NAMED((byte) 0x03);
|
NAMED((byte) 0x03);
|
||||||
|
|
||||||
private byte value;
|
private final byte value;
|
||||||
|
|
||||||
CurveType(byte value) {
|
CurveType(byte value) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import java.util.Map;
|
|||||||
|
|
||||||
public enum SignatureHashAlgorithmHash {
|
public enum SignatureHashAlgorithmHash {
|
||||||
|
|
||||||
SHA256((byte) 4);
|
SHA256((byte) 4),
|
||||||
|
SHA512((byte) 6);
|
||||||
|
|
||||||
private final byte value;
|
private final byte value;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import java.util.Map;
|
|||||||
|
|
||||||
public enum SignatureHashAlgorithmSignature {
|
public enum SignatureHashAlgorithmSignature {
|
||||||
|
|
||||||
RSA((byte) 1);
|
RSA((byte) 1),
|
||||||
|
ECDSA((byte) 3);
|
||||||
|
|
||||||
private final byte value;
|
private final byte value;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user