In line
On 5/21/2021 5:01 PM, Xue-Lei Andrew Fan wrote:
On Fri, 14 May 2021 00:33:12 GMT, Valerie Peng <valer...@openjdk.org> wrote:
This change updates SunJCE provider as below:
- updated existing AESWrap support with AES/KW/NoPadding cipher transformation.
- added support for AES/KWP/NoPadding and AES/KW/PKCS5Padding.
Existing AESWrap impl, i.e. AESWrapCipher class, is re-factored and renamed to
KeyWrapCipher class. The W and W_inverse functions are moved to KWUtil class.
The KW and KWP support are in the new AESKeyWrap and AESKeyWrapPadded classes
which extend FeedbackCipher and used in KeyWrapCipher class. To minimize data
copying, AESKeyWrap and AESKeyWrapPadded will do the crypto operation over the
same input buffer which is allocated and managed by KeyWrapCipher class.
Also note that existing AESWrap impl does not take IV. However, the
corresponding PKCS#11 mechanisms do, so I added support for accepting IVs to
both KW and KWP.
Thanks,
Valerie
Valerie Peng has updated the pull request with a new target base due to a merge
or a rebase. The pull request now contains seven commits:
- Merge master into JDK-8248268
- Minor update to address review comments.
- Changed AESParameters to allow 4-byte, 8-byte IVs and removed
KWParameters and KWPParameters.
- Refactor code to reduce code duplication
Address review comments
Add more test vectors
- Changed AlgorithmParameters impls to register under AES/KW/NoPadding and
AES/KWP/NoPadding
- Restored Iv algorithm parameters impl.
- 8248268: Support KWP in addition to KW
Updated existing AESWrap support with AES/KW/NoPadding cipher
transformation. Added support for AES/KWP/NoPadding and
AES/KW/PKCS5Padding support to SunJCE provider.
src/java.base/share/classes/com/sun/crypto/provider/AESParameters.java line 50:
48:
49: public AESParameters() {
50: core = new BlockCipherParamsCore(AESConstants.AES_BLOCK_SIZE, 4, 8);
A cipher object may not take different IV sizes at the same time. I was just
wondering how it could be used in practice. Maybe something like:
The mode is KW - it has a fixed length 8 byte non-iv integrity tag.
KWP is a special case of KW where there's still an 8 byte tag, but part
of it is interpreted by KWP to figure out how much padding was
included. KW (AKA RFC3394) permits user (actually specification
specified) IV values. KWP (aka RFC5649) does not.
I'd treat KWP as a final (in the Java final sense) extension to KW with
a fixed AIV flag value and a defined interpretation for the 8 byte AIV
tag. E.g. if you try to specify an IV for KWP, it should fail. If
someone else wants to do something like KWP or even twiddle with the 4
byte AIV, let them do their own KW wrap around - which they should be
able to do that via the KW/NoPadding model by specifying their own AIV.
That should improve interoperability by preventing some monkey see
monkey do errors.
This is sort of one reason I was arguing for AES/KW/KWPPadding rather
than AES/KWP/NoPadding.
Mike
AlgorithmParameters algParams = AlgorithmParameters.getInstance("AES");
algParams.init(ivParameterSpec);
The IV parameter is given with the init() method. Then, it may be not
necessary to construct the BlockCipherParamsCore object will all potential IV
sizes. See the comments in BlockCipherParamsCore.
src/java.base/share/classes/com/sun/crypto/provider/BlockCipherParamsCore.java
line 52:
50: private byte[] iv = null;
51:
52: private int[] moreSizes = null;
The moreSizes is not used other than the init() method field. It may be not
easy to check the specific size if we cache all supported sized in the object.
For example, if the required IV size if 8 bytes, it may be a problem about how
to make sure the iv size is 8 bytes exactly for a specific algorithm.
Maybe, we could just have a ivSize filed. The default value is block_size,
which coupe be set with the init(ivParameterSpec) method.
....
private int ivSize;
...
BlockCipherParamsCore(int blkSize) {
block_size = blkSize;
ivSize = blkSize;
}
...
void init(AlgorithmParameterSpec paramSpec) {
ivSize = ...; // reset IV size.
}
// use ivSize while encoding and decoding.
src/java.base/share/classes/com/sun/crypto/provider/BlockCipherParamsCore.java
line 81:
79: expectedLen + " bytes long");
80: }
81: iv = tmpIv.clone();
The moreSizes is not used after initialization. The iv/tmpIv could be a value
other than the block_size. The getEncoded() method would use the iv value for
the encoding. While in the decoding method init(byte[]) method, the IV sizes
other block_size is not considered, and IOE will be thrown. Could this be a
problem?
-------------
PR: https://git.openjdk.java.net/jdk/pull/2404