[java-support] branch master updated: JSPT-64: DataSealer can't handle reasonable data sizes

Scott Cantor cantor.2 at osu.edu
Mon Feb 15 14:44:55 EST 2016


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch master
in repository java-support.

The following commit(s) were added to refs/heads/master by this push:
       new  d83c707   JSPT-64: DataSealer can't handle reasonable data sizes
d83c707 is described below

commit d83c7072aa02e8c7962bb3cada0d98fe8f2ea2dd
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Feb 15 14:44:57 2016 -0500

    JSPT-64: DataSealer can't handle reasonable data sizes
    
    https://issues.shibboleth.net/jira/browse/JSPT-64
    
    Write data in 60,000 byte chunks consecutively, and read
    them back until EOFException is raised.
---
 .../java/support/security/DataSealer.java          | 35 ++++++++++++++++++----
 .../java/support/security/DataSealerTest.java      |  2 +-
 2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java b/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java
index 81d2b63..b206362 100644
--- a/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java
+++ b/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
+import java.io.EOFException;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.security.KeyException;
@@ -57,6 +58,9 @@ import org.slf4j.LoggerFactory;
  */
 public class DataSealer extends AbstractInitializableComponent {
 
+    /** Size of UTF-8 data chunks to read/write. */
+    private static final int CHUNK_SIZE = 60000;
+    
     /** Class logger. */
     @Nonnull private Logger log = LoggerFactory.getLogger(DataSealer.class);
 
@@ -210,15 +214,26 @@ public class DataSealer extends AbstractInitializableComponent {
             DataInputStream dataInputStream = new DataInputStream(compressedData);
 
             final long decodedExpirationTime = dataInputStream.readLong();
-            final String decodedData = dataInputStream.readUTF();
-
             if (System.currentTimeMillis() > decodedExpirationTime) {
-                log.info("Unwrapped data has expired");
+                log.debug("Unwrapped data has expired");
                 throw new DataExpiredException("Unwrapped data has expired");
             }
 
-            log.debug("Unwrapped data verified");
-            return decodedData;
+            final StringBuffer accumulator = new StringBuffer();
+            
+            int count = 0;
+            while (true) {
+                try {
+                    final String decodedData = dataInputStream.readUTF();
+                    accumulator.append(decodedData);
+                    log.trace("Read chunk #{} from output stream", ++count);
+                } catch (final EOFException e) {
+                    break;
+                }
+            }
+
+            log.trace("Unwrapped data verified");
+            return accumulator.toString();
         } catch (IOException e) {
             log.error(e.getMessage());
             throw new DataSealerException("Caught IOException unwrapping data", e);
@@ -265,7 +280,15 @@ public class DataSealer extends AbstractInitializableComponent {
             final DataOutputStream dataStream = new DataOutputStream(compressedStream);
 
             dataStream.writeLong(exp);
-            dataStream.writeUTF(data);
+            
+            int count = 0;
+            int start = 0;
+            int dataLength = data.length();
+            while (start < dataLength) {
+                dataStream.writeUTF(data.substring(start, start + Math.min(dataLength - start, CHUNK_SIZE)));
+                start += Math.min(dataLength - start, CHUNK_SIZE);
+                log.trace("Wrote chunk #{} to output stream", ++count);
+            }
 
             dataStream.flush();
             compressedStream.flush();
diff --git a/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java b/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java
index a7d9215..1f6ec15 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java
@@ -132,7 +132,7 @@ public class DataSealerTest {
         }
     }
 
-    public void encodeDecodeLong() throws DataSealerException, ComponentInitializationException {
+    @Test public void encodeDecodeLong() throws DataSealerException, ComponentInitializationException {
         final DataSealer sealer = createDataSealer();
         
         char[] buffer = new char[1000000];

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list