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
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
34
35
36
37
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
57
58
59
60
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 }