Skip to content

Commit ee0c84e

Browse files
committed
fix bugs in ssl packet reader
1 parent d67df5a commit ee0c84e

4 files changed

Lines changed: 66 additions & 56 deletions

File tree

rlib-logger-api/src/main/java/com/ss/rlib/logger/api/LoggerManager.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,24 @@ public static void removeListener(@NotNull LoggerListener listener) {
116116
public static void removeWriter(@NotNull Writer writer) {
117117
LOGGER_FACTORY.removeWriter(writer);
118118
}
119+
120+
/**
121+
* Enable passed logger level for some logger.
122+
*
123+
* @param cs the class which use its own logger.
124+
* @param level the logger level to enable.
125+
*/
126+
public static void enable(@NotNull Class<?> cs, @NotNull LoggerLevel level) {
127+
getLogger(cs).setEnabled(level, true);
128+
}
129+
130+
/**
131+
* Disable passed logger level for some logger.
132+
*
133+
* @param cs the class which use its own logger.
134+
* @param level the logger level to disable.
135+
*/
136+
public static void disable(@NotNull Class<?> cs, @NotNull LoggerLevel level) {
137+
getLogger(cs).setEnabled(level, false);
138+
}
119139
}

rlib-network/src/main/java/com/ss/rlib/network/packet/impl/AbstractSSLPacketReader.java

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -200,32 +200,40 @@ protected int doHandshake(@NotNull ByteBuffer receivedBuffer, int receivedBytes)
200200

