Skip to content

Commit 11877fc

Browse files
committed
(D)TLS: Remove redundant verification of self-generated RSA signatures
- see #1722
1 parent d618fa3 commit 11877fc

File tree

7 files changed

+21
-214
lines changed

7 files changed

+21
-214
lines changed

tls/src/main/java/org/bouncycastle/tls/crypto/impl/bc/BcDefaultTlsCredentialedSigner.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.bouncycastle.tls.crypto.impl.bc;
22

3-
import java.io.IOException;
4-
53
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
64
import org.bouncycastle.crypto.params.DSAPrivateKeyParameters;
75
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
@@ -21,16 +19,6 @@
2119
public class BcDefaultTlsCredentialedSigner
2220
extends DefaultTlsCredentialedSigner
2321
{
24-
private static BcTlsCertificate getEndEntity(BcTlsCrypto crypto, Certificate certificate) throws IOException
25-
{
26-
if (certificate == null || certificate.isEmpty())
27-
{
28-
throw new IllegalArgumentException("No certificate");
29-
}
30-
31-
return BcTlsCertificate.convert(crypto, certificate.getCertificateAt(0));
32-
}
33-
3422
private static TlsSigner makeSigner(BcTlsCrypto crypto, AsymmetricKeyParameter privateKey, Certificate certificate,
3523
SignatureAndHashAlgorithm signatureAndHashAlgorithm)
3624
{
@@ -48,17 +36,7 @@ private static TlsSigner makeSigner(BcTlsCrypto crypto, AsymmetricKeyParameter p
4836
}
4937
}
5038

51-
RSAKeyParameters pubKeyRSA;
52-
try
53-
{
54-
pubKeyRSA = getEndEntity(crypto, certificate).getPubKeyRSA();
55-
}
56-
catch (Exception e)
57-
{
58-
throw new RuntimeException(e);
59-
}
60-
61-
signer = new BcTlsRSASigner(crypto, privKeyRSA, pubKeyRSA);
39+
signer = new BcTlsRSASigner(crypto, privKeyRSA);
6240
}
6341
else if (privateKey instanceof DSAPrivateKeyParameters)
6442
{

tls/src/main/java/org/bouncycastle/tls/crypto/impl/bc/BcTlsRSASigner.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,17 @@
2424
public class BcTlsRSASigner
2525
extends BcTlsSigner
2626
{
27-
private final RSAKeyParameters publicKey;
28-
27+
/**
28+
* @deprecated Use constructor without 'publicKey' parameter.
29+
*/
2930
public BcTlsRSASigner(BcTlsCrypto crypto, RSAKeyParameters privateKey, RSAKeyParameters publicKey)
3031
{
31-
super(crypto, privateKey);
32+
this(crypto, privateKey);
33+
}
3234

33-
this.publicKey = publicKey;
35+
public BcTlsRSASigner(BcTlsCrypto crypto, RSAKeyParameters privateKey)
36+
{
37+
super(crypto, privateKey);
3438
}
3539

3640
public byte[] generateRawSignature(SignatureAndHashAlgorithm algorithm, byte[] hash) throws IOException
@@ -63,21 +67,11 @@ public byte[] generateRawSignature(SignatureAndHashAlgorithm algorithm, byte[] h
6367
signer.update(hash, 0, hash.length);
6468
try
6569
{
66-
byte[] signature = signer.generateSignature();
67-
68-
signer.init(false, publicKey);
69-
signer.update(hash, 0, hash.length);
70-
71-
if (signer.verifySignature(signature))
72-
{
73-
return signature;
74-
}
70+
return signer.generateSignature();
7571
}
7672
catch (CryptoException e)
7773
{
7874
throw new TlsFatalAlert(AlertDescription.internal_error, e);
7975
}
80-
81-
throw new TlsFatalAlert(AlertDescription.internal_error);
8276
}
8377
}

tls/src/main/java/org/bouncycastle/tls/crypto/impl/bc/BcVerifyingStreamSigner.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

tls/src/main/java/org/bouncycastle/tls/crypto/impl/jcajce/JcaDefaultTlsCredentialedSigner.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package org.bouncycastle.tls.crypto.impl.jcajce;
22

3-
import java.io.IOException;
43
import java.security.PrivateKey;
5-
import java.security.PublicKey;
64
import java.security.interfaces.DSAPrivateKey;
75
import java.security.interfaces.RSAPrivateKey;
86

@@ -19,16 +17,6 @@
1917
public class JcaDefaultTlsCredentialedSigner
2018
extends DefaultTlsCredentialedSigner
2119
{
22-
private static JcaTlsCertificate getEndEntity(JcaTlsCrypto crypto, Certificate certificate) throws IOException
23-
{
24-
if (certificate == null || certificate.isEmpty())
25-
{
26-
throw new IllegalArgumentException("No certificate");
27-
}
28-
29-
return JcaTlsCertificate.convert(crypto, certificate.getCertificateAt(0));
30-
}
31-
3220
private static TlsSigner makeSigner(JcaTlsCrypto crypto, PrivateKey privateKey, Certificate certificate,
3321
SignatureAndHashAlgorithm signatureAndHashAlgorithm)
3422
{
@@ -50,17 +38,7 @@ private static TlsSigner makeSigner(JcaTlsCrypto crypto, PrivateKey privateKey,
5038
}
5139
}
5240

53-
PublicKey publicKey;
54-
try
55-
{
56-
publicKey = getEndEntity(crypto, certificate).getPubKeyRSA();
57-
}
58-
catch (Exception e)
59-
{
60-
throw new RuntimeException(e);
61-
}
62-
63-
signer = new JcaTlsRSASigner(crypto, privateKey, publicKey);
41+
signer = new JcaTlsRSASigner(crypto, privateKey);
6442
}
6543
else if (privateKey instanceof DSAPrivateKey
6644
|| "DSA".equalsIgnoreCase(algorithm))

tls/src/main/java/org/bouncycastle/tls/crypto/impl/jcajce/JcaTlsCrypto.java

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,39 +1057,6 @@ protected Tls13Verifier createTls13Verifier(String algorithmName, AlgorithmParam
10571057
}
10581058
}
10591059

