1
1
package org .mockserver .socket .tls ;
2
2
3
3
import org .bouncycastle .asn1 .pkcs .PrivateKeyInfo ;
4
+ import org .bouncycastle .openssl .PEMKeyPair ;
4
5
import org .bouncycastle .openssl .PEMParser ;
5
6
import org .bouncycastle .openssl .jcajce .JcaPEMKeyConverter ;
6
7
import org .mockserver .file .FileReader ;
7
8
8
9
import java .io .ByteArrayInputStream ;
9
10
import java .io .InputStream ;
10
11
import java .io .StringReader ;
11
- import java .security .KeyFactory ;
12
+ import java .security .PrivateKey ;
12
13
import java .security .cert .CertificateEncodingException ;
13
14
import java .security .cert .CertificateFactory ;
14
15
import java .security .cert .X509Certificate ;
15
- import java .security .PrivateKey ;
16
16
import java .security .spec .KeySpec ;
17
17
import java .security .spec .PKCS8EncodedKeySpec ;
18
18
import java .util .Base64 ;
19
19
import java .util .List ;
20
+ import java .util .regex .Pattern ;
20
21
import java .util .stream .Collectors ;
21
22
22
23
import static org .apache .commons .lang3 .StringUtils .EMPTY ;
@@ -28,12 +29,27 @@ public class PEMToFile {
28
29
private static final String END_CERTIFICATE = "-----END CERTIFICATE-----" ;
29
30
30
31
private static final String BEGIN_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----" ;
31
- private static final String BEGIN_RSA_PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----" ;
32
32
private static final String END_PRIVATE_KEY = "-----END PRIVATE KEY-----" ;
33
+ private static final String BEGIN_RSA_PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----" ;
33
34
private static final String END_RSA_PRIVATE_KEY = "-----END RSA PRIVATE KEY-----" ;
34
-
35
- public static String privateKeyToPEM (final byte [] privateKey ) {
36
- return toPEM (privateKey , BEGIN_PRIVATE_KEY , END_PRIVATE_KEY );
35
+ private static final String BEGIN_EC_PRIVATE_KEY = "-----BEGIN EC PRIVATE KEY-----" ;
36
+ private static final String END_EC_PRIVATE_KEY = "-----END EC PRIVATE KEY-----" ;
37
+ private static final Pattern BEGIN_PATTERN = Pattern .compile ("-----BEGIN ([A-Z ]+)-----" );
38
+ private static final Pattern END_PATTERN = Pattern .compile ("-----END ([A-Z ]+)-----" );
39
+
40
+ public static String privateKeyToPEM (final PrivateKey privateKey ) {
41
+ switch (privateKey .getAlgorithm ()) {
42
+ case "ES256" :
43
+ case "ES384" :
44
+ case "ES512" :
45
+ return toPEM (privateKey .getEncoded (), BEGIN_EC_PRIVATE_KEY , END_EC_PRIVATE_KEY );
46
+ case "RS256" :
47
+ case "RS384" :
48
+ case "RS512" :
49
+ return toPEM (privateKey .getEncoded (), BEGIN_RSA_PRIVATE_KEY , END_RSA_PRIVATE_KEY );
50
+ default :
51
+ throw new IllegalArgumentException ("Error invalid algorithm has been provided" );
52
+ }
37
53
}
38
54
39
55
public static String certToPEM (final X509Certificate ... x509Certificates ) throws CertificateEncodingException {
@@ -68,8 +84,10 @@ public static byte[] privateKeyBytesFromPEM(final String pem) {
68
84
pem
69
85
.replaceFirst (BEGIN_PRIVATE_KEY , EMPTY )
70
86
.replaceFirst (BEGIN_RSA_PRIVATE_KEY , EMPTY )
87
+ .replaceFirst (BEGIN_EC_PRIVATE_KEY , EMPTY )
71
88
.replaceFirst (END_PRIVATE_KEY , EMPTY )
72
89
.replaceFirst (END_RSA_PRIVATE_KEY , EMPTY )
90
+ .replaceFirst (END_EC_PRIVATE_KEY , EMPTY )
73
91
);
74
92
}
75
93
@@ -87,10 +105,15 @@ public static PrivateKey privateKeyFromPEMFile(String filename) {
87
105
88
106
public static PrivateKey privateKeyFromPEM (String pem ) {
89
107
try {
90
-
91
108
PEMParser pemParser = new PEMParser (new StringReader (pem ));
92
- JcaPEMKeyConverter converter = new JcaPEMKeyConverter ();
93
- return converter .getPrivateKey (PrivateKeyInfo .getInstance (pemParser .readObject ()));
109
+ JcaPEMKeyConverter converter = new JcaPEMKeyConverter ().setProvider ("BC" );
110
+
111
+ Object readObject = pemParser .readObject ();
112
+ if (readObject instanceof PEMKeyPair ) {
113
+ return converter .getKeyPair ((PEMKeyPair ) readObject ).getPrivate ();
114
+ } else {
115
+ return converter .getPrivateKey (PrivateKeyInfo .getInstance (readObject ));
116
+ }
94
117
} catch (Exception e ) {
95
118
throw new RuntimeException ("Exception reading private key from PEM file" , e );
96
119
}
0 commit comments