2121import java .nio .ByteBuffer ;
2222import java .nio .file .Files ;
2323import java .nio .file .Path ;
24- import java .security .GeneralSecurityException ;
2524import java .security .KeyFactory ;
25+ import java .security .NoSuchAlgorithmException ;
2626import java .security .PrivateKey ;
2727import java .security .spec .InvalidKeySpecException ;
2828import java .security .spec .PKCS8EncodedKeySpec ;
4747 */
4848final class PrivateKeyParser {
4949
50- private static final String PKCS1_HEADER = "-+BEGIN\\ s+RSA\\ s+PRIVATE\\ s+KEY[^-]*-+(?:\\ s|\\ r|\\ n)+" ;
50+ private static final String PKCS1_RSA_HEADER = "-+BEGIN\\ s+RSA\\ s+PRIVATE\\ s+KEY[^-]*-+(?:\\ s|\\ r|\\ n)+" ;
5151
52- private static final String PKCS1_FOOTER = "-+END\\ s+RSA\\ s+PRIVATE\\ s+KEY[^-]*-+" ;
52+ private static final String PKCS1_RSA_FOOTER = "-+END\\ s+RSA\\ s+PRIVATE\\ s+KEY[^-]*-+" ;
5353
5454 private static final String PKCS8_HEADER = "-+BEGIN\\ s+PRIVATE\\ s+KEY[^-]*-+(?:\\ s|\\ r|\\ n)+" ;
5555
5656 private static final String PKCS8_FOOTER = "-+END\\ s+PRIVATE\\ s+KEY[^-]*-+" ;
5757
58- private static final String EC_HEADER = "-+BEGIN\\ s+EC\\ s+PRIVATE\\ s+KEY[^-]*-+(?:\\ s|\\ r|\\ n)+" ;
58+ private static final String SEC1_EC_HEADER = "-+BEGIN\\ s+EC\\ s+PRIVATE\\ s+KEY[^-]*-+(?:\\ s|\\ r|\\ n)+" ;
5959
60- private static final String EC_FOOTER = "-+END\\ s+EC\\ s+PRIVATE\\ s+KEY[^-]*-+" ;
60+ private static final String SEC1_EC_FOOTER = "-+END\\ s+EC\\ s+PRIVATE\\ s+KEY[^-]*-+" ;
6161
6262 private static final String BASE64_TEXT = "([a-z0-9+/=\\ r\\ n]+)" ;
6363
6464 private static final List <PemParser > PEM_PARSERS ;
6565 static {
6666 List <PemParser > parsers = new ArrayList <>();
67- parsers .add (new PemParser (PKCS1_HEADER , PKCS1_FOOTER , PrivateKeyParser ::createKeySpecForPkcs1 , "RSA" ));
68- parsers .add (new PemParser (EC_HEADER , EC_FOOTER , PrivateKeyParser ::createKeySpecForEc , "EC" ));
69- parsers .add (new PemParser (PKCS8_HEADER , PKCS8_FOOTER , PKCS8EncodedKeySpec ::new , "RSA" , "EC" , "DSA" , "Ed25519" ));
67+ parsers
68+ .add (new PemParser (PKCS1_RSA_HEADER , PKCS1_RSA_FOOTER , PrivateKeyParser ::createKeySpecForPkcs1Rsa , "RSA" ));
69+ parsers .add (new PemParser (SEC1_EC_HEADER , SEC1_EC_FOOTER , PrivateKeyParser ::createKeySpecForSec1Ec , "EC" ));
70+ parsers .add (new PemParser (PKCS8_HEADER , PKCS8_FOOTER , PKCS8EncodedKeySpec ::new , "RSA" , "RSASSA-PSS" , "EC" ,
71+ "DSA" , "EdDSA" , "XDH" ));
7072 PEM_PARSERS = Collections .unmodifiableList (parsers );
7173 }
7274
@@ -88,11 +90,11 @@ final class PrivateKeyParser {
8890 private PrivateKeyParser () {
8991 }
9092
91- private static PKCS8EncodedKeySpec createKeySpecForPkcs1 (byte [] bytes ) {
93+ private static PKCS8EncodedKeySpec createKeySpecForPkcs1Rsa (byte [] bytes ) {
9294 return createKeySpecForAlgorithm (bytes , RSA_ALGORITHM , null );
9395 }
9496
95- private static PKCS8EncodedKeySpec createKeySpecForEc (byte [] bytes ) {
97+ private static PKCS8EncodedKeySpec createKeySpecForSec1Ec (byte [] bytes ) {
9698 DerElement ecPrivateKey = DerElement .of (bytes );
9799 Assert .state (ecPrivateKey .isType (ValueType .ENCODED , TagType .SEQUENCE ),
98100 "Key spec should be an ASN.1 encoded sequence" );
@@ -194,21 +196,16 @@ private static byte[] decodeBase64(String content) {
194196 }
195197
196198 private PrivateKey parse (byte [] bytes ) {
197- try {
198- PKCS8EncodedKeySpec keySpec = this .keySpecFactory . apply ( bytes );
199- for ( String algorithm : this . algorithms ) {
199+ PKCS8EncodedKeySpec keySpec = this . keySpecFactory . apply ( bytes );
200+ for ( String algorithm : this .algorithms ) {
201+ try {
200202 KeyFactory keyFactory = KeyFactory .getInstance (algorithm );
201- try {
202- return keyFactory .generatePrivate (keySpec );
203- }
204- catch (InvalidKeySpecException ex ) {
205- }
203+ return keyFactory .generatePrivate (keySpec );
204+ }
205+ catch (InvalidKeySpecException | NoSuchAlgorithmException ex ) {
206206 }
207- return null ;
208- }
209- catch (GeneralSecurityException ex ) {
210- throw new IllegalArgumentException ("Unexpected key format" , ex );
211207 }
208+ return null ;
212209 }
213210
214211 }
@@ -296,7 +293,7 @@ static final class DerElement {
296293
297294 private final long tagType ;
298295
299- private ByteBuffer contents ;
296+ private final ByteBuffer contents ;
300297
301298 private DerElement (ByteBuffer bytes ) {
302299 byte b = bytes .get ();
0 commit comments