201201
protected int decryptAndRead(@NotNull ByteBuffer receivedBuffer) {
202202

203-
SSLEngineResult result;
204-
try {
205-
LOGGER.debug(receivedBuffer, buf -> "Try to decrypt data:\n" + hexDump(buf));
206-
result = sslEngine.unwrap(receivedBuffer, sslDataBuffer.clear());
207-
} catch (SSLException e) {
208-
if (e.getCause() instanceof BadPaddingException) {
209-
increaseNetworkBuffer();
210-
return SKIP_READ_PACKETS;
203+
int total = 0;
204+
205+
while (receivedBuffer.hasRemaining()) {
206+
207+
SSLEngineResult result;
208+
try {
209+
LOGGER.debug(receivedBuffer, buf -> "Try to decrypt data:\n" + hexDump(buf));
210+
result = sslEngine.unwrap(receivedBuffer, sslDataBuffer.clear());
211+
} catch (SSLException e) {
212+
if (e.getCause() instanceof BadPaddingException) {
213+
increaseNetworkBuffer();
214+
return SKIP_READ_PACKETS;
215+
}
216+
throw new IllegalStateException(e);
211217
}
212-
throw new IllegalStateException(e);
213-
}
214218

215-
switch (result.getStatus()) {
216-
case OK:
217-
sslDataBuffer.flip();
218-
LOGGER.debug(sslDataBuffer, buf -> "Decrypted data:\n" + hexDump(buf));
219-
return readPackets(sslDataBuffer, pendingBuffer);
220-
case BUFFER_OVERFLOW:
221-
increaseDataBuffer();
222-
return decryptAndRead(receivedBuffer);
223-
case CLOSED:
224-
closeConnection();
225-
return SKIP_READ_PACKETS;
226-
default:
227-
throw new IllegalStateException("Invalid SSL status: " + result.getStatus());
219+
switch (result.getStatus()) {
220+
case OK:
221+
sslDataBuffer.flip();
222+
LOGGER.debug(sslDataBuffer, buf -> "Decrypted data:\n" + hexDump(buf));
223+
total += readPackets(sslDataBuffer, pendingBuffer);
224+
break;
225+
case BUFFER_OVERFLOW:
226+
increaseDataBuffer();
227+
return decryptAndRead(receivedBuffer);
228+
case CLOSED:
229+
closeConnection();
230+
return SKIP_READ_PACKETS;
231+
default:
232+
throw new IllegalStateException("Invalid SSL status: " + result.getStatus());
233+
}
228234
}
235+
236+
return total;
229237
}
230238

231239
private void increaseNetworkBuffer() {

rlib-network/src/main/java/com/ss/rlib/network/packet/impl/AbstractSSLPacketWriter.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,13 @@ public void writeNextPacket() {
8989
return EMPTY_BUFFER;
9090
}
9191

92+
var dataBuffer = super.serialize(packet);
93+
94+
LOGGER.debug(dataBuffer, buff -> "Try to encrypt data:\n" + hexDump(buff));
95+
9296
SSLEngineResult result;
9397
try {
94-
result = sslEngine.wrap(super.serialize(packet), sslNetworkBuffer.clear());
98+
result = sslEngine.wrap(dataBuffer, sslNetworkBuffer.clear());
9599
} catch (SSLException e) {
96100
throw new RuntimeException(e);
97101
}

rlib-network/src/test/java/com/ss/rlib/network/test/StringSSLNetworkTest.java

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ public class StringSSLNetworkTest extends BaseNetworkTest {
4343
@SneakyThrows
4444
void certificatesTest() {
4545

46-
//System.setProperty("javax.net.debug", "all");
47-
4846
var keystoreFile = StringSSLNetworkTest.class.getResourceAsStream("/ssl/rlib_test_cert.p12");
4947
var sslContext = NetworkUtils.createSslContext(keystoreFile, "test");
5048
var clientSSLContext = NetworkUtils.createAllTrustedClientSslContext();
@@ -75,12 +73,6 @@ void certificatesTest() {
7573
@SneakyThrows
7674
void serverSSLNetworkTest() {
7775

78-
//System.setProperty("javax.net.debug", "all");
79-
80-
//LoggerManager.getLogger(AbstractPacketWriter.class).setEnabled(LoggerLevel.DEBUG, true);
81-
//LoggerManager.getLogger(AbstractSSLPacketWriter.class).setEnabled(LoggerLevel.DEBUG, true);
82-
//LoggerManager.getLogger(AbstractSSLPacketReader.class).setEnabled(LoggerLevel.DEBUG, true);
83-
8476
var keystoreFile = StringSSLNetworkTest.class.getResourceAsStream("/ssl/rlib_test_cert.p12");
8577
var sslContext = NetworkUtils.createSslContext(keystoreFile, "test");
8678

@@ -130,22 +122,12 @@ void serverSSLNetworkTest() {
130122
LOGGER.info("Response: " + response.getData());
131123

132124
serverNetwork.shutdown();
133-
134-
//LoggerManager.getLogger(AbstractSSLPacketWriter.class).setEnabled(LoggerLevel.DEBUG, false);
135-
//LoggerManager.getLogger(AbstractSSLPacketReader.class).setEnabled(LoggerLevel.DEBUG, false);
136-
//LoggerManager.getLogger(AbstractPacketWriter.class).setEnabled(LoggerLevel.DEBUG, false);
137125
}
138126

139127
@Test
140128
@SneakyThrows
141129
void clientSSLNetworkTest() {
142130

143-
//System.setProperty("javax.net.debug", "all");
144-
145-
//LoggerManager.getLogger(AbstractPacketWriter.class).setEnabled(LoggerLevel.DEBUG, true);
146-
//LoggerManager.getLogger(AbstractSSLPacketWriter.class).setEnabled(LoggerLevel.DEBUG, true);
147-
//LoggerManager.getLogger(AbstractSSLPacketReader.class).setEnabled(LoggerLevel.DEBUG, true);
148-
149131
var keystoreFile = StringSSLNetworkTest.class.getResourceAsStream("/ssl/rlib_test_cert.p12");
150132
var sslContext = NetworkUtils.createSslContext(keystoreFile, "test");
151133

@@ -210,21 +192,16 @@ void clientSSLNetworkTest() {
210192

211193
clientNetwork.shutdown();
212194
serverSocket.close();
213-
214-
//LoggerManager.getLogger(AbstractSSLPacketWriter.class).setEnabled(LoggerLevel.DEBUG, false);
215-
//LoggerManager.getLogger(AbstractSSLPacketReader.class).setEnabled(LoggerLevel.DEBUG, false);
216-
//LoggerManager.getLogger(AbstractPacketWriter.class).setEnabled(LoggerLevel.DEBUG, false);
217195
}
218196

219197
@Test
220198
@SneakyThrows
221199
void echoNetworkTest() {
222200

223201
//System.setProperty("javax.net.debug", "all");
224-
225-
//LoggerManager.getLogger(AbstractPacketWriter.class).setEnabled(LoggerLevel.DEBUG, true);
226-
LoggerManager.getLogger(AbstractSSLPacketWriter.class).setEnabled(LoggerLevel.DEBUG, true);
227-
LoggerManager.getLogger(AbstractSSLPacketReader.class).setEnabled(LoggerLevel.DEBUG, true);
202+
//LoggerManager.enable(AbstractPacketWriter.class, LoggerLevel.DEBUG);
203+
//LoggerManager.enable(AbstractSSLPacketWriter.class, LoggerLevel.DEBUG);
204+
//LoggerManager.enable(AbstractSSLPacketReader.class, LoggerLevel.DEBUG);
228205

229206
var keystoreFile = StringSSLNetworkTest.class.getResourceAsStream("/ssl/rlib_test_cert.p12");
230207
var sslContext = NetworkUtils.createSslContext(keystoreFile, "test");
@@ -235,8 +212,9 @@ void echoNetworkTest() {
235212
sslContext
236213
);
237214

215+
var expectedReceivedPackets = 90;
238216
var serverAddress = serverNetwork.start();
239-
var counter = new CountDownLatch(90);
217+
var counter = new CountDownLatch(expectedReceivedPackets);
240218

241219
serverNetwork.accepted()
242220
.flatMap(Connection::receivedEvents)
@@ -254,7 +232,7 @@ void echoNetworkTest() {
254232
);
255233

256234
clientNetwork.connected(serverAddress)
257-
.doOnNext(connection -> IntStream.range(0, 1)
235+
.doOnNext(connection -> IntStream.range(10, expectedReceivedPackets + 10)
258236
.forEach(length -> connection.send(new StringWritablePacket(StringUtils.generate(length)))))
259237
.doOnError(Throwable::printStackTrace)
260238
.flatMapMany(Connection::receivedEvents)
@@ -264,16 +242,16 @@ void echoNetworkTest() {
264242
});
265243

266244
Assertions.assertTrue(
267-
counter.await(10000000, TimeUnit.MILLISECONDS),
245+
counter.await(1000, TimeUnit.MILLISECONDS),
268246
"Still wait for " + counter.getCount() + " packets..."
269247
);
270248

271249
serverNetwork.shutdown();
272250
clientNetwork.shutdown();
273251

274-
LoggerManager.getLogger(AbstractSSLPacketWriter.class).setEnabled(LoggerLevel.DEBUG, false);
275-
LoggerManager.getLogger(AbstractSSLPacketReader.class).setEnabled(LoggerLevel.DEBUG, false);
276-
//LoggerManager.getLogger(AbstractPacketWriter.class).setEnabled(LoggerLevel.DEBUG, false);
252+
//LoggerManager.disable(AbstractSSLPacketWriter.class, LoggerLevel.DEBUG);
253+
//LoggerManager.disable(AbstractSSLPacketReader.class, LoggerLevel.DEBUG);
254+
//LoggerManager.disable(AbstractPacketWriter.class, LoggerLevel.DEBUG);
277255
}
278256

279257
private static @NotNull StringWritablePacket newMessage(int minMessageLength, int maxMessageLength) {

0 commit comments

Comments
 (0)