-
CSR
-
Resolution: Withdrawn
-
P3
-
None
-
behavioral
-
low
-
-
Implementation
Summary
Support additional pseudo random functions (PRFs) and encryption schemes. Provide better fail-fast error checking during initialization.
Problem
JDK-8076999 outlined multiple processing issues with PBES2-based AlgorithmParameters. Some of these issues were fixed as part of JDK-8202837, but one issue (additional algorithm support) remained unaddressed. During the fix for this remaining issue, other problems were uncovered in the state machine for PBES2-based AlgorithmParameters initialization which necessitated further behavioral changes.
Solution
The solution has multiple components:
Additional PRF and Cipher support:
Currently AlgorithmParameters only supports the following combinations of pseudorandom functions (PRFs) and Ciphers:
| PRFs | Ciphers |
|---|---|
| HmacSHA1 | AES_128 |
| HmacSHA224 | AES_256 |
| HmacSHA256 | |
| HmacSHA384 | |
| HmacSHA512 |
These strings are used to create a standard name used with AlgorithmParameters of the form PBEWith<prf>And<cipher> (e.g. PBEWithHmacSHA256AndAES_256). When initialized via the init(byte[]) method, only those DER encodings that advertise the above PRFs and Ciphers can be successfully processed.
This fix will now allow the SunJCE provider's AlgorithmParameters PBES2 implementation to accept encodings that advertise the HmacSHA512/224 and HmacSHA512/256 PRFs and the following additional ciphers: AES_192, DES, DESede (Triple-DES), RC2, and RC5. These algorithms all have AlgorithmParameterSpec classes designed for them and are detailed in RFC 8018.
In addition, we will be adding a new SunJCE AlgorithmParameters implementation for RC5 parameters, using the standard name "RC5". The parameters are described in RFC 2040 and RFC 8018.
Accepting these new algorithms in the PBES2 parameter encodings only covers the PBES2 parameters themselves. It does not guarantee PBE Cipher or SecretKeyFactory support in the SunJCE provider. The AlgorithmParameters object may be used with other JCE providers' Cipher and/or SecretKeyFactory implementations.
Standard Names
We are proposing two new AlgorithmParameters standard names in the SunJCE provider:
| Name | Description |
|---|---|
| RC5 | The RC5_CBC_Parameters as described in RFC 2040 and RFC 8018 |
| PBES2 | A generic PBES2 AlgorithmParameters object |
The algorithm string "PBES2" can be used to instantiate a generic PBES2-based AlgorithmParameters object that can accept DER-encodings with the any of the supported PRFs and Ciphers listed above.
Improved Initialization Fail-Fast Behavior
There are two ways to instantiate PBES2-based AlgorithmParameters objects. The first is by a generic name "PBES2". The second is via a fully-qualified name indicating the PRF and encryption scheme (e.g. PBEWithHmacSHA256AndAES_128). Initialization can happen either by providing DER encoded parameter data as a byte array or via an AlgorithmParameterSpec. The current interactions between instantiation and initialization methods allowed certain combinations to cause incompatibilities that were not caught at initialization time, and would only happen when later used by the consumer of the AlgorithmParameters object. The following section details how this will be corrected.
Consistency Between Fully-Qualified Name and Encoding
In the current implementation it is possible to create the object using a string such as "PBEWithHmacSHA256AndAES_128", but initialize it with DER encodings using a different PRF and/or encryption scheme. The proposed changes will cause an IOException to be thrown on the init methods that take DER encodings when either the PRF or encryption scheme OIDs do not match the requested types in the getInstance() call. These init methods already throw IOException on decoding errors, but this behavioral change makes the SunJCE implementation adhere more strictly to the specification by requiring better consistency between the requested and received algorithm types in the encoding.
Consistency Between Fully-Qualified Algorithm Name and Provided AlgorithmParameterSpec
Another method of initialization can happen through the submission of an AlgorithmParameterSpec (specifically a javax.crypto.spec.PBEParameterSpec). The PBES2 Cipher may itself have additional configuration options provided to it via PBEParameterSpec.getParameterSpec().
Currently, there is no checking performed to ensure that the AlgorithmParameterSpec retrieved by PBEParameterSpec.getParameterSpec() matches the type appropriate for the Cipher. The proposed change will now check the Cipher AlgorithmParameterSpec to make sure it is the correct type. Failure to use the correct class or derived subclass from that type will cause InvalidParameterSpecException to be thrown. The table below shows a sample fully qualified name and its corresponding Cipher's 'AlgorithmParameterSpec' type:
| Encryption Scheme | AlgorithmParameterSpec |
|---|---|
| PBEWithSHA256AndAES_128 | javax.crypto.spec.IvParameterSpec |
| PBEWithSHA256AndAES_192 | javax.crypto.spec.IvParameterSpec |
| PBEWithSHA256AndAES_256 | javax.crypto.spec.IvParameterSpec |
| PBEWithSHA256AndDES | javax.crypto.spec.IvParameterSpec |
| PBEWithSHA256AndDESede | javax.crypto.spec.IvParameterSpec |
| PBEWithSHA256AndRC2_<nn> | javax.crypto.spec.RC2ParameterSpec |
| PBEWithSHA256AndRC5_<nn> | javax.crypto.spec.RC5ParameterSpec |
Because there are multiple encryption schemes that use the same AlgorithmParameterSpec concrete class, the generic "PBES2" standard name cannot be used to instantiate the PBES2 AlgorithmParameters object if init(AlgorithmParameterSpec) is used. If this is attempted, InvalidParameterSpecException will be thrown.
In addition to type enforcement, when the init(AlgorithmParameterSpec) method is used the contents of the AlgorithmParameterSpec will be tested to make sure the values are consistent with the algorithm they are configuring. For instance, if AES is selected, a provided IvParameterSpec will have the output length from the getIV() method tested to make sure it is 16 bytes.
Specification
RC5: Standard name for the RC5_CBC_Parameters encoding as an AlgorithmParameters object.
PBES2: Standard name for generic PBES2 AlgorithmParameters encodings.
- csr of
-
JDK-8076999 SunJCE support of password-based encryption scheme 2 params (PBES2) not working
-
- Resolved
-