From 2ff7a15d1ef0620a6ba570c238c3666e5bde2eb7 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Thu, 31 Jul 2025 10:34:56 +0200 Subject: [PATCH] add padding to writes when connected over tls --- .../sparrow/net/TcpOverTlsTransport.java | 19 +++++++++++++++++++ .../sparrow/net/TcpTransport.java | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sparrowwallet/sparrow/net/TcpOverTlsTransport.java b/src/main/java/com/sparrowwallet/sparrow/net/TcpOverTlsTransport.java index 4da5d045..9554ae2d 100644 --- a/src/main/java/com/sparrowwallet/sparrow/net/TcpOverTlsTransport.java +++ b/src/main/java/com/sparrowwallet/sparrow/net/TcpOverTlsTransport.java @@ -16,6 +16,7 @@ import java.security.cert.Certificate; public class TcpOverTlsTransport extends TcpTransport { private static final Logger log = LoggerFactory.getLogger(TcpOverTlsTransport.class); + public static final int PAD_TO_MULTIPLE_OF_BYTES = 96; protected final SSLSocketFactory sslSocketFactory; @@ -41,6 +42,24 @@ public class TcpOverTlsTransport extends TcpTransport { sslSocketFactory = sslContext.getSocketFactory(); } + @Override + protected void writeRequest(String request) throws IOException { + int currentLength = request.length(); + int targetLength; + if(currentLength % PAD_TO_MULTIPLE_OF_BYTES == 0) { + targetLength = currentLength; + } else { + targetLength = ((currentLength / PAD_TO_MULTIPLE_OF_BYTES) + 1) * PAD_TO_MULTIPLE_OF_BYTES; + } + + int paddingNeeded = targetLength - currentLength; + if(paddingNeeded > 0) { + super.writeRequest(request + " ".repeat(paddingNeeded)); + } else { + super.writeRequest(request); + } + } + private TrustManager[] getTrustManagers(File crtFile) throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException { if(crtFile == null) { return new TrustManager[] { diff --git a/src/main/java/com/sparrowwallet/sparrow/net/TcpTransport.java b/src/main/java/com/sparrowwallet/sparrow/net/TcpTransport.java index 8a10494a..95528f4e 100644 --- a/src/main/java/com/sparrowwallet/sparrow/net/TcpTransport.java +++ b/src/main/java/com/sparrowwallet/sparrow/net/TcpTransport.java @@ -97,7 +97,7 @@ public class TcpTransport implements CloseableTransport, TimeoutCounter { } } - private void writeRequest(String request) throws IOException { + protected void writeRequest(String request) throws IOException { if(log.isTraceEnabled()) { log.trace("Sending to electrum server at " + server + ": " + request); } @@ -106,7 +106,7 @@ public class TcpTransport implements CloseableTransport, TimeoutCounter { throw new IllegalStateException("Socket connection has not been established."); } - PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); + PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8))); out.println(request); out.flush(); }