mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8246077: Cloneable test in HmacCore seems questionable
Updated java.security.MessageDigest and Signature classes to return Cloneable obj for Cloneable spi obj Reviewed-by: weijun, xuelei, coffeys
This commit is contained in:
parent
c55b06a4d5
commit
f968f32789
7 changed files with 377 additions and 32 deletions
|
@ -272,7 +272,7 @@ public abstract class Signature extends SignatureSpi {
|
|||
NoSuchAlgorithmException failure;
|
||||
do {
|
||||
Service s = t.next();
|
||||
if (isSpi(s)) {
|
||||
if (isSpi(s)) { // delayed provider selection
|
||||
return new Delegate(s, t, algorithm);
|
||||
} else {
|
||||
// must be a subclass of Signature, disable dynamic selection
|
||||
|
@ -295,7 +295,7 @@ public abstract class Signature extends SignatureSpi {
|
|||
sig.algorithm = algorithm;
|
||||
} else {
|
||||
SignatureSpi spi = (SignatureSpi)instance.impl;
|
||||
sig = new Delegate(spi, algorithm);
|
||||
sig = Delegate.of(spi, algorithm);
|
||||
}
|
||||
sig.provider = instance.provider;
|
||||
return sig;
|
||||
|
@ -464,7 +464,7 @@ public abstract class Signature extends SignatureSpi {
|
|||
// check Cipher
|
||||
try {
|
||||
Cipher c = Cipher.getInstance(RSA_CIPHER, p);
|
||||
return new Delegate(new CipherAdapter(c), RSA_SIGNATURE);
|
||||
return Delegate.of(new CipherAdapter(c), RSA_SIGNATURE);
|
||||
} catch (GeneralSecurityException e) {
|
||||
// throw Signature style exception message to avoid confusion,
|
||||
// but append Cipher exception as cause
|
||||
|
@ -1092,6 +1092,14 @@ public abstract class Signature extends SignatureSpi {
|
|||
|
||||
@SuppressWarnings("deprecation")
|
||||
private static class Delegate extends Signature {
|
||||
// use this class for spi objects which implements Cloneable
|
||||
private static final class CloneableDelegate extends Delegate
|
||||
implements Cloneable {
|
||||
private CloneableDelegate(SignatureSpi digestSpi,
|
||||
String algorithm) {
|
||||
super(digestSpi, algorithm);
|
||||
}
|
||||
}
|
||||
|
||||
// The provider implementation (delegate)
|
||||
// filled in once the provider is selected
|
||||
|
@ -1108,15 +1116,24 @@ public abstract class Signature extends SignatureSpi {
|
|||
// null once provider is selected
|
||||
private Iterator<Service> serviceIterator;
|
||||
|
||||
// constructor
|
||||
Delegate(SignatureSpi sigSpi, String algorithm) {
|
||||
// factory method used by Signature class to create Delegate objs
|
||||
static Delegate of(SignatureSpi sigSpi, String algorithm) {
|
||||
if (sigSpi instanceof Cloneable) {
|
||||
return new CloneableDelegate(sigSpi, algorithm);
|
||||
} else {
|
||||
return new Delegate(sigSpi, algorithm);
|
||||
}
|
||||
}
|
||||
|
||||
// private constructor
|
||||
private Delegate(SignatureSpi sigSpi, String algorithm) {
|
||||
super(algorithm);
|
||||
this.sigSpi = sigSpi;
|
||||
this.lock = null; // no lock needed
|
||||
}
|
||||
|
||||
// used with delayed provider selection
|
||||
Delegate(Service service,
|
||||
// constructor used with delayed provider selection
|
||||
private Delegate(Service service,
|
||||
Iterator<Service> iterator, String algorithm) {
|
||||
super(algorithm);
|
||||
this.firstService = service;
|
||||
|
@ -1132,15 +1149,16 @@ public abstract class Signature extends SignatureSpi {
|
|||
* @throws CloneNotSupportedException if this is called on a
|
||||
* delegate that does not support {@code Cloneable}.
|
||||
*/
|
||||
@Override
|
||||
public Object clone() throws CloneNotSupportedException {
|
||||
chooseFirstProvider();
|
||||
if (sigSpi instanceof Cloneable) {
|
||||
SignatureSpi sigSpiClone = (SignatureSpi)sigSpi.clone();
|
||||
// Because 'algorithm' and 'provider' are private
|
||||
// members of our supertype, we must perform a cast to
|
||||
// access them.
|
||||
Signature that =
|
||||
new Delegate(sigSpiClone, ((Signature)this).algorithm);
|
||||
Signature that = new CloneableDelegate(
|
||||
(SignatureSpi)sigSpi.clone(),
|
||||
((Signature)this).algorithm);
|
||||
that.provider = ((Signature)this).provider;
|
||||
return that;
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue