diff options
-rw-r--r-- | src/org/connectbot/PubkeyListActivity.java | 13 | ||||
-rw-r--r-- | src/org/connectbot/bean/PubkeyBean.java | 73 | ||||
-rw-r--r-- | src/org/connectbot/service/TerminalManager.java | 4 | ||||
-rw-r--r-- | src/org/connectbot/transport/SSH.java | 3 | ||||
-rw-r--r-- | src/org/connectbot/util/PubkeyUtils.java | 17 |
5 files changed, 70 insertions, 40 deletions
diff --git a/src/org/connectbot/PubkeyListActivity.java b/src/org/connectbot/PubkeyListActivity.java index 3579980..9bb19f1 100644 --- a/src/org/connectbot/PubkeyListActivity.java +++ b/src/org/connectbot/PubkeyListActivity.java @@ -43,9 +43,9 @@ import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.ServiceConnection; -import android.content.DialogInterface.OnClickListener; import android.net.Uri; import android.os.Bundle; import android.os.Environment; @@ -58,17 +58,17 @@ import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; import android.view.ViewGroup; -import android.view.MenuItem.OnMenuItemClickListener; import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; -import android.widget.AdapterView.OnItemClickListener; import com.trilead.ssh2.crypto.Base64; import com.trilead.ssh2.crypto.PEMDecoder; @@ -275,7 +275,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener { PublicKey pubKey = null; try { privKey = PubkeyUtils.decodePrivate(pubkey.getPrivateKey(), pubkey.getType(), password); - pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); + pubKey = pubkey.getPublicKey(); } catch (Exception e) { String message = getResources().getString(R.string.pubkey_failed_add, pubkey.getNickname()); Log.e(TAG, message, e); @@ -346,7 +346,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener { copyPublicToClipboard.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { try { - PublicKey pk = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); + PublicKey pk = pubkey.getPublicKey(); String openSSHPubkey = PubkeyUtils.convertToOpenSSHFormat(pk, pubkey.getNickname()); clipboard.setText(openSSHPubkey); @@ -661,8 +661,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener { } } else { try { - PublicKey pub = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); - holder.caption.setText(PubkeyUtils.describeKey(pub, pubkey.isEncrypted())); + holder.caption.setText(pubkey.getDescription()); } catch (Exception e) { Log.e(TAG, "Error decoding public key at " + pubkey.getId(), e); holder.caption.setText(R.string.pubkey_unknown_format); diff --git a/src/org/connectbot/bean/PubkeyBean.java b/src/org/connectbot/bean/PubkeyBean.java index 0354f37..790c6cc 100644 --- a/src/org/connectbot/bean/PubkeyBean.java +++ b/src/org/connectbot/bean/PubkeyBean.java @@ -17,7 +17,15 @@ package org.connectbot.bean; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.interfaces.DSAPublicKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.EncodedKeySpec; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.X509EncodedKeySpec; import org.connectbot.util.PubkeyDatabase; import org.connectbot.util.PubkeyUtils; @@ -31,12 +39,16 @@ import android.content.ContentValues; public class PubkeyBean extends AbstractBean { public static final String BEAN_NAME = "pubkey"; + private static final String KEY_TYPE_RSA = "RSA"; + + private static final String KEY_TYPE_DSA = "DSA"; + /* Database fields */ private long id; private String nickname; private String type; private byte[] privateKey; - private byte[] publicKey; + private PublicKey publicKey; private boolean encrypted = false; private boolean startup = false; private boolean confirmUse = false; @@ -89,18 +101,36 @@ public class PubkeyBean extends AbstractBean { return privateKey.clone(); } - public void setPublicKey(byte[] publicKey) { - if (publicKey == null) - this.publicKey = null; - else - this.publicKey = publicKey.clone(); + private PublicKey decodePublicKeyAs(EncodedKeySpec keySpec, String keyType) { + try { + final KeyFactory kf = KeyFactory.getInstance(keyType); + return kf.generatePublic(keySpec); + } catch (NoSuchAlgorithmException e) { + return null; + } catch (InvalidKeySpecException e) { + return null; + } } - public byte[] getPublicKey() { - if (publicKey == null) - return null; - else - return publicKey.clone(); + public void setPublicKey(byte[] encoded) { + final X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encoded); + if (type != null) { + publicKey = decodePublicKeyAs(pubKeySpec, type); + } else { + publicKey = decodePublicKeyAs(pubKeySpec, KEY_TYPE_RSA); + if (publicKey != null) { + type = KEY_TYPE_RSA; + } else { + publicKey = decodePublicKeyAs(pubKeySpec, KEY_TYPE_DSA); + if (publicKey != null) { + type = KEY_TYPE_DSA; + } + } + } + } + + public PublicKey getPublicKey() { + return publicKey; } public void setEncrypted(boolean encrypted) { @@ -151,6 +181,25 @@ public class PubkeyBean extends AbstractBean { return unlockedPrivate; } + public String getDescription() { + StringBuilder sb = new StringBuilder(); + if (publicKey instanceof RSAPublicKey) { + int bits = ((RSAPublicKey) publicKey).getModulus().bitLength(); + sb.append("RSA "); + sb.append(bits); + sb.append("-bit"); + } else if (publicKey instanceof DSAPublicKey) { + sb.append("DSA 1024-bit"); + } else { + sb.append("Unknown Key Type"); + } + + if (encrypted) + sb.append(" (encrypted)"); + + return sb.toString(); + } + /* (non-Javadoc) * @see org.connectbot.bean.AbstractBean#getValues() */ @@ -161,7 +210,7 @@ public class PubkeyBean extends AbstractBean { values.put(PubkeyDatabase.FIELD_PUBKEY_NICKNAME, nickname); values.put(PubkeyDatabase.FIELD_PUBKEY_TYPE, type); values.put(PubkeyDatabase.FIELD_PUBKEY_PRIVATE, privateKey); - values.put(PubkeyDatabase.FIELD_PUBKEY_PUBLIC, publicKey); + values.put(PubkeyDatabase.FIELD_PUBKEY_PUBLIC, publicKey.getEncoded()); values.put(PubkeyDatabase.FIELD_PUBKEY_ENCRYPTED, encrypted ? 1 : 0); values.put(PubkeyDatabase.FIELD_PUBKEY_STARTUP, startup ? 1 : 0); values.put(PubkeyDatabase.FIELD_PUBKEY_CONFIRMUSE, confirmUse ? 1 : 0); diff --git a/src/org/connectbot/service/TerminalManager.java b/src/org/connectbot/service/TerminalManager.java index 3bfcdde..b81c373 100644 --- a/src/org/connectbot/service/TerminalManager.java +++ b/src/org/connectbot/service/TerminalManager.java @@ -26,9 +26,9 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Timer; import java.util.TimerTask; -import java.util.Map.Entry; import org.connectbot.R; import org.connectbot.bean.HostBean; @@ -137,7 +137,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen for (PubkeyBean pubkey : pubkeys) { try { PrivateKey privKey = PubkeyUtils.decodePrivate(pubkey.getPrivateKey(), pubkey.getType()); - PublicKey pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType()); + PublicKey pubKey = pubkey.getPublicKey(); Object trileadKey = PubkeyUtils.convertToTrilead(privKey, pubKey); addKey(pubkey, trileadKey); diff --git a/src/org/connectbot/transport/SSH.java b/src/org/connectbot/transport/SSH.java index 8a90f72..213cbcd 100644 --- a/src/org/connectbot/transport/SSH.java +++ b/src/org/connectbot/transport/SSH.java @@ -332,8 +332,7 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC return false; } - PublicKey pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), - pubkey.getType()); + PublicKey pubKey = pubkey.getPublicKey(); // convert key to trilead format trileadKey = PubkeyUtils.convertToTrilead(privKey, pubKey); diff --git a/src/org/connectbot/util/PubkeyUtils.java b/src/org/connectbot/util/PubkeyUtils.java index e10ee20..029cb0c 100644 --- a/src/org/connectbot/util/PubkeyUtils.java +++ b/src/org/connectbot/util/PubkeyUtils.java @@ -79,23 +79,6 @@ public class PubkeyUtils { ", bytes=" + encoded.length + "]"; } - public static String describeKey(Key key, boolean encrypted) { - String desc = null; - if (key instanceof RSAPublicKey) { - int bits = ((RSAPublicKey)key).getModulus().bitLength(); - desc = "RSA " + String.valueOf(bits) + "-bit"; - } else if (key instanceof DSAPublicKey) { - desc = "DSA 1024-bit"; - } else { - desc = "Unknown Key Type"; - } - - if (encrypted) - desc += " (encrypted)"; - - return desc; - } - public static byte[] sha256(byte[] data) throws NoSuchAlgorithmException { return MessageDigest.getInstance("SHA-256").digest(data); } |