Skip to content

Commit 8ce8deb

Browse files
Fixes for PQC test cases and Fix Serialization issues with keys. (#680)
Needed to remove the dependency of JDK17 in the testcases. Also, there is an issue with serialization. When KeyRep is used to serialize the key the provider order is used to de serialize the key which can cause the wrong key to be created. So, added a new KeyRep class that contains the provider which will allow the correct key to be created. Signed-off-by: John Peck <[email protected]>
1 parent b1a19c0 commit 8ce8deb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+475
-63
lines changed

src/main/java/com/ibm/crypto/plus/provider/AESKey.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
package com.ibm.crypto.plus.provider;
1010

1111
import java.security.InvalidKeyException;
12-
import java.security.KeyRep;
1312
import java.util.Arrays;
1413
import javax.crypto.SecretKey;
1514
import javax.crypto.spec.SecretKeySpec;
@@ -26,6 +25,8 @@ final class AESKey implements SecretKey {
2625

2726
private transient boolean destroyed = false;
2827

28+
private OpenJCEPlusProvider provider = null;
29+
2930
/**
3031
* Create an AES key from a given key
3132
*
@@ -35,12 +36,13 @@ final class AESKey implements SecretKey {
3536
* @exception InvalidKeyException
3637
* if the given key has wrong size
3738
*/
38-
AESKey(byte[] key) throws InvalidKeyException {
39+
AESKey(OpenJCEPlusProvider provider, byte[] key) throws InvalidKeyException {
3940
if ((key == null) || !AESUtils.isKeySizeValid(key.length)) {
4041
throw new InvalidKeyException("Wrong key size");
4142
}
4243

4344
this.key = new byte[key.length];
45+
this.provider = provider;
4446
System.arraycopy(key, 0, this.key, 0, key.length);
4547
}
4648

@@ -117,7 +119,7 @@ private void readObject(java.io.ObjectInputStream s)
117119
*/
118120
private Object writeReplace() throws java.io.ObjectStreamException {
119121
checkDestroyed();
120-
return new KeyRep(KeyRep.Type.SECRET, getAlgorithm(), getFormat(), getEncoded());
122+
return new JCEPlusKeyRep(JCEPlusKeyRep.Type.SECRET, getAlgorithm(), getFormat(), getEncoded(), provider.getName());
121123
}
122124

123125
/**

src/main/java/com/ibm/crypto/plus/provider/AESKeyFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public AESKeyFactory(OpenJCEPlusProvider provider) {
4949
protected SecretKey engineGenerateSecret(KeySpec keySpec) throws InvalidKeySpecException {
5050
try {
5151
if (keySpec instanceof SecretKeySpec) {
52-
return new AESKey(((SecretKeySpec) keySpec).getEncoded());
52+
return new AESKey(provider, ((SecretKeySpec) keySpec).getEncoded());
5353
}
5454
throw new InvalidKeySpecException("Inappropriate key specification");
5555
} catch (InvalidKeyException e) {

src/main/java/com/ibm/crypto/plus/provider/AESKeyGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ protected SecretKey engineGenerateKey() {
5353
cryptoRandom.nextBytes(keyBytes);
5454

5555
try {
56-
return new AESKey(keyBytes);
56+
return new AESKey(provider, keyBytes);
5757
} catch (InvalidKeyException e) {
5858
// Should never happen
5959
throw new ProviderException(e.getMessage());

src/main/java/com/ibm/crypto/plus/provider/ChaCha20Key.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
package com.ibm.crypto.plus.provider;
1010

1111
import java.security.InvalidKeyException;
12-
import java.security.KeyRep;
1312
import java.util.Arrays;
1413
import javax.crypto.SecretKey;
1514
import javax.crypto.spec.SecretKeySpec;
@@ -26,6 +25,8 @@ final class ChaCha20Key implements SecretKey, ChaCha20Constants {
2625

2726
private transient boolean destroyed = false;
2827

28+
private OpenJCEPlusProvider provider = null;
29+
2930
/**
3031
* Create an ChaCha20 key from a given key
3132
*
@@ -35,7 +36,7 @@ final class ChaCha20Key implements SecretKey, ChaCha20Constants {
3536
* @exception InvalidKeyException
3637
* if the given key has wrong size
3738
*/
38-
ChaCha20Key(byte[] key) throws InvalidKeyException {
39+
ChaCha20Key(OpenJCEPlusProvider provider, byte[] key) throws InvalidKeyException {
3940

4041
if ((key == null) || (key.length != ChaCha20_KEY_SIZE)) {
4142
throw new InvalidKeyException("Wrong key size");
@@ -118,7 +119,7 @@ private void readObject(java.io.ObjectInputStream s)
118119
*/
119120
private Object writeReplace() throws java.io.ObjectStreamException {
120121
checkDestroyed();
121-
return new KeyRep(KeyRep.Type.SECRET, getAlgorithm(), getFormat(), getEncoded());
122+
return new JCEPlusKeyRep(JCEPlusKeyRep.Type.SECRET, getAlgorithm(), getFormat(), getEncoded(), provider.getName());
122123
}
123124

124125
/**

src/main/java/com/ibm/crypto/plus/provider/ChaCha20KeyFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public ChaCha20KeyFactory(OpenJCEPlusProvider provider) {
4949
protected SecretKey engineGenerateSecret(KeySpec keySpec) throws InvalidKeySpecException {
5050
try {
5151
if (keySpec instanceof SecretKeySpec) {
52-
return new ChaCha20Key(((SecretKeySpec) keySpec).getEncoded());
52+
return new ChaCha20Key(provider, ((SecretKeySpec) keySpec).getEncoded());
5353
}
5454
throw new InvalidKeySpecException("Inappropriate key specification");
5555
} catch (InvalidKeyException e) {

src/main/java/com/ibm/crypto/plus/provider/ChaCha20KeyGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ protected SecretKey engineGenerateKey() {
5353
cryptoRandom.nextBytes(keyBytes);
5454

5555
try {
56-
return new ChaCha20Key(keyBytes);
56+
return new ChaCha20Key(provider, keyBytes);
5757
} catch (InvalidKeyException e) {
5858
// Should never happen
5959
throw new ProviderException(e.getMessage());

src/main/java/com/ibm/crypto/plus/provider/DESedeKey.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
package com.ibm.crypto.plus.provider;
1010

1111
import java.security.InvalidKeyException;
12-
import java.security.KeyRep;
1312
import java.util.Arrays;
1413
import javax.crypto.SecretKey;
1514
import javax.crypto.spec.DESedeKeySpec;
@@ -28,14 +27,16 @@ final class DESedeKey implements SecretKey, Destroyable {
2827

2928
private transient boolean destroyed = false;
3029

30+
private OpenJCEPlusProvider provider = null;
31+
3132
/**
3233
* Creates a DES-EDE key from a given key.
3334
*
3435
* @param key the given key
3536
*
3637
* @exception InvalidKeyException if the given key has a wrong size
3738
*/
38-
DESedeKey(byte[] key) throws InvalidKeyException {
39+
DESedeKey(OpenJCEPlusProvider provider, byte[] key) throws InvalidKeyException {
3940
if ((key == null) || (key.length < DESedeKeySpec.DES_EDE_KEY_LEN)) {
4041
throw new InvalidKeyException("Wrong key size");
4142
}
@@ -120,7 +121,7 @@ private void readObject(java.io.ObjectInputStream s)
120121
*/
121122
private Object writeReplace() throws java.io.ObjectStreamException {
122123
checkDestroyed();
123-
return new KeyRep(KeyRep.Type.SECRET, getAlgorithm(), getFormat(), getEncoded());
124+
return new JCEPlusKeyRep(JCEPlusKeyRep.Type.SECRET, getAlgorithm(), getFormat(), getEncoded(), provider.getName());
124125
}
125126

126127
/**

src/main/java/com/ibm/crypto/plus/provider/DESedeKeyFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ public DESedeKeyFactory(OpenJCEPlusProvider provider) {
5252
protected SecretKey engineGenerateSecret(KeySpec keySpec) throws InvalidKeySpecException {
5353
try {
5454
if (keySpec instanceof DESedeKeySpec) {
55-
return new DESedeKey(((DESedeKeySpec) keySpec).getKey());
55+
return new DESedeKey(provider, ((DESedeKeySpec) keySpec).getKey());
5656
}
5757
if (keySpec instanceof SecretKeySpec) {
58-
return new DESedeKey(((SecretKeySpec) keySpec).getEncoded());
58+
return new DESedeKey(provider, ((SecretKeySpec) keySpec).getEncoded());
5959
}
6060
throw new InvalidKeySpecException("Inappropriate key specification");
6161
} catch (InvalidKeyException e) {

src/main/java/com/ibm/crypto/plus/provider/DESedeKeyGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ protected SecretKey engineGenerateKey() {
7979
}
8080

8181
try {
82-
return new DESedeKey(rawkey);
82+
return new DESedeKey(provider, rawkey);
8383
} catch (InvalidKeyException e) {
8484
// Should never happen
8585
throw new ProviderException(e.getMessage());

src/main/java/com/ibm/crypto/plus/provider/DHKeyAgreement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ protected SecretKey engineGenerateSecret(String algorithm)
211211
byte[] secret = engineGenerateSecret();
212212
if (algorithm.equalsIgnoreCase("DESede") || algorithm.equalsIgnoreCase("TripleDES")) {
213213
// Triple DES
214-
return new DESedeKey(secret);
214+
return new DESedeKey(provider, secret);
215215
} else if (algorithm.equalsIgnoreCase("AES")) {
216216
// AES
217217
int keysize = secret.length;

0 commit comments

Comments
 (0)