Package org.cryptacular
Class CiphertextHeader
java.lang.Object
org.cryptacular.CiphertextHeader
Cleartext header prepended to ciphertext providing data required for decryption.
Data format:
+---------+---------+---+----------+-------+------+
| Version | KeyName | 0 | NonceLen | Nonce | HMAC |
+---------+---------+---+----------+-------+------+
| |
+--- 4 ---+--- x ---+ 1 +--- 1 ----+-- y --+- 32 -+
Where fields are defined as follows:
- Version - Header version format as a negative number (4-byte integer). Current version is -2.
- KeyName - Symbolic key name encoded as UTF-8 bytes (variable length)
- 0 - Null byte signifying the end of the symbolic key name
- NonceLen - Nonce length in bytes (1-byte unsigned integer)
- Nonce - Nonce bytes (variable length)
- HMAC - HMAC-256 over preceding fields (32 bytes)
The last two fields provide support for multiple keys at the encryption provider. A common case for multiple keys is key rotation; by tagging encrypted data with a key name, an old key may be retrieved by name to decrypt outstanding data which will be subsequently re-encrypted with a new key.
- Author:
- Middleware Services
-
Constructor Summary
ConstructorsConstructorDescriptionCiphertextHeader(byte[] nonce, String keyName) Creates a new instance with a nonce and named key.CiphertextHeader(byte[] nonce, String keyName, Function<String, SecretKey> keyLookup) Creates a new instance with a nonce, named key and key lookup. -
Method Summary
Modifier and TypeMethodDescriptionprotected intstatic CiphertextHeaderCreates a header from encrypted data containing a cleartext header prepended to the start.static CiphertextHeaderdecode(InputStream input, Function<String, SecretKey> keyLookup) Creates a header from encrypted data containing a cleartext header prepended to the start.byte[]encode()Encodes the header into bytes.byte[]Encodes the header into bytes.Gets the encryption key name stored in the header.intGets the header length in bytes.byte[]getNonce()Gets the bytes of the nonce/IV.
-
Constructor Details
-
CiphertextHeader
Creates a new instance with a nonce and named key.- Parameters:
nonce- Nonce bytes.keyName- Key name.
-
CiphertextHeader
Creates a new instance with a nonce, named key and key lookup.- Parameters:
nonce- Nonce bytes.keyName- Key name.keyLookup- Key lookup function.
-
-
Method Details
-
getLength
public int getLength()Gets the header length in bytes.- Returns:
- Header length in bytes.
-
getNonce
public byte[] getNonce()Gets the bytes of the nonce/IV.- Returns:
- Nonce bytes.
-
getKeyName
Gets the encryption key name stored in the header.- Returns:
- Encryption key name.
-
encode
public byte[] encode()Encodes the header into bytes.- Returns:
- Byte representation of header.
-
encode
Encodes the header into bytes.- Parameters:
hmacKey- Key used to generate header HMAC.- Returns:
- Byte representation of header.
-
computeLength
protected int computeLength()- Returns:
- Length of this header encoded as bytes.
-
decode
public static CiphertextHeader decode(byte[] data, Function<String, SecretKey> keyLookup) throws EncodingExceptionCreates a header from encrypted data containing a cleartext header prepended to the start.- Parameters:
data- Encrypted data with prepended header data.keyLookup- Function used to look up the secret key from the symbolic key name in the header.- Returns:
- Decoded header.
- Throws:
EncodingException- when ciphertext header cannot be decoded.
-
decode
public static CiphertextHeader decode(InputStream input, Function<String, SecretKey> keyLookup) throws EncodingException, StreamExceptionCreates a header from encrypted data containing a cleartext header prepended to the start.- Parameters:
input- Input stream that is positioned at the start of ciphertext header data.keyLookup- Function used to look up the secret key from the symbolic key name in the header.- Returns:
- Decoded header.
- Throws:
EncodingException- when ciphertext header cannot be decoded.StreamException- on stream IO errors.
-