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 }