[java-support] 19/26: JSPT-116 - Give DataSealer ability to prefix wrapped results

Scott Cantor cantor.2 at osu.edu
Tue Apr 12 14:38:44 UTC 2022


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

scantor pushed a commit to branch dev/JSPT-111
in repository java-support.

View the commit online:
http://git.shibboleth.net/view/?p=java-support.git;a=commit;h=599a19085cc70b559dad0ed221497f72c7267b1d

commit 599a19085cc70b559dad0ed221497f72c7267b1d
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Mar 3 11:13:19 2022 -0500

    JSPT-116 - Give DataSealer ability to prefix wrapped results
    
    https://shibboleth.atlassian.net/browse/JSPT-116
    
    Limit and pad prefix to 10 characters.
    Allow unwrap regardless of prefix but warn.
---
 .../java/support/security/DataSealer.java          | 28 ++++++++++++++++------
 .../java/support/security/DataSealerTest.java      | 23 ++++++++++++------
 2 files changed, 37 insertions(+), 14 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 c50307b..ca63b5f 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
@@ -64,7 +64,10 @@ public class DataSealer extends AbstractInitializableComponent {
 
     /** Magic string to signal use of per-node prefix feature. */
     @Nonnull @NotEmpty public static final String MAGIC_STRING = "PXR5";
-    
+
+    /** Length of padded prefix. */
+    private static final int PREFIX_LEN = 10;
+
     /** Size of UTF-8 data chunks to read/write. */
     private static final int CHUNK_SIZE = 60000;
     
@@ -170,6 +173,14 @@ public class DataSealer extends AbstractInitializableComponent {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         nodePrefix = StringSupport.trimOrNull(prefix);
+        if (nodePrefix != null) {
+            if (nodePrefix.length() > PREFIX_LEN) {
+                throw new ConstraintViolationException(
+                        "DataSealer nodePrefix cannot be longer than " + Integer.toString(PREFIX_LEN) + " characters");
+            } else if (nodePrefix.length() < PREFIX_LEN) {
+                nodePrefix = nodePrefix.concat(new String("X").repeat(PREFIX_LEN - nodePrefix.length()));
+            }
+        }
     }
 
     /** {@inheritDoc} */
@@ -230,15 +241,18 @@ public class DataSealer extends AbstractInitializableComponent {
             throws DataSealerException {
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
         
+        final int magicLen = MAGIC_STRING.length();
+        
         try {
             final byte[] in;
-            if (nodePrefix != null && wrapped.startsWith(MAGIC_STRING)) {
-                if (wrapped.regionMatches(MAGIC_STRING.length(), nodePrefix, 0, nodePrefix.length())) {
-                    in = decoder.decode(wrapped.substring(MAGIC_STRING.length() +
-                            nodePrefix.length()).getBytes(StandardCharsets.UTF_8));
-                } else {
-                    throw new DataSealerException("Data was node-prefixed but prefix did not match the expected value");
+            if (wrapped.startsWith(MAGIC_STRING)) {
+                if (nodePrefix == null) {
+                    log.warn("Data was prefixed but no node prefix is configured");
+                } else if (!wrapped.regionMatches(magicLen, nodePrefix, 0, PREFIX_LEN)) {
+                    log.warn("Data was prefixed with {} but configured prefix is {}",
+                            wrapped.substring(magicLen, magicLen + PREFIX_LEN), nodePrefix);
                 }
+                in = decoder.decode(wrapped.substring(magicLen + PREFIX_LEN).getBytes(StandardCharsets.UTF_8));
             } else {
                 in = decoder.decode(wrapped.getBytes(StandardCharsets.UTF_8));
             }
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 925efed..34eed57 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
@@ -19,6 +19,7 @@ package net.shibboleth.utilities.java.support.security;
 
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
 import net.shibboleth.utilities.java.support.resource.Resource;
 import net.shibboleth.utilities.java.support.security.impl.BasicKeystoreKeyStrategy;
 import net.shibboleth.utilities.java.support.test.resource.TestResourceConverter;
@@ -128,13 +129,14 @@ public class DataSealerTest {
     }
 
 
-    @Test(expectedExceptions=DataSealerException.class)
+    @Test
     public void encodeDecodePrefixedWrong() throws DataSealerException, ComponentInitializationException {
         final DataSealer sealer = createDataSealer("serverA");
 
         final String encoded = sealer.wrap(THE_DATA);
         final StringBuffer alias = new StringBuffer(); 
-        sealer.unwrap(encoded.replaceFirst("serverA", "serverB"), alias);
+        Assert.assertEquals(sealer.unwrap(encoded.replaceFirst("serverA", "serverB"), alias), THE_DATA);
+        Assert.assertEquals(alias.toString(), "secret1");
     }
 
     @Test public void encodeDecodeWithExp() throws DataSealerException, ComponentInitializationException {
@@ -194,19 +196,26 @@ public class DataSealerTest {
 
         }
 
+        try {
+            sealer = createDataSealer("prefixistoolong");
+            Assert.fail("allowed prefix too long");
+        } catch (final ConstraintViolationException e) {
+            // OK
+        }
+        
         sealer = createDataSealer(null);
-
+        
         try {
             sealer.unwrap("");
             Assert.fail("no data");
-        } catch (DataSealerException e) {
+        } catch (final DataSealerException e) {
             // OK
         }
 
         try {
             sealer.unwrap("RandomGarbage");
             Assert.fail("random data");
-        } catch (DataSealerException e) {
+        } catch (final DataSealerException e) {
             // OK
         }
 
@@ -217,14 +226,14 @@ public class DataSealerTest {
         try {
             sealer.unwrap(corrupted);
             Assert.fail("corrupted data");
-        } catch (DataSealerException e) {
+        } catch (final DataSealerException e) {
             // OK
         }
 
         try {
             sealer.wrap(nullValue(), Instant.ofEpochMilli(10));
             Assert.fail("no data");
-        } catch (IllegalArgumentException e) {
+        } catch (final IllegalArgumentException e) {
             // OK
         }
     }

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


More information about the commits mailing list