aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2013-04-16 22:39:57 -0700
committerKenny Root <kenny@the-b.org>2013-04-16 22:39:57 -0700
commit716cdaa4841db330df769019d89e2aaec562f5db (patch)
treef3427f4a42a5b2deb14f8ab0b28fe70a7e4347fd
parentefe746feac27854d98a9cb3ccab3d085024e02fd (diff)
downloadconnectbot-716cdaa4841db330df769019d89e2aaec562f5db.tar.gz
connectbot-716cdaa4841db330df769019d89e2aaec562f5db.tar.bz2
connectbot-716cdaa4841db330df769019d89e2aaec562f5db.zip
Move PublicKey decoding out of PubkeyBean
-rw-r--r--src/org/connectbot/PubkeyListActivity.java4
-rw-r--r--src/org/connectbot/bean/PubkeyBean.java103
-rw-r--r--src/org/connectbot/service/TerminalManager.java2
-rw-r--r--src/org/connectbot/transport/SSH.java2
4 files changed, 48 insertions, 63 deletions
diff --git a/src/org/connectbot/PubkeyListActivity.java b/src/org/connectbot/PubkeyListActivity.java
index 9961a4e..be7a46f 100644
--- a/src/org/connectbot/PubkeyListActivity.java
+++ b/src/org/connectbot/PubkeyListActivity.java
@@ -270,7 +270,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
// load using internal generated format
try {
PrivateKey privKey = PubkeyUtils.decodePrivate(keybean.getPrivateKey(), keybean.getType(), password);
- PublicKey pubKey = keybean.getPublicKey();
+ PublicKey pubKey = PubkeyUtils.decodePublic(keybean.getPublicKey(), keybean.getType());
Log.d(TAG, "Unlocked key " + PubkeyUtils.formatKey(pubKey));
pair = new KeyPair(pubKey, privKey);
@@ -342,7 +342,7 @@ public class PubkeyListActivity extends ListActivity implements EventListener {
copyPublicToClipboard.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
try {
- PublicKey pk = pubkey.getPublicKey();
+ PublicKey pk = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType());
String openSSHPubkey = PubkeyUtils.convertToOpenSSHFormat(pk, pubkey.getNickname());
clipboard.setText(openSSHPubkey);
diff --git a/src/org/connectbot/bean/PubkeyBean.java b/src/org/connectbot/bean/PubkeyBean.java
index 272793a..656c6af 100644
--- a/src/org/connectbot/bean/PubkeyBean.java
+++ b/src/org/connectbot/bean/PubkeyBean.java
@@ -17,16 +17,12 @@
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.ECPublicKey;
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;
@@ -51,15 +47,16 @@ public class PubkeyBean extends AbstractBean {
private String nickname;
private String type;
private byte[] privateKey;
- private PublicKey publicKey;
+ private byte[] publicKey;
private boolean encrypted = false;
private boolean startup = false;
private boolean confirmUse = false;
private int lifetime = 0;
/* Transient values */
- private boolean unlocked = false;
- private Object unlockedPrivate = null;
+ private transient boolean unlocked = false;
+ private transient Object unlockedPrivate = null;
+ private transient String description;
@Override
public String getBeanName() {
@@ -104,41 +101,18 @@ public class PubkeyBean extends AbstractBean {
return privateKey.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 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;
- } else {
- publicKey = decodePublicKeyAs(pubKeySpec, KEY_TYPE_EC);
- if (publicKey != null) {
- type = KEY_TYPE_EC;
- }
- }
- }
- }
+ if (encoded == null)
+ publicKey = null;
+ else
+ publicKey = encoded.clone();
}
- public PublicKey getPublicKey() {
- return publicKey;
+ public byte[] getPublicKey() {
+ if (publicKey == null)
+ return null;
+ else
+ return publicKey.clone();
}
public void setEncrypted(boolean encrypted) {
@@ -190,27 +164,38 @@ public class PubkeyBean extends AbstractBean {
}
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 if (publicKey instanceof ECPublicKey) {
- int bits = ((ECPublicKey) publicKey).getParams().getCurve().getField().getFieldSize();
- sb.append("EC ");
- sb.append(bits);
- sb.append("-bit");
- } else {
- sb.append("Unknown Key Type");
- }
+ if (description == null) {
+ final StringBuilder sb = new StringBuilder();
+ try {
+ final PublicKey pubKey = PubkeyUtils.decodePublic(privateKey, type);
+ if (PubkeyDatabase.KEY_TYPE_RSA.equals(type)) {
+ int bits = ((RSAPublicKey) pubKey).getModulus().bitLength();
+ sb.append("RSA ");
+ sb.append(bits);
+ sb.append("-bit");
+ } else if (PubkeyDatabase.KEY_TYPE_DSA.equals(type)) {
+ sb.append("DSA 1024-bit");
+ } else if (PubkeyDatabase.KEY_TYPE_EC.equals(type)) {
+ int bits = ((ECPublicKey) pubKey).getParams().getCurve().getField()
+ .getFieldSize();
+ sb.append("EC ");
+ sb.append(bits);
+ sb.append("-bit");
+ } else {
+ sb.append("Unknown Key Type");
+ }
+ } catch (NoSuchAlgorithmException e) {
+ sb.append("Unknown Key Type");
+ } catch (InvalidKeySpecException e) {
+ sb.append("Unknown Key Type");
+ }
- if (encrypted)
- sb.append(" (encrypted)");
+ if (encrypted)
+ sb.append(" (encrypted)");
- return sb.toString();
+ description = sb.toString();
+ }
+ return description;
}
/* (non-Javadoc)
@@ -223,7 +208,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.getEncoded());
+ values.put(PubkeyDatabase.FIELD_PUBKEY_PUBLIC, publicKey);
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 cc4392a..369d79a 100644
--- a/src/org/connectbot/service/TerminalManager.java
+++ b/src/org/connectbot/service/TerminalManager.java
@@ -138,7 +138,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
for (PubkeyBean pubkey : pubkeys) {
try {
PrivateKey privKey = PubkeyUtils.decodePrivate(pubkey.getPrivateKey(), pubkey.getType());
- PublicKey pubKey = pubkey.getPublicKey();
+ PublicKey pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType());
KeyPair pair = new KeyPair(pubKey, privKey);
addKey(pubkey, pair);
diff --git a/src/org/connectbot/transport/SSH.java b/src/org/connectbot/transport/SSH.java
index bcc9557..6ef9745 100644
--- a/src/org/connectbot/transport/SSH.java
+++ b/src/org/connectbot/transport/SSH.java
@@ -337,7 +337,7 @@ public class SSH extends AbsTransport implements ConnectionMonitor, InteractiveC
return false;
}
- PublicKey pubKey = pubkey.getPublicKey();
+ PublicKey pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType());
// convert key to trilead format
pair = new KeyPair(pubKey, privKey);