View Javadoc
1   package civitas.crypto.signature;
2   
3   import java.security.InvalidKeyException;
4   import java.security.PrivateKey;
5   import java.security.PublicKey;
6   import java.security.SignatureException;
7   
8   import org.bouncycastle.crypto.CryptoException;
9   import org.springframework.beans.factory.annotation.Autowired;
10  import org.springframework.stereotype.Controller;
11  
12  import civitas.crypto.Constants;
13  import civitas.crypto.CryptoBase;
14  import civitas.crypto.messagedigest.CryptoHash;
15  import civitas.crypto.rsapublickey.ConvertPublicKeyToString;
16  
17  @Controller
18  public class SignWithPublicKey implements Constants {
19  	@Autowired
20  	CryptoHash cryptoHash;
21  
22  	@Autowired
23  	CryptoBase cryptoBase;
24  
25  	@Autowired
26  	ConvertPublicKeyToString convertPublicKeyToString;
27  
28  	public Signature apply(final PrivateKey k, final PublicKey publicKey, final String hash) throws CryptoException {
29  		byte[] bytes = cryptoHash.apply(hash.getBytes());
30  		return apply(k, publicKey, bytes);
31  	}
32  
33  	public Signature apply(final PrivateKey k, final PublicKey principal, final byte[] bytes) throws CryptoException {
34  		try {
35  			cryptoBase.rsaSigner.initSign(k);
36  			cryptoBase.rsaSigner.update(bytes);
37  			byte[] signature = cryptoBase.rsaSigner.sign();
38  			String pubKeyString = convertPublicKeyToString.apply(principal);
39  			return new Signature(signature, pubKeyString);
40  		} catch (InvalidKeyException | SignatureException e) {
41  			throw new CryptoException("cannot sign", e);
42  		}
43  	}
44  }