Code polish, now uses FastThreadLocal
This commit is contained in:
parent
80ab10df01
commit
3615d6cb72
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package dorkbox.network.connection.registration.remote;
|
package dorkbox.network.connection.registration.remote;
|
||||||
|
|
||||||
import com.esotericsoftware.kryo.io.Input;
|
|
||||||
import dorkbox.network.connection.Connection;
|
import dorkbox.network.connection.Connection;
|
||||||
import dorkbox.network.connection.ConnectionImpl;
|
import dorkbox.network.connection.ConnectionImpl;
|
||||||
import dorkbox.network.connection.RegistrationWrapper;
|
import dorkbox.network.connection.RegistrationWrapper;
|
||||||
@ -26,8 +25,8 @@ import dorkbox.network.pipeline.KryoDecoderCrypto;
|
|||||||
import dorkbox.network.pipeline.udp.KryoDecoderUdpCrypto;
|
import dorkbox.network.pipeline.udp.KryoDecoderUdpCrypto;
|
||||||
import dorkbox.network.pipeline.udp.KryoEncoderUdpCrypto;
|
import dorkbox.network.pipeline.udp.KryoEncoderUdpCrypto;
|
||||||
import dorkbox.network.util.CryptoSerializationManager;
|
import dorkbox.network.util.CryptoSerializationManager;
|
||||||
|
import dorkbox.util.FastThreadLocal;
|
||||||
import dorkbox.util.crypto.CryptoECC;
|
import dorkbox.util.crypto.CryptoECC;
|
||||||
import dorkbox.util.serialization.EccPublicKeySerializer;
|
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
@ -41,7 +40,6 @@ import io.netty.util.ReferenceCountUtil;
|
|||||||
import org.bouncycastle.crypto.engines.AESFastEngine;
|
import org.bouncycastle.crypto.engines.AESFastEngine;
|
||||||
import org.bouncycastle.crypto.engines.IESEngine;
|
import org.bouncycastle.crypto.engines.IESEngine;
|
||||||
import org.bouncycastle.crypto.modes.GCMBlockCipher;
|
import org.bouncycastle.crypto.modes.GCMBlockCipher;
|
||||||
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
@ -53,8 +51,8 @@ import static dorkbox.network.connection.EndPoint.maxShutdownWaitTimeInMilliSeco
|
|||||||
|
|
||||||
public abstract
|
public abstract
|
||||||
class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandler<C> {
|
class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandler<C> {
|
||||||
protected static final String KRYO_ENCODER = "kryoEncoder";
|
static final String KRYO_ENCODER = "kryoEncoder";
|
||||||
protected static final String KRYO_DECODER = "kryoDecoder";
|
static final String KRYO_DECODER = "kryoDecoder";
|
||||||
|
|
||||||
private static final String IDLE_HANDLER_FULL = "idleHandlerFull";
|
private static final String IDLE_HANDLER_FULL = "idleHandlerFull";
|
||||||
private static final String FRAME_AND_KRYO_ENCODER = "frameAndKryoEncoder";
|
private static final String FRAME_AND_KRYO_ENCODER = "frameAndKryoEncoder";
|
||||||
@ -67,15 +65,24 @@ class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandle
|
|||||||
private static final String KRYO_CRYPTO_DECODER = "kryoCryptoDecoder";
|
private static final String KRYO_CRYPTO_DECODER = "kryoCryptoDecoder";
|
||||||
|
|
||||||
private static final String IDLE_HANDLER = "idleHandler";
|
private static final String IDLE_HANDLER = "idleHandler";
|
||||||
protected static final ThreadLocal<GCMBlockCipher> aesEngine = new ThreadLocal<GCMBlockCipher>() {
|
|
||||||
|
static final
|
||||||
|
FastThreadLocal<GCMBlockCipher> aesEngine = new FastThreadLocal<GCMBlockCipher>() {
|
||||||
@Override
|
@Override
|
||||||
protected
|
public
|
||||||
GCMBlockCipher initialValue() {
|
GCMBlockCipher initialValue() {
|
||||||
return new GCMBlockCipher(new AESFastEngine());
|
return new GCMBlockCipher(new AESFastEngine());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
protected final ThreadLocal<IESEngine> eccEngineLocal;
|
final
|
||||||
|
FastThreadLocal<IESEngine> eccEngineLocal = new FastThreadLocal<IESEngine>() {
|
||||||
|
@Override
|
||||||
|
public
|
||||||
|
IESEngine initialValue() {
|
||||||
|
return CryptoECC.createEngine();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check to verify if two InetAddresses are equal, by comparing the underlying byte arrays.
|
* Check to verify if two InetAddresses are equal, by comparing the underlying byte arrays.
|
||||||
@ -92,21 +99,12 @@ class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandle
|
|||||||
|
|
||||||
protected final CryptoSerializationManager serializationManager;
|
protected final CryptoSerializationManager serializationManager;
|
||||||
|
|
||||||
public
|
|
||||||
RegistrationRemoteHandler(final String name,
|
RegistrationRemoteHandler(final String name,
|
||||||
final RegistrationWrapper<C> registrationWrapper,
|
final RegistrationWrapper<C> registrationWrapper,
|
||||||
final CryptoSerializationManager serializationManager) {
|
final CryptoSerializationManager serializationManager) {
|
||||||
super(name, registrationWrapper);
|
super(name, registrationWrapper);
|
||||||
|
|
||||||
this.serializationManager = serializationManager;
|
this.serializationManager = serializationManager;
|
||||||
|
|
||||||
eccEngineLocal = new ThreadLocal<IESEngine>() {
|
|
||||||
@Override
|
|
||||||
protected
|
|
||||||
IESEngine initialValue() {
|
|
||||||
return CryptoECC.createEngine();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -209,7 +207,7 @@ class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandle
|
|||||||
String getConnectionDirection();
|
String getConnectionDirection();
|
||||||
|
|
||||||
// have to setup AFTER establish connection, data, as we don't want to enable AES until we're ready.
|
// have to setup AFTER establish connection, data, as we don't want to enable AES until we're ready.
|
||||||
protected final
|
final
|
||||||
void setupConnectionCrypto(MetaChannel metaChannel) {
|
void setupConnectionCrypto(MetaChannel metaChannel) {
|
||||||
|
|
||||||
if (this.logger.isDebugEnabled()) {
|
if (this.logger.isDebugEnabled()) {
|
||||||
@ -266,7 +264,7 @@ class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandle
|
|||||||
/**
|
/**
|
||||||
* Setup our meta-channel to migrate to the correct connection handler for all regular data.
|
* Setup our meta-channel to migrate to the correct connection handler for all regular data.
|
||||||
*/
|
*/
|
||||||
protected final
|
final
|
||||||
void establishConnection(MetaChannel metaChannel) {
|
void establishConnection(MetaChannel metaChannel) {
|
||||||
ChannelPipeline tcpPipe = metaChannel.tcpChannel.pipeline();
|
ChannelPipeline tcpPipe = metaChannel.tcpChannel.pipeline();
|
||||||
ChannelPipeline udpPipe;
|
ChannelPipeline udpPipe;
|
||||||
@ -307,37 +305,10 @@ class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandle
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final
|
final
|
||||||
ECPublicKeyParameters verifyPayload(final Object message,
|
|
||||||
final Channel channel,
|
|
||||||
final RegistrationWrapper registrationWrapper,
|
|
||||||
final Logger logger,
|
|
||||||
final byte[] payload) {
|
|
||||||
|
|
||||||
if (payload.length == 0) {
|
|
||||||
logger.error("Invalid decryption of payload. Aborting.");
|
|
||||||
shutdown(registrationWrapper, channel);
|
|
||||||
|
|
||||||
ReferenceCountUtil.release(message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
ECPublicKeyParameters ecdhPubKey = EccPublicKeySerializer.read(new Input(payload));
|
|
||||||
|
|
||||||
if (ecdhPubKey == null) {
|
|
||||||
logger.error("Invalid decode of ecdh public key. Aborting.");
|
|
||||||
shutdown(registrationWrapper, channel);
|
|
||||||
|
|
||||||
ReferenceCountUtil.release(message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return ecdhPubKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected final
|
|
||||||
boolean verifyAesInfo(final Object message,
|
boolean verifyAesInfo(final Object message,
|
||||||
final Channel channel,
|
final Channel channel,
|
||||||
final RegistrationWrapper registrationWrapper,
|
final RegistrationWrapper<C> registrationWrapper,
|
||||||
final MetaChannel metaChannel,
|
final MetaChannel metaChannel,
|
||||||
final Logger logger) {
|
final Logger logger) {
|
||||||
|
|
||||||
@ -362,7 +333,7 @@ class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandle
|
|||||||
|
|
||||||
// have to setup AFTER establish connection, data, as we don't want to enable AES until we're ready.
|
// have to setup AFTER establish connection, data, as we don't want to enable AES until we're ready.
|
||||||
@SuppressWarnings("AutoUnboxing")
|
@SuppressWarnings("AutoUnboxing")
|
||||||
protected final
|
final
|
||||||
void setupConnection(MetaChannel metaChannel) {
|
void setupConnection(MetaChannel metaChannel) {
|
||||||
// now that we are CONNECTED, we want to remove ourselves (and channel ID's) from the map.
|
// now that we are CONNECTED, we want to remove ourselves (and channel ID's) from the map.
|
||||||
// they will be ADDED in another map, in the followup handler!!
|
// they will be ADDED in another map, in the followup handler!!
|
||||||
@ -401,7 +372,7 @@ class RegistrationRemoteHandler<C extends Connection> extends RegistrationHandle
|
|||||||
* Internal call by the pipeline to notify the "Connection" object that it has "connected", meaning that modifications to the pipeline
|
* Internal call by the pipeline to notify the "Connection" object that it has "connected", meaning that modifications to the pipeline
|
||||||
* are finished.
|
* are finished.
|
||||||
*/
|
*/
|
||||||
protected final
|
final
|
||||||
void notifyConnection(MetaChannel metaChannel) {
|
void notifyConnection(MetaChannel metaChannel) {
|
||||||
this.registrationWrapper.connectionConnected0(metaChannel.connection);
|
this.registrationWrapper.connectionConnected0(metaChannel.connection);
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import dorkbox.network.connection.EndPoint;
|
|||||||
import dorkbox.network.connection.ISessionManager;
|
import dorkbox.network.connection.ISessionManager;
|
||||||
import dorkbox.network.connection.UdpServer;
|
import dorkbox.network.connection.UdpServer;
|
||||||
import dorkbox.network.connection.registration.MetaChannel;
|
import dorkbox.network.connection.registration.MetaChannel;
|
||||||
|
import dorkbox.util.FastThreadLocal;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.EventLoop;
|
import io.netty.channel.EventLoop;
|
||||||
import io.netty.util.NetUtil;
|
import io.netty.util.NetUtil;
|
||||||
@ -47,7 +48,7 @@ class ChannelNetworkWrapper<C extends Connection> implements ChannelWrapper<C> {
|
|||||||
private final byte[] aesKey; // AES-256 requires 32 bytes
|
private final byte[] aesKey; // AES-256 requires 32 bytes
|
||||||
private final byte[] aesIV; // AES-GCM requires 12 bytes
|
private final byte[] aesIV; // AES-GCM requires 12 bytes
|
||||||
|
|
||||||
private final ThreadLocal<ParametersWithIV> cryptoParameters;
|
private final FastThreadLocal<ParametersWithIV> cryptoParameters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param udpServer is null when created by the client, non-null when created by the server
|
* @param udpServer is null when created by the client, non-null when created by the server
|
||||||
@ -90,9 +91,9 @@ class ChannelNetworkWrapper<C extends Connection> implements ChannelWrapper<C> {
|
|||||||
aesKey = metaChannel.aesKey;
|
aesKey = metaChannel.aesKey;
|
||||||
aesIV = metaChannel.aesIV;
|
aesIV = metaChannel.aesIV;
|
||||||
|
|
||||||
cryptoParameters = new ThreadLocal<ParametersWithIV>() {
|
cryptoParameters = new FastThreadLocal<ParametersWithIV>() {
|
||||||
@Override
|
@Override
|
||||||
protected
|
public
|
||||||
ParametersWithIV initialValue() {
|
ParametersWithIV initialValue() {
|
||||||
return new ParametersWithIV(new KeyParameter(aesKey), aesIV);
|
return new ParametersWithIV(new KeyParameter(aesKey), aesIV);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user