[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