package org.bouncycastle.crypto.tls;

import java.security.SecureRandom;

import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.Signer;
import org.bouncycastle.crypto.digests.NullDigest;
import org.bouncycastle.crypto.encodings.PKCS1Encoding;
import org.bouncycastle.crypto.engines.RSABlindedEngine;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.params.RSAKeyParameters;
import org.bouncycastle.crypto.signers.GenericSigner;

class TlsRSASigner implements TlsSigner
{
    public byte[] calculateRawSignature(SecureRandom random, AsymmetricKeyParameter privateKey, byte[] md5andsha1)
        throws CryptoException
    {
        Signer sig = new GenericSigner(new PKCS1Encoding(new RSABlindedEngine()), new NullDigest());
        sig.init(true, new ParametersWithRandom(privateKey, random));
        sig.update(md5andsha1, 0, md5andsha1.length);
        return sig.generateSignature();
    }

    public Signer createVerifyer(AsymmetricKeyParameter publicKey)
    {
        Signer s = new GenericSigner(new PKCS1Encoding(new RSABlindedEngine()), new CombinedHash());
        s.init(false, publicKey);
        return s;
    }

    public boolean isValidPublicKey(AsymmetricKeyParameter publicKey)
    {
        return publicKey instanceof RSAKeyParameters && !publicKey.isPrivate();
    }
}

@@ -67,16 +67,70 @@
 andom;%0A%0A
+import org.bouncycastle.crypto.AsymmetricBlockCipher;%0A
 import o
@@ -212,59 +212,8 @@
 er;%0A
-import org.bouncycastle.crypto.digests.NullDigest;%0A
 impo
@@ -760,39 +760,39 @@
     
-Signer sig = new GenericSigner(
+AsymmetricBlockCipher engine = 
 new 
@@ -832,27 +832,8 @@
 e())
-, new NullDigest())
 ;%0A  
@@ -838,19 +838,22 @@
         
-sig
+engine
 .init(tr
@@ -915,18 +915,34 @@
     
-sig.update
+return engine.processBlock
 (md5
@@ -977,48 +977,8 @@
 h);%0A
-        return sig.generateSignature();%0A
     

Simplify raw RSA signing