View Javadoc
1   package com.srv4pos.server.api.activation;
2   
3   import com.srv4pos.commons.io.BytesUtils;
4   import com.srv4pos.server.api.infrastructure.SignService;
5   import org.apache.commons.codec.binary.Base64;
6   
7   import java.io.IOException;
8   import java.security.InvalidKeyException;
9   import java.security.NoSuchAlgorithmException;
10  import java.security.SignatureException;
11  import java.security.spec.InvalidKeySpecException;
12  import java.util.HashMap;
13  import java.util.Map;
14  
15  /**
16   * Helper to work with digital signatures. For instance verification.
17   * <p>User: Kirill, Date: 31.03.14 0:46</p>
18   */
19  public class SignatureHelper {
20  
21      private Map<String, byte[]> pubKeys = new HashMap<String, byte[]>();
22  
23      public SignatureHelper() {
24      }
25  
26      /**
27       * Make sure ActivationCode signed correctly.
28       *
29       * @param activationCodeInfo to check
30       * @return true if correctly
31       * @throws java.security.NoSuchAlgorithmException
32       * @throws java.security.spec.InvalidKeySpecException
33       * @throws java.security.InvalidKeyException
34       * @throws java.security.SignatureException
35       * @throws java.io.IOException
36       */
37      public boolean verifySignature(ActivationCodeInfo activationCodeInfo) throws NoSuchAlgorithmException, InvalidKeySpecException,
38              InvalidKeyException, SignatureException, IOException {
39  
40          final String publicKeyFileName = activationCodeInfo.getPublicKeyFileName();
41  
42          if (publicKeyFileName == null) {
43              return false;
44          }
45  
46          byte[] pubKeyBytes = pubKeys.get(publicKeyFileName);
47  
48          if (pubKeyBytes == null) {
49              pubKeyBytes = BytesUtils.readResource(publicKeyFileName, getClass());
50              pubKeys.put(publicKeyFileName, pubKeyBytes);
51          }
52  
53          final byte[] signature = Base64.decodeBase64(activationCodeInfo.getSignature().getBytes(ActivationServiceSample.SIGNATURE_CHARSET));
54          final String activationDescriptorInfoJson = activationCodeInfo.getActivationDescriptorInfo();
55          return SignService.verifySignature(activationDescriptorInfoJson.getBytes(ActivationServiceSample.SIGNATURE_CHARSET), pubKeyBytes, signature);
56      }
57  
58      /**
59       * Get file name of a public key, which should be used to verify signature. It's used for ActivationCode.set
60       *
61       * @param isProductionHost for procution
62       * @return the file name for host's public key
63       */
64      public static String getPublicKeyFileName(boolean isProductionHost) {
65          return isProductionHost ? "production.pub.der" : "development.pub.der";
66      }
67  }