aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2011-10-15 14:51:52 -0700
committerKenny Root <kenny@the-b.org>2011-10-15 14:51:52 -0700
commit29871e6c72bcb06c881c4d98fb7e23cc21c6b930 (patch)
tree021f80a90f52e0369f5e971c0242177a3fba0a4b
parent3811f3274ad8f9d2e3c8b8c94e1456a10fab1b75 (diff)
downloadconnectbot-29871e6c72bcb06c881c4d98fb7e23cc21c6b930.tar.gz
connectbot-29871e6c72bcb06c881c4d98fb7e23cc21c6b930.tar.bz2
connectbot-29871e6c72bcb06c881c4d98fb7e23cc21c6b930.zip
Move public key functions into Pubkey class
-rw-r--r--src/org/connectbot/PubkeyListActivity.java13
-rw-r--r--src/org/connectbot/bean/PubkeyBean.java73
-rw-r--r--src/org/connectbot/service/TerminalManager.java4
-rw-r--r--src/org/connectbot/transport/SSH.java3
-rw-r--r--src/org/connectbot/util/PubkeyUtils.java17
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);
}