public class TripleDESKeyWrap
extends javax.crypto.CipherSpi
RFC 2630 (Cryptographic Message Syntax) (Section 12.6.2, 12.6.3) specifies the TripleDES key wrap algorithm for wrapping TripleDES content encryption keys with TripleDES key encryption keys when using the KeyAgreeRecipientInfo or KEKRecipientInfo choice for providing recipient specific information when encrypting data using the EnvelopedData type.
Since this class only can be used for wrapping/unwrapping secret content encryption keys
an application only can call methods wrap and unwrap
of the corresponding Cipher object. Any attempt to call a update or
doFinal method will cause a RuntimeException to be thrown.
A CMS key wrap (unwrap) procedure involves two encryption (decryption) operations,
both run in CBC mode.
The first encryption step uses a random IV and the second encryption step uses
a fixed IV of 0x4adda22c79e82105. Correspondingly the first decryption
step uses a fixed IV (0x4adda22c79e82105) and the second decryption step
uses the random IV recovered from the first decryption. When calling an
engineInit method any parameters supplied are ignored; this CMS TripleDes
key wrap cipher implementation itself takes care for using the right IV for the right
en/decryption step. When calling method getIV or getParameters
this class always returns null since a TripleDES CMS key wrap cipher does
not include parameters in its algorithm id.
When creating a new CMS TripleDES key wrap Cipher object you only may provide the name of the key wrap cipher ("DESedeWrapDESede"). Any cipher mode (always uses CBC) or padding (does the padding itself) specification is ignored.
For example, wrapping a Triple-DES content encryption key using a Triple-DES key encryption key typically may be done as follows:
// the content encryption key to be wrapped:
SecretKey cek = ...;
// the key encryption key to be used:
SecretKey kek = ...;
// get a TripleDES key wrap cipher:
Cipher c = Cipher.getInstance("DESedeWrapDESede");
// init with the key encryption key
c.init(Cipher.WRAP_MODE, kek);
// wrap the content encryption key:
byte[] wrappedCek = c.wrap(cek);
For unwrapping the key init the Cipher in unwrap mode:
Cipher c = Cipher.getInstance("DESedeWrapDESede");
// init with the key encryption key
c.init(Cipher.UNWRAP_MODE, kek);
// unwrap the wrapped content encryption key:
Key unwrappedCek = c.unwrap(wrappedCek, "DESede", Cipher.SECRET_KEY);
This class SHOULD NOT be used directly; it should only be used through the JCA/JCE.
| Modifier and Type | Field and Description |
|---|---|
static byte[] |
CMS_KEY_WRAP_IV
The IV for the last encryption step of CMS key wrap.
|
| Constructor and Description |
|---|
TripleDESKeyWrap()
The constructor; creates a new instance of the DESedeWrapDESede symmetric
cipher algorithm.
|
| Modifier and Type | Method and Description |
|---|---|
byte[] |
engineDoFinal(byte[] input,
int inputOffset,
int inputLen)
Encrypts or decrypts data in a single-part operation, or finishes a
multiple-part operation.
|
int |
engineDoFinal(byte[] input,
int inputOffset,
int inputLen,
byte[] output,
int outputOffset)
Encrypts or decrypts data in a single-part operation, or finishes a
multiple-part operation.
|
int |
engineGetBlockSize()
Returns the block size (in bytes).
|
byte[] |
engineGetIV()
Returns the initialization vector (IV) in a new buffer.
|
protected int |
engineGetKeySize(java.security.Key key)
Returns the key size of the given key object in bits.
|
int |
engineGetOutputSize(int inputLen)
Returns the length in bytes that an output buffer would need to be in
order to hold the result of the next
update or
doFinal operation, given the input length
inputLen (in bytes). |
java.security.AlgorithmParameters |
engineGetParameters()
Returns the parameters used with this cipher.
|
void |
engineInit(int opmode,
java.security.Key key,
java.security.spec.AlgorithmParameterSpec params,
java.security.SecureRandom random)
Initializes this cipher with a key, a set of algorithm parameters, and a
source of randomness.
|
void |
engineInit(int opmode,
java.security.Key key,
java.security.AlgorithmParameters params,
java.security.SecureRandom random)
Initializes this cipher with a key, a set of algorithm parameters, and a
source of randomness.
|
void |
engineInit(int opmode,
java.security.Key key,
java.security.SecureRandom random)
Initializes this cipher with a key and a source of randomness.
|
void |
engineSetMode(java.lang.String mode)
Sets the block mode of this cipher.
|
void |
engineSetPadding(java.lang.String paddingName)
Sets the padding type of this cipher.
|
protected java.security.Key |
engineUnwrap(byte[] wrappedKey,
java.lang.String wrappedKeyAlgorithm,
int wrappedKeyType)
Unwrap a previously wrapped key.
|
byte[] |
engineUpdate(byte[] input,
int inputOffset,
int inputLen)
Continues a multiple-part encryption or decryption operation (depending
on how this cipher was initialized), processing another data part.
|
int |
engineUpdate(byte[] input,
int inputOffset,
int inputLen,
byte[] output,
int outputOffset)
Continues a multiple-part encryption or decryption operation (depending
on how this cipher was initialized), processing another data part.
|
protected byte[] |
engineWrap(java.security.Key key)
Wrap a key.
|
java.lang.String |
toString()
Returns a string representation of this Cipher.
|
public static final byte[] CMS_KEY_WRAP_IV
IV = 0x4adda22c79e82105.
public TripleDESKeyWrap()
Applications should never use this constructor, instead the symmetric
cipher algorithm should be requested from the appropriate JCA/JCE
cryptographic service provider as follows:
Cipher.getInstance("DESedeWrapDESede", "IAIK").
public void engineInit(int opmode,
java.security.Key key,
java.security.spec.AlgorithmParameterSpec params,
java.security.SecureRandom random)
throws java.security.InvalidKeyException,
java.security.InvalidAlgorithmParameterException
The cipher is initialized for one of the following four operations:
encryption, decryption, key wrapping or key unwrapping, depending on the
value of opmode.
If this cipher requires any algorithm parameters and params
is null, the underlying cipher implementation is supposed to generate the
required parameters itself (using provider-specific default or random
values) if it is being initialized for encryption or key wrapping, and
raise an InvalidAlgorithmParameterException if it is being
initialized for decryption or key unwrapping. The generated parameters
can be retrieved using engineGetParameters() or
engineGetIV() (if the parameter is an IV).
If this cipher (including its underlying feedback or padding scheme)
requires any random bytes (e.g., for parameter generation), it will get
them from random.
Note that when a Cipher object is initialized, it loses all previously-acquired state. In other words, initializing a Cipher is equivalent to creating a new instance of that Cipher and initializing it.
opmode - [FIPS 140-2 control input] the operation mode of this cipher
(this is one of the following: ENCRYPT_MODE,
DECRYPT_MODE, WRAP_MODE or
UNWRAP_MODE)key - [FIPS 140-2 data input] [FIPS 140-2 CSP] the encryption keyparams - [FIPS 140-2 data input] the algorithm parametersrandom - [FIPS 140-2 control input] the source of randomnessjava.security.InvalidKeyException - [FIPS 140-2 status output] if the given key is inappropriate
for initializing this cipherjava.security.InvalidAlgorithmParameterException - [FIPS 140-2 status output] if the given algorithm parameters
are inappropriate for this cipher, or if this cipher is being
initialized for decryption and requires algorithm parameters
and params is nullpublic void engineInit(int opmode,
java.security.Key key,
java.security.AlgorithmParameters params,
java.security.SecureRandom random)
throws java.security.InvalidKeyException,
java.security.InvalidAlgorithmParameterException
The cipher is initialized for one of the following four operations:
encryption, decryption, key wrapping or key unwrapping, depending on the
value of opmode.
If this cipher requires any algorithm parameters and params
is null, the underlying cipher implementation is supposed to generate the
required parameters itself (using provider-specific default or random
values) if it is being initialized for encryption or key wrapping, and
raise an InvalidAlgorithmParameterException if it is being
initialized for decryption or key unwrapping. The generated parameters
can be retrieved using engineGetParameters() or
engineGetIV() (if the parameter is an IV).
If this cipher (including its underlying feedback or padding scheme)
requires any random bytes (e.g., for parameter generation), it will get
them from random.
Note that when a Cipher object is initialized, it loses all previously-acquired state. In other words, initializing a Cipher is equivalent to creating a new instance of that Cipher and initializing it.
opmode - [FIPS 140-2 control input] the operation mode of this cipher
(this is one of the following: ENCRYPT_MODE,
DECRYPT_MODE, WRAP_MODE or
UNWRAP_MODE)key - [FIPS 140-2 data input] [FIPS 140-2 CSP] the encryption keyparams - [FIPS 140-2 data input] the algorithm parametersrandom - [FIPS 140-2 control input] the source of randomnessjava.security.InvalidKeyException - [FIPS 140-2 status output] if the given key is inappropriate
for initializing this cipherjava.security.InvalidAlgorithmParameterException - [FIPS 140-2 status output] if the given algorithm parameters
are inappropriate for this cipher, or if this cipher is being
initialized for decryption and requires algorithm parameters
and params is nullpublic void engineInit(int opmode,
java.security.Key key,
java.security.SecureRandom random)
throws java.security.InvalidKeyException
The cipher is initialized for one of the following four operations:
encryption, decryption, key wrapping or key unwrapping, depending on the
value of opmode.
If this cipher requires any algorithm parameters that cannot be derived
from the given key, the underlying cipher implementation is supposed to
generate the required parameters itself (using provider-specific default
or random values) if it is being initialized for encryption or key
wrapping, and raise an InvalidKeyException if it is being
initialized for decryption or key unwrapping. The generated parameters
can be retrieved using engineGetParameters() or
engineGetIV() (if the parameter is an IV).
If this cipher (including its underlying feedback or padding scheme)
requires any random bytes (e.g., for parameter generation), it will get
them from random.
Note that when a Cipher object is initialized, it loses all previously-acquired state. In other words, initializing a Cipher is equivalent to creating a new instance of that Cipher and initializing it.
opmode - [FIPS 140-2 control input] the operation mode of this cipher
(this is one of the following: ENCRYPT_MODE,
DECRYPT_MODE, WRAP_MODE or
UNWRAP_MODE)key - [FIPS 140-2 data input] [FIPS 140-2 CSP] the encryption keyrandom - [FIPS 140-2 control input] the source of randomnessjava.security.InvalidKeyException - [FIPS 140-2 status output] if the given key is inappropriate
for initializing this cipher, or if this cipher is being
initialized for decryption and requires algorithm parameters
that cannot be determined from the given keyFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationspublic void engineSetPadding(java.lang.String paddingName)
throws javax.crypto.NoSuchPaddingException
Regardless of the input, the padding is always set to 'NoPadding'.
padding - [FIPS 140-2 control input] the padding type; ignoredjavax.crypto.NoSuchPaddingException - [FIPS 140-2 status output] if the requested padding type does
not existpublic void engineSetMode(java.lang.String mode)
throws java.security.NoSuchAlgorithmException
Regardless of the input, the mode is always set to 'CBC'.
mode - [FIPS 140-2 control input] the cipher block modejava.security.NoSuchAlgorithmException - [FIPS 140-2 status output] if the requested cipher block mode
is not supportedpublic byte[] engineUpdate(byte[] input,
int inputOffset,
int inputLen)
This engine API is not supported; a RuntimeException is
always thrown indicating this.
input - [FIPS 140-2 data input] the input bufferinputOffset - [FIPS 140-2 data input] the offset in input where the
input startsinputLen - [FIPS 140-2 data input] the input lengthFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationsjava.lang.RuntimeException - [FIPS 140-2 status output] always thrown; indicates that this
API is not supportedpublic int engineUpdate(byte[] input,
int inputOffset,
int inputLen,
byte[] output,
int outputOffset)
throws javax.crypto.ShortBufferException
This engine API is not supported; a RuntimeException is
always thrown indicating this.
input - [FIPS 140-2 data input] the input bufferinputOffset - [FIPS 140-2 data input] the offset in input where the
input startsinputLen - [FIPS 140-2 data input] the input lengthoutput - [FIPS 140-2 data output] the buffer for the resultoutputOffset - [FIPS 140-2 data input] the offset in output
where the result is storedoutputjavax.crypto.ShortBufferException - [FIPS 140-2 status output] if the given output buffer is too
small to hold the resultFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationsjava.lang.RuntimeException - [FIPS 140-2 status output] always thrown; indicates that this
API is not supportedpublic int engineDoFinal(byte[] input,
int inputOffset,
int inputLen,
byte[] output,
int outputOffset)
throws javax.crypto.ShortBufferException,
javax.crypto.IllegalBlockSizeException,
javax.crypto.BadPaddingException
This engine API is not supported; a RuntimeException is
always thrown indicating this.
input - [FIPS 140-2 data input] the input bufferinputOffset - [FIPS 140-2 data input] the offset in input where the
input startsinputLen - [FIPS 140-2 data input] the input lengthoutput - [FIPS 140-2 data output] the buffer for the resultoutputOffset - [FIPS 140-2 data input] the offset in output
where the result is storedoutputjavax.crypto.IllegalBlockSizeException - [FIPS 140-2 status output] if this cipher is a block cipher,
no padding has been requested (only in encryption mode), and
the total input length of the data processed by this cipher
is not a multiple of block size; or if this encryption
algorithm is unable to process the input data providedjavax.crypto.ShortBufferException - [FIPS 140-2 status output] if the given output buffer is too
small to hold the resultjavax.crypto.BadPaddingException - [FIPS 140-2 status output] if this cipher is in decryption
mode, and (un)padding has been requested, but the decrypted
data is not bounded by the appropriate padding bytesFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationsjava.lang.RuntimeException - [FIPS 140-2 status output] always thrown; indicates that this
API is not supportedpublic byte[] engineDoFinal(byte[] input,
int inputOffset,
int inputLen)
throws javax.crypto.IllegalBlockSizeException,
javax.crypto.BadPaddingException
This engine API is not supported; a RuntimeException is
always thrown indicating this.
input - [FIPS 140-2 data input] the input bufferinputOffset - [FIPS 140-2 data input] the offset in input where the
input startsinputLen - [FIPS 140-2 data input] the input lengthjavax.crypto.IllegalBlockSizeException - [FIPS 140-2 status output] if this cipher is a block cipher,
no padding has been requested (only in encryption mode), and
the total input length of the data processed by this cipher
is not a multiple of block size; or if this encryption
algorithm is unable to process the input data providedjavax.crypto.BadPaddingException - [FIPS 140-2 status output] if this cipher is in decryption
mode, and (un)padding has been requested, but the decrypted
data is not bounded by the appropriate padding bytesFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationsjava.lang.RuntimeException - [FIPS 140-2 status output] always thrown; indicates that this
API is not supportedpublic java.security.AlgorithmParameters engineGetParameters()
The returned parameters may be the same that were used to initialize this cipher, or may contain a combination of default and random parameter values used by the underlying cipher implementation if this cipher requires algorithm parameters but was not initialized with any.
Fips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationspublic byte[] engineGetIV()
This is useful in the context of password-based encryption or decryption, where the IV is derived from a user-provided passphrase.
Fips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationspublic java.lang.String toString()
protected byte[] engineWrap(java.security.Key key)
throws javax.crypto.IllegalBlockSizeException,
java.security.InvalidKeyException
key - [FIPS 140-2 data input] [FIPS 140-2 CSP] the key to be wrappedjavax.crypto.IllegalBlockSizeException - [FIPS 140-2 status output] if this cipher is a block cipher,
no padding has been requested, and the length of the encoding
of the key to be wrapped is not a multiple of the block sizejava.security.InvalidKeyException - [FIPS 140-2 status output] if it is impossible or unsafe to
wrap the key with this cipher (e.g., a hardware protected key
is being passed to a software-only cipher)Fips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationsprotected java.security.Key engineUnwrap(byte[] wrappedKey,
java.lang.String wrappedKeyAlgorithm,
int wrappedKeyType)
throws java.security.InvalidKeyException,
java.security.NoSuchAlgorithmException
wrappedKey - [FIPS 140-2 data input] [FIPS 140-2 CSP] the key to be
unwrappedwrappedKeyAlgorithm - [FIPS 140-2 control input] the algorithm associated with the
wrapped keywrappedKeyType - [FIPS 140-2 control input] the type of the wrapped key. This
is one of SECRET_KEY, PRIVATE_KEY,
or PUBLIC_KEY.java.security.NoSuchAlgorithmException - [FIPS 140-2 status output] if no installed providers can
create keys of type wrappedKeyType for the
wrappedKeyAlgorithmjava.security.InvalidKeyException - [FIPS 140-2 status output] if wrappedKey does
not represent a wrapped key of type
wrappedKeyType for the
wrappedKeyAlgorithmFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationspublic int engineGetOutputSize(int inputLen)
update or
doFinal operation, given the input length
inputLen (in bytes).
This call takes into account any unprocessed (buffered) data from a
previous update call, and padding.
The actual output length of the next update or
doFinal call may be smaller than the length returned by this
method.
engineGetOutputSize in class javax.crypto.CipherSpiinputLen - [FIPS 140-2 data input] the input length (in bytes)Fips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationspublic int engineGetBlockSize()
engineGetBlockSize in class javax.crypto.CipherSpiFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operationsprotected int engineGetKeySize(java.security.Key key)
throws java.security.InvalidKeyException
engineGetKeySize in class javax.crypto.CipherSpikey - [FIPS 140-2 data input] [FIPS 140-2 CSP] the key objectjava.security.InvalidKeyException - [FIPS 140-2 status output] if key is invalidFips140ErrorStateException - [FIPS 140-2 status output] thrown if the Toolkit is not
allowed to perform cryptographic operations