diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/src/main/java/com/trilead/ssh2/crypto/PEMDecoder.java | 79 |
1 files changed, 28 insertions, 51 deletions
diff --git a/lib/src/main/java/com/trilead/ssh2/crypto/PEMDecoder.java b/lib/src/main/java/com/trilead/ssh2/crypto/PEMDecoder.java index 430307e..5c0c2fd 100644 --- a/lib/src/main/java/com/trilead/ssh2/crypto/PEMDecoder.java +++ b/lib/src/main/java/com/trilead/ssh2/crypto/PEMDecoder.java @@ -19,6 +19,7 @@ import java.security.spec.ECPoint; import java.security.spec.ECPrivateKeySpec; import java.security.spec.ECPublicKeySpec; import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; import java.security.spec.RSAPrivateCrtKeySpec; import java.security.spec.RSAPrivateKeySpec; import java.security.spec.RSAPublicKeySpec; @@ -344,7 +345,11 @@ public class PEMDecoder public static KeyPair decode(char[] pem, String password) throws IOException { PEMStructure ps = parsePEM(pem); + return decode(ps, password); + } + public static KeyPair decode(PEMStructure ps, String password) throws IOException + { if (isPEMEncrypted(ps)) { if (password == null) @@ -381,23 +386,7 @@ public class PEMDecoder DSAPrivateKeySpec privSpec = new DSAPrivateKeySpec(x, p, q, g); DSAPublicKeySpec pubSpec = new DSAPublicKeySpec(y, p, q, g); - PublicKey pubKey; - PrivateKey privKey; - try { - KeyFactory kf = KeyFactory.getInstance("DSA"); - pubKey = kf.generatePublic(pubSpec); - privKey = kf.generatePrivate(privSpec); - } catch (NoSuchAlgorithmException e) { - IOException ex = new IOException(); - ex.initCause(ex); - throw ex; - } catch (InvalidKeySpecException e) { - IOException ex = new IOException(); - ex.initCause(ex); - throw ex; - } - - return new KeyPair(pubKey, privKey); + return generateKeyPair("DSA", privSpec, pubSpec); } if (ps.pemType == PEM_RSA_PRIVATE_KEY) @@ -429,23 +418,7 @@ public class PEMDecoder RSAPrivateKeySpec privSpec = new RSAPrivateCrtKeySpec(n, e, d, primeP, primeQ, expP, expQ, coeff); RSAPublicKeySpec pubSpec = new RSAPublicKeySpec(n, e); - PublicKey pubKey; - PrivateKey privKey; - try { - KeyFactory kf = KeyFactory.getInstance("RSA"); - pubKey = kf.generatePublic(pubSpec); - privKey = kf.generatePrivate(privSpec); - } catch (NoSuchAlgorithmException ex) { - IOException ioex = new IOException(); - ioex.initCause(ex); - throw ioex; - } catch (InvalidKeySpecException ex) { - IOException ioex = new IOException("invalid keyspec"); - ioex.initCause(ex); - throw ioex; - } - - return new KeyPair(pubKey, privKey); + return generateKeyPair("RSA", privSpec, pubSpec); } if (ps.pemType == PEM_EC_PRIVATE_KEY) { @@ -492,26 +465,30 @@ public class PEMDecoder ECPrivateKeySpec privSpec = new ECPrivateKeySpec(s, params); ECPublicKeySpec pubSpec = new ECPublicKeySpec(w, params); - PublicKey pubKey; - PrivateKey privKey; - try { - KeyFactory kf = KeyFactory.getInstance("EC"); - pubKey = kf.generatePublic(pubSpec); - privKey = kf.generatePrivate(privSpec); - } catch (NoSuchAlgorithmException ex) { - IOException ioex = new IOException(); - ioex.initCause(ex); - throw ioex; - } catch (InvalidKeySpecException ex) { - IOException ioex = new IOException("invalid keyspec"); - ioex.initCause(ex); - throw ioex; - } - - return new KeyPair(pubKey, privKey); + return generateKeyPair("EC", privSpec, pubSpec); } throw new IOException("PEM problem: it is of unknown type"); } + /** + * Generate a {@code KeyPair} given an {@code algorithm} and {@code KeySpec}. + */ + private static KeyPair generateKeyPair(String algorithm, KeySpec privSpec, KeySpec pubSpec) + throws IOException { + try { + final KeyFactory kf = KeyFactory.getInstance(algorithm); + final PublicKey pubKey = kf.generatePublic(pubSpec); + final PrivateKey privKey = kf.generatePrivate(privSpec); + return new KeyPair(pubKey, privKey); + } catch (NoSuchAlgorithmException ex) { + IOException ioex = new IOException(); + ioex.initCause(ex); + throw ioex; + } catch (InvalidKeySpecException ex) { + IOException ioex = new IOException("invalid keyspec"); + ioex.initCause(ex); + throw ioex; + } + } } |