View Javadoc

1   package com.atlassian.asap.core.keys;
2   
3   import com.atlassian.asap.api.exception.CannotRetrieveKeyException;
4   import com.atlassian.asap.core.SecurityProvider;
5   import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
6   import org.bouncycastle.openssl.PEMKeyPair;
7   import org.bouncycastle.openssl.PEMParser;
8   import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
9   import org.bouncycastle.util.encoders.DecoderException;
10  
11  import java.io.IOException;
12  import java.io.Reader;
13  import java.security.PrivateKey;
14  import java.security.Provider;
15  import java.security.PublicKey;
16  
17  /**
18   * Functions for reading PEM keys.
19   */
20  public class PemReader implements KeyReader {
21  
22      private final Provider provider;
23  
24      public PemReader() {
25          this(SecurityProvider.getProvider());
26      }
27  
28      public PemReader(Provider provider) {
29          this.provider = provider;
30      }
31  
32      /**
33       * Reads a private key from a PEM file.
34       *
35       * @param reader source of the PEM data
36       * @return the key
37       * @throws CannotRetrieveKeyException if the key cannot be read, parsed, or the algorithm is unknown
38       */
39      public PrivateKey readPrivateKey(Reader reader) throws CannotRetrieveKeyException {
40          try {
41              PEMParser pemParser = new PEMParser(reader);
42              Object keyPairObject = pemParser.readObject();
43              if (keyPairObject instanceof PEMKeyPair) {
44                  PEMKeyPair pemKeyPair = (PEMKeyPair) keyPairObject;
45                  JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(provider);
46                  return converter.getPrivateKey(pemKeyPair.getPrivateKeyInfo());
47              } else {
48                  throw new CannotRetrieveKeyException("Error reading PEM private key, unknown key pair object type");
49              }
50          } catch (IOException | DecoderException e) {
51              throw new CannotRetrieveKeyException("Error reading PEM private key", e);
52          }
53      }
54  
55      /**
56       * Reads a public key from a PEM file.
57       *
58       * @param reader source of the PEM data
59       * @return the key
60       * @throws CannotRetrieveKeyException if the key cannot be read or parsed
61       */
62      public PublicKey readPublicKey(Reader reader) throws CannotRetrieveKeyException {
63          try {
64              PEMParser pemParser = new PEMParser(reader);
65              Object object = pemParser.readObject();
66  
67              SubjectPublicKeyInfo pub = SubjectPublicKeyInfo.getInstance(object);
68              JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(provider);
69  
70              return converter.getPublicKey(pub);
71          } catch (IOException | DecoderException e) {
72              throw new CannotRetrieveKeyException("Error reading PEM public key", e);
73          }
74      }
75  }