Class DataSealer
java.lang.Object
net.shibboleth.utilities.java.support.component.AbstractInitializableComponent
net.shibboleth.utilities.java.support.security.DataSealer
- All Implemented Interfaces:
Component
,DestructableComponent
,InitializableComponent
public class DataSealer extends AbstractInitializableComponent
Applies a MAC to time-limited information and encrypts with a symmetric key.
TODO: make final
-
Field Summary
Fields Modifier and Type Field Description private static int
CHUNK_SIZE
Size of UTF-8 data chunks to read/write.private org.apache.commons.codec.BinaryDecoder
decoder
Decodes encrypted string to bytes.private org.apache.commons.codec.BinaryEncoder
encoder
Encodes encrypted bytes to string.private DataSealerKeyStrategy
keyStrategy
Source of keys.private boolean
lockedAtStartup
Whether the key source is expected to be locked initially.private org.slf4j.Logger
log
Class logger.private SecureRandom
random
Source of secure random data. -
Constructor Summary
Constructors Constructor Description DataSealer()
Constructor. -
Method Summary
Modifier and Type Method Description void
doInitialize()
Performs the initialization of the component.private String
extractAndCheckDecryptedData(byte[] decryptedBytes)
Extract the GZIP'd data and test for expiration before returning it.void
setDecoder(org.apache.commons.codec.BinaryDecoder d)
Sets the decoder to use to convert a ciphertext string to bytes.void
setEncoder(org.apache.commons.codec.BinaryEncoder e)
Sets the encoder to use to produce a ciphertext string from bytes.void
setKeyStrategy(DataSealerKeyStrategy strategy)
Set the key strategy.void
setLockedAtStartup(boolean flag)
Set whether the key source is expected to be locked at startup, and unlocked later at runtime.void
setRandom(SecureRandom r)
Set the pseudorandom generator.private void
testEncryption(SecretKey key)
Run a test over the configured bean properties.String
unwrap(String wrapped)
Decrypts and verifies an encrypted bundle created withwrap(String, Instant)
.String
unwrap(String wrapped, StringBuffer keyUsed)
Decrypts and verifies an encrypted bundle created withwrap(String, Instant)
, optionally returning the label of the key used to encrypt the data.String
wrap(String data)
Equivalent towrap(String, Instant)
with expiration set to "never".String
wrap(String data, Instant exp)
Encodes data into an AEAD-encrypted blob, gzip(exp|data) exp = expiration time of the data; 8 bytes; Big-endian data = the data; a UTF-8-encoded stringMethods inherited from class net.shibboleth.utilities.java.support.component.AbstractInitializableComponent
destroy, doDestroy, initialize, isDestroyed, isInitialized
-
Field Details
-
CHUNK_SIZE
private static final int CHUNK_SIZESize of UTF-8 data chunks to read/write.- See Also:
- Constant Field Values
-
log
@Nonnull private org.slf4j.Logger logClass logger. -
lockedAtStartup
private boolean lockedAtStartupWhether the key source is expected to be locked initially. -
keyStrategy
Source of keys. -
random
Source of secure random data. -
encoder
@Nonnull private org.apache.commons.codec.BinaryEncoder encoderEncodes encrypted bytes to string. -
decoder
@Nonnull private org.apache.commons.codec.BinaryDecoder decoderDecodes encrypted string to bytes.
-
-
Constructor Details
-
DataSealer
public DataSealer()Constructor.
-
-
Method Details
-
setLockedAtStartup
public void setLockedAtStartup(boolean flag)Set whether the key source is expected to be locked at startup, and unlocked later at runtime.Defaults to false.
- Parameters:
flag
- flag to set- Since:
- 7.4.0
-
setKeyStrategy
Set the key strategy.- Parameters:
strategy
- key strategy
-
setRandom
Set the pseudorandom generator.- Parameters:
r
- the pseudorandom generator to set
-
setEncoder
public void setEncoder(@Nonnull org.apache.commons.codec.BinaryEncoder e)Sets the encoder to use to produce a ciphertext string from bytes. Default is standard base-64 encoding without line breaks.- Parameters:
e
- Byte-to-string encoder.
-
setDecoder
public void setDecoder(@Nonnull org.apache.commons.codec.BinaryDecoder d)Sets the decoder to use to convert a ciphertext string to bytes. Default is standard base-64 decoding.- Parameters:
d
- String-to-byte decoder.
-
doInitialize
Performs the initialization of the component. This method is executed within the lock on the object being initialized. The default implementation of this method is a no-op.- Overrides:
doInitialize
in classAbstractInitializableComponent
- Throws:
ComponentInitializationException
- thrown if there is a problem initializing the component
-
unwrap
Decrypts and verifies an encrypted bundle created withwrap(String, Instant)
.- Parameters:
wrapped
- the encoded blob- Returns:
- the decrypted data, if it's unexpired
- Throws:
DataSealerException
- if the data cannot be unwrapped and verified
-
unwrap
@Nonnull public String unwrap(@Nonnull @NotEmpty String wrapped, @Nullable StringBuffer keyUsed) throws DataSealerExceptionDecrypts and verifies an encrypted bundle created withwrap(String, Instant)
, optionally returning the label of the key used to encrypt the data.- Parameters:
wrapped
- the encoded blobkeyUsed
- a buffer to receive the alias of the key used to encrypt the data- Returns:
- the decrypted data, if it's unexpired
- Throws:
DataSealerException
- if the data cannot be unwrapped and verified
-
extractAndCheckDecryptedData
@Nonnull private String extractAndCheckDecryptedData(@Nonnull @NotEmpty byte[] decryptedBytes) throws DataSealerExceptionExtract the GZIP'd data and test for expiration before returning it.- Parameters:
decryptedBytes
- the data we are looking at- Returns:
- the decoded data if it is valid and unexpired
- Throws:
DataSealerException
- if the data cannot be unwrapped and verified
-
wrap
Equivalent towrap(String, Instant)
with expiration set to "never".- Parameters:
data
- the data to wrap- Returns:
- the encoded blob
- Throws:
DataSealerException
- if the wrapping operation fails
-
wrap
@Nonnull public String wrap(@Nonnull @NotEmpty String data, @Nullable Instant exp) throws DataSealerExceptionEncodes data into an AEAD-encrypted blob, gzip(exp|data)- exp = expiration time of the data; 8 bytes; Big-endian
- data = the data; a UTF-8-encoded string
As part of encryption, the key alias is supplied as additional authenticated data to the cipher. Afterwards, the encrypted data is prepended by the IV and then again by the alias (in length-prefixed UTF-8 format), which identifies the key used. Finally the result is base64-encoded.
- Parameters:
data
- the data to wrapexp
- expiration time or null for none- Returns:
- the encoded blob
- Throws:
DataSealerException
- if the wrapping operation fails
-
testEncryption
Run a test over the configured bean properties.- Parameters:
key
- key to test- Throws:
DataSealerException
- if the test fails
-