1060-
protected TlsStreamSigner createVerifyingStreamSigner(SignatureAndHashAlgorithm algorithm, PrivateKey privateKey,
1061-
boolean needsRandom, PublicKey publicKey) throws IOException
1062-
{
1063-
String algorithmName = JcaUtils.getJcaAlgorithmName(algorithm);
1064-
1065-
return createVerifyingStreamSigner(algorithmName, null, privateKey, needsRandom, publicKey);
1066-
}
1067-
1068-
protected TlsStreamSigner createVerifyingStreamSigner(String algorithmName, AlgorithmParameterSpec parameter,
1069-
PrivateKey privateKey, boolean needsRandom, PublicKey publicKey) throws IOException
1070-
{
1071-
try
1072-
{
1073-
Signature signer = getHelper().createSignature(algorithmName);
1074-
Signature verifier = getHelper().createSignature(algorithmName);
1075-
1076-
if (null != parameter)
1077-
{
1078-
signer.setParameter(parameter);
1079-
verifier.setParameter(parameter);
1080-
}
1081-
1082-
signer.initSign(privateKey, needsRandom ? getSecureRandom() : null);
1083-
verifier.initVerify(publicKey);
1084-
1085-
return new JcaVerifyingStreamSigner(signer, verifier);
1086-
}
1087-
catch (GeneralSecurityException e)
1088-
{
1089-
throw new TlsFatalAlert(AlertDescription.internal_error, e);
1090-
}
1091-
}
1092-
10931060
protected Boolean isSupportedEncryptionAlgorithm(int encryptionAlgorithm)
10941061
{
10951062
switch (encryptionAlgorithm)

tls/src/main/java/org/bouncycastle/tls/crypto/impl/jcajce/JcaTlsRSASigner.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,18 @@ public class JcaTlsRSASigner
2525
{
2626
private final JcaTlsCrypto crypto;
2727
private final PrivateKey privateKey;
28-
private final PublicKey publicKey;
2928

3029
private Signature rawSigner = null;
3130

31+
/**
32+
* @deprecated Use constructor without 'publicKey' parameter.
33+
*/
3234
public JcaTlsRSASigner(JcaTlsCrypto crypto, PrivateKey privateKey, PublicKey publicKey)
35+
{
36+
this(crypto, privateKey);
37+
}
38+
39+
public JcaTlsRSASigner(JcaTlsCrypto crypto, PrivateKey privateKey)
3340
{
3441
if (null == crypto)
3542
{
@@ -42,7 +49,6 @@ public JcaTlsRSASigner(JcaTlsCrypto crypto, PrivateKey privateKey, PublicKey pub
4249

4350
this.crypto = crypto;
4451
this.privateKey = privateKey;
45-
this.publicKey = publicKey;
4652
}
4753

4854
public byte[] generateRawSignature(SignatureAndHashAlgorithm algorithm, byte[] hash) throws IOException
@@ -78,15 +84,7 @@ public byte[] generateRawSignature(SignatureAndHashAlgorithm algorithm, byte[] h
7884

7985
signer.update(input, 0, input.length);
8086

81-
byte[] signature = signer.sign();
82-
83-
signer.initVerify(publicKey);
84-
signer.update(input, 0, input.length);
85-
86-
if (signer.verify(signature))
87-
{
88-
return signature;
89-
}
87+
return signer.sign();
9088
}
9189
catch (GeneralSecurityException e)
9290
{
@@ -96,8 +94,6 @@ public byte[] generateRawSignature(SignatureAndHashAlgorithm algorithm, byte[] h
9694
{
9795
this.rawSigner = null;
9896
}
99-
100-
throw new TlsFatalAlert(AlertDescription.internal_error);
10197
}
10298

10399
public TlsStreamSigner getStreamSigner(SignatureAndHashAlgorithm algorithm) throws IOException
@@ -110,7 +106,7 @@ public TlsStreamSigner getStreamSigner(SignatureAndHashAlgorithm algorithm) thro
110106
&& JcaUtils.isSunMSCAPIProviderActive()
111107
&& isSunMSCAPIRawSigner())
112108
{
113-
return crypto.createVerifyingStreamSigner(algorithm, privateKey, true, publicKey);
109+
return crypto.createStreamSigner(algorithm, privateKey, true);
114110
}
115111

116112
return null;

tls/src/main/java/org/bouncycastle/tls/crypto/impl/jcajce/JcaVerifyingStreamSigner.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)