Добавлен разбор ECDHE ключей
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package ru.serega6531.packmate.service.optimization.tls.keys;
|
||||
|
||||
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.SignatureHashAlgorithmHash;
|
||||
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmSignature;
|
||||
|
||||
public class EcdheServerParams {
|
||||
|
||||
private CurveType curveType;
|
||||
private NamedCurve namedCurve;
|
||||
private byte[] pubkey;
|
||||
private SignatureHashAlgorithmHash signatureHashAlgorithmHash;
|
||||
private SignatureHashAlgorithmSignature signatureHashAlgorithmSignature;
|
||||
private byte[] signature;
|
||||
|
||||
public EcdheServerParams(CurveType curveType, NamedCurve namedCurve, byte[] pubkey,
|
||||
SignatureHashAlgorithmHash signatureHashAlgorithmHash,
|
||||
SignatureHashAlgorithmSignature signatureHashAlgorithmSignature,
|
||||
byte[] signature) {
|
||||
this.curveType = curveType;
|
||||
this.namedCurve = namedCurve;
|
||||
this.pubkey = pubkey;
|
||||
this.signatureHashAlgorithmHash = signatureHashAlgorithmHash;
|
||||
this.signatureHashAlgorithmSignature = signatureHashAlgorithmSignature;
|
||||
this.signature = signature;
|
||||
}
|
||||
|
||||
public CurveType getCurveType() {
|
||||
return curveType;
|
||||
}
|
||||
|
||||
public NamedCurve getNamedCurve() {
|
||||
return namedCurve;
|
||||
}
|
||||
|
||||
public byte[] getPubkey() {
|
||||
return pubkey;
|
||||
}
|
||||
|
||||
public SignatureHashAlgorithmHash getSignatureHashAlgorithmHash() {
|
||||
return signatureHashAlgorithmHash;
|
||||
}
|
||||
|
||||
public SignatureHashAlgorithmSignature getSignatureHashAlgorithmSignature() {
|
||||
return signatureHashAlgorithmSignature;
|
||||
}
|
||||
|
||||
public byte[] getSignature() {
|
||||
return signature;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package ru.serega6531.packmate.service.optimization.tls.keys;
|
||||
|
||||
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.SignatureHashAlgorithmHash;
|
||||
import ru.serega6531.packmate.service.optimization.tls.keys.enums.SignatureHashAlgorithmSignature;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public final class TlsKeyUtils {
|
||||
|
||||
/**
|
||||
* @param rawData Handshake record content
|
||||
*/
|
||||
public static EcdheServerParams parseServerECDHE(byte[] rawData, int offset) {
|
||||
ByteBuffer bb = ByteBuffer.wrap(rawData).position(offset);
|
||||
|
||||
byte curveTypeId = bb.get();
|
||||
if(curveTypeId != 0x03) {
|
||||
throw new IllegalArgumentException("Unsupported curve type");
|
||||
}
|
||||
|
||||
CurveType curveType = CurveType.NAMED;
|
||||
NamedCurve namedCurve = NamedCurve.findByValue(bb.getShort());
|
||||
|
||||
if (namedCurve == null) {
|
||||
throw new IllegalArgumentException("Unsupported named curve");
|
||||
}
|
||||
|
||||
byte pubkeyLength = bb.get();
|
||||
byte[] pubkey = new byte[pubkeyLength];
|
||||
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 EcdheServerParams(curveType, namedCurve, pubkey,
|
||||
signatureHashAlgorithmHash, signatureHashAlgorithmSignature, signature);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param rawData Handshake record content
|
||||
*/
|
||||
public static byte[] getServerECDHEPubkey(byte[] rawData, int offset) {
|
||||
ByteBuffer bb = ByteBuffer.wrap(rawData).position(offset);
|
||||
|
||||
byte length = bb.get();
|
||||
byte[] pubkey = new byte[length];
|
||||
bb.get(pubkey);
|
||||
|
||||
return pubkey;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package ru.serega6531.packmate.service.optimization.tls.keys.enums;
|
||||
|
||||
public enum CurveType {
|
||||
|
||||
NAMED((byte) 0x03);
|
||||
|
||||
private byte value;
|
||||
|
||||
CurveType(byte value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public byte getValue() {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package ru.serega6531.packmate.service.optimization.tls.keys.enums;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public enum NamedCurve {
|
||||
|
||||
SECP256R1((short) 0x0017);
|
||||
|
||||
private final short value;
|
||||
|
||||
private static final Map<Short, NamedCurve> map = new HashMap<>();
|
||||
|
||||
NamedCurve(short value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
static {
|
||||
for (NamedCurve curve : values()) {
|
||||
map.put(curve.getValue(), curve);
|
||||
}
|
||||
}
|
||||
|
||||
public short getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public static NamedCurve findByValue(short value) {
|
||||
return map.get(value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package ru.serega6531.packmate.service.optimization.tls.keys.enums;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public enum SignatureHashAlgorithmHash {
|
||||
|
||||
SHA256((byte) 4);
|
||||
|
||||
private final byte value;
|
||||
|
||||
private static final Map<Byte, SignatureHashAlgorithmHash> map = new HashMap<>();
|
||||
|
||||
SignatureHashAlgorithmHash(byte value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
static {
|
||||
for (SignatureHashAlgorithmHash curve : values()) {
|
||||
map.put(curve.getValue(), curve);
|
||||
}
|
||||
}
|
||||
|
||||
public byte getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public static SignatureHashAlgorithmHash findByValue(short value) {
|
||||
return map.get(value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package ru.serega6531.packmate.service.optimization.tls.keys.enums;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public enum SignatureHashAlgorithmSignature {
|
||||
|
||||
RSA((byte) 1);
|
||||
|
||||
private final byte value;
|
||||
|
||||
private static final Map<Byte, SignatureHashAlgorithmSignature> map = new HashMap<>();
|
||||
|
||||
SignatureHashAlgorithmSignature(byte value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
static {
|
||||
for (SignatureHashAlgorithmSignature curve : values()) {
|
||||
map.put(curve.getValue(), curve);
|
||||
}
|
||||
}
|
||||
|
||||
public byte getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public static SignatureHashAlgorithmSignature findByValue(short value) {
|
||||
return map.get(value);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user