public static KeyPair loadKey(String pemString, String passwd) throws IOException, GeneralSecurityException { Object key = PEMDecoder.decode(pemString.toCharArray(), passwd); if (key instanceof com.trilead.ssh2.signature.RSAPrivateKey) { com.trilead.ssh2.signature.RSAPrivateKey x = (com.trilead.ssh2.signature.RSAPrivateKey)key; return x.toJCEKeyPair(); } if (key instanceof com.trilead.ssh2.signature.DSAPrivateKey) { com.trilead.ssh2.signature.DSAPrivateKey x = (com.trilead.ssh2.signature.DSAPrivateKey)key; KeyFactory kf = KeyFactory.getInstance("DSA"); return new KeyPair( kf.generatePublic(new DSAPublicKeySpec(x.getY(), x.getP(), x.getQ(), x.getG())), kf.generatePrivate(new DSAPrivateKeySpec(x.getX(), x.getP(), x.getQ(), x.getG()))); } throw new UnsupportedOperationException("Unrecognizable key format: " + key); }
/** * Extracts a SSH public key from a PEM-encoded SSH private key. * @param pem The PEM-encoded string (either RSA or DSA). * @param passPhrase The passphrase to decrypt the private key (may be null, if the key is not encrypted). * @return A public key string in the form "<pubkey-type> <pubkey-base64>" * @throws IOException if pem could not be decoded properly. */ public static String extract(final String pem, final String passPhrase) throws IOException { final Object priv = PEMDecoder.decode(pem.toCharArray(), passPhrase); if (priv instanceof RSAPrivateKey) { return "ssh-rsa " + DatatypeConverter.printBase64Binary(RSASHA1Verify.encodeSSHRSAPublicKey(((RSAPrivateKey)priv).getPublicKey())); } if (priv instanceof DSAPrivateKey) { return "ssh-dss " + DatatypeConverter.printBase64Binary(DSASHA1Verify.encodeSSHDSAPublicKey(((DSAPrivateKey)priv).getPublicKey())); } throw new IOException("should never happen"); } }
throw new IOException("Padding in DSA PRIVATE KEY DER stream."); return new DSAPrivateKey(p, q, g, y, x);
byte[] pk_enc = DSASHA1Verify.encodeSSHDSAPublicKey(pk.getPublicKey());
throw new IOException("Padding in DSA PRIVATE KEY DER stream."); return new DSAPrivateKey(p, q, g, y, x);
public static DSASignature generateSignature(byte[] message, DSAPrivateKey pk, SecureRandom rnd) { SHA1 md = new SHA1(); md.update(message); byte[] sha_message = new byte[md.getDigestLength()]; md.digest(sha_message); BigInteger m = new BigInteger(1, sha_message); BigInteger k; int qBitLength = pk.getQ().bitLength(); do { k = new BigInteger(qBitLength, rnd); } while (k.compareTo(pk.getQ()) >= 0); BigInteger r = pk.getG().modPow(k, pk.getP()).mod(pk.getQ()); k = k.modInverse(pk.getQ()).multiply(m.add((pk).getX().multiply(r))); BigInteger s = k.mod(pk.getQ()); return new DSASignature(r, s); } }
byte[] pk_enc = DSASHA1Verify.encodeSSHDSAPublicKey(pk.getPublicKey());
throw new IOException("Padding in DSA PRIVATE KEY DER stream."); return new DSAPrivateKey(p, q, g, y, x);
public static DSASignature generateSignature(byte[] message, DSAPrivateKey pk, SecureRandom rnd) { SHA1 md = new SHA1(); md.update(message); byte[] sha_message = new byte[md.getDigestLength()]; md.digest(sha_message); BigInteger m = new BigInteger(1, sha_message); BigInteger k; int qBitLength = pk.getQ().bitLength(); do { k = new BigInteger(qBitLength, rnd); } while (k.compareTo(pk.getQ()) >= 0); BigInteger r = pk.getG().modPow(k, pk.getP()).mod(pk.getQ()); k = k.modInverse(pk.getQ()).multiply(m.add((pk).getX().multiply(r))); BigInteger s = k.mod(pk.getQ()); return new DSASignature(r, s); } }
@Deprecated public static DSASignature generateSignature(byte[] message, DSAPrivateKey pk, SecureRandom rnd) { SHA1 md = new SHA1(); md.update(message); byte[] sha_message = new byte[md.getDigestLength()]; md.digest(sha_message); BigInteger m = new BigInteger(1, sha_message); BigInteger k; int qBitLength = pk.getQ().bitLength(); do { k = new BigInteger(qBitLength, rnd); } while (k.compareTo(pk.getQ()) >= 0); BigInteger r = pk.getG().modPow(k, pk.getP()).mod(pk.getQ()); k = k.modInverse(pk.getQ()).multiply(m.add((pk).getX().multiply(r))); BigInteger s = k.mod(pk.getQ()); return new DSASignature(r, s); } }