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/ConstructKeys.java line 176:

> 174:             return ConstructKeys.constructPublicKey(encoding, 
> keyAlgorithm);
> 175:         default:
> 176:             throw new RuntimeException("Unsupported key type");

Good improvement to thrown an exception rather than return "null"!

Is NoSuchAlgorithmException fitted better the specification?  See also the 
comment in  KeyWrapCipher.engineUnwrap().

src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java line 190:

> 188:                 return constructKey(encoding, keyAlgorithm, keyType);
> 189:             } else {
> 190:                 byte[] encoding2 = Arrays.copyOfRange(encoding, ofs, ofs 
> + len);

The array will be copied again in the X509EncodedKeySpec and 
PKCS8EncodedKeySpec.  It is out of this scope, but it may be a performance 
improvement if adding X509EncodedKeySpec and PKCS8EncodedKeySpec constructors 
that accept array offset, so that the array copy here could be avoid.

src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java line 192:

> 190:                 byte[] encoding2 = Arrays.copyOfRange(encoding, ofs, ofs 
> + len);
> 191:                 try {
> 192:                     return constructKey(encoding2, keyAlgorithm, 
> keyType);

The two constructKey methods are depended on each other.  It may improve the 
readability if only having one-way dependence, by moving the switch-block logic 
from the former constructKey() to the later one.


 static final Key constructKey(byte[] encoding, String keyAlgorithm,
       int keyType) throws InvalidKeyException, NoSuchAlgorithmException {
    return constructKey(encoding, 0. encoding.length, keyAlgorithm, keyType);
}


With this re-org, the array copy could be avoid if the key type is unknown.

src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java line 710:

> 708:             outLen = helperDecrypt(dataBuf, dataIdx);
> 709:             return ConstructKeys.constructKey(dataBuf, 0, outLen,
> 710:                     wrappedKeyAlgorithm, wrappedKeyType);

Per the specification of engineUnwrap,  maybe, the ConstructKeys.constructKey() 
implementation could throw NoSuchAlgorithmException if wrappedKeyType is 
unknown.  See the common in the the ConstructKeys.constructKey() implementation.

-------------

PR: https://git.openjdk.java.net/jdk/pull/2404

Reply via email to